KMMainViewController+UI.swift 95 KB

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