// // KMBackgroundController.swift // PDF Master // // Created by tangchao on 2022/12/23. // import Cocoa /// 背景 预览控制器 class KMBackgroundController: KMWatermarkAdjectivePreViewBaseController { override func viewDidLoad() { super.viewDidLoad() let itemTitles = [[NSLocalizedString("Add Background", comment: ""), NSLocalizedString("Delete Background", comment: "")], [NSLocalizedString("Batch", comment: "")]] var itemModels: Array> = [] for items in itemTitles { var array: Array = [] for title in items { let model = KMWatermarkAdjectiveTopBarItemModel() model.iconName = "" model.itemTitle = title array.append(model) } itemModels.append(array) } self.topBarView.initItemData(itemArrays: itemModels) self.topBarView.selectTopItem(index: 0) let preView: KMWatermarkPDFView_OC = KMWatermarkPDFView_OC() self.preView = preView self.preView.frame = self.preViewBox.contentView!.bounds self.preView.autoresizingMask = [.width, .height] self.preViewBox.contentView?.addSubview(self.preView) self.preView.setDisplay(.singlePage) let controller = KMBackgroundPropertyHomeController() controller.preView = self.preView controller.view.frame = self.rightBox.contentView!.bounds controller.view.autoresizingMask = [.width, .height] self.right_gotoViewController(viewController: controller) controller.modelDidChange = { [weak self] model in if (model == nil) { self!.topBarView.isCanApply(can: false) } else { self!.topBarView.isCanApply(can: true) } self!.model = model self!.model?.pageCount = Int((self?.preView.document.pageCount)!) (self?.preView as! KMWatermarkPDFView_OC).model = model } } override func viewDidAppear() { super.viewDidAppear() (self.rightViewController as! KMBackgroundPropertyHomeController).pageCount = Int(self.preView.document.pageCount) } override func applyAction() { if (self.model == nil) { let alert = NSAlert() alert.alertStyle = .critical alert.messageText = NSLocalizedString("Failure", comment: "") alert.runModal() return } self.beginLoading() self.addBackground(model: self.model! as! KMBackgroundModel, toPath: self.preView.document.documentURL.path) { result in DispatchQueue.main.async { self.preView.layoutDocumentView() self.preView.setNeedsDisplayForVisiblePages() } self.endLoading() if (result) { guard let callback = self.itemClick else { return } callback(1, nil) } else { let alert = NSAlert() alert.alertStyle = .critical alert.messageText = NSLocalizedString("Failure", comment: "") alert.runModal() } } } override func topItemClick(index: Int) { if (index == 0) { /// 添加 return } if (index == 2) { /// 批量 KMBatchWindowController.openFile(nil, .Background) return } /// 移除 self.beginLoading() self.deleteBackground(toPath: self.preView.document.documentURL.path) { result in self.endLoading() if (result) { DispatchQueue.main.async { self.preView.document = CPDFDocument(url: self.preView.document.documentURL) } } else { let alert = NSAlert() alert.alertStyle = .critical alert.messageText = NSLocalizedString("Failure", comment: "") alert.runModal() } } } func gotoPropertyListController() { let propertyController = KMBackgroundPropertyController() propertyController.preView = self.preView propertyController.view.frame = self.rightBox.contentView!.bounds propertyController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18) self.right_gotoViewController(viewController: propertyController) propertyController.rightButtonClick = { (index: Int) -> () in /// 创建背景 self.gotoCreateController() } propertyController.menuItemClick = { (itemIndex: Int, model: KMBackgroundModel) in self.gotoEditController(model: model) } propertyController.templateDidSelected = { (model: KMBackgroundModel, isSelected: Bool) in if (isSelected) { self.model = model self.topBarView.isCanApply(can: true) } else { self.model = nil self.topBarView.isCanApply(can: false) } } } func gotoCreateController() { let createController = KMCreateBackgroundController() createController.view.frame = self.rightBox.contentView!.bounds createController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18) createController.preView = self.preView self.topBarView.isCanApply(can: true) self.right_gotoViewController(viewController: createController) createController.backClick = { self.gotoPropertyListController() } createController.rightButtonClick = { (index: Int) -> () in /// 保存到模板 let templateModel = (self.rightViewController as! KMCreateBackgroundController).fetchTemplate() let result = KMBackgroundManager.defaultManager.addTemplate(model: templateModel as! KMBackgroundModel) if (result) { /// 返回模板列表 self.gotoPropertyListController() let propertyConroller: KMBackgroundPropertyController = self.rightViewController as! KMBackgroundPropertyController if (index == 0) { /// 颜色 propertyConroller.selectTabIndex(index: 0) } else if (index == 1) { /// 文件 propertyConroller.selectTabIndex(index: 1) } } } // createController.modelDidChange = { // (model: KMBackgroundModel) in /// 模型已经修改,可以再这里刷新预览视图 // self.model = model // } } func gotoEditController(model: KMBackgroundModel) { let editController = KMEditBackgroundController() editController.view.frame = self.rightBox.contentView!.bounds editController.view.autoresizingMask = NSView.AutoresizingMask(rawValue: 18) editController.editModel = model self.right_gotoViewController(viewController: editController) editController.backClick = { let editController: KMEditBackgroundController = self.rightViewController as! KMEditBackgroundController if (editController.isEdited) { KMBackgroundManager.defaultManager.updateTemplate(model: editController.editModel) } self.gotoPropertyListController() } } func addBackground(model: KMBackgroundModel, toPath: String, completion: @escaping (_ result: Bool) -> ()) { DispatchQueue.global().async { let document: CPDFDocument = self.applyDocument! var property = document.background() property!.scale = model.scale property!.rotation = CGFloat(-model.rotation) property!.opacity = model.opacity property?.xOffset = model.horizontalSpace property?.yOffset = model.verticalSpace property?.horizontalAlignment = UInt(model.horizontalMode) property?.verticalAlignment = UInt(model.verticalMode) if (model.type == .color) { property?.color = model.color property?.type = .color } else if (model.type == .file) { property?.setImage(NSImage(contentsOfFile: model.imagePath)) // property?.setImage(model.image) property?.type = .image } let pagesString = self.findPagesString(model) if (pagesString.isEmpty) { property?.pageString = "0-\(document.pageCount-1)" } else { property?.pageString = pagesString } property?.update() /// 保存到临时路径 let documentPath = NSTemporaryDirectory() let tempPath: String = "\(documentPath)/\(toPath.lastPathComponent)" if (FileManager.default.fileExists(atPath: tempPath)) { try?FileManager.default.removeItem(atPath: tempPath) } let result = document.write(to: URL(fileURLWithPath: tempPath)) if (result) { if (FileManager.default.fileExists(atPath: toPath)) { try?FileManager.default.removeItem(atPath: toPath) } try?FileManager.default.moveItem(atPath: tempPath, toPath: toPath) } else { try?FileManager.default.removeItem(atPath: tempPath) } DispatchQueue.main.async { completion(result) } } } func deleteBackground(toPath: String, completion: @escaping (_ result: Bool) -> ()) { if (self.preView.document.allowsPrinting == false || self.preView.document.allowsCopying == false) { let alert = NSAlert() alert.alertStyle = .critical alert.messageText = NSLocalizedString("This PDF document's user permissions does not allow modifying, content copying and printing.", comment: "") alert.runModal() completion(false) return } DispatchQueue.global().async { let document: CPDFDocument = self.preView.document var property = document.background() property?.clear() /// 保存到临时路径 let documentPath = NSTemporaryDirectory() let tempPath: String = "\(documentPath)/\(toPath.lastPathComponent)" if (FileManager.default.fileExists(atPath: tempPath)) { try?FileManager.default.removeItem(atPath: tempPath) } let result = document.write(to: URL(fileURLWithPath: tempPath)) if (result) { if (FileManager.default.fileExists(atPath: toPath)) { try?FileManager.default.removeItem(atPath: toPath) } try?FileManager.default.moveItem(atPath: tempPath, toPath: toPath) } else { try?FileManager.default.removeItem(atPath: tempPath) } DispatchQueue.main.async { completion(result) } } } }