KMMainViewController+UI.swift 99 KB

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