KMMainViewController.swift 181 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465
  1. //
  2. // KMMainViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/15.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objcMembers class KMMainViewController: KMBaseViewController, NSTextFieldDelegate {
  10. @IBOutlet var contendBox: NSBox!
  11. @IBOutlet var toolbarBox: NSBox! //工具栏Box
  12. @IBOutlet var bottomContendBox: NSBox! //
  13. @IBOutlet var sidebarBox: NSBox! //左侧边栏Box
  14. @IBOutlet var infoContendSplitView: KMPDFSplitView!
  15. @IBOutlet var infoSplitLeftView: NSView!
  16. @IBOutlet var infoSplitRightView: NSView!
  17. @IBOutlet var infoSplitCenterView: NSView!
  18. @IBOutlet var pdfSplitView: NSSplitView!
  19. @IBOutlet var pdfSplitTopView: NSView!
  20. @IBOutlet var pdfSplitBottomView: NSView!
  21. @IBOutlet var toolbarBoxHeightConst: NSLayoutConstraint!
  22. @IBOutlet var infoSplitViewLeftConst: NSLayoutConstraint!
  23. var viewManager: KMPDFViewManager = KMPDFViewManager.init()
  24. var toolbarManager: KMPDFToolbarManager = KMPDFToolbarManager.init()
  25. var listView: CPDFListView = CPDFListView.init()
  26. var document: CPDFDocument?
  27. var myDocument: NSDocument?
  28. var insertDocuments: Set<CPDFDocument> = [] //插入新文档时,SDK会出现崩溃,临时记录
  29. //工具栏
  30. private var pdfToolbarController: KMPDFToolbarController?
  31. //BOTA SideBar
  32. private var sideBarController: KMPDFSideBarController?
  33. //页面编辑
  34. private var pageEditViewController: KMNPageEditViewController?
  35. //DisplaySetting
  36. private var displaySettingController: KMNDisplayViewController?
  37. //SPlitPDF分屏视图
  38. private var splitPDFController: KMSplitPDFViewController?
  39. private var pdfBottomToolbar: KMSplitToolbar?
  40. //PPT操作界面
  41. var presentationTopViewController: KMPresentationTopViewController?
  42. //Edit
  43. var editToolbarView: KMEditToolbarView?
  44. //水印
  45. var watermarkViewController: KMWatermarkController?
  46. //背景
  47. var backgroundViewController: KMBackgroundController?
  48. //Header&Footer
  49. var headerFooterViewController: KMHeaderFooterController?
  50. //Bates
  51. var batesViewController: KMBatesController?
  52. //左边
  53. var botaViewController: KMNLeftSideViewController?
  54. //MARK: - 旧代码,有需要用到的拿出来,写好备注
  55. @IBOutlet weak var rightView: NSView!
  56. @IBOutlet weak var leftView: NSView!
  57. var model = KMMainModel()
  58. //自动滚动
  59. var autoFlowOptionsSheetController: KMAutoFlowOptionsSheetController?
  60. //Search
  61. var searchIndex: Int = 0
  62. //Form
  63. var formAlertView: KMFormAlertView?
  64. //Secure
  65. var secureAlertView: KMSecureAlertView?
  66. //对比
  67. var isCompareModel: Bool = false {
  68. didSet {
  69. }
  70. }
  71. //合并
  72. var mergeWindowController: KMMergeWindowController?
  73. //密码弹窗
  74. var passwordWindow: KMPasswordInputWindow?
  75. //对比
  76. var compressWIndowControllerNew: KMCompressWIndowControllerNew?
  77. //
  78. var securityWindowController: KMSecurityWindowController?
  79. //引导
  80. var guideInfoWindowController: KMGuideInfoWindowController?
  81. //春季活动
  82. var recommondPopWindowVC: KMRecommondPopWindow?
  83. var removeAllAnnotationsStore = KMPDFViewRemoveAllAnnotationsStore()
  84. private var _needSave = false
  85. var needSave: Bool {
  86. set {
  87. _needSave = newValue
  88. if (_needSave == false) {
  89. self.clearIsPDFDocumentEdited()
  90. }
  91. }
  92. get {
  93. return _needSave
  94. }
  95. }
  96. var isPDFDocumentEdited: Bool {
  97. get {
  98. return self.model.isPDFDocumentEdited
  99. }
  100. }
  101. var leftSideViewController: KMLeftSideViewController = KMLeftSideViewController.init(type: KMLeftMethodMode())
  102. var rightSideViewController: KMRightSideViewController!
  103. var searchResults: [KMSearchMode] = []
  104. var mwcFlags: MwcFlags = MwcFlags()
  105. weak var browserWindowController: KMBrowserWindowController? //慎直接使用这个方法
  106. var cropSettingWindowController: KMCropSettingWindowController!
  107. var currentWindowController: NSWindowController!
  108. var savedNormalSetup: NSMutableDictionary = NSMutableDictionary()
  109. //数字签名
  110. var digitalSignController: KMPDFDigitalSignViewController?
  111. var redactController: KMPDFRedactViewController!
  112. let CPDFOfficeLeftSidePaneWidthKey = "CPDFOfficeLeftSidePaneWidthKey"
  113. let CPDFOfficeRightSidePaneWidthKey = "CPDFOfficeRightSidePaneWidthKey"
  114. var extract: KMExtractImageWindowController?
  115. var functionWidth: Double {
  116. get {
  117. if self.viewManager.isPDFReadMode {
  118. if !self.model.isShowBOTA {
  119. return 0
  120. }
  121. }
  122. return 48-4
  123. }
  124. }
  125. var pageNumber: UInt?
  126. var pdfEditController: KMPDFEditViewController? {
  127. get {
  128. return self.getPDFEditController()
  129. }
  130. }
  131. var autoSaveTimer: Timer?
  132. private var _documentFirstLoad: Bool = true
  133. var eventMonitor: Any?
  134. var keyEventMonitor: Any?
  135. var mouseRightMenuEvent: NSEvent?
  136. lazy private var homeVC: KMNHomeViewController? = {
  137. let vc = KMNHomeViewController()
  138. return vc
  139. }()
  140. fileprivate var _secureOptions: [CPDFDocumentWriteOption : Any]?
  141. var secureOptions: [CPDFDocumentWriteOption : Any]? {
  142. get {
  143. return self._secureOptions
  144. }
  145. }
  146. var documentAttribute: [CPDFDocumentAttribute : Any]?
  147. fileprivate var _removeSecureFlag = false
  148. var removeSecureFlag: Bool {
  149. get {
  150. return self._removeSecureFlag
  151. }
  152. }
  153. fileprivate var _saveWatermarkFlag = false
  154. var saveWatermarkFlag: Bool {
  155. get {
  156. return self._saveWatermarkFlag
  157. }
  158. }
  159. private var mainWindow_: NSWindow?
  160. var mainWindow: NSWindow? {
  161. get {
  162. return self.mainWindow_
  163. }
  164. set {
  165. self.mainWindow_ = newValue
  166. }
  167. }
  168. var setDocument: CPDFDocument? {
  169. get {
  170. return document
  171. }
  172. set {
  173. if document != newValue {
  174. document = newValue
  175. }
  176. listView.document = document
  177. botaViewController?.changeDocument(document: document)
  178. }
  179. }
  180. var setPageNumber: UInt {
  181. get {
  182. return pageNumber!
  183. }
  184. set {
  185. let pageCount = listView.document?.pageCount ?? 0
  186. var value = newValue
  187. if value > pageCount {
  188. value = pageCount
  189. }
  190. if value > 0 && listView.currentPage().pageIndex() != value-1 {
  191. listView.go(to: listView.document?.page(at: value-1))
  192. }
  193. if pageNumber != value {
  194. pageNumber = value
  195. }
  196. }
  197. }
  198. let editPDFHanddler = KMEditPDfHanddler()
  199. var distanceMeasureInfoWindowController: CDistanceMeasureInfoWindowController?
  200. var perimeterMeasureInfoWindowController: CPerimeterMeasureInfoWindowController?
  201. var areaMeasureInfoWindowController: CAreaMeasureInfoWindowController?
  202. var srHanddler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
  203. //MARK: - func
  204. deinit {
  205. NotificationCenter.default.removeObserver(self)
  206. self.listView.delegate = nil
  207. self.listView.document?.delegate = nil
  208. self.editPDFHanddler.clearData()
  209. self.removeEventMonitor()
  210. self.removeKeyEventMonitor()
  211. }
  212. override func viewDidLoad() {
  213. super.viewDidLoad()
  214. // Do view setup here.
  215. toolbarManager.pdfViewManager = viewManager
  216. }
  217. override func viewDidAppear() {
  218. super.viewDidAppear()
  219. setupUI()
  220. }
  221. func setupUI() {
  222. initPDFView()
  223. initToolbar()
  224. initSideBar()
  225. setUpSplitView()
  226. }
  227. private func documentLoadComplete() {
  228. initBotaView()
  229. }
  230. func leftSidePaneIsOpen() -> Bool {
  231. if(botaViewController != nil) {
  232. return infoContendSplitView.isSubviewCollapsed(botaViewController!.view)
  233. }
  234. return false
  235. }
  236. private func toggleOpenLeftSide(pdfSideBarType: KMPDFSidebarType) {
  237. if(leftSidePaneIsOpen() == false) {
  238. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  239. }
  240. if pdfSideBarType == .search {
  241. KMPrint(" search")
  242. } else if pdfSideBarType == .thumbnail {
  243. botaViewController?.leftsideType = pdfSideBarType
  244. KMPrint(" thumbnail")
  245. } else if pdfSideBarType == .outline {
  246. KMPrint(" outline")
  247. } else if pdfSideBarType == .bookmark {
  248. botaViewController?.bookmarkViewC.handdler = KMNBookmarkHanddler(pdfView: self.listView)
  249. botaViewController?.leftsideType = pdfSideBarType
  250. } else if pdfSideBarType == .annotation {
  251. KMPrint(" annotation")
  252. }
  253. }
  254. private func toggleCloseLeftSide() {
  255. if(leftSidePaneIsOpen() == true) {
  256. infoContendSplitView.setPosition(-20, ofDividerAt: 0)
  257. }
  258. }
  259. //MARK: - PDFView
  260. func initPDFView() {
  261. listView.autoresizingMask = [.width, .height]
  262. listView.delegate = self
  263. listView.pdfListViewDelegate = self
  264. listView.document = self.document
  265. reloadPDFSplitInfo()
  266. }
  267. //MARK: - SplitView
  268. func setUpSplitView() {
  269. infoContendSplitView.wantsLayer = true
  270. infoContendSplitView.layer?.backgroundColor = NSColor.clear.cgColor
  271. infoContendSplitView.delegate = self
  272. infoContendSplitView.layer?.masksToBounds = true
  273. infoContendSplitView.setPosition(-10, ofDividerAt: 0)
  274. infoContendSplitView.setPosition(CGRectGetWidth(infoContendSplitView.frame), ofDividerAt: 1)
  275. }
  276. func setupSplitPDFController() {
  277. if splitPDFController == nil {
  278. splitPDFController = KMSplitPDFViewController.init()
  279. }
  280. splitPDFController?.view.frame = pdfSplitBottomView.bounds
  281. splitPDFController?.view.autoresizingMask = [.height, .width]
  282. splitPDFController?.viewManager = self.viewManager
  283. splitPDFController?.delegate = self
  284. splitPDFController?.reloadData()
  285. pdfSplitBottomView.addSubview(splitPDFController!.view)
  286. }
  287. //MARK: - 工具栏
  288. func initToolbar() {
  289. toolbarBox.borderWidth = 0
  290. if pdfToolbarController == nil {
  291. pdfToolbarController = KMPDFToolbarController.init()
  292. }
  293. pdfToolbarController?.view.frame = toolbarBox.bounds
  294. pdfToolbarController?.view.autoresizingMask = [.width, .height]
  295. pdfToolbarController?.delegate = self
  296. toolbarBox.contentView = pdfToolbarController?.view
  297. pdfToolbarController?.viewManager = viewManager
  298. pdfToolbarController?.toolbarManager = toolbarManager
  299. pdfToolbarController?.pdfView = listView
  300. pdfToolbarController?.setUpData()
  301. refreshToolbarView()
  302. }
  303. func refreshToolbarView() {
  304. let _manager = viewManager
  305. if _manager.isPageEditMode {
  306. toolbarBoxHeightConst.constant = 80
  307. } else if _manager.editType == .watermark || _manager.editType == .background || _manager.editType == .header_Footer || _manager.editType == .bates {
  308. toolbarBoxHeightConst.constant = 40
  309. } else if _manager.toolMode == .Markup ||
  310. _manager.toolMode == .Edit ||
  311. _manager.toolMode == .Form ||
  312. _manager.toolMode == .Fill ||
  313. _manager.toolMode == .Convert ||
  314. _manager.toolMode == .Protect ||
  315. _manager.toolMode == .Tools {
  316. toolbarBoxHeightConst.constant = 80
  317. } else {
  318. toolbarBoxHeightConst.constant = 40
  319. }
  320. }
  321. //MARK: - 侧边栏
  322. func initSideBar() {
  323. sidebarBox.borderWidth = 0
  324. if sideBarController == nil {
  325. sideBarController = KMPDFSideBarController.init()
  326. }
  327. sideBarController?.view.frame = sidebarBox.bounds
  328. sideBarController?.view.autoresizingMask = [.width, .height]
  329. sidebarBox.contentView = sideBarController?.view
  330. sideBarController?.pdfView = listView
  331. sideBarController?.delegate = self
  332. sideBarController?.pdfViewManager = viewManager
  333. sideBarController?.reloadData()
  334. }
  335. //MARK: - 侧边栏
  336. func initBotaView() {
  337. if botaViewController == nil {
  338. botaViewController = KMNLeftSideViewController(listView.document)
  339. }
  340. botaViewController?.leftSideViewDelegate = self
  341. botaViewController?.view.frame = infoSplitLeftView.bounds
  342. botaViewController?.view.autoresizingMask = [.width, .height]
  343. if botaViewController != nil {
  344. infoSplitLeftView?.addSubview(botaViewController!.view)
  345. }
  346. }
  347. //MARK: - PDFDisplayView
  348. func updatePDFDisplaySettingView() {
  349. if viewManager.showDisplayView {
  350. infoSplitViewLeftConst.constant = 264
  351. } else {
  352. infoSplitViewLeftConst.constant = 44
  353. }
  354. if viewManager.showDisplayView {
  355. if displaySettingController == nil {
  356. displaySettingController = KMNDisplayViewController.init()
  357. }
  358. displaySettingController?.view.frame = CGRectMake(0, 0, 264, CGRectGetHeight(bottomContendBox.frame))
  359. displaySettingController?.view.autoresizingMask = [.height, .maxXMargin]
  360. bottomContendBox.addSubview(displaySettingController!.view)
  361. displaySettingController?.pdfView = self.listView
  362. displaySettingController?.viewManager = self.viewManager
  363. displaySettingController?.delegate = self
  364. displaySettingController?.reloadData()
  365. } else {
  366. displaySettingController?.view.removeFromSuperview()
  367. displaySettingController = nil
  368. }
  369. }
  370. //MARK: - 页面编辑
  371. func enterPageEditMode() {
  372. pageEditViewController = KMNPageEditViewController(self.document)
  373. if(pageEditViewController != nil) {
  374. bottomContendBox.addSubview(pageEditViewController!.view)
  375. pageEditViewController?.view.frame = bottomContendBox.bounds
  376. pageEditViewController?.thumbnailBaseViewDelegate = self
  377. pageEditViewController?.selectionIndexPaths = [IndexPath(item: listView.currentPageIndex, section: 0)]
  378. pageEditViewController?.view.autoresizingMask = [.width,.height]
  379. pageEditViewController?.currentUndoManager = listView.undoManager
  380. toolbarManager.page_pageInfo_Property.text = String(listView.currentPageIndex + 1)
  381. pdfToolbarController?.refreshSecondToolbarItemsState()
  382. }
  383. }
  384. func exitPageEditMode() {
  385. if pageEditViewController != nil {
  386. pageEditViewController?.view.removeFromSuperview()
  387. pageEditViewController = nil
  388. }
  389. }
  390. //MARK: - 阅读模式
  391. func openPDFReadMode() {
  392. if viewManager.showDisplayView {
  393. viewManager.showDisplayView = false
  394. pdfToolbarController?.reloadLeftIconView()
  395. updatePDFDisplaySettingView()
  396. }
  397. infoSplitViewLeftConst.constant = 0
  398. toolbarBoxHeightConst.constant = 0
  399. view.window?.makeFirstResponder(listView)
  400. var readModeMessage: ComponentMessage = ComponentMessage()
  401. readModeMessage.properties = ComponentMessageProperty(messageType: .normal_custom, title: KMLocalizedString("Read Mode On"))
  402. readModeMessage.frame = CGRectMake((CGRectGetWidth(self.view.frame) - readModeMessage.properties.propertyInfo.viewWidth)/2,
  403. CGRectGetHeight(self.view.frame) - readModeMessage.properties.propertyInfo.viewHeight - 8,
  404. readModeMessage.properties.propertyInfo.viewWidth,
  405. readModeMessage.properties.propertyInfo.viewHeight)
  406. readModeMessage.reloadData()
  407. readModeMessage.show(inView: self.view, autoHideSeconde: 2)
  408. }
  409. func exitPDFReadMode() {
  410. viewManager.isPDFReadMode = false
  411. updatePDFDisplaySettingView()
  412. refreshToolbarView()
  413. }
  414. //MARK: - PPT
  415. func togglePresentation(_ sender: Any?) {
  416. if self.canExitPresentation() {
  417. exitFullScreen()
  418. } else if self.canEnterPresentation() {
  419. NotificationCenter.default.addObserver(self, selector: #selector(willEnterInteractionModeNotification), name: NSWindow.willEnterInteractionModeNotification, object: nil)
  420. NotificationCenter.default.addObserver(self, selector: #selector(didEnterInteractionModeNotification), name: NSWindow.didEnterInteractionModeNotification, object: nil)
  421. NotificationCenter.default.addObserver(self, selector: #selector(willShowFullScreenNotification), name: NSWindow.willShowFullScreenNotification, object: nil)
  422. NotificationCenter.default.addObserver(self, selector: #selector(didShowFullScreenNotification), name: NSWindow.didShowFullScreenNotification, object: nil)
  423. view.window?.enterPresentation(provider: self)
  424. }
  425. }
  426. func enterPresentationMode() {
  427. let scrollView = listView.documentView().enclosingScrollView
  428. savedNormalSetup.setValue(scrollView?.hasHorizontalScroller, forKey: KMMainModel.Key.kHasHorizontalScroller)
  429. savedNormalSetup.setValue(scrollView?.hasVerticalScroller, forKey: KMMainModel.Key.kHasVerticalsCroller)
  430. savedNormalSetup.setValue(scrollView?.autohidesScrollers, forKey: KMMainModel.Key.kAutoHidesScrollers)
  431. listView.backgroundColor = NSColor.clear
  432. listView.setDisplay(.singlePage)
  433. listView.autoScales = true
  434. listView.displayBox = .cropBox
  435. listView.displaysPageBreaks = false
  436. scrollView?.autohidesScrollers = true
  437. scrollView?.hasHorizontalScroller = false
  438. scrollView?.hasVerticalScroller = false
  439. listView.setCurrentSelection(nil, animate: true)
  440. }
  441. func exitPresentationMode() {
  442. NotificationCenter.default.removeObserver(self, name: NSWindow.willEnterInteractionModeNotification, object: nil)
  443. NotificationCenter.default.removeObserver(self, name: NSWindow.didEnterInteractionModeNotification, object: nil)
  444. NotificationCenter.default.removeObserver(self, name: NSWindow.willShowFullScreenNotification, object: nil)
  445. NotificationCenter.default.removeObserver(self, name: NSWindow.willShowFullScreenNotification, object: nil)
  446. }
  447. func exitFullScreen() {
  448. if self.canExitPresentation() == true {
  449. let mainDocument = self.myDocument as? KMMainDocument
  450. let browserWindowController = mainDocument?.browser?.windowController as? KMBrowserWindowController
  451. browserWindowController?.exitFullscreen()
  452. }
  453. }
  454. func exitFullscreenMode() {
  455. if self.interactionMode == .presentation {
  456. self.exitPresentationMode()
  457. }
  458. self.applyPDFSettings(self.savedNormalSetup)
  459. self.savedNormalSetup.removeAllObjects()
  460. listView.layoutDocumentView()
  461. listView.requiresDisplay()
  462. if let backgroundColor = UserDefaults.standard.color(forKey: KMBackgroundColorKey) {
  463. listView.backgroundColor = backgroundColor
  464. }
  465. }
  466. func applyPDFSettings(_ setup: NSDictionary) {
  467. if let data = setup.object(forKey: KMMainModel.Key.kAutoScales) as? NSNumber {
  468. self.listView.autoScales = data.boolValue
  469. }
  470. if self.listView.autoScales == false {
  471. if let data = setup.object(forKey: KMMainModel.Key.kScaleFactor) as? NSNumber {
  472. self.listView.scaleFactor = data.floatValue.cgFloat
  473. }
  474. }
  475. if let data = setup.object(forKey: KMMainModel.Key.kDisplayMode) as? NSNumber {
  476. self.listView.setDisplay(CPDFDisplayViewMode(rawValue: data.intValue) ?? .singlePage)
  477. }
  478. if let data = setup.object(forKey: KMMainModel.Key.kDisplaysAsBook) as? NSNumber {
  479. self.listView.displaysAsBook = data.boolValue
  480. }
  481. if let data = setup.object(forKey: KMMainModel.Key.kDisplaysPageBreaks) as? NSNumber {
  482. self.listView.displaysPageBreaks = data.boolValue
  483. }
  484. if let data = setup.object(forKey: KMMainModel.Key.kDisplayBox) as? NSNumber {
  485. }
  486. self.listView.layoutDocumentView()
  487. }
  488. func currentPDFSettings() -> NSDictionary {
  489. let setup = NSMutableDictionary()
  490. setup[KMMainModel.Key.kDisplaysPageBreaks] = NSNumber(value: listView.displaysPageBreaks)
  491. setup[KMMainModel.Key.kDisplaysAsBook] = NSNumber(value: listView.displaysAsBook)
  492. setup[KMMainModel.Key.kDisplayBox] = NSNumber(value: listView.displayBox.rawValue)
  493. setup[KMMainModel.Key.kScaleFactor] = NSNumber(value: listView.scaleFactor)
  494. setup[KMMainModel.Key.kAutoScales] = NSNumber(value: listView.autoScales)
  495. setup[KMMainModel.Key.kDisplayMode] = NSNumber(value: listView.fetchDisplayViewMode().rawValue)
  496. return setup
  497. }
  498. func canEnterFullscreen() -> Bool {
  499. if (mwcFlags.isSwitchingFullScreen != 0) {
  500. return false
  501. }
  502. if useNativeFullScreen() {
  503. return interactionMode == .normal || interactionMode == .presentation
  504. } else {
  505. return !self.listView.document.isLocked && (interactionMode == .normal || interactionMode == .presentation) && self.view.window?.tabbedWindows?.count ?? 0 < 2
  506. }
  507. }
  508. override func canEnterPresentation() -> Bool {
  509. let can = super.canEnterPresentation()
  510. if can == false {
  511. return false
  512. }
  513. guard let doc = self.listView.document, doc.isLocked == false else {
  514. return false
  515. }
  516. return can
  517. }
  518. func fadeOutFullScreenWindow() {
  519. guard let fullScreenWindow = self.view.window as? KMFullScreenWindow else {
  520. NSSound.beep()
  521. return
  522. }
  523. let mainWindow = fullScreenWindow.interactionParent
  524. let collectionBehavior = mainWindow?.collectionBehavior
  525. mainWindow?.alphaValue = 0
  526. if let data = mainWindow?.responds(to: NSSelectorFromString("setAnimationBehavior:")), data {
  527. mainWindow?.animationBehavior = .none
  528. }
  529. // trick to make sure the main window shows up in the same space as the fullscreen window
  530. fullScreenWindow.addChildWindow(mainWindow!, ordered: .below)
  531. fullScreenWindow.removeChildWindow(mainWindow!)
  532. fullScreenWindow.level = .popUpMenu
  533. // these can change due to the child window trick
  534. mainWindow?.level = .normal
  535. mainWindow?.alphaValue = 1.0
  536. mainWindow?.collectionBehavior = collectionBehavior!
  537. mainWindow?.display()
  538. mainWindow?.makeFirstResponder(self.listView)
  539. mainWindow?.recalculateKeyViewLoop()
  540. // mainWindow?.delegate = self
  541. mainWindow?.makeKey()
  542. if let data = mainWindow?.responds(to: NSSelectorFromString("setAnimationBehavior:")), data {
  543. mainWindow?.animationBehavior = .default
  544. }
  545. NSApp.removeWindowsItem(fullScreenWindow)
  546. fullScreenWindow.fadeOut()
  547. }
  548. //MARK: - PDF分屏视图
  549. func reloadPDFSplitInfo() {
  550. if listView.viewSplitMode == .disable {
  551. pdfSplitView.isHidden = true
  552. listView.frame = infoSplitCenterView.bounds
  553. infoSplitCenterView.addSubview(listView)
  554. if splitPDFController != nil {
  555. splitPDFController = nil
  556. }
  557. } else {
  558. pdfSplitView.isHidden = false
  559. listView.frame = pdfSplitTopView.bounds
  560. pdfSplitTopView.addSubview(listView)
  561. setUpPDFBottomToolbar()
  562. setupSplitPDFController()
  563. if listView.viewSplitMode == .horizontal {
  564. pdfSplitView.isVertical = false
  565. } else if listView.viewSplitMode == .vertical {
  566. pdfSplitView.isVertical = true
  567. }
  568. }
  569. }
  570. func setUpPDFBottomToolbar() {
  571. if pdfBottomToolbar != nil {
  572. pdfBottomToolbar = nil
  573. }
  574. pdfBottomToolbar = KMSplitToolbar.init()
  575. pdfBottomToolbar?.frame = CGRectMake(CGRectGetWidth(pdfSplitTopView.frame)/2-144, 20, 288, 40)
  576. pdfBottomToolbar?.pdfView = self.listView
  577. pdfBottomToolbar?.reloadData()
  578. pdfSplitTopView.addSubview(pdfBottomToolbar!)
  579. }
  580. func reloadPDFBottomToolbar() {
  581. if viewManager.splitShowBottomBar {
  582. pdfBottomToolbar?.isHidden = false
  583. pdfBottomToolbar?.reloadData()
  584. } else {
  585. pdfBottomToolbar?.isHidden = true
  586. }
  587. }
  588. //MARK: - Edit模式
  589. func showEditToolbarView() {
  590. if editToolbarView == nil {
  591. editToolbarView = KMEditToolbarView()
  592. }
  593. editToolbarView?.frame = toolbarBox.bounds
  594. editToolbarView?.delegate = self
  595. editToolbarView?.autoresizingMask = [.width, .height]
  596. toolbarBox.contentView = editToolbarView
  597. }
  598. //MARK: - Watermark水印
  599. func showWatermarkController() {
  600. listView.isHidden = true
  601. viewManager.editType = .watermark
  602. showEditToolbarView()
  603. editToolbarView?.editType = .watermark
  604. if KMWatermarkManager.defaultManager.watermarks.count == 0 {
  605. editToolbarView?.editSubType = .add
  606. } else {
  607. editToolbarView?.editSubType = .template
  608. }
  609. editToolbarView?.reloadData()
  610. if watermarkViewController == nil {
  611. watermarkViewController = KMWatermarkController.init()
  612. }
  613. watermarkViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  614. watermarkViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  615. watermarkViewController?.delegate = self
  616. bottomContendBox.addSubview(watermarkViewController!.view)
  617. watermarkViewController?.editSubType = editToolbarView?.editSubType ?? .template
  618. updateWatermarkDocument()
  619. }
  620. func updateWatermarkDocument() {
  621. guard let controller = watermarkViewController else { return }
  622. controller.pdfDocument = nil
  623. var editDocument = CPDFDocument.init()
  624. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  625. editDocument?.insertPageObject(page, at: 0)
  626. watermarkViewController?.pdfDocument = editDocument
  627. watermarkViewController?.reloadData()
  628. }
  629. func exitWatermarkController() {
  630. listView.isHidden = false
  631. viewManager.editType = .none
  632. editToolbarView?.removeFromSuperview()
  633. editToolbarView = nil
  634. watermarkViewController?.view.removeFromSuperview()
  635. watermarkViewController = nil
  636. refreshToolbarView()
  637. toolbarBox.contentView = pdfToolbarController?.view
  638. }
  639. //移除文档水印
  640. func removePDFWatermark() {
  641. let watermarks = self.listView.document.watermarks()
  642. if (watermarks == nil || watermarks!.count <= 0) {
  643. let alert = NSAlert()
  644. alert.alertStyle = .warning
  645. alert.messageText = NSLocalizedString("Could not find a removable watermark in this document. If you see a watermark, it was not added with PDF Reader Pro and therefore cannot be detected.", comment: "")
  646. alert.addButton(withTitle: NSLocalizedString("Confirm", comment: ""))
  647. alert.runModal()
  648. return
  649. }
  650. let alert = NSAlert()
  651. alert.alertStyle = .warning
  652. alert.messageText = NSLocalizedString("Are you sure you want to remove the watermark?", comment: "")
  653. alert.addButton(withTitle: NSLocalizedString("Delete", comment: ""))
  654. alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  655. let result = alert.runModal()
  656. if (result == .alertFirstButtonReturn) {
  657. for watermark in watermarks! {
  658. listView.document.removeWatermark(watermark)
  659. }
  660. listView.layoutDocumentView()
  661. }
  662. }
  663. func batchAddWatermark() {
  664. }
  665. func batchRemoveWatermark() {
  666. }
  667. //MARK: - Background背景
  668. func showBackgroundController() {
  669. listView.isHidden = true
  670. viewManager.editType = .background
  671. showEditToolbarView()
  672. editToolbarView?.editType = .background
  673. if KMBackgroundManager.defaultManager.datas.count == 0 {
  674. editToolbarView?.editSubType = .add
  675. } else {
  676. editToolbarView?.editSubType = .template
  677. }
  678. editToolbarView?.reloadData()
  679. if backgroundViewController == nil {
  680. backgroundViewController = KMBackgroundController.init()
  681. }
  682. backgroundViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  683. backgroundViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  684. backgroundViewController?.delegate = self
  685. bottomContendBox.addSubview(backgroundViewController!.view)
  686. backgroundViewController?.editSubType = editToolbarView?.editSubType ?? .template
  687. updateBackgroundDocument()
  688. }
  689. func updateBackgroundDocument() {
  690. guard let controller = backgroundViewController else { return }
  691. controller.pdfDocument = nil
  692. let editDocument = CPDFDocument.init()
  693. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  694. editDocument?.insertPageObject(page, at: 0)
  695. backgroundViewController?.pdfDocument = editDocument
  696. backgroundViewController?.reloadData()
  697. }
  698. func exitBackgroundController() {
  699. listView.isHidden = false
  700. viewManager.editType = .none
  701. editToolbarView?.removeFromSuperview()
  702. editToolbarView = nil
  703. backgroundViewController?.view.removeFromSuperview()
  704. backgroundViewController = nil
  705. refreshToolbarView()
  706. toolbarBox.contentView = pdfToolbarController?.view
  707. }
  708. func removePDFBackground() {
  709. let background = listView.document.background()
  710. background?.clear()
  711. }
  712. func batchAddBackground() {
  713. }
  714. func batchRemoveBackground() {
  715. }
  716. //MARK: - header&footer
  717. func showHeaderFooterController() {
  718. listView.isHidden = true
  719. viewManager.editType = .header_Footer
  720. showEditToolbarView()
  721. editToolbarView?.editType = .header_Footer
  722. if KMHeaderFooterManager.defaultManager.headFooterObjects.count == 0 {
  723. editToolbarView?.editSubType = .add
  724. } else {
  725. editToolbarView?.editSubType = .template
  726. }
  727. editToolbarView?.reloadData()
  728. if headerFooterViewController == nil {
  729. headerFooterViewController = KMHeaderFooterController.init()
  730. }
  731. headerFooterViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  732. headerFooterViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  733. // headerFooterViewController?.delegate = self
  734. bottomContendBox.addSubview(headerFooterViewController!.view)
  735. headerFooterViewController?.editSubType = editToolbarView?.editSubType ?? .template
  736. updateHeaderFooterDocument()
  737. }
  738. func updateHeaderFooterDocument() {
  739. guard let controller = headerFooterViewController else { return }
  740. controller.pdfDocument = nil
  741. let editDocument = CPDFDocument.init()
  742. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  743. editDocument?.insertPageObject(page, at: 0)
  744. headerFooterViewController?.pdfDocument = editDocument
  745. headerFooterViewController?.reloadData()
  746. }
  747. func exitHeaderFooterController() {
  748. listView.isHidden = false
  749. viewManager.editType = .none
  750. editToolbarView?.removeFromSuperview()
  751. editToolbarView = nil
  752. headerFooterViewController?.view.removeFromSuperview()
  753. headerFooterViewController = nil
  754. refreshToolbarView()
  755. toolbarBox.contentView = pdfToolbarController?.view
  756. }
  757. func removePDFHeaderFooter() {
  758. }
  759. func batchAddHeaderFooter() {
  760. }
  761. func batchRemoveHeaderFooter() {
  762. }
  763. //MARK: - Bates
  764. func showBatesController() {
  765. listView.isHidden = true
  766. viewManager.editType = .bates
  767. showEditToolbarView()
  768. editToolbarView?.editType = viewManager.editType
  769. if KMBatesManager.defaultManager.datas.count == 0 {
  770. editToolbarView?.editSubType = .add
  771. } else {
  772. editToolbarView?.editSubType = .template
  773. }
  774. editToolbarView?.reloadData()
  775. if batesViewController == nil {
  776. batesViewController = KMBatesController.init()
  777. }
  778. batesViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  779. batesViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  780. // headerFooterViewController?.delegate = self
  781. bottomContendBox.addSubview(batesViewController!.view)
  782. batesViewController?.editSubType = editToolbarView?.editSubType ?? .template
  783. updateBatesDocument()
  784. }
  785. func updateBatesDocument() {
  786. guard let controller = batesViewController else { return }
  787. controller.pdfDocument = nil
  788. let editDocument = CPDFDocument.init()
  789. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  790. editDocument?.insertPageObject(page, at: 0)
  791. batesViewController?.pdfDocument = editDocument
  792. batesViewController?.reloadData()
  793. }
  794. func exitBatesController() {
  795. listView.isHidden = false
  796. viewManager.editType = .none
  797. editToolbarView?.removeFromSuperview()
  798. editToolbarView = nil
  799. batesViewController?.view.removeFromSuperview()
  800. batesViewController = nil
  801. refreshToolbarView()
  802. toolbarBox.contentView = pdfToolbarController?.view
  803. }
  804. func removePDFBates() {
  805. }
  806. func batchAddBates() {
  807. }
  808. func batchRemoveBates() {
  809. }
  810. }
  811. //MARK: - NSSplitViewDelegate
  812. extension KMMainViewController: NSSplitViewDelegate {
  813. func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
  814. return true
  815. }
  816. func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
  817. return true
  818. }
  819. func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  820. return proposedMaximumPosition
  821. }
  822. func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  823. return proposedMinimumPosition
  824. }
  825. func splitView(_ splitView: NSSplitView, constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  826. if dividerIndex == 0 {
  827. if proposedPosition > CGRectGetWidth(infoContendSplitView.frame)/2 - 10 {
  828. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  829. return CGRectGetWidth(infoContendSplitView.frame)/2 - 10
  830. }
  831. } else if dividerIndex == 1 {
  832. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  833. }
  834. return proposedPosition
  835. }
  836. func splitViewDidResizeSubviews(_ notification: Notification) {
  837. let splitView = notification.object as? NSSplitView
  838. if((splitView?.isEqual(to: infoContendSplitView)) == true) {
  839. leftSplitViewResizeFinish()
  840. }
  841. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(splitViewResizeFinish), object: nil)
  842. self.perform(#selector(splitViewResizeFinish), with: nil, afterDelay: 0.15)
  843. }
  844. @objc func leftSplitViewResizeFinish() {
  845. botaViewController?.changeLeftSideBounds()
  846. }
  847. @objc func splitViewResizeFinish() {
  848. if infoContendSplitView.isSubviewCollapsed(infoSplitLeftView) {
  849. if viewManager.pdfSideBarType != .none {
  850. viewManager.pdfSideBarType = .none
  851. sideBarController?.reloadBOTAData()
  852. }
  853. }
  854. }
  855. }
  856. //MARK: - KMPDFSideBarControllerDelegate 左侧Sidebar代理
  857. extension KMMainViewController: KMPDFSideBarControllerDelegate {
  858. func kmPDFSideBarControllerDidSidebarTypeUpdated(_ view: KMPDFSideBarController) {
  859. if viewManager.pdfSideBarType == .none {
  860. toggleCloseLeftSide()
  861. } else {
  862. toggleOpenLeftSide(pdfSideBarType: viewManager.pdfSideBarType)
  863. }
  864. }
  865. func kmPDFSideBarControllerDidGotoPage(_ view: KMPDFSideBarController, _ pageIndex: Int) {
  866. listView.go(toPageIndex: pageIndex, animated: true)
  867. }
  868. }
  869. //MARK: - KMPDFToolbarControllerDelegate 工具栏代理
  870. extension KMMainViewController: KMPDFToolbarControllerDelegate {
  871. func kmPDFToolbarControllerDidToolbarItemClicked(_ controller: KMPDFToolbarController, _ itemIdentifier: String) {
  872. print("toolbar点击", itemIdentifier)
  873. if itemIdentifier == KMPDFToolbar_ViewDisplay_Identifier {
  874. //Display
  875. updatePDFDisplaySettingView()
  876. } else if itemIdentifier == KMPDFToolbar_PageEdit_Identifier {
  877. if viewManager.isPageEditMode == true {
  878. enterPageEditMode()
  879. } else {
  880. exitPageEditMode()
  881. }
  882. } else if itemIdentifier == KMPDFToolbar_Markup_Identifier {
  883. } else if itemIdentifier == KMPDFToolbar_Edit_Identifier {
  884. } else if itemIdentifier == KMPDFToolbar_Form_Identifier {
  885. } else if itemIdentifier == KMPDFToolbar_Fill_Identifier {
  886. } else if itemIdentifier == KMPDFToolbar_Convert_Identifier {
  887. } else if itemIdentifier == KMPDFToolbar_Protect_Identifier {
  888. } else if itemIdentifier == KMPDFToolbar_Tools_Identifier {
  889. } else if itemIdentifier == KMPDFToolbar_convert_word_Identifier {
  890. let winC = KMConvertWordWindowController()
  891. let model = KMDocumentModel(url: listView.document.documentURL)
  892. winC.documentModel = model
  893. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  894. } else if itemIdentifier == KMPDFToolbar_convert_ppt_Identifier {
  895. let winC = KMConvertPPTsWindowController()
  896. winC.subType = 1
  897. let model = KMDocumentModel(url: listView.document.documentURL)
  898. winC.documentModel = model
  899. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  900. } else if itemIdentifier == KMPDFToolbar_convert_RTF_Identifier {
  901. let winC = KMConvertPPTsWindowController()
  902. winC.subType = 2
  903. let model = KMDocumentModel(url: listView.document.documentURL)
  904. winC.documentModel = model
  905. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  906. } else if itemIdentifier == KMPDFToolbar_convert_Text_Identifier {
  907. let winC = KMConvertPPTsWindowController()
  908. winC.subType = 4
  909. let model = KMDocumentModel(url: listView.document.documentURL)
  910. winC.documentModel = model
  911. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  912. } else if itemIdentifier == KMPDFToolbar_convert_CSV_Identifier {
  913. let winC = KMConvertPPTsWindowController()
  914. winC.subType = 5
  915. let model = KMDocumentModel(url: listView.document.documentURL)
  916. winC.documentModel = model
  917. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  918. } else if itemIdentifier == KMPDFToolbar_convert_excel_Identifier {
  919. let winC = KMConvertExcelWindowController()
  920. let model = KMDocumentModel(url: listView.document.documentURL)
  921. winC.documentModel = model
  922. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  923. } else if itemIdentifier == KMPDFToolbar_convert_HTML_Identifier {
  924. let winC = KMConvertHtmlWindowController()
  925. let model = KMDocumentModel(url: listView.document.documentURL)
  926. winC.documentModel = model
  927. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  928. } else if itemIdentifier == KMPDFToolbar_convert_Json_Identifier {
  929. let winC = KMConvertJsonWindowController()
  930. let model = KMDocumentModel(url: listView.document.documentURL)
  931. winC.documentModel = model
  932. winC.own_beginSheetModal(for: view.window, completionHandler: nil)
  933. } else if itemIdentifier == KMPDFToolbar_convert_image_Identifier {
  934. let winC = KMConvertImageWindowController()
  935. let model = KMDocumentModel(url: listView.document.documentURL)
  936. winC.documentModel = model
  937. winC.own_beginSheetModal(for: view.window, completionHandler: nil)
  938. } else if itemIdentifier == KMPDFToolbar_convert_imageToPDF_Identifier {
  939. NSApplication.ShowImageToPDFWindow()
  940. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertFile_Identifier {
  941. pageEditViewController?.insertFromPDFAction()
  942. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertBlank_Identifier {
  943. pageEditViewController?.insertFromBlankAction()
  944. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertClip_Identifier {
  945. pageEditViewController?.insertFromClipboardAction()
  946. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertScanner_Identifier {
  947. pageEditViewController?.insertFromScannerAction()
  948. } else if itemIdentifier == KMPDFToolbar_PageEdit_Extract_Identifier {
  949. pageEditViewController?.extractPDFAction()
  950. } else if itemIdentifier == KMPDFToolbar_PageEdit_Replace_Identifier {
  951. pageEditViewController?.replacePDFAction()
  952. } else if itemIdentifier == KMPDFToolbar_PageEdit_Split_Identifier {
  953. pageEditViewController?.splitPDFAction()
  954. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reverse_Identifier {
  955. pageEditViewController?.reversePDFAction()
  956. } else if itemIdentifier == KMPDFToolbar_PageEdit_LeftRotate_Identifier {
  957. pageEditViewController?.rotatePageLeftAction()
  958. } else if itemIdentifier == KMPDFToolbar_PageEdit_RightRotate_Identifier{
  959. pageEditViewController?.rotatePageRightAction()
  960. } else if itemIdentifier == KMPDFToolbar_PageEdit_Delete_Identifier {
  961. pageEditViewController?.deletePageAction()
  962. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reduce_Identifier {
  963. pageEditViewController?.zoomOutPageAction()
  964. if(pageEditViewController?.canZoomInPageSize() == false) {
  965. toolbarManager.page_Increase_Property.isDisabled = true
  966. } else {
  967. toolbarManager.page_Increase_Property.isDisabled = false
  968. }
  969. if(pageEditViewController?.canZoomOutPageSize() == false) {
  970. toolbarManager.page_Reduce_Property.isDisabled = true
  971. } else {
  972. toolbarManager.page_Reduce_Property.isDisabled = false
  973. }
  974. controller.refreshSecondToolbarItemsState()
  975. } else if itemIdentifier == KMPDFToolbar_PageEdit_Increase_Identifier {
  976. pageEditViewController?.zoomInPageAction()
  977. if(pageEditViewController?.canZoomInPageSize() == false) {
  978. toolbarManager.page_Increase_Property.isDisabled = true
  979. } else {
  980. toolbarManager.page_Increase_Property.isDisabled = false
  981. }
  982. if(pageEditViewController?.canZoomOutPageSize() == false) {
  983. toolbarManager.page_Reduce_Property.isDisabled = true
  984. } else {
  985. toolbarManager.page_Reduce_Property.isDisabled = false
  986. }
  987. controller.refreshSecondToolbarItemsState()
  988. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_oddPage_Identifier {
  989. pageEditViewController?.thumbnailChoosePageStyle = .odd
  990. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  991. toolbarManager.page_pageInfo_Property.creatable = false
  992. controller.refreshSecondToolbarItemsState()
  993. }
  994. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_EvenPage_Identifier {
  995. pageEditViewController?.thumbnailChoosePageStyle = .even
  996. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  997. toolbarManager.page_pageInfo_Property.creatable = false
  998. controller.refreshSecondToolbarItemsState()
  999. }
  1000. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_PortraitPage_Identifier {
  1001. pageEditViewController?.thumbnailChoosePageStyle = .horizontal
  1002. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  1003. toolbarManager.page_pageInfo_Property.creatable = false
  1004. controller.refreshSecondToolbarItemsState()
  1005. }
  1006. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_LandscapePage_Identifier {
  1007. pageEditViewController?.thumbnailChoosePageStyle = .vertical
  1008. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  1009. toolbarManager.page_pageInfo_Property.creatable = false
  1010. controller.refreshSecondToolbarItemsState()
  1011. }
  1012. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_AllPage_Identifier {
  1013. pageEditViewController?.thumbnailChoosePageStyle = .allPage
  1014. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  1015. toolbarManager.page_pageInfo_Property.creatable = false
  1016. controller.refreshSecondToolbarItemsState()
  1017. }
  1018. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_CustomPage_Identifier {
  1019. pageEditViewController?.thumbnailChoosePageStyle = .custom
  1020. toolbarManager.page_pageInfo_Property.text = nil
  1021. if(toolbarManager.page_pageInfo_Property.creatable == false) {
  1022. toolbarManager.page_pageInfo_Property.creatable = true
  1023. }
  1024. controller.refreshSecondToolbarItemsState()
  1025. } else if itemIdentifier == KMPDFToolbar_edit_addWatermark_Identifier {
  1026. showWatermarkController()
  1027. } else if itemIdentifier == KMPDFToolbar_edit_removeWatermark_Identifier {
  1028. removePDFWatermark()
  1029. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddWatermark_Identifier {
  1030. batchAddWatermark()
  1031. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveWatermark_Identifier {
  1032. batchRemoveWatermark()
  1033. } else if itemIdentifier == KMPDFToolbar_edit_addBG_Identifier {
  1034. showBackgroundController()
  1035. } else if itemIdentifier == KMPDFToolbar_edit_removeBG_Identifier {
  1036. removePDFBackground()
  1037. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddBG_Identifier {
  1038. batchAddBackground()
  1039. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveBG_Identifier {
  1040. batchRemoveBackground()
  1041. } else if itemIdentifier == KMPDFToolbar_edit_addHF_Identifier {
  1042. showHeaderFooterController()
  1043. } else if itemIdentifier == KMPDFToolbar_edit_removeHF_Identifier {
  1044. removePDFHeaderFooter()
  1045. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddHF_Identifier {
  1046. batchAddHeaderFooter()
  1047. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveHF_Identifier {
  1048. batchRemoveHeaderFooter()
  1049. } else if itemIdentifier == KMPDFToolbar_edit_addBates_Identifier {
  1050. showBatesController()
  1051. } else if itemIdentifier == KMPDFToolbar_edit_removeBates_Identifier {
  1052. removePDFBates()
  1053. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddBates_Identifier {
  1054. batchAddBates()
  1055. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveBates_Identifier {
  1056. batchRemoveBates()
  1057. } else if(itemIdentifier == KMPDFToolbar_undo_Identifier) {
  1058. listView.undoManager?.undo()
  1059. } else if(itemIdentifier == KMPDFToolbar_redo_Identifier) {
  1060. listView.undoManager?.redo()
  1061. } else {
  1062. print("click else")
  1063. }
  1064. refreshToolbarView()
  1065. }
  1066. func kmPDFToolbarControllerDidSelectTextDidBeginEditing(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  1067. }
  1068. func kmPDFToolbarControllerDidSelectTextDidChange(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  1069. }
  1070. func kmPDFToolbarControllerDidSelectTextDidEndEditing(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  1071. if view.properties == toolbarManager.page_pageInfo_Property {
  1072. if viewManager.isPageEditMode == true {
  1073. let fileAttribute = KMNFileAttribute()
  1074. fileAttribute.password = listView.document?.password ?? ""
  1075. fileAttribute.pdfDocument = listView.document
  1076. fileAttribute.filePath = listView.document?.documentURL.path ?? ""
  1077. fileAttribute.bAllPage = false
  1078. fileAttribute.pagesType = .PagesString
  1079. fileAttribute.pagesString = view.properties.text ?? ""
  1080. let fetchSelectPages = fileAttribute.fetchSelectPages()
  1081. if (fetchSelectPages.isEmpty) {
  1082. let alert = NSAlert()
  1083. alert.alertStyle = .critical
  1084. alert.messageText = String(format: "%@ %@", fileAttribute.filePath.lastPathComponent, KMLocalizedString("Invalid page range or the page number is out of range. Please try again."))
  1085. alert.runModal()
  1086. toolbarManager.page_pageInfo_Property.text = ""
  1087. controller.refreshSecondToolbarItemsState()
  1088. } else {
  1089. var tIndexPaths: Set<IndexPath> = []
  1090. for i in 0 ..< fetchSelectPages.count {
  1091. tIndexPaths.insert(IndexPath(item: (fetchSelectPages[i] - 1), section: 0))
  1092. }
  1093. pageEditViewController?.selectionIndexPaths = tIndexPaths
  1094. }
  1095. }
  1096. }
  1097. }
  1098. func kmPDFToolbarControllerDidExitPageEditMode(_ controller: KMPDFToolbarController) {
  1099. exitPageEditMode()
  1100. }
  1101. }
  1102. //MARK: - KMNDisplayViewControllerDelegate代理
  1103. extension KMMainViewController: KMNDisplayViewControllerDelegate {
  1104. //Display Mode
  1105. func displayViewControllerDidDisplayModeChanged(_ controller: KMNDisplayViewController) {
  1106. listView.layoutDocumentView()
  1107. }
  1108. //阅读模式
  1109. func displayViewControllerDidReadModeUpdated(_ controller: KMNDisplayViewController) {
  1110. if viewManager.isPDFReadMode {
  1111. openPDFReadMode()
  1112. } else {
  1113. exitPDFReadMode()
  1114. }
  1115. }
  1116. //PPT
  1117. func displayViewControllerDidGotoSlideShow(_ controller: KMNDisplayViewController) {
  1118. togglePresentation(nil)
  1119. }
  1120. //SplitView
  1121. func displayViewControllerDidSplitModeChanged(_ controller: KMNDisplayViewController) {
  1122. reloadPDFSplitInfo()
  1123. }
  1124. func displayViewControllerDidSplitFileChanged(_ controller: KMNDisplayViewController) {
  1125. splitPDFController?.reloadData()
  1126. }
  1127. func displayViewControllerDidToolbarStateChanged(_ controller: KMNDisplayViewController) {
  1128. splitPDFController?.refreshToolbarState()
  1129. reloadPDFBottomToolbar()
  1130. }
  1131. }
  1132. //MARK: - PPT
  1133. extension KMMainViewController: KMInteractionProviderProtocol {
  1134. func providerContentView(fullScreenWindow: NSWindow, inset: CGFloat) -> NSView? {
  1135. if(interactionMode == .presentation) {
  1136. if listView.presentationDrawView == nil {
  1137. listView.createPresentationDraw()
  1138. }
  1139. presentationTopViewController = KMPresentationTopViewController.init(nibName: "KMPresentationTopViewController", bundle: nil)
  1140. presentationTopViewController?.pdfView = listView
  1141. presentationTopViewController?.delegate = self
  1142. presentationTopViewController?.isSelectionPre = true
  1143. listView.isPresentationMode = true
  1144. presentationTopViewController?.view.frame = CGRect(x: 0, y: (fullScreenWindow.contentView?.bounds.height ?? 0) - 42, width: fullScreenWindow.contentView?.bounds.width ?? 0, height: 42)
  1145. if((presentationTopViewController) != nil) {
  1146. fullScreenWindow.contentView?.addSubview(presentationTopViewController!.view)
  1147. }
  1148. } else {
  1149. listView.frame = NSInsetRect(fullScreenWindow.contentView?.bounds ?? .zero, 0, 0)
  1150. }
  1151. fullScreenWindow.contentView?.addSubview(listView)
  1152. if(interactionMode == .presentation) {
  1153. let frame = fullScreenWindow.frame
  1154. listView.frame = CGRectMake(0, 0, frame.size.width, frame.size.height-42)
  1155. listView.autoresizingMask = [.width, .maxYMargin]
  1156. }
  1157. return view
  1158. }
  1159. @objc func willEnterInteractionModeNotification(_ sender: Notification) {
  1160. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1161. return
  1162. }
  1163. let interactionMode = sender.userInfo?[NSWindow.UserInfo.interactionModeKey] as? KMInteractionMode
  1164. if interactionMode == .presentation {
  1165. let backgroundColor = NSColor.black
  1166. let level = UserDefaults.standard.bool(forKey: "SKUseNormalLevelForPresentationKey") ? NSWindow.Level.normal : NSWindow.Level.popUpMenu
  1167. let wasInteractionMode = self.interactionMode
  1168. if wasInteractionMode == .normal {
  1169. self.savedNormalSetup.setDictionary(self.currentPDFSettings() as! [AnyHashable : Any])
  1170. }
  1171. if wasInteractionMode == .legacyFullScreen {
  1172. self.enterPresentationMode()
  1173. self.listView.frame = (self.view.window?.contentView?.bounds)!
  1174. self.view.window?.contentView?.addSubview(listView)
  1175. // self.view.window?.backgroundColor = backgroundColor
  1176. self.view.window?.level = level
  1177. self.listView.layoutDocumentView()
  1178. self.listView.requiresDisplay()
  1179. self.forceSubwindowsOnTop(false)
  1180. }
  1181. } else {
  1182. KMPrint("2")
  1183. }
  1184. }
  1185. @objc func didEnterInteractionModeNotification(_ sender: Notification) {
  1186. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1187. return
  1188. }
  1189. if self.interactionMode == .presentation {
  1190. self.listView.layoutDocumentView()
  1191. self.listView.requiresDisplay()
  1192. }
  1193. }
  1194. @objc func willShowFullScreenNotification(_ sender: Notification) {
  1195. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1196. return
  1197. }
  1198. if self.interactionMode == .presentation {
  1199. let view = self.view.window?.firstResponder as? NSView
  1200. if let data = view?.isDescendant(of: self.pdfSplitView), data {
  1201. self.view.window?.makeFirstResponder(nil)
  1202. }
  1203. }
  1204. }
  1205. @objc func didShowFullScreenNotification(_ sender: Notification) {
  1206. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1207. return
  1208. }
  1209. if self.interactionMode == .presentation {
  1210. self.enterPresentationMode()
  1211. }
  1212. }
  1213. }
  1214. // MARK: -KMPresentationTopViewControllerDelegate (幻灯片)
  1215. extension KMMainViewController: KMPresentationTopViewControllerDelegate {
  1216. func presentationTopViewExit(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1217. self.exitFullScreen()
  1218. }
  1219. func presentationTopViewClear(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1220. listView.presentationDrawView?.clear()
  1221. }
  1222. func presentationTopViewUndo(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1223. let presentationDrawView = listView.presentationDrawView
  1224. if presentationDrawView?.canUndo() == true {
  1225. presentationDrawView?.undo()
  1226. }
  1227. }
  1228. func presentationTopViewType(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton, isSeletion: Bool) {
  1229. listView.isPresentationMode = isSeletion
  1230. if listView.isEnterPresentationDrawMode() == true {
  1231. listView.exitPresentationDrawMode()
  1232. }
  1233. }
  1234. func presentationTopViewDrawColor(_ presentationTopViewController: KMPresentationTopViewController, withView: NSView,color:NSColor?) {
  1235. if color == nil{
  1236. listView.exitPresentationDrawMode()
  1237. } else {
  1238. if listView.isEnterPresentationDrawMode() == false {
  1239. listView.enterPresentationDrawMode()
  1240. }
  1241. listView.changePresentationDrawModelColor(color)
  1242. }
  1243. }
  1244. }
  1245. //MARK: - KMSplitPDFViewControllerDelegate SplitPDFView分屏视图
  1246. extension KMMainViewController: KMSplitPDFViewControllerDelegate {
  1247. func splitPDFViewControllerDidUpdateFilePath(_ controller: KMSplitPDFViewController) {
  1248. displaySettingController?.reloadData()
  1249. }
  1250. func splitPDFViewControllerDidUpdatePDFScale(_ controller: KMSplitPDFViewController) {
  1251. if let scaleFactor = controller.pdfView?.scaleFactor {
  1252. listView.scaleFactor = scaleFactor
  1253. }
  1254. }
  1255. func splitPDFViewControllerDidUpdatePDFPageIndex(_ controller: KMSplitPDFViewController) {
  1256. if let pageIndex = controller.pdfView?.currentPageIndex {
  1257. listView.go(toPageIndex: pageIndex, animated: false)
  1258. }
  1259. }
  1260. }
  1261. //MARK: - Edit相关代理
  1262. extension KMMainViewController: KMEditToolbarViewDelegate {
  1263. func kmEditToolbarViewDidUpdateMode(_ view: KMEditToolbarView) {
  1264. if view.editType == .watermark {
  1265. watermarkViewController?.editSubType = editToolbarView?.editSubType ?? .template
  1266. watermarkViewController?.reloadData()
  1267. } else if view.editType == .background {
  1268. backgroundViewController?.editSubType = editToolbarView?.editSubType ?? .template
  1269. backgroundViewController?.reloadData()
  1270. }
  1271. }
  1272. func kmEditToolbarViewDidChooseBatch(_ view: KMEditToolbarView) {
  1273. }
  1274. func kmEditToolbarViewDidChooseApply(_ view: KMEditToolbarView) {
  1275. if view.editType == .watermark {
  1276. if let model = watermarkViewController?.currentWatermarkData {
  1277. let pageIndex = view.getSelectedPageIndex(listView.document)
  1278. if pageIndex.isEmpty {
  1279. let alert = NSAlert()
  1280. alert.alertStyle = .critical
  1281. alert.messageText = KMLocalizedString("Invalid page range or the page number is out of range. Please try again.")
  1282. alert.runModal()
  1283. return
  1284. }
  1285. let pageString = view.getSelectedPageString(listView.document, pageIndex)
  1286. let watermark = KMPDFWatermarkData.returnWaterMarkWith(model, listView.document)
  1287. watermark.pageString = pageString
  1288. listView.document.addWatermark(watermark)
  1289. listView.layoutDocumentView()
  1290. exitWatermarkController()
  1291. }
  1292. } else if view.editType == .background {
  1293. exitWatermarkController()
  1294. }
  1295. }
  1296. func kmEditToolbarViewDidChooseExit(_ view: KMEditToolbarView) {
  1297. if view.editType == .watermark {
  1298. if view.applyEnable {
  1299. let alert = NSAlert()
  1300. alert.messageText = NSLocalizedString("There are unapplied watermark settings, do you want to apply them?", comment: "")
  1301. alert.informativeText = NSLocalizedString("If not, the changes will be lost.", comment: "")
  1302. alert.addButton(withTitle: NSLocalizedString("Apply", comment: ""))
  1303. alert.addButton(withTitle: NSLocalizedString("Don't Apply", comment: ""))
  1304. alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  1305. let result = alert.runModal()
  1306. if (result == .alertFirstButtonReturn) {
  1307. self.kmEditToolbarViewDidChooseApply(view)
  1308. } else if (result == .alertSecondButtonReturn) {
  1309. //"Don't Apply"
  1310. exitWatermarkController()
  1311. } else if (result == .alertThirdButtonReturn) {
  1312. //Cancel
  1313. }
  1314. } else {
  1315. exitWatermarkController()
  1316. }
  1317. } else if view.editType == .background {
  1318. exitBackgroundController()
  1319. } else if view.editType == .header_Footer {
  1320. exitHeaderFooterController()
  1321. } else if view.editType == .bates {
  1322. exitBatesController()
  1323. }
  1324. }
  1325. }
  1326. //MARK: - KMWatermarkControllerDelegate 水印相关代理
  1327. extension KMMainViewController: KMWatermarkControllerDelegate {
  1328. func kmWatermarkControllerDidUpdateMode(_ view: KMWatermarkController) {
  1329. editToolbarView?.editSubType = view.editSubType
  1330. }
  1331. func kmWatermarkControllerDidWatermarkUpdated(_ view: KMWatermarkController) {
  1332. var applyEnable = true
  1333. if let model = view.currentWatermarkData {
  1334. if model.watermarkType == .text {
  1335. if model.text == nil || model.text?.count == 0 {
  1336. applyEnable = false
  1337. }
  1338. } else if model.watermarkType == .image {
  1339. if model.imagePath == nil {
  1340. applyEnable = false
  1341. }
  1342. }
  1343. } else {
  1344. applyEnable = false
  1345. }
  1346. editToolbarView?.applyEnable = applyEnable
  1347. editToolbarView?.reloadData()
  1348. }
  1349. }
  1350. //MARK: - KMBackgroundControllerDelegate 背景代理
  1351. extension KMMainViewController: KMBackgroundControllerDelegate {
  1352. func kmBackgroundControllerDidUpdateMode(_ view: KMBackgroundController) {
  1353. editToolbarView?.editSubType = view.editSubType
  1354. }
  1355. }
  1356. //MARK: - CPDFViewDelegate PDFView代理
  1357. extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
  1358. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  1359. sideBarController?.reloadPageTurnerData()
  1360. documentLoadComplete()
  1361. }
  1362. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  1363. sideBarController?.reloadPageTurnerData()
  1364. var indexpaths: Set<IndexPath> = []
  1365. indexpaths.insert(IndexPath(item: listView.currentPageIndex, section: 0))
  1366. botaViewController?.thumnailViewController?.selectionIndexPaths = indexpaths
  1367. //分屏视图
  1368. reloadPDFBottomToolbar()
  1369. if viewManager.splitSyncScroll {
  1370. if splitPDFController?.inPDFFirst == false && splitPDFController?.outPDFFirst == false {
  1371. splitPDFController?.outPDFFirst = true
  1372. if let splitPDFView = splitPDFController?.pdfView, let document = splitPDFView.document {
  1373. var index = pdfView.currentPageIndex
  1374. if index > document.pageCount {
  1375. index = Int(splitPDFView.document.pageCount - 1)
  1376. }
  1377. splitPDFView.go(toPageIndex: index, animated: false)
  1378. }
  1379. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1380. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1381. } else if splitPDFController?.outPDFFirst == true {
  1382. if let splitPDFView = splitPDFController?.pdfView, let document = splitPDFView.document {
  1383. var index = pdfView.currentPageIndex
  1384. if index > document.pageCount {
  1385. index = Int(splitPDFView.document.pageCount - 1)
  1386. }
  1387. splitPDFView.go(toPageIndex: index, animated: false)
  1388. }
  1389. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1390. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1391. }
  1392. }
  1393. //水印
  1394. updateWatermarkDocument()
  1395. //
  1396. }
  1397. func pdfViewScaleDidChanged(_ pdfView: CPDFView!) {
  1398. pdfToolbarController?.reloadSelectZoomView()
  1399. reloadPDFBottomToolbar()
  1400. //分屏视图
  1401. if viewManager.splitSyncScroll {
  1402. if splitPDFController?.inPDFFirst == false && splitPDFController?.outPDFFirst == false {
  1403. splitPDFController?.outPDFFirst = true
  1404. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1405. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1406. } else if splitPDFController?.outPDFFirst == true {
  1407. if let splitPDFView = splitPDFController?.pdfView {
  1408. splitPDFView.scaleFactor = pdfView.scaleFactor
  1409. }
  1410. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1411. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1412. }
  1413. }
  1414. }
  1415. func pdfViewDidClick(onLink pdfView: CPDFView!, withURL url: String!) {
  1416. if let urlString = url, urlString == kKMPurchaseProductURLString {
  1417. //跳转订阅比较表
  1418. let _ = KMComparativeTableViewController.show(window: NSApp.mainWindow ?? NSWindow())
  1419. return
  1420. }
  1421. if url.hasPrefix("smb://") {
  1422. NSWorkspace.shared.openFile(url)
  1423. } else {
  1424. KMTools.openURL(urlString: url)
  1425. }
  1426. }
  1427. func pdfViewPerformURL(_ pdfView: CPDFView!, withContent content: String!) {
  1428. KMPrint("pdfViewPerformURL")
  1429. if content != nil {
  1430. NSWorkspace.shared.open(URL(string: content)!)
  1431. } else {
  1432. let alert = NSAlert()
  1433. alert.alertStyle = .critical
  1434. alert.informativeText = NSLocalizedString("The hyperlink is invalid.", comment: "")
  1435. alert.messageText = ""
  1436. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  1437. alert.runModal()
  1438. return
  1439. }
  1440. }
  1441. func pdfViewPerformPrint(_ pdfView: CPDFView!) {
  1442. KMPrint("pdfViewPerformPrint")
  1443. self.showPrintWindow()
  1444. }
  1445. func pdfViewPerformGo(toPage pdfView: CPDFView!) {
  1446. KMPrint("pdfViewPerformGo")
  1447. }
  1448. func pdfViewOpenPDF(_ pdfView: CPDFView!, forRemoteGoTo action: CPDFAction!) {
  1449. KMPrint("pdfViewOpenPDF")
  1450. }
  1451. func pdfViewPerformReset(_ pdfView: CPDFView!) {
  1452. KMPrint("pdfViewPerformReset")
  1453. pdfView.document?.resetForm()
  1454. }
  1455. func pdfViewEditingBlockDidChanged(_ pdfView: CPDFView!) {
  1456. KMPrint("pdfViewEditingBlockDidChanged")
  1457. }
  1458. func pdfViewAsBookBookmark() -> NSImage! {
  1459. return NSImage(named: "KMImageNameBookmarkIcon")!
  1460. }
  1461. func pdfViewEditingSelectionDidChanged(_ pdfView: CPDFView!) {
  1462. self.editPDFHanddler.pdfViewEditingSelectionDidChanged(pdfView)
  1463. }
  1464. func pdfViewEditingAreaDidChanged(_ pdfView: CPDFView!) {
  1465. self.editPDFHanddler.pdfViewEditingAreaDidChanged(pdfView)
  1466. }
  1467. func pdfViewEditingCropBoundsDidChanged(_ pdfView: CPDFView!, editing editArea: CPDFEditArea!) {
  1468. self.editPDFHanddler.pdfViewEditingCropBoundsDidChanged(pdfView, editing: editArea)
  1469. }
  1470. //编辑PDF 创建图片区域回调
  1471. func pdfViewEditingAddImageArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1472. self.editPDFHanddler.pdfViewEditingAddImageArea(pdfView, add: page, add: rect)
  1473. }
  1474. func pdfViewEditingAddTextArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1475. self.editPDFHanddler.pdfViewEditingAddTextArea(pdfView, add: page, add: rect)
  1476. }
  1477. func pdfViewMobileEditingBegan(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1478. self.editPDFHanddler.pdfViewMobileEditingBegan(point, for: pdfView, forEditing: editingAreas)
  1479. }
  1480. func pdfViewMobileEditingMove(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1481. self.editPDFHanddler.pdfViewMobileEditingMove(point, for: pdfView, forEditing: editingAreas)
  1482. }
  1483. func pdfViewMobileEditingEnd(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1484. self.editPDFHanddler.pdfViewMobileEditingEnd(point, for: pdfView, forEditing: editingAreas)
  1485. }
  1486. func pdfViewEditingSelectCharDidChanged(_ pdfView: CPDFView!) {
  1487. self.editPDFHanddler.pdfViewEditingSelectCharDidChanged(pdfView)
  1488. }
  1489. func pdfViewEditingExitCropMode(_ pdfView: CPDFView!, forEditing editingArea: CPDFEditImageArea!) {
  1490. self.editPDFHanddler.pdfViewEditingExitCropMode(pdfView, forEditing: editingArea)
  1491. }
  1492. func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
  1493. let command = theEvent.modifierFlags.contains(.command)
  1494. let control = theEvent.modifierFlags.contains(.control)
  1495. KMPrint(theEvent.keyCode)
  1496. if self.listView.isEditing() == true {
  1497. if control && theEvent.keyCode == 11 { // ctr + b
  1498. self.editPDFHanddler.fontBoldAction()
  1499. return false
  1500. } else if control && theEvent.keyCode == 34 { // ctr +i
  1501. self.editPDFHanddler.fontItalicAction()
  1502. return false
  1503. } else if theEvent.keyCode == 36 { // enter
  1504. if self.listView.isCropMode {
  1505. self.editPDFHanddler.cropComfirmAction()
  1506. return false
  1507. }
  1508. }
  1509. }
  1510. if (theEvent.keyCode == 11 && command) { // command + B [添加书签]
  1511. self.menuItemBookMarkClick_add(sender: NSMenuItem())
  1512. return false
  1513. } else if (command && control && theEvent.keyCode == 14) { // command + control + E [注释 橡皮擦]
  1514. return false
  1515. } else if (theEvent.keyCode == 123) { // 向左
  1516. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1517. return false
  1518. } else {
  1519. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToPreviousPage()) {
  1520. self.listView.goToPreviousPage(nil)
  1521. return false
  1522. }
  1523. }
  1524. } else if (theEvent.keyCode == 126) { // 向上
  1525. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1526. return false
  1527. } else {
  1528. if (self.listView.isContinousScroll()) {
  1529. return true
  1530. }
  1531. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToPreviousPage()) {
  1532. self.listView.goToPreviousPage(nil)
  1533. return false
  1534. }
  1535. }
  1536. } else if (theEvent.keyCode == 124) { // 向右
  1537. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1538. return false
  1539. } else {
  1540. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToNextPage()) {
  1541. self.listView.goToNextPage(nil)
  1542. return false
  1543. }
  1544. }
  1545. } else if (theEvent.keyCode == 125) { // 向下
  1546. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1547. return false
  1548. } else {
  1549. if (self.listView.isContinousScroll()) {
  1550. return true
  1551. }
  1552. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToNextPage()) {
  1553. self.listView.goToNextPage(nil)
  1554. return false
  1555. }
  1556. }
  1557. } else if (theEvent.keyCode == 36) {
  1558. if self.listView.annotationType == .addImage || self.listView.annotationType == .addText {
  1559. if self.listView.isEditImage {
  1560. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  1561. }
  1562. }
  1563. }
  1564. if theEvent.keyCode == 53 {
  1565. //ESC
  1566. // self.exitFullScreen()
  1567. if viewManager.isPDFReadMode {
  1568. self.exitPDFReadMode()
  1569. }
  1570. self.leftSideViewCancelSelect()
  1571. }
  1572. return true
  1573. }
  1574. func pdfListViewMenuValidate(_ pdfListView: CPDFListView!, menuItem: NSMenuItem!, isTakesEffect: UnsafeMutablePointer<ObjCBool>!) -> Bool {
  1575. guard let action = menuItem.action else {
  1576. isTakesEffect.pointee = false
  1577. return false
  1578. }
  1579. if (KMSystemMenu.isEditSelector(sel: action)) {
  1580. if (KMSystemMenu.Edit.deleteSelector == action) {
  1581. isTakesEffect.pointee = true
  1582. return self.listView.activeAnnotations.count > 0
  1583. } else if (KMSystemMenu.Edit.copySelector == action) {
  1584. isTakesEffect.pointee = true
  1585. return true//self.listView.canCopy()
  1586. } else if (KMSystemMenu.Edit.cutSelector == action) {
  1587. isTakesEffect.pointee = true
  1588. return self.listView.canCopy()
  1589. } else if (KMSystemMenu.Edit.pasteSelector == action) {
  1590. isTakesEffect.pointee = true
  1591. return self.listView.canPaste()
  1592. }
  1593. }
  1594. isTakesEffect.pointee = false
  1595. return false
  1596. }
  1597. func pdfViewEditingOperationDidChanged(_ pdfView: CPDFView!) {
  1598. self.editPDFHanddler.pdfViewEditingOperationDidChanged(pdfView)
  1599. }
  1600. func pdfViewEditingDoubleClick(_ pdfView: CPDFView!, imageArea editArea: CPDFEditArea!) {
  1601. self.editPDFHanddler.pdfViewEditingDoubleClick(pdfView, imageArea: editArea)
  1602. }
  1603. //MARK: - CPDFListViewDelegate
  1604. func cPDFListView(_ pdfListView: CPDFListView, didDelete annotation: CPDFAnnotation, in pdfPage: CPDFPage) {
  1605. self.leftSideViewController.updateThumbnail(at: Int(pdfPage.pageIndex()))
  1606. }
  1607. func pdfListViewChangeatioActiveAnnotations(_ pdfListView: CPDFListView!, forActiveAnnotations annotations: [CPDFAnnotation]!, isRightMenu: Bool) {
  1608. self.view.window?.makeFirstResponder(self.listView)
  1609. if isRightMenu {
  1610. } else if annotations.count > 0 {
  1611. if annotations.count > 1 {
  1612. let fristAnnotation = annotations.first
  1613. var isSameAnnotation = true
  1614. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1615. for annotation in annotations {
  1616. let cunrrentClassName = NSStringFromClass(annotation.classForCoder)
  1617. if (className == "CPDFSquareAnnotation") ||
  1618. (className == "CPDFCircleAnnotation") ||
  1619. (className == "CPDFLineAnnotation") {
  1620. if (cunrrentClassName != "CPDFSquareAnnotation") &&
  1621. (cunrrentClassName != "CPDFCircleAnnotation") &&
  1622. (cunrrentClassName != "CPDFLineAnnotation") {
  1623. isSameAnnotation = false
  1624. }
  1625. } else {
  1626. if className != cunrrentClassName {
  1627. isSameAnnotation = false
  1628. }
  1629. }
  1630. }
  1631. if isSameAnnotation == false {
  1632. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1633. } else {
  1634. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1635. self.openRightPane()
  1636. }
  1637. } else {
  1638. let fristAnnotation = annotations.first
  1639. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1640. if self.viewManager.isPDFReadMode {
  1641. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1642. self.closeRightPane()
  1643. } else {
  1644. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1645. if className != "CPDFStampAnnotation" &&
  1646. className != "CPDFSignatureAnnotation" &&
  1647. className != "CPDFListStampAnnotation" {
  1648. self.openRightPane()
  1649. }
  1650. }
  1651. }
  1652. if (listView.activeAnnotation.isKind(of: CPDFLineAnnotation.self)) {
  1653. if (!(listView.activeAnnotation as! CPDFLineAnnotation).isMeasure) {
  1654. cancelMeasureType()
  1655. } else {
  1656. if distanceMeasureInfoWindowController == nil {
  1657. let measureInfo = CPDFDistanceMeasureInfo()
  1658. distanceMeasureInfoWindowController = CDistanceMeasureInfoWindowController()
  1659. distanceMeasureInfoWindowController?.measureInfo = measureInfo
  1660. distanceMeasureInfoWindowController?.delegate = self
  1661. }
  1662. }
  1663. } else if (!listView.activeAnnotation.isKind(of: CPDFPolygonAnnotation.self) && !listView.activeAnnotation.isKind(of: CPDFPolylineAnnotation.self)) {
  1664. cancelMeasureType()
  1665. } else if (listView.activeAnnotation.isKind(of: CPDFPolygonAnnotation.self) || listView.activeAnnotation.isKind(of: CPDFPolylineAnnotation.self)) {
  1666. if perimeterMeasureInfoWindowController == nil {
  1667. let measureInfo = CPDFPerimeterMeasureInfo()
  1668. perimeterMeasureInfoWindowController = CPerimeterMeasureInfoWindowController()
  1669. perimeterMeasureInfoWindowController?.measureInfo = measureInfo
  1670. perimeterMeasureInfoWindowController?.delegate = self
  1671. }
  1672. if areaMeasureInfoWindowController == nil {
  1673. let measureInfo = CPDFAreaMeasureInfo()
  1674. areaMeasureInfoWindowController = CAreaMeasureInfoWindowController()
  1675. areaMeasureInfoWindowController?.measureInfo = measureInfo
  1676. areaMeasureInfoWindowController?.delegate = self
  1677. }
  1678. }
  1679. } else if (annotations.count == 0){
  1680. if pdfListView.annotationType == .unkown {
  1681. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1682. self.closeRightPane()
  1683. } else {
  1684. if self.viewManager.isPDFReadMode {
  1685. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1686. self.closeRightPane()
  1687. } else {
  1688. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1689. self.openRightPane()
  1690. }
  1691. }
  1692. }
  1693. }
  1694. func pdfListViewChangedAnnotationType(_ pdfListView: CPDFListView!, for annotationType: CAnnotationType) {
  1695. if(annotationType == .unkown) {
  1696. self.rightSideViewController.isHidden = true
  1697. self.closeRightPane()
  1698. }
  1699. let aType = annotationType
  1700. if aType.isMarkup() || aType == .anchored || aType == .freeText || aType.isSquare() || aType == .link {
  1701. KMDataManager.ud_set(annotationType.rawValue, forKey: SKLastAnnotationModeKey)
  1702. }
  1703. }
  1704. ///开始定位链接注释
  1705. func pdfListViewLinkDestinationStart(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1706. }
  1707. ///刷新链接注释
  1708. func pdfListViewLinkDestinationEnd(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1709. }
  1710. func pdfListViewMenuItemsEditing(at point: CGPoint, for page: CPDFPage!, menuItems: [NSMenuItem]!) -> [NSMenuItem]! {
  1711. if (listView.toolMode != CToolMode.editPDFToolMode) {
  1712. return menuItems
  1713. }
  1714. var tMenuItems = menuItems;
  1715. if(listView.isSelectEditCharRange() ||
  1716. listView.isSelecteditArea(with: point)) {
  1717. tMenuItems?.append(NSMenuItem.separator())
  1718. }
  1719. let areas = self.listView.editingAreas() ?? []
  1720. if areas.count == 1 {
  1721. let fristAreas = areas.first
  1722. if fristAreas is CPDFEditImageArea {
  1723. self.listView.selectImageAreas = fristAreas as? CPDFEditImageArea
  1724. if self.listView.isEditImage {
  1725. tMenuItems?.removeAll()
  1726. tMenuItems?.append(self.corpImageMenuItem())
  1727. tMenuItems?.append(self.cancelCorpImageMenuItem())
  1728. tMenuItems?.append(self.restoreCorpImageMenuItem())
  1729. } else {
  1730. tMenuItems?.append(NSMenuItem.separator())
  1731. tMenuItems?.append(self.cutImageArea())
  1732. tMenuItems?.append(self.replaceImageArea())
  1733. tMenuItems?.append(self.exportImageArea())
  1734. }
  1735. } else {
  1736. if tMenuItems?.count != 1 {
  1737. tMenuItems?.swapAt(0, 1)
  1738. }
  1739. }
  1740. } else if areas.count == 0 {
  1741. tMenuItems?.append(NSMenuItem.separator())
  1742. tMenuItems?.append(self.addText())
  1743. tMenuItems?.append(self.addImage())
  1744. }
  1745. return tMenuItems
  1746. }
  1747. func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer<NSMenu?>!, isMoveSelectAnno: Bool) {
  1748. self.mouseRightMenuEvent = theEvent
  1749. var currentMenu : NSMenu = menu.pointee!
  1750. if let activeAnno = listView.activeAnnotation as? KMTableAnnotation {//Table
  1751. var pagePoint = NSPoint()
  1752. _ = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true)
  1753. currentMenu.removeAllItems()
  1754. let annotation = activeAnno
  1755. annotation.completeEditCellText()
  1756. if !(NSIsEmptyRect(annotation.drawRect)) {
  1757. annotation.drawLine(pagePoint)
  1758. NotificationCenter.default.post(name: NSNotification.Name.KMPDFViewTableAnnotationDidChange, object: self, userInfo: ["point": NSValue(point: pagePoint)])
  1759. }
  1760. if (annotation.rowNumber - annotation.currentCell.row - 1) < 0 {
  1761. return
  1762. }
  1763. currentMenu = tableMenu(currentMenu, withTable: listView.activeAnnotation as! KMTableAnnotation, point: pagePoint)
  1764. listView.needsDisplay = true
  1765. return
  1766. }
  1767. var pagePoint: NSPoint = .zero
  1768. if let page = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true) {
  1769. let anno = page.annotation(at: pagePoint)
  1770. let item1 = NSMenuItem(title: NSLocalizedString("Delete", comment: ""), action: #selector(menuItemActionMeasureDelete), target: self)
  1771. item1.representedObject = anno
  1772. let item2 = NSMenuItem(title: NSLocalizedString("Edit Note", comment: ""), action: #selector(menuItemActionMeasureEditNote), target: self)
  1773. item2.representedObject = anno
  1774. let item3 = NSMenuItem(title: NSLocalizedString("Settings", comment: ""), action: #selector(menuItemActionMeasureSetting), target: self)
  1775. item3.representedObject = anno
  1776. if let data = anno as? CPDFPolygonAnnotation { // 多变形
  1777. currentMenu.removeAllItems()
  1778. currentMenu.insertItem(item1, at: 0)
  1779. currentMenu.insertItem(item2, at: 1)
  1780. currentMenu.insertItem(item3, at: 2)
  1781. return
  1782. }
  1783. if let data = anno as? CPDFPolylineAnnotation {
  1784. currentMenu.removeAllItems()
  1785. currentMenu.insertItem(item1, at: 0)
  1786. currentMenu.insertItem(item2, at: 1)
  1787. currentMenu.insertItem(item3, at: 2)
  1788. return
  1789. }
  1790. if let data = anno as? CPDFLineAnnotation, data.isMeasure {
  1791. currentMenu.removeAllItems()
  1792. currentMenu.insertItem(item1, at: 0)
  1793. currentMenu.insertItem(item2, at: 1)
  1794. currentMenu.insertItem(item3, at: 2)
  1795. return
  1796. }
  1797. }
  1798. if (listView.toolMode == .selectToolMode){
  1799. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1800. currentMenu.insertItem(self.printingMenu(), at: 3)
  1801. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1802. currentMenu.insertItem(self.setCropStype(), at: 3)
  1803. currentMenu.insertItem(self.setSnapshotStype(), at: 3)
  1804. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1805. export.submenu = self.exportMenu()
  1806. currentMenu.insertItem(export, at: 3)
  1807. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1808. if listView.activeAnnotation == nil{
  1809. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1810. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1811. }
  1812. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1813. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1814. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1815. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1816. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1817. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1818. return
  1819. }
  1820. if (listView.toolMode == .moveToolMode || listView.toolMode == .magnifyToolMode){
  1821. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1822. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1823. currentMenu.insertItem(self.setCropStype(), at: 0)
  1824. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1825. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1826. currentMenu.insertItem(self.addOutlineStype(), at: 0)
  1827. currentMenu.insertItem(self.addBookmarkMenu(), at: 0)
  1828. if listView.activeAnnotation == nil{
  1829. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1830. currentMenu.insertItem(self.setAnnotationToolStype(), at: 0)
  1831. }
  1832. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1833. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1834. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1835. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1836. return
  1837. }
  1838. if currentMenu.items.count > 3 {
  1839. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1840. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1841. }
  1842. if listView.currentSelection != nil && listView.activeAnnotations.count < 1{
  1843. if listView.currentSelection.selectionType() == .text {
  1844. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1845. currentMenu.insertItem(self.setSearchBaiduStype(), at: 3)
  1846. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1847. currentMenu.insertItem(self.setLookUpStype(), at: 3)
  1848. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1849. currentMenu.insertItem(self.addOutlineStype(), at: 3)
  1850. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1851. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1852. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1853. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1854. currentMenu.insertItem(self.setShareStype(), at: 3)
  1855. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1856. }
  1857. currentMenu.insertItem(self.enterAnnotationStype(), at: 3)
  1858. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1859. if listView.currentSelection.selectionType() == .image{
  1860. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1861. currentMenu.insertItem(self.addOutlineStype(), at: 6)
  1862. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1863. currentMenu.insertItem(self.setAnnotationToolStype(), at: 6)
  1864. }
  1865. if listView.currentSelection.selectionType() == .text {
  1866. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1867. currentMenu.insertItem(self.setTranslateStype(), at: currentMenu.items.count)
  1868. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1869. }
  1870. }
  1871. if listView.activeAnnotation != nil || isMoveSelectAnno {
  1872. if let data = self.listView.activeAnnotation?.type?.lowercased(), data == "stamp"{
  1873. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1874. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1875. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1876. }else{
  1877. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1878. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1879. if let anno = self.listView.activeAnnotation, anno.isKind(of: CPDFStampAnnotation.self) {
  1880. } else {
  1881. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1882. currentMenu.insertItem(self.setShareStype(), at: currentMenu.items.count - 15)
  1883. }
  1884. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1885. }
  1886. }
  1887. if listView.activeAnnotation == nil && listView.currentSelection == nil{
  1888. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1889. if(listView.toolMode == .selectToolMode) {
  1890. if NSIsEmptyRect(listView.currentSelectionRect()) {
  1891. currentMenu.insertItem(self.zoomSelectionMenuItem(), at: 0)
  1892. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1893. }
  1894. currentMenu.insertItem(self.printingMenu(), at: 0)
  1895. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1896. currentMenu.insertItem(self.setCropStype(), at: 0)
  1897. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1898. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1899. export.submenu = self.exportMenu()
  1900. currentMenu.insertItem(export, at: currentMenu.items.count)
  1901. }else{
  1902. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1903. currentMenu.insertItem(self.setTTSStype(), at: 2)
  1904. currentMenu.insertItem(self.setCropStype(), at: 2)
  1905. currentMenu.insertItem(self.setSnapshotStype(), at: 2)
  1906. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1907. currentMenu.insertItem(self.addOutlineStype(), at: 2)
  1908. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1909. currentMenu.insertItem(self.enterAnnotationStype(), at: 2)
  1910. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1911. if(currentMenu.items.count > 4) {
  1912. currentMenu.insertItem(NSMenuItem.separator(), at: 5)
  1913. }
  1914. if(currentMenu.items.count > 5) {
  1915. currentMenu.insertItem(self.addBookmarkMenu(), at: 6)
  1916. }
  1917. currentMenu.insertItem(self.setAutoScrollStype(), at: currentMenu.items.count)
  1918. }
  1919. currentMenu.insertItem(self.setAnnotationToolStype(), at: 5)
  1920. }
  1921. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1922. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1923. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1924. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1925. for item in currentMenu.items {
  1926. if (item.action == NSSelectorFromString("menuItemClick_HidenorShowNote:")) {
  1927. // 显示与隐藏注释 item action 截取
  1928. item.action = #selector(menuItemClick_HidenorShowNote)
  1929. item.target = self
  1930. break
  1931. }
  1932. }
  1933. }
  1934. func pdfListViewAddAnnotations(_ pdfListView: CPDFListView!, forAdd annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1935. var addRedact = false
  1936. for anno in annotations {
  1937. if (anno.isKind(of: CPDFRedactAnnotation.self)) {
  1938. addRedact = true
  1939. } else if anno is CPDFSquareAnnotation || anno is CPDFCircleAnnotation {
  1940. anno.contents = pdfPage?.string(for: anno.bounds) ?? ""
  1941. }
  1942. }
  1943. self.model.hasAddRedact = addRedact
  1944. if self.listView.toolMode == .moveToolMode {
  1945. self.listView.toolMode = .textToolMode
  1946. self.listView.annotationType = .unkown
  1947. }
  1948. if (self.model.rightMouseEventing) {
  1949. self.model.rightMouseEventing = false
  1950. }
  1951. self.leftSideViewController.refreshUIForAddAnnotation(annos: annotations, page: pdfPage)
  1952. }
  1953. func pdfListViewRemoveAnnotations(_ pdfListView: CPDFListView!, forRemove annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1954. self.leftSideViewController.annoList_refreshUIForDeleteAnnotations(annos: annotations, page: pdfPage)
  1955. }
  1956. func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) {
  1957. if (!self.listView.isEqual(to: pdfListView)) {
  1958. return
  1959. }
  1960. if (self.listView.toolMode != .selectToolMode) {
  1961. return
  1962. }
  1963. }
  1964. func pdfListViewKeyDowClosePanel(_ speedy: CPDFViewSidebarSpeedMode, event theEvent: NSEvent!) {
  1965. if(speedy == .right) {
  1966. self.toggleRightPane()
  1967. } else if (speedy == .left) {
  1968. self.menuItemAction_hiddenLeftSide(speedy)
  1969. }
  1970. }
  1971. func pdfListViewEventMarkupColor(with annotation: CPDFAnnotation!) -> [NSColor]! {
  1972. if (annotation.isKind(of: CPDFMarkupAnnotation.self)) {
  1973. if (annotation as! CPDFMarkupAnnotation).markupType() == .highlight {
  1974. return KMAnnotationPropertiesColorManager.manager.markHighlightColors
  1975. } else {
  1976. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1977. }
  1978. } else {
  1979. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1980. }
  1981. }
  1982. func pdfListViewHaveDocumentAttribute() -> Bool {
  1983. if(!self.listView.document.allowsCopying) {
  1984. self.removeOwnerPassword()
  1985. return false
  1986. }
  1987. return true
  1988. }
  1989. func pdfListView(_ sender: CPDFListView!, showSnapshotAtPageNumber pageNum: Int, for rect: NSRect, scaleFactor: CGFloat, autoFits: Bool) {
  1990. let swc = KMSnapshotWindowController(windowNibName: "SnapshotWindow")
  1991. swc.delegate = self
  1992. swc.setPdfDocument(self.listView.document, goToPageNumber: pageNum, rect: rect, scaleFactor: scaleFactor, autoFits: autoFits)
  1993. swc.forceOnTop = self.interactionMode != .normal
  1994. self.myDocument?.addWindowController(swc)
  1995. }
  1996. func pdfListView(_ pdfView: CPDFListView!, documentDataDidChanged docData: Any!, withInfo info: [AnyHashable : Any]!) {
  1997. if let data = info?[CPDFListView.outlineKey] as? Bool, data { // 大纲改变
  1998. guard let ol = docData as? CPDFOutline else {
  1999. return
  2000. }
  2001. let add = info?[CPDFListView.outlineAddKey] as? Bool ?? false
  2002. let remove = info?[CPDFListView.outlineRemoveKey] as? Bool ?? false
  2003. if add {
  2004. self.leftSideViewController.addOutlineAfter(ol)
  2005. }
  2006. if remove {
  2007. self.leftSideViewController.removeOutlineAfter(ol)
  2008. }
  2009. let demote = info?[CPDFListView.outlineDemoteKey] as? Bool ?? false
  2010. let promote = info?[CPDFListView.outlinePromoteKey] as? Bool ?? false
  2011. if demote {
  2012. self.leftSideViewController.demoteOutlineAfter(ol)
  2013. }
  2014. if promote {
  2015. self.leftSideViewController.promoteOutlineAfter(ol)
  2016. }
  2017. }
  2018. }
  2019. //TextEdit
  2020. func pdfListViewDidTextFontChanged(_ pdfListView: CPDFListView!) {
  2021. self.rightSideViewController.eidtPDFTextProperty.reloadData()
  2022. }
  2023. func pdfListViewDidTextColorChanged(_ pdfListView: CPDFListView!, with color: NSColor!) {
  2024. self.rightSideViewController.eidtPDFTextProperty.fontColorChangeAction()
  2025. }
  2026. func pdfListViewAnnotationMeasureInfoChange(_ pdfListView: CPDFListView!, with annotation: CPDFAnnotation!) {
  2027. guard let data = annotation else {
  2028. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  2029. distanceMeasureInfoWindowController?.clearData()
  2030. }
  2031. return
  2032. }
  2033. if let lineAnnotation = annotation as? CPDFLineAnnotation {
  2034. handleLineAnnotation(lineAnnotation)
  2035. } else if let polylineAnnotation = annotation as? CPDFPolylineAnnotation {
  2036. handlePolylineAnnotation(polylineAnnotation)
  2037. } else if let polygonAnnotation = annotation as? CPDFPolygonAnnotation {
  2038. handlePolygonAnnotation(polygonAnnotation)
  2039. }
  2040. }
  2041. func pdfListViewMeasureCancel(_ pdfListView: CPDFListView!) {
  2042. cancelMeasureType()
  2043. }
  2044. func tableMenu(_ menu: NSMenu, withTable table: KMTableAnnotation, point: CGPoint) -> NSMenu {
  2045. if table.currentCell.row >= 0 && table.currentCell.column >= 0 {
  2046. let itemTitles = ["Edit", "", "Add Row Above", "Add Row Below", "", "Add Column Before", "Add Column After", "", "Delete Row", "Delete Column", "Delete Table", "Cut", "Copy", "Paste", "Paste and Match Style", "Delete Cell Contents", "Clear All"]
  2047. let actions = ["formAnnotTextEdit:", "", "addRowAbove:", "addRowBelow:", "", "addColumnBefore:", "addColumnAfter:", "", "deleteRow:", "deleteColumn:", "deleteTabel", "cutCell:", "copyCell:", "pasteCell:", "pasteAndMatchStyle:", "deleteCellContents:", "clearAll:"]
  2048. for i in 0..<itemTitles.count {
  2049. var item: NSMenuItem? = nil
  2050. if itemTitles[i] == "" {
  2051. item = NSMenuItem.separator()
  2052. menu.insertItem(item!, at: i)
  2053. } else {
  2054. item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  2055. item!.target = self
  2056. item!.action = NSSelectorFromString(actions[i])
  2057. if itemTitles[i] == "Paste" /*&& !_copyCellData*/ {
  2058. item!.action = nil
  2059. } else if itemTitles[i] == "Paste and Match Style" /*&& !_copyCellData */{
  2060. item!.action = nil
  2061. } else if itemTitles[i] == "Add Row Above" {
  2062. let path1 = table.crossLines[table.rowNumber - table.currentCell.row]
  2063. let path2 = table.crossLines[table.rowNumber - table.currentCell.row - 1]
  2064. if (path1 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.round && table.headerCount() >= 5 {
  2065. item!.action = nil
  2066. } else if (path2 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.bevel && table.footerCount() >= 5 {
  2067. item!.action = nil
  2068. }
  2069. }
  2070. item!.title = NSLocalizedString(item!.title, comment: "")
  2071. item!.representedObject = NSValue(point: point)
  2072. menu.insertItem(item!, at: i)
  2073. }
  2074. }
  2075. } else {
  2076. let itemTitles = ["Cut", "Copy", "Paste", "Delete"]
  2077. let actions = ["cut:", "copy:", "paste:", "delete:"]
  2078. for i in 0..<itemTitles.count {
  2079. let item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  2080. item.target = self
  2081. item.action = NSSelectorFromString(actions[i])
  2082. item.title = NSLocalizedString(item.title, comment: "")
  2083. menu.insertItem(item, at: i)
  2084. item.representedObject = NSValue(point: point)
  2085. }
  2086. }
  2087. return menu
  2088. }
  2089. private func handleLineAnnotation(_ annotation: CPDFLineAnnotation) {
  2090. if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  2091. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  2092. distanceMeasureInfoWindowController?.showWindow(self)
  2093. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  2094. areaMeasureInfoWindowController?.hideFloatingWindow()
  2095. distanceMeasureInfoWindowController?.showWindow(self)
  2096. } else if distanceMeasureInfoWindowController?.window?.isVisible == false {
  2097. distanceMeasureInfoWindowController?.showWindow(self)
  2098. }
  2099. let measureInfo = annotation.measureInfo
  2100. let startPoint = annotation.startPoint
  2101. let endPoint = annotation.endPoint
  2102. let angle = atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x) * (180.0 / .pi)
  2103. distanceMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  2104. distanceMeasureInfoWindowController?.xLabel.stringValue = String(format: "%.0f", abs(endPoint.x - startPoint.x))
  2105. distanceMeasureInfoWindowController?.yLabel.stringValue = String(format: "%.0f", abs(endPoint.y - startPoint.y))
  2106. distanceMeasureInfoWindowController?.reloadData(with: measureInfo!)
  2107. }
  2108. private func handlePolylineAnnotation(_ annotation: CPDFPolylineAnnotation) {
  2109. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  2110. distanceMeasureInfoWindowController?.hideFloatingWindow()
  2111. perimeterMeasureInfoWindowController?.showWindow(self)
  2112. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  2113. areaMeasureInfoWindowController?.hideFloatingWindow()
  2114. perimeterMeasureInfoWindowController?.showWindow(self)
  2115. } else if perimeterMeasureInfoWindowController?.window?.isVisible == false {
  2116. perimeterMeasureInfoWindowController?.showWindow(self)
  2117. }
  2118. let measureInfo = annotation.measureInfo
  2119. let savePoints = annotation.savePoints()
  2120. var angle: CGFloat = 0
  2121. if savePoints.count >= 3 {
  2122. let count = savePoints.count
  2123. let startPoint = savePoints[count - 3].pointValue
  2124. let midPoint = savePoints[count - 2].pointValue
  2125. let endPoint = savePoints.last!.pointValue
  2126. angle = angleBetweenPoints(startPoint, midPoint, endPoint)
  2127. }
  2128. angle = 180 - angle
  2129. perimeterMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  2130. perimeterMeasureInfoWindowController?.reloadData(with: measureInfo!)
  2131. }
  2132. private func handlePolygonAnnotation(_ annotation: CPDFPolygonAnnotation) {
  2133. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  2134. distanceMeasureInfoWindowController?.hideFloatingWindow()
  2135. areaMeasureInfoWindowController?.showWindow(self)
  2136. } else if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  2137. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  2138. areaMeasureInfoWindowController?.showWindow(self)
  2139. } else if areaMeasureInfoWindowController?.window?.isVisible == false {
  2140. areaMeasureInfoWindowController?.showWindow(self)
  2141. }
  2142. let measureInfo = annotation.measureInfo
  2143. let savePoints = annotation.savePoints
  2144. var angle: CGFloat = 0
  2145. if savePoints.count >= 3 {
  2146. let count = savePoints.count
  2147. let startPoint = (savePoints[count - 3] as AnyObject).pointValue
  2148. let midPoint = (savePoints[count - 2] as AnyObject).pointValue
  2149. let endPoint = (savePoints.lastObject as AnyObject).pointValue
  2150. angle = angleBetweenPoints(startPoint!, midPoint!, endPoint!)
  2151. }
  2152. angle = 180 - angle
  2153. areaMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  2154. areaMeasureInfoWindowController?.reloadData(measureInfo!)
  2155. }
  2156. private func angleBetweenPoints(_ startPoint: CGPoint, _ midPoint: CGPoint, _ endPoint: CGPoint) -> CGFloat {
  2157. let vector1 = CGPoint(x: midPoint.x - startPoint.x, y: midPoint.y - startPoint.y)
  2158. let vector2 = CGPoint(x: endPoint.x - midPoint.x, y: endPoint.y - midPoint.y)
  2159. let dotProduct = vector1.x * vector2.x + vector1.y * vector2.y
  2160. let magnitude1 = sqrt(vector1.x * vector1.x + vector1.y * vector1.y)
  2161. let magnitude2 = sqrt(vector2.x * vector2.x + vector2.y * vector2.y)
  2162. return acos(dotProduct / (magnitude1 * magnitude2)) * (180.0 / .pi)
  2163. }
  2164. @objc func pdfUpdatedFinish() {
  2165. splitPDFController?.inPDFFirst = false
  2166. splitPDFController?.outPDFFirst = false
  2167. }
  2168. }
  2169. //MARK: - KMNThumbnailBaseViewDelegate
  2170. extension KMMainViewController: KMNThumbnailBaseViewDelegate {
  2171. func clickThumbnailViewControlle(pageEditVC:KMNThumbnailBaseViewController?,currentIndex:Int) {
  2172. exitPageEditMode()
  2173. viewManager.isPageEditMode = false
  2174. pdfToolbarController?.reloadPageEditView()
  2175. }
  2176. func insertPDFThumbnailViewControlle(pageEditVC: KMNThumbnailBaseViewController?, pdfDocment: CPDFDocument?) {
  2177. if(pdfDocment != nil) {
  2178. insertDocuments.insert(pdfDocment!)
  2179. }
  2180. }
  2181. func changeIndexPathsThumbnailViewControlle(pageEditVC: KMNThumbnailBaseViewController?, selectionIndexPaths: Set<IndexPath>, selectionStrings: String) {
  2182. toolbarManager.page_pageInfo_Property.text = selectionStrings
  2183. if(toolbarManager.page_pageInfo_Property.creatable == false) {
  2184. toolbarManager.page_pageInfo_Property.creatable = true
  2185. }
  2186. pdfToolbarController?.refreshSecondToolbarItemsState()
  2187. }
  2188. }
  2189. extension KMMainViewController: KMNLeftSideViewControllerDelegate {
  2190. func enterPageEditLeftSideViewController(leftSideViewController: KMNLeftSideViewController) {
  2191. if viewManager.isPageEditMode == false {
  2192. viewManager.isPageEditMode = true
  2193. if(pdfToolbarController != nil) {
  2194. kmPDFToolbarControllerDidToolbarItemClicked(pdfToolbarController!, KMPDFToolbar_PageEdit_Identifier)
  2195. pdfToolbarController?.reloadSecondToolbar()
  2196. }
  2197. }
  2198. }
  2199. func changeSelectePageLeftSideViewController(leftSideViewController: KMNLeftSideViewController, pageIndex: Int) {
  2200. if(listView.currentPageIndex != pageIndex) {
  2201. listView.go(toPageIndex: pageIndex, animated: true)
  2202. }
  2203. }
  2204. }
  2205. //MARK: -
  2206. //MARK: -
  2207. //MARK: -
  2208. //MARK: - 旧代码,需要用到的内容需要拖出来,写好注释
  2209. extension KMMainViewController {
  2210. func awakeFromNibFunction() {
  2211. self.addBackgroundMaskView()
  2212. listView.delegate = self
  2213. listView.pdfListViewDelegate = self
  2214. if (document != nil) {
  2215. self.listView.document = self.document
  2216. self.listView.document?.delegate = self
  2217. let autoScale = listView.autoScales
  2218. if !autoScale {
  2219. listView.scaleFactor = 1.0
  2220. }
  2221. }
  2222. self.initPDFLeftViewVC()
  2223. self.initRightSideView()
  2224. self.leftSideViewController.mainViewController = self
  2225. }
  2226. func viewDidAppearFunction() {
  2227. //春季活动
  2228. if ((KMAdvertisementManager.manager.info.popWindowContent) != nil) {
  2229. if KMAdvertisementManager.manager.info.popWindowContent!.content!.count > 0 {
  2230. let info = KMAdvertisementManager.manager.info.popWindowContent!.content?.first
  2231. if KMAdvertisementManager.checkAdvertisementValid(info!) {
  2232. self.loadRecommondPopWindow()
  2233. }
  2234. }
  2235. }
  2236. self.addEventMonitor()
  2237. self.view.window?.makeFirstResponder(self.listView)
  2238. // 更新属性页面的信息
  2239. NotificationCenter.default.post(name: KMInfoWindowC.windowDidBecomeMainNotification, object: self.myDocument)
  2240. self.interfaceThemeDidChanged(self.view.window?.appearance?.name ?? (NSApp.appearance?.name ?? .aqua))
  2241. if (self.document == nil) {
  2242. return
  2243. }
  2244. if (self.document == nil || self.document!.isLocked == false) {
  2245. self.loadFunctionGuide()
  2246. }
  2247. if (self.document?.isLocked == false) {
  2248. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2249. self.showConvertNotesProgress()
  2250. }
  2251. return
  2252. }
  2253. if (self.view.window == nil) {
  2254. return
  2255. }
  2256. if (self.model.password != nil) {
  2257. if let data = self.listView.document?.unlock(withPassword: self.model.password), data {
  2258. self.model.isSaveKeyChain = false
  2259. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2260. self.showConvertNotesProgress()
  2261. }
  2262. return
  2263. }
  2264. }
  2265. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
  2266. if self.view.window != nil && self.tabViewIsDragging() == false {
  2267. self.passwordWindow = KMPasswordInputWindow.openWindow(window: self.view.window!, url: self.document!.documentURL) { [weak self] result , password in
  2268. if (result == .cancel) {
  2269. (self?.myDocument as? KMMainDocument)?.browser?.closeTab()
  2270. return
  2271. }
  2272. self?.model.isSaveKeyChain = true
  2273. self?.listView.document = self?.document
  2274. self?.document?.unlock(withPassword: password)
  2275. }
  2276. } else {
  2277. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2278. self.showConvertNotesProgress()
  2279. }
  2280. }
  2281. }
  2282. }
  2283. func viewWillDisappearFunction() {
  2284. if self.interactionMode != .presentation {
  2285. self.removeEventMonitor()
  2286. }
  2287. self.editPDFHanddler.hiddenWindows()
  2288. }
  2289. func viewWillLayoutFunction() {
  2290. if (KMTools.isFullScreen(self.view.window ?? NSWindow())) { // 全屏
  2291. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundFullScreenColor
  2292. } else {
  2293. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundNormalColor
  2294. }
  2295. if let guideWC = self.guideInfoWindowController{
  2296. var rect = self.view.window!.frame
  2297. rect.size.height -= 20
  2298. guideWC.window?.setFrame(rect, display: false)
  2299. guideWC.window?.minSize = rect.size
  2300. guideWC.window?.maxSize = rect.size
  2301. guideWC.show()
  2302. }
  2303. }
  2304. func viewDidLoadOld() {
  2305. mwcFlags.settingUpWindow = 1
  2306. self.editPDFHanddler.viewC = self
  2307. self.srHanddler.pdfView = self.listView
  2308. self.initToolbar()
  2309. if (UserDefaults.standard.object(forKey: CPDFOfficeLeftSidePaneWidthKey) != nil) {
  2310. UserDefaults.standard.set(256, forKey: CPDFOfficeLeftSidePaneWidthKey)
  2311. UserDefaults.standard.synchronize()
  2312. }
  2313. if (UserDefaults.standard.object(forKey: CPDFOfficeRightSidePaneWidthKey) != nil) {
  2314. UserDefaults.standard.set(256, forKey: CPDFOfficeRightSidePaneWidthKey)
  2315. UserDefaults.standard.synchronize()
  2316. }
  2317. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  2318. if (self.listView.document != nil) {
  2319. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document?.documentURL.path ?? "")
  2320. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document?.documentURL.path ?? "")
  2321. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < (self.listView.document?.pageCount ?? 0)) {
  2322. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  2323. if (pageScale != nil) {
  2324. self.listView.scaleFactor = CGFloat(pageScale!)
  2325. }
  2326. self.listView.go(toPageIndex: pageNumber!, animated: false)
  2327. }
  2328. } else {
  2329. self._goToFirstPageForFristAppear()
  2330. }
  2331. }
  2332. } else {
  2333. self._goToFirstPageForFristAppear()
  2334. }
  2335. NotificationCenter.default.addObserver(self, selector: #selector(rename(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerRename"), object: nil)
  2336. NotificationCenter.default.addObserver(self, selector: #selector(closeTab(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerCloseTabs"), object: nil)
  2337. NotificationCenter.default.addObserver(self, selector: #selector(showInFinder(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerShowInFinder"), object: nil)
  2338. NotificationCenter.default.addObserver(self, selector: #selector(preferenceDidChangeNotification), name: KMPreferenceManager.didChangeNotification, object: nil)
  2339. NotificationCenter.default.addObserver(self, selector: #selector(documentDidUnlockNotification), name: Notification.Name("CPDFDocumentDidUnlockNotification"), object: nil)
  2340. NotificationCenter.default.addObserver(self, selector: #selector(annotationsAttributeHasChange), name: NSNotification.Name.CPDFListViewAnnotationsAttributeHasChange, object:nil)
  2341. NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminateNotification), name: NSApplication.willTerminateNotification, object: nil)
  2342. NotificationCenter.default.addObserver(self, selector: #selector(CPDFDocumentPageCountChangedNotification), name: NSNotification.Name.init(rawValue: "CPDFDocumentPageCountChangedNotification"), object: nil)
  2343. NotificationCenter.default.addObserver(self, selector: #selector(CEditPDFToolModeChangeStateUnkownNotification), name: Notification.Name.init("CEditPDFToolModeChangeStateUnkown"), object: nil)
  2344. NotificationCenter.default.addObserver(self, selector: #selector(handlePageChangedNotification), name: NSNotification.Name.CPDFViewPageChanged, object: self.listView)
  2345. NotificationCenter.default.addObserver(self, selector: #selector(handleDisplayBoxChangedNotification), name: NSNotification.Name.CPDFViewDisplayBoxChanged, object: self.listView)
  2346. NotificationCenter.default.addObserver(self, selector: #selector(didAddContentViewNotification), name: NSWindow.didAddContentViewNotification, object: nil)
  2347. NotificationCenter.default.addObserver(self, selector: #selector(addAutoSaveEvent), name: AutoSaveManager.kTimeValueChangedNotificationName, object: nil)
  2348. NotificationCenter.default.addObserver(self, selector: #selector(didRemoveAnnotationNotification), name: NSNotification.Name.CPDFPageDidRemoveAnnotation, object: nil)
  2349. Task {
  2350. self.addAutoSaveEvent()
  2351. }
  2352. self.closeRightPane()
  2353. self.addKeyEventMonitor()
  2354. self.addAdsBannerView()
  2355. var snapshotSetups: NSArray?
  2356. if KMPreferenceManager.shared.rememberSnapshot {
  2357. if let fileUrl = (self.myDocument as? KMMainDocument)?.fileURL {
  2358. snapshotSetups = SKBookmarkController.shared().snapshotsForRecentDocument(at: fileUrl) as NSArray?
  2359. }
  2360. }
  2361. if let cnt = snapshotSetups?.count, cnt > 0 {
  2362. if let data = self.listView.document?.isLocked, data {
  2363. self.savedNormalSetup.setObject(snapshotSetups as Any, forKey: "snapshots" as NSCopying)
  2364. } else {
  2365. self.showSnapshots(setups: snapshotSetups)
  2366. }
  2367. }
  2368. let readModel = UserDefaults.standard.bool(forKey: "kKMPDFViewIsReadMode")
  2369. if readModel == true {
  2370. self.openPDFReadMode()
  2371. }
  2372. let hasWindowSetup = savedNormalSetup.count > 0
  2373. if UserDefaults.standard.dictionary(forKey: KMDefaultPDFDisplaySettingsKey) != nil {
  2374. let pdfSettings: NSDictionary = hasWindowSetup ? savedNormalSetup : UserDefaults.standard.dictionary(forKey: KMDefaultPDFDisplaySettingsKey)! as NSDictionary
  2375. self.applyPDFSettings(pdfSettings)
  2376. } else {
  2377. self.applyPDFSettings(savedNormalSetup)
  2378. }
  2379. //文字
  2380. let fontManager = NSFontManager.shared
  2381. fontManager.target = self
  2382. fontManager.action = #selector(changeFont(_:))
  2383. }
  2384. //MARK: - PDFListView
  2385. func initPDFLeftViewVC() {
  2386. var frame = self.leftView.frame
  2387. frame.size.width += 44
  2388. self.leftView.frame = frame
  2389. leftSideViewController.isFirst = true
  2390. leftSideViewController.listView = self.listView
  2391. leftSideViewController.view.frame = CGRect(x: 0, y:0 , width: self.leftView.frame.size.width, height: self.leftView.frame.size.height)
  2392. leftSideViewController.view.autoresizingMask = [.height,.width]
  2393. leftSideViewController.delegate = self
  2394. self.leftView.addSubview(leftSideViewController.view)
  2395. }
  2396. func initRightSideView() {
  2397. self.rightSideViewController = KMRightSideViewController.init()
  2398. self.rightSideViewController.view.frame = CGRect(x: 0, y: 0, width: self.rightView.frame.width, height: self.rightView.frame.size.height)
  2399. self.rightSideViewController.view.autoresizingMask = [.height,.width]
  2400. self.rightSideViewController.listView = self.listView
  2401. self.rightSideViewController.isHidden = true
  2402. self.rightSideViewController.delegate = self
  2403. self.rightView.addSubview(self.rightSideViewController.view)
  2404. self.rightSideViewController.propertyDidChange = { [weak self] model in
  2405. if let anno = model as? CSelfSignAnnotation {
  2406. self?.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: nil)
  2407. }
  2408. }
  2409. }
  2410. func addAdsBannerView() {
  2411. #if VERSION_FREE
  2412. if !IAPProductsManager.default().isAvailableAllFunction(){
  2413. guard let document = self.listView.document else {
  2414. return
  2415. }
  2416. if !document.isLocked {
  2417. }
  2418. NotificationCenter.default.addObserver(self, selector: #selector(purchaseStateUpdateNoti), name: NSNotification.Name(rawValue: "KMIAPProductPurchasedNotification"), object: nil)
  2419. NotificationCenter.default.addObserver(self, selector: #selector(purchaseStateUpdateNoti), name: NSNotification.Name(rawValue: "kDeviceActivateNotification"), object: nil)
  2420. }
  2421. #endif
  2422. }
  2423. // MARK: Private Methods
  2424. private func _isArabicLanguage() -> Bool {
  2425. return NSLocalizedString("Right click a color and select “Change Color...“.", comment: "") == "انقر بزر الماوس الأيمن فوق اللون وحدد \"تغيير اللون...\"."
  2426. }
  2427. internal func removeNotifications() {
  2428. NotificationCenter.default.removeObserver(self)
  2429. self.leftSideViewController.clearAnnotationFilterData()
  2430. self.leftSideViewController.clearNotification()
  2431. }
  2432. func checkShouldAutoOpenLeftVC() {
  2433. if KMPreference.shared.showLeftSideBar == false {
  2434. return
  2435. }
  2436. if self.model.leftPanelOpen {
  2437. return
  2438. }
  2439. let readModel = UserDefaults.standard.bool(forKey: "kKMPDFViewIsReadMode")
  2440. if readModel == true {
  2441. return
  2442. }
  2443. DispatchQueue.main.async {
  2444. self.leftSideViewController.showThumbnail()
  2445. }
  2446. }
  2447. func applyLeftSideWidth(_ leftSideWidth: CGFloat, rightSideWidth: CGFloat) -> Void {
  2448. }
  2449. func removeAllAnnotations() {
  2450. let alert = NSAlert()
  2451. alert.messageText = NSLocalizedString("This will permanently remove all annotations. Are you sure to continue?", comment: "")
  2452. alert.addButton(withTitle: NSLocalizedString("Yes", comment:""))
  2453. alert.addButton(withTitle: NSLocalizedString("No", comment:""))
  2454. if (alert.runModal() != .alertFirstButtonReturn) {
  2455. return
  2456. }
  2457. DispatchQueue.main.async {
  2458. self.removeAllAnnotationsStore.store(t: self.listView)
  2459. }
  2460. }
  2461. @objc func cancelMeasureType() {
  2462. self.hideMeasureFloatingWindows()
  2463. }
  2464. func hideMeasureFloatingWindows() {
  2465. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  2466. distanceMeasureInfoWindowController?.hideFloatingWindow()
  2467. } else if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  2468. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  2469. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  2470. areaMeasureInfoWindowController?.hideFloatingWindow()
  2471. }
  2472. }
  2473. func showMeasureFloatingWindowsIfNeed() {
  2474. let toolMode = self.listView.toolMode
  2475. if toolMode != .measureToolMode {
  2476. return
  2477. }
  2478. let type = self.listView.annotationType
  2479. if type == .line {
  2480. self.distanceMeasureInfoWindowController?.window?.orderFront(nil)
  2481. } else if type == .polyLine {
  2482. self.perimeterMeasureInfoWindowController?.window?.orderFront(nil)
  2483. } else if type == .polyGon {
  2484. self.areaMeasureInfoWindowController?.window?.orderFront(nil)
  2485. } else if type == .square {
  2486. self.areaMeasureInfoWindowController?.window?.orderFront(nil)
  2487. }
  2488. }
  2489. // MARK: - 标记密文
  2490. func enterRedact() {
  2491. if !IAPProductsManager.default().isAvailableAllFunction(){
  2492. let winC = KMPurchaseCompareWindowController.sharedInstance()
  2493. winC?.kEventName = "Reading_Redact_BuyNow"
  2494. winC?.showWindow(nil)
  2495. return
  2496. }
  2497. if self.listView.document?.allowsPrinting == false || self.listView.document?.allowsCopying == false {
  2498. Task {
  2499. _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted."))
  2500. }
  2501. return
  2502. }
  2503. if self.hasEnterRedact() {
  2504. self.exitRedact()
  2505. return
  2506. }
  2507. self.leftSideViewController.thumbnailTableView.isEnabled = false
  2508. self.leftSideViewController.tocOutlineView.isEnabled = false
  2509. self.leftSideViewController.noteOutlineView.isEnabled = false
  2510. self.leftSideViewController.findTableView.isEnabled = false
  2511. self.leftSideViewController.groupedFindTableView.isEnabled = false
  2512. self.leftSideViewController.snapshotTableView.isEnabled = false
  2513. let ttsWindowC = KMTTSWindowController.share
  2514. if ttsWindowC.pdfView?.document?.documentURL.path == self.listView.document?.documentURL.path {
  2515. if let data = ttsWindowC.window?.isVisible, data {
  2516. ttsWindowC.stopSpeaking()
  2517. ttsWindowC.close()
  2518. }
  2519. }
  2520. NSColorPanel.shared.showsAlpha = false
  2521. redactController = KMPDFRedactViewController(url: self.listView.document!.documentURL, password: self.listView.document?.password)
  2522. self.addChild(redactController)
  2523. redactController.view.autoresizingMask = [.width, .height]
  2524. self.listView.isHidden = true
  2525. redactController.scaleFactor = self.listView.scaleFactor
  2526. redactController.titleBack = { [weak self] title in
  2527. self?.view.window?.title = title
  2528. }
  2529. redactController.callback = { [weak self] result, currentPageIndex, saveResult, saveUrl in
  2530. self?.listView.go(toPageIndex: self!.redactController.redactPdfView.currentPageIndex, animated: false)
  2531. if result == false { // 退出
  2532. self?.exitRedact()
  2533. return
  2534. }
  2535. let controller = self?._getPDFRedactController()
  2536. controller?.redactPdfView.newAddAnnotation.removeAll()
  2537. self?.exitRedact()
  2538. if saveResult {
  2539. let newDocument = CPDFDocument(url: saveUrl)
  2540. if let data = newDocument?.isLocked, data {
  2541. newDocument?.unlock(withPassword: self?.listView.document?.password ?? "")
  2542. }
  2543. self?.document = newDocument
  2544. self?.listView.document = newDocument
  2545. self?.listView.layoutDocumentView()
  2546. }
  2547. }
  2548. redactController.setCurrentPageIndex(self.listView.currentPageIndex)
  2549. }
  2550. func exitRedact() {
  2551. self.leftSideViewController.thumbnailTableView.isEnabled = true
  2552. self.leftSideViewController.tocOutlineView.isEnabled = true
  2553. self.leftSideViewController.noteOutlineView.isEnabled = true
  2554. self.leftSideViewController.findTableView.isEnabled = true
  2555. self.leftSideViewController.groupedFindTableView.isEnabled = true
  2556. self.leftSideViewController.snapshotTableView.isEnabled = true
  2557. let controller = self._getPDFRedactController()
  2558. if let data = controller {
  2559. if data.redactPdfView.newAddAnnotation.count > 0 {
  2560. KMAlertTool.runModel(message: "", informative: KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction."), buttons: [KMLocalizedString("Exit"), KMLocalizedString("Cancel")]) { response in
  2561. if response == .alertFirstButtonReturn {
  2562. controller?.redactPdfView.newAddAnnotation.removeAll()
  2563. self.exitRedact()
  2564. }
  2565. }
  2566. return
  2567. }
  2568. }
  2569. NSColorPanel.shared.showsAlpha = true
  2570. controller?.redactPdfView.resignMonitor()
  2571. controller?.view.removeFromSuperview()
  2572. controller?.removeFromParent()
  2573. self.listView.isHidden = false
  2574. self.listView.annotationType = .unkown
  2575. }
  2576. func hasEnterRedact() -> Bool {
  2577. return self._getPDFRedactController() != nil
  2578. }
  2579. //MARK: - AI
  2580. func showAITypeChooseView(aiConfigType: AIConfigType) -> Void {
  2581. if (self.document != nil) {
  2582. AIChatInfoManager.defaultManager.currentFilePath = (self.document?.documentURL.path)!
  2583. } else {
  2584. AIChatInfoManager.defaultManager.currentFilePath = ""
  2585. }
  2586. let windowVC: AINewConfigWindowController = AINewConfigWindowController.currentWC()
  2587. windowVC.chooseCurFileHandle = {[unowned self] windowVC in
  2588. if AIChatInfoManager.defaultManager.currentFilePath.isEmpty == false {
  2589. let documentArray = NSDocumentController.shared.documents
  2590. var didFileEdit: Bool = false
  2591. var curDoc: KMMainDocument!
  2592. for document in documentArray {
  2593. if document.fileURL?.path == AIChatInfoManager.defaultManager.currentFilePath {
  2594. didFileEdit = document.isDocumentEdited
  2595. curDoc = document as! KMMainDocument
  2596. break
  2597. }
  2598. }
  2599. if didFileEdit {
  2600. let tempFileURL = FileManager.default.temporaryDirectory.appendingPathComponent(AIChatInfoManager.defaultManager.currentFilePath.lastPathComponent)
  2601. if FileManager.default.fileExists(atPath: tempFileURL.path) {
  2602. do {
  2603. try FileManager.default.removeItem(at: tempFileURL)
  2604. } catch {
  2605. }
  2606. }
  2607. if curDoc != nil {
  2608. curDoc.mainViewController?.SaveTempPDFDocumentToURLPath(tempPath: tempFileURL.path)
  2609. }
  2610. }
  2611. windowVC.window?.becomeMain()
  2612. }
  2613. }
  2614. if windowVC.window?.isVisible == true && windowVC.didSetOriginFrame == true {
  2615. } else {
  2616. var windowRect = windowVC.window?.frame
  2617. windowRect!.origin.x = NSMaxX(self.view.window!.frame) - (windowRect?.size.width)!
  2618. windowRect!.origin.y = NSMaxY(self.view.window!.frame) - (windowRect?.size.height)! - 64
  2619. windowVC.window?.setFrame(windowRect!, display: true)
  2620. windowVC.didSetOriginFrame = true
  2621. }
  2622. windowVC.eventLabel = "AITools_Tbr"
  2623. windowVC.showWindow(nil)
  2624. if (aiConfigType != .none) {
  2625. windowVC.eventLabel = "AITools_Start"
  2626. if self.listView.currentSelection?.string()?.isEmpty == false {
  2627. windowVC.setCurrentPDFSelection(self.listView.currentSelection.string())
  2628. }
  2629. windowVC.chooseAIFunctionWithType(aiConfigType)
  2630. }
  2631. }
  2632. @objc func aiTipIconViewShowStateChangeNoti() {
  2633. }
  2634. //MARK: - 引导
  2635. func loadFunctionGuide() -> Void {
  2636. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  2637. if self.view.window != nil {
  2638. self.loadOpenFileFunctionGuide(.openFileNormal)
  2639. }
  2640. }
  2641. }
  2642. func loadOpenFileFunctionGuide(_ showType: KMGuideInfoType) -> Void {
  2643. if showType == .openFileNormal && KMGuideInfoWindowController.availableShow(.openFileNormal) {
  2644. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2645. guard let guideWC = self.guideInfoWindowController else { return }
  2646. guideWC.type = .openFileNormal
  2647. // guideWC.openPanelRect = (self.view.window?.contentView?.convert(leftPanelItem.frame, from: leftPanelItem.superview)) ?? .zero
  2648. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2649. guideWC.normalGuideFinishHandle = { [weak self] windowVC in
  2650. }
  2651. guideWC.finishHandle = { [weak self] windowVC, type in
  2652. if type == .windowNewFinish ||
  2653. type == . windowDigitalFinish {
  2654. self?.checkFirstTrialController()
  2655. }
  2656. }
  2657. guideWC.openFileToggleHandle = { [weak self] windowVC, type in
  2658. self?.checkFirstTrialController()
  2659. }
  2660. var rect = self.view.window!.frame
  2661. rect.size.height -= 20
  2662. guideWC.window?.setFrame(rect, display: false)
  2663. guideWC.window?.minSize = rect.size
  2664. guideWC.window?.maxSize = rect.size
  2665. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2666. guideWC.show()
  2667. } else if showType == .digitalSignGuide && KMGuideInfoWindowController.availableShow(.digitalSignGuide) {
  2668. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2669. guard let guideWC = self.guideInfoWindowController else { return }
  2670. guideWC.type = .digitalSignGuide
  2671. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2672. guideWC.finishHandle = { [weak self] windowVC, type in
  2673. self?.checkFirstTrialController()
  2674. }
  2675. var rect = self.view.window!.frame
  2676. rect.size.height -= 20
  2677. guideWC.window?.setFrame(rect, display: false)
  2678. guideWC.window?.minSize = rect.size
  2679. guideWC.window?.maxSize = rect.size
  2680. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2681. guideWC.show()
  2682. } else if showType == .pdfCompareGuide && KMGuideInfoWindowController.availableShow(.pdfCompareGuide) {
  2683. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) {
  2684. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2685. guard let guideWC = self.guideInfoWindowController else { return }
  2686. guideWC.type = .pdfCompareGuide
  2687. guard let win = self.view.window else {
  2688. return
  2689. }
  2690. guideWC.finishHandle = { [weak self] winC, type in
  2691. if type == .windowNewFinish {
  2692. DispatchQueue.main.async {
  2693. self?.loadOpenFileFunctionGuide(.measureGuide)
  2694. }
  2695. return
  2696. }
  2697. }
  2698. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2699. var rect = self.view.window!.frame
  2700. rect.size.height -= 20
  2701. guideWC.window?.setFrame(rect, display: false)
  2702. guideWC.window?.minSize = rect.size
  2703. guideWC.window?.maxSize = rect.size
  2704. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2705. guideWC.show()
  2706. }
  2707. } else if showType == .measureGuide && KMGuideInfoWindowController.availableShow(.measureGuide) {
  2708. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) {
  2709. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2710. guard let guideWC = self.guideInfoWindowController else { return }
  2711. guard let _ = self.view.window else {
  2712. return
  2713. }
  2714. guideWC.type = .measureGuide
  2715. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2716. var rect = self.view.window?.frame ?? .zero
  2717. rect.size.height -= 20
  2718. guideWC.window?.setFrame(rect, display: false)
  2719. guideWC.window?.minSize = rect.size
  2720. guideWC.window?.maxSize = rect.size
  2721. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2722. guideWC.show()
  2723. }
  2724. } else if showType == .convertGuide && KMGuideInfoWindowController.availableShow(.convertGuide) {
  2725. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  2726. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2727. guard let guideWC = self.guideInfoWindowController else { return }
  2728. guideWC.type = .convertGuide
  2729. guard let win = self.view.window else {
  2730. return
  2731. }
  2732. guideWC.purchaseHandle = { [weak self] windowVC in
  2733. #if VERSION_DMG
  2734. if IAPProductsManager.default().isAvailableAllFunction() {
  2735. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  2736. //Convert:
  2737. self?.showAllConvertWindow(convertT: .Word)
  2738. } else {
  2739. let limitWC = KMPurchaseLimitWindowController.currentLimitWC()
  2740. limitWC.continueBlock = { windowController in
  2741. }
  2742. limitWC.window?.center()
  2743. limitWC.showWindow(nil)
  2744. }
  2745. } else {
  2746. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2747. }
  2748. #else
  2749. if IAPProductsManager.default().isAvailableAllFunction() {
  2750. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  2751. //Convert:
  2752. } else {
  2753. var vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 1)
  2754. vc.showWindow(nil)
  2755. }
  2756. } else {
  2757. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2758. }
  2759. #endif
  2760. }
  2761. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2762. var rect = self.view.window?.frame ?? .zero
  2763. rect.size.height -= 20
  2764. guideWC.window?.setFrame(rect, display: false)
  2765. guideWC.window?.minSize = rect.size
  2766. guideWC.window?.maxSize = rect.size
  2767. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2768. guideWC.show()
  2769. }
  2770. } else {
  2771. }
  2772. }
  2773. func checkFirstTrialController() -> Void {
  2774. #if VERSION_DMG
  2775. //打开文档后引导相关
  2776. if VerificationManager.default().status == .none {
  2777. let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
  2778. let lastVersion = UserDefaults.standard.object(forKey: "SKLastTrialVersionMainDocumentLaunchedKey") as? String ?? ""
  2779. if lastVersion.isEmpty || lastVersion != appVersion {
  2780. UserDefaults.standard.setValue(appVersion, forKey: "SKLastTrialVersionMainDocumentLaunchedKey")
  2781. UserDefaults.standard.synchronize()
  2782. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2783. }
  2784. }
  2785. #endif
  2786. }
  2787. // MARK: - 页面编辑
  2788. open func enterPageEdit(_ pages: [Int] = []) {
  2789. if let doc = self.listView.document {
  2790. if doc.allowsCopying == false || doc.allowsPrinting == false {
  2791. KMBaseWindowController.checkPassword(url: doc.documentURL, type: .owner) { result, pwd in
  2792. if result && pwd.isEmpty == false {
  2793. self.listView.document?.unlock(withPassword: pwd)
  2794. Task { @MainActor in
  2795. self.enterPageEdit(pages)
  2796. }
  2797. } else {
  2798. self.exitPageEdit()
  2799. }
  2800. }
  2801. return
  2802. }
  2803. }
  2804. //选中page
  2805. var tPages = pages
  2806. if tPages.count == 0 {
  2807. if self.leftSideViewController.type.methodType == .Thumbnail {
  2808. tPages = self.leftSideViewController.thumb_fetchSelectedRows() ?? [self.listView.currentPageIndex]
  2809. }
  2810. }
  2811. if (hasEnterPageEdit()) {
  2812. exitPageEdit()
  2813. return
  2814. }
  2815. self.editPDFHanddler.clearData()
  2816. let controller = KMPDFEditViewController(self.listView.document)
  2817. controller.selectedPages = tPages
  2818. controller.listView = self.listView
  2819. self.addChild(controller)
  2820. controller.view.autoresizingMask = [.width,.height]
  2821. self.listView.isHidden = true
  2822. controller.itemClick = { [weak self] index, params in
  2823. if (index == 1) { /// 双击退出
  2824. self?.enterEditMode(self!.leftSideViewController, [])
  2825. DispatchQueue.main.async {
  2826. let pageIndex: Int = params.first as! Int
  2827. self?.listView.go(toPageIndex: pageIndex, animated: true)
  2828. }
  2829. } else if (index == 2) { // 打印
  2830. self?.showPrintWindow(pageRange: KMPrintPageRange(type: .custom, selectPages: params.first as! [Int]))
  2831. }
  2832. }
  2833. controller.documentEditedCallback = { [weak self] params in
  2834. self?.recordIsPDFDocumentEdited()
  2835. }
  2836. controller.selectionDidChange = { selectedIndexs in
  2837. var indexSet = IndexSet()
  2838. for indexPath in selectedIndexs {
  2839. indexSet.insert(indexPath.item)
  2840. }
  2841. if indexSet.count != 0 {
  2842. }
  2843. }
  2844. }
  2845. open func exitPageEdit() {
  2846. let editController = getPDFEditController()
  2847. if (editController == nil) {
  2848. return
  2849. }
  2850. self.listView.annotationType = .highlight
  2851. // FIXME: - sdk修复插入特定文档crash后,这行代码可以去掉
  2852. self.leftSideViewController.model.insertedDocumentSet.formUnion(editController?.model.insertedDocumentSet ?? [])
  2853. editController?.view.removeFromSuperview()
  2854. editController?.removeFromParent()
  2855. self.listView.isHidden = false
  2856. self.listView.layoutDocumentView()
  2857. self.view.window?.makeFirstResponder(self.listView)
  2858. self.listView.annotationType = .unkown
  2859. self.listView.go(toPageIndex: editController!.listViewCurrentIndex, animated: false)
  2860. if let data = editController?.isEdited, data {
  2861. self.leftSideViewController.reloadThumbnailDataIfNeed()
  2862. self.leftSideViewController.note_reloadDataIfNeed()
  2863. self.leftSideViewController.refreshUIOfOutlineIfNeed()
  2864. self.leftSideViewController.refreshUIOfSeachListIfNeed()
  2865. self.leftSideViewController.refreshUIOfBookmarkIfNeed()
  2866. }
  2867. }
  2868. open func hasEnterPageEdit() -> Bool {
  2869. return self.getPDFEditController() != nil
  2870. }
  2871. // MARK: - Edit PDF
  2872. func enterEditPDF() {
  2873. self.editPDFHanddler.enterEditPDF()
  2874. }
  2875. // MARK: - 数字签名
  2876. func hasShowDigitalSign() -> Bool {
  2877. return self.digitalSignController?.view.superview != nil
  2878. }
  2879. func canEnterDigitalSign() -> Bool {
  2880. guard let doc = self.listView.document else {
  2881. return false
  2882. }
  2883. return doc.allowsPrinting && doc.allowsCopying
  2884. }
  2885. func enterDigitalSign() {
  2886. self.listView.toolMode = .textToolMode
  2887. if self.hasShowDigitalSign() {
  2888. self.exitDigitalSign()
  2889. } else {
  2890. if self.needSaveDocument() {
  2891. self.saveDocumentWithProgressAlert { [unowned self] params in
  2892. if (self.listView.document != nil) {
  2893. self.showDigitalSignWindow(withFilePathURL: self.listView.document.documentURL)
  2894. }
  2895. }
  2896. return
  2897. }
  2898. if (self.listView.document != nil) {
  2899. self.showDigitalSignWindow(withFilePathURL: self.listView.document.documentURL)
  2900. }
  2901. }
  2902. }
  2903. func exitDigitalSign() {
  2904. self.digitalSignController?.view.removeFromSuperview()
  2905. // KMDocumentDigitalSignToolbarItemIdentifier
  2906. }
  2907. func showDigitalSignWindow(withFilePathURL fileURL: URL) {
  2908. if !IAPProductsManager.default().isAvailableAllFunction(){
  2909. let winC = KMPurchaseCompareWindowController.sharedInstance()
  2910. winC?.kEventName = "Reading_DigitalSign_BuyNow"
  2911. winC?.showWindow(nil)
  2912. return
  2913. }
  2914. if hasShowDigitalSign() {
  2915. self.exitDigitalSign()
  2916. }
  2917. var currentPageIndex = listView.document?.index(for: listView.currentPage()) ?? 0
  2918. var password: String = ""
  2919. password = listView.document?.password ?? ""
  2920. digitalSignController = KMPDFDigitalSignViewController()
  2921. digitalSignController?.currentPageIndex = Int(currentPageIndex)
  2922. digitalSignController?.url = listView.document?.documentURL
  2923. digitalSignController?.password = password
  2924. digitalSignController?.scaleFactor = listView.scaleFactor
  2925. digitalSignController?.titleChangeBlock = { title, index in
  2926. currentPageIndex = UInt(index)
  2927. }
  2928. digitalSignController?.buttonActionBlock = { [weak self] type, isChanged in
  2929. if type == .cancel {
  2930. if let page = self?.listView.document?.page(at: currentPageIndex) {
  2931. self?.listView.go(to: page)
  2932. }
  2933. self?.exitDigitalSign()
  2934. }
  2935. }
  2936. }
  2937. // MARK: - Toolbar
  2938. func toolbarItemClickForExitMode(_ toolbarItem: KMToolbarItemView) {
  2939. if(toolbarItem.itemIdentifier != KMDocumentPageToolbarItemIdentifier) {
  2940. if (hasEnterPageEdit()) {
  2941. self.exitPageEdit()
  2942. }
  2943. }
  2944. if toolbarItem.itemIdentifier != KMDocumentRedactToolbarItemIdentifier {
  2945. if self.hasEnterRedact() {
  2946. self.exitRedact()
  2947. }
  2948. }
  2949. if toolbarItem.itemIdentifier != KMDocumentDigitalSignToolbarItemIdentifier {
  2950. if self.hasShowDigitalSign() {
  2951. self.exitDigitalSign()
  2952. }
  2953. }
  2954. if toolbarItem.itemIdentifier != KMDocumentEditToolbarItemIdentifier && toolbarItem.itemIdentifier != KMRightControlToolbarItemIdentifier && toolbarItem.itemIdentifier != KMLeftControlToolbarItemIdentifier {
  2955. }
  2956. }
  2957. // MARK: - Private Methods
  2958. private func getPDFEditController() -> KMPDFEditViewController? {
  2959. var editController: KMPDFEditViewController?
  2960. for controller in self.children {
  2961. if (controller.isKind(of: KMPDFEditViewController.self)) {
  2962. editController = (controller as! KMPDFEditViewController)
  2963. break
  2964. }
  2965. }
  2966. return editController
  2967. }
  2968. private func _getPDFRedactController() -> KMPDFRedactViewController? {
  2969. var controller: KMPDFRedactViewController?
  2970. for childC in self.children {
  2971. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  2972. controller = (childC as! KMPDFRedactViewController)
  2973. break
  2974. }
  2975. }
  2976. return controller
  2977. }
  2978. private func addBackgroundMaskView() {
  2979. self.removeBackgroundMaskView()
  2980. }
  2981. private func removeBackgroundMaskView() {
  2982. }
  2983. private func _goToFirstPageForFristAppear() {
  2984. DispatchQueue.main.asyncAfter(wallDeadline: .now()+0.1) {
  2985. self.listView.go(toPageIndex: 0, animated: false)
  2986. }
  2987. }
  2988. func isPDFPageCountExceedsLimit(filePath: String) -> Bool {
  2989. let url = URL(fileURLWithPath: filePath)
  2990. guard let document = PDFDocument(url: url) else {
  2991. return false
  2992. }
  2993. let pageCount = document.pageCount
  2994. return pageCount > 30
  2995. }
  2996. // MARK: - Redact 【标记密文】
  2997. func exeRedactConfirm(_ type: KMRedactConfirmType, callback: @escaping () -> ()?) {
  2998. let windowController = KMRedactConfirmWindowController(type)
  2999. self.currentWindowController = windowController
  3000. self.view.window?.beginSheet(windowController.window!)
  3001. windowController.itemClick = { [weak self] index in
  3002. if (index == 2) { /// 取消
  3003. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  3004. self?.currentWindowController = nil
  3005. callback()
  3006. return
  3007. }
  3008. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  3009. self?.currentWindowController = nil
  3010. let panel = NSSavePanel()
  3011. panel.nameFieldStringValue = "[新文件]"+((self?.listView.document?.documentURL.lastPathComponent) ?? "")
  3012. let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
  3013. button.state = .on
  3014. panel.accessoryView = button
  3015. panel.isExtensionHidden = true
  3016. panel.beginSheetModal(for: (self?.view.window!)!) { response in
  3017. if response != .OK {
  3018. callback()
  3019. return
  3020. }
  3021. if (type == .redactOne) {
  3022. let anno = self!.listView.activeAnnotation
  3023. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  3024. callback()
  3025. return
  3026. }
  3027. (anno as! CPDFRedactAnnotation).applyRedaction()
  3028. } else if (type == .redactAll) {
  3029. self?.listView.document?.applyRedactions()
  3030. } else if (type == .eraserOne) {
  3031. let anno = self!.listView.activeAnnotation
  3032. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  3033. callback()
  3034. return
  3035. }
  3036. anno?.page.erasureRedact(from: anno!.bounds)
  3037. } else if (type == .eraserAll) {
  3038. KMRedactTools.eraserDocument((self?.listView.document)!) { result, errorAnno in
  3039. if (result == false) {
  3040. callback()
  3041. return
  3042. }
  3043. }
  3044. }
  3045. self!.listView.document?.write(to: panel.url)
  3046. if (button.state == .on) {
  3047. NSDocumentController.shared.openDocument(withContentsOf: panel.url!, display: true) { document, alreadyOpen, error in
  3048. }
  3049. } else {
  3050. NSWorkspace.shared.activateFileViewerSelecting([panel.url!])
  3051. }
  3052. callback()
  3053. }
  3054. }
  3055. }
  3056. // MARK: - Secure 【安全】
  3057. public func showSecureLimitTip() {
  3058. self.hiddenSecureLimitTip()
  3059. if self.secureAlertView == nil {
  3060. self.secureAlertView = KMSecureAlertView()
  3061. self.secureAlertView?.show(in: self.listView)
  3062. self.secureAlertView?.closeAction = { [unowned self] view in
  3063. self.hiddenSecureLimitTip()
  3064. self.removeFromAlertView()
  3065. self.showFormAlertView()
  3066. }
  3067. self.secureAlertView?.passwordAction = { [unowned self] view in
  3068. self.removeOwnerPassword()
  3069. self.removeFromAlertView()
  3070. self.showFormAlertView()
  3071. }
  3072. }
  3073. }
  3074. func removeOwnerPassword() {
  3075. guard let doc = self.listView.document else {
  3076. NSSound.beep()
  3077. return
  3078. }
  3079. if doc.allowsCopying && doc.allowsPrinting {
  3080. NSSound.beep()
  3081. return
  3082. }
  3083. _ = KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: doc.documentURL) { [weak self] result, password in
  3084. if result == .cancel { /// 关闭
  3085. return
  3086. }
  3087. /// 解密成功
  3088. self?.hiddenSecureLimitTip()
  3089. self?.model.isSaveKeyChain = false
  3090. self?.listView.document?.unlock(withPassword: password)
  3091. }
  3092. }
  3093. public func hiddenSecureLimitTip() {
  3094. self.secureAlertView?.removeFromSuperview()
  3095. self.secureAlertView = nil
  3096. }
  3097. //MARK: - Form
  3098. func showFormAlertView() {
  3099. if (formAlertView == nil) {
  3100. formAlertView = KMFormAlertView()
  3101. formAlertView?.isCloseSecureView = self.secureAlertView != nil ? false : true
  3102. formAlertView?.showInView(self.listView)
  3103. } else {
  3104. self.removeFromAlertView()
  3105. }
  3106. }
  3107. func removeFromAlertView() {
  3108. formAlertView?.removeFromSuperview()
  3109. formAlertView = nil
  3110. }
  3111. override func mouseMoved(with event: NSEvent) {
  3112. self.view.window?.mouseMoved(with: event)
  3113. }
  3114. func savePageNumberIfNeed() {
  3115. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  3116. let scaleFactor = self.listView.scaleFactor ?? 0
  3117. if scaleFactor <= 0 {
  3118. return
  3119. }
  3120. if self.listView.document != nil {
  3121. KMPreferenceManager.shared.setPageNumber(self.listView.currentPageIndex, forKey: self.listView.document.documentURL.path)
  3122. KMPreferenceManager.shared.setPageScale(Float(self.listView.scaleFactor), forKey: self.listView.document.documentURL.path)
  3123. }
  3124. }
  3125. }
  3126. // MARK: - 显示合并窗口
  3127. public func showMergeWindow(url: URL? = nil, _ password: String?) {
  3128. DispatchQueue.main.async {
  3129. var documentURL = url
  3130. if documentURL == nil {
  3131. documentURL = self.listView.document?.documentURL
  3132. }
  3133. guard let _url = documentURL else { return }
  3134. guard let document = PDFDocument(url: _url) else { return }
  3135. self.mergeWindowController = KMMergeWindowController(document: document, password: password ?? "")
  3136. self.mergeWindowController!.oriDucumentUrl = self.listView.document?.documentURL
  3137. self.mergeWindowController!.pageIndex = self.listView.currentPageIndex
  3138. self.mergeWindowController!.cancelAction = { [unowned self] controller in
  3139. self.view.window?.endSheet(mergeWindowController!.window!)
  3140. }
  3141. self.mergeWindowController!.mergeAction = { [unowned self] controller, filePath in
  3142. self.view.window?.endSheet(mergeWindowController!.window!)
  3143. }
  3144. self.view.window?.beginSheet(self.mergeWindowController!.window!)
  3145. }
  3146. }
  3147. // MARK: - 显示加密弹窗
  3148. public func showSecureWindow(_ url: URL) {
  3149. self.securityWindowController = KMSecurityWindowController(windowNibName: "KMSecurityWindowController")
  3150. guard let securityWindowController = securityWindowController else { return }
  3151. securityWindowController.documentURL = self.listView.document?.documentURL
  3152. securityWindowController.batchAction = { [unowned self] controller, files in
  3153. self.view.window?.endSheet((securityWindowController.window)!)
  3154. let batchWindowController = KMBatchOperateWindowController.sharedWindowController
  3155. let batchOperateFile = KMBatchOperateFile(filePath: self.document?.documentURL.path ?? "", type: .AddPassword)
  3156. batchWindowController.switchToOperateType(.AddPassword, files: [batchOperateFile])
  3157. batchWindowController.window?.makeKeyAndOrderFront("")
  3158. }
  3159. securityWindowController.doneAction = { [unowned self] controller, options, attribute in
  3160. let openPanel = NSOpenPanel()
  3161. openPanel.canChooseFiles = false
  3162. openPanel.canChooseDirectories = true
  3163. openPanel.canCreateDirectories = true
  3164. openPanel.beginSheetModal(for: NSWindow.currentWindow()) { (result) in
  3165. if result == NSApplication.ModalResponse.OK {
  3166. for fileURL in openPanel.urls {
  3167. let document = CPDFDocument(url: self.document?.documentURL)
  3168. if document != nil {
  3169. document!.setDocumentAttributes(attribute)
  3170. let path = fileURL.path.stringByAppendingPathComponent(url.deletingPathExtension().lastPathComponent) + "_SetPassword" + "." + url.pathExtension
  3171. let success = document!.write(to: NSURL(fileURLWithPath: path) as URL, withOptions: options)
  3172. if success {
  3173. self.view.window?.endSheet((securityWindowController.window)!)
  3174. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: path)])
  3175. }
  3176. }
  3177. }
  3178. }
  3179. }
  3180. }
  3181. securityWindowController.cancelAction = { [unowned self] controller in
  3182. self.view.window?.endSheet((securityWindowController.window)!)
  3183. }
  3184. NSWindow.currentWindow().beginSheet(securityWindowController.window!)
  3185. }
  3186. // MARK: - 保存文档
  3187. internal func needSaveDocument() -> Bool {
  3188. if (self.isPDFDocumentEdited) {
  3189. return self.isPDFDocumentEdited
  3190. }
  3191. if (self.needSave) {
  3192. return self.needSave
  3193. }
  3194. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3195. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3196. return false
  3197. }
  3198. return true
  3199. }
  3200. internal func saveDocument(overlookDocumentIfEdited overlook: Bool = false) {
  3201. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3202. if (overlook) {
  3203. document?.save(nil)
  3204. return
  3205. }
  3206. if (self.isPDFDocumentEdited) {
  3207. self.clearIsPDFDocumentEdited()
  3208. self.needSave = false
  3209. document?.save(nil)
  3210. return
  3211. }
  3212. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3213. return
  3214. }
  3215. document?.save(nil)
  3216. }
  3217. internal func asyncSaveDocument(overlookDocumentIfEdited overlook: Bool = false, callback:@escaping KMCommonBlock) {
  3218. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3219. if (overlook) {
  3220. DispatchQueue.main.async {
  3221. document?.save(nil)
  3222. callback()
  3223. }
  3224. return
  3225. }
  3226. if (self.isPDFDocumentEdited) {
  3227. self.clearIsPDFDocumentEdited()
  3228. self.needSave = false
  3229. DispatchQueue.main.async {
  3230. document?.save(nil)
  3231. callback()
  3232. }
  3233. return
  3234. }
  3235. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3236. callback()
  3237. return
  3238. }
  3239. DispatchQueue.main.async {
  3240. document?.save(nil)
  3241. callback()
  3242. }
  3243. }
  3244. internal func saveDocumentWithProgressAlert(callback:@escaping KMCommonBlock) {
  3245. // 显示进度
  3246. AutoSaveManager.manager.isSaving = true
  3247. self.showProgressWindow(message: NSLocalizedString("Save", comment: "") + "PDF")
  3248. self.progressC?.maxValue = 3.0
  3249. self.progressC?.increment(by: 1.0)
  3250. // 保存文档
  3251. self.asyncSaveDocument { [weak self] params in
  3252. // 执行进度 [假进度]
  3253. self?.progressC?.increment(by: 1.0)
  3254. self?.progressC?.increment(by: 1.0)
  3255. DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
  3256. // 隐藏进度
  3257. self?.hiddenProgressWindow()
  3258. DispatchQueue.main.asyncAfter(deadline: .now()+1) {
  3259. AutoSaveManager.manager.isSaving = false
  3260. }
  3261. // 回调
  3262. callback()
  3263. }
  3264. }
  3265. }
  3266. func SaveTempPDFDocumentToURLPath(tempPath: String) {
  3267. self.document?.write(toFile: tempPath)
  3268. }
  3269. // MARK: - 定时保存
  3270. func addAutoSaveEvent() {
  3271. if (self.autoSaveTimer != nil) {
  3272. self.autoSaveTimer?.invalidate()
  3273. self.autoSaveTimer = nil
  3274. }
  3275. if self.document != nil {
  3276. self.autoSaveTimer = Timer.scheduledTimer(withTimeInterval: AutoSaveManager.manager.timeInterval * 60, repeats: true, block: { [weak self] timer in
  3277. self?.autoSaveTimerAction(timer)
  3278. })
  3279. }
  3280. self.checkAutoSaveInfo()
  3281. }
  3282. func checkAutoSaveInfo() {
  3283. guard let cnt = AutoSaveManager.manager.autoSavePaths?.count, cnt > 0 else {
  3284. return
  3285. }
  3286. if AutoSaveManager.manager.autoSaveAlertShow {
  3287. return
  3288. }
  3289. AutoSaveManager.manager.autoSaveDidEndAction = false
  3290. AutoSaveManager.manager.autoSaveAlertShow = true
  3291. let blockSaveWindow = AutoSavePopController()
  3292. blockSaveWindow.cancelHandle = { [weak self] windowController in
  3293. AutoSaveManager.manager.autoSaveDidEndAction = true
  3294. AutoSaveManager.manager.clearCache()
  3295. self?.km_quick_endSheet()
  3296. }
  3297. blockSaveWindow.confirmHandle = { [weak self] windowController in
  3298. self?.km_quick_endSheet()
  3299. self?.saveAutoSaveInfo()
  3300. }
  3301. self.km_beginSheet(windowC: blockSaveWindow)
  3302. }
  3303. func saveAutoSaveInfo() {
  3304. let openPanel = NSOpenPanel()
  3305. openPanel.canChooseDirectories = true
  3306. openPanel.canChooseFiles = false
  3307. openPanel.allowsMultipleSelection = false
  3308. let win = NSApp.keyWindow != nil ? NSApp.keyWindow : self.view.window
  3309. openPanel.beginSheetModal(for: win!) { result in
  3310. if (result == .OK) {
  3311. let folderPath = openPanel.url?.path ?? openPanel.url?.absoluteString
  3312. for path in AutoSaveManager.manager.opendPaths ?? [] {
  3313. let _path = path as? String
  3314. var newPath = "\(folderPath ?? "")/\(_path?.lastPathComponent ?? "")"
  3315. newPath = self.getValidFilePath(newPath)
  3316. do {
  3317. try FileManager.default.moveItem(atPath: _path ?? "", toPath: newPath)
  3318. } catch {
  3319. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: newPath)])
  3320. }
  3321. }
  3322. AutoSaveManager.manager.clearCache()
  3323. }
  3324. AutoSaveManager.manager.autoSaveDidEndAction = true
  3325. }
  3326. }
  3327. func autoSaveTimerAction(_ timer: Timer) {
  3328. if (self.document == nil || self.listView.document?.documentURL.path == nil) {
  3329. return
  3330. }
  3331. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  3332. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  3333. return
  3334. }
  3335. if let data = self.document?.isLocked, data {
  3336. return
  3337. }
  3338. if AutoSaveManager.manager.autoSaveEnabled == false {
  3339. return
  3340. }
  3341. let documentArray = NSDocumentController.shared.documents
  3342. var didFileEdit = false
  3343. for doc in documentArray {
  3344. if doc.fileURL?.path == self.document?.documentURL.path {
  3345. didFileEdit = doc.isDocumentEdited
  3346. break
  3347. }
  3348. }
  3349. if (didFileEdit == false) {
  3350. return
  3351. }
  3352. AutoSaveManager.manager.isSaving = true
  3353. let savePath = AutoSaveManager.manager.autoSaveWithPath(self.listView.document?.documentURL.path ?? "")
  3354. if (!self.document!.isLocked) {
  3355. self.document?.write(to: URL(fileURLWithPath: savePath))
  3356. }
  3357. DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
  3358. AutoSaveManager.manager.isSaving = false
  3359. }
  3360. }
  3361. func removeAutoSaveInfo() {
  3362. if self.autoSaveTimer != nil {
  3363. self.autoSaveTimer?.invalidate()
  3364. self.autoSaveTimer = nil
  3365. }
  3366. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  3367. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  3368. return
  3369. }
  3370. if AutoSaveManager.manager.autoSaveEnabled == false {
  3371. return
  3372. }
  3373. if self.document == nil || self.listView.document?.documentURL.path == nil {
  3374. return
  3375. }
  3376. AutoSaveManager.manager.removeAutoSavePath(self.listView.document?.documentURL.path ?? "")
  3377. }
  3378. // MARK: - 选择 PDFDisplay 模式
  3379. public func setPDFDisplay(pdfViewMode: CPDFDisplayViewMode) {
  3380. listView.setDisplay(pdfViewMode)
  3381. }
  3382. // MARK: - 选择缩放模式
  3383. @objc public func selectZoom(_ type: KMPDFZoomType) {
  3384. switch type {
  3385. case .width:
  3386. self.listView.autoScales = true
  3387. break
  3388. case .fit:
  3389. if let pageHeight = self.listView.currentPage()?.size.height, pageHeight > 0 {
  3390. let pdfviewHeight = self.listView.bounds.size.height
  3391. self.listView.scaleFactor = pdfviewHeight/pageHeight
  3392. self.listView.autoScales = false
  3393. }
  3394. break
  3395. case .actualSize:
  3396. if self.listView.scaleFactor != 1.0 {
  3397. self.listView.scaleFactor = 1.0
  3398. self.listView.autoScales = false
  3399. }
  3400. break
  3401. }
  3402. }
  3403. internal func createPdf(index:Int) {
  3404. }
  3405. // MARK - Event 监听
  3406. private func addEventMonitor() {
  3407. if (self.eventMonitor != nil) {
  3408. self.removeEventMonitor()
  3409. }
  3410. self.eventMonitor = NSEvent.addLocalMonitorForEvents(matching: [.scrollWheel, .leftMouseDown, .leftMouseUp]) { [weak self] event in
  3411. if (event.type == .scrollWheel && event.modifierFlags.contains(.option)) { // Alt + 鼠标滚轮
  3412. self?.listView.magnifyWheel(event)
  3413. return nil
  3414. } else if event.type == .leftMouseDown {
  3415. let point = event.locationInView(self?.listView ?? NSView())
  3416. let presentationDrawView = self?.listView.presentationDrawView
  3417. if let data = self?.interactionMode, data == .presentation,CGRectContainsPoint(self?.listView.frame ?? .zero, point),presentationDrawView?.isHidden == true { // 幻灯片模式下
  3418. if point.x >= (self?.listView.frame.maxX ?? 0) / 2 {
  3419. let can = self?.listView.canGoToNextPage() ?? false
  3420. if can {
  3421. self?.listView.goToNextPage(nil)
  3422. }
  3423. } else {
  3424. let can = self?.listView.canGoToPreviousPage() ?? false
  3425. if can {
  3426. self?.listView.goToPreviousPage(nil)
  3427. }
  3428. }
  3429. return nil
  3430. }
  3431. }
  3432. return event
  3433. }
  3434. }
  3435. func addKeyEventMonitor() {
  3436. if (self.keyEventMonitor != nil) {
  3437. self.removeKeyEventMonitor()
  3438. }
  3439. keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
  3440. if event.keyCode == 53 {
  3441. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  3442. self?.exitFullScreen()
  3443. return nil
  3444. }
  3445. if self?.listView.toolMode == .editPDFToolMode {
  3446. if self != nil {
  3447. //使用editingSelectionString获取内容文字
  3448. if self!.listView.editingAreas() != nil {
  3449. if self!.listView.editingAreas().count > 0 && self!.listView.isEditable() {
  3450. self!.listView.clearEditingSelectCharItem()
  3451. } else if self!.listView.editingAreas().count > 0 {
  3452. if self?.listView.annotationType == .addImage ||
  3453. self?.listView.annotationType == .addText {
  3454. }
  3455. self?.rightSideViewController.isHidden = true
  3456. self?.listView.endEditIsRemoveBlock(with: self!.listView.editingAreas().first as? CPDFEditArea)
  3457. self?.listView.updateEditing([])
  3458. self?.listView.isEditImage = false
  3459. self?.listView.setNeedsDisplayPageViewFor(self!.listView.currentPage())
  3460. if self?.listView.annotationType == .addImage {
  3461. self?.listView.change([.text, .image])
  3462. }
  3463. self?.listView.annotationType = .editTextImage
  3464. self?.closeRightPane()
  3465. } else if(self?.listView.annotationType == .addImage || self!.listView.annotationType == .addText) {
  3466. if self?.listView.annotationType == .addImage ||
  3467. self?.listView.annotationType == .addText {
  3468. }
  3469. self?.rightSideViewController.isHidden = true
  3470. self?.listView.setShouAddEdit([])
  3471. self?.listView.change([.text, .image])
  3472. self?.listView.annotationType = .editTextImage
  3473. self?.closeRightPane()
  3474. }
  3475. } else {
  3476. if self?.listView.annotationType == .addImage ||
  3477. self?.listView.annotationType == .addText {
  3478. }
  3479. }
  3480. }
  3481. }
  3482. } else {
  3483. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  3484. self?.listView.keyDown(with: event)
  3485. return nil
  3486. } else {
  3487. let cmd = event.modifierFlags.contains(.command)
  3488. let shift = event.modifierFlags.contains(.shift)
  3489. if event.keyCode == 6 { // z
  3490. let editPDFIng = self?.editPDFHanddler.isEditing ?? false
  3491. if cmd && shift { // 恢复
  3492. let can = self?.editPDFHanddler.listView?.canEditTextRedo() ?? false
  3493. if can == false {
  3494. return event
  3495. }
  3496. if editPDFIng {
  3497. _ = CustomAlertView.alertView(message: NSLocalizedString("Redo", comment: ""), fromView: self!.view, withStyle: .black)
  3498. }
  3499. } else if cmd { // 撤回
  3500. let can = self?.editPDFHanddler.listView?.canEditTextUndo() ?? false
  3501. if can == false {
  3502. return event
  3503. }
  3504. if editPDFIng {
  3505. _ = CustomAlertView.alertView(message: NSLocalizedString("Undo", comment: ""), fromView: self!.view, withStyle: .black)
  3506. }
  3507. }
  3508. }
  3509. }
  3510. }
  3511. return event
  3512. }
  3513. }
  3514. func removeKeyEventMonitor() {
  3515. if (self.keyEventMonitor != nil) {
  3516. KMPrint("removeKeyEventMonitor 已移除事件监听")
  3517. NSEvent.removeMonitor(self.keyEventMonitor as Any)
  3518. self.keyEventMonitor = nil
  3519. }
  3520. }
  3521. private func removeEventMonitor() {
  3522. if (self.eventMonitor != nil) {
  3523. KMPrint("已移除事件监听")
  3524. NSEvent.removeMonitor(self.eventMonitor as Any)
  3525. self.eventMonitor = nil
  3526. }
  3527. }
  3528. // MARK: - Tools
  3529. func pdfViewCanHorizontalScroll() -> Bool {
  3530. let scroll = self.listView.scroll()
  3531. if (scroll == nil) {
  3532. return false
  3533. }
  3534. return scroll?.horizontalScroller?.isHidden == nil ? false : !(scroll!.horizontalScroller!.isHidden)
  3535. }
  3536. func pdfViewCanVerticalScroll() -> Bool {
  3537. let scroll = self.listView.scroll()
  3538. if (scroll == nil) {
  3539. return false
  3540. }
  3541. return scroll?.verticalScroller?.isHidden == nil ? false : !(scroll!.verticalScroller!.isHidden)
  3542. }
  3543. // MARK: - Public Methods
  3544. // 清理数据 [eg. 通知]
  3545. public func clearData() {
  3546. KMThumbnailCache.shared.clearCache()
  3547. self.removeNotifications()
  3548. if (self.listView.spellingTag() > 0) {
  3549. NSSpellChecker.shared.closeSpellDocument(withTag: self.listView.spellingTag())
  3550. }
  3551. self.removeAutoSaveInfo()
  3552. self.myDocument = nil
  3553. }
  3554. public func clearSecureOptions() {
  3555. self._secureOptions = nil
  3556. self.documentAttribute = nil
  3557. }
  3558. public func recordRemoveSecureFlag() {
  3559. self._removeSecureFlag = true
  3560. self.clearSecureOptions()
  3561. self.recordIsPDFDocumentEdited(type: .removePassword)
  3562. self._needSave = true
  3563. }
  3564. public func clearRemoveSecureFlag() {
  3565. self._removeSecureFlag = false
  3566. }
  3567. public func clearSaveWatermarkFlag() {
  3568. km_synchronized(self) {
  3569. self._saveWatermarkFlag = false
  3570. }
  3571. }
  3572. public func recordIsPDFDocumentEdited(type: KMSubscribeWaterMarkType = .none) {
  3573. km_synchronized(self) {
  3574. self.model.isPDFDocumentEdited = true
  3575. if type == .editText || type == .editImage {
  3576. self.leftSideViewController.updateThumbnail(at: self.listView.currentPageIndex)
  3577. }
  3578. if let _document = self.myDocument {
  3579. KMTools.setDocumentEditedState(document: _document)
  3580. }
  3581. }
  3582. }
  3583. public func clearIsPDFDocumentEdited() {
  3584. km_synchronized(self) {
  3585. self.model.isPDFDocumentEdited = false
  3586. }
  3587. }
  3588. func showSnapshots(setups: NSArray?) {
  3589. if self.listView.document != nil {
  3590. for setup in setups ?? [] {
  3591. let swc = KMSnapshotWindowController()
  3592. swc.delegate = self
  3593. swc.setPdfDocument(self.listView.document, setup: setup as? NSDictionary)
  3594. swc.setForceOnTop(self.interactionMode != .normal)
  3595. self.myDocument?.addWindowController(swc)
  3596. }
  3597. }
  3598. }
  3599. func dealDocumentDidLoaded() {
  3600. self.removeBackgroundMaskView()
  3601. if (!self.listView.document!.allowsCopying || !self.listView.document!.allowsPrinting) {
  3602. self.showSecureLimitTip()
  3603. }
  3604. if self.model.needConvertNotes {
  3605. self.showConvertNotesProgress()
  3606. }
  3607. if (self._documentFirstLoad) {
  3608. self.checkShouldAutoOpenLeftVC()
  3609. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  3610. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document?.documentURL.path ?? "")
  3611. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document?.documentURL.path ?? "")
  3612. if (pageScale != nil) {
  3613. self.listView.scaleFactor = CGFloat(pageScale!)
  3614. }
  3615. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < (self.listView.document?.pageCount ?? 0)) {
  3616. self.listView.go(toPageIndex: pageNumber!, animated: false)
  3617. } else {
  3618. self._goToFirstPageForFristAppear()
  3619. }
  3620. } else {
  3621. self._goToFirstPageForFristAppear()
  3622. }
  3623. self._documentFirstLoad = false
  3624. }
  3625. }
  3626. func tabViewIsDragging() -> Bool {
  3627. let level = self.view.window?.level ?? .normal
  3628. return level == .floating
  3629. }
  3630. // MARK: - Noti Actions
  3631. internal func documentDidUnlockNotification(_ sender: Notification) {
  3632. if (self.listView.document != nil && self.listView.document.isEqual(to: sender.object)) {
  3633. if (self.myDocument == nil) {
  3634. return
  3635. }
  3636. if (self.listView.document.allowsPrinting && self.listView.document.allowsCopying) {
  3637. self.hiddenSecureLimitTip()
  3638. }
  3639. let isUnlockFromKeychain = (self.myDocument as? KMMainDocument)?.isUnlockFromKeychain ?? false
  3640. if (isUnlockFromKeychain || self.model.isSaveKeyChain == false) {
  3641. return
  3642. }
  3643. let type = KMPreferenceManager.shared.savePasswordType
  3644. if (type == .never) {
  3645. return
  3646. }
  3647. if (type == .always) {
  3648. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  3649. return
  3650. }
  3651. // 保存到钥匙串
  3652. let alert = NSAlert()
  3653. alert.messageText = NSLocalizedString("Remember Password?", comment: "")
  3654. alert.informativeText = NSLocalizedString("Do you want to save this password in your Keychain?", comment: "")
  3655. alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
  3656. alert.addButton(withTitle: NSLocalizedString("No", comment: ""))
  3657. if (alert.runModal() == .alertFirstButtonReturn) { // 保存密码
  3658. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  3659. return
  3660. }
  3661. }
  3662. }
  3663. func annotationsAttributeHasChange(_ sender: Notification) {
  3664. guard let dict = sender.object as? [String : Any] else {
  3665. return
  3666. }
  3667. if let anno = dict["object"] as? CPDFAnnotation {
  3668. let value = dict["keyPath"] as? String ?? ""
  3669. let didEnd = dict["didEnd"] as? Bool ?? false
  3670. if didEnd {
  3671. if value == CPDFAnnotationBoundsKey {
  3672. if anno is CPDFSquareAnnotation || anno is CPDFCircleAnnotation {
  3673. anno.contents = anno.page?.string(for: anno.bounds) ?? ""
  3674. }
  3675. }
  3676. if anno.km_isMeasure() && anno.contents == nil {
  3677. anno.contents = anno.string() ?? ""
  3678. }
  3679. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: ["keyPath" : value])
  3680. } else {
  3681. if value != CPDFAnnotationBoundsKey && value != CPDFAnnotationStartPointKey && value != CPDFAnnotationEndPointKey && value != CPDFAnnotationPathsKey { // 改变bounds(箭头、直线注释 开始点和结束点, 手绘注释的paths)的操作会卡顿,比如移动
  3682. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: ["keyPath" : value])
  3683. }
  3684. }
  3685. }
  3686. }
  3687. internal func applicationWillTerminateNotification(_ sender: Notification) {
  3688. self.savePageNumberIfNeed()
  3689. self.saveDocument()
  3690. }
  3691. func CPDFDocumentPageCountChangedNotification(_ sender: Notification) {
  3692. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(nil, attributes: nil)
  3693. }
  3694. func CEditPDFToolModeChangeStateUnkownNotification(_ sender: Notification) {
  3695. var editSelectd = false
  3696. if (self.listView.annotationType == .addText || self.listView.annotationType == .addImage) && self.listView.toolMode == .editPDFToolMode {
  3697. editSelectd = true
  3698. }
  3699. if self.listView.toolMode == .editPDFToolMode {
  3700. if editSelectd {
  3701. }
  3702. }
  3703. }
  3704. @objc func handlePageChangedNotification(_ sender: Notification) {
  3705. if self.mwcFlags.isSwitchingFullScreen > 0 {
  3706. return
  3707. }
  3708. let page = self.listView.currentPage()
  3709. let pageIndex = page?.pageIndex() ?? 0
  3710. self.leftSideViewController.thumb_selectRowIndexsIfNeed(IndexSet(integer: IndexSet.Element(pageIndex)))
  3711. self.leftSideViewController.thumbnailTableView.needsDisplay = true
  3712. self.leftSideViewController.tocOutlineView.needsDisplay = true
  3713. }
  3714. @objc func handleDisplayBoxChangedNotification(_ sender: Notification) {
  3715. self.leftSideViewController.reloadThumbnailDataIfNeed()
  3716. }
  3717. }