KMWatermarkController.swift 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. //
  2. // KMWatermarkController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/11/1.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMWatermarkControllerDelegate: AnyObject {
  10. @objc optional func kmWatermarkControllerDidUpdateMode(_ view: KMWatermarkController)
  11. //水印数据发生变化时处理
  12. @objc optional func kmWatermarkControllerDidWatermarkUpdated(_ view: KMWatermarkController)
  13. @objc optional func kmWatermarkControllerDidChooseApply(_ view: KMWatermarkController)
  14. @objc optional func kmWatermarkControllerDidChooseExit(_ view: KMWatermarkController)
  15. }
  16. class KMWatermarkController: NSViewController {
  17. @IBOutlet var contendView: NSView!
  18. @IBOutlet var preInfoView: NSView!
  19. @IBOutlet var propertyInfoView: NSView!
  20. var documentPreview: KMEditDocumentController = KMEditDocumentController.init()
  21. var propertyController: KMNWatermarkPropertyController = KMNWatermarkPropertyController.init()
  22. var templatesController: KMNWatermarkTemplateController = KMNWatermarkTemplateController()
  23. var saveTemplateMessage: ComponentMessage = ComponentMessage()
  24. var pdfDocument: CPDFDocument?
  25. var pdfViewCurrentIndex: Int = 0
  26. var validPageString: String?
  27. var currentWatermarkData: KMWatermarkModel? {
  28. get {
  29. if editSubType == .template {
  30. return templatesController.selectedWatermark
  31. } else if editSubType == .add ||
  32. editSubType == .edit {
  33. return propertyController.watermarkData
  34. }
  35. return nil
  36. }
  37. }
  38. var currentCPDFWatermark: CPDFWatermark?
  39. weak open var delegate: KMWatermarkControllerDelegate?
  40. var editSubType: KMPDFEditSubModeType = .none {
  41. didSet {
  42. resetUI()
  43. }
  44. }
  45. //MARK: - func
  46. override func viewDidLoad() {
  47. super.viewDidLoad()
  48. // Do view setup here.
  49. documentPreview.view.frame = preInfoView.bounds
  50. documentPreview.view.autoresizingMask = [.width, .height]
  51. documentPreview.delegate = self
  52. preInfoView.addSubview(documentPreview.view)
  53. propertyController.view.frame = propertyInfoView.bounds
  54. propertyController.view.autoresizingMask = [.width, .height]
  55. propertyController.delegate = self
  56. propertyController.view.isHidden = true
  57. propertyInfoView.addSubview(propertyController.view)
  58. templatesController.view.frame = propertyInfoView.bounds
  59. templatesController.view.autoresizingMask = [.width, .height]
  60. templatesController.delegate = self
  61. templatesController.view.isHidden = true
  62. propertyInfoView.addSubview(templatesController.view)
  63. setupProperty()
  64. }
  65. func applyEnabled() -> Bool {
  66. var applyEnable = true
  67. if let model = self.currentWatermarkData {
  68. if model.watermarkType == .text {
  69. if model.text == nil || model.text?.count == 0 {
  70. applyEnable = false
  71. }
  72. } else if model.watermarkType == .image {
  73. if model.imagePath == nil {
  74. applyEnable = false
  75. }
  76. }
  77. } else {
  78. applyEnable = false
  79. }
  80. return applyEnable
  81. }
  82. func setupProperty() {
  83. saveTemplateMessage.properties = ComponentMessageProperty(messageType: .success, title: KMLocalizedString("Saved Template"))
  84. }
  85. func resetUI() {
  86. propertyController.view.isHidden = true
  87. templatesController.view.isHidden = true
  88. if editSubType == .template {
  89. templatesController.view.isHidden = false
  90. } else if editSubType == .add {
  91. propertyController.view.isHidden = false
  92. propertyController.editSubType = editSubType
  93. propertyController.scrollToTop()
  94. } else if editSubType == .edit {
  95. propertyController.view.isHidden = false
  96. propertyController.editSubType = editSubType
  97. propertyController.scrollToTop()
  98. }
  99. }
  100. func reloadData() {
  101. documentPreview.pdfDocument = self.pdfDocument
  102. documentPreview.reloadData()
  103. if editSubType == .template {
  104. templatesController.reloadData()
  105. } else if editSubType == .add {
  106. propertyController.editSubType = editSubType
  107. propertyController.watermarkData = KMWatermarkManager.defaultManager.defaultWatermarkData
  108. propertyController.reloadData()
  109. propertyController.beginEditing()
  110. } else if editSubType == .edit {
  111. propertyController.editSubType = editSubType
  112. propertyController.reloadData()
  113. propertyController.beginEditing()
  114. }
  115. }
  116. //先刷新子界面,再根据子界面的数据刷新PDFView
  117. func loadData() {
  118. self.clearData()
  119. if let value = currentWatermarkData, let pdfDocument = documentPreview.pdfDocument {
  120. currentCPDFWatermark = KMWatermarkModel.returnWaterMarkWith(value, pdfDocument)
  121. if let validPageString = self.validPageString {
  122. let validPageIndexs = validPageString.components(separatedBy: ",")
  123. if validPageIndexs.contains(String(format: "%ld", pdfViewCurrentIndex)) {
  124. pdfDocument.addWatermark(currentCPDFWatermark)
  125. }
  126. }
  127. }
  128. documentPreview.refreshUI()
  129. }
  130. func clearData() {
  131. if let value = currentCPDFWatermark {
  132. let document = documentPreview.pdfDocument
  133. document?.removeWatermark(value)
  134. currentCPDFWatermark = nil
  135. }
  136. }
  137. }
  138. //MARK: - KMNWatermarkPropertyControllerDelegate
  139. extension KMWatermarkController: KMNWatermarkPropertyControllerDelegate {
  140. func watermarkPropertyControllerDidUpdate(_ controller: KMNWatermarkPropertyController) {
  141. self.loadData()
  142. delegate?.kmWatermarkControllerDidWatermarkUpdated?(self)
  143. }
  144. func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController) {
  145. editSubType = .template
  146. delegate?.kmWatermarkControllerDidUpdateMode?(self)
  147. loadData()
  148. delegate?.kmWatermarkControllerDidWatermarkUpdated?(self)
  149. documentPreview.layoutDocumentView()
  150. }
  151. func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController, _ data: KMWatermarkModel) {
  152. saveTemplateMessage.frame = CGRectMake((CGRectGetWidth(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewWidth)/2,
  153. CGRectGetHeight(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewHeight - 8,
  154. saveTemplateMessage.properties.propertyInfo.viewWidth,
  155. saveTemplateMessage.properties.propertyInfo.viewHeight)
  156. saveTemplateMessage.reloadData()
  157. saveTemplateMessage.show(inView: self.view, autoHideSeconde: 2)
  158. editSubType = .template
  159. delegate?.kmWatermarkControllerDidUpdateMode?(self)
  160. templatesController.selectedWatermark = data
  161. reloadData()
  162. loadData()
  163. }
  164. func watermarkPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController) {
  165. editSubType = .template
  166. delegate?.kmWatermarkControllerDidUpdateMode?(self)
  167. templatesController.selectedWatermark = controller.watermarkData
  168. reloadData()
  169. loadData()
  170. }
  171. }
  172. //MARK: - KMNWatermarkTemplateControllerDelegate
  173. extension KMWatermarkController: KMNWatermarkTemplateControllerDelegate {
  174. func templateControllerDidAddWatermarkData(_ controller: KMNWatermarkTemplateController) {
  175. editSubType = .add
  176. delegate?.kmWatermarkControllerDidUpdateMode?(self)
  177. propertyController.watermarkData = KMWatermarkManager.defaultManager.defaultWatermarkData
  178. reloadData()
  179. loadData()
  180. delegate?.kmWatermarkControllerDidWatermarkUpdated?(self)
  181. }
  182. func templateControllerDidEditWatermarkData(_ controller: KMNWatermarkTemplateController, _ watermark: KMWatermarkModel) {
  183. editSubType = .edit
  184. delegate?.kmWatermarkControllerDidUpdateMode?(self)
  185. propertyController.watermarkData = watermark
  186. propertyController.originalDataDict = KMWatermarkManager.defaultManager.parseWaterMark(model: watermark)
  187. reloadData()
  188. templatesController.selectedWatermark = nil
  189. loadData()
  190. delegate?.kmWatermarkControllerDidWatermarkUpdated?(self)
  191. }
  192. func templateControllerDidSelectedChanged(_ controller: KMNWatermarkTemplateController) {
  193. loadData()
  194. delegate?.kmWatermarkControllerDidWatermarkUpdated?(self)
  195. }
  196. }
  197. //MARK: - KMEditDocumentControllerDelegate
  198. extension KMWatermarkController: KMEditDocumentControllerDelegate {
  199. func editControllerDidExitEnable(_ controller: KMEditDocumentController) -> Bool {
  200. return true
  201. }
  202. func editControllerDidApplyEnable(_ controller: KMEditDocumentController) -> Bool {
  203. return self.applyEnabled()
  204. }
  205. func editControllerDidExitClicked(_ controller: KMEditDocumentController) {
  206. delegate?.kmWatermarkControllerDidChooseExit?(self)
  207. }
  208. func editControllerDidApplyClicked(_ controller: KMEditDocumentController) {
  209. delegate?.kmWatermarkControllerDidChooseApply?(self)
  210. }
  211. }