KMBaseViewController.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // KMBaseViewController.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2023/5/5.
  6. //
  7. import Cocoa
  8. // 基类 [抽象类]
  9. class KMBaseViewController: NSViewController {
  10. // 是否需要菜单
  11. var needMenu = false {
  12. didSet {
  13. if (self.needMenu) {
  14. self.addMenu(to: self.view)
  15. } else {
  16. self.removeMenu(to: self.view)
  17. }
  18. }
  19. }
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. if (self.needMenu) {
  23. self.addMenu(to: self.view)
  24. } else {
  25. self.removeMenu(to: self.view)
  26. }
  27. }
  28. // MARK: - Open Password Files
  29. private var lockedFiles: [URL] = []
  30. func km_open_pdf_multi(type: KMPasswordInputWindowType = .open, progressBlock: ((_ index: Int, _ params: Any...)->Void)? = nil, completionBlock:@escaping ([CPDFDocument])->Void) {
  31. NSPanel.km_open_pdf_multi_success(self.view.window!, panel: nil) { urls in
  32. var results: [CPDFDocument] = []
  33. self.lockedFiles.removeAll()
  34. for url in urls {
  35. let document = CPDFDocument(url: url)
  36. if (document!.isLocked) {
  37. self.lockedFiles.append(url)
  38. continue
  39. }
  40. if let _document = document {
  41. results.append(_document)
  42. }
  43. }
  44. if (self.lockedFiles.count == 0) {
  45. completionBlock(results)
  46. return
  47. }
  48. if let _callback = progressBlock {
  49. _callback(0, results)
  50. }
  51. var index = 0
  52. self.openPasswordWindow(fileUrl: self.lockedFiles.first!, type: type) { params in
  53. index += 1
  54. if (params.count <= 2) { // 参数错误
  55. if let _callback = progressBlock { // 回调进度
  56. _callback(index)
  57. }
  58. return
  59. }
  60. let fileUrl = params[0] as! URL
  61. let result = params[1] as! KMPasswordInputWindowResult
  62. let password = params[2] as? String
  63. if (result == .cancel) {
  64. if let _callback = progressBlock { // 回调进度
  65. _callback(index, fileUrl, result)
  66. }
  67. return
  68. }
  69. let document = CPDFDocument(url: fileUrl)
  70. if let _password = password { // 将文档进行解密
  71. document?.unlock(withPassword: _password)
  72. }
  73. if let _callback = progressBlock { // 回调进度
  74. _callback(index, document as Any, fileUrl, result, password as Any)
  75. }
  76. // 将文档加入返回数据
  77. if let _document = document {
  78. results.append(_document)
  79. }
  80. } completionBlock: {
  81. completionBlock(results)
  82. }
  83. }
  84. }
  85. fileprivate func openPasswordWindow(fileUrl: URL, type: KMPasswordInputWindowType, progressBlock: ((_ params: Any...)->Void)?, completionBlock:@escaping ()->Void) {
  86. KMPasswordInputWindow.openWindow(window: self.view.window!, type: type, url: fileUrl) { [weak self] result, password in
  87. // 将结果返回
  88. if let _callback = progressBlock {
  89. _callback(fileUrl, result, password as Any)
  90. }
  91. // 进行下一个
  92. self?.lockedFiles.removeFirst()
  93. if let _fileUrl = self?.lockedFiles.first {
  94. self?.openPasswordWindow(fileUrl: _fileUrl, type: type, progressBlock: progressBlock, completionBlock: completionBlock)
  95. } else {
  96. completionBlock()
  97. }
  98. }
  99. }
  100. // MARK: - Menu Add & Remove
  101. public func addMenu(to view: NSView?) {
  102. if let menuView = view {
  103. self.addMenu(to: menuView)
  104. return
  105. }
  106. self.addMenu(to: self.view)
  107. }
  108. public func removeMenu(to view: NSView?) {
  109. if let menuView = view {
  110. self.removeMenu(to: menuView)
  111. return
  112. }
  113. self.removeMenu(to: self.view)
  114. }
  115. private func addMenu(to view: NSView) {
  116. // 先移除
  117. self.removeMenu(to: view)
  118. let menu = NSMenu()
  119. menu.delegate = self
  120. view.menu = menu
  121. }
  122. private func removeMenu(to view: NSView) {
  123. view.menu?.delegate = nil
  124. view.menu = nil
  125. }
  126. }
  127. extension KMBaseViewController: NSMenuDelegate, NSMenuItemValidation {
  128. func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
  129. return true
  130. }
  131. func menuNeedsUpdate(_ menu: NSMenu) {
  132. menu.removeAllItems()
  133. }
  134. }