KMMainViewController.swift 168 KB

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