KMMainViewController.swift 184 KB

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