KMLinkViewController.swift 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. //
  2. // KMLinkViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/18.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc public enum PDFLinkType: Int, CaseIterable{
  10. case Page = 0 //
  11. case Web //
  12. case Email //
  13. }
  14. @objc public enum PDFLinkPopupType: Int, CaseIterable{
  15. case None = 0 //默认类型
  16. case Page //
  17. case Web //
  18. case Email //
  19. case MultiSelect //Popup弹窗
  20. }
  21. @objcMembers class KMLinkViewController: NSViewController {
  22. @IBOutlet var contendBox: NSBox!
  23. @IBOutlet var titleLabel: NSTextField!
  24. @IBOutlet var tabsView: ComponentTabs!
  25. @IBOutlet var infoContendView: NSView!
  26. @IBOutlet var linkPageView: KMLinkPageView!
  27. @IBOutlet var linkEmailView: KMLinkEmailView!
  28. @IBOutlet var linkWebView: KMLinkWebView!
  29. private var _annotations: [CPDFLinkAnnotation]? = nil
  30. private weak var _pdfView: CPDFListView? = nil
  31. private var annotation: CPDFLinkAnnotation? = nil
  32. let pageProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: KMLocalizedString("Page"))
  33. let webProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: KMLocalizedString("Web"))
  34. let emailProperty = ComponentTabsProperty(tabsType: .underline_Fill, state: .normal, showIcon: false, title: KMLocalizedString("Email"))
  35. public override func viewDidLoad() {
  36. super.viewDidLoad()
  37. // Do view setup here.
  38. pdfLinkType = .Page
  39. setUpUI()
  40. view.wantsLayer = true
  41. view.layer?.backgroundColor = NSColor.red.cgColor
  42. }
  43. func setUpUI() {
  44. contendBox.fillColor = NSColor.white
  45. titleLabel.stringValue = KMLocalizedString("Link")
  46. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  47. titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
  48. if pdfLinkType == .Page {
  49. pageProperty.state = .pressed
  50. } else if pdfLinkType == .Web {
  51. webProperty.state = .pressed
  52. } else if pdfLinkType == .Email {
  53. emailProperty.state = .pressed
  54. }
  55. tabsView.updateItemProperty([pageProperty, webProperty, emailProperty])
  56. tabsView.delegate = self
  57. linkPageView.delegate = self
  58. linkWebView.delegate = self
  59. linkEmailView.delegate = self
  60. }
  61. //MARK: - Setter
  62. var pdfLinkType: PDFLinkType = .Page {
  63. didSet {
  64. view.window?.makeFirstResponder(nil)
  65. reloadData()
  66. }
  67. }
  68. weak var pdfView: CPDFListView? {
  69. get {
  70. return _pdfView
  71. }
  72. set {
  73. _pdfView = newValue
  74. }
  75. }
  76. var annotations: [CPDFLinkAnnotation]? {
  77. get {
  78. return _annotations
  79. }
  80. set {
  81. _annotations = newValue
  82. if _annotations != nil && _annotations?.isEmpty == false {
  83. annotation = _annotations?.first
  84. } else {
  85. annotation = nil
  86. }
  87. }
  88. }
  89. //MARK: - func
  90. func reloadData() {
  91. linkPageView.isHidden = true
  92. linkEmailView.isHidden = true
  93. linkWebView.isHidden = true
  94. if pdfLinkType == .Page {
  95. linkPageView.isHidden = false
  96. linkPageView.pdfView = pdfView
  97. linkPageView.annotation = annotation
  98. linkPageView.reloadData()
  99. } else if pdfLinkType == .Web {
  100. linkWebView.isHidden = false
  101. } else if pdfLinkType == .Email {
  102. linkEmailView.isHidden = false
  103. }
  104. }
  105. //MARK: - MouseEvent
  106. public override func mouseUp(with event: NSEvent) {
  107. super.mouseUp(with: event)
  108. }
  109. }
  110. //MARK: - ComponentTabsDelegate
  111. extension KMLinkViewController: ComponentTabsDelegate {
  112. public func componentTabsDidSelected(_ view: ComponentTabs, _ property: ComponentTabsProperty) {
  113. if property == pageProperty {
  114. pdfLinkType = .Page
  115. } else if property == webProperty {
  116. pdfLinkType = .Web
  117. } else if property == emailProperty {
  118. pdfLinkType = .Email
  119. }
  120. reloadData()
  121. }
  122. }
  123. //MARK: - KMLinkPageViewDelegate
  124. extension KMLinkViewController: KMLinkPageViewDelegate {
  125. func kmLinkPageViewDidGoToPage(_ view: KMLinkPageView, _ pageIndex: Int) {
  126. if let page = pdfView?.document.page(at: UInt(pageIndex-1)) {
  127. pdfView?.go(toPageIndex: pageIndex-1, animated: false)
  128. }
  129. }
  130. func kmLinkPageViewDidChangeDestination(_ view: KMLinkPageView, _ pageIndex: Int) {
  131. guard let activiteAnno = annotation else {
  132. return
  133. }
  134. activiteAnno.setURL(nil)
  135. if let page = pdfView?.document.page(at: UInt(pageIndex-1)) {
  136. let bounds = page.bounds(for: .cropBox)
  137. let destination = CPDFDestination(page: page, at: NSPoint(x: 0, y: bounds.size.height))
  138. activiteAnno.setDestination(destination)
  139. pdfView?.needsDisplay = true
  140. }
  141. if let page = pdfView?.document.page(at: UInt(pageIndex-1)) {
  142. pdfView?.go(toPageIndex: pageIndex-1, animated: false)
  143. }
  144. }
  145. }
  146. //MARK: - KMLinkPageViewDelegate
  147. extension KMLinkViewController: KMLinkWebViewDelegate {
  148. func kmLinkWebViewDidGo(_ view: KMLinkWebView, _ webString: String) {
  149. }
  150. }
  151. //MARK: - KMLinkPageViewDelegate
  152. extension KMLinkViewController: KMLinkEmailViewDelegate {
  153. func kmLinkEmailViewDidGo(_ view: KMLinkEmailView, _ emailString: String) {
  154. }
  155. }