// // KMRightSideController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/11/12. // import Cocoa import KMComponentLibrary @objc protocol KMRightSideControllerDelegate: AnyObject { @objc optional func kmRightSideControllerDidContendVCUpdated(_ controller: KMRightSideController) } class KMRightSideController: NSViewController { @IBOutlet var contendView: NSView! @IBOutlet var contendLeftDivider: ComponentDivider! @IBOutlet var headerBGView: NSView! @IBOutlet var titleLabel: NSTextField! @IBOutlet var headerRightButton: ComponentButton! @IBOutlet var infoContendView: NSView! @IBOutlet var emptyView: ComponentEmpty! var pdfView: CPDFListView? var viewManager: KMPDFViewManager? //Controller //Markup var highlight_Controller: KMHighlightController? var note_Controller: KMNoteController? var pen_Controller: KMPenController? var eraser_Controller: KMEraserController? var rectangle_Controller: KMRectangleController? var line_Controller: KMLineController? var freeText_Controller: KMTextBoxController? //Edit var edit_textController: KMEditPDFTextPropertyViewController? var edit_imageController: KMEditImageController? var edit_linkController: KMLinkViewController? var edit_cropController: KMCropPropertyController? //Form //Fill // var contentViewController: NSViewController? weak open var delegate: KMRightSideControllerDelegate? //MARK: - func override func viewDidLoad() { super.viewDidLoad() // Do view setup here. setupUI() setupContentController() } //MARK: - Get func checkMultiAnnotation() -> Bool { var exitMulitAnnotation: Bool = false //判断是否存在不同类型注释 let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? [] if annotations.count == 0 { exitMulitAnnotation = true //空状态先暂时判断为多种注释。 } else { for annotationA in annotations { var markupType: CPDFMarkupType = .highlight if annotationA is CPDFMarkupAnnotation { markupType = (annotationA as! CPDFMarkupAnnotation).markupType() } for annotationB in annotations { if annotationA != annotationB { if annotationA.className != annotationB.className { exitMulitAnnotation = true break } else { if annotationB is CPDFMarkupAnnotation { let markupAnnotation = (annotationB as! CPDFMarkupAnnotation) if markupAnnotation.markupType() != markupType { exitMulitAnnotation = true break } } } } if exitMulitAnnotation == true { break } } } } return exitMulitAnnotation } func getValidAnnotations() -> [CPDFAnnotation] { return [] } //MARK: - Set func setupUI() { contendView.wantsLayer = true contendView.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor contendLeftDivider.properties = ComponentDividerProperty(type: .vertical) titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2") titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold") emptyView.properties = ComponentEmptyProperty(emptyType: .noWatermark, text: KMLocalizedString("No identical attributes"), subText: "") } func setEmptyView(isHidden hidden: Bool) { // if hidden { infoContendView.isHidden = false headerBGView.isHidden = false emptyView.isHidden = true // } else { // headerBGView.isHidden = true // infoContendView.isHidden = true // // emptyView.isHidden = false // } } func updateTitleLabel() { let subToolMode = viewManager?.subToolMode ?? .None let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? [] var firstAnnotation: CPDFAnnotation? if annotations.count == 1 { } titleLabel.stringValue = "" if viewManager?.toolMode == .Markup { if subToolMode != .None { if subToolMode == .Highlight { titleLabel.stringValue = KMLocalizedString("Highlight") } else if subToolMode == .Underline { titleLabel.stringValue = KMLocalizedString("Underline") } else if subToolMode == .Waveline { titleLabel.stringValue = KMLocalizedString("Wavyline") } else if subToolMode == .Strikethrough { titleLabel.stringValue = KMLocalizedString("Strikethrough") } else if subToolMode == .Text { titleLabel.stringValue = KMLocalizedString("Text Box") } else if subToolMode == .Note { titleLabel.stringValue = KMLocalizedString("Note") } else if subToolMode == .Pen { titleLabel.stringValue = KMLocalizedString("Pen") } else if subToolMode == .Eraser { titleLabel.stringValue = KMLocalizedString("Eraser") } else if subToolMode == .Rectangle { titleLabel.stringValue = KMLocalizedString("Rectangle") } else if subToolMode == .Circle { titleLabel.stringValue = KMLocalizedString("Circle") } else if subToolMode == .Arrow { titleLabel.stringValue = KMLocalizedString("Arrow") } else if subToolMode == .Line { titleLabel.stringValue = KMLocalizedString("Line") } else if subToolMode == .Stamp { titleLabel.stringValue = KMLocalizedString("Stamp") } else if subToolMode == .Sign { titleLabel.stringValue = KMLocalizedString("Sign") } } } else if viewManager?.toolMode == .Edit { if subToolMode == .Edit_text { titleLabel.stringValue = KMLocalizedString("Text") } else if subToolMode == .Edit_Image { titleLabel.stringValue = KMLocalizedString("Image") } else if subToolMode == .Edit_Link { titleLabel.stringValue = KMLocalizedString("Link") } else if subToolMode == .Edit_Crop { titleLabel.stringValue = KMLocalizedString("Crop") } else { if pdfView?.km_EditingAreas().isEmpty == true { } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false { //编辑文字 titleLabel.stringValue = KMLocalizedString("Text") } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true { //编辑图片 titleLabel.stringValue = KMLocalizedString("Image") } else { //多选 } } } } func setupContentController() { /** Case1:选中指定模式:显示指定模式的属性设置界面 Case2:未选中模式:根据选中的注释显示指定属性设置界面 1、筛选出指定模式下对应的右边界面,进行显示。 2、再判断是否有选中注释,多选不同类型注释时,判断为未选中注释。 3、判断选中指定类型的注释,或者选中的模式,都展示对应的界面。 */ updateTitleLabel() contentViewController?.view.removeFromSuperview() contentViewController = nil setEmptyView(isHidden: true) let toolMode = viewManager?.toolMode ?? .None let subToolMode = viewManager?.subToolMode ?? .None let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? [] if toolMode == .Edit { //MARK: -Edit编辑 setEmptyView(isHidden: true) if subToolMode != .None { if subToolMode == .Edit_text { if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false { //编辑文字 if edit_textController == nil { edit_textController = KMEditPDFTextPropertyViewController.init() } edit_textController?.pdfView = self.pdfView contentViewController = edit_textController } } else if subToolMode == .Edit_Image { } else if subToolMode == .Edit_Link { //链接 if edit_linkController == nil { edit_linkController = KMLinkViewController.init() } edit_linkController?.pdfView = self.pdfView contentViewController = edit_linkController } else if subToolMode == .Edit_Crop { if edit_cropController == nil { edit_cropController = KMCropPropertyController.init() } contentViewController = edit_cropController } } else { if pdfView?.km_EditingAreas().isEmpty == true { //未选中文字跟图片 setEmptyView(isHidden: false) } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false { //编辑文字 if edit_textController == nil { edit_textController = KMEditPDFTextPropertyViewController.init() } edit_textController?.pdfView = self.pdfView contentViewController = edit_textController } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true { //编辑图片 if edit_imageController == nil { edit_imageController = KMEditImageController.init() } contentViewController = edit_imageController } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == false { //混选 setEmptyView(isHidden: false) } } } else { let exitMulitAnnotation = self.checkMultiAnnotation() if exitMulitAnnotation == true { setEmptyView(isHidden: false) return } if annotations.count == 0 { return } let firstAnnotation = annotations.first if firstAnnotation is CPDFMarkupAnnotation { if highlight_Controller == nil { highlight_Controller = KMHighlightController.init() } highlight_Controller?.pdfView = self.pdfView contentViewController = highlight_Controller } else if firstAnnotation is CPDFTextAnnotation { if note_Controller == nil { note_Controller = KMNoteController.init() } note_Controller?.pdfView = self.pdfView contentViewController = note_Controller } else if firstAnnotation is CPDFInkAnnotation { if pen_Controller == nil { pen_Controller = KMPenController.init() } pen_Controller?.pdfView = self.pdfView contentViewController = pen_Controller } else if firstAnnotation is CPDFCircleAnnotation || firstAnnotation is CPDFSquareAnnotation { if rectangle_Controller == nil { rectangle_Controller = KMRectangleController.init() } rectangle_Controller?.pdfView = self.pdfView contentViewController = rectangle_Controller } else if firstAnnotation is CPDFLineAnnotation { if line_Controller == nil { line_Controller = KMLineController.init() } line_Controller?.pdfView = self.pdfView contentViewController = line_Controller } else if firstAnnotation is CPDFFreeTextAnnotation { if freeText_Controller == nil { freeText_Controller = KMTextBoxController.init() } freeText_Controller?.pdfView = self.pdfView contentViewController = freeText_Controller } } if let contendVC = contentViewController { contendVC.view.frame = infoContendView.bounds contendVC.view.autoresizingMask = [.width, .height] infoContendView.addSubview(contendVC.view) delegate?.kmRightSideControllerDidContendVCUpdated?(self) } } func reloadData() { let toolMode = viewManager?.toolMode ?? .None let subToolMode = viewManager?.subToolMode ?? .None let annotations: [CPDFAnnotation] = self.pdfView?.activeAnnotations as? [CPDFAnnotation] ?? [] if (contentViewController is KMHighlightController) { (contentViewController as? KMHighlightController)?.reloadData() } else if (contentViewController is KMNoteController) { (contentViewController as? KMNoteController)?.reloadData() } else if (contentViewController is KMPenController) { (contentViewController as? KMPenController)?.reloadData() } else if (contentViewController is KMLineController) { (contentViewController as? KMLineController)?.reloadData() } else if (contentViewController is KMRectangleController) { (contentViewController as? KMRectangleController)?.reloadData() } else if (contentViewController is KMTextBoxController) { (contentViewController as? KMTextBoxController)?.reloadData() } if toolMode == .Markup { if (subToolMode == .Highlight || subToolMode == .Underline || subToolMode == .Waveline || subToolMode == .Strikethrough) && (contentViewController is KMHighlightController) { (contentViewController as? KMHighlightController)?.reloadData() } } else if toolMode == .Edit { //图片&文字 if pdfView?.km_EditingAreas().isEmpty == true { } else if pdfView?.km_editingImageAreas().isEmpty == true && pdfView?.km_editingTextAreas().isEmpty == false { //编辑文字 edit_textController?.pdfView = self.pdfView edit_textController?.reloadData() } else if pdfView?.km_editingImageAreas().isEmpty == false && pdfView?.km_editingTextAreas().isEmpty == true { //编辑图片 edit_imageController?.pdfView = self.pdfView edit_imageController?.reloadData() } else { //多选 } //Link if viewManager?.subToolMode == .Edit_Link && (contentViewController is KMLinkViewController) { if (contentViewController as! KMLinkViewController).pdfView != self.pdfView { (contentViewController as! KMLinkViewController).pdfView = self.pdfView } var linkAnnotations: [CPDFLinkAnnotation] = [] for annotation in annotations { if annotation is CPDFLinkAnnotation { linkAnnotations.append((annotation as! CPDFLinkAnnotation)) } } (contentViewController as! KMLinkViewController).annotations = linkAnnotations (contentViewController as! KMLinkViewController).reloadData() } else if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) { (contentViewController as! KMCropPropertyController).reloadData() } } } public func reloadDataWithPDFView(pdfView: CPDFListView) { self.pdfView = pdfView setupContentController() reloadData() } //MARK: - 重新刷新编辑中内容 public func reloadEditingAreas() { if contentViewController is KMEditPDFTextPropertyViewController { (contentViewController as! KMEditPDFTextPropertyViewController).reloadData() } else if contentViewController is KMEditImageController { (contentViewController as! KMEditImageController).reloadData() } } //MARK: - 裁剪模式下刷新文档 public func reloadCropDocument(_ pdfview: CPDFListView?) { if viewManager?.subToolMode == .Edit_Crop && (contentViewController is KMCropPropertyController) { (contentViewController as! KMCropPropertyController).pdfView = pdfview (contentViewController as! KMCropPropertyController).reloadData() } } }