// // KMWatermarkController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/11/1. // import Cocoa import KMComponentLibrary @objc protocol KMWatermarkControllerDelegate: AnyObject { @objc optional func kmWatermarkControllerDidUpdateMode(_ view: KMWatermarkController) //水印数据发生变化时处理 @objc optional func kmWatermarkControllerDidWatermarkUpdated(_ view: KMWatermarkController) } class KMWatermarkController: NSViewController { @IBOutlet var contendView: NSView! @IBOutlet var preInfoView: NSView! @IBOutlet var propertyInfoView: NSView! var documentPreview: KMEditDocumentController = KMEditDocumentController.init() var propertyController: KMNWatermarkPropertyController = KMNWatermarkPropertyController.init() var templatesController: KMNWatermarkTemplateController = KMNWatermarkTemplateController() var saveTemplateMessage: ComponentMessage = ComponentMessage() var pdfDocument: CPDFDocument? var currentWatermarkData: KMPDFWatermarkData? weak open var delegate: KMWatermarkControllerDelegate? var editSubType: KMPDFEditSubModeType = .none //MARK: - func override func viewDidLoad() { super.viewDidLoad() // Do view setup here. documentPreview.view.frame = preInfoView.bounds documentPreview.view.autoresizingMask = [.width, .height] preInfoView.addSubview(documentPreview.view) propertyController.view.frame = propertyInfoView.bounds propertyController.view.autoresizingMask = [.width, .height] propertyController.delegate = self propertyController.view.isHidden = true propertyInfoView.addSubview(propertyController.view) templatesController.view.frame = propertyInfoView.bounds templatesController.view.autoresizingMask = [.width, .height] templatesController.delegate = self templatesController.view.isHidden = true propertyInfoView.addSubview(templatesController.view) setupProperty() } func setupProperty() { saveTemplateMessage.properties = ComponentMessageProperty(messageType: .success, title: KMLocalizedString("Saved Template")) } func resetUI() { propertyController.view.isHidden = true templatesController.view.isHidden = true if editSubType == .template { templatesController.view.isHidden = false templatesController.reloadData() } else if editSubType == .add { propertyController.view.isHidden = false propertyController.editSubType = editSubType propertyController.reloadData() } else if editSubType == .edit { propertyController.view.isHidden = false propertyController.editSubType = editSubType propertyController.reloadData() } } func reloadData() { resetUI() documentPreview.pdfDocument = self.pdfDocument documentPreview.reloadData() } func removeWatermark(_ watermark: CPDFWatermark?) { if let tempData = watermark { let document = documentPreview.pdfDocument document?.removeWatermark(tempData) } } func refreshPDFDocumentWaterMark() { guard let model = currentWatermarkData else { return } let document = documentPreview.pdfDocument var watermark = CPDFWatermark() if (model.watermarkType == .text) { watermark = CPDFWatermark(document: document, type: .text) watermark.text = model.text watermark.textColor = model.textColor watermark.cFont = CPDFFont(familyName: model.fontName, fontStyle: model.fontStyle ?? "Regular") if model.isScale { watermark.setAutoSizeWithPercentage(model.scale) } else { watermark.fontSize = model.fontSize } } else if model.watermarkType == .image { watermark = CPDFWatermark(document: document, type: .image) watermark.image = model.image() if model.isScale { watermark.scale = model.scale } else { watermark.scale = 1 } } watermark.opacity = model.opacity watermark.rotation = model.rotation watermark.tx = model.tx watermark.ty = model.ty watermark.isFront = model.isFront watermark.horizontalPosition = model.horizontalPosition watermark.verticalPosition = model.verticalPosition watermark.isTilePage = model.isTilePage watermark.horizontalSpacing = model.horizontalSpacing watermark.verticalSpacing = model.verticalSpacing document?.addWatermark(watermark) documentPreview.refreshUI() currentWatermarkData?.watermark = watermark } } //MARK: - KMNWatermarkPropertyControllerDelegate extension KMWatermarkController: KMNWatermarkPropertyControllerDelegate { func watermarkPropertyControllerDidUpdate(_ controller: KMNWatermarkPropertyController) { removeWatermark(currentWatermarkData?.watermark) currentWatermarkData = controller.watermarkData refreshPDFDocumentWaterMark() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController) { editSubType = .template delegate?.kmWatermarkControllerDidUpdateMode?(self) resetUI() removeWatermark(currentWatermarkData?.watermark) currentWatermarkData = nil delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) documentPreview.layoutDocumentView() } func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController, _ data: KMPDFWatermarkData) { saveTemplateMessage.frame = CGRectMake((CGRectGetWidth(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewWidth)/2, CGRectGetHeight(self.view.frame) - saveTemplateMessage.properties.propertyInfo.viewHeight - 8, saveTemplateMessage.properties.propertyInfo.viewWidth, saveTemplateMessage.properties.propertyInfo.viewHeight) saveTemplateMessage.reloadData() saveTemplateMessage.show(inView: self.view, autoHideSeconde: 2) editSubType = .template delegate?.kmWatermarkControllerDidUpdateMode?(self) resetUI() templatesController.selectedWatermark = data templatesController.reloadData() removeWatermark(currentWatermarkData?.watermark) currentWatermarkData = templatesController.selectedWatermark refreshPDFDocumentWaterMark() } func watermarkPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController) { removeWatermark(currentWatermarkData?.watermark) currentWatermarkData = nil refreshPDFDocumentWaterMark() editSubType = .template delegate?.kmWatermarkControllerDidUpdateMode?(self) resetUI() templatesController.reloadData() } } //MARK: - KMNWatermarkTemplateControllerDelegate extension KMWatermarkController: KMNWatermarkTemplateControllerDelegate { func templateControllerDidAddWatermarkData(_ controller: KMNWatermarkTemplateController) { editSubType = .add delegate?.kmWatermarkControllerDidUpdateMode?(self) resetUI() propertyController.watermarkData = KMPDFWatermarkData.defaultData() currentWatermarkData = propertyController.watermarkData refreshPDFDocumentWaterMark() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func templateControllerDidEditWatermarkData(_ controller: KMNWatermarkTemplateController, _ watermark: KMPDFWatermarkData) { removeWatermark(currentWatermarkData?.watermark) editSubType = .edit delegate?.kmWatermarkControllerDidUpdateMode?(self) resetUI() propertyController.watermarkData = watermark propertyController.originalDataDict = KMWatermarkManager.defaultManager.parseWaterMark(model: watermark) currentWatermarkData = propertyController.watermarkData refreshPDFDocumentWaterMark() templatesController.selectedWatermark = nil delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func templateControllerDidSelectedChanged(_ controller: KMNWatermarkTemplateController) { removeWatermark(currentWatermarkData?.watermark) currentWatermarkData = controller.selectedWatermark refreshPDFDocumentWaterMark() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } }