KMMainViewController+UI.swift 84 KB

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