|
@@ -9,6 +9,7 @@ import Foundation
|
|
|
|
|
|
extension KMLeftSideViewController.Key {
|
|
|
static let thumbSizeScaling = "KMThumbnailSizeScalingKey"
|
|
|
+ static let thumbDisplayPageSizeKey = "kKMThumbnailDisplayPageSizeKey"
|
|
|
}
|
|
|
|
|
|
// MARK: - Actions
|
|
@@ -134,6 +135,8 @@ extension KMLeftSideViewController {
|
|
|
}
|
|
|
|
|
|
func thumb_initDefalutValue() {
|
|
|
+ self.isDisplayPageSize = KMDataManager.ud_bool(forKey: Self.Key.thumbDisplayPageSizeKey)
|
|
|
+
|
|
|
self.thumbnailView.wantsLayer = true
|
|
|
self.thumbnailView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
|
|
|
|
|
@@ -293,3 +296,326 @@ extension KMLeftSideViewController {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// MARK: - Menu Actions
|
|
|
+
|
|
|
+extension KMLeftSideViewController {
|
|
|
+ @objc func cutPage(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ self.tableView(self.thumbnailTableView, cutRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func copyPage(_ sender: AnyObject?) {
|
|
|
+ self.tableView(self.thumbnailTableView, copyRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func pastePage(_ sender: AnyObject?) {
|
|
|
+ self.tableView(self.thumbnailTableView, pasteFromPasteboard: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func deletePage(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ self.tableView(self.thumbnailTableView, deleteRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func rotatePageMenuAction(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ self.tableView(self.thumbnailTableView, rotateRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes as NSIndexSet)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func quickInsert(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
|
|
|
+ if idx == NSNotFound || idx >= self.listView.document.pageCount {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let result = self.listView.insertPage(KMNormalBlankSize, at: idx+1)
|
|
|
+ if result == false {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var selectedIndexSet = IndexSet()
|
|
|
+ selectedIndexSet.insert(idx+1)
|
|
|
+ self.insertPages(selectedIndexSet, pageAt: idx)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func insert(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ guard let document = self.listView.document else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
|
|
|
+ if idx == NSNotFound || idx >= document.pageCount {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if document.allowsCopying == false || document.allowsPrinting == false {
|
|
|
+ Task {
|
|
|
+ _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let insertVC = KMPDFEditInsertBlankPageWindow(document: document)
|
|
|
+ insertVC.insertLocation = 3
|
|
|
+ insertVC.currentPage = idx + 1
|
|
|
+ insertVC.callback = { [weak self] pdfDoc, _, pages, insertI in
|
|
|
+ if let _pages = pages {
|
|
|
+ // mm 单位的大小
|
|
|
+ guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertBlankPageWindow else {
|
|
|
+ self?.km_endSheet()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var pageSize = _winC.pageSize
|
|
|
+ let direction = _winC.pageRotation == 0 ? 0 : 1
|
|
|
+
|
|
|
+ if (direction == 0) { // 纵向
|
|
|
+ if (pageSize.width > pageSize.height) { // 需要交换
|
|
|
+ let tmp = pageSize.width
|
|
|
+ pageSize.width = pageSize.height
|
|
|
+ pageSize.height = tmp
|
|
|
+ } else {
|
|
|
+ // no things.
|
|
|
+ }
|
|
|
+ } else { // 横向
|
|
|
+ if (pageSize.width > pageSize.height) {
|
|
|
+ // no things.
|
|
|
+ } else { // 需要交换
|
|
|
+ let tmp = pageSize.width
|
|
|
+ pageSize.width = pageSize.height
|
|
|
+ pageSize.height = tmp
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 插入位置
|
|
|
+ let document = CPDFDocument()
|
|
|
+ document?.insertPage(pageSize, at: 0)
|
|
|
+ if let page: CPDFPage = (document?.page(at: 0)) {
|
|
|
+ self?.insertPage(page, pageAt: insertI)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ self?.km_quick_endSheet()
|
|
|
+ }
|
|
|
+ self.km_beginSheet(windowC: insertVC)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func insertPDF(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ guard let document = self.listView.document else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
|
|
|
+ if idx == NSNotFound || idx >= document.pageCount {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if document.allowsCopying == false || document.allowsPrinting == false {
|
|
|
+ Task {
|
|
|
+ _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let panel = NSOpenPanel()
|
|
|
+ panel.allowedFileTypes = ["pdf"]
|
|
|
+ panel.beginSheetModal(for: self.view.window!) { response in
|
|
|
+ if response == .cancel {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for fileURL in panel.urls {
|
|
|
+ let pdfDoc = CPDFDocument(url: fileURL)
|
|
|
+ if let data = pdfDoc?.isLocked, data {
|
|
|
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
|
|
+ KMBaseWindowController.checkPassword(url: fileURL) { [unowned self] success, resultPassword in
|
|
|
+ self.km_quick_endSheet()
|
|
|
+ if (resultPassword.isEmpty == false) {
|
|
|
+
|
|
|
+ let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL, password: resultPassword)
|
|
|
+ insertVC.insertLocation = 3
|
|
|
+ insertVC.currentPage = idx + 1
|
|
|
+ self.km_beginSheet(windowC: insertVC)
|
|
|
+ insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
|
|
|
+ var indexs = IndexSet()
|
|
|
+ guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
|
|
|
+ self?.km_quick_endSheet()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let doc = _winC.insertDocument!
|
|
|
+ let fileAttribute = _winC.fileAttribute
|
|
|
+ var insertIndex = insertIdx
|
|
|
+ var insertPages: [CPDFPage] = []
|
|
|
+ for number in fileAttribute.fetchSelectPages() {
|
|
|
+ if let page = doc.page(at: UInt(number-1)) {
|
|
|
+ insertPages.append(page)
|
|
|
+ indexs.insert(insertIndex)
|
|
|
+ insertIndex += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (i, page) in insertPages.enumerated() {
|
|
|
+ self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
|
|
|
+ }
|
|
|
+ self?.insertPages(indexs, pageAt: insertIdx)
|
|
|
+ self?.km_quick_endSheet()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL)
|
|
|
+ insertVC.insertLocation = 3
|
|
|
+ insertVC.currentPage = idx + 1
|
|
|
+ self.km_beginSheet(windowC: insertVC)
|
|
|
+ insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
|
|
|
+ var indexs = IndexSet()
|
|
|
+ guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
|
|
|
+ self?.km_quick_endSheet()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let doc = _winC.insertDocument!
|
|
|
+ let fileAttribute = _winC.fileAttribute
|
|
|
+ var insertIndex = insertIdx
|
|
|
+ var insertPages: [CPDFPage] = []
|
|
|
+ for number in fileAttribute.fetchSelectPages() {
|
|
|
+ if let page = doc.page(at: UInt(number-1)) {
|
|
|
+ insertPages.append(page)
|
|
|
+ indexs.insert(insertIndex)
|
|
|
+ insertIndex += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (i, page) in insertPages.enumerated() {
|
|
|
+ self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
|
|
|
+ }
|
|
|
+ self?.insertPages(indexs, pageAt: insertIdx)
|
|
|
+ self?.km_quick_endSheet()
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func extractPage(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ self.tableView(self.thumbnailTableView, extractRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func pageEdit(_ sender: AnyObject?) {
|
|
|
+ self.delegate?.controller?(controller: self, itemClick: nil, itemKey: .pageEdit, params: nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func displayPageSize(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ self.isDisplayPageSize = !self.isDisplayPageSize
|
|
|
+ KMDataManager.ud_set(self.isDisplayPageSize, forKey: Self.Key.thumbDisplayPageSizeKey)
|
|
|
+
|
|
|
+ Task { @MainActor in
|
|
|
+ self.thumbnailTableView.reloadData()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func sharePage(_ sender: AnyObject?) {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ guard let document = self.listView.document else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var pages = NSMutableArray()
|
|
|
+ for idx in self.thumbnailTableView.selectedRowIndexes {
|
|
|
+ if (idx < document.pageCount) {
|
|
|
+ if let page = self.listView.document.page(at: UInt(idx)) {
|
|
|
+ pages.add(page)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let pdf = CPDFDocument()
|
|
|
+ for page in pages {
|
|
|
+// PDFPage *copyPage = [[page copy] autorelease];
|
|
|
+ if let _page = page as? CPDFPage {
|
|
|
+ pdf?.insertPageObject(_page, at: pdf?.pageCount ?? 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var fileName = ""
|
|
|
+// NSString * = [self.pdfDocument.documentURL.lastPathComponent stringByDeletingPathExtension];
|
|
|
+ var documentFileName = document.documentURL?.deletingPathExtension().lastPathComponent ?? ""
|
|
|
+
|
|
|
+ var tName = self.fileNameWithSelectedPages(self.thumbnailTableView.selectedRowIndexes)
|
|
|
+ if (tName.count > 50) {
|
|
|
+ tName = tName.substring(to: 50)
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pages.count > 1) {
|
|
|
+ fileName = String(format: "%@ pages %@", documentFileName, tName)
|
|
|
+ } else {
|
|
|
+ fileName = String(format: "%@ page %@", documentFileName, tName)
|
|
|
+ }
|
|
|
+
|
|
|
+ let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
|
|
|
+ var cachesDir = paths.first ?? ""
|
|
|
+ cachesDir = "\(cachesDir)/\(fileName).pdf"
|
|
|
+ var array = NSMutableArray()
|
|
|
+ let url = URL(fileURLWithPath: cachesDir)
|
|
|
+ array.add(url)
|
|
|
+ let vc = KMProgressWindowController()
|
|
|
+// // [NSApp beginSheet:[vc window]
|
|
|
+// // modalForWindow:self.window
|
|
|
+// // modalDelegate:nil
|
|
|
+// // didEndSelector:nil
|
|
|
+// // contextInfo:NULL];
|
|
|
+ self.view.window?.beginSheet(vc.window!, completionHandler: { [unowned self] returnCode in
|
|
|
+ NSApp.endSheet(self.view.window!, returnCode: returnCode.rawValue)
|
|
|
+ })
|
|
|
+
|
|
|
+ DispatchQueue.global().async {
|
|
|
+ let sucess = pdf?.write(toFile: cachesDir) ?? false
|
|
|
+ if (sucess) {
|
|
|
+ DispatchQueue.main.async {
|
|
|
+// [[sender representedObject] performWithItems:array];
|
|
|
+ let represent : NSSharingService = (sender as! NSMenuItem).representedObject as! NSSharingService
|
|
|
+ represent.perform(withItems: [url])
|
|
|
+
|
|
|
+ NSApp.endSheet(vc.window!)
|
|
|
+ vc.close()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ NSApp.endSheet(vc.window!)
|
|
|
+ vc.close()
|
|
|
+ }
|
|
|
+ }
|
|
|
+// [vc release];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|