KMMainViewController.swift 238 KB

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