KMMainViewController.swift 144 KB

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