// // KMBaseViewController.swift // PDF Master // // Created by tangchao on 2023/5/5. // import Cocoa // 基类 [抽象类] class KMBaseViewController: NSViewController { // 是否需要菜单 var needMenu = false { didSet { if (self.needMenu) { self.addMenu(to: self.view) } else { self.removeMenu(to: self.view) } } } override func viewDidLoad() { super.viewDidLoad() if (self.needMenu) { self.addMenu(to: self.view) } else { self.removeMenu(to: self.view) } } // MARK: - Open Password Files private var lockedFiles: [URL] = [] func km_open_pdf_multi(type: KMPasswordInputWindowType = .open, progressBlock: ((_ index: Int, _ params: Any...)->Void)? = nil, completionBlock:@escaping ([CPDFDocument])->Void) { NSPanel.km_open_pdf_multi_success(self.view.window!, panel: nil) { urls in var results: [CPDFDocument] = [] self.lockedFiles.removeAll() for url in urls { let document = CPDFDocument(url: url) if (document!.isLocked) { self.lockedFiles.append(url) continue } if let _document = document { results.append(_document) } } if (self.lockedFiles.count == 0) { completionBlock(results) return } if let _callback = progressBlock { _callback(0, results) } var index = 0 self.openPasswordWindow(fileUrl: self.lockedFiles.first!, type: type) { params in index += 1 if (params.count <= 2) { // 参数错误 if let _callback = progressBlock { // 回调进度 _callback(index) } return } let fileUrl = params[0] as! URL let result = params[1] as! KMPasswordInputWindowResult let password = params[2] as? String if (result == .cancel) { if let _callback = progressBlock { // 回调进度 _callback(index, fileUrl, result) } return } let document = CPDFDocument(url: fileUrl) if let _password = password { // 将文档进行解密 document?.unlock(withPassword: _password) } if let _callback = progressBlock { // 回调进度 _callback(index, document as Any, fileUrl, result, password as Any) } // 将文档加入返回数据 if let _document = document { results.append(_document) } } completionBlock: { completionBlock(results) } } } fileprivate func openPasswordWindow(fileUrl: URL, type: KMPasswordInputWindowType, progressBlock: ((_ params: Any...)->Void)?, completionBlock:@escaping ()->Void) { KMPasswordInputWindow.openWindow(window: self.view.window!, type: type, url: fileUrl) { [weak self] result, password in // 将结果返回 if let _callback = progressBlock { _callback(fileUrl, result, password as Any) } // 进行下一个 self?.lockedFiles.removeFirst() if let _fileUrl = self?.lockedFiles.first { self?.openPasswordWindow(fileUrl: _fileUrl, type: type, progressBlock: progressBlock, completionBlock: completionBlock) } else { completionBlock() } } } // MARK: - Menu Add & Remove public func addMenu(to view: NSView?) { if let menuView = view { self.addMenu(to: menuView) return } self.addMenu(to: self.view) } public func removeMenu(to view: NSView?) { if let menuView = view { self.removeMenu(to: menuView) return } self.removeMenu(to: self.view) } private func addMenu(to view: NSView) { // 先移除 self.removeMenu(to: view) let menu = NSMenu() menu.delegate = self view.menu = menu } private func removeMenu(to view: NSView) { view.menu?.delegate = nil view.menu = nil } } extension KMBaseViewController: NSMenuDelegate, NSMenuItemValidation { func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { return true } func menuNeedsUpdate(_ menu: NSMenu) { menu.removeAllItems() } }