// // 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: KMWatermarkModel? { get { if editSubType == .template { return templatesController.selectedWatermark } else if editSubType == .add || editSubType == .edit { return propertyController.watermarkData } return nil } } var currentCPDFWatermark: CPDFWatermark? weak open var delegate: KMWatermarkControllerDelegate? var editSubType: KMPDFEditSubModeType = .none { didSet { resetUI() } } //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 } else if editSubType == .add { propertyController.view.isHidden = false propertyController.editSubType = editSubType } else if editSubType == .edit { propertyController.view.isHidden = false propertyController.editSubType = editSubType } } func reloadData() { documentPreview.pdfDocument = self.pdfDocument documentPreview.reloadData() if editSubType == .template { templatesController.reloadData() } else if editSubType == .add { propertyController.editSubType = editSubType propertyController.watermarkData = KMWatermarkManager.defaultManager.defaultWatermarkData propertyController.reloadData() } else if editSubType == .edit { propertyController.editSubType = editSubType propertyController.reloadData() } } //先刷新子界面,再根据子界面的数据刷新PDFView func loadData() { self.clearData() if let value = currentWatermarkData, let pdfDocument = documentPreview.pdfDocument { currentCPDFWatermark = KMWatermarkModel.returnWaterMarkWith(value, pdfDocument) pdfDocument.addWatermark(currentCPDFWatermark) documentPreview.refreshUI() } } func clearData() { if let value = currentCPDFWatermark { let document = documentPreview.pdfDocument document?.removeWatermark(value) currentCPDFWatermark = nil } } } //MARK: - KMNWatermarkPropertyControllerDelegate extension KMWatermarkController: KMNWatermarkPropertyControllerDelegate { func watermarkPropertyControllerDidUpdate(_ controller: KMNWatermarkPropertyController) { self.loadData() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func watermarkPropertyControllerDidChangetoTemplate(_ controller: KMNWatermarkPropertyController) { editSubType = .template delegate?.kmWatermarkControllerDidUpdateMode?(self) loadData() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) documentPreview.layoutDocumentView() } func watermarkPropertyControllerSaveTemplateSuccess(_ controller: KMNWatermarkPropertyController, _ data: KMWatermarkModel) { 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) templatesController.selectedWatermark = data templatesController.reloadData() loadData() } func watermarkPropertyControllerCancelTemplateEdit(_ controller: KMNWatermarkPropertyController) { editSubType = .template delegate?.kmWatermarkControllerDidUpdateMode?(self) templatesController.selectedWatermark = nil templatesController.reloadData() loadData() } } //MARK: - KMNWatermarkTemplateControllerDelegate extension KMWatermarkController: KMNWatermarkTemplateControllerDelegate { func templateControllerDidAddWatermarkData(_ controller: KMNWatermarkTemplateController) { editSubType = .add delegate?.kmWatermarkControllerDidUpdateMode?(self) propertyController.watermarkData = KMWatermarkManager.defaultManager.defaultWatermarkData propertyController.reloadData() loadData() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func templateControllerDidEditWatermarkData(_ controller: KMNWatermarkTemplateController, _ watermark: KMWatermarkModel) { editSubType = .edit delegate?.kmWatermarkControllerDidUpdateMode?(self) propertyController.watermarkData = watermark propertyController.originalDataDict = KMWatermarkManager.defaultManager.parseWaterMark(model: watermark) propertyController.reloadData() templatesController.selectedWatermark = nil loadData() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } func templateControllerDidSelectedChanged(_ controller: KMNWatermarkTemplateController) { loadData() delegate?.kmWatermarkControllerDidWatermarkUpdated?(self) } }