KMMainViewController.swift 142 KB

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