KMMainViewController.swift 143 KB

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