KMMainViewController+UI.swift 96 KB

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