KMRedactPropertiesWindowController.swift 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. //
  2. // KMRedactPropertiesWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2023/12/19.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. class KMRedactPropertiesWindowController: KMNBaseWindowController {
  10. var readactAnnotation: CPDFRedactAnnotation?
  11. @IBOutlet weak var titleLabel: NSTextField!
  12. @IBOutlet weak var subLabel: NSTextField!
  13. @IBOutlet weak var outlineColorLabel: NSTextField!
  14. @IBOutlet weak var outlineColorItem: ComponentCColorItem!
  15. @IBOutlet weak var fillColorLabel: NSTextField!
  16. @IBOutlet weak var fillColorItem: ComponentCColorItem!
  17. @IBOutlet weak var overlayTextLabel: NSTextField!
  18. @IBOutlet weak var overlayTextarea: ComponentTextarea!
  19. @IBOutlet weak var fontSizeLabel: NSTextField!
  20. @IBOutlet weak var fontSizeComboSelect: ComponentSelect!
  21. @IBOutlet weak var alignementLabel: NSTextField!
  22. @IBOutlet var alightLeftButton: ComponentButton!
  23. @IBOutlet var alightRightButton: ComponentButton!
  24. @IBOutlet var alightCenteButton: ComponentButton!
  25. @IBOutlet weak var fontColorLabel: NSTextField!
  26. @IBOutlet weak var fontColorItem: ComponentCColorItem!
  27. @IBOutlet weak var makePropertiesButton: ComponentButton!
  28. @IBOutlet weak var cancelButton: ComponentButton!
  29. @IBOutlet weak var okButton: ComponentButton!
  30. @IBOutlet var cancelWidthButton:NSLayoutConstraint!
  31. @IBOutlet var okWidthButton:NSLayoutConstraint!
  32. @IBOutlet var makePropertiesWidthButton:NSLayoutConstraint!
  33. var callback: ((_ anno: CPDFRedactAnnotation?)->Void)?
  34. convenience init() {
  35. self.init(windowNibName: "KMRedactPropertiesWindowController")
  36. }
  37. override func initContentView() {
  38. super.initContentView()
  39. fontColorItem.properties = ComponentCColorProperty(colorType: .color,
  40. state: .normal,
  41. isCustom: true,
  42. color: NSColor.red)
  43. fontColorItem.delegate = self
  44. fontColorItem.reloadData()
  45. outlineColorItem.properties = ComponentCColorProperty(colorType: .color,
  46. state: .normal,
  47. isCustom: true,
  48. color: NSColor.red)
  49. outlineColorItem.delegate = self
  50. outlineColorItem.reloadData()
  51. fillColorItem.properties = ComponentCColorProperty(colorType: .color,
  52. state: .normal,
  53. isCustom: true,
  54. color: NSColor.red)
  55. fillColorItem.delegate = self
  56. fillColorItem.reloadData()
  57. alightLeftButton.properties = ComponentButtonProperty(type: .text_gray,
  58. size: .s,
  59. state: .normal,
  60. onlyIcon: true,
  61. icon:NSImage(named: "KMNImageNameListViewPopAlightLeft"))
  62. alightLeftButton.setTarget(self, action: #selector(alightLeftButtonClicked(_ :)))
  63. alightRightButton.properties = ComponentButtonProperty(type: .text_gray,
  64. size: .s,
  65. state: .normal,
  66. onlyIcon: true,
  67. icon:NSImage(named: "KMNImageNameListViewPopAlightRight"))
  68. alightRightButton.setTarget(self, action: #selector(alightRightButtonClicked(_ :)))
  69. alightCenteButton.properties = ComponentButtonProperty(type: .text_gray,
  70. size: .s,
  71. state: .normal,
  72. onlyIcon: true,
  73. icon:NSImage(named: "KMNImageNameListViewPopAlightCenter"))
  74. alightCenteButton.setTarget(self, action: #selector(alightCenterButtonClicked(_ :)))
  75. titleLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-m-medium")
  76. subLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-medium")
  77. outlineColorLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-regular")
  78. fillColorLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-regular")
  79. overlayTextLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-medium")
  80. fontColorLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-regular")
  81. fontSizeLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-regular")
  82. alignementLabel.font = ComponentLibrary.shared.getFontFromKey ("mac/body-s-regular")
  83. okButton.properties = ComponentButtonProperty(type: .primary,
  84. size: .s,
  85. state: .normal,
  86. buttonText: KMLocalizedString("OK"))
  87. okButton.setTarget(self, action: #selector(okButtonClicked(_ :)))
  88. cancelButton.properties = ComponentButtonProperty(type: .default_tertiary,
  89. size: .s,
  90. state: .normal,
  91. buttonText: KMLocalizedString("Cancel"))
  92. cancelButton.setTarget(self, action: #selector(cancelButtonClicked(_ :)))
  93. makePropertiesButton.properties = ComponentButtonProperty(type: .default_tertiary,
  94. size: .s,
  95. state: .normal,
  96. buttonText: KMLocalizedString("Make Properties Default"))
  97. makePropertiesButton.setTarget(self, action: #selector(makePropertiesButtonClicked(_ :)))
  98. overlayTextarea.properties = ComponentTextareaProperty(size: .s, state: .normal, isError: false, placeholderString: KMLocalizedString("Encrypted Content"), totalCount: -1, text: "", isDisabled: false)
  99. overlayTextarea.delegate = self
  100. fontSizeComboSelect.properties = ComponentSelectProperties(size: .s,
  101. state: .normal,
  102. placeholder: nil,
  103. errorText: nil,
  104. creatable: true,
  105. text: "12 pt",
  106. textUnit: " pt",
  107. regexString: "0123456789 pt")
  108. let menuItemString:[String] = ["4 pt",
  109. "6 pt",
  110. "8 pt",
  111. "9 pt",
  112. "10 pt",
  113. "11 pt",
  114. "12 pt",
  115. "13 pt",
  116. "14 pt",
  117. "15 pt",
  118. "16 pt",
  119. "17 pt",
  120. "18 pt",
  121. "24 pt",
  122. "36 pt",
  123. "48 pt",
  124. "64 pt",
  125. "72 pt",
  126. "98 pt",
  127. "144 pt",
  128. "288 pt"]
  129. var menuItemArr: [ComponentMenuitemProperty] = []
  130. for language in menuItemString {
  131. let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  132. itemSelected: false,
  133. isDisabled: false,
  134. keyEquivalent: nil,
  135. text: language)
  136. menuItemArr.append(itemProperty)
  137. }
  138. fontSizeComboSelect.delegate = self
  139. fontSizeComboSelect.updateMenuItemsArr(menuItemArr)
  140. }
  141. override func updateUILanguage() {
  142. super.updateUILanguage()
  143. outlineColorLabel.stringValue = KMLocalizedString("Redaction Mark Outline Color:")
  144. fillColorLabel.stringValue = KMLocalizedString("Redact Area Fill Color:")
  145. overlayTextLabel.stringValue = KMLocalizedString("Overlay Text:")
  146. alignementLabel.stringValue = KMLocalizedString("Text Alignment")
  147. fontSizeLabel.stringValue = KMLocalizedString("Font Size")
  148. fontColorLabel.stringValue = String(format: "%@:", KMLocalizedString("Font Color"))
  149. titleLabel.stringValue = KMLocalizedString("Redact Properties")
  150. subLabel.stringValue = KMLocalizedString("Mark Color")
  151. okButton.properties.buttonText = KMLocalizedString("OK")
  152. cancelButton.properties.buttonText = KMLocalizedString("Cancel")
  153. makePropertiesButton.properties.buttonText = KMLocalizedString("Make Properties Default")
  154. okWidthButton.constant = okButton.properties.propertyInfo.viewWidth
  155. cancelWidthButton.constant = cancelButton.properties.propertyInfo.viewWidth
  156. makePropertiesWidthButton.constant = makePropertiesButton.properties.propertyInfo.viewWidth
  157. }
  158. override func updateUIThemeColor() {
  159. super.updateUIThemeColor()
  160. window?.contentView?.wantsLayer = true
  161. window?.contentView?.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/popup").cgColor
  162. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  163. subLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  164. outlineColorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  165. fillColorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  166. overlayTextLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  167. fontColorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  168. fontSizeLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  169. alignementLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  170. }
  171. private func updateLabelUI() {
  172. if overlayTextarea.properties.text.isEmpty == true {
  173. fontColorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label-dis")
  174. fontSizeLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label-dis")
  175. alignementLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label-dis")
  176. fontSizeComboSelect.properties.isDisabled = true
  177. fontSizeComboSelect.reloadData()
  178. alightLeftButton.properties.isDisabled = true
  179. alightLeftButton.reloadData()
  180. alightCenteButton.properties.isDisabled = true
  181. alightCenteButton.reloadData()
  182. alightRightButton.properties.isDisabled = true
  183. alightRightButton.reloadData()
  184. } else {
  185. fontColorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  186. fontSizeLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  187. alignementLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("comp-form/colorText-label")
  188. fontSizeComboSelect.properties.isDisabled = false
  189. fontSizeComboSelect.reloadData()
  190. alightLeftButton.properties.isDisabled = false
  191. alightLeftButton.reloadData()
  192. alightCenteButton.properties.isDisabled = false
  193. alightCenteButton.reloadData()
  194. alightRightButton.properties.isDisabled = false
  195. alightRightButton.reloadData()
  196. }
  197. }
  198. override func windowDidLoad() {
  199. super.windowDidLoad()
  200. if let anno = readactAnnotation {
  201. outlineColorItem.properties?.color = anno.borderColor() ?? .red
  202. outlineColorItem.reloadData()
  203. fillColorItem.properties?.color = anno.interiorColor() ?? .clear
  204. fillColorItem.reloadData()
  205. fontColorItem.properties?.color = anno.fontColor() ?? .red
  206. fontColorItem.reloadData()
  207. fontSizeComboSelect.properties.text = String(format: "%.lf pt", anno.fontSize())
  208. fontSizeComboSelect.reloadData()
  209. if(anno.alignment().rawValue == 1) {
  210. alightLeftButton.properties.state = .normal
  211. alightCenteButton.properties.state = .pressed
  212. alightRightButton.properties.state = .normal
  213. } else if (anno.alignment().rawValue == 2) {
  214. alightLeftButton.properties.state = .normal
  215. alightCenteButton.properties.state = .normal
  216. alightRightButton.properties.state = .pressed
  217. } else {
  218. alightLeftButton.properties.state = .pressed
  219. alightCenteButton.properties.state = .normal
  220. alightRightButton.properties.state = .normal
  221. }
  222. alightLeftButton.reloadData()
  223. alightCenteButton.reloadData()
  224. alightRightButton.reloadData()
  225. overlayTextarea.properties.text = anno.overlayText() ?? ""
  226. overlayTextarea.reloadData()
  227. makePropertiesButton.isHidden = false
  228. } else {
  229. outlineColorItem.properties?.color = CPDFRedactAnnotation.defaultOutlineColor()
  230. outlineColorItem.reloadData()
  231. fillColorItem.properties?.color = CPDFRedactAnnotation.defaultFillColor()
  232. fillColorItem.reloadData()
  233. fontColorItem.properties?.color = CPDFRedactAnnotation.defaultTextColor()
  234. fontColorItem.reloadData()
  235. overlayTextarea.properties.text = CPDFRedactAnnotation.defaultOverlayText()
  236. overlayTextarea.reloadData()
  237. fontSizeComboSelect.properties.text = String(format: "%.0f pt", CPDFRedactAnnotation.defaultFontSize())
  238. fontSizeComboSelect.reloadData()
  239. if(CPDFRedactAnnotation.defaultFontAlignment() == .center) {
  240. alightLeftButton.properties.state = .normal
  241. alightCenteButton.properties.state = .pressed
  242. alightRightButton.properties.state = .normal
  243. } else if (CPDFRedactAnnotation.defaultFontAlignment() == .right) {
  244. alightLeftButton.properties.state = .normal
  245. alightCenteButton.properties.state = .normal
  246. alightRightButton.properties.state = .pressed
  247. } else {
  248. alightLeftButton.properties.state = .pressed
  249. alightCenteButton.properties.state = .normal
  250. alightRightButton.properties.state = .normal
  251. }
  252. alightLeftButton.reloadData()
  253. alightCenteButton.reloadData()
  254. alightRightButton.reloadData()
  255. makePropertiesButton.isHidden = true
  256. }
  257. updateLabelUI()
  258. }
  259. //MARK: - Action
  260. @objc func alightLeftButtonClicked(_ sender: NSView) {
  261. alightLeftButton.properties.state = .pressed
  262. alightCenteButton.properties.state = .normal
  263. alightRightButton.properties.state = .normal
  264. alightLeftButton.reloadData()
  265. alightCenteButton.reloadData()
  266. alightRightButton.reloadData()
  267. }
  268. @objc func alightRightButtonClicked(_ sender: NSView) {
  269. alightLeftButton.properties.state = .normal
  270. alightCenteButton.properties.state = .normal
  271. alightRightButton.properties.state = .pressed
  272. alightLeftButton.reloadData()
  273. alightCenteButton.reloadData()
  274. alightRightButton.reloadData()
  275. }
  276. @objc func alightCenterButtonClicked(_ sender: NSView) {
  277. alightLeftButton.properties.state = .normal
  278. alightCenteButton.properties.state = .pressed
  279. alightRightButton.properties.state = .normal
  280. alightLeftButton.reloadData()
  281. alightCenteButton.reloadData()
  282. alightRightButton.reloadData()
  283. }
  284. @objc func makePropertiesButtonClicked(_ sender: AnyObject?) {
  285. let s = (fontSizeComboSelect.properties.text as? NSString)?.trimmingCharacters(in: CharacterSet(charactersIn: " pt")) ?? ""
  286. let fontsize = s.stringToCGFloat()
  287. CPDFRedactAnnotation.update_defaultOutlineColor(outlineColorItem.properties?.color)
  288. CPDFRedactAnnotation.update_defaultFillColor(fillColorItem.properties?.color)
  289. CPDFRedactAnnotation.update_defaultTextColor(fontColorItem.properties?.color)
  290. CPDFRedactAnnotation.update_defaultFontSize(fontsize)
  291. if alightLeftButton.properties.state == .pressed {
  292. CPDFRedactAnnotation.update_defaultFontAlignment(.left)
  293. } else if alightCenteButton.properties.state == .pressed {
  294. CPDFRedactAnnotation.update_defaultFontAlignment(.center)
  295. } else if alightRightButton.properties.state == .pressed {
  296. CPDFRedactAnnotation.update_defaultFontAlignment(.right)
  297. }
  298. CPDFRedactAnnotation.update_defaultOverlayText(overlayTextarea.properties.text)
  299. }
  300. @objc func cancelButtonClicked(_ sender: AnyObject?) {
  301. if self.callback != nil {
  302. self.callback!(self.readactAnnotation)
  303. }
  304. self.km_quick_endSheet()
  305. }
  306. @objc func okButtonClicked(_ sender: AnyObject?) {
  307. let s = (fontSizeComboSelect.properties.text as? NSString)?.trimmingCharacters(in: CharacterSet(charactersIn: " pt")) ?? ""
  308. let fontsize = Int(s) ?? 12
  309. var alignment: NSTextAlignment = .left
  310. if alightCenteButton.properties.state == .pressed {
  311. alignment = .center
  312. } else if alightRightButton.properties.state == .pressed {
  313. alignment = .right
  314. }
  315. if let anno = readactAnnotation {
  316. anno.setBorderColor(outlineColorItem.properties?.color)
  317. anno.setInteriorColor(fillColorItem.properties?.color)
  318. anno.setFontColor(fontColorItem.properties?.color)
  319. anno.fontSize = fontsize.cgFloat
  320. anno.setAlignment(alignment)
  321. anno.setOverlayText(overlayTextarea.properties.text)
  322. } else {
  323. makePropertiesButtonClicked(makePropertiesButton)
  324. }
  325. callback?(readactAnnotation)
  326. self.km_quick_endSheet()
  327. }
  328. @IBAction func useOverlayText_button(_ sender: AnyObject?) {
  329. updateLabelUI()
  330. }
  331. }
  332. //MARK: - ComponentTextareaDelegate
  333. extension KMRedactPropertiesWindowController: ComponentTextareaDelegate {
  334. func componentTextareaTextDidBeginEditing(_ view: ComponentTextarea) {
  335. }
  336. func componentTextareaTextDidChange(_ view: ComponentTextarea) {
  337. updateLabelUI()
  338. }
  339. func componentTextareaTextDidEndEditing(_ view: ComponentTextarea) {
  340. }
  341. }
  342. //MARK: - ComponentSelectDelegate
  343. extension KMRedactPropertiesWindowController: ComponentSelectDelegate {
  344. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  345. }
  346. func componentSelectTextDidBeginEditing(_ view: ComponentSelect) {
  347. }
  348. func componentSelectTextDidChange(_ view: ComponentSelect) {
  349. }
  350. func componentSelectTextDidEndEditing(_ view: ComponentSelect) {
  351. }
  352. func componentSelectTextDidEndEditing(_ view: ComponentSelect, removeUnit text: String?) {
  353. }
  354. @objc func fontColorChange(_ sender: Any) {
  355. if let color = (sender as? NSColorPanel)?.color {
  356. fontColorItem.properties?.color = color
  357. fontColorItem.reloadData()
  358. }
  359. }
  360. @objc func borderColorChange(_ sender: Any) {
  361. if let color = (sender as? NSColorPanel)?.color {
  362. outlineColorItem.properties?.color = color
  363. outlineColorItem.reloadData()
  364. }
  365. }
  366. @objc func fillColorChange(_ sender: Any) {
  367. if let color = (sender as? NSColorPanel)?.color {
  368. fillColorItem.properties?.color = color
  369. fillColorItem.reloadData()
  370. }
  371. }
  372. }
  373. //MARK: - ComponentSelectDelegate
  374. extension KMRedactPropertiesWindowController: ComponentCColorDelegate {
  375. func componentCColorDidChooseColor(_ view: NSView, _ color: NSColor?) {
  376. let colorPanel = NSColorPanel.shared
  377. colorPanel.setTarget(self)
  378. colorPanel.showsAlpha = false
  379. if (view == fontColorItem) {
  380. fontColorItem.properties?.state = .normal
  381. fontColorItem.reloadData()
  382. colorPanel.setAction(#selector(self.fontColorChange(_:)))
  383. } else if(view == outlineColorItem) {
  384. outlineColorItem.properties?.state = .normal
  385. outlineColorItem.reloadData()
  386. colorPanel.setAction(#selector(self.borderColorChange(_:)))
  387. } else if(view == fillColorItem) {
  388. fillColorItem.properties?.state = .normal
  389. fillColorItem.reloadData()
  390. colorPanel.setAction(#selector(self.fillColorChange(_:)))
  391. }
  392. colorPanel.orderFront(nil)
  393. }
  394. }