KMToolbarController.swift 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106
  1. //
  2. // KMToolbarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/29.
  6. //
  7. import Cocoa
  8. extension CAnnotationType {
  9. func isAdvanced() -> Bool {
  10. if (self == .link || self == .stamp || self == .signSignature) {
  11. return true
  12. }
  13. if (self == .signText || self == .signTure || self == .signFalse || self == .signCircle || self == .signLine || self == .signDot || self == .signDate) {
  14. return true
  15. }
  16. if (self == .addText || self == .addImage) {
  17. return true
  18. }
  19. return false
  20. }
  21. func isMarkup() -> Bool {
  22. if self == .highlight || self == .underline || self == .strikeOut || self == .ink || self == .squiggly {
  23. return true
  24. }
  25. return false
  26. }
  27. func isSquare() -> Bool {
  28. if self == .square || self == .circle || self == .line || self == .arrow {
  29. return true
  30. }
  31. return false
  32. }
  33. }
  34. @objc protocol KMToolbarControllerDelegate {
  35. @objc optional func toolbarController(_ viewController: KMToolbarController, heightOffsetChange heightOffset: Float, animated: Bool)
  36. @objc optional func changeAnnotationModeAction(item:KMToolbarClickButton)
  37. @objc optional func showPDFLayoutModeAction(show:Bool)
  38. @objc optional func clickChildTool(type: KMToolbarType, index: Int)
  39. @objc optional func changePDFViewZoomModelAction(selectedTag:Int)
  40. @objc optional func changePDFViewZoomInAction()
  41. @objc optional func changePDFViewZoomOutAction()
  42. @objc optional func changePDFViewGotoNextPageAction()
  43. @objc optional func changePDFViewGoToPreviousPageAction()
  44. @objc optional func changePDFViewGotoBackAction()
  45. @objc optional func changePDFViewGoToForwardAction()
  46. @objc optional func aiTranslationPDFFileAction()
  47. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomModel selectedTag:Int)
  48. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomSting : String)
  49. @objc optional func mainToolDidClicked(_ toolController: KMToolbarController, _ beforeType: KMToolbarViewType, _ type: KMToolbarViewType, _ item: KMToolbarItemView, _ pages: [Int])
  50. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareAction toolbarItem: KMToolbarItemView)
  51. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareDocument item:NSMenuItem)
  52. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareFlatten item:NSMenuItem)
  53. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareOriginalPDF item:NSMenuItem)
  54. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, scanOCRModel selectedTag:Int)
  55. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, itemDidClick toolbarItem: KMToolbarItemView)
  56. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, searchAction searchString: String, forward: Bool)
  57. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, findSearchAction searchString: String, forward: Bool)
  58. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, findSearchAllAction searchString: String, forward: Bool)
  59. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, menuItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?)
  60. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, viewItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?)
  61. }
  62. class KMToolbarController: NSViewController {
  63. static let mainToolBarHeight: Float = 48
  64. static let childToolBarHeightValue: Float = 41
  65. static let findBarHeight: Float = 25
  66. @IBOutlet weak var mainToolBarBox: NSBox!
  67. @IBOutlet weak var childToolBarBox: NSBox!
  68. @IBOutlet weak var secondaryToolBarBox: NSBox!
  69. @IBOutlet weak var mainToolBarHeight: NSLayoutConstraint!
  70. @IBOutlet weak var childToolBarHeight: NSLayoutConstraint!
  71. @IBOutlet weak var secondaryToolBarHeight: NSLayoutConstraint!
  72. @IBOutlet weak var bottomOffset: NSLayoutConstraint!
  73. var mainToolBarView: KMToolbarViewController?
  74. var childToolBarView: KMToolbarViewController?
  75. var _toolbarType : KMToolbarViewType = KMToolbarViewType.None
  76. weak var mainViewController: KMMainViewController?
  77. open weak var delegate: KMToolbarControllerDelegate?
  78. var toolbarItems : [NSToolbarItem.Identifier : Any] = [:]
  79. var listView : CPDFListView?
  80. var lastItemBox : KMToolbarItemView = KMToolbarItemView()
  81. var lastChildItemBox : KMToolbarItemView = KMToolbarItemView()
  82. var popover: NSPopover?
  83. //find seaarch
  84. @IBOutlet weak var findSearchView: KMSearchFindView!
  85. // 是否显示所有注释
  86. private var _isShowAllAnnotations = true
  87. // 是否显示所有注释
  88. var isShowAllAnnotations: Bool {
  89. get {
  90. return _isShowAllAnnotations
  91. }
  92. set {
  93. _isShowAllAnnotations = newValue
  94. self.childToolBarView?.isShowAllAnnotations = newValue
  95. self.findChildItem(KMToolbarShowToolbarItemIdentifier)?.isSelected = !newValue
  96. for itemId in self._fetchItemIdsForHideNotes() {
  97. self.findItem(itemId)?.unEnabled = !self.isShowAllAnnotations
  98. }
  99. }
  100. }
  101. private var _ignoreCurrentAnnotationTypeChange = false
  102. var ignoreCurrentAnnotationTypeChange: Bool {
  103. get {
  104. return self._ignoreCurrentAnnotationTypeChange
  105. }
  106. set {
  107. self._ignoreCurrentAnnotationTypeChange = newValue
  108. self.childToolBarView?.ignoreCurrentAnnotationTypeChange = self.ignoreCurrentAnnotationTypeChange
  109. // 忽略后重置 这个属性是基于单次添加,所以使用后会重置
  110. // self._ignoreCurrentAnnotationTypeChange = false
  111. }
  112. }
  113. var mainToolBarisVisable: Bool {
  114. get {
  115. return self.mainToolBarBox.isHidden == false
  116. }
  117. set {
  118. let needShow = newValue
  119. let currentIsShow = self.mainToolBarisVisable
  120. let toolBarH: Float = Self.mainToolBarHeight
  121. if needShow {
  122. if currentIsShow { // 当前已显示
  123. return
  124. }
  125. let height = self.view.frame.size.height
  126. self.mainToolBarBox.animator().isHidden = false
  127. self.mainToolBarHeight.animator().constant = toolBarH.cgFloat
  128. self.delegate?.toolbarController?(self, heightOffsetChange: Float(height)+toolBarH, animated: true)
  129. } else {
  130. if currentIsShow == false { // 当前已隐藏
  131. return
  132. }
  133. let height = self.view.frame.size.height
  134. self.mainToolBarBox.isHidden = true
  135. self.mainToolBarHeight.animator().constant = 0
  136. self.delegate?.toolbarController?(self, heightOffsetChange: Float(height)-toolBarH, animated: true)
  137. }
  138. }
  139. }
  140. override func viewDidLoad() {
  141. super.viewDidLoad()
  142. // Do view setup here.
  143. updateViewColor()
  144. mainToolBarView = KMToolbarViewController.init()
  145. mainToolBarView?.view.wantsLayer = true
  146. mainToolBarView?.view.layer?.backgroundColor = NSColor.km_init(hex: "#F7F8FA").cgColor
  147. mainToolBarBox.contentView = mainToolBarView?.view
  148. mainToolBarView?.delegate = self
  149. if let data = self.listView {
  150. mainToolBarView?.pdfView = data
  151. }
  152. childToolBarView = KMToolbarViewController.init()
  153. childToolBarView?.view.wantsLayer = true
  154. childToolBarView?.view.layer?.backgroundColor = NSColor.km_init(hex: "#F7F8FA").cgColor
  155. childToolBarBox.contentView = childToolBarView?.view
  156. childToolBarView?.view.frame = childToolBarBox.frame
  157. childToolBarView?.delegate = self
  158. childToolBarView?.view.autoresizingMask = [.width, .height]
  159. if let data = self.listView {
  160. childToolBarView?.pdfView = data
  161. }
  162. toolbarType = .None
  163. mainToolBarView?.toolbarType = .Main
  164. mainToolBarView?.reloadateToolbar()
  165. mainToolBarView?.toolbar?.allowsUserCustomization = true
  166. self.findSearchView.isHidden = true
  167. NotificationCenter.default.addObserver(self, selector: #selector(selectedShapAnnotationChangeNotification(_:)), name: NSNotification.Name.init(rawValue: "KMSelectedShapAnnotationChangeNotification"), object: nil)
  168. NotificationCenter.default.addObserver(self, selector: #selector(PDFChangedNotification(_:)), name: NSNotification.Name.init(rawValue: "PDFChangedNotification"), object: nil)
  169. NotificationCenter.default.addObserver(self, selector: #selector(PDFTextEditPDFChangedNotification(_:)), name: NSNotification.Name.init(rawValue: "KMPDFTextEditPDFChangedNotification"), object: nil)
  170. }
  171. // MARK:
  172. func updateViewColor() -> Void {
  173. }
  174. // MARK: Setter&Getter
  175. var toolbarType: KMToolbarViewType {
  176. set {
  177. if newValue == _toolbarType {
  178. if newValue == .Move || newValue == .Magnify || newValue == .Select || newValue == .SelectZoom {
  179. _toolbarType = .Annatiton
  180. } else {
  181. _toolbarType = .None
  182. }
  183. } else {
  184. _toolbarType = newValue
  185. }
  186. mainViewController?.cancelMeasureType()
  187. mainToolBarView?.toolbar?.isHidden = false
  188. secondaryToolBarBox.isHidden = true
  189. secondaryToolBarHeight.constant = 51
  190. let mainToolbarH = self.mainToolBarisVisable ? Self.mainToolBarHeight : 0
  191. if self.mainViewController!.isReadMode {
  192. if (_toolbarType == .Annatiton) {
  193. let childToolbarH = Self.childToolBarHeightValue
  194. bottomOffset.constant = childToolbarH.cgFloat
  195. mainToolBarHeight.constant = 0
  196. childToolBarBox.isHidden = false
  197. self.delegate?.toolbarController?(self, heightOffsetChange: 41, animated: false)
  198. } else {
  199. mainToolBarHeight.constant = 0
  200. bottomOffset.constant = 0
  201. childToolBarBox.isHidden = true
  202. mainToolBarView?.toolbar?.isHidden = true
  203. self.delegate?.toolbarController?(self, heightOffsetChange: 0, animated: false)
  204. }
  205. } else {
  206. if _toolbarType == .None {
  207. bottomOffset.constant = 0
  208. childToolBarBox.isHidden = true
  209. self.delegate?.toolbarController?(self, heightOffsetChange: mainToolbarH, animated: false)
  210. } else if _toolbarType == .Page || _toolbarType == .LeftPanel || _toolbarType == .redact {
  211. bottomOffset.constant = 0
  212. childToolBarBox.isHidden = true
  213. self.delegate?.toolbarController?(self, heightOffsetChange: mainToolbarH, animated: false)
  214. } else {
  215. let childToolbarH = Self.childToolBarHeightValue
  216. bottomOffset.constant = childToolbarH.cgFloat
  217. childToolBarBox.isHidden = false
  218. self.delegate?.toolbarController?(self, heightOffsetChange: mainToolbarH + childToolbarH, animated: false)
  219. }
  220. }
  221. childToolBarView?.toolbarType = _toolbarType
  222. if self.toolbarType == .Annatiton {
  223. childToolBarView?.toolbar?.contentInset = .init(top: 0, left: 0, bottom: 0, right: 44)
  224. childToolBarView?.rightItemView.isHidden = false
  225. } else {
  226. childToolBarView?.toolbar?.contentInset = NSEdgeInsetsZero
  227. childToolBarView?.rightItemView.isHidden = true
  228. }
  229. childToolBarView?.reloadateToolbar()
  230. }
  231. get {
  232. return _toolbarType
  233. }
  234. }
  235. // MARK: -
  236. // MARK: Public Methods
  237. // 取消选中 [只是取消选中状态,不会执行具体的方法]
  238. public func cancelSelected(_ identifier: String) {
  239. if (isMainToolItem(identifier)) {
  240. self.findMainItem(identifier)?.isSelected = false
  241. return
  242. }
  243. self.findChildItem(identifier)?.isSelected = false
  244. }
  245. public func clickItem(_ identifier: String) {
  246. self.selectItem(identifier)
  247. }
  248. public func selectItem(_ identifier: String) {
  249. if self.isShowAllAnnotations == false {
  250. let itemIds = self._fetchItemIdsForHideNotes()
  251. if itemIds.contains(identifier) {
  252. NSSound.beep()
  253. return
  254. }
  255. }
  256. if (isMainToolItem(identifier)) {
  257. self.selectMainItem(identifier)
  258. return
  259. }
  260. if let parentItem = self.findItem(parentIdentifier(identifier)), parentItem.isSelected {
  261. if (self.trySelectChildItem(identifier)) { // 尝试去选子工具栏
  262. return
  263. }
  264. }
  265. // 当前主工具栏未开启
  266. let mainToolIdentifier = parentIdentifier(identifier)
  267. if (mainToolIdentifier.isEmpty) {
  268. return
  269. }
  270. // 找到主工具栏
  271. self.selectMainItem(mainToolIdentifier)
  272. DispatchQueue.main.async {
  273. // 再去选择子工具栏
  274. self.selectChildItem(identifier)
  275. }
  276. }
  277. public func findItem(_ identifier: String) -> KMToolbarItemView? {
  278. if (isMainToolItem(identifier)) {
  279. return self.findMainItem(identifier)
  280. }
  281. return self.findChildItem(identifier)
  282. }
  283. // MARK: -
  284. // MARK: private Methods
  285. private func selectMainItem(_ identifier: String) {
  286. if (self.mainToolBarView?.toolbarItems == nil) {
  287. return
  288. }
  289. var item: KMToolbarItemView?
  290. for (key, value) in self.mainToolBarView?.toolbarItems ?? [:] {
  291. if (key == identifier) {
  292. item = (value as? KMToolbarItemView)
  293. break
  294. }
  295. }
  296. // 主工具栏 item
  297. if let data = item {
  298. if (identifier == KMDocumentAnnotationToolbarItemIdentifier ||
  299. identifier == KMDocumentPageToolbarItemIdentifier ||
  300. identifier == KMDocumentConversonToolbarItemIdentifier ||
  301. identifier == KMDocumentEditToolbarItemIdentifier ||
  302. identifier == KMDocumentFormToolbarItemIdentifier ||
  303. identifier == KMDocumentFillSginToolbarItemIdentifier ||
  304. identifier == KMDocumentToolToolbarItemIdentifier) {
  305. self.mainToolBarView?.leftControllButtonAction(item: data.clickButton)
  306. } else if (identifier == KMRightControlToolbarItemIdentifier) {
  307. self.mainToolBarView?.itemAction(data)
  308. } else if (identifier == KMLeftControlToolbarItemIdentifier) {
  309. self.mainToolBarView?.itemAction(data)
  310. } else if identifier == KMDocumentRedactToolbarItemIdentifier {
  311. self.mainToolBarView?.itemAction(data)
  312. } else if identifier == KMDocumentScanOCRToolbarItemIdentifier {
  313. self.mainToolBarView?.itemAction(data)
  314. } else if identifier == KMDocumentAIToolsToolbarItemIdentifier {
  315. self.mainToolBarView?.itemAction(data)
  316. }
  317. return
  318. }
  319. }
  320. private func trySelectChildItem(_ identifier: String) -> Bool {
  321. // 子工具栏 item [当前主工具栏已开启]
  322. var item: KMToolbarItemView?
  323. if let items = self.childToolBarView?.toolbarItems, items.count > 0 {
  324. for (key, value) in items {
  325. if (key == identifier) {
  326. item = (value as? KMToolbarItemView)
  327. break
  328. }
  329. }
  330. // 子工具栏[找到]
  331. if (item != nil) {
  332. self.selectChildItem(identifier)
  333. return true
  334. }
  335. }
  336. return false
  337. }
  338. private func selectChildItem(_ identifier: String) {
  339. // 子工具栏 item [当前主工具栏已开启]
  340. var item: KMToolbarItemView?
  341. if let items = self.childToolBarView?.toolbarItems, items.count > 0 {
  342. for (key, value) in items {
  343. if (key == identifier) {
  344. item = (value as? KMToolbarItemView)
  345. break
  346. }
  347. }
  348. // 子工具栏[找到]
  349. if let data = item {
  350. if (identifier == KMToolbarMoveToolModeItemIdentifier ||
  351. identifier == KMToolbarMagnifyToolModeItemIdentifier ||
  352. identifier == KMToolbarSelectToolModeItemIdentifier ||
  353. identifier == KMToolbarZoomToSelectionItemIdentifier) {
  354. self.childToolBarView?.leftControllButtonAction(item: data.clickButton)
  355. } else if identifier == KMToolbarViewSettingIdentifier ||
  356. identifier == KMAnnotationImageToolbarItemIdentifier ||
  357. identifier == KMAnnotationTableToolbarItemIdentifier {
  358. self.childToolBarView?.itemAction(data)
  359. } else {
  360. self.childToolBarView?.changeAnnotationMode(item: data.clickButton)
  361. }
  362. }
  363. }
  364. }
  365. private func findMainItem(_ identifier: String) -> KMToolbarItemView? {
  366. if (self.mainToolBarView?.toolbarItems == nil) {
  367. return nil
  368. }
  369. var item: KMToolbarItemView?
  370. if (isMainToolItem(identifier)) {
  371. for (key, value) in self.mainToolBarView?.toolbarItems ?? [:] {
  372. if (key == identifier) {
  373. item = (value as? KMToolbarItemView)
  374. break
  375. }
  376. }
  377. return item
  378. }
  379. return nil
  380. }
  381. private func findChildItem(_ identifier: String) -> KMToolbarItemView? {
  382. if (self.childToolBarView?.toolbarItems == nil || self.childToolBarView!.toolbarItems.count == 0) {
  383. return nil
  384. }
  385. var item: KMToolbarItemView?
  386. for (key, value) in self.childToolBarView?.toolbarItems ?? [:] {
  387. if (key == identifier) {
  388. item = (value as? KMToolbarItemView)
  389. break
  390. }
  391. }
  392. return item
  393. }
  394. private func _fetchItemIdsForHideNotes() -> [String] {
  395. let itemIds = [KMDocumentEditToolbarItemIdentifier, KMDocumentFormToolbarItemIdentifier, KMDocumentFillSginToolbarItemIdentifier, KMDocumentRedactToolbarItemIdentifier, KMDocumentSignToolbarItemIdentifier]
  396. var annoIds = annotationToolIdentifiers
  397. if annoIds.contains(KMToolbarShowToolbarItemIdentifier) {
  398. annoIds.removeObject(KMToolbarShowToolbarItemIdentifier)
  399. }
  400. return annoIds + itemIds + editPDFItemIdentifiers + formToolIdentifiers + fillSignToolIdentifiers
  401. }
  402. func exitPageEdit() -> Void {
  403. if let data = self.mainToolBarView {
  404. resetToolbarViewController(data)
  405. exitPageEditToolbarViewController(data)
  406. }
  407. }
  408. func exitTextEdit() -> Void {
  409. secondaryToolBarBox.isHidden = true
  410. secondaryToolBarHeight.constant = 50
  411. bottomOffset.constant = 51
  412. childToolBarBox.isHidden = false
  413. self.delegate?.toolbarController?(self, heightOffsetChange: 102, animated: false)
  414. }
  415. func enterWatermarkAdjective(_ type: KMToolbarType, _ itemTitles: Array<Array<String>>) {
  416. self.toolbarType = .None
  417. let topBarView = KMWatermarkAdjectiveTopBarView()
  418. topBarView.frame = (self.mainToolBarView?.toolbar?.bounds) ?? .zero
  419. self.mainToolBarView?.toolbar?.addSubview(topBarView)
  420. topBarView.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
  421. topBarView.wantsLayer = true
  422. topBarView.layer?.backgroundColor = NSColor.white.cgColor
  423. topBarView.isCanApply(can: false)
  424. var itemModels: Array<Array<KMWatermarkAdjectiveTopBarItemModel>> = []
  425. for items in itemTitles {
  426. var array: Array<KMWatermarkAdjectiveTopBarItemModel> = []
  427. for title in items {
  428. let model = KMWatermarkAdjectiveTopBarItemModel()
  429. model.iconName = ""
  430. model.itemTitle = title
  431. array.append(model)
  432. }
  433. itemModels.append(array)
  434. }
  435. topBarView.initItemData(itemArrays: itemModels)
  436. topBarView.cancelClick = { [weak self] in
  437. self?.delegate?.clickChildTool?(type: type, index: 1)
  438. }
  439. topBarView.applyClick = { [weak self] in
  440. self?.delegate?.clickChildTool?(type: type, index: 2)
  441. }
  442. topBarView.itemClick = { [weak self] section,item in
  443. self?.delegate?.clickChildTool?(type: type, index: 3+item)
  444. }
  445. }
  446. func exitWatermarkAdjective() {
  447. let topBarView = self.mainToolBarView?.toolbar?.subviews.last
  448. if (topBarView == nil || topBarView?.isKind(of: KMWatermarkAdjectiveTopBarView.self) == false) {
  449. return
  450. }
  451. topBarView?.removeFromSuperview()
  452. }
  453. func fetchTopBarView() -> NSView? {
  454. let topBarView = self.mainToolBarView?.toolbar?.subviews.last
  455. if (topBarView == nil) {
  456. return nil
  457. }
  458. if (topBarView?.isKind(of: KMWatermarkAdjectiveTopBarView.self) == true) {
  459. return topBarView
  460. }
  461. if (topBarView?.isKind(of: KMRedactTopToolBar.self) == true) {
  462. return topBarView
  463. }
  464. return nil
  465. }
  466. func enterRedact() {
  467. self.toolbarType = .None
  468. let topBarView = KMRedactTopToolBar()
  469. topBarView.frame = (self.mainToolBarView?.toolbar?.bounds) ?? .zero
  470. self.mainToolBarView?.toolbar?.addSubview(topBarView)
  471. topBarView.autoresizingMask = [.width, .height]
  472. topBarView.wantsLayer = true
  473. topBarView.layer?.backgroundColor = NSColor.white.cgColor
  474. topBarView.selectItem(0)
  475. self.delegate?.clickChildTool?(type: .redact, index: 4)
  476. topBarView.itemClick = { [weak self] index in
  477. self?.delegate?.clickChildTool?(type: .redact, index: index)
  478. }
  479. }
  480. func exitRedact() {
  481. let topBarView = self.mainToolBarView?.toolbar?.subviews.last
  482. if (topBarView == nil || topBarView?.isKind(of: KMRedactTopToolBar.self) == false) {
  483. return
  484. }
  485. topBarView?.removeFromSuperview()
  486. }
  487. // MARK: NSNotification
  488. @objc func selectedShapAnnotationChangeNotification(_ notification: Notification) -> Void {
  489. }
  490. @objc func PDFChangedNotification(_ notification: Notification) -> Void {
  491. }
  492. @objc func PDFTextEditPDFChangedNotification(_ notification: Notification) -> Void {
  493. }
  494. // MARK:
  495. func resetToolbarViewController(_ toolbarViewController: KMToolbarViewController) -> Void {
  496. self.toolbarType = .None
  497. self.mainToolBarView?.resetToolbar()
  498. self.mainViewController?.listView.annotationType = .unkown
  499. }
  500. func exitPageEditToolbarViewController(_ toolbarViewController: KMToolbarViewController) -> Void {
  501. }
  502. // MARK: item actions
  503. @objc func cropItemAction(sender: NSMenuItem) {
  504. if (sender.tag == 0) { /// 裁剪当前页面
  505. self.delegate?.clickChildTool?(type: .crop, index: 1)
  506. return
  507. }
  508. if (sender.tag == 1) { /// 裁剪所有页面
  509. self.delegate?.clickChildTool?(type: .crop, index: 2)
  510. return
  511. }
  512. /// 自定义裁剪区域
  513. self.delegate?.clickChildTool?(type: .crop, index: 3)
  514. }
  515. @objc func secureItemAction(sender: NSMenuItem) {
  516. var index: Int = 1
  517. if (sender.tag == 1) { /// 删除安全性设置
  518. index = 2
  519. }
  520. self.delegate?.clickChildTool?(type: .secure, index: index)
  521. }
  522. override func interfaceThemeDidChanged(_ appearance: NSAppearance.Name) {
  523. super.interfaceThemeDidChanged(appearance)
  524. self.mainToolBarView?.interfaceThemeDidChanged(appearance)
  525. self.childToolBarView?.interfaceThemeDidChanged(appearance)
  526. for item in self.childToolBarView?.toolbar?.items ?? [] {
  527. if item.itemIdentifier == KMToolbarHighlightAnnotationItemIdentifier {
  528. let color = KMPreference.shared.markupHighlightColor
  529. let imageV = KMNoteTypeImageView()
  530. item.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
  531. } else if item.itemIdentifier == KMToolbarUnderlineAnnotationItemIdentifier {
  532. let color = KMPreference.shared.markupUnderlineColor
  533. let imageV = KMNoteTypeImageView()
  534. item.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
  535. } else if item.itemIdentifier == KMToolbarStrikeOutAnnotationItemIdentifier {
  536. let color = KMPreference.shared.markupStrikthroughColor
  537. let imageV = KMNoteTypeImageView()
  538. item.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
  539. } else if item.itemIdentifier == KMToolbarSquigglyAnnotationItemIdentifier {
  540. let color = UserDefaults.standard.PDFListViewColor(forKey: CSquigglyNoteColorKey) ?? kAnnotationSquigglyDefaultColor
  541. let imageV = KMNoteTypeImageView()
  542. item.image = imageV.noteTypeImage(withType: CPDFAnnotation.kType.squiggly, color: color)
  543. } else if item.itemIdentifier == KMToolbarInkAnnotationItemIdentifier {
  544. let color = KMPreference.shared.markupPenColor
  545. let imageV = KMNoteTypeImageView()
  546. item.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
  547. }
  548. }
  549. }
  550. }
  551. //MARK: Find Search
  552. extension KMToolbarController {
  553. func showFindBar() {
  554. self.findSearchView.isHidden = false
  555. let height: Float = self.fetchHeight(type: _toolbarType)
  556. self.delegate?.toolbarController?(self, heightOffsetChange: height, animated: false)
  557. self.findSearchView.findField.becomeFirstResponder()
  558. self.findSearchView.doneAction = { [weak self] view in
  559. self?.exitFindBar()
  560. }
  561. self.findSearchView.searchAction = { [weak self] view, searchString, forward in
  562. if let data = self?.mainToolBarView {
  563. self?.toolbarViewController(data, findSearchAction: searchString, forward: forward)
  564. }
  565. return true
  566. }
  567. self.findSearchView.showAllAction = { [weak self] view, searchString, forward in
  568. if let data = self?.mainToolBarView {
  569. self?.toolbarViewController(data, findSearchAllAction: searchString, forward: forward)
  570. }
  571. }
  572. }
  573. func showFindString(forward: Bool) {
  574. if let data = self.mainToolBarView {
  575. self.toolbarViewController(data, findSearchAction: self.findSearchView.findString ?? "", forward: forward)
  576. }
  577. }
  578. func showAllAction() {
  579. if let data = self.mainToolBarView {
  580. self.toolbarViewController(data, findSearchAllAction: self.findSearchView.findString ?? "", forward: true)
  581. }
  582. }
  583. func exitFindBar() {
  584. self.findSearchView.isHidden = true
  585. let height: Float = self.fetchHeight(type: _toolbarType, isShow: false)
  586. self.delegate?.toolbarController?(self, heightOffsetChange: height, animated: false)
  587. }
  588. func fetchHeight(type: KMToolbarViewType, isShow: Bool = true) -> Float {
  589. var height: Float = 0.0
  590. let mainToolbarH = self.mainToolBarisVisable ? Self.mainToolBarHeight : 0
  591. let childToolbarH = Self.childToolBarHeightValue
  592. let findBarH = Self.findBarHeight
  593. if isShow {
  594. if _toolbarType == .None {
  595. bottomOffset.constant = findBarH.cgFloat
  596. height = mainToolbarH
  597. } else if _toolbarType == .Page || _toolbarType == .LeftPanel || _toolbarType == .redact {
  598. bottomOffset.constant = findBarH.cgFloat
  599. height = mainToolbarH
  600. } else {
  601. bottomOffset.constant = childToolbarH.cgFloat + findBarH.cgFloat
  602. height = mainToolbarH + childToolbarH
  603. }
  604. height = height + findBarH
  605. } else {
  606. if _toolbarType == .None {
  607. bottomOffset.constant = 0
  608. height = mainToolbarH
  609. } else if _toolbarType == .Page || _toolbarType == .LeftPanel || _toolbarType == .redact {
  610. bottomOffset.constant = 0
  611. height = mainToolbarH
  612. } else {
  613. bottomOffset.constant = childToolbarH.cgFloat
  614. height = mainToolbarH + childToolbarH
  615. }
  616. }
  617. return height
  618. }
  619. }
  620. extension KMToolbarController: KMToolbarViewControllerDelegate {
  621. func changeAnnotationModeAction(item: KMToolbarClickButton) {
  622. let type = CAnnotationType(rawValue: item.tag) ?? CAnnotationType.unkown
  623. if (type.isAdvanced() == false) {
  624. if self.toolbarType == .Magnify || self.toolbarType == .Move || self.toolbarType == .Select || self.toolbarType == .SelectZoom {
  625. self.toolbarType = .Annatiton
  626. }
  627. self.delegate?.changeAnnotationModeAction?(item: item)
  628. return
  629. }
  630. // 高级功能
  631. Task { @MainActor in
  632. //文字编辑 图片编辑 选中按钮逻辑(只能同时选中其中一个)
  633. if type == .addText || type == .addImage {
  634. let boxItem = item.clickObject as? KMToolbarItemView
  635. if let data = boxItem {
  636. if self.lastChildItemBox != data {
  637. self.lastChildItemBox.isSelected = false
  638. data.isSelected = true
  639. } else {
  640. data.isSelected = !data.isSelected
  641. }
  642. self.lastChildItemBox = data
  643. }
  644. }
  645. if self.toolbarType == .Magnify || self.toolbarType == .Move || self.toolbarType == .Select || self.toolbarType == .SelectZoom {
  646. self.toolbarType = .Annatiton
  647. }
  648. self.trackEvent(type: type)
  649. self.delegate?.changeAnnotationModeAction?(item: item)
  650. }
  651. }
  652. func trackEvent(type: CAnnotationType) {
  653. var eventStr = "Btn_SubTbr_Fill&Sign_Check"
  654. switch type {
  655. case .signTure:
  656. eventStr = "Btn_SubTbr_Fill&Sign_Check"
  657. case .signFalse:
  658. eventStr = "Btn_SubTbr_Fill&Sign_X"
  659. case .signDate:
  660. eventStr = "Btn_SubTbr_Fill&Sign_Date"
  661. case .signDot:
  662. eventStr = "Btn_SubTbr_Fill&Sign_Dot"
  663. case .signCircle:
  664. eventStr = "Btn_SubTbr_Fill&Sign_Circle"
  665. case .signLine:
  666. eventStr = "Btn_SubTbr_Fill&Sign_Line"
  667. default:
  668. eventStr = ""
  669. break
  670. }
  671. if eventStr.count > 1{
  672. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Fill&Sign", withProperties: ["SubTbr_Btn": eventStr])
  673. }
  674. }
  675. func toolbarViewController(_ viewController: KMToolbarViewController, clickMode toolMode: KMToolbarViewType, toolbar toolbarItem: KMToolbarItemView, _ pages: [Int]) {
  676. let beforeModel = KMToolbarViewType(rawValue: self.lastItemBox.clickButton.tag) ?? .None
  677. if toolMode != .redact { // 标记秘文
  678. let mainC = self.delegate as? KMMainViewController
  679. var control: KMPDFRedactViewController?
  680. for childC in mainC?.children ?? [] {
  681. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  682. control = (childC as! KMPDFRedactViewController)
  683. break
  684. }
  685. }
  686. if let annos = control?.redactPdfView.newAddAnnotation, annos.count > 0 {
  687. let alert = NSAlert()
  688. alert.informativeText = KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction.", nil)
  689. alert.addButton(withTitle: KMLocalizedString("Exit", nil))
  690. alert.addButton(withTitle: KMLocalizedString("Cancel", nil))
  691. let resp = alert.runModal()
  692. if resp != .alertFirstButtonReturn { // 取消
  693. return
  694. }
  695. control?.redactPdfView.newAddAnnotation.removeAll()
  696. }
  697. }
  698. if self.lastItemBox != nil {
  699. if (toolbarItem.isSelected && toolMode.isToolMode()) {
  700. // no nothings
  701. } else {
  702. self.lastItemBox.isSelected = false
  703. }
  704. }
  705. if self.lastChildItemBox != nil {
  706. if toolMode == .editPDF {
  707. if !self.lastItemBox.isSelected {
  708. self.lastChildItemBox.isSelected = false
  709. }
  710. }
  711. }
  712. if toolMode != .Magnify && toolMode != .Move && toolMode != .Select && toolMode != .SelectZoom && toolMode != .LeftPanel && toolMode != .RightPanel {
  713. if(toolMode == self.toolbarType) {
  714. toolbarItem.isSelected = false
  715. } else {
  716. toolbarItem.isSelected = true
  717. self.lastItemBox = toolbarItem
  718. self.trackEvent(toolType: toolMode)
  719. }
  720. } else {
  721. if(toolMode != self.toolbarType && toolMode != .LeftPanel) {
  722. let item : KMToolbarItemView = (self.mainToolBarView?.toolbarItemFindItemIdentifiers(value: KMDocumentAnnotationToolbarItemIdentifier))!
  723. item.isSelected = true
  724. self.lastItemBox = item
  725. if toolMode == .Select {
  726. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Tools", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_Tools_ContentSelection"])
  727. }
  728. if toolMode == .SelectZoom {
  729. FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_Tools", withProperties: ["SubTbr_Btn" : "Btn_SubTbr_Tools_Zoom"])
  730. }
  731. } else if (toolMode == .LeftPanel) {
  732. if(toolMode == self.toolbarType) {
  733. toolbarItem.isSelected = false
  734. } else {
  735. toolbarItem.isSelected = true
  736. }
  737. }
  738. }
  739. self.toolbarType = toolMode
  740. self.delegate?.mainToolDidClicked?(self, beforeModel, toolMode, toolbarItem, pages)
  741. }
  742. func trackEvent(toolType type: KMToolbarViewType) -> Void {
  743. if (type == .Annatiton) {
  744. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Tools"])
  745. } else if (type == .editPDF) {
  746. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_EditPDF"])
  747. } else if (type == .Page) {
  748. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_PageEdit"])
  749. } else if (type == .Conversion) {
  750. } else if (type == .Tool) {
  751. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Editor"])
  752. } else if (type == .Conversion) {
  753. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Converter"])
  754. } else if (type == .Form) {
  755. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Form"])
  756. } else if (type == .FillSign) {
  757. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Fill & Sign"])
  758. } else if (type == .redact) {
  759. FMTrackEventManager.defaultManager.trackEvent(event: "Tbr", withProperties: ["Tbr_Btn" : "Btn_Tbr_Redact"])
  760. }
  761. }
  762. func showPDFLayoutModeAction(show: Bool) {
  763. self.delegate?.showPDFLayoutModeAction?(show: show)
  764. }
  765. func toolbarViewController(_ viewController: KMToolbarViewController, clickChaildToolType: KMToolbarType, toolbar toolbarItem: KMToolbarItemView) {
  766. if (clickChaildToolType == .crop) {
  767. let titles = [NSLocalizedString("Crop Current Page - White Margins", comment: ""), NSLocalizedString("Crop All Pages - Auto", comment: "")]
  768. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(titles)
  769. let createFilePopover: NSPopover = NSPopover.init()
  770. createFilePopover.contentViewController = vc
  771. createFilePopover.animates = true
  772. createFilePopover.behavior = .transient
  773. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  774. createFilePopover.show(relativeTo: NSZeroRect, of: toolbarItem, preferredEdge: .maxY)
  775. self.popover = createFilePopover
  776. vc.downCallback = { [weak self] (downEntered: Bool, count: String) -> Void in
  777. self?.popover?.close()
  778. self?.popover = nil
  779. if downEntered {
  780. if (count == titles.first) {
  781. self?.delegate?.clickChildTool?(type: .crop, index: 1)
  782. } else {
  783. self?.delegate?.clickChildTool?(type: .crop, index: 2)
  784. }
  785. }
  786. }
  787. } else if (clickChaildToolType == .bates || clickChaildToolType == .headerAndFooter || clickChaildToolType == .background || clickChaildToolType == .watermark) {
  788. toolbarItem.isSelected = false
  789. self.delegate?.clickChildTool?(type: clickChaildToolType, index: 0)
  790. } else if (clickChaildToolType == .redact) {
  791. toolbarItem.isSelected = false
  792. self.enterRedact()
  793. } else if (clickChaildToolType == .compress) {
  794. self.delegate?.clickChildTool?(type: .compress, index: 0)
  795. } else if (clickChaildToolType == .secure) {
  796. // toolbarItem.isSelected = fals
  797. let titles = [NSLocalizedString("Set Passwords", comment: ""), NSLocalizedString("Remove Security", comment: "")]
  798. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(titles)
  799. let createFilePopover: NSPopover = NSPopover.init()
  800. createFilePopover.contentViewController = vc
  801. createFilePopover.animates = true
  802. createFilePopover.behavior = .transient
  803. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  804. createFilePopover.show(relativeTo: CGRect(x: toolbarItem.bounds.origin.x, y: 10, width: toolbarItem.bounds.size.width, height: toolbarItem.bounds.size.height), of: toolbarItem, preferredEdge: .minY)
  805. vc.downCallback = { [weak self] (downEntered: Bool, count: String) -> Void in
  806. if downEntered {
  807. if (count == titles.first) {
  808. self?.delegate?.clickChildTool?(type: .secure, index: 1)
  809. } else {
  810. self?.delegate?.clickChildTool?(type: .secure, index: 2)
  811. }
  812. }
  813. }
  814. } else if ((KMToolbarType.word.rawValue ... KMToolbarType.conversion_imageToPDF.rawValue).contains(clickChaildToolType.rawValue)) { /// 转档
  815. self.delegate?.clickChildTool?(type: clickChaildToolType, index: 0)
  816. } else if (clickChaildToolType == .merge) {
  817. self.delegate?.clickChildTool?(type: clickChaildToolType, index: 0)
  818. }
  819. }
  820. func toolbarViewController(_ viewController: KMToolbarViewController, zoomModel selectedTag: Int) {
  821. self.delegate?.toolbarViewController?(viewController, zoomModel: selectedTag)
  822. }
  823. func toolbarViewController(_ viewController:KMToolbarViewController, zoomSting : String) {
  824. self.delegate?.toolbarViewController?(viewController, zoomSting: zoomSting)
  825. }
  826. func changePDFViewZoomInAction() {
  827. self.delegate?.changePDFViewZoomInAction?()
  828. }
  829. func changePDFViewZoomOutAction() {
  830. self.delegate?.changePDFViewZoomOutAction?()
  831. }
  832. func changePDFViewGotoNextPageAction() {
  833. self.delegate?.changePDFViewGotoNextPageAction?()
  834. }
  835. func changePDFViewGoToPreviousPageAction() {
  836. self.delegate?.changePDFViewGoToPreviousPageAction?()
  837. }
  838. func changePDFViewGotoBackAction() {
  839. self.delegate?.changePDFViewGotoBackAction?()
  840. }
  841. func changePDFViewGoToForwardAction() {
  842. self.delegate?.changePDFViewGoToForwardAction?()
  843. }
  844. func aiTranslationPDFFileAction() {
  845. self.delegate?.aiTranslationPDFFileAction?()
  846. }
  847. func toolbarViewController(_ viewController: KMToolbarViewController, shareAction toolbarItem: KMToolbarItemView) {
  848. self.delegate?.toolbarViewController?(viewController, shareAction: toolbarItem)
  849. }
  850. func toolbarViewController(_ viewController: KMToolbarViewController, shareDocument item: NSMenuItem) {
  851. self.delegate?.toolbarViewController?(viewController, shareDocument: item)
  852. }
  853. func toolbarViewController(_ viewController: KMToolbarViewController, shareFlatten item: NSMenuItem) {
  854. self.delegate?.toolbarViewController?(viewController, shareFlatten: item)
  855. }
  856. func toolbarViewController(_ viewController: KMToolbarViewController, shareOriginalPDF item: NSMenuItem) {
  857. self.delegate?.toolbarViewController?(viewController, shareOriginalPDF: item)
  858. }
  859. func toolbarViewController(_ viewController: KMToolbarViewController, scanOCRModel selectedTag: Int) {
  860. self.delegate?.toolbarViewController?(viewController, scanOCRModel: selectedTag)
  861. }
  862. func toolbarViewController(_ viewController: KMToolbarViewController, itemDidClick toolbarItem: KMToolbarItemView) {
  863. let itemIdentifier = toolbarItem.itemIdentifier
  864. if itemIdentifier != KMRightControlToolbarItemIdentifier {
  865. if self.lastItemBox != nil {
  866. if (toolbarItem.isSelected) {
  867. // no nothings
  868. } else {
  869. let p_itemIdentifier = parentIdentifier(itemIdentifier ?? "")
  870. if p_itemIdentifier != self.lastItemBox.itemIdentifier {
  871. self.lastItemBox.isSelected = false
  872. }
  873. }
  874. }
  875. }
  876. if toolbarItem.itemIdentifier != KMDocumentRedactToolbarItemIdentifier { // 标记秘文
  877. let mainC = self.delegate as? KMMainViewController
  878. var control: KMPDFRedactViewController?
  879. for childC in mainC?.children ?? [] {
  880. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  881. control = (childC as! KMPDFRedactViewController)
  882. break
  883. }
  884. }
  885. if let annos = control?.redactPdfView.newAddAnnotation, annos.count > 0 {
  886. let alert = NSAlert()
  887. alert.informativeText = KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction.", nil)
  888. alert.addButton(withTitle: KMLocalizedString("Exit", nil))
  889. alert.addButton(withTitle: KMLocalizedString("Cancel", nil))
  890. let resp = alert.runModal()
  891. if resp != .alertFirstButtonReturn { // 取消
  892. return
  893. }
  894. control?.redactPdfView.newAddAnnotation.removeAll()
  895. }
  896. }
  897. self.delegate?.toolbarViewController?(viewController, itemDidClick: toolbarItem)
  898. }
  899. func toolbarViewController(_ viewController: KMToolbarViewController, searchAction searchString: String, forward: Bool) {
  900. self.delegate?.toolbarViewController?(viewController, searchAction: searchString, forward: forward)
  901. }
  902. func toolbarViewController(_ viewController: KMToolbarViewController, findSearchAction searchString: String, forward: Bool) {
  903. self.delegate?.toolbarViewController?(viewController, findSearchAction: searchString, forward: forward)
  904. }
  905. func toolbarViewController(_ viewController: KMToolbarViewController, findSearchAllAction searchString: String, forward: Bool) {
  906. self.delegate?.toolbarViewController?(viewController, findSearchAllAction: searchString, forward: forward)
  907. }
  908. func toolbarViewController(_ viewController: KMToolbarViewController, menuItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?) {
  909. let itemIdentifier = toolbarItem.itemIdentifier
  910. if itemIdentifier != KMRightControlToolbarItemIdentifier {
  911. if self.lastItemBox != nil {
  912. if (toolbarItem.isSelected) {
  913. // no nothings
  914. } else {
  915. let p_itemIdentifier = parentIdentifier(itemIdentifier ?? "")
  916. if p_itemIdentifier != self.lastItemBox.itemIdentifier {
  917. self.lastItemBox.isSelected = false
  918. }
  919. }
  920. }
  921. }
  922. if toolbarItem.itemIdentifier != KMDocumentRedactToolbarItemIdentifier { // 标记秘文
  923. let mainC = self.delegate as? KMMainViewController
  924. var control: KMPDFRedactViewController?
  925. for childC in mainC?.children ?? [] {
  926. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  927. control = (childC as! KMPDFRedactViewController)
  928. break
  929. }
  930. }
  931. if let annos = control?.redactPdfView.newAddAnnotation, annos.count > 0 {
  932. let alert = NSAlert()
  933. alert.informativeText = KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction.", nil)
  934. alert.addButton(withTitle: KMLocalizedString("Exit", nil))
  935. alert.addButton(withTitle: KMLocalizedString("Cancel", nil))
  936. let resp = alert.runModal()
  937. if resp != .alertFirstButtonReturn { // 取消
  938. return
  939. }
  940. control?.redactPdfView.newAddAnnotation.removeAll()
  941. }
  942. }
  943. self.delegate?.toolbarViewController?(viewController, menuItemDidClick: toolbarItem, index: index, info: info)
  944. }
  945. func toolbarViewController(_ viewController: KMToolbarViewController, viewItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?) {
  946. self.delegate?.toolbarViewController?(viewController, viewItemDidClick: toolbarItem, index: index, info: info)
  947. }
  948. }
  949. extension KMToolbarController {
  950. func updataItemVisible() {
  951. guard let isCompareModel = self.mainViewController?.isCompareModel else { return }
  952. if isCompareModel {
  953. self.toolbarType = .None
  954. self.mainToolBarView?.isEnable(isEnable: false)
  955. } else {
  956. self.mainToolBarView?.isEnable()
  957. }
  958. }
  959. }