KMMainViewController.swift 144 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375
  1. //
  2. // KMMainViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/15.
  6. //
  7. import Cocoa
  8. let MAINWINDOWFRAME_KEY = "windowFrame"
  9. let LEFTSIDEPANEWIDTH_KEY = "leftSidePaneWidth"
  10. let RIGHTSIDEPANEWIDTH_KEY = "rightSidePaneWidth"
  11. let SNAPSHOTS_KEY = "snapshots"
  12. let DISPLAYSPAGEBREAKS_KEY = "displaysPageBreaks"
  13. let DISPLAYSASBOOK_KEY = "displaysAsBook"
  14. let DISPLAYMODE_KEY = "displayMode"
  15. let DISPLAYBOX_KEY = "displayBox"
  16. let HASHORIZONTALSCROLLER_KEY = "hasHorizontalScroller"
  17. let HASVERTICALSCROLLER_KEY = "hasVerticalScroller"
  18. let AUTOHIDESSCROLLERS_KEY = "autoHidesScrollers"
  19. let SCALEFACTOR_KEY = "scaleFactor"
  20. let AUTOSCALES_KEY = "autoScales"
  21. let PAGEINDEX_KEY = "pageIndex"
  22. let SCROLLPOINT_KEY = "scrollPoint"
  23. let LOCKED_KEY = "locked"
  24. @objcMembers class KMMainViewController: NSViewController,CPDFViewDelegate,CPDFListViewDelegate,NSTextFieldDelegate {
  25. @IBOutlet var PDFContendView: NSView!
  26. @IBOutlet var centerContentView: NSView!
  27. @IBOutlet var listView: CPDFListView!
  28. @IBOutlet var secondaryPdfView: KMSecondaryPDFView?
  29. @IBOutlet weak var readContentView: NSView!
  30. @IBOutlet weak var tipCurrentPageBox: KMBox!
  31. @IBOutlet weak var rightView: NSView!
  32. @IBOutlet weak var leftView: NSView!
  33. @IBOutlet weak var mianSplitView: KMSplitView!
  34. @IBOutlet weak var pdfSplitView: KMSplitView!
  35. @IBOutlet weak var newPDFSplitView: KMSplitView!
  36. @IBOutlet weak var pdfContentView: NSView!
  37. @IBOutlet weak var pdfSplitSecondView: NSBox!
  38. @IBOutlet weak var locationPageView: NSView!
  39. @IBOutlet weak var tipLabel: NSTextField!
  40. @IBOutlet weak var toplayoutConstraint: NSLayoutConstraint!
  41. @IBOutlet var childToolbarController: KMToolbarViewController!
  42. @IBOutlet var toolbarController: KMToolbarController!
  43. @IBOutlet weak var toolbarBox: NSBox!
  44. @IBOutlet weak var heightOffset: NSLayoutConstraint!
  45. //阅读模式界面
  46. @IBOutlet weak var readModelView: KMReadModelView!
  47. @IBOutlet weak var bottomAreaView: KMBox!
  48. @IBOutlet weak var readModelViewWidthConstraint: NSLayoutConstraint!
  49. var isReadMode: Bool = false
  50. var readAlertView: CustomAlertView?
  51. var readLeftMethodType: BotaType = .None
  52. var readLeftPanelOpen = false
  53. var readLastLeftPanWidth = 0.0
  54. var readLeftViewShowPanel = false
  55. var readRightPanelOpen = false
  56. var readToolbarType: KMToolbarViewType = .None
  57. var readToolbarItemIdentifier: String = ""
  58. var readToolMode: CToolMode = .textToolMode
  59. var readAnnotationType: CAnnotationType = .unkown
  60. var readSubViewType: RightSubViewType = .None
  61. //页码显示器
  62. @IBOutlet weak var pageNumberDisplayView: KMPageNumberDisplayView!
  63. @IBOutlet weak var tipCurrentPageBoxWidthConstraint: NSLayoutConstraint!
  64. //自动滚动
  65. var autoFlowOptionsSheetController: KMAutoFlowOptionsSheetController?
  66. //AI相关
  67. var aiTipView: AITipIconView!
  68. var aiTypeChooseView: AITypeChooseView!
  69. //Search
  70. var searchIndex: Int = 0
  71. //Form
  72. var formAlertView: KMFormAlertView?
  73. //对比
  74. var isCompareModel: Bool = false {
  75. didSet {
  76. self.toolbarController.updataItemVisible()
  77. }
  78. }
  79. //密码弹窗
  80. var passwordWindow: KMPasswordInputWindow?
  81. private var _needSave = false
  82. var needSave: Bool {
  83. set {
  84. _needSave = newValue
  85. if (_needSave == false) {
  86. self.clearIsPDFDocumentEdited()
  87. self.hiddenSecureSuccessTip()
  88. }
  89. }
  90. get {
  91. return _needSave
  92. }
  93. }
  94. // 标识 pdf 已编辑
  95. fileprivate var _isPDFDocumentEdited = false
  96. // 标识 pdf文字图片已编辑
  97. internal var isPDFTextImageEdited = false
  98. var isPDFDocumentEdited: Bool {
  99. get {
  100. return _isPDFDocumentEdited
  101. }
  102. }
  103. var password: String?
  104. var leftSideViewController: KMLeftSideViewController = KMLeftSideViewController.init(type: KMLeftMethodMode())
  105. var rightSideViewController: KMRightSideViewController!
  106. var searchResults: [KMSearchMode] = []
  107. var mwcFlags: MwcFlags = MwcFlags()
  108. var isShowQuickTour: Bool = false
  109. var document: CPDFDocument?
  110. var myDocument: NSDocument?
  111. weak var browserWindowController: KMBrowserWindowController?
  112. var cropSettingWindowController: KMCropSettingWindowController!
  113. var currentWindowController: NSWindowController!
  114. // var interactionMode: SKInteractionMode = .SKNormalMode
  115. var savedNormalSetup: NSMutableDictionary = NSMutableDictionary()
  116. //数字签名
  117. var digitalSignController: KMPDFDigitalSignViewController?
  118. let CPDFOfficeLeftSidePaneWidthKey = "CPDFOfficeLeftSidePaneWidthKey"
  119. let CPDFOfficeRightSidePaneWidthKey = "CPDFOfficeRightSidePaneWidthKey"
  120. @IBOutlet weak var topTipBox: NSBox!
  121. @IBOutlet weak var exitFullButton: NSButton!
  122. var hasAddRedact: Bool = false
  123. var functionWidth: Double {
  124. get {
  125. if self.isReadMode {
  126. if !self.isShowBOTA {
  127. return 0
  128. }
  129. }
  130. return 48-4
  131. }
  132. }
  133. var isShowBOTA: Bool = false
  134. let panelWidth = 212.0
  135. let defaultRightWidth = 260.0
  136. var lastLeftPanWidth = 0.0
  137. var lastRightPanWidth = 0.0
  138. var leftPanelOpen: Bool = false
  139. var rightPanelIsOpen = false
  140. var pageNumber: UInt?
  141. var openSecondaryPdfView: KMSecondaryViewController?
  142. var secondaryPdfContentView: NSView?
  143. var lastSplitPDFHeight: Float = 0.0
  144. internal var isSaveKeyChain = true
  145. var rightMouseEventing = false
  146. var pdfEditController: KMPDFEditViewController? {
  147. get {
  148. return self.getPDFEditController()
  149. }
  150. }
  151. var autoSaveTimer: Timer?
  152. var progressController: SKProgressController?
  153. private var _documentFirstLoad: Bool = true
  154. var eventMonitor: Any?
  155. var keyEventMonitor: Any?
  156. var mouseRightMenuEvent: NSEvent?
  157. var aiTranslationWindow: KMAITranslationWindowController?
  158. var aiTranslationConfirWC: KMAITranslationConfirmWindowController?
  159. lazy private var homeVC: KMHomeViewController? = {
  160. let vc = KMHomeViewController()
  161. return vc
  162. }()
  163. private var background_mask: NSView?
  164. fileprivate var _secureOptions: [CPDFDocumentWriteOption : Any]?
  165. var secureOptions: [CPDFDocumentWriteOption : Any]? {
  166. get {
  167. return self._secureOptions
  168. }
  169. }
  170. var documentAttribute: [CPDFDocumentAttribute : Any]?
  171. fileprivate var _removeSecureFlag = false
  172. var removeSecureFlag: Bool {
  173. get {
  174. return self._removeSecureFlag
  175. }
  176. }
  177. fileprivate var _saveWatermarkFlag = false
  178. var saveWatermarkFlag: Bool {
  179. get {
  180. return self._saveWatermarkFlag
  181. }
  182. }
  183. var beforeMarkedPageIndex = NSNotFound
  184. var markedPageIndex = NSNotFound
  185. var beforeMarkedPagePoint = NSPoint.zero
  186. var markedPagePoint = NSPoint.zero
  187. var repeatTrialLoad: Bool = false
  188. var _mainWindow: NSWindow?
  189. var mainWindow: NSWindow? {
  190. get {
  191. return self._mainWindow
  192. }
  193. set {
  194. self._mainWindow = newValue
  195. }
  196. }
  197. deinit {
  198. NotificationCenter.default.removeObserver(self)
  199. self.stopAutoSaveTimer()
  200. self.removeEventMonitor()
  201. self.removeKeyEventMonitor()
  202. }
  203. override func awakeFromNib() {
  204. super.awakeFromNib()
  205. self.addBackgroundMaskView()
  206. // pdfSplitView.frame = NSMakeRect(0, 0, NSWidth(centerContentView.bounds), NSHeight(centerContentView.bounds)-1)
  207. // centerContentView.addSubview(pdfSplitView)
  208. self.PDFContendView.backgroundColor(NSColor.km_init(hex: "FFFFFF"))
  209. listView.delegate = self
  210. listView.pdfListViewDelegate = self
  211. // listView.editingConfig().isSupportMultipleSelectEditingArea = true
  212. if (document != nil) {
  213. // if (self.document!.isLocked) {
  214. //
  215. // } else {
  216. listView.document = document
  217. // }
  218. listView.document.delegate = self
  219. let autoScale = listView.autoScales
  220. if !autoScale {
  221. listView.scaleFactor = 1.0
  222. }
  223. }
  224. self.initPDFLeftViewVC()
  225. self.initRightSideView()
  226. self.toolbarController.listView = self.listView
  227. self.toolbarController.mainViewController = self
  228. self.leftSideViewController.mainViewController = self
  229. self.newPDFSplitView.delegate = self
  230. }
  231. override func viewDidAppear() {
  232. super.viewDidAppear()
  233. //刷新前一页后一页按钮
  234. self.updateNextAndPreViousButtonState()
  235. KMLightMemberManager.manager.canShowAdvancedView = false
  236. // Task { @MainActor in
  237. // await KMLightMemberManager.manager.canUseAdvanced(needNetworking: true)
  238. // }
  239. // self.addEventMonitor()
  240. self.view.window?.makeFirstResponder(self.listView)
  241. // 更新属性页面的信息
  242. NotificationCenter.default.post(name: KMInfoWindowC.windowDidBecomeMainNotification, object: self.myDocument)
  243. if (self.document == nil) {
  244. return
  245. }
  246. if (self.document == nil || self.document!.isLocked == false) {
  247. self.loadFunctionGuide()
  248. self.loadAIIconView()
  249. }
  250. if (self.document?.isLocked == false) {
  251. return
  252. }
  253. if (self.view.window == nil) {
  254. return
  255. }
  256. if (self.password != nil) {
  257. if self.listView.document.unlock(withPassword: self.password) {
  258. self.isSaveKeyChain = false
  259. return
  260. }
  261. }
  262. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
  263. if self.passwordWindow == nil {
  264. self.passwordWindow = KMPasswordInputWindow.openWindow(window: self.view.window!, url: self.document!.documentURL) { [unowned self] result , password in
  265. self.passwordWindow = nil
  266. if (result == .cancel) {
  267. self.browserWindowController?.browser.closeTab()
  268. return
  269. }
  270. self.isSaveKeyChain = true
  271. self.listView.document = self.document
  272. self.document?.unlock(withPassword: password)
  273. }
  274. } else {
  275. self.passwordWindow = nil
  276. }
  277. }
  278. }
  279. override func viewWillAppear() {
  280. super.viewWillAppear()
  281. // self.reStartAutoSaveTimer()
  282. //是否弹出登录窗口
  283. // self.needShowRegisterView()
  284. }
  285. override func viewWillDisappear() {
  286. super.viewWillDisappear()
  287. // KMPreferenceManager.shared.setPageNumber(self.listView.currentPageIndex, forKey: self.listView.document.documentURL.path)
  288. // self.pauseAutoSaveTimer()
  289. self.removeEventMonitor()
  290. }
  291. override func viewWillLayout() {
  292. super.viewWillLayout()
  293. if (KMTools.isFullScreen(self.view.window ?? NSWindow())) { // 全屏
  294. self.exitFullButton.isHidden = false
  295. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundFullScreenColor
  296. } else {
  297. self.exitFullButton.isHidden = true
  298. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundNormalColor
  299. }
  300. }
  301. override func viewDidLoad() {
  302. super.viewDidLoad()
  303. mwcFlags.settingUpWindow = 1
  304. toolbarController.delegate = self
  305. //TODO: 先让项目运行,看后面怎么调整这段逻辑,目前最外层是 KMBrowserWindowController
  306. toolbarBox.contentView = toolbarController.view
  307. // self.childToolbarController.updateType(newType: .Annatiton)
  308. // self.showChildToolbar(showToolbar: true)
  309. // self.toolbarController.editPDFButtonAction(item: NSMenuItem())
  310. if (UserDefaults.standard.object(forKey: CPDFOfficeLeftSidePaneWidthKey) != nil) {
  311. UserDefaults.standard.set(256, forKey: CPDFOfficeLeftSidePaneWidthKey)
  312. UserDefaults.standard.synchronize()
  313. }
  314. if (UserDefaults.standard.object(forKey: CPDFOfficeRightSidePaneWidthKey) != nil) {
  315. UserDefaults.standard.set(256, forKey: CPDFOfficeRightSidePaneWidthKey)
  316. UserDefaults.standard.synchronize()
  317. }
  318. let position = mianSplitView.maxPossiblePositionOfDivider(at: 1)
  319. mianSplitView.setPosition(position, ofDividerAt: 0)
  320. mianSplitView.setPosition(mianSplitView.minPossiblePositionOfDivider(at: 0), ofDividerAt: 0)
  321. pdfSplitView.setPosition(mianSplitView.maxPossiblePositionOfDivider(at: 1), ofDividerAt: 0)
  322. self.locationPageView.wantsLayer = true;
  323. self.locationPageView.layer?.backgroundColor = NSColor(red: 189.0/255.0, green: 223.0/255.0, blue: 253.0/255.0, alpha: 1).cgColor
  324. self.tipLabel.stringValue = NSLocalizedString("Please use the scroll bar, thumbnail tool to locate the target page, click or box the area to select the target range.", comment: "")
  325. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  326. if (self.listView.document != nil) {
  327. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document.documentURL.path)
  328. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document.documentURL.path)
  329. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < self.listView.document.pageCount) {
  330. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  331. if (pageScale != nil) {
  332. self.listView.scaleFactor = CGFloat(pageScale!)
  333. }
  334. self.listView.go(toPageIndex: pageNumber!, animated: false)
  335. }
  336. } else {
  337. self._goToFirstPageForFristAppear()
  338. }
  339. }
  340. } else {
  341. self._goToFirstPageForFristAppear()
  342. }
  343. //阅读页面
  344. readModelView.delegate = self
  345. pageNumberDisplayView.delegate = self
  346. tipCurrentPageBox.moveCallback = { [unowned self] mouseEntered, mouseBox in
  347. if mouseEntered {
  348. self.pageNumberDisplayView.hover = true
  349. // self.updatePageIndicatoreType()
  350. } else {
  351. self.pageNumberDisplayView.hover = false
  352. // self.updatePageIndicatoreType()
  353. }
  354. }
  355. NotificationCenter.default.addObserver(self, selector: #selector(rename(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerRename"), object: nil)
  356. NotificationCenter.default.addObserver(self, selector: #selector(closeTab(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerCloseTabs"), object: nil)
  357. NotificationCenter.default.addObserver(self, selector: #selector(showInFinder(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerShowInFinder"), object: nil)
  358. NotificationCenter.default.addObserver(self, selector: #selector(preferenceDidChangeNotification), name: KMPreferenceManager.didChangeNotification, object: nil)
  359. NotificationCenter.default.addObserver(self, selector: #selector(documentDidUnlockNotification), name: Notification.Name("CPDFDocumentDidUnlockNotification"), object: nil)
  360. NotificationCenter.default.addObserver(self, selector: #selector(annotationsAttributeHasChange), name: NSNotification.Name.CPDFListViewAnnotationsAttributeHasChange, object:nil)
  361. NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminateNotification), name: NSApplication.willTerminateNotification, object: nil)
  362. NotificationCenter.default.addObserver(self, selector: #selector(KMPDFViewCurrentPageDidChangedNotification), name: NSNotification.Name.init(rawValue: "KMPDFViewCurrentPageDidChanged"), object: nil)
  363. NotificationCenter.default.addObserver(self, selector: #selector(CPDFDocumentPageCountChangedNotification), name: NSNotification.Name.init(rawValue: "CPDFDocumentPageCountChangedNotification"), object: nil)
  364. NotificationCenter.default.addObserver(self, selector: #selector(CEditPDFToolModeChangeStateUnkownNotification), name: Notification.Name.init("CEditPDFToolModeChangeStateUnkown"), object: nil)
  365. NotificationCenter.default.addObserver(self, selector: #selector(handlePageChangedNotification), name: NSNotification.Name.CPDFViewPageChanged, object: self.listView)
  366. NotificationCenter.default.addObserver(self, selector: #selector(handleDisplayBoxChangedNotification), name: NSNotification.Name.CPDFViewDisplayBoxChanged, object: self.listView)
  367. // 互动模式
  368. NotificationCenter.default.addObserver(self, selector: #selector(willEnterInteractionModeNotification), name: NSWindow.willEnterInteractionModeNotification, object: nil)
  369. NotificationCenter.default.addObserver(self, selector: #selector(didEnterInteractionModeNotification), name: NSWindow.didEnterInteractionModeNotification, object: nil)
  370. NotificationCenter.default.addObserver(self, selector: #selector(willShowFullScreenNotification), name: NSWindow.willShowFullScreenNotification, object: nil)
  371. NotificationCenter.default.addObserver(self, selector: #selector(didShowFullScreenNotification), name: NSWindow.didShowFullScreenNotification, object: nil)
  372. NotificationCenter.default.addObserver(self, selector: #selector(didAddContentViewNotification), name: NSWindow.didAddContentViewNotification, object: nil)
  373. NotificationCenter.default.addObserver(self, selector: #selector(addAutoSaveEvent), name: AutoSaveManager.kTimeValueChangedNotificationName, object: nil)
  374. self.autoSaveTimeStartOrStopIfNeed()
  375. Task {
  376. self.addAutoSaveEvent()
  377. }
  378. self.toolbarController.selectItem(KMDocumentAnnotationToolbarItemIdentifier)
  379. self.closeRightPane()
  380. self.addKeyEventMonitor()
  381. self.addAdsBannerView()
  382. //检测OCR包是否需要更新
  383. #if VERSION_DMG
  384. KMResourceDownloadManager.manager.checkDocumentAIVersion()
  385. #endif
  386. // Open snapshots?
  387. var snapshotSetups: NSArray?
  388. // if (hasWindowSetup)
  389. // snapshotSetups = [savedNormalSetup objectForKey:SNAPSHOTS_KEY];
  390. // else if ([sud boolForKey:SKRememberSnapshotsKey])
  391. if KMPreferenceManager.shared.rememberSnapshot {
  392. // snapshotSetups = [[SKBookmarkController sharedBookmarkController] snapshotsForRecentDocumentAtURL:[(NSDocument *)[self document] fileURL]];
  393. if let fileUrl = (self.myDocument as? KMMainDocument)?.fileURL {
  394. snapshotSetups = SKBookmarkController.shared().snapshotsForRecentDocument(at: fileUrl) as NSArray?
  395. }
  396. }
  397. if let cnt = snapshotSetups?.count, cnt > 0 {
  398. if let data = self.listView?.document?.isLocked, data {
  399. self.savedNormalSetup.setObject(snapshotSetups, forKey: "snapshots" as NSCopying)
  400. } else {
  401. self.showSnapshots(setups: snapshotSetups)
  402. }
  403. }
  404. // [self applyPDFSettings:hasWindowSetup ? savedNormalSetup : [sud dictionaryForKey:SKDefaultPDFDisplaySettingsKey]];
  405. // self.applyPDFSettings((KMDataManager.ud_dictionary(forKey: SKDefaultPDFDisplaySettingsKey) as? NSDictionary) ?? [:])
  406. }
  407. //MARK: - KMToolbarViewControllerDelegate
  408. //MARK: - PDFListView
  409. func initPDFLeftViewVC() {
  410. var frame = self.leftView.frame
  411. frame.size.width += 44
  412. self.leftView.frame = frame
  413. leftSideViewController.listView = self.listView ?? CPDFListView()
  414. leftSideViewController.view.frame = CGRect(x: 0, y:0 , width: self.leftView.frame.size.width, height: self.leftView.frame.size.height)
  415. leftSideViewController.view.autoresizingMask = [.height,.width]
  416. leftSideViewController.delegate = self
  417. self.leftView.addSubview(leftSideViewController.view)
  418. }
  419. func initRightSideView() {
  420. self.rightSideViewController = KMRightSideViewController.init()
  421. self.rightSideViewController.view.frame = CGRect(x: 0, y: 0, width: self.rightView.frame.width, height: self.rightView.frame.size.height)
  422. self.rightSideViewController.view.autoresizingMask = [.height,.width]
  423. self.rightSideViewController.listView = self.listView
  424. // self.rightSideViewController.view.isHidden = true
  425. self.rightSideViewController.isHidden = true
  426. self.rightSideViewController.delegate = self
  427. self.rightView.addSubview(self.rightSideViewController.view)
  428. self.rightSideViewController.propertyDidChange = {
  429. [weak self] (model: AnyObject?) in
  430. let topBarView = self?.toolbarController.fetchTopBarView()
  431. if (topBarView == nil || ((topBarView?.isKind(of: KMWatermarkAdjectiveTopBarView.self)) == false)) {
  432. return
  433. }
  434. /// Bates码、页眉页脚、背景、水印
  435. if (model == nil) {
  436. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: false)
  437. } else {
  438. if ((model?.isKind(of: KMHeaderFooterObject.self))!) {
  439. if ((model as! KMHeaderFooterObject).hasVaild) {
  440. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: true)
  441. } else {
  442. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: false)
  443. }
  444. } else if ((model?.isKind(of: KMHeaderFooterObject.self))!) {
  445. if ((model as! KMHeaderFooterObject).hasVaild) {
  446. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: true)
  447. } else {
  448. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: false)
  449. }
  450. } else if ((model?.isKind(of: KMBackgroundModel.self))!) {
  451. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: true)
  452. } else if ((model?.isKind(of: KMWatermarkModel.self))!) {
  453. (topBarView as! KMWatermarkAdjectiveTopBarView).isCanApply(can: true)
  454. }
  455. }
  456. }
  457. }
  458. func addAdsBannerView() {
  459. #if VERSION_FREE
  460. if !IAPProductsManager.default().isAvailableAllFunction(){
  461. guard let document = self.listView.document else {
  462. return
  463. }
  464. if !document.isLocked {
  465. KMAdsManager.defaultManager.beginSheetModalForView(self.readContentView, directions: .down, adPosY: 30, animated: false) { pageIndex in
  466. }
  467. }
  468. }
  469. #endif
  470. //加载底部banner
  471. // - (void)loadingAdsManager {
  472. // #if VERSION_FREE
  473. // if(![self.pdfDocument isLocked]) {
  474. // if (![IAPProductsManager defaultManager].isAvailableAllFunction) {
  475. // [[KMAdsManager defaultManager] beginSheetModalForView:self.pdfView
  476. // directions:KMADViewDirectionsDown
  477. // animated:NO
  478. // completionHandler:nil];
  479. // }
  480. // [[NSNotificationCenter defaultCenter] addObserverForName:KMIAPProductPurchasedNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){
  481. // if ([IAPProductsManager defaultManager].isAvailableAllFunction) {
  482. // [[KMAdsManager defaultManager] dismissSheetModalForView:self.pdfView];
  483. // }
  484. // }];
  485. // [[NSNotificationCenter defaultCenter] addObserverForName:kDeviceActivateStatusChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note){
  486. // if ([IAPProductsManager defaultManager].isAvailableAllFunction) {
  487. // [[KMAdsManager defaultManager] dismissSheetModalForView:self.pdfView];
  488. // }
  489. // }];
  490. // }
  491. // #endif
  492. // }
  493. }
  494. // MARK: Private Methods
  495. internal func removeNotifications() {
  496. NotificationCenter.default.removeObserver(self)
  497. self.leftSideViewController.clearAnnotationFilterData()
  498. self.leftSideViewController.clearNotification()
  499. }
  500. func checkShouldAutoOpenLeftVC() {
  501. if KMPreference.shared.showLeftSideBar == false {
  502. return
  503. }
  504. if self.leftPanelOpen {
  505. return
  506. }
  507. Task { @MainActor in
  508. self.leftSideViewController.showThumbnail()
  509. self.toolbarController.findItem(KMLeftControlToolbarItemIdentifier)?.isSelected = true
  510. }
  511. }
  512. func applyLeftSideWidth(_ leftSideWidth: CGFloat, rightSideWidth: CGFloat) -> Void {
  513. mianSplitView.setPosition(leftSideWidth, ofDividerAt: 0)
  514. mianSplitView.setPosition(mianSplitView.maxPossiblePositionOfDivider(at: 1) - mianSplitView.dividerThickness - rightSideWidth, ofDividerAt: 1)
  515. lastLeftPanWidth = leftSideWidth
  516. lastRightPanWidth = rightSideWidth
  517. }
  518. //MARK: 动画 暂未接入
  519. func animateSplitView(to position: CGFloat) {
  520. let frame1 = NSRect(x: 0, y: 0, width: position, height: mianSplitView.frame.height)
  521. let frame2 = NSRect(x: position, y: 0, width: mianSplitView.frame.width - position, height: mianSplitView.frame.height)
  522. // 创建一个新的动画上下文
  523. let animationContext = NSAnimationContext.current
  524. animationContext.duration = 0.5
  525. animationContext.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
  526. // 启用隐式动画
  527. NSAnimationContext.current.allowsImplicitAnimation = true
  528. // 移动分隔条
  529. mianSplitView.setPosition(position, ofDividerAt: 0)
  530. mianSplitView.subviews[0].frame = frame1
  531. mianSplitView.subviews[1].frame = frame2
  532. }
  533. internal var removeAllAnnotationsStore = KMPDFViewRemoveAllAnnotationsStore()
  534. internal func removeAllAnnotations() {
  535. let alert = NSAlert()
  536. alert.messageText = NSLocalizedString("This will permanently remove all annotations. Are you sure to continue?", comment: "")
  537. alert.addButton(withTitle: NSLocalizedString("Yes", comment:""))
  538. alert.addButton(withTitle: NSLocalizedString("No", comment:""))
  539. if (alert.runModal() != .alertFirstButtonReturn) {
  540. return
  541. }
  542. DispatchQueue.main.async {
  543. self.removeAllAnnotationsStore.store(t: self.listView)
  544. }
  545. }
  546. // MARK: Set Methods
  547. var setDocument: CPDFDocument? {
  548. get {
  549. return document
  550. }
  551. set {
  552. if document != newValue {
  553. document = newValue
  554. }
  555. listView.document = document
  556. listView.document.delegate = self
  557. self.listView.layoutDocumentView()
  558. }
  559. }
  560. var setPageNumber: UInt {
  561. get {
  562. return pageNumber!
  563. }
  564. set {
  565. let pageCount = listView.document.pageCount
  566. var value = newValue
  567. if value > pageCount {
  568. value = pageCount
  569. }
  570. if value > 0 && listView.currentPage().pageIndex() != value-1 {
  571. listView.go(to: listView.document.page(at: value-1))
  572. }
  573. if pageNumber != value {
  574. pageNumber = value
  575. }
  576. }
  577. }
  578. // MARK: - 标记密文
  579. func enterRedact() {
  580. if !IAPProductsManager.default().isAvailableAllFunction(){
  581. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  582. return
  583. }
  584. if self.listView.document.allowsPrinting == false || self.listView.document.allowsCopying == false {
  585. Task {
  586. _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
  587. }
  588. return
  589. }
  590. if self.hasEnterRedact() {
  591. self.exitRedact()
  592. return
  593. }
  594. let ttsWindowC = KMTTSWindowController.share
  595. if ttsWindowC.pdfView?.document?.documentURL.path == self.listView.document.documentURL.path {
  596. if let data = ttsWindowC.window?.isVisible, data {
  597. ttsWindowC.stopSpeaking()
  598. ttsWindowC.close()
  599. }
  600. }
  601. NSColorPanel.shared.showsAlpha = false
  602. let controller = KMPDFRedactViewController(url: self.listView.document!.documentURL, password: self.listView.document.password)
  603. self.addChild(controller)
  604. self.PDFContendView.addSubview(controller.view)
  605. controller.view.frame = self.PDFContendView.bounds
  606. controller.view.autoresizingMask = [.width, .height]
  607. self.listView.isHidden = true
  608. controller.scaleFactor = self.listView.scaleFactor
  609. controller.titleBack = { [weak self] title in
  610. self?.view.window?.title = title
  611. }
  612. controller.callback = { [weak self] result, currentPageIndex, saveResult, saveUrl in
  613. if result == false { // 退出
  614. self?.exitRedact()
  615. return
  616. }
  617. let controller = self?._getPDFRedactController()
  618. controller?.redactPdfView.newAddAnnotation.removeAll()
  619. self?.exitRedact()
  620. if saveResult {
  621. let newDocument = CPDFDocument(url: saveUrl)
  622. if let data = newDocument?.isLocked, data {
  623. newDocument?.unlock(withPassword: self?.listView.document.password ?? "")
  624. }
  625. self?.document = newDocument
  626. self?.listView.document = newDocument
  627. self?.listView.layoutDocumentView()
  628. }
  629. }
  630. }
  631. func exitRedact() {
  632. let controller = self._getPDFRedactController()
  633. if let data = controller {
  634. if data.redactPdfView.newAddAnnotation.count > 0 {
  635. KMAlertTool.runModel(message: "", informative: KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction.", nil), buttons: [KMLocalizedString("Exit", nil), KMLocalizedString("Cancel", nil)]) { response in
  636. if response == .alertFirstButtonReturn {
  637. data.redactPdfView.newAddAnnotation.removeAll()
  638. self.exitRedact()
  639. }
  640. }
  641. return
  642. }
  643. }
  644. NSColorPanel.shared.showsAlpha = true
  645. self.toolbarController.findItem(KMDocumentRedactToolbarItemIdentifier)?.isSelected = false
  646. // self.toolbarController.toolbarType = .None
  647. // self.listView.toolMode = .moveToolMode
  648. controller?.redactPdfView.resignMonitor()
  649. controller?.view.removeFromSuperview()
  650. controller?.removeFromParent()
  651. self.listView.isHidden = false
  652. // self.listView.layoutDocumentView()
  653. // self.view.window?.makeFirstResponder(self.listView)
  654. self.listView.annotationType = .unkown
  655. }
  656. func hasEnterRedact() -> Bool {
  657. return self._getPDFRedactController() != nil
  658. }
  659. //MARK: - AI
  660. func loadAIIconView() -> Void {
  661. NotificationCenter.default.addObserver(self, selector: #selector(aiTipIconViewShowStateChangeNoti), name: NSNotification.Name(rawValue: "kAIIconShowStateChangeNotification"), object: nil)
  662. self.aiTipView = AITipIconView.createFromNib()
  663. self.aiTipView.clickHandle = { [weak self] view in
  664. self?.showAITypeChooseView()
  665. }
  666. self.aiTipView.rightClickHandle = { [weak self] view in
  667. AIInfoManager.default().showAIIcon = false
  668. NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kAIIconShowStateChangeNotification"), object: nil)
  669. }
  670. self.aiTipView.frame = CGRectMake(CGRectGetWidth(self.readContentView.frame)-84, CGRectGetHeight(self.readContentView.frame)-64-40, 72, 72)
  671. self.aiTipView.autoresizingMask = [.minXMargin, .minYMargin]
  672. self.readContentView.addSubview(self.aiTipView)
  673. self.updateAITipViewShowState()
  674. }
  675. func updateAITipViewShowState() {
  676. if AIInfoManager.default().showAIIcon {
  677. if self.view.window != nil {
  678. if self.isReadMode || KMTools.isFullScreen(self.view.window!) {
  679. self.aiTipView.isHidden = true
  680. } else {
  681. self.aiTipView.isHidden = false
  682. }
  683. } else {
  684. self.aiTipView.isHidden = false
  685. }
  686. } else {
  687. self.aiTipView.isHidden = true
  688. }
  689. }
  690. func showAITypeChooseView() -> Void {
  691. if AIInfoManager.default().aiInfo.infoDict.isEmpty == true {
  692. #if VERSION_DMG
  693. KMPurchaseCompareWindowController.dmgPurchaseInstance().showWindow(nil)
  694. #else
  695. AIPurchaseWindowController.currentWC().showWindow(nil)
  696. #endif
  697. return
  698. }
  699. let controller = NSViewController.init()
  700. let view = NSView.init()
  701. controller.view = view
  702. var string: String = NSLocalizedString("AI Summarize", comment: "")
  703. if string.count < NSLocalizedString("AI Rewrite", comment: "").count {
  704. string = NSLocalizedString("AI Rewrite", comment: "")
  705. }
  706. if string.count < NSLocalizedString("AI Proofread", comment: "").count {
  707. string = NSLocalizedString("AI Proofread", comment: "")
  708. }
  709. if string.count < NSLocalizedString("AI Translate", comment: "").count {
  710. string = NSLocalizedString("AI Translate", comment: "")
  711. }
  712. let font = NSFont.SFProTextRegularFont(13)
  713. var style = NSMutableParagraphStyle.init()
  714. style.alignment = .center
  715. style.lineBreakMode = .byCharWrapping
  716. let size: NSSize = string.boundingRect(with: NSSize(width: 1000, height: 100),
  717. options: NSString.DrawingOptions(rawValue: 3),
  718. attributes: [NSAttributedString.Key.font : NSFont.SFProTextRegularFont(13), NSAttributedString.Key.paragraphStyle : style]).size
  719. controller.view.frame = CGRectMake(0, 0, size.width+80, 160)
  720. if self.aiTypeChooseView == nil {
  721. self.aiTypeChooseView = AITypeChooseView.createFromNib()
  722. }
  723. self.aiTypeChooseView.clickHandle = { [weak self] view, type in
  724. DispatchQueue.main.async {
  725. self?.loadAIConfigWindowWithType(type)
  726. }
  727. }
  728. self.aiTypeChooseView.frame = controller.view.bounds
  729. self.aiTypeChooseView.autoresizingMask = [.width, .height]
  730. controller.view.addSubview(self.aiTypeChooseView)
  731. let popover = NSPopover.init()
  732. popover.contentViewController = controller
  733. popover.animates = true
  734. popover.behavior = .transient
  735. var rect = self.aiTipView.bounds
  736. rect.origin.y += 20
  737. popover.show(relativeTo: rect, of: self.aiTipView, preferredEdge: .minY)
  738. }
  739. func loadAIConfigWindowWithType(_ type: AIConfigType) -> Void {
  740. if AIInfoManager.default().aiInfo.infoDict.isEmpty == true {
  741. #if VERSION_DMG
  742. KMPurchaseCompareWindowController.dmgPurchaseInstance().showWindow(nil)
  743. #else
  744. AIPurchaseWindowController.currentWC().showWindow(nil)
  745. #endif
  746. return
  747. }
  748. let windowVC = AIConfigWindowController.currentWC()
  749. windowVC.configType = type
  750. if type == .summarize {
  751. windowVC.window?.setFrame(CGRectMake(0, 0, 800, 500), display: true)
  752. FMTrackEventManager.defaultManager.trackEvent(event: "AITools", withProperties: ["AITools_Btn": "AISum"])
  753. } else if type == .reWriting {
  754. windowVC.window?.setFrame(CGRectMake(0, 0, 800, 460), display: true)
  755. FMTrackEventManager.defaultManager.trackEvent(event: "AITools", withProperties: ["AITools_Btn": "AIRewrite"])
  756. } else if type == .proofreading {
  757. windowVC.window?.setFrame(CGRectMake(0, 0, 800, 460), display: true)
  758. FMTrackEventManager.defaultManager.trackEvent(event: "AITools", withProperties: ["AITools_Btn": "AIProofread"])
  759. } else if type == .translate {
  760. windowVC.window?.setFrame(CGRectMake(0, 0, 800, 545), display: true)
  761. FMTrackEventManager.defaultManager.trackEvent(event: "AITools", withProperties: ["AITools_Btn": "AITranslate"])
  762. }
  763. windowVC.cancelHandle = { [weak self] windowVC in
  764. self?.view.window?.endSheet(windowVC.window!)
  765. }
  766. windowVC.refreshUI()
  767. self.view.window?.beginSheet(windowVC.window!)
  768. windowVC.refreshUI()
  769. }
  770. @objc func aiTipIconViewShowStateChangeNoti() {
  771. self.updateAITipViewShowState()
  772. }
  773. //MARK: - 引导
  774. func loadFunctionGuide() -> Void {
  775. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  776. if self.view.window != nil {
  777. self.loadOpenFileFunctionGuide(.openFileNormal)
  778. }
  779. }
  780. }
  781. func loadOpenFileFunctionGuide(_ showType: KMGuideInfoType) -> Void {
  782. if showType == .openFileNormal && KMGuideInfoWindowController.availableShow(.openFileNormal) {
  783. let leftPanelItem:KMToolbarItemView = self.toolbarController.findItem("KMLeftControlToolbarItemIdentifier")!
  784. let guideWC = KMGuideInfoWindowController.currentWC()
  785. guideWC.type = .openFileNormal
  786. guideWC.openPanelRect = (self.view.window?.contentView?.convert(leftPanelItem.frame, from: leftPanelItem.superview)) ?? CGRectZero
  787. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  788. guideWC.normalGuideFinishHandle = { [weak self] windowVC in
  789. let rightPanelItem = self?.toolbarController.findItem(KMRightControlToolbarItemIdentifier)
  790. let digitalPanelItem = self?.toolbarController.findItem(KMDocumentDigitalSignToolbarItemIdentifier)
  791. windowVC.rightPanelRect = (self!.view.window?.contentView?.convert(rightPanelItem?.frame ?? .zero, from: rightPanelItem?.superview)) ?? .zero
  792. guideWC.digitalBoxRect = (self!.view.window?.contentView?.convert(digitalPanelItem?.frame ?? .zero, from: digitalPanelItem?.superview)) ?? .zero
  793. }
  794. guideWC.finishHandle = { [weak self] windowVC, type in
  795. if type == .windowNewFinish ||
  796. type == . windowDigitalFinish {
  797. self?.checkFirstTrialController()
  798. }
  799. }
  800. guideWC.openFileToggleHandle = { [weak self] windowVC, type in
  801. self?.checkFirstTrialController()
  802. }
  803. var rect = self.view.window!.frame
  804. rect.size.height -= 20
  805. guideWC.window?.setFrame(rect, display: false)
  806. guideWC.window?.minSize = rect.size
  807. guideWC.window?.maxSize = rect.size
  808. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  809. guideWC.show()
  810. } else if showType == .digitalSignGuide && KMGuideInfoWindowController.availableShow(.digitalSignGuide) {
  811. let guideWC = KMGuideInfoWindowController.currentWC()
  812. guideWC.type = .digitalSignGuide
  813. let digitalPanelItem:KMToolbarItemView = self.toolbarController.findItem(KMDocumentDigitalSignToolbarItemIdentifier)!
  814. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview))!
  815. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  816. guideWC.finishHandle = { [weak self] windowVC, type in
  817. self?.checkFirstTrialController()
  818. }
  819. var rect = self.view.window!.frame
  820. rect.size.height -= 20
  821. guideWC.window?.setFrame(rect, display: false)
  822. guideWC.window?.minSize = rect.size
  823. guideWC.window?.maxSize = rect.size
  824. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  825. guideWC.show()
  826. } else if showType == .pdfCompareGuide && KMGuideInfoWindowController.availableShow(.pdfCompareGuide) {
  827. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  828. let guideWC = KMGuideInfoWindowController.currentWC()
  829. guideWC.type = .pdfCompareGuide
  830. let digitalPanelItem:KMToolbarItemView = self.toolbarController.findItem(KMDocumentDigitalSignToolbarItemIdentifier)!
  831. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview))!
  832. let compareItem:KMToolbarItemView = self.toolbarController.findItem(KMToolbarComparisonItemIdentifier)!
  833. guideWC.compareItemRect = (self.view.window?.contentView?.convert(compareItem.frame, from: compareItem.superview))!
  834. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  835. var rect = self.view.window!.frame
  836. rect.size.height -= 20
  837. guideWC.window?.setFrame(rect, display: false)
  838. guideWC.window?.minSize = rect.size
  839. guideWC.window?.maxSize = rect.size
  840. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  841. guideWC.show()
  842. }
  843. } else if showType == .convertGuide && KMGuideInfoWindowController.availableShow(.convertGuide) {
  844. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  845. let guideWC = KMGuideInfoWindowController.currentWC()
  846. guideWC.type = .convertGuide
  847. let digitalPanelItem:KMToolbarItemView = self.toolbarController.findItem(KMDocumentDigitalSignToolbarItemIdentifier)!
  848. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview))!
  849. guideWC.purchaseHandle = { [weak self] windowVC in
  850. #if VERSION_DMG
  851. if IAPProductsManager.default().isAvailableAllFunction() {
  852. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  853. //Convert:
  854. self?.showAllConvertWindow(convertT: .Word)
  855. } else {
  856. let limitWC = KMPurchaseLimitWindowController.currentLimitWC()
  857. limitWC.continueBlock = { [weak self] windowController in
  858. }
  859. limitWC.window?.center()
  860. limitWC.showWindow(nil)
  861. }
  862. } else {
  863. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  864. }
  865. #else
  866. if IAPProductsManager.default().isAvailableAllFunction() {
  867. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  868. //Convert:
  869. } else {
  870. var vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 1)
  871. vc.showWindow(nil)
  872. }
  873. } else {
  874. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  875. }
  876. #endif
  877. }
  878. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  879. var rect = self.view.window!.frame
  880. rect.size.height -= 20
  881. guideWC.window?.setFrame(rect, display: false)
  882. guideWC.window?.minSize = rect.size
  883. guideWC.window?.maxSize = rect.size
  884. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  885. guideWC.show()
  886. }
  887. } else {
  888. }
  889. }
  890. func checkFirstTrialController() -> Void {
  891. #if VERSION_DMG
  892. //打开文档后引导相关
  893. if VerificationManager.default().status == .none {
  894. let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
  895. let lastVersion = UserDefaults.standard.object(forKey: "SKLastTrialVersionMainDocumentLaunchedKey") as? String ?? ""
  896. if lastVersion == nil ||
  897. lastVersion != appVersion {
  898. UserDefaults.standard.setValue(appVersion, forKey: "SKLastTrialVersionMainDocumentLaunchedKey")
  899. UserDefaults.standard.synchronize()
  900. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  901. }
  902. }
  903. #endif
  904. }
  905. // MARK: - 页面编辑
  906. open func enterPageEdit(_ pages: [Int] = []) {
  907. //选中page
  908. var tPages = pages
  909. if tPages.count == 0 {
  910. tPages = self.leftSideViewController.thumb_fetchSelectedRows() ?? [self.listView.currentPageIndex]
  911. }
  912. if (hasEnterPageEdit()) {
  913. exitPageEdit()
  914. return
  915. }
  916. if (self.toolbarController != nil && self.toolbarController.mainToolBarView != nil) {
  917. let toolBarView: KMToolbarViewController = self.toolbarController.mainToolBarView!
  918. for (key, value) in toolBarView.toolbarItems {
  919. if (key == KMRightControlToolbarItemIdentifier || key == KMLeftControlToolbarItemIdentifier) {
  920. (value as! KMToolbarItemView).unEnabled = true
  921. }
  922. }
  923. }
  924. let controller = KMPDFEditViewController(self.listView.document)
  925. controller.selectedPages = tPages
  926. controller.listView = self.listView
  927. self.addChild(controller)
  928. self.PDFContendView.addSubview(controller.view)
  929. controller.view.frame = self.PDFContendView.bounds
  930. controller.view.autoresizingMask = [.width,.height]
  931. self.listView.isHidden = true
  932. controller.itemClick = { [weak self] index, params in
  933. if (index == 1) { /// 双击退出
  934. self?.enterEditMode(self!.leftSideViewController, [])
  935. DispatchQueue.main.async {
  936. let pageIndex: Int = params.first as! Int
  937. self?.listView.go(toPageIndex: pageIndex, animated: true)
  938. }
  939. } else if (index == 2) { // 打印
  940. self?.showPrintWindow(pageRange: KMPrintPageRange(type: .custom, selectPages: params.first as! [Int]))
  941. }
  942. }
  943. controller.documentEditedCallback = { [weak self] params in
  944. self?.recordIsPDFDocumentEdited()
  945. }
  946. controller.selectionDidChange = { [weak self] selectedIndexs in
  947. var indexSet = IndexSet()
  948. for indexPath in selectedIndexs {
  949. indexSet.insert(indexPath.item)
  950. }
  951. if indexSet.count != 0 {
  952. // self?.leftSideViewController.thumbnailViewController.selectPages(indexs: indexSet, needScroll: true)
  953. // self?.listView.go(toPageIndex: indexSet.first!, animated: false)
  954. }
  955. }
  956. }
  957. open func exitPageEdit() {
  958. if (self.toolbarController != nil && self.toolbarController.mainToolBarView != nil) {
  959. let toolBarView: KMToolbarViewController = self.toolbarController.mainToolBarView!
  960. for (key, value) in toolBarView.toolbarItems {
  961. if (key == KMRightControlToolbarItemIdentifier || key == KMLeftControlToolbarItemIdentifier) {
  962. (value as! KMToolbarItemView).unEnabled = false
  963. }
  964. }
  965. }
  966. let editController = getPDFEditController()
  967. if (editController == nil) {
  968. return
  969. }
  970. self.listView.annotationType = .highlight
  971. editController?.view.removeFromSuperview()
  972. editController?.removeFromParent()
  973. self.listView.isHidden = false
  974. self.listView.layoutDocumentView()
  975. self.view.window?.makeFirstResponder(self.listView)
  976. self.listView.annotationType = .unkown
  977. self.listView.go(toPageIndex: editController!.listViewCurrentIndex, animated: false)
  978. if let data = editController?.isEdited, data {
  979. self.leftSideViewController.reloadThumbnailDataIfNeed()
  980. }
  981. }
  982. open func hasEnterPageEdit() -> Bool {
  983. return self.getPDFEditController() != nil
  984. }
  985. // MARK: - Private Methods
  986. private func getPDFEditController() -> KMPDFEditViewController? {
  987. var editController: KMPDFEditViewController?
  988. for controller in self.children {
  989. if (controller.isKind(of: KMPDFEditViewController.self)) {
  990. editController = (controller as! KMPDFEditViewController)
  991. break
  992. }
  993. }
  994. return editController
  995. }
  996. private func _getPDFRedactController() -> KMPDFRedactViewController? {
  997. var controller: KMPDFRedactViewController?
  998. for childC in self.children {
  999. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  1000. controller = (childC as! KMPDFRedactViewController)
  1001. break
  1002. }
  1003. }
  1004. return controller
  1005. }
  1006. private func addBackgroundMaskView() {
  1007. self.removeBackgroundMaskView()
  1008. if let superview = self.mianSplitView.superview {
  1009. let view = NSView()
  1010. superview.addSubview(view)
  1011. view.frame = superview.bounds
  1012. view.autoresizingMask = [.width, .height]
  1013. view.wantsLayer = true
  1014. view.layer?.backgroundColor = .white
  1015. self.background_mask = view
  1016. }
  1017. }
  1018. private func removeBackgroundMaskView() {
  1019. self.background_mask?.removeFromSuperview()
  1020. self.background_mask = nil
  1021. }
  1022. private func _goToFirstPageForFristAppear() {
  1023. DispatchQueue.main.asyncAfter(wallDeadline: .now()+0.1) {
  1024. self.listView.go(toPageIndex: 0, animated: false)
  1025. }
  1026. }
  1027. func isFileGreaterThan10MB(atPath filePath: String) -> Bool {
  1028. let fileManager = FileManager.default
  1029. do {
  1030. let fileAttributes = try fileManager.attributesOfItem(atPath: filePath)
  1031. if let fileSize = fileAttributes[.size] as? UInt64 {
  1032. let megabyteSize = fileSize / (1024 * 1024)
  1033. return megabyteSize >= 10
  1034. }
  1035. } catch {
  1036. KMPrint("Error: \(error)")
  1037. }
  1038. return false
  1039. }
  1040. func isPDFPageCountExceedsLimit(filePath: String) -> Bool {
  1041. let url = URL(fileURLWithPath: filePath)
  1042. guard let document = PDFDocument(url: url) else {
  1043. return false
  1044. }
  1045. let pageCount = document.pageCount
  1046. return pageCount > 30
  1047. }
  1048. // MARK: Redact 【标记密文】
  1049. func exeRedactConfirm(_ type: KMRedactConfirmType, callback: @escaping () -> ()?) {
  1050. let windowController = KMRedactConfirmWindowController(type)
  1051. self.currentWindowController = windowController
  1052. self.view.window?.beginSheet(windowController.window!)
  1053. windowController.itemClick = { [weak self] index in
  1054. if (index == 2) { /// 取消
  1055. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  1056. self?.currentWindowController = nil
  1057. callback()
  1058. return
  1059. }
  1060. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  1061. self?.currentWindowController = nil
  1062. let panel = NSSavePanel()
  1063. panel.nameFieldStringValue = "[新文件]"+(self?.listView.document.documentURL.lastPathComponent)!
  1064. let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
  1065. button.state = .on
  1066. panel.accessoryView = button
  1067. panel.isExtensionHidden = true
  1068. panel.beginSheetModal(for: (self?.view.window!)!) { response in
  1069. if response != .OK {
  1070. callback()
  1071. return
  1072. }
  1073. if (type == .redactOne) {
  1074. let anno = self!.listView.activeAnnotation
  1075. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  1076. callback()
  1077. return
  1078. }
  1079. (anno as! CPDFRedactAnnotation).applyRedaction()
  1080. } else if (type == .redactAll) {
  1081. self?.listView.document.applyRedactions()
  1082. } else if (type == .eraserOne) {
  1083. let anno = self!.listView.activeAnnotation
  1084. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  1085. callback()
  1086. return
  1087. }
  1088. anno?.page.erasureRedact(from: anno!.bounds)
  1089. } else if (type == .eraserAll) {
  1090. KMRedactTools.eraserDocument((self?.listView.document)!) { result, errorAnno in
  1091. if (result == false) {
  1092. callback()
  1093. return
  1094. }
  1095. }
  1096. }
  1097. self!.listView.document.write(to: panel.url)
  1098. if (button.state == .on) {
  1099. NSDocumentController.shared.openDocument(withContentsOf: panel.url!, display: true) { document, alreadyOpen, error in
  1100. }
  1101. } else {
  1102. NSWorkspace.shared.activateFileViewerSelecting([panel.url!])
  1103. }
  1104. callback()
  1105. }
  1106. }
  1107. }
  1108. // MARK: Secure 【安全】
  1109. public func showSecureSuccessTip() {
  1110. let view: NSView = self.view
  1111. let tip = KMSecureEncryptSuccessTipView()
  1112. let size = NSSize(width: 379, height: 176)
  1113. tip.frame = NSMakeRect(view.frame.size.width-size.width-16, view.frame.size.height-size.height-88, size.width, size.height)
  1114. tip.autoresizingMask = [.minXMargin, .minYMargin]
  1115. view.addSubview(tip)
  1116. tip.itemClick = { [weak self] in
  1117. self!.hiddenSecureSuccessTip()
  1118. }
  1119. }
  1120. public func hiddenSecureSuccessTip() {
  1121. let view: NSView = self.view
  1122. var tip: KMSecureEncryptSuccessTipView?
  1123. for subview in view.subviews {
  1124. if (subview.isKind(of: KMSecureEncryptSuccessTipView.self)) {
  1125. tip = (subview as! KMSecureEncryptSuccessTipView)
  1126. break
  1127. }
  1128. }
  1129. if (tip == nil) {
  1130. return
  1131. }
  1132. tip?.removeFromSuperview()
  1133. }
  1134. public func showSecureLimitTip() {
  1135. self.hiddenSecureLimitTip()
  1136. let tip = KMSecureAlertView()
  1137. tip.show(in: self.listView)
  1138. tip.closeAction = { [unowned self] view in
  1139. self.hiddenSecureLimitTip()
  1140. }
  1141. tip.passwordAction = { [unowned self] view in
  1142. self.removeOwnerPassword()
  1143. }
  1144. }
  1145. func removeOwnerPassword() {
  1146. guard let doc = self.listView?.document else {
  1147. NSSound.beep()
  1148. return
  1149. }
  1150. if doc.allowsCopying && doc.allowsPrinting {
  1151. NSSound.beep()
  1152. return
  1153. }
  1154. KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: doc.documentURL) { [weak self] result, password in
  1155. if result == .cancel { /// 关闭
  1156. return
  1157. }
  1158. /// 解密成功
  1159. self?.hiddenSecureLimitTip()
  1160. self?.isSaveKeyChain = false
  1161. self?.listView.document.unlock(withPassword: password)
  1162. }
  1163. }
  1164. public func hiddenSecureLimitTip() {
  1165. let view: NSView = self.view
  1166. var tip: KMSecureAlertView?
  1167. for subview in view.subviews {
  1168. if (subview.isKind(of: KMSecureAlertView.self)) {
  1169. tip = (subview as! KMSecureAlertView)
  1170. break
  1171. }
  1172. }
  1173. if (tip == nil) {
  1174. return
  1175. }
  1176. tip?.removeFromSuperview()
  1177. }
  1178. override func mouseMoved(with event: NSEvent) {
  1179. self.view.window?.mouseMoved(with: event)
  1180. }
  1181. func savePageNumberIfNeed() {
  1182. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  1183. let scaleFactor = self.listView?.scaleFactor ?? 0
  1184. if scaleFactor <= 0 {
  1185. return
  1186. }
  1187. if self.listView.document != nil {
  1188. KMPreferenceManager.shared.setPageNumber(self.listView.currentPageIndex, forKey: self.listView.document.documentURL.path)
  1189. KMPreferenceManager.shared.setPageScale(Float(self.listView.scaleFactor), forKey: self.listView.document.documentURL.path)
  1190. }
  1191. }
  1192. }
  1193. // MARK: -
  1194. // MARK: 退出全屏
  1195. @IBAction func exitFullScreen(_ sender: Any) {
  1196. if (self.view.window == nil) {
  1197. return
  1198. }
  1199. if (KMTools.isFullScreen(self.view.window!)) {
  1200. self.view.window?.toggleFullScreen(nil)
  1201. }
  1202. }
  1203. // MARK: -
  1204. // MARK: 显示合并窗口
  1205. public func showMergeWindow(url: URL? = nil, _ password: String?) {
  1206. DispatchQueue.main.async {
  1207. var documentURL = url
  1208. if documentURL == nil {
  1209. documentURL = self.listView.document.documentURL
  1210. }
  1211. guard let _url = documentURL else { return }
  1212. let document = PDFDocument(url: _url)
  1213. let windowController = KMMergeWindowController(document: document!, password: password ?? "")
  1214. windowController.oriDucumentUrl = self.listView.document.documentURL
  1215. windowController.pageIndex = self.listView.currentPageIndex
  1216. self.currentWindowController = windowController
  1217. windowController.cancelAction = { [unowned self] controller in
  1218. self.view.window?.endSheet((self.currentWindowController.window)!)
  1219. self.currentWindowController = nil
  1220. }
  1221. windowController.mergeAction = { [unowned self] controller, filePath in
  1222. self.view.window?.endSheet((self.currentWindowController.window)!)
  1223. self.currentWindowController = nil
  1224. let newDocument = CPDFDocument(url: NSURL(fileURLWithPath: filePath) as URL)
  1225. if let data = newDocument?.isLocked, data {
  1226. newDocument?.unlock(withPassword: self.listView.document.password ?? "")
  1227. }
  1228. self.setDocument = newDocument
  1229. self.leftSideViewController.refreshUIForDocumentChanged()
  1230. }
  1231. self.toolbarController.cancelSelected(KMToolbarToolMergeItemIdentifier)
  1232. self.view.window?.beginSheet(windowController.window!)
  1233. }
  1234. }
  1235. // MARK: -
  1236. // MARR: 显示加密弹窗
  1237. public func showSecureWindow(_ url: URL) {
  1238. let controller = KMSecurityWindowController(windowNibName: "KMSecurityWindowController")
  1239. controller.documentURL = self.listView.document.documentURL
  1240. self.currentWindowController = controller
  1241. controller.batchAction = { [unowned self] controller, files in
  1242. self.view.window?.endSheet((self.currentWindowController.window)!)
  1243. self.currentWindowController = nil
  1244. self.toolbarController.cancelSelected(KMToolbarToolCompressItemIdentifier)
  1245. let batchWindowController = KMBatchOperateWindowController.sharedWindowController
  1246. // batchWindowController.window?.makeKeyAndOrderFront("")
  1247. let batchOperateFile = KMBatchOperateFile(filePath: self.document?.documentURL.path ?? "", type: .AddPassword)
  1248. batchWindowController.switchToOperateType(.AddPassword, files: [batchOperateFile])
  1249. batchWindowController.window?.makeKeyAndOrderFront("")
  1250. }
  1251. controller.doneAction = { [unowned self] controller, options, attribute in
  1252. // let windowController_secure = self.currentWindowController as! KMSecureEncryptWindowController
  1253. let openPanel = NSOpenPanel()
  1254. openPanel.canChooseFiles = false
  1255. openPanel.canChooseDirectories = true
  1256. openPanel.canCreateDirectories = true
  1257. openPanel.beginSheetModal(for: NSWindow.currentWindow()) { (result) in
  1258. if result == NSApplication.ModalResponse.OK {
  1259. for fileURL in openPanel.urls {
  1260. let document = CPDFDocument(url: self.document?.documentURL)
  1261. if document != nil {
  1262. document!.setDocumentAttributes(attribute)
  1263. let path = fileURL.path.stringByAppendingPathComponent(url.lastPathComponent)
  1264. let success = document!.write(to: NSURL(fileURLWithPath: path) as URL, withOptions: options)
  1265. if success {
  1266. self.view.window?.endSheet((self.currentWindowController.window)!)
  1267. self.currentWindowController = nil
  1268. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: path)])
  1269. }
  1270. }
  1271. }
  1272. }
  1273. }
  1274. }
  1275. controller.cancelAction = { [unowned self] controller in
  1276. self.view.window?.endSheet((self.currentWindowController.window)!)
  1277. self.currentWindowController = nil
  1278. }
  1279. NSWindow.currentWindow().beginSheet(controller.window!)
  1280. }
  1281. // MARK: -
  1282. // MARK: 保存文档
  1283. internal func needSaveDocument() -> Bool {
  1284. if (self.isPDFDocumentEdited) {
  1285. return self.isPDFDocumentEdited
  1286. }
  1287. if (self.needSave) {
  1288. return self.needSave
  1289. }
  1290. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  1291. if (document?.isDocumentEdited == nil || document!.isDocumentEdited == false) {
  1292. return false
  1293. }
  1294. return true
  1295. }
  1296. internal func saveDocument(overlookDocumentIfEdited overlook: Bool = false) {
  1297. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  1298. if (overlook) {
  1299. document?.save(nil)
  1300. return
  1301. }
  1302. if (self.isPDFDocumentEdited) {
  1303. self.clearIsPDFDocumentEdited()
  1304. self.needSave = false
  1305. document?.save(nil)
  1306. return
  1307. }
  1308. if (document?.isDocumentEdited == nil || document!.isDocumentEdited == false) {
  1309. return
  1310. }
  1311. document?.save(nil)
  1312. }
  1313. internal func asyncSaveDocument(overlookDocumentIfEdited overlook: Bool = false, callback:@escaping KMCommonBlock) {
  1314. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  1315. if (overlook) {
  1316. DispatchQueue.main.async {
  1317. document?.save(nil)
  1318. callback()
  1319. }
  1320. return
  1321. }
  1322. if (self.isPDFDocumentEdited) {
  1323. self.clearIsPDFDocumentEdited()
  1324. self.needSave = false
  1325. DispatchQueue.main.async {
  1326. document?.save(nil)
  1327. callback()
  1328. }
  1329. return
  1330. }
  1331. if (document?.isDocumentEdited == nil || document!.isDocumentEdited == false) {
  1332. callback()
  1333. return
  1334. }
  1335. DispatchQueue.main.async {
  1336. document?.save(nil)
  1337. callback()
  1338. }
  1339. }
  1340. internal func saveDocumentWithProgressAlert(callback:@escaping KMCommonBlock) {
  1341. // 显示进度
  1342. self.showProgressWindow(message: NSLocalizedString("Save PDF", comment: ""))
  1343. self.progressController?.maxValue = 3.0
  1344. self.progressController?.increment(by: 1.0)
  1345. // 保存文档
  1346. self.asyncSaveDocument { [unowned self] params in
  1347. // 执行进度 [假进度]
  1348. self.progressController?.increment(by: 1.0)
  1349. self.progressController?.increment(by: 1.0)
  1350. // DispatchQueue.main.async {
  1351. DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
  1352. // 隐藏进度
  1353. self.hiddenProgressWindow()
  1354. // 回调
  1355. callback()
  1356. }
  1357. }
  1358. }
  1359. // MARK: - 定时保存
  1360. func addAutoSaveEvent() {
  1361. if (self.autoSaveTimer != nil) {
  1362. self.autoSaveTimer?.invalidate()
  1363. self.autoSaveTimer = nil
  1364. }
  1365. if self.document != nil {
  1366. self.autoSaveTimer = Timer.scheduledTimer(withTimeInterval: AutoSaveManager.manager.timeInterval * 60, repeats: true, block: { [weak self] timer in
  1367. self?.autoSaveTimerAction(timer)
  1368. })
  1369. }
  1370. self.checkAutoSaveInfo()
  1371. }
  1372. func checkAutoSaveInfo() {
  1373. guard let cnt = AutoSaveManager.manager.autoSavePaths?.count, cnt > 0 else {
  1374. return
  1375. }
  1376. if AutoSaveManager.manager.autoSaveAlertShow {
  1377. return
  1378. }
  1379. AutoSaveManager.manager.autoSaveDidEndAction = false
  1380. AutoSaveManager.manager.autoSaveAlertShow = true
  1381. let blockSaveWindow = AutoSavePopController()
  1382. blockSaveWindow.cancelHandle = { [weak self] windowController in
  1383. AutoSaveManager.manager.autoSaveDidEndAction = true
  1384. AutoSaveManager.manager.clearCache()
  1385. self?.km_quick_endSheet()
  1386. }
  1387. blockSaveWindow.confirmHandle = { [weak self] windowController in
  1388. self?.km_quick_endSheet()
  1389. self?.saveAutoSaveInfo()
  1390. }
  1391. self.km_beginSheet(windowC: blockSaveWindow)
  1392. }
  1393. func saveAutoSaveInfo() {
  1394. let openPanel = NSOpenPanel()
  1395. openPanel.canChooseDirectories = true
  1396. openPanel.canChooseFiles = false
  1397. openPanel.allowsMultipleSelection = false
  1398. let win = NSApp.keyWindow != nil ? NSApp.keyWindow : self.view.window
  1399. openPanel.beginSheetModal(for: win!) { result in
  1400. if (result == .OK) {
  1401. let folderPath = openPanel.url?.path ?? openPanel.url?.absoluteString
  1402. for path in AutoSaveManager.manager.opendPaths ?? [] {
  1403. let _path = path as? String
  1404. var newPath = "\(folderPath ?? "")/\(_path?.lastPathComponent ?? "")"
  1405. newPath = self.getValidFilePath(newPath)
  1406. do {
  1407. try FileManager.default.moveItem(atPath: _path ?? "", toPath: newPath)
  1408. } catch {
  1409. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: newPath)])
  1410. }
  1411. }
  1412. AutoSaveManager.manager.clearCache()
  1413. }
  1414. AutoSaveManager.manager.autoSaveDidEndAction = true
  1415. }
  1416. }
  1417. func autoSaveTimerAction(_ timer: Timer) {
  1418. if (self.document == nil || self.listView?.document?.documentURL.path == nil) {
  1419. return
  1420. }
  1421. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  1422. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  1423. return
  1424. }
  1425. if let data = self.document?.isLocked, data {
  1426. return
  1427. }
  1428. if AutoSaveManager.manager.autoSaveEnabled == false {
  1429. return
  1430. }
  1431. let documentArray = NSDocumentController.shared.documents
  1432. var didFileEdit = false
  1433. for doc in documentArray {
  1434. if doc.fileURL?.path == self.document?.documentURL.path {
  1435. didFileEdit = doc.isDocumentEdited
  1436. break
  1437. }
  1438. }
  1439. if (didFileEdit == false) {
  1440. return
  1441. }
  1442. AutoSaveManager.manager.isSaving = true
  1443. let savePath = AutoSaveManager.manager.autoSaveWithPath(self.listView?.document?.documentURL.path ?? "")
  1444. if (!self.document!.isLocked) {
  1445. self.document?.write(to: URL(fileURLWithPath: savePath))
  1446. }
  1447. DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
  1448. AutoSaveManager.manager.isSaving = false
  1449. }
  1450. }
  1451. func removeAutoSaveInfo() {
  1452. if self.autoSaveTimer != nil {
  1453. self.autoSaveTimer?.invalidate()
  1454. self.autoSaveTimer = nil
  1455. }
  1456. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  1457. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  1458. return
  1459. }
  1460. if AutoSaveManager.manager.autoSaveEnabled == false {
  1461. return
  1462. }
  1463. if self.document == nil || self.listView?.document?.documentURL.path == nil {
  1464. return
  1465. }
  1466. AutoSaveManager.manager.removeAutoSavePath(self.listView?.document?.documentURL.path ?? "")
  1467. }
  1468. // MARK: -
  1469. // MARK: 选择 PDFDisplay 模式
  1470. @objc public func selectDisplay(display: KMPDFDisplayType, viewSettingIsReload: Bool = true) {
  1471. let toolModel = self.listView.toolMode
  1472. self.isReadMode = false
  1473. switch display {
  1474. case .singlePage:
  1475. self.listView.setDisplay(.singlePage)
  1476. break
  1477. case .singlePageContinuous:
  1478. self.listView.setDisplay(.singlePageContinuous)
  1479. break
  1480. case .twoUp:
  1481. self.listView.setDisplay(.twoUp)
  1482. break
  1483. case .twoUpContinuous:
  1484. self.listView.setDisplay(.twoUpContinuous)
  1485. break
  1486. case .bookMode:
  1487. self.listView.displaysAsBook = true
  1488. self.listView.displayTwoUp = true
  1489. self.listView.displayDirection = .horizontal
  1490. break
  1491. case .bookContinuous:
  1492. self.listView.displaysAsBook = true
  1493. self.listView.displayTwoUp = true
  1494. self.listView.displayDirection = .vertical
  1495. break
  1496. case .readModel:
  1497. self.openReadModel()
  1498. break
  1499. case .readContinuous:
  1500. self.openReadModel()
  1501. break
  1502. }
  1503. self.listView.layoutDocumentView()
  1504. // if (viewSettingIsReload && self.leftSideViewController.panelSetViewController.isViewLoaded) {
  1505. // self.leftSideViewController.panelSetViewController.reloadListViewModel()
  1506. // }
  1507. if (toolModel == .editPDFToolMode) {
  1508. if self.rightSideViewController.eidtPDFImageProperty != nil {
  1509. self.rightSideViewController.eidtPDFImageProperty?.cancelCutImageAction("")
  1510. self.rightSideViewController.isHidden = true
  1511. self.closeRightPane()
  1512. }
  1513. }
  1514. }
  1515. // MARK: - 选择缩放模式
  1516. @objc public func selectZoom(_ type: KMPDFZoomType) {
  1517. switch type {
  1518. case .width:
  1519. self.listView.autoScales = true
  1520. // self.listView.autoScales = false
  1521. break
  1522. case .fit:
  1523. // self.listView.autoScales = !self.listView.autoScales
  1524. if let pageHeight = self.listView.currentPage()?.size.height, pageHeight > 0 {
  1525. let pdfviewHeight = self.listView.bounds.size.height
  1526. self.listView.scaleFactor = pdfviewHeight/pageHeight
  1527. self.listView.autoScales = false
  1528. }
  1529. break
  1530. case .actualSize:
  1531. if self.listView.scaleFactor != 1.0 {
  1532. self.listView.scaleFactor = 1.0
  1533. self.listView.autoScales = false
  1534. }
  1535. break
  1536. }
  1537. }
  1538. // MARK: - 自动保存
  1539. internal func autoSaveTimeStartOrStopIfNeed() {
  1540. // if (KMPreferenceManager.shared.autoSave == false) {
  1541. // self.stopAutoSaveTimer()
  1542. // return
  1543. // }
  1544. //
  1545. // self.startAutoSaveTimer(KMPreferenceManager.shared.autoSaveTimeInterval)
  1546. // if (self.myDocument == nil) {
  1547. // self.stopAutoSaveTimer()
  1548. // return
  1549. // }
  1550. //
  1551. // let browser = self.browserWindowController?.browser
  1552. // guard let activeDocument = browser?.activeTabContents() else {
  1553. // return
  1554. // }
  1555. //
  1556. // if (self.myDocument!.isEqual(to: activeDocument) == false) {
  1557. // self.pauseAutoSaveTimer()
  1558. // return
  1559. // }
  1560. }
  1561. private func startAutoSaveTimer(_ interval: TimeInterval) {
  1562. if (self.autoSaveTimer != nil) {
  1563. self.autoSaveTimer?.invalidate()
  1564. self.autoSaveTimer = nil
  1565. }
  1566. self.autoSaveTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { [weak self] timer in
  1567. DispatchQueue.main.async {
  1568. #if DEBUG
  1569. Swift.debugPrint("文档已自动保存")
  1570. if let _document = self?.myDocument {
  1571. Swift.debugPrint(_document.fileURL as Any)
  1572. }
  1573. #endif
  1574. self?.saveDocument()
  1575. }
  1576. }
  1577. RunLoop.current.add(self.autoSaveTimer!, forMode: .common)
  1578. }
  1579. private func pauseAutoSaveTimer() {
  1580. self.autoSaveTimer?.fireDate = Date.distantFuture
  1581. }
  1582. private func reStartAutoSaveTimer() {
  1583. self.autoSaveTimer?.fireDate = Date()+KMPreferenceManager.shared.autoSaveTimeInterval
  1584. }
  1585. private func needShowRegisterView() {
  1586. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
  1587. if KMLightMemberManager.manager.checkPopupRegister() {
  1588. // Login & Logout
  1589. let window = NSApp.mainWindow ?? self.view.window
  1590. if KMLightMemberManager.manager.isLogin() {
  1591. } else if window != nil {
  1592. var email: String = UserDefaults.standard.value(forKey: "kLoginEmail") as? String ?? ""
  1593. if email.count == 0 {
  1594. KMLoginWindowController.show(window: window!, .Batch, .register)
  1595. } else {
  1596. KMLoginWindowController.show(window: window!, .Batch, .login)
  1597. }
  1598. }
  1599. }
  1600. }
  1601. }
  1602. private func stopAutoSaveTimer() {
  1603. self.autoSaveTimer?.invalidate()
  1604. self.autoSaveTimer = nil
  1605. }
  1606. internal func createPdf(index:Int) {
  1607. if index == 1 {
  1608. self.homeVC?.openBlankPage()
  1609. } else if index == 4 {
  1610. self.homeVC?.importFromCamera()
  1611. } else if index == 5 {
  1612. self.homeVC?.importFromScanner()
  1613. } else if index == 3 {
  1614. self.homeVC?.importFromWebPage()
  1615. } else if index == 2 {
  1616. self.homeVC?.newFromImages()
  1617. }
  1618. }
  1619. // MARK: -
  1620. // MARK: Progress
  1621. func showProgressWindow(message: String = "") {
  1622. if (self.progressController != nil) {
  1623. self.hiddenProgressWindow()
  1624. }
  1625. let progress = SKProgressController()
  1626. progress.window?.backgroundColor = NSColor.km_init(hex: "#36383B")
  1627. progress.window?.contentView?.wantsLayer = true
  1628. progress.window?.contentView?.layer?.backgroundColor = NSColor.km_init(hex: "#36383B").cgColor
  1629. progress.progressField.textColor = NSColor.white
  1630. progress.showClose = false
  1631. progress.message = message
  1632. self.progressController = progress
  1633. self.view.window?.beginSheet(progress.window!)
  1634. }
  1635. func hiddenProgressWindow() {
  1636. if (self.progressController != nil) {
  1637. self.view.window?.endSheet((self.progressController?.window)!)
  1638. self.progressController = nil
  1639. }
  1640. }
  1641. // MARK -
  1642. // MARK - Event 监听
  1643. private func addEventMonitor() {
  1644. if (self.eventMonitor != nil) {
  1645. self.removeEventMonitor()
  1646. }
  1647. KMPrint("已添加事件监听")
  1648. self.eventMonitor = NSEvent.addLocalMonitorForEvents(matching: .scrollWheel) { [weak self] event in
  1649. if (event.type == .scrollWheel && event.modifierFlags.contains(.option)) { // Alt + 鼠标滚轮
  1650. self?.listView.magnifyWheel(event)
  1651. return nil
  1652. }
  1653. return event
  1654. }
  1655. }
  1656. func addKeyEventMonitor() {
  1657. if (self.keyEventMonitor != nil) {
  1658. self.removeKeyEventMonitor()
  1659. }
  1660. keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
  1661. // print(event.keyCode)
  1662. if event.keyCode == 53 {
  1663. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  1664. if let data = self?.canExitPresentation(), data {
  1665. self?.browserWindowController?.exitFullscreen()
  1666. }
  1667. return nil
  1668. }
  1669. if self?.listView.toolMode == .editPDFToolMode {
  1670. if self != nil {
  1671. //使用editingSelectionString获取内容文字
  1672. if self!.listView.editingAreas() != nil {
  1673. if self!.listView.editingAreas().count > 0 && self!.listView.isEditable() {
  1674. self!.listView.clearEditingSelectCharItem()
  1675. } else if self!.listView.editingAreas().count > 0 {
  1676. if self?.listView.annotationType == .addImage ||
  1677. self?.listView.annotationType == .addText {
  1678. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  1679. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  1680. textItem?.isSelected = false
  1681. imageItem?.isSelected = false
  1682. }
  1683. self?.rightSideViewController.isHidden = true
  1684. self?.listView.endEditIsRemoveBlock(with: self!.listView.editingAreas().first as? CPDFEditArea)
  1685. self?.listView.updateEditing([])
  1686. self?.listView.isEditImage = false
  1687. self?.listView.setNeedsDisplayPageViewFor(self!.listView.currentPage())
  1688. if self?.listView.annotationType == .addImage {
  1689. self?.listView.change([.text, .image])
  1690. }
  1691. self?.listView.annotationType = .editTextImage
  1692. self?.closeRightPane()
  1693. } else if(self?.listView.annotationType == .addImage || self!.listView.annotationType == .addText) {
  1694. if self?.listView.annotationType == .addImage ||
  1695. self?.listView.annotationType == .addText {
  1696. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  1697. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  1698. textItem?.isSelected = false
  1699. imageItem?.isSelected = false
  1700. }
  1701. self?.rightSideViewController.isHidden = true
  1702. self?.listView.setShouAddEdit([])
  1703. self?.listView.change([.text, .image])
  1704. self?.listView.annotationType = .editTextImage
  1705. self?.closeRightPane()
  1706. }
  1707. } else {
  1708. if self?.listView.annotationType == .addImage ||
  1709. self?.listView.annotationType == .addText {
  1710. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  1711. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  1712. textItem?.isSelected = false
  1713. imageItem?.isSelected = false
  1714. }
  1715. }
  1716. }
  1717. }
  1718. } else {
  1719. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  1720. self?.listView.keyDown(with: event)
  1721. return nil
  1722. }
  1723. }
  1724. return event
  1725. }
  1726. }
  1727. func removeKeyEventMonitor() {
  1728. if (self.keyEventMonitor != nil) {
  1729. KMPrint("removeKeyEventMonitor 已移除事件监听")
  1730. NSEvent.removeMonitor(self.keyEventMonitor as Any)
  1731. self.keyEventMonitor = nil
  1732. }
  1733. }
  1734. private func removeEventMonitor() {
  1735. if (self.eventMonitor != nil) {
  1736. KMPrint("已移除事件监听")
  1737. NSEvent.removeMonitor(self.eventMonitor as Any)
  1738. self.eventMonitor = nil
  1739. }
  1740. }
  1741. // MARK: -
  1742. // MARK: Tools
  1743. func pdfViewCanHorizontalScroll() -> Bool {
  1744. let scroll = self.listView.scroll()
  1745. if (scroll == nil) {
  1746. return false
  1747. }
  1748. return scroll?.horizontalScroller?.isHidden == nil ? false : !(scroll!.horizontalScroller!.isHidden)
  1749. }
  1750. func pdfViewCanVerticalScroll() -> Bool {
  1751. let scroll = self.listView.scroll()
  1752. if (scroll == nil) {
  1753. return false
  1754. }
  1755. return scroll?.verticalScroller?.isHidden == nil ? false : !(scroll!.verticalScroller!.isHidden)
  1756. }
  1757. // MARK: - Public Methods
  1758. // 清理数据 [eg. 通知]
  1759. public func clearData() {
  1760. self.removeNotifications()
  1761. if (self.listView.spellingTag() > 0) {
  1762. NSSpellChecker.shared.closeSpellDocument(withTag: self.listView.spellingTag())
  1763. }
  1764. self.removeAutoSaveInfo()
  1765. }
  1766. public func clearSecureOptions() {
  1767. self._secureOptions = nil
  1768. self.documentAttribute = nil
  1769. }
  1770. public func recordRemoveSecureFlag() {
  1771. self._removeSecureFlag = true
  1772. self.clearSecureOptions()
  1773. self.recordIsPDFDocumentEdited(type: .removePassword)
  1774. self._needSave = true
  1775. }
  1776. public func clearRemoveSecureFlag() {
  1777. self._removeSecureFlag = false
  1778. }
  1779. public func clearSaveWatermarkFlag() {
  1780. km_synchronized(self) {
  1781. self._saveWatermarkFlag = false
  1782. }
  1783. }
  1784. public func recordIsPDFDocumentEdited(type: KMSubscribeWaterMarkType = .none) {
  1785. km_synchronized(self) {
  1786. self._isPDFDocumentEdited = true
  1787. if let _document = self.myDocument {
  1788. KMTools.setDocumentEditedState(document: _document)
  1789. }
  1790. }
  1791. }
  1792. public func clearIsPDFDocumentEdited() {
  1793. km_synchronized(self) {
  1794. self._isPDFDocumentEdited = false
  1795. }
  1796. }
  1797. func showSnapshots(setups: NSArray?) {
  1798. for setup in setups ?? [] {
  1799. let swc = KMSnapshotWindowController()
  1800. swc.delegate = self
  1801. swc.setPdfDocument(self.listView.document, setup: setup as? NSDictionary)
  1802. swc.setForceOnTop(self.interactionMode != .normal)
  1803. self.myDocument?.addWindowController(swc)
  1804. }
  1805. }
  1806. // MARK: - Noti Actions
  1807. internal func documentDidUnlockNotification(_ sender: Notification) {
  1808. if (self.listView.document != nil && self.listView.document.isEqual(to: sender.object)) {
  1809. self.loadAIIconView()
  1810. if (self.myDocument == nil) {
  1811. return
  1812. }
  1813. if (self.listView.document.allowsPrinting && self.listView.document.allowsCopying) {
  1814. self.hiddenSecureLimitTip()
  1815. }
  1816. if ((self.myDocument as! KMMainDocument).isUnlockFromKeychain || self.isSaveKeyChain == false) {
  1817. return
  1818. }
  1819. let type = KMPreferenceManager.shared.savePasswordType
  1820. if (type == .never) {
  1821. return
  1822. }
  1823. if (type == .always) {
  1824. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  1825. return
  1826. }
  1827. // 保存到钥匙串
  1828. let alert = NSAlert()
  1829. alert.messageText = NSLocalizedString("Remember Password?", comment: "")
  1830. alert.informativeText = NSLocalizedString("Do you want to save this password in your Keychain?", comment: "")
  1831. alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
  1832. alert.addButton(withTitle: NSLocalizedString("No", comment: ""))
  1833. if (alert.runModal() == .alertFirstButtonReturn) { // 保存密码
  1834. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  1835. return
  1836. }
  1837. }
  1838. }
  1839. func annotationsAttributeHasChange(_ sender: Notification) {
  1840. guard let dict = sender.object as? [String : Any] else {
  1841. return
  1842. }
  1843. if let anno = dict["object"] as? CPDFAnnotation {
  1844. let value = dict["keyPath"] as? String ?? ""
  1845. let didEnd = dict["didEnd"] as? Bool ?? false
  1846. if didEnd {
  1847. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: ["keyPath" : value])
  1848. }
  1849. }
  1850. }
  1851. internal func applicationWillTerminateNotification(_ sender: Notification) {
  1852. self.savePageNumberIfNeed()
  1853. self.saveDocument()
  1854. }
  1855. func KMPDFViewCurrentPageDidChangedNotification(_ sender: Notification) {
  1856. if self.isReadMode {
  1857. self.readModelView.currentPageIndex = self.listView.currentPageIndex
  1858. }
  1859. //刷新前一页后一页按钮
  1860. self.updateNextAndPreViousButtonState()
  1861. }
  1862. func CPDFDocumentPageCountChangedNotification(_ sender: Notification) {
  1863. if self.isReadMode {
  1864. self.readModelView.totalPagesCount = Int(self.listView.document.pageCount)
  1865. }
  1866. //刷新前一页后一页按钮
  1867. self.updateNextAndPreViousButtonState()
  1868. }
  1869. func CEditPDFToolModeChangeStateUnkownNotification(_ sender: Notification) {
  1870. var editSelectd = false
  1871. if (self.listView.annotationType == .addText || self.listView.annotationType == .addImage) && self.listView.toolMode == .editPDFToolMode {
  1872. editSelectd = true
  1873. }
  1874. if self.listView.toolMode == .editPDFToolMode {
  1875. if editSelectd {
  1876. self.toolbarController.cancelSelected(KMToolbarAddTextEditPDFItemIdentifier)
  1877. }
  1878. }
  1879. }
  1880. @objc func handlePageChangedNotification(_ sender: Notification) {
  1881. // When the PDFView is changing scale, or when view settings change when switching fullscreen modes,
  1882. // a lot of wrong page change notifications may be send, which we better ignore.
  1883. // Full screen switching and zooming should not change the current page anyway.
  1884. if self.mwcFlags.isSwitchingFullScreen > 0 {
  1885. // if ([pdfView isZooming] || mwcFlags.isSwitchingFullScreen) {
  1886. // [self updatePageNumber];
  1887. // [self updateLeftStatus];
  1888. return
  1889. }
  1890. //
  1891. let page = self.listView.currentPage()
  1892. let pageIndex = page?.pageIndex() ?? 0
  1893. //
  1894. // if ([lastViewedPages count] == 0) {
  1895. // [lastViewedPages addPointer:(void *)pageIndex];
  1896. // } else if ((NSUInteger)[lastViewedPages pointerAtIndex:0] != pageIndex) {
  1897. // [lastViewedPages insertPointer:(void *)pageIndex atIndex:0];
  1898. // if ([lastViewedPages count] > 5)
  1899. // [lastViewedPages setCount:5];
  1900. // }
  1901. self.leftSideViewController.thumb_selectRowIndexsIfNeed(IndexSet(integer: IndexSet.Element(pageIndex)))
  1902. self.leftSideViewController.thumbnailTableView.needsDisplay = true
  1903. self.leftSideViewController.tocOutlineView.needsDisplay = true
  1904. //
  1905. // [self updatePageNumber];
  1906. // [self updatePageLabel];
  1907. //
  1908. // [self updateOutlineSelection];
  1909. // [self updateNoteSelection];
  1910. // [self updateThumbnailSelection];
  1911. //
  1912. // if (beforeMarkedPageIndex != NSNotFound && [[pdfView currentPage] pageIndex] != markedPageIndex)
  1913. // beforeMarkedPageIndex = NSNotFound;
  1914. //
  1915. // [self synchronizeWindowTitleWithDocumentName];
  1916. // [self updateLeftStatus];
  1917. // if ([[NSUserDefaults standardUserDefaults] boolForKey:SKDisplayPageBoundsKey])
  1918. // [self updateRightStatus];
  1919. // if ([self interactionMode] == SKPresentationMode)
  1920. // [[self presentationNotesDocument] setCurrentPage:[[[self presentationNotesDocument] pdfDocument] pageAtIndex:[page pageIndex]]];
  1921. }
  1922. @objc func handleDisplayBoxChangedNotification(_ sender: Notification) {
  1923. self.leftSideViewController.reloadThumbnailDataIfNeed()
  1924. // if ([[NSUserDefaults standardUserDefaults] boolForKey:SKDisplayPageBoundsKey])
  1925. // [self updateRightStatus];
  1926. }
  1927. @objc func willEnterInteractionModeNotification(_ sender: Notification) {
  1928. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1929. return
  1930. }
  1931. let interactionMode = sender.userInfo?[NSWindow.UserInfo.interactionModeKey] as? KMInteractionMode
  1932. if interactionMode == .presentation {
  1933. let backgroundColor = NSColor.black
  1934. let level = UserDefaults.standard.bool(forKey: "SKUseNormalLevelForPresentationKey") ? NSWindow.Level.normal : NSWindow.Level.popUpMenu
  1935. let page = self.listView.currentPage()
  1936. let wasInteractionMode = self.interactionMode
  1937. if wasInteractionMode == .normal {
  1938. self.savedNormalSetup.setDictionary(self.currentPDFSettings() as! [AnyHashable : Any])
  1939. }
  1940. // if findController.view().window() != nil {
  1941. // findController.toggleAboveView(nil, animate: false)
  1942. // }
  1943. if wasInteractionMode == .legacyFullScreen {
  1944. self.enterPresentationMode()
  1945. // updatePresentationOptions(for: self.view.window!)
  1946. self.pdfSplitView.frame = CGRect(x: 0, y: 0, width: CGRectGetWidth(centerContentView.bounds), height: CGRectGetHeight(centerContentView.bounds)-1)
  1947. self.centerContentView.addSubview(pdfSplitView)
  1948. self.listView.frame = (self.view.window?.contentView?.bounds)!
  1949. self.view.window?.contentView?.addSubview(listView)
  1950. self.view.window?.backgroundColor = backgroundColor
  1951. self.view.window?.level = level
  1952. self.listView.layoutDocumentView()
  1953. self.listView.requiresDisplay()
  1954. self.forceSubwindowsOnTop(false)
  1955. self.hideLeftSideWindow()
  1956. self.hideRightSideWindow()
  1957. self.removeBlankingWindows()
  1958. }
  1959. } else {
  1960. KMPrint("2")
  1961. }
  1962. }
  1963. @objc func didEnterInteractionModeNotification(_ sender: Notification) {
  1964. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1965. return
  1966. }
  1967. if self.interactionMode == .presentation {
  1968. // if _isShowToolbar {
  1969. // self.toolbarViewController.hiddenToolbar(true)
  1970. // }
  1971. //
  1972. // if self.pdfView().currentPage()?.isEqual(page) == false {
  1973. // self.pdfView().go(to: page)
  1974. // }
  1975. // pdfView().setInteractionMode(SKPresentationMode)
  1976. self.listView?.layoutDocumentView()
  1977. self.listView?.requiresDisplay()
  1978. }
  1979. }
  1980. @objc func willShowFullScreenNotification(_ sender: Notification) {
  1981. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1982. return
  1983. }
  1984. if self.interactionMode == .presentation {
  1985. let view = self.view.window?.firstResponder as? NSView
  1986. if let data = view?.isDescendant(of: self.pdfSplitView), data {
  1987. self.view.window?.makeFirstResponder(nil)
  1988. }
  1989. }
  1990. }
  1991. @objc func didShowFullScreenNotification(_ sender: Notification) {
  1992. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1993. return
  1994. }
  1995. if self.interactionMode == .presentation {
  1996. self.enterPresentationMode()
  1997. }
  1998. }
  1999. @objc func didAddContentViewNotification(_ sender: Notification) {
  2000. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  2001. return
  2002. }
  2003. if self.interactionMode == .presentation {
  2004. }
  2005. }
  2006. //MARK: - PDFListViewDelegate
  2007. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  2008. // KMPrint("pdfViewDocumentDidLoaded")
  2009. self.removeBackgroundMaskView()
  2010. if (!self.listView.document!.allowsCopying || !self.listView.document!.allowsPrinting) {
  2011. self.showSecureLimitTip()
  2012. }
  2013. if (self._documentFirstLoad) {
  2014. self.checkShouldAutoOpenLeftVC()
  2015. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  2016. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document.documentURL.path)
  2017. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document.documentURL.path)
  2018. if (pageScale != nil) {
  2019. self.listView.scaleFactor = CGFloat(pageScale!)
  2020. }
  2021. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < self.listView.document.pageCount) {
  2022. self.listView.go(toPageIndex: pageNumber!, animated: false)
  2023. } else {
  2024. self._goToFirstPageForFristAppear()
  2025. }
  2026. } else {
  2027. self._goToFirstPageForFristAppear()
  2028. }
  2029. self._documentFirstLoad = false
  2030. }
  2031. let notification = Notification(name: Notification.Name(rawValue: "pdfViewDocumentDidLoaded"))
  2032. self.preferenceDidChangeNotification(notification:notification)
  2033. let leftWidthNumber = UserDefaults.standard.object(forKey: CPDFOfficeLeftSidePaneWidthKey) as? NSNumber ?? NSNumber(value: panelWidth + functionWidth)
  2034. let rightWidthNumber = UserDefaults.standard.object(forKey: CPDFOfficeRightSidePaneWidthKey) as? NSNumber ?? NSNumber(value: defaultRightWidth)
  2035. applyLeftSideWidth(leftWidthNumber.doubleValue, rightSideWidth: rightWidthNumber.doubleValue)
  2036. self.updatePageIndicatoreType()
  2037. }
  2038. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  2039. self.updatePageIndicatoreType()
  2040. NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "KMPDFViewCurrentPageDidChanged"), object: self.document)
  2041. // KMPrint("KMPDFViewCurrentPageDidChanged")
  2042. }
  2043. func pdfViewScaleDidChanged(_ pdfView: CPDFView!) {
  2044. self.toolbarController.mainToolBarView?.zoomTextField.stringValue = "\(Int(self.listView.scaleFactor * 100))%"
  2045. self.updateZoomInOutButtonState()
  2046. // KMPrint("pdfViewScaleDidChanged")
  2047. }
  2048. func pdfViewDidClick(onLink pdfView: CPDFView!, withURL url: String!) {
  2049. if let urlString = url, urlString == kKMPurchaseProductURLString {
  2050. //跳转订阅比较表
  2051. let _ = KMComparativeTableViewController.show(window: NSApp.mainWindow ?? NSWindow())
  2052. return
  2053. }
  2054. KMTools.openURL(urlString: url)
  2055. }
  2056. func pdfViewPerformURL(_ pdfView: CPDFView!, withContent content: String!) {
  2057. KMPrint("pdfViewPerformURL")
  2058. }
  2059. func pdfViewPerformPrint(_ pdfView: CPDFView!) {
  2060. KMPrint("pdfViewPerformPrint")
  2061. }
  2062. func pdfViewPerformGo(toPage pdfView: CPDFView!) {
  2063. KMPrint("pdfViewPerformGo")
  2064. }
  2065. func pdfViewOpenPDF(_ pdfView: CPDFView!, forRemoteGoTo action: CPDFAction!) {
  2066. KMPrint("pdfViewOpenPDF")
  2067. }
  2068. func pdfViewPerformReset(_ pdfView: CPDFView!) {
  2069. KMPrint("pdfViewPerformReset")
  2070. }
  2071. func pdfViewEditingBlockDidChanged(_ pdfView: CPDFView!) {
  2072. KMPrint("pdfViewEditingBlockDidChanged")
  2073. }
  2074. func pdfViewAsBookBookmark() -> NSImage! {
  2075. return NSImage(named: "KMImageNameUXIconPDFViewBookMark")!
  2076. }
  2077. func pdfViewEditingSelectionDidChanged(_ pdfView: CPDFView!) {
  2078. if self.rightSideViewController != nil && self.rightSideViewController.subViewType == .EditPDFAddText {
  2079. self.rightSideViewController.eidtPDFTextProperty.reloadData()
  2080. self.rightSideViewController.eidtPDFTextProperty.updateTextTextPresuppositionState()
  2081. }
  2082. }
  2083. func pdfViewEditingAreaDidChanged(_ pdfView: CPDFView!) {
  2084. let areas = self.listView.editingAreas()
  2085. if areas == nil || areas?.count ?? 0 == 0 {
  2086. if self.listView.toolMode == .editPDFToolMode {
  2087. if self.listView.annotationType == .addImage || self.listView.annotationType == .addText {
  2088. if self.listView.isEditImage {
  2089. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  2090. } else {
  2091. // if self.listView.annotationType == .addImage {
  2092. // self.closeRightPane()
  2093. // }
  2094. if self.listView.annotationType == .addImage {
  2095. if self.rightSideViewController.eidtPDFImageProperty != nil {
  2096. self.rightSideViewController.eidtPDFImageProperty.reloadData()
  2097. }
  2098. }
  2099. // self.openRightPane()
  2100. }
  2101. } else {
  2102. self.closeRightPane()
  2103. }
  2104. } else {
  2105. self.rightSideViewController.isHidden = true
  2106. self.closeRightPane()
  2107. if self.rightSideViewController != nil && self.rightSideViewController.subViewType == .EditPDFAddText && self.listView.annotationType == .addText {
  2108. self.rightSideViewController.eidtPDFTextProperty.initData()
  2109. }
  2110. }
  2111. if self.listView.isEdited() {
  2112. self.recordIsPDFDocumentEdited(type: .editText)
  2113. }
  2114. if self.listView.annotationType != .addText {
  2115. NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kPDFViewEditingAreaDidChanged"), object: self.listView.document)
  2116. }
  2117. return
  2118. }
  2119. self.isPDFTextImageEdited = true
  2120. if (self.listView.annotationType == .addImage) && areas!.count > 0 {
  2121. var isImageArea = false
  2122. for i in 0 ... areas!.count-1 {
  2123. if areas![i] is CPDFEditImageArea {
  2124. isImageArea = true
  2125. }
  2126. }
  2127. if isImageArea {
  2128. // self.rightSideViewController.view.isHidden = false
  2129. self.rightSideViewController.isHidden = false
  2130. if self.rightSideViewController != nil && self.rightSideViewController.subViewType == .EditPDFAddImage {
  2131. self.rightSideViewController.subViewType = .EditPDFAddImage
  2132. self.rightSideViewController.eidtPDFImageProperty.reloadData()
  2133. }
  2134. self.openRightPane()
  2135. } else {
  2136. // self.rightSideViewController.view.isHidden = true
  2137. self.rightSideViewController.isHidden = true
  2138. self.closeRightPane()
  2139. }
  2140. } else if self.rightSideViewController != nil && self.rightSideViewController.subViewType == .EditPDFAddText && self.listView.annotationType == .addText {
  2141. // self.rightSideViewController.view.isHidden = false
  2142. self.rightSideViewController.isHidden = false
  2143. if self.listView.editingSelectionString().count != 0 {
  2144. self.rightSideViewController.eidtPDFTextProperty.reloadData()
  2145. } else {
  2146. self.rightSideViewController.eidtPDFTextProperty.refreshSelectAreaProperty(needDefaultData: true)
  2147. }
  2148. self.openRightPane()
  2149. } else {
  2150. var textsAreas : [CPDFEditTextArea] = []
  2151. var imagesAreas : [CPDFEditImageArea] = []
  2152. if self.listView.editingAreas()?.count ?? 0 < 1 {
  2153. return
  2154. }
  2155. for i in 0 ... areas!.count-1 {
  2156. if areas![i] is CPDFEditTextArea {
  2157. textsAreas.append(areas![i] as! CPDFEditTextArea)
  2158. }
  2159. if areas![i] is CPDFEditImageArea {
  2160. imagesAreas.append(areas![i] as! CPDFEditImageArea)
  2161. }
  2162. }
  2163. if textsAreas.count > 0 && textsAreas.count == areas!.count {
  2164. // self.rightSideViewController.view.isHidden = false
  2165. self.rightSideViewController.isHidden = false
  2166. self.rightSideViewController.subViewType = .EditPDFAddText
  2167. self.rightSideViewController.eidtPDFTextProperty?.reloadData()
  2168. self.openRightPane()
  2169. } else if imagesAreas.count > 0 {
  2170. // self.rightSideViewController.view.isHidden = false
  2171. self.rightSideViewController.isHidden = false
  2172. self.rightSideViewController.subViewType = .EditPDFAddImage
  2173. self.rightSideViewController.eidtPDFImageProperty?.reloadData()
  2174. self.openRightPane()
  2175. }
  2176. }
  2177. if self.listView.isEdited() {
  2178. self.recordIsPDFDocumentEdited(type: .editText)
  2179. if self.listView.annotationType != .addText {
  2180. NotificationCenter.default.post(name: NSNotification.Name(rawValue: "kPDFViewEditingAreaDidChanged"), object: self.listView.document)
  2181. }
  2182. }
  2183. }
  2184. func pdfViewEditingCropBoundsDidChanged(_ pdfView: CPDFView!, editing editArea: CPDFEditArea!) {
  2185. if editArea != nil && (editArea is CPDFEditImageArea){
  2186. self.listView.cropAreas = editArea as? CPDFEditImageArea
  2187. }
  2188. }
  2189. //编辑PDF 创建图片区域回调
  2190. func pdfViewEditingAddImageArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  2191. if self.listView.isEditImage {
  2192. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  2193. } else {
  2194. let panel = NSOpenPanel()
  2195. panel.allowsMultipleSelection = false
  2196. panel.allowedFileTypes = ["png","jpg"]
  2197. panel.beginSheetModal(for: NSApp.mainWindow!) { response in
  2198. if response == .OK {
  2199. var filePath = panel.url?.path
  2200. var image = NSImage.init(contentsOf: panel.url!)
  2201. //图片自适应范围
  2202. if image != nil {
  2203. var imageRect = rect
  2204. let imageSize = image!.size
  2205. var previewSize = rect.size
  2206. var isChangeSize = false
  2207. if previewSize.width == 0 && previewSize.height == 0 {
  2208. previewSize = CGSize(width: 500, height: 500)
  2209. isChangeSize = true
  2210. }
  2211. let scale = min(previewSize.width / imageSize.width, previewSize.height / imageSize.height)
  2212. let newSize = CGSize(width: imageSize.width * scale, height: imageSize.height * scale)
  2213. if isChangeSize {
  2214. imageRect.origin.x = imageRect.origin.x - newSize.width / 2
  2215. imageRect.origin.y = imageRect.origin.y - newSize.height / 2
  2216. } else {
  2217. imageRect.origin.x = imageRect.origin.x + imageRect.width / 2 - newSize.width / 2
  2218. imageRect.origin.y = imageRect.origin.y + imageRect.height / 2 - newSize.height / 2
  2219. }
  2220. imageRect.size = newSize
  2221. let limitWidth = 1920.0
  2222. if imageSize.width > limitWidth || imageSize.height > limitWidth {
  2223. filePath = KMImageOptimization.needCompressImageLosslessly(image: image!,
  2224. targetSize: CGSize(width: limitWidth, height: limitWidth),
  2225. maxSizeInBytes: 1024 * 1024 * 5,
  2226. targetCompression: 1.0)
  2227. }
  2228. //自适应page
  2229. let pageRect = self.listView.currentPage().bounds
  2230. if imageRect.width > pageRect.width ||
  2231. imageRect.height > pageRect.height {
  2232. let pageScale = min(pageRect.width / imageSize.width, pageRect.height / imageSize.height)
  2233. imageRect = CGRect(x: imageRect.origin.x,
  2234. y: imageRect.origin.y,
  2235. width: imageRect.width * pageScale,
  2236. height: imageRect.height * pageScale)
  2237. }
  2238. if imageRect.origin.x < 0 {
  2239. imageRect.origin.x = 5
  2240. }
  2241. if imageRect.origin.y < 0 {
  2242. imageRect.origin.y = 5
  2243. }
  2244. if imageRect.origin.x + imageRect.width > pageRect.width ||
  2245. imageRect.origin.y + imageRect.height > pageRect.height {
  2246. let offsetX = imageRect.origin.x + imageRect.width - pageRect.width
  2247. let offsetY = imageRect.origin.y + imageRect.height - pageRect.height
  2248. imageRect.origin.x = imageRect.origin.x - offsetX - 5
  2249. imageRect.origin.y = imageRect.origin.y - offsetY - 5
  2250. }
  2251. DispatchQueue.main.async {
  2252. self.listView.createImagePath(filePath, rect: imageRect, page: pdfView.currentPage())
  2253. self.isPDFTextImageEdited = true
  2254. self.recordIsPDFDocumentEdited(type: .editImage)
  2255. // self.asyncSaveDocument { params in
  2256. //
  2257. // }
  2258. }
  2259. }
  2260. }
  2261. }
  2262. }
  2263. }
  2264. func pdfViewEditingAddTextArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  2265. // print(rect)
  2266. var newrect = CGRect(x: rect.origin.x, y: rect.origin.y, width: rect.size.width, height: rect.size.height)
  2267. if __CGSizeEqualToSize(rect.size, CGSize.zero) {
  2268. newrect = CGRect(x: rect.origin.x, y: rect.origin.y - 12, width: 20, height: 12)
  2269. } else {
  2270. newrect = CGRect(x: rect.origin.x, y: rect.origin.y + rect.size.height - 12, width: rect.size.width, height: 12)
  2271. }
  2272. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  2273. let fontName = KMEditPDFTextManager.manager.fetchFontName(fontName: model.fontName)
  2274. let fontSize = model.fontSize
  2275. let fontColor = model.color
  2276. let fontAlign = model.alignment
  2277. let fontStyle = KMEditPDFTextManager.manager.fetchFontStyle(fontName: model.fontName)
  2278. NSColorPanel.shared.color = fontColor
  2279. let font = KMEditPDFTextManager.manager.fetchFont(fontName: fontName, style: fontStyle, size: fontSize)
  2280. let style = NSMutableParagraphStyle()
  2281. style.alignment = fontAlign
  2282. let attributes = [NSAttributedString.Key.font:font, NSAttributedString.Key.foregroundColor:fontColor,NSAttributedString.Key.paragraphStyle:style] as [NSAttributedString.Key : Any]
  2283. self.listView.createEmptyStringBounds(newrect,withAttributes: attributes as [NSAttributedString.Key : Any], page: page)
  2284. if self.rightSideViewController != nil && self.rightSideViewController.subViewType == .EditPDFAddText && self.listView.annotationType == .addText {
  2285. self.rightSideViewController.eidtPDFTextProperty.refreshSelectAreaProperty(needDefaultData: true)
  2286. }
  2287. // self.asyncSaveDocument { params in
  2288. //
  2289. // }
  2290. }
  2291. func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
  2292. let command = theEvent.modifierFlags.contains(.command)
  2293. let control = theEvent.modifierFlags.contains(.control)
  2294. KMPrint(theEvent.keyCode)
  2295. if (theEvent.keyCode == 11 && command) { // command + B [添加书签]
  2296. self.menuItemBookMarkClick_add(sender: NSMenuItem())
  2297. return false
  2298. } else if (command && control && theEvent.keyCode == 14) { // command + control + E [注释 橡皮擦]
  2299. return false
  2300. } else if (theEvent.keyCode == 123) { // 向左
  2301. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  2302. return false
  2303. } else {
  2304. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToPreviousPage()) {
  2305. self.listView.goToPreviousPage(nil)
  2306. return false
  2307. }
  2308. }
  2309. } else if (theEvent.keyCode == 126) { // 向上
  2310. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  2311. return false
  2312. } else {
  2313. if (self.listView.isContinousScroll()) {
  2314. return true
  2315. }
  2316. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToPreviousPage()) {
  2317. self.listView.goToPreviousPage(nil)
  2318. return false
  2319. }
  2320. }
  2321. } else if (theEvent.keyCode == 124) { // 向右
  2322. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  2323. return false
  2324. } else {
  2325. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToNextPage()) {
  2326. self.listView.goToNextPage(nil)
  2327. return false
  2328. }
  2329. }
  2330. } else if (theEvent.keyCode == 125) { // 向下
  2331. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  2332. return false
  2333. } else {
  2334. if (self.listView.isContinousScroll()) {
  2335. return true
  2336. }
  2337. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToNextPage()) {
  2338. self.listView.goToNextPage(nil)
  2339. return false
  2340. }
  2341. }
  2342. } else if (theEvent.keyCode == 36) {
  2343. if self.listView.annotationType == .addImage || self.listView.annotationType == .addText {
  2344. if self.listView.isEditImage {
  2345. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  2346. }
  2347. }
  2348. }
  2349. if theEvent.keyCode == 53 {
  2350. if self.isReadMode {
  2351. self.closeReadModel()
  2352. }
  2353. self.leftSideViewCancelSelect()
  2354. if (self.toolbarController.toolbarType.isToolMode()) {
  2355. self.toolbarController.selectItem(self.toolbarController.toolbarType.itemIdentifier())
  2356. }
  2357. }
  2358. return true
  2359. }
  2360. func pdfListViewMenuValidate(_ pdfListView: CPDFListView!, menuItem: NSMenuItem!, isTakesEffect: UnsafeMutablePointer<ObjCBool>!) -> Bool {
  2361. guard let action = menuItem.action else {
  2362. isTakesEffect.pointee = false
  2363. return false
  2364. }
  2365. if (KMSystemMenu.isEditSelector(sel: action)) {
  2366. if (KMSystemMenu.Edit.deleteSelector == action) {
  2367. isTakesEffect.pointee = true
  2368. return self.listView.activeAnnotations.count > 0
  2369. } else if (KMSystemMenu.Edit.copySelector == action) {
  2370. isTakesEffect.pointee = true
  2371. return true//self.listView.canCopy()
  2372. } else if (KMSystemMenu.Edit.cutSelector == action) {
  2373. isTakesEffect.pointee = true
  2374. return self.listView.canCopy()
  2375. } else if (KMSystemMenu.Edit.pasteSelector == action) {
  2376. isTakesEffect.pointee = true
  2377. return self.listView.canPaste()
  2378. }
  2379. }
  2380. isTakesEffect.pointee = false
  2381. return false
  2382. }
  2383. //MARK: -CPDFListViewDelegate
  2384. func cPDFListView(_ pdfListView: CPDFListView, didDelete annotation: CPDFAnnotation, in pdfPage: CPDFPage) {
  2385. self.leftSideViewController.updateThumbnail(at: Int(pdfPage.pageIndex()))
  2386. }
  2387. func pdfListViewChangeatioActiveAnnotations(_ pdfListView: CPDFListView!, forActiveAnnotations annotations: [CPDFAnnotation]!, isRightMenu: Bool) {
  2388. self.view.window?.makeFirstResponder(self.listView)
  2389. if isRightMenu {
  2390. } else if annotations.count > 0 {
  2391. if annotations.count > 1 {
  2392. let fristAnnotation = annotations.first
  2393. var isSameAnnotation = true
  2394. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  2395. for annotation in annotations {
  2396. let cunrrentClassName = NSStringFromClass(annotation.classForCoder)
  2397. if (className == "CPDFSquareAnnotation") ||
  2398. (className == "CPDFCircleAnnotation") ||
  2399. (className == "CPDFLineAnnotation") {
  2400. if (cunrrentClassName != "CPDFSquareAnnotation") &&
  2401. (cunrrentClassName != "CPDFCircleAnnotation") &&
  2402. (cunrrentClassName != "CPDFLineAnnotation") {
  2403. isSameAnnotation = false
  2404. }
  2405. } else {
  2406. if className != cunrrentClassName {
  2407. isSameAnnotation = false
  2408. }
  2409. }
  2410. }
  2411. if isSameAnnotation == false {
  2412. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  2413. // self.closeRightPane()
  2414. } else {
  2415. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  2416. self.openRightPane()
  2417. }
  2418. } else {
  2419. let fristAnnotation = annotations.first
  2420. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  2421. if self.isReadMode {
  2422. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  2423. self.closeRightPane()
  2424. } else {
  2425. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  2426. if className != "CPDFStampAnnotation" &&
  2427. className != "CPDFSignatureAnnotation" &&
  2428. className != "CPDFListStampAnnotation" {
  2429. self.openRightPane()
  2430. }
  2431. }
  2432. }
  2433. } else if (annotations.count == 0){
  2434. if pdfListView.annotationType == .unkown {
  2435. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  2436. self.closeRightPane()
  2437. } else {
  2438. if self.isReadMode {
  2439. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  2440. self.closeRightPane()
  2441. } else {
  2442. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  2443. self.openRightPane()
  2444. }
  2445. }
  2446. }
  2447. }
  2448. func pdfListViewChangedAnnotationType(_ pdfListView: CPDFListView!, for annotationType: CAnnotationType) {
  2449. if(annotationType == .unkown) {
  2450. // self.rightSideViewController.view.isHidden = true
  2451. self.rightSideViewController.isHidden = true
  2452. self.closeRightPane()
  2453. }
  2454. let aType = annotationType
  2455. if aType.isMarkup() || aType == .anchored || aType == .freeText || aType.isSquare() || aType == .link {
  2456. KMDataManager.ud_set(annotationType.rawValue, forKey: SKLastAnnotationModeKey)
  2457. }
  2458. }
  2459. ///开始定位链接注释
  2460. func pdfListViewLinkDestinationStart(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  2461. if self.locationPageView.superview == nil {
  2462. self.locationPageView.frame = CGRect(x: 0, y: pdfListView.frame.maxY-32, width: pdfListView.frame.width, height: 32)
  2463. pdfListView.addSubview(self.locationPageView)
  2464. }
  2465. }
  2466. ///刷新链接注释
  2467. func pdfListViewLinkDestinationEnd(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  2468. if self.locationPageView.superview != nil {
  2469. self.locationPageView.removeFromSuperview()
  2470. }
  2471. if self.rightSideViewController.subViewType == .AnnotationProperts && pdfListView.annotationType == .link {
  2472. self.rightSideViewController.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  2473. }
  2474. }
  2475. func pdfListViewMenuItemsEditing(at point: CGPoint, for page: CPDFPage!, menuItems: [NSMenuItem]!) -> [NSMenuItem]! {
  2476. if (listView.toolMode != CToolMode.editPDFToolMode) {
  2477. return menuItems
  2478. }
  2479. var tMenuItems = menuItems;
  2480. if(listView.isSelectEditCharRange() ||
  2481. listView.isSelecteditArea(with: point)) {
  2482. tMenuItems?.append(NSMenuItem.separator())
  2483. // tMenuItems?.append(self.fontColorMenuItem())
  2484. // tMenuItems?.append(self.fontSizeMenuItem())
  2485. }
  2486. let areas = self.listView.editingAreas() ?? []
  2487. if areas.count == 1 {
  2488. let fristAreas = areas.first
  2489. if fristAreas is CPDFEditImageArea {
  2490. self.listView.selectImageAreas = fristAreas as? CPDFEditImageArea
  2491. if self.listView.isEditImage {
  2492. tMenuItems?.removeAll()
  2493. tMenuItems?.append(self.corpImageMenuItem())
  2494. tMenuItems?.append(self.cancelCorpImageMenuItem())
  2495. tMenuItems?.append(self.restoreCorpImageMenuItem())
  2496. } else {
  2497. tMenuItems?.append(NSMenuItem.separator())
  2498. tMenuItems?.append(self.cutImageArea())
  2499. tMenuItems?.append(self.replaceImageArea())
  2500. tMenuItems?.append(self.exportImageArea())
  2501. }
  2502. } else {
  2503. tMenuItems?.swapAt(0, 1)
  2504. }
  2505. } else if areas.count == 0 {
  2506. tMenuItems?.append(NSMenuItem.separator())
  2507. tMenuItems?.append(self.addText())
  2508. tMenuItems?.append(self.addImage())
  2509. }
  2510. return tMenuItems
  2511. }
  2512. func tableMenu(_ menu: NSMenu, withTable table: KMTableAnnotation, point: CGPoint) -> NSMenu {
  2513. if table.currentCell.row >= 0 && table.currentCell.column >= 0 {
  2514. 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"]
  2515. let actions = ["formAnnotTextEdit:", "", "addRowAbove:", "addRowBelow:", "", "addColumnBefore:", "addColumnAfter:", "", "deleteRow:", "deleteColumn:", "deleteTabel", "cutCell:", "copyCell:", "pasteCell:", "pasteAndMatchStyle:", "deleteCellContents:", "clearAll:"]
  2516. for i in 0..<itemTitles.count {
  2517. var item: NSMenuItem? = nil
  2518. if itemTitles[i] == "" {
  2519. item = NSMenuItem.separator()
  2520. menu.insertItem(item!, at: i)
  2521. } else {
  2522. item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  2523. item!.target = self
  2524. item!.action = NSSelectorFromString(actions[i])
  2525. if itemTitles[i] == "Paste" /*&& !_copyCellData*/ {
  2526. item!.action = nil
  2527. } else if itemTitles[i] == "Paste and Match Style" /*&& !_copyCellData */{
  2528. item!.action = nil
  2529. } else if itemTitles[i] == "Add Row Above" {
  2530. let path1 = table.crossLines[table.rowNumber - table.currentCell.row]
  2531. let path2 = table.crossLines[table.rowNumber - table.currentCell.row - 1]
  2532. if path1.lineJoinStyle == NSBezierPath.LineJoinStyle.round && table.headerCount() >= 5 {
  2533. item!.action = nil
  2534. } else if path2.lineJoinStyle == NSBezierPath.LineJoinStyle.bevel && table.footerCount() >= 5 {
  2535. item!.action = nil
  2536. }
  2537. }
  2538. item!.title = NSLocalizedString(item!.title, comment: "")
  2539. item!.representedObject = NSValue(point: point)
  2540. menu.insertItem(item!, at: i)
  2541. }
  2542. }
  2543. } else {
  2544. let itemTitles = ["Cut", "Copy", "Paste", "Delete"]
  2545. let actions = ["cut:", "copy:", "paste:", "delete:"]
  2546. for i in 0..<itemTitles.count {
  2547. let item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  2548. item.target = self
  2549. item.action = NSSelectorFromString(actions[i])
  2550. item.title = NSLocalizedString(item.title, comment: "")
  2551. menu.insertItem(item, at: i)
  2552. item.representedObject = NSValue(point: point)
  2553. }
  2554. }
  2555. return menu
  2556. }
  2557. func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer<NSMenu?>!, isMoveSelectAnno: Bool) {
  2558. self.mouseRightMenuEvent = theEvent
  2559. var currentMenu : NSMenu = menu.pointee!
  2560. if let activeAnno = listView.activeAnnotation as? KMTableAnnotation {//Table
  2561. var pagePoint = NSPoint()
  2562. _ = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true)
  2563. currentMenu.removeAllItems()
  2564. let annotation = activeAnno
  2565. annotation.completeEditCellText()
  2566. if !(NSIsEmptyRect(annotation.drawRect)) {
  2567. annotation.drawLine(point: pagePoint)
  2568. NotificationCenter.default.post(name: NSNotification.Name.KMPDFViewTableAnnotationDidChange, object: self, userInfo: ["point": NSValue(point: pagePoint)])
  2569. }
  2570. if (annotation.rowNumber - annotation.currentCell.row - 1) < 0 {
  2571. return
  2572. }
  2573. currentMenu = tableMenu(currentMenu, withTable: listView.activeAnnotation as! KMTableAnnotation, point: pagePoint)
  2574. listView.needsDisplay = true
  2575. return
  2576. }
  2577. if (listView.toolMode == .selectToolMode){
  2578. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2579. currentMenu.insertItem(self.printingMenu(), at: 3)
  2580. currentMenu.insertItem(self.setTTSStype(), at: 3)
  2581. currentMenu.insertItem(self.setCropStype(), at: 3)
  2582. currentMenu.insertItem(self.setSnapshotStype(), at: 3)
  2583. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  2584. export.submenu = self.exportMenu()
  2585. currentMenu.insertItem(export, at: 3)
  2586. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2587. if listView.activeAnnotation == nil{
  2588. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  2589. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2590. }
  2591. return
  2592. }
  2593. if (listView.toolMode == .moveToolMode || listView.toolMode == .magnifyToolMode){
  2594. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  2595. currentMenu.insertItem(self.setTTSStype(), at: 0)
  2596. currentMenu.insertItem(self.setCropStype(), at: 0)
  2597. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  2598. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  2599. currentMenu.insertItem(self.addOutlineStype(), at: 0)
  2600. currentMenu.insertItem(self.addBookmarkMenu(), at: 0)
  2601. if listView.activeAnnotation == nil{
  2602. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  2603. currentMenu.insertItem(self.setAnnotationToolStype(), at: 0)
  2604. }
  2605. return
  2606. }
  2607. if currentMenu.items.count > 3 {
  2608. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  2609. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  2610. }
  2611. if listView.currentSelection != nil{
  2612. if listView.currentSelection.selectionType() == .text {
  2613. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2614. currentMenu.insertItem(self.setSearchBaiduStype(), at: 3)
  2615. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2616. currentMenu.insertItem(self.setLookUpStype(), at: 3)
  2617. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2618. currentMenu.insertItem(self.addOutlineStype(), at: 3)
  2619. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2620. if listView.activeAnnotation == nil{
  2621. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  2622. }
  2623. currentMenu.insertItem(self.setTTSStype(), at: 3)
  2624. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2625. currentMenu.insertItem(self.setShareStype(), at: 3)
  2626. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2627. }
  2628. currentMenu.insertItem(self.enterAnnotationStype(), at: 3)
  2629. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  2630. if listView.currentSelection.selectionType() == .image{
  2631. currentMenu.insertItem(self.setCutStype(), at: 1)
  2632. currentMenu.insertItem(self.setDeleteStype(), at: 4)
  2633. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  2634. currentMenu.insertItem(self.setEditNoteStype(), at: 6)
  2635. currentMenu.insertItem(self.setRotateStype(), at: 6)
  2636. currentMenu.insertItem(self.setLinesStype(), at: 6)
  2637. currentMenu.insertItem(self.setColorsStype(), at: 6)
  2638. }
  2639. if listView.currentSelection.selectionType() == .text {
  2640. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  2641. currentMenu.insertItem(self.setTranslateStype(), at: currentMenu.items.count)
  2642. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  2643. // currentMenu.insertItem(self.setServicesStype(), at: currentMenu.items.count)
  2644. }
  2645. }
  2646. if listView.activeAnnotation != nil || isMoveSelectAnno {
  2647. if let data = self.listView?.activeAnnotation?.type?.lowercased(), data == "stamp"{
  2648. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2649. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  2650. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2651. }else{
  2652. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2653. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  2654. // currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2655. // currentMenu.insertItem(self.setAnnotationToolStype(), at: currentMenu.items.count - 15)
  2656. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2657. currentMenu.insertItem(self.addBookmarkMenu(), at: currentMenu.items.count - 15)
  2658. currentMenu.insertItem(self.addOutlineStype(), at: currentMenu.items.count - 15)
  2659. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2660. currentMenu.insertItem(self.setSnapshotStype(), at: currentMenu.items.count - 15)
  2661. currentMenu.insertItem(self.setCropStype(), at: currentMenu.items.count - 15)
  2662. currentMenu.insertItem(self.setTTSStype(), at: currentMenu.items.count - 15)
  2663. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  2664. }
  2665. }
  2666. if listView.activeAnnotation == nil && listView.currentSelection == nil{
  2667. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  2668. if(listView.toolMode == .selectToolMode) {
  2669. if NSIsEmptyRect(listView.currentSelectionRect()) {
  2670. currentMenu.insertItem(self.zoomSelectionMenuItem(), at: 0)
  2671. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  2672. }
  2673. currentMenu.insertItem(self.printingMenu(), at: 0)
  2674. currentMenu.insertItem(self.setTTSStype(), at: 0)
  2675. currentMenu.insertItem(self.setCropStype(), at: 0)
  2676. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  2677. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  2678. export.submenu = self.exportMenu()
  2679. currentMenu.insertItem(export, at: currentMenu.items.count)
  2680. }else{
  2681. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  2682. currentMenu.insertItem(self.setTTSStype(), at: 2)
  2683. currentMenu.insertItem(self.setCropStype(), at: 2)
  2684. currentMenu.insertItem(self.setSnapshotStype(), at: 2)
  2685. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  2686. currentMenu.insertItem(self.addOutlineStype(), at: 2)
  2687. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  2688. currentMenu.insertItem(self.enterAnnotationStype(), at: 2)
  2689. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  2690. if(currentMenu.items.count > 4) {
  2691. currentMenu.insertItem(NSMenuItem.separator(), at: 5)
  2692. }
  2693. if(currentMenu.items.count > 5) {
  2694. currentMenu.insertItem(self.addBookmarkMenu(), at: 6)
  2695. }
  2696. // if (currentMenu.items.count > 6 && self.isReadMode) {
  2697. // currentMenu.removeItem(currentMenu.item(withTitle: "Zoom")!)
  2698. // }
  2699. // currentMenu.insertItem(self.findStringMenu(), at: currentMenu.items.count)
  2700. currentMenu.insertItem(self.setAutoScrollStype(), at: currentMenu.items.count)
  2701. }
  2702. currentMenu.insertItem(self.setAnnotationToolStype(), at: 5)
  2703. }
  2704. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  2705. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  2706. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  2707. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  2708. for item in currentMenu.items {
  2709. if (item.action == NSSelectorFromString("menuItemClick_HidenorShowNote:")) {
  2710. // 显示与隐藏注释 item action 截取
  2711. item.action = #selector(menuItemClick_HidenorShowNote)
  2712. item.target = self
  2713. break
  2714. }
  2715. }
  2716. }
  2717. func pdfListViewAddAnnotations(_ pdfListView: CPDFListView!, forAdd annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  2718. var addRedact = false
  2719. for anno in annotations {
  2720. if (anno.isKind(of: CPDFRedactAnnotation.self)) {
  2721. addRedact = true
  2722. }
  2723. }
  2724. self.hasAddRedact = addRedact
  2725. if /*self.isReadMode || */self.listView.toolMode == .moveToolMode {
  2726. self.listView.toolMode = .textToolMode
  2727. self.listView.annotationType = .unkown
  2728. self.toolbarController.toolbarType = .Annatiton
  2729. }
  2730. if (self.rightMouseEventing) {
  2731. self.rightMouseEventing = false
  2732. if (self.toolbarController.ignoreCurrentAnnotationTypeChange && self.listView.annotationType == .ink) {
  2733. self.listView.toolMode = .textToolMode
  2734. self.listView.annotationType = .unkown
  2735. }
  2736. }
  2737. self.toolbarController.ignoreCurrentAnnotationTypeChange = false
  2738. self.leftSideViewController.refreshUIForAddAnnotation(annos: annotations, page: pdfPage)
  2739. }
  2740. func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) {
  2741. if (!self.listView.isEqual(to: pdfListView)) {
  2742. return
  2743. }
  2744. if (self.listView.toolMode != .selectToolMode) {
  2745. return
  2746. }
  2747. if (self.topTipBox.isHidden || self.topTipBox.contentView?.subviews.count == 0) {
  2748. return
  2749. }
  2750. let tipView = self.topTipBox.contentView?.subviews.first
  2751. if (tipView?.isKind(of: KMCropTipView.self) == false) {
  2752. return
  2753. }
  2754. (tipView as! KMCropTipView).setString(string: "请按 Enter 键确定裁剪区域")
  2755. }
  2756. func pdfListViewKeyDowClosePanel(_ speedy: CPDFViewSidebarSpeedMode, event theEvent: NSEvent!) {
  2757. if(speedy == .right) {
  2758. self.toggleRightPane()
  2759. } else if (speedy == .left) {
  2760. self.menuItemAction_hiddenLeftSide(speedy)
  2761. }
  2762. }
  2763. func pdfListViewEventMarkupColor(with annotation: CPDFAnnotation!) -> [NSColor]! {
  2764. if (annotation.isKind(of: CPDFMarkupAnnotation.self)) {
  2765. if (annotation as! CPDFMarkupAnnotation).markupType() == .highlight {
  2766. return KMAnnotationPropertiesColorManager.manager.markHighlightColors
  2767. } else {
  2768. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  2769. }
  2770. } else {
  2771. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  2772. }
  2773. }
  2774. func pdfListViewHaveDocumentAttribute() -> Bool {
  2775. if(!self.listView.document.allowsCopying) {
  2776. self.removeOwnerPassword()
  2777. return false
  2778. }
  2779. return true
  2780. }
  2781. func addTopTip(_ view: NSView?) {
  2782. if (Thread.isMainThread) {
  2783. if (view == nil) {
  2784. let contentView: NSView = self.topTipBox.contentView!
  2785. for subview in contentView.subviews {
  2786. subview.removeFromSuperview()
  2787. }
  2788. self.topTipBox.isHidden = true
  2789. return
  2790. }
  2791. let contentView: NSView = self.topTipBox.contentView!
  2792. for subview in contentView.subviews {
  2793. subview.removeFromSuperview()
  2794. }
  2795. self.topTipBox.isHidden = false
  2796. self.topTipBox.contentView?.addSubview(view!)
  2797. } else {
  2798. DispatchQueue.main.async {
  2799. if (view == nil) {
  2800. let contentView: NSView = self.topTipBox.contentView!
  2801. for subview in contentView.subviews {
  2802. subview.removeFromSuperview()
  2803. }
  2804. self.topTipBox.isHidden = true
  2805. return
  2806. }
  2807. let contentView: NSView = self.topTipBox.contentView!
  2808. for subview in contentView.subviews {
  2809. subview.removeFromSuperview()
  2810. }
  2811. self.topTipBox.isHidden = false
  2812. self.topTipBox.contentView?.addSubview(view!)
  2813. }
  2814. }
  2815. }
  2816. func pdfListView(_ sender: CPDFListView!, showSnapshotAtPageNumber pageNum: Int, for rect: NSRect, scaleFactor: CGFloat, autoFits: Bool) {
  2817. let swc = KMSnapshotWindowController(windowNibName: "SnapshotWindow")
  2818. swc.delegate = self
  2819. swc.setPdfDocument(self.listView.document, goToPageNumber: pageNum, rect: rect, scaleFactor: scaleFactor, autoFits: autoFits)
  2820. swc.forceOnTop = self.interactionMode != .normal
  2821. self.myDocument?.addWindowController(swc)
  2822. }
  2823. func pdfListView(_ pdfView: CPDFListView!, documentDataDidChanged docData: Any!, withInfo info: [AnyHashable : Any]!) {
  2824. if let data = info?[CPDFListView.outlineKey] as? Bool, data { // 大纲改变
  2825. guard let ol = docData as? CPDFOutline else {
  2826. return
  2827. }
  2828. let add = info?[CPDFListView.outlineAddKey] as? Bool ?? false
  2829. let remove = info?[CPDFListView.outlineRemoveKey] as? Bool ?? false
  2830. if add {
  2831. self.leftSideViewController.addOutlineAfter(ol)
  2832. }
  2833. if remove {
  2834. self.leftSideViewController.removeOutlineAfter(ol)
  2835. }
  2836. let demote = info?[CPDFListView.outlineDemoteKey] as? Bool ?? false
  2837. let promote = info?[CPDFListView.outlinePromoteKey] as? Bool ?? false
  2838. if demote {
  2839. self.leftSideViewController.demoteOutlineAfter(ol)
  2840. }
  2841. if promote {
  2842. self.leftSideViewController.promoteOutlineAfter(ol)
  2843. }
  2844. }
  2845. }
  2846. // MARK: Split View
  2847. func changePDFDocument(isChange: Bool, replaceBlock: @escaping (String) -> Void) {
  2848. let openPanel = NSOpenPanel()
  2849. openPanel.allowedFileTypes = ["pdf", "PDF"]
  2850. openPanel.allowsMultipleSelection = false
  2851. guard let mainWindow = NSApp.mainWindow else {
  2852. return
  2853. }
  2854. openPanel.beginSheetModal(for: mainWindow) { [weak self] response in
  2855. if response == NSApplication.ModalResponse.OK {
  2856. guard let url = openPanel.url else {
  2857. return
  2858. }
  2859. if let document = CPDFDocument(url: url) {
  2860. self?.secondaryPdfView?.document = nil
  2861. self?.secondaryPdfView?.document = document
  2862. if isChange {
  2863. self!.openSecondaryPdfView!.view.removeFromSuperview()
  2864. }
  2865. replaceBlock(document.documentURL?.path ?? "")
  2866. } else {
  2867. let alert = NSAlert()
  2868. alert.alertStyle = .critical
  2869. alert.messageText = NSLocalizedString("An error occurred while opening this document. The file is damaged and could not be repaired.", comment: "")
  2870. alert.runModal()
  2871. }
  2872. }
  2873. }
  2874. }
  2875. }
  2876. // MARK: - CPDFDocumentDelegate
  2877. extension KMMainViewController: CPDFDocumentDelegate {
  2878. func documentDidBeginDocumentFind(_ document: CPDFDocument!) {
  2879. self.leftSideViewController.documentDidBeginFind()
  2880. // [statusBar setProgressIndicatorStyle:SKProgressIndicatorBarStyle];
  2881. // [[statusBar progressIndicator] setMaxValue:[[note object] pageCount]];
  2882. // [[statusBar progressIndicator] setDoubleValue:0.0];
  2883. // [statusBar startAnimation:self];
  2884. // [self willChangeValueForKey:SEARCHRESULTS_KEY];
  2885. // [self willChangeValueForKey:GROUPEDSEARCHRESULTS_KEY];
  2886. }
  2887. func documentDidEndDocumentFind(_ document: CPDFDocument!) {
  2888. self.leftSideViewController.documentDidEndFind()
  2889. // [self didChangeValueForKey:GROUPEDSEARCHRESULTS_KEY];
  2890. // [self didChangeValueForKey:SEARCHRESULTS_KEY];
  2891. // [statusBar stopAnimation:self];
  2892. // [statusBar setProgressIndicatorStyle:SKProgressIndicatorNone];
  2893. // NSArray *highlights = [[NSArray alloc] initWithArray:searchResults copyItems:YES];
  2894. // [highlights setValue:[NSColor yellowColor] forKey:@"color"];
  2895. // [self.pdfView setHighlightedSelections:highlights];
  2896. // [highlights release];
  2897. }
  2898. }
  2899. extension KMMainViewController: KMEditImagePropertyViewControllerDelegate {
  2900. func editImagePropertyViewControllerDidChanged(controller: KMEditImagePropertyViewController, type: KMEditImagePropertyViewControllerChangeType) {
  2901. self.isPDFTextImageEdited = true
  2902. }
  2903. }
  2904. extension KMMainViewController: KMSnapshotWindowControllerDelegate {
  2905. func snapshotControllerWillClose(_ controller: KMSnapshotWindowController) {
  2906. self.leftSideViewController.snapshotControllerWillClose(controller)
  2907. }
  2908. func snapshotController(_ controller: KMSnapshotWindowController, miniaturizedRect isMiniaturize: Bool) -> NSRect {
  2909. if isMiniaturize && self.interactionMode != .presentation {
  2910. if self.interactionMode != .legacyFullScreen && self.leftPanelOpen == false {
  2911. self.toggleLeftPane()
  2912. } else if self.interactionMode == .legacyFullScreen {
  2913. // else if ([self interactionMode] == SKLegacyFullScreenMode && ([rightSideWindow state] == NSDrawerClosedState || [rightSideWindow state] == NSDrawerClosingState)) {
  2914. // [rightSideWindow expand];
  2915. // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hideRightSideWindow:) userInfo:NULL repeats:NO];
  2916. }
  2917. var row = NSNotFound
  2918. for (i,sp) in self.leftSideViewController.snapshots.enumerated() {
  2919. if controller.isEqual(sp.windowC) {
  2920. row = i
  2921. }
  2922. }
  2923. if (row != NSNotFound) {
  2924. self.leftSideViewController.leftView.segmentedControl.selectedSegment = 3
  2925. self.leftSideViewController.snapshotTableView.scrollRowToVisible(row)
  2926. }
  2927. }
  2928. return self.leftSideViewController.snapshotController(controller, miniaturizedRect: isMiniaturize)
  2929. }
  2930. func snapshotControllerDidFinishSetup(_ controller: KMSnapshotWindowController) {
  2931. self.leftSideViewController.snapshotControllerDidFinishSetup(controller)
  2932. }
  2933. }
  2934. //MARK: document数据保存
  2935. extension KMMainViewController {
  2936. func currentSetup() -> [String: Any] {
  2937. var setup: [String: Any] = [:]
  2938. var point = NSZeroPoint
  2939. // var rotated = listView.currentPage().rotation
  2940. let pageIndex = listView.currentPageIndexAndPoint(&point, rotated: nil)
  2941. setup[MAINWINDOWFRAME_KEY] = NSStringFromRect(mainWindow?.frame ?? NSZeroRect)
  2942. setup[LEFTSIDEPANEWIDTH_KEY] = lastLeftPanWidth
  2943. setup[RIGHTSIDEPANEWIDTH_KEY] = lastRightPanWidth
  2944. setup[PAGEINDEX_KEY] = pageIndex
  2945. // if rotated != 0 {
  2946. // setup[SCROLLPOINT_KEY] = NSStringFromPoint(point)
  2947. // }
  2948. // if !snapshots.isEmpty {
  2949. // setup[SNAPSHOTS_KEY] = snapshots.map { $0[SKSnapshotCurrentSetupKey] }
  2950. // }
  2951. // if interactionMode == SKNormalMode {
  2952. // setup.merge(currentPDFSettings(), uniquingKeysWith: { $1 })
  2953. // } else {
  2954. // setup.merge(savedNormalSetup, uniquingKeysWith: { $1 })
  2955. // ["HASHORIZONTALSCROLLER_KEY", "HASVERTICALSCROLLER_KEY", "AUTOHIDESSCROLLERS_KEY", "LOCKED_KEY"].forEach { setup.removeValue(forKey: $0) }
  2956. // }
  2957. return setup
  2958. }
  2959. }