KMMainViewController.swift 185 KB

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