// // KMFromViewController.swift // PDF Reader Pro // // Created by lxy on 2022/10/10. // import Cocoa class KMFromViewController: NSViewController { @IBOutlet weak var titleLabel: NSTextField! @IBOutlet weak var formOutilneView: NSOutlineView! @IBOutlet weak var topBackView: NSView! var listView : CPDFListView = CPDFListView() var widgetAnnotations : [KMFormModel] = [] var renameTextField : NSTextField! var renameFormModel : KMFormModel! override func viewDidLoad() { super.viewDidLoad() self.view.wantsLayer = true self.view.layer?.backgroundColor = NSColor.gray.cgColor self.topBackView.wantsLayer = true self.topBackView.layer?.backgroundColor = NSColor.white.cgColor self.titleLabel.stringValue = NSLocalizedString("域", comment: "") self.formOutilneView.doubleAction = #selector(renameWidgetAction) self.addoutlineMenu() self.reloadData() } public func reloadData() { self.widgetAnnotations.removeAll() if self.listView.document == nil { return } self.widgetAnnotations = KMFormModel.getFormAnnotations(document: self.listView.document) self.formOutilneView.reloadData() } func addoutlineMenu() { let menus : NSMenu = NSMenu(title: "") let deleteItem = self.menuItemWithTitle(title: NSLocalizedString("Delete", comment: ""), action: #selector(deleteWidgetAction)) let renameItem = self.menuItemWithTitle(title: NSLocalizedString("Rename", comment: ""), action: #selector(renameWidgetAction)) menus.addItem(renameItem) menus.addItem(deleteItem) self.formOutilneView.menu = menus } @objc func deleteWidgetAction() { let selectedRowIndexes : IndexSet! = self.selectedRowIndexs() if selectedRowIndexes.count == 0 { __NSBeep() } else { var selectedPDFOutlineArr = [KMFormModel](); for index in selectedRowIndexes { var outline : KMFormModel = self.formOutilneView.item(atRow: index) as! KMFormModel selectedPDFOutlineArr.append(outline) } for form in selectedPDFOutlineArr { if form.datas.count > 0 { } if (form.annotation.fieldName() != nil) { form.annotation.page.removeAnnotation(form.annotation) } } self.listView.setNeedsDisplayForVisiblePages() self.reloadData() } } @objc func renameWidgetAction() { if self.formOutilneView.clickedRow >= 0 { self.renameFormModel = self.formOutilneView.item(atRow: self.formOutilneView.clickedRow) as? KMFormModel if self.renameFormModel.annotation.fieldName() == nil { return } let cell : KMFormCellView = self.formOutilneView.view(atColumn: 0, row: self.formOutilneView.clickedRow, makeIfNecessary: true) as! KMFormCellView self.renameTextField = cell.widgetTitleLabel self.renameTextField.delegate = self self.renameTextField.isEditable = true self.renameTextField.becomeFirstResponder() } else { __NSBeep() } } private func renameWidgetAnnotation(model:KMFormModel,label:String) { if model.annotation.fieldName() != nil { if model.annotation.fieldName() == label { return } model.annotation.setFieldName(label) self.formOutilneView.reloadData() var indexSet = IndexSet() indexSet.insert(self.formOutilneView.row(forItem: model)) self.formOutilneView.selectRowIndexes(indexSet, byExtendingSelection: false) } } private func selectedRowIndexs() -> IndexSet { let clickRow = self.formOutilneView.clickedRow var selectedRowIndexs = self.formOutilneView.selectedRowIndexes if(clickRow != -1 && !selectedRowIndexs.contains(clickRow)) { selectedRowIndexs = [clickRow] } return selectedRowIndexs } private func menuItemWithTitle(title:String, action:Selector?) -> NSMenuItem { let menuItem = NSMenuItem.init(title: title as String, action: action, keyEquivalent: "") menuItem.target = self return menuItem } } // MARK - NSOutlineViewDataSource,NSOutlineViewDelegate extension KMFromViewController : NSOutlineViewDataSource,NSOutlineViewDelegate { func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int { let indexModel = item as? KMFormModel var count = 0 if indexModel == nil { count = self.widgetAnnotations.count; } else { count = indexModel?.datas.count ?? 0 } if(count == 0) { //无数据时的图 } else { } return count } func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any { let indexModel = item as? KMFormModel var child = KMFormModel() if indexModel == nil { child = self.widgetAnnotations[index]; } else { child = indexModel?.datas[index] ?? KMFormModel() } return child } func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool { let newitem = item as? KMFormModel return newitem?.datas.count ?? 0 > 0 } func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item:Any) -> NSView? { let cell : KMFormCellView = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMFormCellView"), owner: self) as! KMFormCellView let model : KMFormModel = item as! KMFormModel if (model.annotation.fieldName() != nil) { if(model.datas.count > 0 && model.groupName != ""){ cell.widgetTitleLabel.stringValue = model.annotation.fieldName() cell.widgetImageView.isHidden = false cell.leftOffset.constant = 36 } else if (model.datas.count == 0 && model.groupName == "") { cell.widgetTitleLabel.stringValue = model.annotation.fieldName() cell.widgetImageView.isHidden = false cell.leftOffset.constant = 36 } } else { cell.widgetTitleLabel.stringValue = "\(model.index+1) page" cell.widgetImageView.isHidden = true cell.leftOffset.constant = 10 } let font : NSFont = NSFont.systemFont(ofSize: CGFloat(UserDefaults.standard.float(forKey: "SKOfficeTableFontSize"))) if (font != nil) { cell.widgetTitleLabel.font = NSFont.init(name: cell.widgetTitleLabel.font!.fontName, size: font.pointSize) } return cell } func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? { let rowView = KMCustomTableRowView() return rowView } func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat { let font : NSFont = NSFont.systemFont(ofSize: CGFloat(UserDefaults.standard.float(forKey: "SKOfficeTableFontSize"))) return 27 + font.pointSize } func outlineView(_ outlineView: NSOutlineView, shouldSelectItem item: Any) -> Bool { if self.formOutilneView.selectedRowIndexes.count > 1 { return true } let model : KMFormModel = item as! KMFormModel if model.datas.count == 0 && model.annotation.fieldName() != nil { self.listView.go(to: model.annotation.bounds, on: model.annotation.page, animated: true) } return true } } // MARK - NSTextFieldDelegate extension KMFromViewController : NSTextFieldDelegate ,NSMenuItemValidation { func controlTextDidEndEditing(_ obj: Notification) { if (self.renameTextField.isEqual(obj.object)) { let textField : NSTextField = obj.object as! NSTextField self.renameWidgetAnnotation(model: self.renameFormModel, label: textField.stringValue) } } func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { let action = menuItem.action if action == #selector(deleteWidgetAction) || action == #selector(renameWidgetAction){ if self.formOutilneView.selectedRowIndexes.count > 0 { let model : KMFormModel = self.formOutilneView.item(atRow: self.formOutilneView.clickedRow) as! KMFormModel if(model.annotation.fieldName() == nil) { return false } return true } else { return false } } return true } }