// // KMBookemarkOutlineView.swift // PDF Reader Pro // // Created by lizhe on 2024/3/4. // import Cocoa private let kLabelIdentifier = NSUserInterfaceItemIdentifier("Label") private let kFileIdentifier = NSUserInterfaceItemIdentifier("File") private let kPageIdentifier = NSUserInterfaceItemIdentifier("Page") class KMBookmarkOutlineView: KMBaseXibView { @IBOutlet weak var outlineView: NSOutlineView! var data: KMRootBookmark? { didSet { self.reloadData() } } override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) // Drawing code here. } override func setup() { outlineView.delegate = self outlineView.dataSource = self outlineView.registerForDraggedTypes([kPasteboardTypeBookmarkRows, .fileURL, .string]) outlineView.doubleAction = #selector(doubleClickBookmark) } override func reloadData() { guard let data = data else { return } self.outlineView.reloadData() } } //MARK: Action extension KMBookmarkOutlineView { @objc func doubleClickBookmark() { } } // MARK: - NSOutlineViewDataSource extension KMBookmarkOutlineView: NSOutlineViewDataSource { func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int { let bookmark = item as? KMBookmark ?? data guard let bookmark = bookmark else { return 0} return bookmark.bookmarkType == .folder ? bookmark.children.count : 0 } func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool { let bookmark = item as! KMBookmark return bookmark.bookmarkType == .folder } func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any { let bookmark = (item as? KMBookmark) ?? data return bookmark?.objectOfChidren(index: index) as Any } } extension KMBookmarkOutlineView: NSOutlineViewDelegate { // MARK: - NSOutlineViewDelegate func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? { guard let column = tableColumn else { return nil } guard let item = item as? KMBookmark else { return nil } let identifier = column.identifier var cell: NSTableCellView = NSTableCellView() switch identifier { case kLabelIdentifier: do { cell = KMBookmarkOutlineTitleCellView() } case kPageIdentifier: do { cell = KMBookmarkOutlinePageCellView() } case kFileIdentifier: do { cell = KMBookmarkOutlineFileCellView() } default: break } return cell } }