// // KMNLeftSideViewController.swift // PDF Reader Pro // // Created by 丁林圭 on 2024/11/2. // import Cocoa import KMComponentLibrary @objc protocol KMNLeftSideViewControllerDelegate: AnyObject { @objc optional func enterPageEditLeftSideViewController(leftSideViewController:KMNLeftSideViewController) @objc optional func changeSelectePageLeftSideViewController(leftSideViewController:KMNLeftSideViewController,pageIndex:Int) @objc optional func addBookmarkForLeftC(controller: KMNLeftSideViewController, bookmark: CPDFBookmark?, info: [String : Any]?) @objc optional func switchSearchPopWindow(controller: KMNLeftSideViewController) @objc optional func searchTypeDidChange(controller: KMNLeftSideViewController) } class KMNLeftSideViewController: KMNBaseViewController { weak open var leftSideViewDelegate: KMNLeftSideViewControllerDelegate? @IBOutlet var backContentBox: NSBox! @IBOutlet var headerBox: NSBox! @IBOutlet var bottomBox: NSBox! @IBOutlet weak var headerBoxHeightConst: NSLayoutConstraint! private var currentDocument:CPDFDocument? public var thumnailViewController:KMNThumnailViewController? private lazy var bookmarkViewC_: KMBookMarkViewController = { let controller = KMBookMarkViewController() controller.delegate = self return controller }() private lazy var outlineViewC_: KMOutlineViewController = { let contr = KMOutlineViewController(nibName: "KMOutlineViewController", bundle: nil) return contr }() private lazy var searchViewC_: KMBotaSearchViewController = { let con = KMBotaSearchViewController() con.delegate = self return con }() private lazy var annotationViewC_: KMLeftSideViewController = { let leftSideViewController = KMLeftSideViewController() leftSideViewController.delegate = self return leftSideViewController }() private lazy var aiInfoWindowVC: NSWindowController = { let aiConfigWindowVC = AINewConfigWindowController.currentWC() aiConfigWindowVC.window?.orderOut(nil) return aiConfigWindowVC }() var outlineViewC: KMOutlineViewController { get { return outlineViewC_ } } var bookmarkViewC: KMBookMarkViewController { get { return bookmarkViewC_ } } var searchViewC: KMBotaSearchViewController { get { return searchViewC_ } } var annoController: KMLeftSideViewController { get { return annotationViewC_ } } lazy var thumbnailHeaderViewController: KMNThumnailHeaderViewController = { let controller = KMNThumnailHeaderViewController(nibName: "KMNThumnailHeaderViewController", bundle: nil) controller.view.frame = headerBox.bounds controller.view.autoresizingMask = [.width, .height] // Use flexible for better resizing return controller }() public var leftsideType:KMPDFSidebarType = .none { didSet { switch leftsideType { case .search: headerBoxHeightConst.constant = 0 bottomBox.contentView = searchViewC_.view case .thumbnail: headerBoxHeightConst.constant = 40 headerBox.contentView = thumbnailHeaderViewController.view bottomBox.contentView = thumnailViewController?.view self.view.layoutSubtreeIfNeeded() reloadData() case .bookmark: headerBoxHeightConst.constant = 0 bottomBox.contentView = bookmarkViewC_.view bookmarkViewC_.document = currentDocument reloadData() case .outline: headerBoxHeightConst.constant = 0 bottomBox.contentView = outlineViewC_.view reloadData() case .annotation: headerBoxHeightConst.constant = 0 bottomBox.contentView = annotationViewC_.view case .aiTools: headerBoxHeightConst.constant = 0 if let view = aiInfoWindowVC.window?.contentView { bottomBox.contentView = view } default: break } } } public func reloadData() { NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(reloadIfData), object: nil) DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { self.reloadIfData() } } @objc public func reloadIfData() { switch leftsideType { case .search: break case .thumbnail: thumnailViewController?.reloadDatas() break case .bookmark: bookmarkViewC_.reloadData() break case .outline: outlineViewC_.reloadData() break case .annotation: annoController.note_reloadDataIfNeed() break case .aiTools: break default: break } } public func changeDocument(document: CPDFDocument?) { currentDocument = document } public func changeLeftSideBounds() { thumnailViewController?.updateThumbnailSize() } init(_ document: CPDFDocument) { super.init(nibName: "KMNLeftSideViewController", bundle: nil) currentDocument = document } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() initThumnailView() } override func updateUIThemeColor() { super.updateUIThemeColor() headerBox.borderColor = ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider") headerBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle") bottomBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle") } private func initThumnailView() { thumnailViewController = KMNThumnailViewController.init(currentDocument) thumnailViewController?.view.frame = bottomBox.bounds thumnailViewController?.thumnailViewDelegate = self thumnailViewController?.thumbnailBaseViewDelegate = self thumnailViewController?.view.autoresizingMask = [.width, .height] } // MARK: - Public Methods public func pageCountChangedAction(document: CPDFDocument?) { guard let theDocument = document, theDocument.isEqual(to: currentDocument) else { return } if leftsideType == .bookmark { bookmarkViewC.reloadData() } } public func currentPageDidChangedAction(listView: CPDFListView?) { guard let theDocument = listView?.document, theDocument.isEqual(to: currentDocument) else { return } if leftsideType == .bookmark { bookmarkViewC.currentPageDidChangedAction(document: currentDocument) } else if leftsideType == .thumbnail { var indexpaths: Set = [] indexpaths.insert(IndexPath(item: listView?.currentPageIndex ?? 0, section: 0)) thumnailViewController?.selectionIndexPaths = indexpaths } } } // MARK: - KMNThumbnailBaseViewDelegate extension KMNLeftSideViewController: KMNThumbnailBaseViewDelegate { func changeIndexPathsThumbnailViewControlle(pageEditVC:KMNThumbnailBaseViewController?,selectionIndexPaths: Set,selectionStrings:String ) { if(selectionIndexPaths.count == 1) { leftSideViewDelegate?.changeSelectePageLeftSideViewController?(leftSideViewController: self, pageIndex: selectionIndexPaths.first?.item ?? 0) } } } // MARK: - KMNThumnailViewControllerDelegate extension KMNLeftSideViewController: KMNThumnailViewControllerDelegate { func enterPageEditThumnailViewController(thumnailViewController: KMNThumnailViewController) { leftSideViewDelegate?.enterPageEditLeftSideViewController?(leftSideViewController: self) } } // MARK: - KMBookMarkViewControllerDelegate extension KMNLeftSideViewController: KMBookMarkViewControllerDelegate { func bkControllerAddAction(controller: KMBookMarkViewController, bookmark: CPDFBookmark?, info: [String : Any]?) { leftSideViewDelegate?.addBookmarkForLeftC?(controller: self, bookmark: bookmark, info: info) } } // MARK: - KMBotaSearchViewControllerDelegate extension KMNLeftSideViewController: KMBotaSearchViewControllerDelegate { func switchSearchPopWindow(controller: KMBotaSearchViewController) { leftSideViewDelegate?.switchSearchPopWindow?(controller: self) } func searchTypeDidChange(controller: KMBotaSearchViewController) { leftSideViewDelegate?.searchTypeDidChange?(controller: self) } } // MARK: - KMLeftSideViewControllerDelegate extension KMNLeftSideViewController: KMLeftSideViewControllerDelegate { }