// // KMEditDocumentController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/11/1. // import Cocoa import KMComponentLibrary @objc protocol KMEditDocumentControllerDelegate: AnyObject { @objc optional func editControllerDidApplyEnable(_ controller: KMEditDocumentController) -> Bool @objc optional func editControllerDidExitEnable(_ controller: KMEditDocumentController) -> Bool @objc optional func editControllerDidApplyClicked(_ controller: KMEditDocumentController) @objc optional func editControllerDidExitClicked(_ controller: KMEditDocumentController) } class KMEditDocumentController: NSViewController { var pdfDocument: CPDFDocument? var pdfView: CPDFListView = CPDFListView.init() let coverView = NSView(frame: CGRectMake(0, 0, 300, 300)) private var groupListMenuGroup: ComponentGroup? = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle()) weak open var delegate: KMEditDocumentControllerDelegate? override func viewDidLoad() { super.viewDidLoad() // Do view setup here. pdfView.frame = view.bounds pdfView.autoresizingMask = [.width, .height] pdfView.setDisplay(.singlePage) pdfView.toolMode = .CNoteToolMode pdfView.autoScales = true pdfView.pdfListViewDelegate = self view.addSubview(pdfView) } func reloadData() { guard let pdfDocument = self.pdfDocument else { return } DispatchQueue.main.async { self.pdfView.document = pdfDocument self.pdfView.layoutDocumentView() } } func refreshUI() { pdfView.updateRender(true) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.15) {[weak self] in self?.pdfView.updateRender(true) } } func layoutDocumentView() { pdfView.document?.refreshPageData() pdfView.layoutDocumentView() } } extension KMEditDocumentController: CPDFListViewDelegate { func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer!, isMoveSelectAnno: Bool) { var pagePoint = CGPoint.zero let point = self.view.convert(theEvent.locationInWindow, from: nil) var items: [(String, String)] = [] items.append(("Apply", PDFViewMenuIdentifier_Edit_Apply)) items.append(("Exit", PDFViewMenuIdentifier_Edit_Exit)) var viewHeight: CGFloat = 8 var menuItemArr: [ComponentMenuitemProperty] = [] for (i, value) in items { if value.count == 0 { let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider() menuItemArr.append(property) viewHeight += 8 } else { let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false, itemSelected: false, keyEquivalent: nil, text: KMLocalizedString(i), identifier: value,representedObject: point) properties_Menuitem.isDisabled = true if properties_Menuitem.identifier == PDFViewMenuIdentifier_Edit_Apply { if delegate?.editControllerDidApplyEnable?(self) == true { properties_Menuitem.isDisabled = false } } else if (properties_Menuitem.identifier == PDFViewMenuIdentifier_Edit_Exit) { if delegate?.editControllerDidExitEnable?(self) == true { properties_Menuitem.isDisabled = false } } menuItemArr.append(properties_Menuitem) viewHeight += 36 } } groupListMenuGroup?.pagePoint = pagePoint groupListMenuGroup?.groupDelegate = self groupListMenuGroup?.frame = CGRectMake(0, 0, 180, viewHeight) groupListMenuGroup?.updateGroupInfo(menuItemArr) groupListMenuGroup?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: nil, withWindow: self.view.window) } func pdfListViewIsSupportSelecton(_ theEvent: NSEvent!, mouseType: KMPDFViewMouseType) -> Bool { if(mouseType == .menuForEvent) { return true } return false } } //MARK: - ComponentGroupDelegate extension KMEditDocumentController: ComponentGroupDelegate { func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) { if menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Apply { delegate?.editControllerDidApplyClicked?(self) } else if (menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Exit) { delegate?.editControllerDidExitClicked?(self) } } }