KMMainViewController.swift 174 KB

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