// // KMSplitPDFViewController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/10/29. // import Cocoa import KMComponentLibrary @objc protocol KMSplitPDFViewControllerDelegate: AnyObject { @objc optional func splitPDFViewControllerDidUpdateFilePath(_ controller: KMSplitPDFViewController) @objc optional func splitPDFViewControllerDidUpdatePDFScale(_ controller: KMSplitPDFViewController) @objc optional func splitPDFViewControllerDidUpdatePDFPageIndex(_ controller: KMSplitPDFViewController) } class KMSplitPDFViewController: NSViewController { @IBOutlet var contendView: NSView! @IBOutlet var emptyView: ComponentEmpty! @IBOutlet var splitToolbar: KMPageNumberPromptView! var pdfView: CPDFListView? var viewManager: KMPDFViewManager? var inPDFFirst: Bool = false var outPDFFirst: Bool = false weak open var delegate: KMSplitPDFViewControllerDelegate? deinit { pdfView?.removeFromSuperview() KMPrint(self.className + " deinit.") } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. view.wantsLayer = true view.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-low").cgColor setupProperty() reloadData() } func setupProperty() { emptyView.properties = ComponentEmptyProperty(emptyType: .add_File, text: KMLocalizedString("No Recently Opened Files"), subText: KMLocalizedString("Click Open File or drag-and-drop file here to open them.")) emptyView.setTarget(self, action: #selector(emptyViewAddFileClicked(_:))) if pdfView == nil { pdfView = CPDFListView.init() } pdfView?.frame = contendView.bounds pdfView?.delegate = self pdfView?.autoresizingMask = [.width, .height] contendView.addSubview(pdfView!, positioned: .below, relativeTo: splitToolbar) } func reloadData() { if let fileURL = viewManager?.splitPDFFileURL { emptyView.isHidden = true pdfView?.isHidden = false let document = CPDFDocument(url: fileURL) let isLocked = document?.isLocked ?? false if isLocked { if let pw = viewManager?.splitPDFFilePassword { document?.unlock(withPassword: pw) } } pdfView?.document = document } else { emptyView.isHidden = false pdfView?.isHidden = true } refreshToolbarState() } func refreshToolbarState() { if viewManager?.splitShowBottomBar == true && viewManager?.splitPDFFileURL != nil { splitToolbar.isHidden = false splitToolbar.pdfView = self.pdfView reloadToolbarInfo() } else { splitToolbar.isHidden = true } } func reloadToolbarInfo() { splitToolbar.reloadData() } @objc func emptyViewAddFileClicked(_ sender: NSView) { let openPanel = NSOpenPanel() openPanel.allowedFileTypes = ["pdf", "PDF"] openPanel.allowsMultipleSelection = false openPanel.beginSheetModal(for: self.view.window!) { [weak self] result in if result == NSApplication.ModalResponse.OK { if let url = openPanel.url { guard let weakSelf = self else { return } weakSelf.viewManager?.splitPDFFileURL = url let document = CPDFDocument(url: url) let isLocked = document?.isLocked ?? false if isLocked { } weakSelf.reloadData() weakSelf.delegate?.splitPDFViewControllerDidUpdateFilePath?(weakSelf) } } } } } //MARK: - CPDFViewDelegate PDFView代理 extension KMSplitPDFViewController: CPDFViewDelegate { func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) { reloadToolbarInfo() } func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) { reloadToolbarInfo() if viewManager?.splitSyncScroll == true { if inPDFFirst == false && outPDFFirst == false { inPDFFirst = true delegate?.splitPDFViewControllerDidUpdatePDFPageIndex?(self) NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil) self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 1) } else if inPDFFirst == true { delegate?.splitPDFViewControllerDidUpdatePDFPageIndex?(self) NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil) self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 1) } } } func pdfViewScaleDidChanged(_ pdfView: CPDFView!) { reloadToolbarInfo() if viewManager?.splitSyncScroll == true { if inPDFFirst == false && outPDFFirst == false { inPDFFirst = true NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil) self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 1) } else if inPDFFirst == true { delegate?.splitPDFViewControllerDidUpdatePDFScale?(self) NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil) self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 1) } } } @objc func pdfUpdatedFinish() { inPDFFirst = false outPDFFirst = false } }