KMNoteController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. //
  2. // KMNoteController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/11/26.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. class KMNoteController: KMNBaseViewController {
  10. @IBOutlet var colorBGView: NSView!
  11. @IBOutlet var colorLabel: NSTextField!
  12. @IBOutlet var colorGroup: ComponentCColorGroup!
  13. @IBOutlet var typeBGView: NSView!
  14. @IBOutlet var typeLabel: NSTextField!
  15. @IBOutlet var typeItemA: ComponentCSelector!
  16. @IBOutlet var typeItemB: ComponentCSelector!
  17. @IBOutlet var typeItemC: ComponentCSelector!
  18. @IBOutlet var typeItemD: ComponentCSelector!
  19. @IBOutlet var typeItemE: ComponentCSelector!
  20. @IBOutlet var typeItemF: ComponentCSelector!
  21. @IBOutlet var typeItemG: ComponentCSelector!
  22. private var annotations: [CPDFTextAnnotation] = []
  23. var pdfView: CPDFListView?
  24. override func viewDidLoad() {
  25. super.viewDidLoad()
  26. // Do view setup here.
  27. setupProperty()
  28. }
  29. override func updateUILanguage() {
  30. super.updateUILanguage()
  31. reloadUI()
  32. }
  33. override func updateUIThemeColor() {
  34. super.updateUIThemeColor()
  35. reloadUI()
  36. }
  37. func setupProperty() {
  38. colorGroup.delegate = self
  39. typeItemA.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_1"), identifier: "")
  40. typeItemB.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_2"), identifier: "")
  41. typeItemC.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_3"), identifier: "")
  42. typeItemD.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_4"), identifier: "")
  43. typeItemE.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_5"), identifier: "")
  44. typeItemF.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_6"), identifier: "")
  45. typeItemG.properties = ComponentCSelectorProperty(size: .m, state: .normal, iconImage: NSImage(named: "note_7"), identifier: "")
  46. for item in [typeItemA, typeItemB, typeItemC, typeItemD, typeItemE, typeItemF, typeItemG] {
  47. item!.setTarget(self, action: #selector(selectItemClick(_:)))
  48. }
  49. }
  50. func reloadUI() {
  51. colorLabel.stringValue = KMLocalizedString("Color")
  52. colorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  53. colorLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  54. typeLabel.stringValue = KMLocalizedString("Color")
  55. typeLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  56. typeLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  57. }
  58. func reloadData() {
  59. guard let pdfView = self.pdfView else {
  60. return
  61. }
  62. self.annotations.removeAll()
  63. let allAnnotations: [CPDFAnnotation] = pdfView.activeAnnotations as? [CPDFAnnotation] ?? []
  64. for annotation in allAnnotations {
  65. if annotation is CPDFTextAnnotation {
  66. annotations.append((annotation as! CPDFTextAnnotation))
  67. }
  68. }
  69. var firstAnnotation: CPDFTextAnnotation?
  70. if annotations.count > 0 {
  71. firstAnnotation = annotations.first
  72. }
  73. for item in [typeItemA, typeItemB, typeItemC, typeItemD, typeItemE, typeItemF, typeItemG] {
  74. item!.properties.state = .normal
  75. }
  76. if true {
  77. let colors: [NSColor] = KMAnnotationPropertiesColorManager.manager.noteColors
  78. if colors.count > 4 {
  79. let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[0])
  80. let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[1])
  81. let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[2])
  82. let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[3])
  83. let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: colors[4])
  84. colorGroup.setUpWithColorPropertys([colorAProperty, colorBProperty, colorCProperty, colorDProperty], customItemProperty: colorEProperty)
  85. }
  86. }
  87. if annotations.count == 0 {
  88. colorGroup.currentColor = CPDFTextAnnotation.defaultColor()
  89. colorGroup.refreshUI()
  90. let anchoredIconType: CPDFTextAnnotationIconType = CPDFTextAnnotation.defaultType()
  91. if anchoredIconType == .comment {
  92. typeItemA.properties.state = .pressed
  93. } else if anchoredIconType == .key {
  94. typeItemC.properties.state = .pressed
  95. } else if anchoredIconType == .note {
  96. typeItemB.properties.state = .pressed
  97. } else if anchoredIconType == .help {
  98. typeItemD.properties.state = .pressed
  99. } else if anchoredIconType == .newParagraph {
  100. typeItemG.properties.state = .pressed
  101. } else if anchoredIconType == .paragraph {
  102. typeItemE.properties.state = .pressed
  103. } else if anchoredIconType == .insert {
  104. typeItemF.properties.state = .pressed
  105. }
  106. } else if annotations.count == 1, let annotation = firstAnnotation {
  107. colorGroup.currentColor = annotation.color
  108. colorGroup.refreshUI()
  109. let anchoredIconType: CPDFTextAnnotationIconType = annotation.iconType()
  110. if anchoredIconType == .comment {
  111. typeItemA.properties.state = .pressed
  112. } else if anchoredIconType == .key {
  113. typeItemC.properties.state = .pressed
  114. } else if anchoredIconType == .note {
  115. typeItemB.properties.state = .pressed
  116. } else if anchoredIconType == .help {
  117. typeItemD.properties.state = .pressed
  118. } else if anchoredIconType == .newParagraph {
  119. typeItemG.properties.state = .pressed
  120. } else if anchoredIconType == .paragraph {
  121. typeItemE.properties.state = .pressed
  122. } else if anchoredIconType == .insert {
  123. typeItemF.properties.state = .pressed
  124. }
  125. } else {
  126. let multiColor: Bool = CPDFListView.isAnnotationsContainMultiType(annotations, withType: .color)
  127. if multiColor == true {
  128. colorGroup.currentColor = nil
  129. } else {
  130. if let annotation = firstAnnotation {
  131. colorGroup.currentColor = annotation.color
  132. }
  133. }
  134. colorGroup.refreshUI()
  135. let multiType = CPDFListView.isAnnotationsContainMultiType(annotations, withType: .note_Type)
  136. if multiType == true {
  137. } else if let annotation = firstAnnotation {
  138. let anchoredIconType: CPDFTextAnnotationIconType = annotation.iconType()
  139. if anchoredIconType == .comment {
  140. typeItemA.properties.state = .pressed
  141. } else if anchoredIconType == .key {
  142. typeItemC.properties.state = .pressed
  143. } else if anchoredIconType == .note {
  144. typeItemB.properties.state = .pressed
  145. } else if anchoredIconType == .help {
  146. typeItemD.properties.state = .pressed
  147. } else if anchoredIconType == .newParagraph {
  148. typeItemG.properties.state = .pressed
  149. } else if anchoredIconType == .paragraph {
  150. typeItemE.properties.state = .pressed
  151. } else if anchoredIconType == .insert {
  152. typeItemF.properties.state = .pressed
  153. }
  154. }
  155. }
  156. for item in [typeItemA, typeItemB, typeItemC, typeItemD, typeItemE, typeItemF, typeItemG] {
  157. item!.reloadData()
  158. }
  159. }
  160. @objc func selectItemClick(_ sender: ComponentCSelector) {
  161. var anchoredIconType: CPDFTextAnnotationIconType = .comment
  162. if sender == typeItemA {
  163. anchoredIconType = .comment
  164. } else if sender == typeItemB {
  165. anchoredIconType = .note
  166. } else if sender == typeItemC {
  167. anchoredIconType = .key
  168. } else if sender == typeItemD {
  169. anchoredIconType = .help
  170. } else if sender == typeItemE {
  171. anchoredIconType = .paragraph
  172. } else if sender == typeItemF {
  173. anchoredIconType = .insert
  174. } else if sender == typeItemG {
  175. anchoredIconType = .newParagraph
  176. }
  177. CPDFAnnotation.updateAnnotations(annotations, newIconType: anchoredIconType, withPDFView: pdfView)
  178. CPDFTextAnnotation.updateDefaultIconType(anchoredIconType)
  179. reloadData()
  180. }
  181. }
  182. extension KMNoteController: ComponentCColorDelegate {
  183. func componentCColorDidChooseColor(_ view: NSView, _ color: NSColor?) {
  184. self.componentCColorDidChooseColor(view, color, true)
  185. }
  186. func componentCColorDidChooseColor(_ view: NSView, _ color: NSColor?, _ refresh: Bool) {
  187. CPDFAnnotation.updateAnnotations(annotations, newColor: color, withPDFView: pdfView)
  188. CPDFTextAnnotation.updateDefaultColor(color)
  189. NotificationCenter.default.post(name: toolbarImageColorChangedNotificationName, object: nil)
  190. if refresh == true {
  191. reloadData()
  192. }
  193. }
  194. func componentCColorGroupColorsUpdates(_ view: NSView, _ colors: [NSColor]) {
  195. KMAnnotationPropertiesColorManager.manager.updateDefaultColors(colors, forKey: KMNoteColorsKey)
  196. }
  197. func componentCColorDidRightMouseUpWithStrings(_ view: NSView) -> [String] {
  198. return [KMLocalizedString("Change Color"), KMLocalizedString("Restore default color")]
  199. }
  200. func componentCColorDidRightMenuItemClicked(_ view: NSView, menuItemProperty: ComponentMenuitemProperty?) {
  201. if menuItemProperty?.text == KMLocalizedString("Change Color") {
  202. if NSColorPanel.sharedColorPanelExists {
  203. NSColorPanel.shared.setTarget(nil)
  204. NSColorPanel.shared.setAction(nil)
  205. }
  206. NSColorPanel.shared.setTarget(self)
  207. NSColorPanel.shared.setAction(#selector(colorChoose(_:)))
  208. if let colorItem = view as? ComponentCColorItem, let color = colorItem.properties?.color {
  209. NSColorPanel.shared.color = color
  210. }
  211. let viewRect = view.superview?.convert(view.frame, to: nil) ?? CGRectZero
  212. var rect = NSColorPanel.shared.frame
  213. rect.origin.x = viewRect.minX
  214. rect.origin.y = viewRect.minY - 30
  215. NSColorPanel.shared.setFrame(rect, display: true)
  216. NSColorPanel.shared.orderFront(nil)
  217. } else if menuItemProperty?.text == KMLocalizedString("Restore default color") {
  218. if let colorItem = colorGroup.rightClickedItem {
  219. let colors: [NSColor] = KMAnnotationPropertiesColorManager.manager.defaultColors(key: KMNoteColorsKey)
  220. if colors.count > 4, colorItem.itemIndex >= 0, colorItem.itemIndex < colors.count {
  221. colorItem.properties?.color = colors[colorItem.itemIndex]
  222. colorItem.reloadData()
  223. colorGroup.componentCColorDidChoosePanelColor(colorGroup, nil)
  224. self.componentCColorDidChooseColor(colorGroup, colorItem.properties?.color, false)
  225. }
  226. }
  227. }
  228. }
  229. @objc func colorChoose(_ sender: Any) {
  230. if let colorItem = colorGroup.rightClickedItem {
  231. let color = NSColorPanel.shared.color
  232. colorItem.properties?.color = color
  233. colorItem.reloadData()
  234. colorGroup.componentCColorDidChoosePanelColor(colorGroup, nil)
  235. self.componentCColorDidChooseColor(colorGroup, color, false)
  236. }
  237. }
  238. }