KMMainViewController+UI.swift 85 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837
  1. //
  2. // KMMainViewController+UI.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/15.
  6. //
  7. import Foundation
  8. extension KMMainViewController {
  9. // MARK: - 退出全屏
  10. @IBAction func exitFullScreen(_ sender: Any) {
  11. if (self.view.window == nil) {
  12. return
  13. }
  14. if (KMTools.isFullScreen(self.view.window!)) {
  15. self.view.window?.toggleFullScreen(nil)
  16. }
  17. }
  18. @IBAction func startSpeaking(_ sender: Any) {
  19. self.showTTSWindow()
  20. let ttsView = KMTTSWindowController.share
  21. ttsView.buttonItemClick_Play(ttsView.playButton)
  22. }
  23. @IBAction func stopSpeaking(_ sender: Any) {
  24. let ttsWindowC = KMTTSWindowController.share
  25. if ttsWindowC.pdfView?.document?.documentURL.path == self.listView.document.documentURL.path {
  26. if let data = ttsWindowC.window?.isVisible, data {
  27. ttsWindowC.stopSpeaking()
  28. ttsWindowC.close()
  29. }
  30. }
  31. }
  32. }
  33. extension KMMainViewController {
  34. //通知
  35. func preferenceDidChangeNotification(notification:Notification) {
  36. let info : [AnyHashable : Any] = notification.userInfo ?? [:]
  37. if info.keys.contains(KMPreference.viewZoomScaleTypeKey) {
  38. self.selectZoom(KMPreferenceManager.shared.viewZoomScaleType)
  39. }
  40. if notification.name.rawValue == "pdfViewDocumentDidLoaded" || info.keys.contains(KMPreference.viewPageDisplayTypeKey) {
  41. self.selectDisplay(display: KMPreferenceManager.shared.viewPageDisplayType)
  42. }
  43. if info.keys.contains(KMPreference.displayBackgroundNormalColorKey) || notification.name.rawValue == "pdfViewDocumentDidLoaded" {
  44. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundNormalColor
  45. self.listView.layoutDocumentView()
  46. }
  47. self.updatePageIndicatoreType()
  48. if (info.keys.contains(KMPreference.generalAuthorNameKey)) { // 作者名称
  49. CPDFKitConfig.sharedInstance().setAnnotationAuthor((info[KMPreference.generalAuthorNameKey] as! String))
  50. }
  51. if (info.keys.contains(KMPreference.highlightLinksKey)) {
  52. let hlLink = info[KMPreference.highlightLinksKey] as? Bool
  53. CPDFKitConfig.sharedInstance().setEnableLinkFieldHighlight(hlLink == nil ? false : hlLink!)
  54. self.listView.setNeedsDisplayForVisiblePages()
  55. }
  56. if info.keys.contains(KMPreference.thumbPageSizeKey) {
  57. self.leftSideViewController.refreshUIOfThumbnailIfNeed(preference: true)
  58. }
  59. if info.keys.contains(KMPreference.thumbSnapshotSizeKey) {
  60. self.leftSideViewController.refreshUIOfSnapshotIfNeed(preference: true)
  61. }
  62. if info.keys.contains(KMPreference.outlineFontSizeKey) {
  63. self.leftSideViewController.updateTableFont()
  64. }
  65. if info.keys.contains(KMPreference.greekThresholdKey) {
  66. let value = KMPreference.shared.greekThreshold.cgFloat
  67. self.listView.setGreekingThreshold(value)
  68. self.secondaryPdfView?.setGreekingThreshold(value)
  69. }
  70. if info.keys.contains(KMPreference.antiAliasTextKey) {
  71. self.listView.setShouldAntiAlias(KMPreference.shared.antiAliasText)
  72. self.listView.applyDefaultInterpolationQuality()
  73. self.secondaryPdfView?.setShouldAntiAlias(KMPreference.shared.antiAliasText)
  74. self.secondaryPdfView?.applyDefaultInterpolationQuality()
  75. }
  76. if info.keys.contains(KMPreference.markupColorHighlightKey) {
  77. if let item = self.toolbarController.findItem(KMToolbarHighlightAnnotationItemIdentifier) {
  78. if item.isSelected {
  79. let color = KMPreference.shared.markupHighlightColor
  80. let imageV = KMNoteTypeImageView()
  81. item.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
  82. item.selectedImage = imageV.noteTypeImage(withType: SKNHighlightStringHighlight, color: color)
  83. item.alternateImage = imageV.noteTypeImage(withType: SKNHighlightStringHighlight, color: color)
  84. let isSel = item.isSelected
  85. item.isSelected = isSel
  86. }
  87. }
  88. }
  89. if info.keys.contains(KMPreference.markupColorUnderlineKey) {
  90. if let item = self.toolbarController.findItem(KMToolbarUnderlineAnnotationItemIdentifier) {
  91. if item.isSelected {
  92. let color = KMPreference.shared.markupUnderlineColor
  93. let imageV = KMNoteTypeImageView()
  94. item.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
  95. item.selectedImage = imageV.noteTypeImage(withType: SKNUnderlineStringHighlight, color: color)
  96. item.alternateImage = imageV.noteTypeImage(withType: SKNUnderlineStringHighlight, color: color)
  97. let isSel = item.isSelected
  98. item.isSelected = isSel
  99. }
  100. }
  101. }
  102. if info.keys.contains(KMPreference.markupColorStrikthroughKey) {
  103. if let item = self.toolbarController.findItem(KMToolbarStrikeOutAnnotationItemIdentifier) {
  104. if item.isSelected {
  105. let color = KMPreference.shared.markupStrikthroughColor
  106. let imageV = KMNoteTypeImageView()
  107. item.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
  108. item.selectedImage = imageV.noteTypeImage(withType: SKNStrikeOutStringHighlight, color: color)
  109. item.alternateImage = imageV.noteTypeImage(withType: SKNStrikeOutStringHighlight, color: color)
  110. let isSel = item.isSelected
  111. item.isSelected = isSel
  112. }
  113. }
  114. }
  115. if info.keys.contains(KMPreference.markupColorPenKey) {
  116. if let item = self.toolbarController.findItem(KMToolbarInkAnnotationItemIdentifier) {
  117. if item.isSelected {
  118. let color = KMPreference.shared.markupPenColor
  119. let imageV = KMNoteTypeImageView()
  120. item.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
  121. item.selectedImage = imageV.noteTypeImage(withType: SKNInkStringHighlight, color: color)
  122. item.alternateImage = imageV.noteTypeImage(withType: SKNInkStringHighlight, color: color)
  123. let isSel = item.isSelected
  124. item.isSelected = isSel
  125. }
  126. }
  127. }
  128. if info.keys.contains(KMPreference.editPDFPopWindowShowKey) {
  129. let show = KMPreference.shared.editPDFPopWindowIsShow
  130. let win = KMEditPDFPopToolBarWindow.shared
  131. if !show && win.isVisible {
  132. win.orderOut(nil)
  133. win.setIsVisible(false)
  134. }
  135. }
  136. }
  137. //刷新页面显示器
  138. func updatePageIndicatoreType () {
  139. if self.isReadMode {
  140. self.pageNumberDisplayView.outView()
  141. } else {
  142. if self.listView.document != nil {
  143. self.pageNumberDisplayView.totalPagesCount = Int(self.listView.document.pageCount)
  144. }
  145. self.pageNumberDisplayView.currentPageIndex = self.listView.currentPageIndex
  146. self.pageNumberDisplayView.displayType = KMPreferenceManager.shared.pageIndicatorType
  147. self.readContentView.addSubview(self.tipCurrentPageBox, positioned: .above, relativeTo: self.readContentView)
  148. }
  149. }
  150. func showConvertNotesProgress() {
  151. guard let pdfDocument = self.document else {
  152. return
  153. }
  154. guard let _ = self.listView?.document else {
  155. return
  156. }
  157. guard let _ = self.view.window else {
  158. return
  159. }
  160. let isNewCreated = (self.myDocument as? KMMainDocument)?.isNewCreated ?? false
  161. if isNewCreated {
  162. return
  163. }
  164. self.model.needConvertNotes = false
  165. Task { @MainActor in
  166. self.convertNotesUsingPDFDocument(pdfDocument)
  167. }
  168. }
  169. func convertNotesUsingPDFDocument(_ pdfDocument: CPDFDocument) {
  170. guard let doc = self.listView?.document else {
  171. return
  172. }
  173. DispatchQueue.main.async {
  174. self.beginProgressSheet(withMessage: NSLocalizedString("Converting notes", comment: "Message for progress sheet").appending("..."), maxValue: 0)
  175. let count = pdfDocument.pageCount
  176. DispatchQueue.global().async {
  177. // var addAnnotations = [CPDFAnnotation]()
  178. // var removeAnnotations = [CPDFAnnotation]()
  179. self.model.addAnnotations.removeAll()
  180. self.model.removeAnnotations.removeAll()
  181. for i in 0..<count {
  182. let page = pdfDocument.page(at: i)
  183. // var addAnnotations = [CPDFAnnotation]()
  184. // var removeAnnotations = [CPDFAnnotation]()
  185. for annotation in page?.annotations ?? [] {
  186. var newAnnotation: CPDFAnnotation?
  187. if let inkAnnotation = annotation as? CPDFInkAnnotation, inkAnnotation.contents.hasPrefix("<?xml version=\"1.0\" encoding=\"utf-8\"?>") {
  188. let table = KMTableAnnotation(KMNoteBounds: inkAnnotation.bounds, document: doc)
  189. table.border = inkAnnotation.border
  190. table.color = inkAnnotation.color
  191. table.createForm(withList: inkAnnotation.contents, andPaths: inkAnnotation.bezierPaths())
  192. table.updateAppearanceInk(withIsAdd: false)
  193. table.contents = annotation.contents
  194. newAnnotation = table
  195. }
  196. if let newAnnotation = newAnnotation {
  197. self.model.addAnnotations.append(newAnnotation)
  198. self.model.removeAnnotations.append(annotation)
  199. }
  200. }
  201. // for i in 0..<addAnnotations.count {
  202. // let newAnnotation = addAnnotations[i]
  203. // let annotation = removeAnnotations[i]
  204. //
  205. // // this is only to make sure markup annotations generate the lineRects, for thread safety
  206. // pdfView?.addAnnotation(with: newAnnotation, to: page)
  207. // pdfView?.remove(annotation)
  208. // if newAnnotation.contents != nil {
  209. // if newAnnotation.contents.count == 0 {
  210. // newAnnotation.autoUpdateString()
  211. // }
  212. // }
  213. // }
  214. }
  215. DispatchQueue.main.async {
  216. for i in 0..<self.model.addAnnotations.count {
  217. let newAnnotation = self.model.addAnnotations[i]
  218. let annotation = self.model.removeAnnotations[i]
  219. let page = annotation.page
  220. // this is only to make sure markup annotations generate the lineRects, for thread safety
  221. self.listView?.addAnnotation(with: newAnnotation, to: page)
  222. self.listView?.remove(annotation)
  223. if newAnnotation.contents != nil {
  224. if newAnnotation.contents.count == 0 {
  225. newAnnotation.autoUpdateString()
  226. }
  227. }
  228. }
  229. self.dismissProgressSheet()
  230. self.listView?.undoManager?.removeAllActions()
  231. self.undoManager?.removeAllActions()
  232. // 清空数据
  233. self.model.addAnnotations.removeAll()
  234. self.model.removeAnnotations.removeAll()
  235. }
  236. }
  237. }
  238. }
  239. // MARK: - KMInterfaceThemeChangedProtocol
  240. override func interfaceThemeDidChanged(_ appearance: NSAppearance.Name) {
  241. super.interfaceThemeDidChanged(appearance)
  242. self.toolbarController.interfaceThemeDidChanged(appearance)
  243. self.leftSideViewController.interfaceThemeDidChanged(appearance)
  244. self.rightSideViewController.interfaceThemeDidChanged(appearance)
  245. self.pdfEditController?.interfaceThemeDidChanged(appearance)
  246. self.mianSplitView.superview?.wantsLayer = true
  247. // let sView = self.listView.documentView()
  248. if KMAppearance.isDarkMode() {
  249. self.mianSplitView.superview?.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  250. // sView?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1)
  251. } else {
  252. self.mianSplitView.superview?.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  253. // sView?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1)
  254. }
  255. }
  256. }
  257. // MARK: - KMToolbarControllerDelegate
  258. extension KMMainViewController: KMToolbarControllerDelegate {
  259. func toolbarController(_ viewController: KMToolbarController, heightOffsetChange heightOffset: Float, animated: Bool) {
  260. let heightConst = (animated ? self.heightOffset.animator() : self.heightOffset)
  261. if self.isReadMode {
  262. if self.toolbarController.toolbarType == .Annatiton {
  263. heightConst?.constant = CGFloat(heightOffset)
  264. } else {
  265. heightConst?.constant = CGFloat(0)
  266. }
  267. } else {
  268. heightConst?.constant = CGFloat(heightOffset)
  269. }
  270. self.refreshListViewToolMode()
  271. self.trackEvent(toolMode: self.listView.toolMode)
  272. if self.listView.annotationType == .editTextImage ||
  273. self.listView.annotationType == .addText ||
  274. self.listView.annotationType == .addImage {
  275. self.closeRightPane()
  276. }
  277. self.listView.annotationType = .unkown
  278. }
  279. func changeAnnotationModeAction(item: KMToolbarClickButton) {
  280. if self.listView.toolMode == .formToolMode {
  281. if !IAPProductsManager.default().isAvailableAllFunction(){
  282. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  283. return
  284. }
  285. }
  286. if (self.model.rightMouseEventing) {
  287. self.model.rightMouseEventing = false
  288. }
  289. if (self.toolbarController.ignoreCurrentAnnotationTypeChange) {
  290. self.toolbarController.ignoreCurrentAnnotationTypeChange = false
  291. }
  292. var currentType = self.listView.annotationType
  293. if (currentType == .eraser) {
  294. currentType = .ink
  295. }
  296. let isSelected = (currentType == CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown) && ((self.listView.toolMode == .noteToolMode) || (self.listView.toolMode == .selfSignMode) || (self.listView.toolMode == .formToolMode))
  297. var editSelectd = false
  298. if self.listView.annotationType == CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown && self.listView.toolMode == .editPDFToolMode {
  299. editSelectd = true
  300. }
  301. if isSelected {
  302. if self.listView.toolMode == .formToolMode {
  303. } else {
  304. self.listView.toolMode = .textToolMode
  305. }
  306. self.listView.annotationType = .unkown
  307. self.closeRightPane()
  308. } else {
  309. let type = CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown
  310. self.trackEvent(annotationType: type)
  311. self.listView.annotationType = type
  312. if self.listView.currentSelection != nil {
  313. let annotation = self.listView.addAnnotation(with: CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown, selection: self.listView.currentSelection, page: self.listView.currentSelection.page, bounds: self.listView.currentSelection.bounds)
  314. if((annotation != nil) &&
  315. !self.listView.activeAnnotations.contains(annotation ?? self.listView.activeAnnotation)) {
  316. var newAnnonations : [CPDFAnnotation] = []
  317. newAnnonations.append(annotation!)
  318. self.listView.updateActiveAnnotations(newAnnonations)
  319. self.listView.setNeedsDisplayAnnotationViewFor(annotation?.page)
  320. }
  321. }
  322. if self.listView.toolMode == .formToolMode {
  323. } else {
  324. self.refreshListViewToolMode()
  325. }
  326. }
  327. if self.listView.toolMode != .editPDFToolMode && self.listView.annotationType != .unkown {
  328. self.rightSideViewController.isHidden = false
  329. self.rightSideViewController.subViewType = .AnnotationProperts
  330. if !self.isReadMode {
  331. self.openRightPane()
  332. }
  333. } else if self.listView.toolMode == .editPDFToolMode {
  334. if editSelectd {
  335. self.rightSideViewController.isHidden = true
  336. self.listView.setShouAddEdit([])
  337. self.listView.change([.text, .image])
  338. self.listView.annotationType = .editTextImage
  339. self.closeRightPane()
  340. } else if self.listView.annotationType == .addText {
  341. self.rightSideViewController.isHidden = false
  342. if !self.isReadMode {
  343. self.openRightPane()
  344. }
  345. self.rightSideViewController.subViewType = .EditPDFAddText
  346. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_EditPDF_AddText"])
  347. self.listView.setShouAddEdit(.text)
  348. self.listView.change(.text)
  349. } else if self.listView.annotationType == .addImage {
  350. self.rightSideViewController.isHidden = false
  351. if !self.isReadMode {
  352. self.openRightPane()
  353. }
  354. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_EditPDF_AddImage"])
  355. // self.closeRightPane()
  356. self.rightSideViewController.subViewType = .EditPDFAddImage
  357. self.listView.setShouAddEdit(.image)
  358. self.listView.change(.image)
  359. self.rightSideViewController.eidtPDFImageProperty.reloadData()
  360. }
  361. } else {
  362. self.rightSideViewController.isHidden = true
  363. self.closeRightPane()
  364. }
  365. }
  366. func refreshListViewToolMode () {
  367. if self.toolbarController.toolbarType == .Annatiton {
  368. self.listView.toolMode = .noteToolMode
  369. } else if self.toolbarController.toolbarType == .Move {
  370. self.listView.toolMode = .moveToolMode
  371. } else if self.toolbarController.toolbarType == .Magnify {
  372. self.listView.toolMode = .magnifyToolMode
  373. } else if self.toolbarController.toolbarType == .Select {
  374. self.listView.toolMode = .selectToolMode
  375. } else if self.toolbarController.toolbarType == .SelectZoom {
  376. self.listView.toolMode = .selectZoomToolMode
  377. } else if self.toolbarController.toolbarType == .Page {
  378. } else if self.toolbarController.toolbarType == .Form {
  379. self.listView.toolMode = .formToolMode
  380. self.rightSideViewController.subViewType = .AnnotationProperts
  381. } else if self.toolbarController.toolbarType == .FillSign {
  382. self.listView.toolMode = .selfSignMode
  383. self.rightSideViewController.subViewType = .AnnotationProperts
  384. } else if self.toolbarController.toolbarType == .editPDF {
  385. self.listView.toolMode = .editPDFToolMode
  386. // self.listView.editingConfig().isShowEditingAreaHover = true
  387. // self.listView.editingConfig().editingBorderWidth = 1
  388. // self.listView.editingConfig().editingCenterRadius = 5
  389. // self.listView.editingConfig().editAreaMargin = 2
  390. // self.listView.editingConfig().editingHoverBorderColor = NSColor.init(red: 0, green: 136.0/255.0, blue: 1.0, alpha: 0.5)
  391. // self.listView.editingConfig().editingBorderColor = NSColor.init(red: 0, green: 0, blue: 0, alpha: 0.4)
  392. // self.listView.editingConfig().addEditAreaColor = NSColor.init(red: 23.0/255.0, green: 112.0/255.0, blue: 244.0/255.0, alpha: 0.5)
  393. // self.listView.editingConfig().editAreaMoveFillColor = NSColor.init(red: 23.0/255.0, green: 112.0/255.0, blue: 244.0/255.0, alpha: 0.1)
  394. self.listView.setShouAddEdit([])
  395. }else if self.toolbarController.toolbarType == .LeftPanel {
  396. self.toggleLeftPane()
  397. self.leftSideViewController.showPanelView(show: true)
  398. }else {
  399. self.listView.toolMode = .textToolMode
  400. }
  401. }
  402. func showPDFLayoutModeAction(show: Bool) {
  403. self.listView.annotationType = .unkown
  404. self.showOrHideNotes()
  405. }
  406. }
  407. // MARK: - NSSplitViewDelegate
  408. extension KMMainViewController : NSSplitViewDelegate {
  409. func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
  410. if splitView == self.mianSplitView {
  411. // return (subview == self.listView) == false
  412. } else if splitView == self.newPDFSplitView {
  413. return subview.isEqual(to: self.secondaryPdfContentView)
  414. }
  415. return false
  416. }
  417. func splitView(_ splitView: NSSplitView, shouldCollapseSubview subview: NSView, forDoubleClickOnDividerAt dividerIndex: Int) -> Bool {
  418. if splitView == self.newPDFSplitView {
  419. if subview.isEqual(to: self.secondaryPdfContentView) {
  420. var position = self.newPDFSplitView.maxPossiblePositionOfDivider(at: dividerIndex)
  421. if self.newPDFSplitView.isSubviewCollapsed(subview) {
  422. if self.lastSplitPDFHeight <= 0.0 {
  423. let DEFAULT_SPLIT_PANE_HEIGHT: Float = 200.0
  424. self.lastSplitPDFHeight = DEFAULT_SPLIT_PANE_HEIGHT
  425. }
  426. if self.lastSplitPDFHeight.cgFloat > NSHeight(self.pdfContentView.frame) {
  427. self.lastSplitPDFHeight = floorf(0.5 * Float(NSHeight(self.pdfContentView.frame)))
  428. }
  429. position += self.lastSplitPDFHeight.cgFloat
  430. } else {
  431. self.lastSplitPDFHeight = Float(NSHeight(subview.frame))
  432. }
  433. self.pdfSplitView.setPosition(position, ofDividerAt: dividerIndex, animate: true)
  434. }
  435. return false
  436. }
  437. return false
  438. }
  439. func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
  440. if splitView == self.mianSplitView {
  441. return splitView == self.mianSplitView
  442. } else if splitView == self.newPDFSplitView {
  443. return false
  444. }
  445. return false
  446. }
  447. func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  448. if splitView == mianSplitView {
  449. let splitViewWidth = splitView.frame.width
  450. let dividerIndexX0 = self.model.panelWidth + functionWidth
  451. if dividerIndex == 0 {
  452. if self.model.leftPanelOpen {
  453. return CGFloat(dividerIndexX0 * 1.5)
  454. } else {
  455. return functionWidth
  456. }
  457. } else if dividerIndex == 1 {
  458. return splitViewWidth
  459. }
  460. } else if splitView == self.newPDFSplitView {
  461. if dividerIndex == 0 {
  462. let MIN_SIDE_PANE_WIDTH = 270
  463. return proposedMaximumPosition + MIN_SIDE_PANE_WIDTH.cgFloat
  464. }
  465. }
  466. return proposedMaximumPosition
  467. }
  468. func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  469. if splitView == mianSplitView {
  470. let splitViewWidth = splitView.frame.width
  471. let dividerIndexX1 = splitViewWidth - self.model.defaultRightWidth
  472. if dividerIndex == 0 {
  473. return functionWidth
  474. } else if dividerIndex == 1 {
  475. return dividerIndexX1
  476. }
  477. } else if splitView == self.newPDFSplitView {
  478. }
  479. return proposedMinimumPosition
  480. }
  481. func splitView(_ splitView: NSSplitView, resizeSubviewsWithOldSize oldSize: NSSize) {
  482. if splitView.isEqual(to: mianSplitView) {
  483. let leftView = splitView.subviews[0]
  484. let centerView = splitView.subviews[1]
  485. let rightView = splitView.subviews[2]
  486. // let centerView = self.pdfSplitView ?? splitView.subviews[1]
  487. // let rightView = self.rightView ?? splitView.subviews[2]
  488. // 左边是否收起
  489. let leftCollapsed = splitView.isSubviewCollapsed(leftView)
  490. // 右边是否收起
  491. let rightCollapsed = splitView.isSubviewCollapsed(rightView)
  492. var leftSize = leftView.frame.size
  493. var mainSize = centerView.frame.size
  494. var rightSize = rightView.frame.size
  495. var contentWidth = splitView.frame.width
  496. if leftCollapsed {
  497. leftSize.width = 0.0
  498. } else {
  499. contentWidth = contentWidth - splitView.dividerThickness
  500. }
  501. if rightCollapsed {
  502. rightSize.width = 0.0
  503. } else {
  504. contentWidth = contentWidth - splitView.dividerThickness
  505. }
  506. if contentWidth < leftSize.width + rightSize.width {
  507. var oldContentWidth = oldSize.width
  508. if leftCollapsed == false {
  509. oldContentWidth = oldContentWidth - splitView.dividerThickness
  510. }
  511. if rightCollapsed == false {
  512. oldContentWidth = oldContentWidth - splitView.dividerThickness
  513. }
  514. let resizeFactor = contentWidth / oldContentWidth
  515. leftSize.width = floor(resizeFactor*leftSize.width)
  516. rightSize.width = floor(resizeFactor*rightSize.width)
  517. }
  518. mainSize.width = contentWidth - leftSize.width - rightSize.width
  519. leftSize.height = splitView.frame.height
  520. rightSize.height = splitView.frame.height
  521. mainSize.height = splitView.frame.height
  522. if leftCollapsed == false {
  523. leftView.setFrameSize(leftSize)
  524. }
  525. if rightCollapsed == false {
  526. rightView.setFrameSize(rightSize)
  527. }
  528. centerView.setFrameSize(mainSize)
  529. } else if splitView == self.newPDFSplitView {
  530. // let firstV = splitView.subviews.first
  531. // let lastV = splitView.subviews.last
  532. // if firstV == lastV{
  533. // splitView.adjustSubviews()
  534. // return
  535. // }
  536. // if self.newPDFSplitView.isVertical { // 横向
  537. // // 左边是否收起
  538. // let leftCollapsed = splitView.isSubviewCollapsed(firstV!)
  539. // // 右边是否收起
  540. // let rightCollapsed = splitView.isSubviewCollapsed(lastV!)
  541. //
  542. // var contentSize = splitView.frame.size
  543. // firstV?.setFrameSize(NSMakeSize(contentSize.width * 0.5, contentSize.height))
  544. // lastV?.setFrameSize(NSMakeSize(contentSize.width * 0.5, contentSize.height))
  545. // } else { // 纵向
  546. // // 左边是否收起
  547. // let leftCollapsed = splitView.isSubviewCollapsed(firstV!)
  548. // // 右边是否收起
  549. // let rightCollapsed = splitView.isSubviewCollapsed(lastV!)
  550. //
  551. // var contentSize = splitView.frame.size
  552. // firstV?.setFrameSize(NSMakeSize(contentSize.width, contentSize.height * 0.5))
  553. // lastV?.setFrameSize(NSMakeSize(contentSize.width, contentSize.height * 0.5))
  554. // }
  555. }
  556. splitView.adjustSubviews()
  557. }
  558. func splitViewWillResizeSubviews(_ notification: Notification) {
  559. let defaultView = KMSplitView()
  560. let sender : NSSplitView = notification.object as? NSSplitView ?? defaultView
  561. if (sender == self.mianSplitView || sender == defaultView) && self.view.window?.frameAutosaveName != nil{
  562. // let leftWidth = self.mianSplitView.isSubviewCollapsed(self.leftView) ? 0.0 : leftSideViewController.view.frame.width
  563. // if leftPanelOpen {
  564. // if leftWidth < 100 && lastLeftPanWidth > functionWidth{
  565. // self.closeLeftPane()
  566. // }
  567. // }
  568. } else {
  569. if sender == self.pdfSplitView {
  570. KMPrint("")
  571. }
  572. }
  573. }
  574. func splitViewDidResizeSubviews(_ notification: Notification) {
  575. self.locationPageView.frame = CGRect(x: 0, y: self.listView.frame.maxY-32, width: self.listView.frame.width, height: 32)
  576. let defaultView = KMSplitView()
  577. let sender : NSSplitView = notification.object as? NSSplitView ?? defaultView
  578. if (sender == self.mianSplitView || sender == defaultView) && self.view.window?.frameAutosaveName != nil{
  579. let leftWidth = self.mianSplitView.isSubviewCollapsed(self.leftView) ? 0.0 : leftSideViewController.view.frame.width
  580. let rightWidth = self.mianSplitView.isSubviewCollapsed(self.rightView) ? 0.0 : rightSideViewController.view.frame.width
  581. UserDefaults.standard.set(leftWidth, forKey: CPDFOfficeLeftSidePaneWidthKey)
  582. UserDefaults.standard.set(rightWidth, forKey: CPDFOfficeRightSidePaneWidthKey)
  583. } else {
  584. if sender == self.pdfSplitView {
  585. KMPrint("")
  586. }
  587. }
  588. }
  589. func splitView(_ splitView: NSSplitView, constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  590. if splitView == self.mianSplitView {
  591. if dividerIndex == 0 {
  592. if self.model.leftPanelOpen {
  593. //当左边栏开启式,拖拽时不改变宽度,当宽度达到原宽度的一半时关闭窗口
  594. //如果 isShowPanel 为 true 那么将不会收缩
  595. if (proposedPosition < functionWidth + self.model.panelWidth * 0.5) && !self.leftSideViewController.isShowPanel {
  596. self.closeLeftPane()
  597. self.leftSideViewController.refreshMethodType(methodType: .None)
  598. return functionWidth
  599. } else if proposedPosition > self.model.panelWidth + functionWidth {
  600. return proposedPosition
  601. } else {
  602. return self.model.panelWidth + functionWidth
  603. }
  604. } else {
  605. return functionWidth
  606. }
  607. }
  608. } else if splitView == self.newPDFSplitView {
  609. }
  610. return proposedPosition
  611. }
  612. }
  613. // MARK: - KMLeftSideViewControllerDelegate
  614. extension KMMainViewController: KMLeftSideViewControllerDelegate {
  615. func controlStateChange(_ obj: KMLeftSideViewController, show: Bool) {
  616. if show {
  617. self.openLeftPane()
  618. } else {
  619. self.closeLeftPane()
  620. }
  621. }
  622. func enterEditMode(_ obj: KMLeftSideViewController, _ pages: [Int]) {
  623. let item : KMToolbarItemView = (self.toolbarController.mainToolBarView?.toolbarItemFindItemIdentifiers(value: KMDocumentPageToolbarItemIdentifier))!
  624. self.toolbarController.mainToolBarView?.delegate?.toolbarViewController?(self.toolbarController.mainToolBarView!, clickMode: .Page, toolbar: item, pages)
  625. }
  626. func searchAction(searchString: String,isCase:Bool) {
  627. self.search(searchString: searchString,isCase: isCase)
  628. }
  629. func controller(_ controller: KMLeftSideViewController, dispayDidChange dispay: KMPDFDisplayType) {
  630. self.selectDisplay(display: dispay, viewSettingIsReload: false)
  631. }
  632. func controller(controller: KMLeftSideViewController, itemClick item: Any?, itemKey: KMItemKey, params: Any?) {
  633. if (itemKey == .print) { // 打印
  634. if params is NSImage {
  635. KMPrintWindowController.cpdf_printImage(image: params as! NSImage)
  636. return
  637. }
  638. var pageRange: KMPrintPageRange = KMPrintPageRange(type: .allPage, selectPages: [], reversePrintOrder: false)
  639. if (params != nil) {
  640. pageRange.type = .custom
  641. pageRange.selectPages = params as! [Int]
  642. }
  643. self.showPrintWindow(pageRange: pageRange)
  644. } else if (itemKey == .cut || itemKey == .paste || itemKey == .delete || itemKey == .leftRotate || itemKey == .rightRotate) {
  645. self.recordIsPDFDocumentEdited(type: itemKey.toSubscribeWaterMarkType())
  646. } else if itemKey == .pageEdit {
  647. self.toolbarController.clickItem(KMDocumentPageToolbarItemIdentifier)
  648. } else if itemKey == .demote { // 大纲降级
  649. guard let currentOutline: CPDFOutline = controller.tocOutlineView.km.clickedItem() else {
  650. return
  651. }
  652. self.listView?.demote(outline: currentOutline)
  653. } else if itemKey == .promote { // 大纲升级
  654. guard let currentOutline: CPDFOutline = controller.tocOutlineView.km.clickedItem() else {
  655. return
  656. }
  657. self.listView?.promote(outline: currentOutline)
  658. }
  659. }
  660. func controller(controller: KMLeftSideViewController, bookMarkDidChange bookMarks: [KMBookMarkItem]) {
  661. self.needSave = true
  662. self.recordIsPDFDocumentEdited()
  663. }
  664. func controller(controller: KMLeftSideViewController, rotateType: KMRotateType) {
  665. if rotateType == .clockwise {
  666. self.menuItemAction_rotateRight((Any).self)
  667. } else if rotateType == .anticlockwise {
  668. self.menuItemAction_rotateLeft((Any).self)
  669. }
  670. }
  671. func controller(controller: KMLeftSideViewController, listViewSelectionDidChange object: Any?, info: [String : Any]?) {
  672. if controller.thumbnailTableView.isEqual(to: object) {
  673. let row = controller.thumbnailTableView.selectedRow
  674. let curIndex = self.listView.currentPageIndex
  675. if (row != -1 && row != curIndex) {
  676. self.listView?.go(toPageIndex: row, animated: true)
  677. }
  678. }
  679. }
  680. }
  681. //MARK: - ReadModel
  682. extension KMMainViewController {
  683. @objc func openReadModel() {
  684. //保存进入阅读模式之前的状态
  685. readLeftMethodType = self.leftSideViewController.type.methodType
  686. readLeftPanelOpen = self.model.leftPanelOpen
  687. readLastLeftPanWidth = self.model.lastLeftPanWidth
  688. readLeftViewShowPanel = self.leftSideViewController.isShowPanel
  689. readRightPanelOpen = self.model.rightPanelIsOpen
  690. readToolbarType = self.toolbarController.toolbarType
  691. readToolMode = self.listView.toolMode
  692. readAnnotationType = self.listView.annotationType
  693. readSubViewType = self.rightSideViewController.subViewType ?? .None
  694. if self.toolbarController.lastItemBox.isSelected {
  695. readToolbarItemIdentifier = self.toolbarController.lastItemBox.itemIdentifier ?? ""
  696. } else {
  697. readToolbarItemIdentifier = ""
  698. }
  699. if readToolMode == .editPDFToolMode { // 内容编辑
  700. // 退出内容编辑模式
  701. self.editPDFHanddler.clearData()
  702. }
  703. //设置阅读模式
  704. self.isReadMode = true
  705. self.readModelView.isHidden = false
  706. //
  707. //顶部菜单栏状态清空
  708. self.toolbarController.toolbarType = .None
  709. // self.toolbarController.view.isHidden = true
  710. self.toolbarController.cancelSelected(KMLeftControlToolbarItemIdentifier)
  711. self.toolbarController.cancelSelected(KMRightControlToolbarItemIdentifier)
  712. self.toolbarController.lastItemBox.isSelected = false
  713. //左侧菜单栏情况
  714. self.model.leftPanelOpen = false
  715. self.model.lastLeftPanWidth = 0
  716. self.leftSideViewController.refreshMethodType(methodType: .None)
  717. //阅读界面初始化
  718. self.readModelView.isHidden = false
  719. self.readModelView.currentPageIndex = self.listView.currentPageIndex
  720. self.readModelView.totalPagesCount = Int(self.listView.document.pageCount)
  721. self.readModelView.beginTimer()
  722. // self.listView.autoScales = true
  723. // self.readModelView.scaleType = .autoSize
  724. self.readModelView.zoomButton.stringValue = (NSString(format: "%.0f", self.listView.scaleFactor * 100) as String) + "%"
  725. //关闭左侧右侧菜单栏
  726. self.closeLeftPane()
  727. self.closeRightPane()
  728. self.leftSideViewController.showPanelView(show: false)
  729. self.leftView.isHidden = true
  730. //弹出提示框
  731. if readAlertView != nil {
  732. readAlertView?.removeFromSuperview()
  733. }
  734. readAlertView = CustomAlertView.alertView(message: NSLocalizedString("Read Mode On", comment: ""), fromView: self.view, withStyle: .blue, backgroundColor: NSColor.km_init(hex: "#36383B"))
  735. UserDefaults.standard.set(isReadMode, forKey: "kKMPDFViewIsReadMode")
  736. UserDefaults.standard.synchronize()
  737. self.updatePageIndicatoreType()
  738. }
  739. @objc func closeReadModel() {
  740. if self.isReadMode {
  741. self.model.isShowBOTA = false
  742. self.readModelView.isHidden = true
  743. self.isReadMode = false
  744. self.readModelView.isHidden = true
  745. self.leftSideViewController.refreshMethodType(methodType: readLeftMethodType)
  746. self.model.leftPanelOpen = readLeftPanelOpen
  747. self.model.rightPanelIsOpen = readRightPanelOpen
  748. self.model.lastLeftPanWidth = readLastLeftPanWidth
  749. if self.model.leftPanelOpen {
  750. self.openLeftPane()
  751. }
  752. self.closeRightPane()
  753. self.toolbarController.toolbarType = .None
  754. self.toolbarController.cancelSelected(KMDocumentViewDisplayToolbarItemIdentifier)
  755. // if self.rightPanelIsOpen {
  756. // self.rightPanelIsOpen = false
  757. //// self.toolbarController.selectItem(KMRightControlToolbarItemIdentifier)
  758. // self.openRightPane()
  759. // }
  760. //
  761. // if readToolbarItemIdentifier.count == 0 {
  762. // self.toolbarController.toolbarType = .None
  763. // } else {
  764. // self.toolbarController.selectItem(readToolbarItemIdentifier)
  765. // }
  766. // self.toolbarController.selectItem(KMDocumentViewDisplayToolbarItemIdentifier)
  767. self.leftSideViewController.showPanelView(show: readLeftViewShowPanel)
  768. if readLeftViewShowPanel {
  769. self.toolbarController.selectItem(KMLeftControlToolbarItemIdentifier)
  770. }
  771. if self.readToolMode == .editPDFToolMode { // 内容编辑
  772. self.toolbarController.selectItem(KMDocumentEditToolbarItemIdentifier)
  773. } else {
  774. self.toolbarController.view.isHidden = false
  775. self.listView.toolMode = readToolMode
  776. self.listView.annotationType = readAnnotationType
  777. // self.toolbarController.toolbarType = .viewSetting
  778. }
  779. } else {
  780. self.toolbarController.toolbarType = .None
  781. }
  782. if readAlertView != nil {
  783. readAlertView?.removeFromSuperview()
  784. }
  785. readAlertView = CustomAlertView.alertView(message: NSLocalizedString("Read Mode Off", comment: ""), fromView: self.view, withStyle: .blue, backgroundColor: NSColor.km_init(hex: "#36383B"))
  786. UserDefaults.standard.set(isReadMode, forKey: "kKMPDFViewIsReadMode")
  787. UserDefaults.standard.synchronize()
  788. }
  789. @objc func addOutLineItemAction() {
  790. let labelString = "\(KMLocalizedString("Page", nil)) \((self.listView?.currentPageIndex ?? 0) + 1)"
  791. let label = self.listView?.currentSelection?.string() ?? labelString
  792. let dest = self.listView?.currentDestination
  793. if let row = self.leftSideViewController.selectedRowIndexes().last {
  794. if let ol = self.leftSideViewController.tocOutlineView.item(atRow: row) as? CPDFOutline {
  795. _ = self.listView.addOutline(for: ol.parent, label: label, dest: dest, at: ol.index+1)
  796. } else {
  797. let idx = self.listView?.document?.outlineRoot()?.numberOfChildren ?? 0
  798. _ = self.listView.addOutlineForRoot(label: label, dest:dest, at: idx)
  799. }
  800. } else {
  801. let idx = self.listView?.document?.outlineRoot()?.numberOfChildren ?? 0
  802. _ = self.listView.addOutlineForRoot(label: label, dest:dest, at: idx)
  803. }
  804. }
  805. @objc func showTTSView() {
  806. self.showTTSWindow()
  807. }
  808. @objc func showShareAction() {
  809. }
  810. @objc func lookUpAction() {
  811. let label = self.listView?.currentSelection?.string() ?? ""
  812. self.toolbarController.showFindBar()
  813. self.toolbarController.findSearchView.searchString(label)
  814. // self.toolbarController.findSearchView.find(Any.self)
  815. }
  816. @objc func searchBaiduAction() {
  817. let label = self.listView?.currentSelection?.string() ?? ""
  818. let query = label.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
  819. if let url = URL(string: "https://www.baidu.com/s?wd=\(query)") {
  820. NSWorkspace.shared.open(url)
  821. }
  822. }
  823. @objc func showInfoInFinder() {
  824. }
  825. @objc func NextPageAction() {
  826. }
  827. @objc func PreviousPageAction() {
  828. }
  829. @objc func TranslateItemAction() {
  830. // 获取选中的文本
  831. if let selection = self.listView?.currentSelection?.string() {
  832. // 进行翻译
  833. let escapedText = selection.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
  834. let urlStr = "https://translate.google.com/?sl=auto&amp;tl=zh-CN&amp;text=\(escapedText)"
  835. if let url = URL(string: urlStr) {
  836. NSWorkspace.shared.open(url)
  837. }
  838. } else {
  839. print("No text selected.")
  840. }
  841. }
  842. @objc func AutoScrollItemAction() {
  843. //增加判断,如果是正在滚动,就停止,否则就开始滚动
  844. self.listView.autoFlow()
  845. }
  846. @objc func shareFromService(sender: NSMenuItem) {
  847. if ((NSApp.mainWindow?.windowController is KMBrowserWindowController) == false) {
  848. return
  849. }
  850. var string = ""
  851. if let freeTextAnnotation = listView.activeAnnotation as? CPDFFreeTextAnnotation {
  852. string = freeTextAnnotation.contents ?? ""
  853. } else if let markupAnnotation = listView.activeAnnotation as? CPDFMarkupAnnotation {
  854. if let page = markupAnnotation.page {
  855. if let selection = page.selection(for: markupAnnotation.bounds) {
  856. string = selection.string() ?? ""
  857. }
  858. }
  859. } else {
  860. string = listView.currentSelection?.string() ?? ""
  861. }
  862. let windowControler = NSApp.mainWindow?.windowController as! KMBrowserWindowController
  863. let model = windowControler.browser?.tabStripModel
  864. if let cnt = model?.count(), cnt <= 0 {
  865. return
  866. }
  867. if let data = model?.activeTabContents().isHome, data {
  868. return
  869. }
  870. let document: KMMainDocument = model?.activeTabContents() as! KMMainDocument
  871. if string.count > 0 {
  872. let represent : NSSharingService = sender.representedObject as! NSSharingService
  873. represent.perform(withItems: [string])
  874. return
  875. }
  876. let represent = sender.representedObject as? NSSharingService
  877. represent?.perform(withItems: [string])
  878. }
  879. @objc func cutAction(sender: NSMenuItem) {
  880. }
  881. @objc func deleteAction(sender: NSMenuItem) {
  882. }
  883. @objc func ColorsItemAction(sender: NSMenuItem) {
  884. }
  885. @objc func LinesItemAction(sender: NSMenuItem) {
  886. }
  887. @objc func EditNoteItemAction(sender: NSMenuItem) {
  888. }
  889. @objc func AITranslateItemAction(sender: NSMenuItem) {
  890. self.showAITypeChooseView(aiConfigType: .translate)
  891. }
  892. @objc func AIProofreadItemAction(sender: NSMenuItem) {
  893. self.showAITypeChooseView(aiConfigType: .proofreading)
  894. }
  895. @objc func AIRewriteItemAction(sender: NSMenuItem) {
  896. self.showAITypeChooseView(aiConfigType: .reWriting)
  897. }
  898. // @objc func highlightLinks() {
  899. // let highlightLinks = KMPreferenceManager.shared.highlightLinks
  900. // KMPreferenceManager.shared.highlightLinks = !highlightLinks
  901. // }
  902. }
  903. // MARK: - KMEditImagePropertyViewControllerDelegate
  904. extension KMMainViewController: KMEditImagePropertyViewControllerDelegate {
  905. func editImagePropertyViewControllerDidChanged(controller: KMEditImagePropertyViewController, type: KMEditImagePropertyViewControllerChangeType) {
  906. self.model.isPDFTextImageEdited = true
  907. }
  908. }
  909. // MARK: - KMSnapshotWindowControllerDelegate
  910. extension KMMainViewController: KMSnapshotWindowControllerDelegate {
  911. func snapshotControllerWillClose(_ controller: KMSnapshotWindowController) {
  912. self.leftSideViewController.snapshotControllerWillClose(controller)
  913. }
  914. func snapshotController(_ controller: KMSnapshotWindowController, miniaturizedRect isMiniaturize: Bool) -> NSRect {
  915. if isMiniaturize && self.interactionMode != .presentation {
  916. if self.interactionMode != .legacyFullScreen && self.model.leftPanelOpen == false {
  917. self.toggleLeftPane()
  918. } else if self.interactionMode == .legacyFullScreen {
  919. // else if ([self interactionMode] == SKLegacyFullScreenMode && ([rightSideWindow state] == NSDrawerClosedState || [rightSideWindow state] == NSDrawerClosingState)) {
  920. // [rightSideWindow expand];
  921. // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hideRightSideWindow:) userInfo:NULL repeats:NO];
  922. }
  923. var row = NSNotFound
  924. for (i,sp) in self.leftSideViewController.snapshots.enumerated() {
  925. if controller.isEqual(sp.windowC) {
  926. row = i
  927. }
  928. }
  929. if (row != NSNotFound) {
  930. if self.leftSideViewController.type.methodType != .snapshot {
  931. self.leftSideViewController.leftView.segmentedControl.selectedSegment = 3
  932. } else {
  933. self.leftSideViewController.refreshUIOfSnapshotIfNeed()
  934. }
  935. self.leftSideViewController.snapshotTableView.scrollRowToVisible(row)
  936. }
  937. }
  938. return self.leftSideViewController.snapshotController(controller, miniaturizedRect: isMiniaturize)
  939. }
  940. func snapshotControllerDidFinishSetup(_ controller: KMSnapshotWindowController) {
  941. self.leftSideViewController.snapshotControllerDidFinishSetup(controller)
  942. }
  943. }
  944. // MARK: - CPDFDocumentDelegate
  945. extension KMMainViewController: CPDFDocumentDelegate {
  946. func documentDidBeginDocumentFind(_ document: CPDFDocument!) {
  947. self.leftSideViewController.documentDidBeginFind()
  948. // [statusBar setProgressIndicatorStyle:SKProgressIndicatorBarStyle];
  949. // [[statusBar progressIndicator] setMaxValue:[[note object] pageCount]];
  950. // [[statusBar progressIndicator] setDoubleValue:0.0];
  951. // [statusBar startAnimation:self];
  952. // [self willChangeValueForKey:SEARCHRESULTS_KEY];
  953. // [self willChangeValueForKey:GROUPEDSEARCHRESULTS_KEY];
  954. }
  955. func documentDidEndDocumentFind(_ document: CPDFDocument!) {
  956. self.leftSideViewController.documentDidEndFind()
  957. // [self didChangeValueForKey:GROUPEDSEARCHRESULTS_KEY];
  958. // [self didChangeValueForKey:SEARCHRESULTS_KEY];
  959. // [statusBar stopAnimation:self];
  960. // [statusBar setProgressIndicatorStyle:SKProgressIndicatorNone];
  961. // NSArray *highlights = [[NSArray alloc] initWithArray:searchResults copyItems:YES];
  962. // [highlights setValue:[NSColor yellowColor] forKey:@"color"];
  963. // [self.pdfView setHighlightedSelections:highlights];
  964. // [highlights release];
  965. }
  966. }
  967. // MAKR: - CPDFViewDelegate,CPDFListViewDelegate
  968. extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
  969. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  970. self.dealDocumentDidLoaded()
  971. let notification = Notification(name: Notification.Name(rawValue: "pdfViewDocumentDidLoaded"))
  972. self.preferenceDidChangeNotification(notification:notification)
  973. let leftWidthNumber = UserDefaults.standard.object(forKey: CPDFOfficeLeftSidePaneWidthKey) as? NSNumber ?? NSNumber(value: self.model.panelWidth + functionWidth)
  974. let rightWidthNumber = UserDefaults.standard.object(forKey: CPDFOfficeRightSidePaneWidthKey) as? NSNumber ?? NSNumber(value: self.model.defaultRightWidth)
  975. applyLeftSideWidth(leftWidthNumber.doubleValue, rightSideWidth: rightWidthNumber.doubleValue)
  976. self.updatePageIndicatoreType()
  977. }
  978. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  979. self.updatePageIndicatoreType()
  980. NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: "KMPDFViewCurrentPageDidChanged"), object: self.document)
  981. // KMPrint("KMPDFViewCurrentPageDidChanged")
  982. }
  983. func pdfViewScaleDidChanged(_ pdfView: CPDFView!) {
  984. self.toolbarController.mainToolBarView?.zoomTextField.stringValue = "\(Int(self.listView.scaleFactor * 100))%"
  985. }
  986. func pdfViewDidClick(onLink pdfView: CPDFView!, withURL url: String!) {
  987. if let urlString = url, urlString == kKMPurchaseProductURLString {
  988. //跳转订阅比较表
  989. let _ = KMComparativeTableViewController.show(window: NSApp.mainWindow ?? NSWindow())
  990. return
  991. }
  992. KMTools.openURL(urlString: url)
  993. }
  994. func pdfViewPerformURL(_ pdfView: CPDFView!, withContent content: String!) {
  995. KMPrint("pdfViewPerformURL")
  996. if content != nil {
  997. NSWorkspace.shared.open(URL(string: content)!)
  998. } else {
  999. let alert = NSAlert()
  1000. alert.alertStyle = .critical
  1001. alert.informativeText = NSLocalizedString("The hyperlink is invalid.", comment: "")
  1002. alert.messageText = ""
  1003. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  1004. alert.runModal()
  1005. return
  1006. }
  1007. }
  1008. func pdfViewPerformPrint(_ pdfView: CPDFView!) {
  1009. KMPrint("pdfViewPerformPrint")
  1010. self.showPrintWindow()
  1011. }
  1012. func pdfViewPerformGo(toPage pdfView: CPDFView!) {
  1013. KMPrint("pdfViewPerformGo")
  1014. }
  1015. func pdfViewOpenPDF(_ pdfView: CPDFView!, forRemoteGoTo action: CPDFAction!) {
  1016. KMPrint("pdfViewOpenPDF")
  1017. }
  1018. func pdfViewPerformReset(_ pdfView: CPDFView!) {
  1019. KMPrint("pdfViewPerformReset")
  1020. // self.listView.resetFormAnnotation()
  1021. pdfView.document.resetForm()
  1022. }
  1023. func pdfViewEditingBlockDidChanged(_ pdfView: CPDFView!) {
  1024. KMPrint("pdfViewEditingBlockDidChanged")
  1025. }
  1026. func pdfViewAsBookBookmark() -> NSImage! {
  1027. return NSImage(named: "KMImageNameUXIconPDFViewBookMark")!
  1028. }
  1029. func pdfViewEditingSelectionDidChanged(_ pdfView: CPDFView!) {
  1030. self.editPDFHanddler.pdfViewEditingSelectionDidChanged(pdfView)
  1031. }
  1032. func pdfViewEditingAreaDidChanged(_ pdfView: CPDFView!) {
  1033. self.editPDFHanddler.pdfViewEditingAreaDidChanged(pdfView)
  1034. }
  1035. func pdfViewEditingCropBoundsDidChanged(_ pdfView: CPDFView!, editing editArea: CPDFEditArea!) {
  1036. self.editPDFHanddler.pdfViewEditingCropBoundsDidChanged(pdfView, editing: editArea)
  1037. }
  1038. //编辑PDF 创建图片区域回调
  1039. func pdfViewEditingAddImageArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1040. self.editPDFHanddler.pdfViewEditingAddImageArea(pdfView, add: page, add: rect)
  1041. }
  1042. func pdfViewEditingAddTextArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1043. self.editPDFHanddler.pdfViewEditingAddTextArea(pdfView, add: page, add: rect)
  1044. }
  1045. func pdfViewMobileEditingBegan(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1046. self.editPDFHanddler.pdfViewMobileEditingBegan(point, for: pdfView, forEditing: editingAreas)
  1047. }
  1048. func pdfViewMobileEditingMove(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1049. self.editPDFHanddler.pdfViewMobileEditingMove(point, for: pdfView, forEditing: editingAreas)
  1050. }
  1051. func pdfViewMobileEditingEnd(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1052. self.editPDFHanddler.pdfViewMobileEditingEnd(point, for: pdfView, forEditing: editingAreas)
  1053. }
  1054. func pdfViewEditingSelectCharDidChanged(_ pdfView: CPDFView!) {
  1055. self.editPDFHanddler.pdfViewEditingSelectCharDidChanged(pdfView)
  1056. }
  1057. func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
  1058. let command = theEvent.modifierFlags.contains(.command)
  1059. let control = theEvent.modifierFlags.contains(.control)
  1060. KMPrint(theEvent.keyCode)
  1061. if self.listView.isEditing() {
  1062. if control && theEvent.keyCode == 11 { // ctr + b
  1063. self.editPDFHanddler.fontBoldAction()
  1064. return false
  1065. } else if control && theEvent.keyCode == 34 { // ctr +i
  1066. self.editPDFHanddler.fontItalicAction()
  1067. return false
  1068. } else if theEvent.keyCode == 36 { // enter
  1069. if self.listView.isCropMode {
  1070. self.editPDFHanddler.cropComfirmAction()
  1071. return false
  1072. }
  1073. }
  1074. }
  1075. if (theEvent.keyCode == 11 && command) { // command + B [添加书签]
  1076. self.menuItemBookMarkClick_add(sender: NSMenuItem())
  1077. return false
  1078. } else if (command && control && theEvent.keyCode == 14) { // command + control + E [注释 橡皮擦]
  1079. return false
  1080. } else if (theEvent.keyCode == 123) { // 向左
  1081. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1082. return false
  1083. } else {
  1084. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToPreviousPage()) {
  1085. self.listView.goToPreviousPage(nil)
  1086. return false
  1087. }
  1088. }
  1089. } else if (theEvent.keyCode == 126) { // 向上
  1090. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1091. return false
  1092. } else {
  1093. if (self.listView.isContinousScroll()) {
  1094. return true
  1095. }
  1096. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToPreviousPage()) {
  1097. self.listView.goToPreviousPage(nil)
  1098. return false
  1099. }
  1100. }
  1101. } else if (theEvent.keyCode == 124) { // 向右
  1102. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1103. return false
  1104. } else {
  1105. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToNextPage()) {
  1106. self.listView.goToNextPage(nil)
  1107. return false
  1108. }
  1109. }
  1110. } else if (theEvent.keyCode == 125) { // 向下
  1111. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1112. return false
  1113. } else {
  1114. if (self.listView.isContinousScroll()) {
  1115. return true
  1116. }
  1117. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToNextPage()) {
  1118. self.listView.goToNextPage(nil)
  1119. return false
  1120. }
  1121. }
  1122. } else if (theEvent.keyCode == 36) {
  1123. if self.listView.annotationType == .addImage || self.listView.annotationType == .addText {
  1124. if self.listView.isEditImage {
  1125. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  1126. }
  1127. }
  1128. }
  1129. if theEvent.keyCode == 53 {
  1130. self.exitFullScreen(Any.self)
  1131. if self.isReadMode {
  1132. self.closeReadModel()
  1133. }
  1134. self.leftSideViewCancelSelect()
  1135. if (self.toolbarController.toolbarType.isToolMode()) {
  1136. self.toolbarController.selectItem(self.toolbarController.toolbarType.itemIdentifier())
  1137. }
  1138. }
  1139. return true
  1140. }
  1141. func pdfListViewMenuValidate(_ pdfListView: CPDFListView!, menuItem: NSMenuItem!, isTakesEffect: UnsafeMutablePointer<ObjCBool>!) -> Bool {
  1142. guard let action = menuItem.action else {
  1143. isTakesEffect.pointee = false
  1144. return false
  1145. }
  1146. if (KMSystemMenu.isEditSelector(sel: action)) {
  1147. if (KMSystemMenu.Edit.deleteSelector == action) {
  1148. isTakesEffect.pointee = true
  1149. return self.listView.activeAnnotations.count > 0
  1150. } else if (KMSystemMenu.Edit.copySelector == action) {
  1151. isTakesEffect.pointee = true
  1152. return true//self.listView.canCopy()
  1153. } else if (KMSystemMenu.Edit.cutSelector == action) {
  1154. isTakesEffect.pointee = true
  1155. return self.listView.canCopy()
  1156. } else if (KMSystemMenu.Edit.pasteSelector == action) {
  1157. isTakesEffect.pointee = true
  1158. return self.listView.canPaste()
  1159. }
  1160. }
  1161. isTakesEffect.pointee = false
  1162. return false
  1163. }
  1164. func pdfViewEditingOperationDidChanged(_ pdfView: CPDFView!) {
  1165. self.editPDFHanddler.pdfViewEditingOperationDidChanged(pdfView)
  1166. }
  1167. func pdfViewEditingDoubleClick(_ pdfView: CPDFView!, imageArea editArea: CPDFEditArea!) {
  1168. self.editPDFHanddler.pdfViewEditingDoubleClick(pdfView, imageArea: editArea)
  1169. }
  1170. //MARK: -CPDFListViewDelegate
  1171. func cPDFListView(_ pdfListView: CPDFListView, didDelete annotation: CPDFAnnotation, in pdfPage: CPDFPage) {
  1172. self.leftSideViewController.updateThumbnail(at: Int(pdfPage.pageIndex()))
  1173. }
  1174. func pdfListViewChangeatioActiveAnnotations(_ pdfListView: CPDFListView!, forActiveAnnotations annotations: [CPDFAnnotation]!, isRightMenu: Bool) {
  1175. self.view.window?.makeFirstResponder(self.listView)
  1176. if isRightMenu {
  1177. } else if annotations.count > 0 {
  1178. if annotations.count > 1 {
  1179. let fristAnnotation = annotations.first
  1180. var isSameAnnotation = true
  1181. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1182. for annotation in annotations {
  1183. let cunrrentClassName = NSStringFromClass(annotation.classForCoder)
  1184. if (className == "CPDFSquareAnnotation") ||
  1185. (className == "CPDFCircleAnnotation") ||
  1186. (className == "CPDFLineAnnotation") {
  1187. if (cunrrentClassName != "CPDFSquareAnnotation") &&
  1188. (cunrrentClassName != "CPDFCircleAnnotation") &&
  1189. (cunrrentClassName != "CPDFLineAnnotation") {
  1190. isSameAnnotation = false
  1191. }
  1192. } else {
  1193. if className != cunrrentClassName {
  1194. isSameAnnotation = false
  1195. }
  1196. }
  1197. }
  1198. if isSameAnnotation == false {
  1199. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1200. // self.closeRightPane()
  1201. } else {
  1202. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1203. self.openRightPane()
  1204. }
  1205. } else {
  1206. let fristAnnotation = annotations.first
  1207. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1208. if self.isReadMode {
  1209. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1210. self.closeRightPane()
  1211. } else {
  1212. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1213. if className != "CPDFStampAnnotation" &&
  1214. className != "CPDFSignatureAnnotation" &&
  1215. className != "CPDFListStampAnnotation" {
  1216. self.openRightPane()
  1217. }
  1218. }
  1219. }
  1220. } else if (annotations.count == 0){
  1221. if pdfListView.annotationType == .unkown {
  1222. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1223. self.closeRightPane()
  1224. } else {
  1225. if self.isReadMode {
  1226. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1227. self.closeRightPane()
  1228. } else {
  1229. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1230. self.openRightPane()
  1231. }
  1232. }
  1233. }
  1234. }
  1235. func pdfListViewChangedAnnotationType(_ pdfListView: CPDFListView!, for annotationType: CAnnotationType) {
  1236. if(annotationType == .unkown) {
  1237. // self.rightSideViewController.view.isHidden = true
  1238. self.rightSideViewController.isHidden = true
  1239. self.closeRightPane()
  1240. }
  1241. let aType = annotationType
  1242. if aType.isMarkup() || aType == .anchored || aType == .freeText || aType.isSquare() || aType == .link {
  1243. KMDataManager.ud_set(annotationType.rawValue, forKey: SKLastAnnotationModeKey)
  1244. }
  1245. }
  1246. ///开始定位链接注释
  1247. func pdfListViewLinkDestinationStart(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1248. if self.locationPageView.superview == nil {
  1249. self.locationPageView.frame = CGRect(x: 0, y: pdfListView.frame.maxY-32, width: pdfListView.frame.width, height: 32)
  1250. pdfListView.addSubview(self.locationPageView)
  1251. }
  1252. }
  1253. ///刷新链接注释
  1254. func pdfListViewLinkDestinationEnd(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1255. if self.locationPageView.superview != nil {
  1256. self.locationPageView.removeFromSuperview()
  1257. }
  1258. if self.rightSideViewController.subViewType == .AnnotationProperts && pdfListView.annotationType == .link {
  1259. self.rightSideViewController.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1260. }
  1261. }
  1262. func pdfListViewMenuItemsEditing(at point: CGPoint, for page: CPDFPage!, menuItems: [NSMenuItem]!) -> [NSMenuItem]! {
  1263. if (listView.toolMode != CToolMode.editPDFToolMode) {
  1264. return menuItems
  1265. }
  1266. var tMenuItems = menuItems;
  1267. if(listView.isSelectEditCharRange() ||
  1268. listView.isSelecteditArea(with: point)) {
  1269. tMenuItems?.append(NSMenuItem.separator())
  1270. // tMenuItems?.append(self.fontColorMenuItem())
  1271. // tMenuItems?.append(self.fontSizeMenuItem())
  1272. }
  1273. let areas = self.listView.editingAreas() ?? []
  1274. if areas.count == 1 {
  1275. let fristAreas = areas.first
  1276. if fristAreas is CPDFEditImageArea {
  1277. self.listView.selectImageAreas = fristAreas as? CPDFEditImageArea
  1278. if self.listView.isEditImage {
  1279. tMenuItems?.removeAll()
  1280. tMenuItems?.append(self.corpImageMenuItem())
  1281. tMenuItems?.append(self.cancelCorpImageMenuItem())
  1282. tMenuItems?.append(self.restoreCorpImageMenuItem())
  1283. } else {
  1284. tMenuItems?.append(NSMenuItem.separator())
  1285. tMenuItems?.append(self.cutImageArea())
  1286. tMenuItems?.append(self.replaceImageArea())
  1287. tMenuItems?.append(self.exportImageArea())
  1288. }
  1289. } else {
  1290. if tMenuItems?.count != 1 {
  1291. tMenuItems?.swapAt(0, 1)
  1292. }
  1293. }
  1294. } else if areas.count == 0 {
  1295. tMenuItems?.append(NSMenuItem.separator())
  1296. tMenuItems?.append(self.addText())
  1297. tMenuItems?.append(self.addImage())
  1298. }
  1299. return tMenuItems
  1300. }
  1301. func tableMenu(_ menu: NSMenu, withTable table: KMTableAnnotation, point: CGPoint) -> NSMenu {
  1302. if table.currentCell.row >= 0 && table.currentCell.column >= 0 {
  1303. 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"]
  1304. let actions = ["formAnnotTextEdit:", "", "addRowAbove:", "addRowBelow:", "", "addColumnBefore:", "addColumnAfter:", "", "deleteRow:", "deleteColumn:", "deleteTabel", "cutCell:", "copyCell:", "pasteCell:", "pasteAndMatchStyle:", "deleteCellContents:", "clearAll:"]
  1305. for i in 0..<itemTitles.count {
  1306. var item: NSMenuItem? = nil
  1307. if itemTitles[i] == "" {
  1308. item = NSMenuItem.separator()
  1309. menu.insertItem(item!, at: i)
  1310. } else {
  1311. item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  1312. item!.target = self
  1313. item!.action = NSSelectorFromString(actions[i])
  1314. if itemTitles[i] == "Paste" /*&& !_copyCellData*/ {
  1315. item!.action = nil
  1316. } else if itemTitles[i] == "Paste and Match Style" /*&& !_copyCellData */{
  1317. item!.action = nil
  1318. } else if itemTitles[i] == "Add Row Above" {
  1319. let path1 = table.crossLines[table.rowNumber - table.currentCell.row]
  1320. let path2 = table.crossLines[table.rowNumber - table.currentCell.row - 1]
  1321. if (path1 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.round && table.headerCount() >= 5 {
  1322. item!.action = nil
  1323. } else if (path2 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.bevel && table.footerCount() >= 5 {
  1324. item!.action = nil
  1325. }
  1326. }
  1327. item!.title = NSLocalizedString(item!.title, comment: "")
  1328. item!.representedObject = NSValue(point: point)
  1329. menu.insertItem(item!, at: i)
  1330. }
  1331. }
  1332. } else {
  1333. let itemTitles = ["Cut", "Copy", "Paste", "Delete"]
  1334. let actions = ["cut:", "copy:", "paste:", "delete:"]
  1335. for i in 0..<itemTitles.count {
  1336. let item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  1337. item.target = self
  1338. item.action = NSSelectorFromString(actions[i])
  1339. item.title = NSLocalizedString(item.title, comment: "")
  1340. menu.insertItem(item, at: i)
  1341. item.representedObject = NSValue(point: point)
  1342. }
  1343. }
  1344. return menu
  1345. }
  1346. func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer<NSMenu?>!, isMoveSelectAnno: Bool) {
  1347. self.mouseRightMenuEvent = theEvent
  1348. var currentMenu : NSMenu = menu.pointee!
  1349. if let activeAnno = listView.activeAnnotation as? KMTableAnnotation {//Table
  1350. var pagePoint = NSPoint()
  1351. _ = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true)
  1352. currentMenu.removeAllItems()
  1353. let annotation = activeAnno
  1354. annotation.completeEditCellText()
  1355. if !(NSIsEmptyRect(annotation.drawRect)) {
  1356. annotation.drawLine(pagePoint)
  1357. NotificationCenter.default.post(name: NSNotification.Name.KMPDFViewTableAnnotationDidChange, object: self, userInfo: ["point": NSValue(point: pagePoint)])
  1358. }
  1359. if (annotation.rowNumber - annotation.currentCell.row - 1) < 0 {
  1360. return
  1361. }
  1362. currentMenu = tableMenu(currentMenu, withTable: listView.activeAnnotation as! KMTableAnnotation, point: pagePoint)
  1363. listView.needsDisplay = true
  1364. return
  1365. }
  1366. if (listView.toolMode == .selectToolMode){
  1367. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1368. currentMenu.insertItem(self.printingMenu(), at: 3)
  1369. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1370. currentMenu.insertItem(self.setCropStype(), at: 3)
  1371. currentMenu.insertItem(self.setSnapshotStype(), at: 3)
  1372. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1373. export.submenu = self.exportMenu()
  1374. currentMenu.insertItem(export, at: 3)
  1375. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1376. if listView.activeAnnotation == nil{
  1377. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1378. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1379. }
  1380. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1381. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1382. // currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1383. // currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1384. // currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1385. // currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1386. return
  1387. }
  1388. if (listView.toolMode == .moveToolMode || listView.toolMode == .magnifyToolMode){
  1389. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1390. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1391. currentMenu.insertItem(self.setCropStype(), at: 0)
  1392. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1393. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1394. currentMenu.insertItem(self.addOutlineStype(), at: 0)
  1395. currentMenu.insertItem(self.addBookmarkMenu(), at: 0)
  1396. if listView.activeAnnotation == nil{
  1397. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1398. currentMenu.insertItem(self.setAnnotationToolStype(), at: 0)
  1399. }
  1400. // currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1401. // currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1402. // currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1403. // currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1404. return
  1405. }
  1406. if currentMenu.items.count > 3 {
  1407. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1408. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1409. }
  1410. if listView.currentSelection != nil && listView.activeAnnotations.count < 1{
  1411. if listView.currentSelection.selectionType() == .text {
  1412. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1413. currentMenu.insertItem(self.setSearchBaiduStype(), at: 3)
  1414. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1415. currentMenu.insertItem(self.setLookUpStype(), at: 3)
  1416. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1417. currentMenu.insertItem(self.addOutlineStype(), at: 3)
  1418. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1419. // if listView.activeAnnotation == nil{
  1420. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1421. // }
  1422. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1423. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1424. currentMenu.insertItem(self.setShareStype(), at: 3)
  1425. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1426. }
  1427. currentMenu.insertItem(self.enterAnnotationStype(), at: 3)
  1428. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1429. if listView.currentSelection.selectionType() == .image{
  1430. //
  1431. // currentMenu.insertItem(self.setCutStype(), at: 1)
  1432. // }
  1433. // if listView.activeAnnotations.count > 0 {
  1434. // currentMenu.insertItem(self.setDeleteStype(), at: 3)
  1435. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1436. currentMenu.insertItem(self.addOutlineStype(), at: 6)
  1437. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1438. currentMenu.insertItem(self.setAnnotationToolStype(), at: 6)
  1439. // currentMenu.insertItem(self.setEditNoteStype(), at: 6)
  1440. // currentMenu.insertItem(self.setRotateStype(), at: 6)
  1441. // currentMenu.insertItem(self.setLinesStype(), at: 6)
  1442. // currentMenu.insertItem(self.setColorsStype(), at: 6)
  1443. // }
  1444. }
  1445. if listView.currentSelection.selectionType() == .text {
  1446. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1447. currentMenu.insertItem(self.setTranslateStype(), at: currentMenu.items.count)
  1448. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1449. // currentMenu.insertItem(self.setServicesStype(), at: currentMenu.items.count)
  1450. }
  1451. }
  1452. if listView.activeAnnotation != nil || isMoveSelectAnno {
  1453. if let data = self.listView?.activeAnnotation?.type?.lowercased(), data == "stamp"{
  1454. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1455. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1456. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1457. }else{
  1458. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1459. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1460. // currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1461. // currentMenu.insertItem(self.setAnnotationToolStype(), at: currentMenu.items.count - 15)
  1462. // currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1463. // currentMenu.insertItem(self.addBookmarkMenu(), at: currentMenu.items.count - 15)
  1464. // currentMenu.insertItem(self.addOutlineStype(), at: currentMenu.items.count - 15)
  1465. // currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1466. // currentMenu.insertItem(self.setSnapshotStype(), at: currentMenu.items.count - 15)
  1467. // currentMenu.insertItem(self.setCropStype(), at: currentMenu.items.count - 15)
  1468. // currentMenu.insertItem(self.setTTSStype(), at: currentMenu.items.count - 15)
  1469. if let anno = self.listView.activeAnnotation, anno.isKind(of: CPDFStampAnnotation.self) {
  1470. // currentMenu.insertItem(self.setRotateStype(), at: currentMenu.items.count - 15)
  1471. } else {
  1472. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1473. currentMenu.insertItem(self.setShareStype(), at: currentMenu.items.count - 15)
  1474. }
  1475. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1476. }
  1477. }
  1478. if listView.activeAnnotation == nil && listView.currentSelection == nil{
  1479. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1480. if(listView.toolMode == .selectToolMode) {
  1481. if NSIsEmptyRect(listView.currentSelectionRect()) {
  1482. currentMenu.insertItem(self.zoomSelectionMenuItem(), at: 0)
  1483. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1484. }
  1485. currentMenu.insertItem(self.printingMenu(), at: 0)
  1486. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1487. currentMenu.insertItem(self.setCropStype(), at: 0)
  1488. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1489. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1490. export.submenu = self.exportMenu()
  1491. currentMenu.insertItem(export, at: currentMenu.items.count)
  1492. }else{
  1493. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1494. currentMenu.insertItem(self.setTTSStype(), at: 2)
  1495. currentMenu.insertItem(self.setCropStype(), at: 2)
  1496. currentMenu.insertItem(self.setSnapshotStype(), at: 2)
  1497. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1498. currentMenu.insertItem(self.addOutlineStype(), at: 2)
  1499. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1500. currentMenu.insertItem(self.enterAnnotationStype(), at: 2)
  1501. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1502. if(currentMenu.items.count > 4) {
  1503. currentMenu.insertItem(NSMenuItem.separator(), at: 5)
  1504. }
  1505. if(currentMenu.items.count > 5) {
  1506. currentMenu.insertItem(self.addBookmarkMenu(), at: 6)
  1507. }
  1508. // if (currentMenu.items.count > 6 && self.isReadMode) {
  1509. // currentMenu.removeItem(currentMenu.item(withTitle: "Zoom")!)
  1510. // }
  1511. // currentMenu.insertItem(self.findStringMenu(), at: currentMenu.items.count)
  1512. currentMenu.insertItem(self.setAutoScrollStype(), at: currentMenu.items.count)
  1513. }
  1514. currentMenu.insertItem(self.setAnnotationToolStype(), at: 5)
  1515. }
  1516. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1517. // currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1518. // currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1519. // currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1520. for item in currentMenu.items {
  1521. if (item.action == NSSelectorFromString("menuItemClick_HidenorShowNote:")) {
  1522. // 显示与隐藏注释 item action 截取
  1523. item.action = #selector(menuItemClick_HidenorShowNote)
  1524. item.target = self
  1525. break
  1526. }
  1527. }
  1528. }
  1529. func pdfListViewAddAnnotations(_ pdfListView: CPDFListView!, forAdd annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1530. var addRedact = false
  1531. for anno in annotations {
  1532. if (anno.isKind(of: CPDFRedactAnnotation.self)) {
  1533. addRedact = true
  1534. } else if anno is CPDFSquareAnnotation || anno is CPDFCircleAnnotation {
  1535. anno.contents = pdfPage?.string(for: anno.bounds) ?? ""
  1536. }
  1537. }
  1538. self.model.hasAddRedact = addRedact
  1539. if /*self.isReadMode || */self.listView.toolMode == .moveToolMode {
  1540. self.listView.toolMode = .textToolMode
  1541. self.listView.annotationType = .unkown
  1542. self.toolbarController.toolbarType = .Annatiton
  1543. }
  1544. if (self.model.rightMouseEventing) {
  1545. self.model.rightMouseEventing = false
  1546. if (self.toolbarController.ignoreCurrentAnnotationTypeChange && self.listView.annotationType == .ink) {
  1547. self.listView.toolMode = .textToolMode
  1548. self.listView.annotationType = .unkown
  1549. }
  1550. }
  1551. self.toolbarController.ignoreCurrentAnnotationTypeChange = false
  1552. self.leftSideViewController.refreshUIForAddAnnotation(annos: annotations, page: pdfPage)
  1553. }
  1554. func pdfListViewRemoveAnnotations(_ pdfListView: CPDFListView!, forRemove annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1555. self.leftSideViewController.annoList_refreshUIForDeleteAnnotations(annos: annotations, page: pdfPage)
  1556. }
  1557. func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) {
  1558. if (!self.listView.isEqual(to: pdfListView)) {
  1559. return
  1560. }
  1561. if (self.listView.toolMode != .selectToolMode) {
  1562. return
  1563. }
  1564. if (self.topTipBox.isHidden || self.topTipBox.contentView?.subviews.count == 0) {
  1565. return
  1566. }
  1567. let tipView = self.topTipBox.contentView?.subviews.first
  1568. if (tipView?.isKind(of: KMCropTipView.self) == false) {
  1569. return
  1570. }
  1571. (tipView as! KMCropTipView).setString(string: "请按 Enter 键确定裁剪区域")
  1572. }
  1573. func pdfListViewKeyDowClosePanel(_ speedy: CPDFViewSidebarSpeedMode, event theEvent: NSEvent!) {
  1574. if(speedy == .right) {
  1575. self.toggleRightPane()
  1576. } else if (speedy == .left) {
  1577. self.menuItemAction_hiddenLeftSide(speedy)
  1578. }
  1579. }
  1580. func pdfListViewEventMarkupColor(with annotation: CPDFAnnotation!) -> [NSColor]! {
  1581. if (annotation.isKind(of: CPDFMarkupAnnotation.self)) {
  1582. if (annotation as! CPDFMarkupAnnotation).markupType() == .highlight {
  1583. return KMAnnotationPropertiesColorManager.manager.markHighlightColors
  1584. } else {
  1585. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1586. }
  1587. } else {
  1588. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1589. }
  1590. }
  1591. func pdfListViewHaveDocumentAttribute() -> Bool {
  1592. if(!self.listView.document.allowsCopying) {
  1593. self.removeOwnerPassword()
  1594. return false
  1595. }
  1596. return true
  1597. }
  1598. func pdfListView(_ sender: CPDFListView!, showSnapshotAtPageNumber pageNum: Int, for rect: NSRect, scaleFactor: CGFloat, autoFits: Bool) {
  1599. let swc = KMSnapshotWindowController(windowNibName: "SnapshotWindow")
  1600. swc.delegate = self
  1601. swc.setPdfDocument(self.listView.document, goToPageNumber: pageNum, rect: rect, scaleFactor: scaleFactor, autoFits: autoFits)
  1602. swc.forceOnTop = self.interactionMode != .normal
  1603. self.myDocument?.addWindowController(swc)
  1604. }
  1605. func pdfListView(_ pdfView: CPDFListView!, documentDataDidChanged docData: Any!, withInfo info: [AnyHashable : Any]!) {
  1606. if let data = info?[CPDFListView.outlineKey] as? Bool, data { // 大纲改变
  1607. guard let ol = docData as? CPDFOutline else {
  1608. return
  1609. }
  1610. let add = info?[CPDFListView.outlineAddKey] as? Bool ?? false
  1611. let remove = info?[CPDFListView.outlineRemoveKey] as? Bool ?? false
  1612. if add {
  1613. self.leftSideViewController.addOutlineAfter(ol)
  1614. }
  1615. if remove {
  1616. self.leftSideViewController.removeOutlineAfter(ol)
  1617. }
  1618. let demote = info?[CPDFListView.outlineDemoteKey] as? Bool ?? false
  1619. let promote = info?[CPDFListView.outlinePromoteKey] as? Bool ?? false
  1620. if demote {
  1621. self.leftSideViewController.demoteOutlineAfter(ol)
  1622. }
  1623. if promote {
  1624. self.leftSideViewController.promoteOutlineAfter(ol)
  1625. }
  1626. }
  1627. }
  1628. //TextEdit
  1629. func pdfListViewDidTextFontChanged(_ pdfListView: CPDFListView!) {
  1630. self.rightSideViewController.eidtPDFTextProperty.reloadData()
  1631. }
  1632. func pdfListViewDidTextColorChanged(_ pdfListView: CPDFListView!, with color: NSColor!) {
  1633. self.rightSideViewController.eidtPDFTextProperty.fontColorChangeAction()
  1634. }
  1635. }