KMMainViewController.swift 180 KB

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