KMMainViewController.swift 211 KB

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