// // KMBatesController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/11/8. // import Cocoa import KMComponentLibrary @objc protocol KMBatesControllerDelegate: AnyObject { @objc optional func kmBatesControllerDidUpdateMode(_ view: KMBatesController) //数据发生变化时处理 @objc optional func kmBatesControllerDidModelDataUpdated(_ view: KMBatesController) } class KMBatesController: NSViewController { @IBOutlet var contendView: NSView! @IBOutlet var preInfoView: NSView! @IBOutlet var propertyInfoView: NSView! var documentPreview: KMEditDocumentController = KMEditDocumentController.init() var propertyController: KMBatesPropertyController = KMBatesPropertyController.init() var templatesController: KMBatesTemplateController = KMBatesTemplateController() var saveTemplateMessage: ComponentMessage = ComponentMessage() weak open var delegate: KMBatesControllerDelegate? var totalPDFCount: Int = 1 var pdfDocument: CPDFDocument? var batesModel: KMBatesModel? var editSubType: KMPDFEditSubModeType = .none 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() propertyController.totalPDFCount = totalPDFCount propertyController.reloadData() documentPreview.pdfDocument = pdfDocument documentPreview.reloadData() } func updatePDFDocumentBates() { if let data = batesModel { let cPDFBates = documentPreview.pdfDocument?.bates() cPDFBates?.pageString = "0" var fontSize = data.fontsize var fontName: String = data.fontName let font = NSFont.boldSystemFont(ofSize:fontSize) let style = NSMutableParagraphStyle() style.alignment = .center style.lineBreakMode = .byCharWrapping let size: NSSize = "text".boundingRect(with: NSSize(width: 1000, height: 1000), options: NSString.DrawingOptions(rawValue: 3), attributes: [NSAttributedString.Key.font : font, NSAttributedString.Key.paragraphStyle : style]).size cPDFBates?.margin = NSEdgeInsetsMake(max(CGFloat(data.topMargin)-size.height, 0), CGFloat(data.leftMargin), max(CGFloat(data.bottomMargin)-size.height, 0), CGFloat(data.rightMargin)) let strings = KMBatesManager.parseModel(model: data, UInt(totalPDFCount)) var count: Int = 0 let color = data.color for text in strings { cPDFBates?.setText(text, at: UInt(count)) cPDFBates?.setTextColor(color, at: UInt(count)) cPDFBates?.setFontSize(fontSize, at: UInt(count)) cPDFBates?.setFontName(fontName, at: UInt(count)) count += 1 } cPDFBates?.update() self.documentPreview.refreshUI() } else { pdfDocument?.bates().clear() documentPreview.refreshUI() } } } //MARK: - KMHeaderPropertyControllerDelegate extension KMBatesController: KMBatesPropertyControllerDelegate { func batesPropertyControllerDidUpdate(_ controller: KMBatesPropertyController) { batesModel = controller.batesModel updatePDFDocumentBates() } func batesPropertyControllerDidChangetoTemplate(_ controller: KMBatesPropertyController) { editSubType = .template resetUI() batesModel = nil updatePDFDocumentBates() reloadData() delegate?.kmBatesControllerDidUpdateMode?(self) } func batesPropertyControllerSaveTemplateSuccess(_ controller: KMBatesPropertyController, _ data: KMBatesModel) { editSubType = .template reloadData() delegate?.kmBatesControllerDidUpdateMode?(self) } func batesPropertyControllerCancelTemplateEdit(_ controller: KMBatesPropertyController) { editSubType = .template reloadData() delegate?.kmBatesControllerDidUpdateMode?(self) } func batesPropertyControllerFinishTemplateEdit(_ controller: KMBatesPropertyController) { editSubType = .template reloadData() delegate?.kmBatesControllerDidUpdateMode?(self) } } //MARK: - KMHFTemplateControllerDelegate extension KMBatesController: KMBatesTemplateControllerDelegate { func templateControllerDidSelectedChanged(_ controller: KMBatesTemplateController) { batesModel = controller.selectedDataModel updatePDFDocumentBates() delegate?.kmBatesControllerDidModelDataUpdated?(self) } func templateControllerDidAddData(_ controller: KMBatesTemplateController) { editSubType = .add resetUI() propertyController.clearData() propertyController.batesModel = KMBatesModel() reloadData() delegate?.kmBatesControllerDidUpdateMode?(self) delegate?.kmBatesControllerDidModelDataUpdated?(self) } func templateControllerDidEditData(_ controller: KMBatesTemplateController, _ data: KMBatesModel) { editSubType = .edit propertyController.batesModel = data propertyController.originalDataDict = KMBatesManager.defaultManager.parseModel(model: data) resetUI() delegate?.kmBatesControllerDidUpdateMode?(self) delegate?.kmBatesControllerDidModelDataUpdated?(self) } }