KMMainViewController.swift 201 KB

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