KMMainViewController+UI.swift 91 KB

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