// // KMHomeOpenView.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/10/8. // import Cocoa import KMComponentLibrary @objc protocol KMHomeOpenViewDelegate: AnyObject { //选择文件 @objc optional func homeOpenViewDidChooseFileURL(_ view: KMHomeOpenView?, _ url:URL) //选择多个图片文件 @objc optional func homeOpenViewDidChooseImageURLs(_ view: KMHomeOpenView?, _ urls: [URL]) @objc optional func homeOpenViewDidChooseCreateFromClipboard(_ view: KMHomeOpenView?) } class KMHomeOpenView: BaseXibView { @IBOutlet weak var contendView: NSView! @IBOutlet weak var openFileButton: ComponentButton! @IBOutlet var createFileButton: ComponentButton! var groupView: ComponentGroup! var createWC: KMURLCreatePDFWindowController = KMURLCreatePDFWindowController(windowNibName: "KMURLCreatePDFWindowController") weak open var delegate: KMHomeOpenViewDelegate? override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) // Drawing code here. } public required init?(coder decoder: NSCoder) { super.init(coder: decoder) } override init(frame frameRect: NSRect) { super.init(frame: frameRect) } public override func awakeFromNib() { super.awakeFromNib() setUpButtonProperty() } func setUpButtonProperty() { openFileButton.properties = ComponentButtonProperty(type: .primary, size: .m, state: .normal, buttonText: KMLocalizedString("Open Files"), keepPressState: false) openFileButton.setTarget(self, action: #selector(openFileAction(_:))) createFileButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .m, showRightIcon: true, buttonText: KMLocalizedString("Create PDF")) createFileButton.properties.propertyInfo.rightIcon_nor = NSImage(named: "arrowDown") createFileButton.properties.propertyInfo.rightIcon_press = NSImage(named: "arrowDown_press") createFileButton.reloadData() createFileButton.setTarget(self, action: #selector(createFileAction(_:))) } //MARK: - GroupView func showGroupView() { var viewHeight: CGFloat = 8 var menuItemArr: [ComponentMenuitemProperty] = [] for i in ["New From File", "New Blank Page", "New From Web Page", "New From Clipboard", " ", "Import From Scanner"] { if i == " " { let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider() menuItemArr.append(property) viewHeight += 8 } else { let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false, itemSelected: false, isDisabled: false, keyEquivalent: nil, text: KMLocalizedString(i)) menuItemArr.append(properties_Menuitem) viewHeight += 36 } } if groupView == nil { groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle()) } groupView.groupDelegate = self groupView?.frame = CGRectMake(310, 0, CGRectGetWidth(self.bounds), viewHeight) groupView.updateGroupInfo(menuItemArr) var point = convert(createFileButton.frame.origin, to: nil) point.y -= viewHeight groupView.showWithPoint(point, relativeTo: createFileButton) createFileButton.properties.state = .pressed createFileButton.reloadData() } func removeGroupView() { if groupView != nil { groupView.removeFromSuperview() } createFileButton.properties.state = .normal createFileButton.reloadData() } //MARK: - Action @objc func openFileAction(_ sender: NSView) { let openPanel = NSOpenPanel() openPanel.allowedFileTypes = ["pdf", "PDF"] openPanel.allowsMultipleSelection = false openPanel.beginSheetModal(for: self.window!) { [weak self] result in if result == NSApplication.ModalResponse.OK { if let url = openPanel.url { self?.delegate?.homeOpenViewDidChooseFileURL?(self, url) } } } } @objc func createFileAction(_ sender: NSView) { showGroupView() } func newFromFile() { let openPanel = NSOpenPanel() openPanel.allowedFileTypes = KMImageToPDFMethod.supportedImageTypes() //MARK: 允许多选还是单选,如果是付费用户允许多选 openPanel.allowsMultipleSelection = true openPanel.message = KMLocalizedString("Select images to create a new document. To select multiple files press cmd ⌘ button on keyboard and click on the target files one by one.") if IAPProductsManager.default().isAvailableAllFunction(){ openPanel.allowsMultipleSelection = true } else { openPanel.allowsMultipleSelection = false } openPanel.beginSheetModal(for: NSWindow.currentWindow()) {[weak self] result in if result == NSApplication.ModalResponse.OK { guard let weakSelf = self else { return } let urls = openPanel.urls as [URL] weakSelf.delegate?.homeOpenViewDidChooseImageURLs?(weakSelf, urls) } } } func newBlankPage() { let panel = NSSavePanel() panel.allowedFileTypes = ["pdf"] let resp = panel.runModal() if resp != .OK { return } let saveUrl = panel.url! let pdfDocument = CPDFDocument() pdfDocument?.insertPage(CGSize(width: 595, height: 842), at: 0) pdfDocument?.write(toFile: saveUrl.path) delegate?.homeOpenViewDidChooseFileURL?(self, saveUrl) } func newFromWebPage() { createWC.own_beginSheetModal(for: self.window) {[weak self] string in guard let weakSelf = self else { return } if let path = string { weakSelf.delegate?.homeOpenViewDidChooseFileURL?(weakSelf, URL(fileURLWithPath: path)) } } } func newFromClipboard() { delegate?.homeOpenViewDidChooseCreateFromClipboard?(self) } func importFromScanner() { let vc = KMDeviceBrowserWindowController.shared vc.type = .scanner vc.importScannerFileCallback = { [weak self] (url: NSURL) -> Void in self?.delegate?.homeOpenViewDidChooseFileURL?(self, url as URL) } vc.showWindow(nil) vc.window?.center() } } //MARK: - ComponentDropdownDelegate extension KMHomeOpenView: ComponentDropdownDelegate { func componentDropdownDidShowMenuItem(dropdown: ComponentDropdown) { showGroupView() } } //MARK: - ComponentGroupDelegate extension KMHomeOpenView: ComponentGroupDelegate { func componentGroupDidDismiss(group: ComponentGroup?) { removeGroupView() } func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) { if let selItem = menuItemProperty { let index = group?.menuItemArr.firstIndex(of: selItem) if index == 0 { newFromFile() } else if index == 1 { newBlankPage() } else if index == 2 { newFromWebPage() } else if index == 3 { newFromClipboard() } else if index == 5 { importFromScanner() } } } }