KMRedactPropertiesWindowController.swift 25 KB

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