KMMainViewController+UI.swift 99 KB

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