KMMainViewController+UI.swift 99 KB

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