KMMainViewController.swift 146 KB

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