KMPDFToolbarController.swift 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. //
  2. // KMPDFToolbarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/8.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMPDFToolbarControllerDelegate: AnyObject {
  10. @objc optional func kmPDFToolbarControllerDidToolbarItemClicked(_ controller: KMPDFToolbarController, _ itemIdentifier: String)
  11. }
  12. class KMPDFToolbarController: NSViewController {
  13. @IBOutlet var contendBox: NSBox!
  14. @IBOutlet var mainToolbarContendView: NSView!
  15. @IBOutlet var leftToolsView: NSView!
  16. @IBOutlet var leftViewButton: ComponentButton!
  17. @IBOutlet var pageButton: ComponentButton!
  18. @IBOutlet var toolsView: ComponentDropdownTool!
  19. @IBOutlet var dividerView: ComponentDivider!
  20. @IBOutlet var selectZoom: ComponentSelectZoom!
  21. @IBOutlet var tabsContendView: NSView!
  22. @IBOutlet var tabsScrollView: NSScrollView!
  23. @IBOutlet var tabsMoreButton: ComponentButton!
  24. @IBOutlet var rightToolsView: NSView!
  25. @IBOutlet var secondContendView: NSView!
  26. @IBOutlet var tabsLeftConst: NSLayoutConstraint!
  27. @IBOutlet var tabsRightConst: NSLayoutConstraint!
  28. @IBOutlet var rightViewWidthConst: NSLayoutConstraint!
  29. var scrollDocumentView: NSView = NSView.init()
  30. var tabsView: ComponentTabs!
  31. //MARK: -自定义工具栏
  32. private var customRightGroupView: ComponentGroup!
  33. private var customRightItems: [ComponentMenuitemProperty] = []
  34. private var undoRedo_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Undo / Redo"), identifier: "undoRedo_Menuitem_PropertyKey")
  35. private var save_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Save"), identifier: "save_Menuitem_PropertyKey")
  36. private var aiTools_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("AI Tools"), identifier: "aiTools_Menuitem_PropertyKey")
  37. private var batch_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Batch"), identifier: "batch_Menuitem_PropertyKey")
  38. private var tts_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("TTS"), identifier: "tts_Menuitem_PropertyKey")
  39. private var ppt_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Slide Show"), identifier: "ppt_Menuitem_PropertyKey")
  40. private var print_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Print"), identifier: "print_Menuitem_PropertyKey")
  41. private var share_Menuitem_Property = ComponentMenuitemProperty(type: .normal, multipleSelect: true, itemSelected: false, text: KMLocalizedString("Share"), identifier: "share_Menuitem_PropertyKey")
  42. //MARK: -更多Tabs
  43. private var moreTabsItems: [ComponentMenuitemProperty] = []
  44. private var markup_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Markup"), identifier: "markup_Menuitem_PropertyKey")
  45. private var edit_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Edit"), identifier: "markup_Menuitem_PropertyKey")
  46. private var form_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Form"), identifier: "markup_Menuitem_PropertyKey")
  47. private var fill_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Fill"), identifier: "markup_Menuitem_PropertyKey")
  48. private var convert_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Convert"), identifier: "markup_Menuitem_PropertyKey")
  49. private var protect_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Protect"), identifier: "markup_Menuitem_PropertyKey")
  50. private var tools_Menuitem_Property = ComponentMenuitemProperty(type: .normal, itemSelected: false, text: KMLocalizedString("Tools"), identifier: "markup_Menuitem_PropertyKey")
  51. var pdfView: CPDFListView?
  52. var viewManager: KMPDFViewManager?
  53. var toolbarManager: KMPDFToolbarManager?
  54. //MARK: -View
  55. var secondToolBar: KMPDFSecToolbarController = KMPDFSecToolbarController.init()
  56. weak open var delegate: KMPDFToolbarControllerDelegate?
  57. override func viewWillLayout() {
  58. super.viewWillLayout()
  59. refreshTabsScrollViewUI()
  60. }
  61. override func viewDidLayout() {
  62. super.viewDidLayout()
  63. refreshTabsScrollViewUI()
  64. refreshTabsScrollViewVisiableRect()
  65. }
  66. override func viewDidAppear() {
  67. super.viewDidAppear()
  68. refreshTabsScrollViewUI()
  69. }
  70. override func viewDidLoad() {
  71. super.viewDidLoad()
  72. // Do view setup here.
  73. contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
  74. leftToolsView.wantsLayer = true
  75. leftToolsView.layer?.backgroundColor = contendBox.fillColor.cgColor
  76. rightToolsView.wantsLayer = true
  77. rightToolsView.layer?.backgroundColor = contendBox.fillColor.cgColor
  78. tabsContendView.wantsLayer = true
  79. tabsContendView.layer?.backgroundColor = contendBox.fillColor.cgColor
  80. tabsMoreButton.superview?.wantsLayer = true
  81. tabsMoreButton.superview?.layer?.backgroundColor = contendBox.fillColor.cgColor
  82. tabsView = ComponentTabs.init()
  83. scrollDocumentView.wantsLayer = true
  84. scrollDocumentView.layer?.backgroundColor = NSColor.clear.cgColor
  85. tabsScrollView.documentView = scrollDocumentView
  86. setUpData()
  87. }
  88. func setUpData() {
  89. setUpProperty()
  90. setUpRightViews()
  91. setupSecondToolbar()
  92. reloadData()
  93. }
  94. func setUpProperty() {
  95. guard let toolbarManager = self.toolbarManager else {
  96. return
  97. }
  98. leftViewButton.properties = toolbarManager.viewProperty
  99. leftViewButton.setTarget(self, action: #selector(buttonClicked(_:)))
  100. pageButton.properties = toolbarManager.pageProperty
  101. pageButton.setTarget(self, action: #selector(buttonClicked(_:)))
  102. dividerView.properties = ComponentDividerProperty(type: .vertical, dash: false)
  103. toolsView.properties = toolbarManager.toolsProperty
  104. toolsView.delegate = self
  105. selectZoom.properties = toolbarManager.selectZoomProperty
  106. selectZoom.delegate = self
  107. tabsView.updateItemProperty([toolbarManager.markupMode_Property,
  108. toolbarManager.editMode_Property,
  109. toolbarManager.formMode_Property,
  110. toolbarManager.fillMode_Property,
  111. toolbarManager.convertMode_Property,
  112. toolbarManager.protectMode_Property,
  113. toolbarManager.toolsMode_Property])
  114. tabsView.frame = CGRectMake(0, 0, tabsView.viewWidth, CGRectGetHeight(tabsContendView.frame))
  115. tabsView.delegate = self
  116. scrollDocumentView.frame = CGRectMake(0, 0, tabsView.viewWidth, 28)
  117. tabsView.frame = scrollDocumentView.bounds
  118. tabsView.autoresizingMask = [.width, .height]
  119. scrollDocumentView.addSubview(tabsView)
  120. tabsMoreButton.properties = ComponentButtonProperty(type: .text_gray,
  121. size: .xs,
  122. onlyIcon: true,
  123. icon: NSImage(named: "toolbar_more"))
  124. tabsMoreButton.setTarget(self, action: #selector(tabsMoreButtonClicked(_:)))
  125. customRightItems = [undoRedo_Menuitem_Property,
  126. save_Menuitem_Property,
  127. aiTools_Menuitem_Property,
  128. batch_Menuitem_Property,
  129. tts_Menuitem_Property,
  130. ppt_Menuitem_Property,
  131. print_Menuitem_Property,
  132. share_Menuitem_Property]
  133. moreTabsItems = [markup_Menuitem_Property,
  134. edit_Menuitem_Property,
  135. form_Menuitem_Property,
  136. fill_Menuitem_Property,
  137. convert_Menuitem_Property,
  138. protect_Menuitem_Property,
  139. tools_Menuitem_Property]
  140. }
  141. //MARK: - 刷新一级工具栏
  142. func reloadToolbarTabsView() {
  143. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  144. return
  145. }
  146. toolbarManager.markupMode_Property.state = viewManager.toolMode == .Markup ? .pressed : .normal
  147. toolbarManager.editMode_Property.state = viewManager.toolMode == .Edit ? .pressed : .normal
  148. toolbarManager.formMode_Property.state = viewManager.toolMode == .Form ? .pressed : .normal
  149. toolbarManager.fillMode_Property.state = viewManager.toolMode == .Fill ? .pressed : .normal
  150. toolbarManager.convertMode_Property.state = viewManager.toolMode == .Convert ? .pressed : .normal
  151. toolbarManager.protectMode_Property.state = viewManager.toolMode == .Protect ? .pressed : .normal
  152. toolbarManager.toolsMode_Property.state = viewManager.toolMode == .Tools ? .pressed : .normal
  153. tabsView.refreshItems()
  154. }
  155. func reloadLeftIconView() {
  156. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  157. return
  158. }
  159. toolbarManager.viewProperty.state = viewManager.showView ? .pressed : .normal
  160. toolbarManager.viewProperty.isDisabled = false
  161. if viewManager.isPageEditMode {
  162. toolbarManager.viewProperty.isDisabled = true
  163. }
  164. leftViewButton.reloadData()
  165. }
  166. func reloadPageEditView() {
  167. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  168. return
  169. }
  170. toolbarManager.pageProperty.state = viewManager.isPageEditMode ? .pressed : .normal
  171. pageButton.reloadData()
  172. }
  173. func reloadSelectZoomView() {
  174. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  175. return
  176. }
  177. toolbarManager.selectZoomProperty.isDisabled = false
  178. if viewManager.isPageEditMode {
  179. toolbarManager.selectZoomProperty.isDisabled = true
  180. }
  181. if let pdfview = self.pdfView {
  182. toolbarManager.selectZoomProperty.text = (NSString(format: "%.0f", pdfview.scaleFactor * 100) as String) + "%"
  183. }
  184. selectZoom.reloadData()
  185. }
  186. func refreshTabsScrollViewUI() {
  187. let pointX: CGFloat = (CGRectGetWidth(view.frame) - tabsView.viewWidth)/2
  188. var xValue: CGFloat = 0
  189. if pointX-12-264 > 10 {
  190. xValue = pointX - 12 - 264
  191. tabsLeftConst.constant = xValue
  192. tabsRightConst.constant = CGRectGetWidth(view.frame) - tabsView.viewWidth - 12 - 264 - rightViewWidthConst.constant - 12 - xValue
  193. tabsMoreButton.superview?.isHidden = true
  194. } else {
  195. xValue = 10
  196. let rightXValue = CGRectGetWidth(view.frame) - tabsView.viewWidth - 12 - 264 - rightViewWidthConst.constant - 12 - xValue
  197. if rightXValue < 10 {
  198. tabsMoreButton.superview?.isHidden = false
  199. tabsRightConst.constant = 44
  200. } else {
  201. tabsMoreButton.superview?.isHidden = true
  202. tabsRightConst.constant = rightXValue
  203. }
  204. }
  205. }
  206. func refreshTabsScrollViewVisiableRect() {
  207. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  208. return
  209. }
  210. if tabsView.viewWidth > CGRectGetWidth(tabsContendView.frame)-21 {
  211. if viewManager.toolMode != .None {
  212. var pointx: CGFloat = 0
  213. print(tabsScrollView.documentVisibleRect)
  214. let _manager = toolbarManager
  215. if viewManager.toolMode == .Markup {
  216. pointx = 0
  217. } else if viewManager.toolMode == .Edit {
  218. pointx = _manager.markupMode_Property.propertyInfo.viewWidth
  219. } else if viewManager.toolMode == .Form {
  220. pointx = _manager.markupMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth
  221. } else if viewManager.toolMode == .Fill {
  222. pointx = _manager.markupMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.formMode_Property.propertyInfo.viewWidth
  223. } else if viewManager.toolMode == .Convert {
  224. pointx = _manager.markupMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.formMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth
  225. } else if viewManager.toolMode == .Protect {
  226. pointx = _manager.markupMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.formMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.convertMode_Property.propertyInfo.viewWidth
  227. } else if viewManager.toolMode == .Tools {
  228. pointx = _manager.markupMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.formMode_Property.propertyInfo.viewWidth + _manager.editMode_Property.propertyInfo.viewWidth + _manager.convertMode_Property.propertyInfo.viewWidth + _manager.protectMode_Property.propertyInfo.viewWidth
  229. }
  230. if tabsScrollView.documentVisibleRect.origin.x > pointx {
  231. tabsScrollView.scroll(tabsScrollView.contentView, to: CGPoint(x: pointx, y: 0))
  232. }
  233. }
  234. }
  235. }
  236. //MARK: -右侧工具模块
  237. func setUpRightViews() {
  238. let subviews = rightToolsView.subviews
  239. for view in subviews {
  240. view.removeFromSuperview()
  241. }
  242. var itemXvalue: CGFloat = 4
  243. guard let _manager = self.toolbarManager, let viewManager = self.viewManager else {
  244. return
  245. }
  246. var propertys: [Any] = []
  247. var adddividerA: Bool = false
  248. var adddividerB: Bool = false
  249. for property in _manager.validRightPropertys {
  250. if property == _manager.undoProperty ||
  251. property == _manager.redoProperty ||
  252. property == _manager.saveProperty {
  253. adddividerA = true
  254. } else if property == _manager.aiToolsProperty ||
  255. property == _manager.batchProperty ||
  256. property == _manager.ttsProperty ||
  257. property == _manager.pptProperty ||
  258. property == _manager.printProperty ||
  259. property == _manager.shareProperty {
  260. adddividerB = true
  261. }
  262. }
  263. for property in _manager.validRightPropertys {
  264. if adddividerA == true {
  265. if property == _manager.aiToolsProperty ||
  266. property == _manager.batchProperty ||
  267. property == _manager.ttsProperty ||
  268. property == _manager.pptProperty ||
  269. property == _manager.printProperty ||
  270. property == _manager.shareProperty {
  271. propertys.append(ComponentDividerProperty(type: .vertical, dash: false))
  272. adddividerA = false
  273. }
  274. }
  275. propertys.append(property)
  276. }
  277. if adddividerB == true {
  278. if propertys.last is ComponentDividerProperty {
  279. } else {
  280. propertys.append(ComponentDividerProperty(type: .vertical, dash: false))
  281. }
  282. }
  283. propertys.append(_manager.rightViewProperty)
  284. for property in propertys {
  285. if property is ComponentButtonProperty {
  286. let buttonProperty = (property as! ComponentButtonProperty)
  287. let button = ComponentButton.init()
  288. button.properties = buttonProperty
  289. if buttonProperty.onlyIcon {
  290. button.frame = CGRectMake(itemXvalue, 0, 28, 28)
  291. } else {
  292. button.frame = CGRectMake(itemXvalue, 0, button.properties.propertyInfo.viewWidth, 28)
  293. }
  294. button.setTarget(self, action: #selector(buttonClicked(_:)))
  295. rightToolsView.addSubview(button)
  296. itemXvalue += CGRectGetWidth(button.frame)
  297. itemXvalue += 12
  298. } else if property is ComponentDividerProperty {
  299. let divider = ComponentDivider.init()
  300. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(rightToolsView.frame)/2-8, 1, 16)
  301. divider.properties = (property as! ComponentDividerProperty)
  302. rightToolsView.addSubview(divider)
  303. itemXvalue += 1
  304. itemXvalue += 12
  305. } else if property is ComponentDropdownToolProperty {
  306. let dropdownTool = ComponentDropdownTool.init()
  307. dropdownTool.properties = property as! ComponentDropdownToolProperty
  308. dropdownTool.frame = CGRectMake(itemXvalue, 0, 28, 28)
  309. dropdownTool.delegate = self
  310. rightToolsView.addSubview(dropdownTool)
  311. itemXvalue += CGRectGetWidth(dropdownTool.frame)
  312. itemXvalue += 12
  313. }
  314. }
  315. itemXvalue -= 12
  316. rightViewWidthConst.constant = itemXvalue
  317. }
  318. //MARK: - 二级工具栏
  319. func setupSecondToolbar() {
  320. secondToolBar.view.frame = secondContendView.bounds
  321. secondToolBar.delegate = self
  322. secondToolBar.view.autoresizingMask = [.width, .height]
  323. secondContendView.addSubview(secondToolBar.view)
  324. }
  325. func reloadSecondToolbar() {
  326. guard let _manager = self.toolbarManager, let viewManager = self.viewManager else {
  327. return
  328. }
  329. if viewManager.isPageEditMode {
  330. secondToolBar.reloadMainPropertys(_manager.getSubToolbarItems(isPageEditMode: true))
  331. secondToolBar.reloadRightPropertys([_manager.page_Reduce_Property, _manager.page_Increase_Property])
  332. } else {
  333. secondToolBar.reloadMainPropertys(_manager.getSubToolbarItems(viewManager.toolMode))
  334. secondToolBar.reloadRightPropertys([])
  335. }
  336. }
  337. //只刷新Item状态
  338. func refreshSecondToolbarItemsState() {
  339. secondToolBar.refreshMainview()
  340. secondToolBar.refreshRightview()
  341. }
  342. //MARK: - reloadData
  343. func reloadData() {
  344. reloadLeftIconView()
  345. reloadPageEditView()
  346. reloadToolsView()
  347. reloadSelectZoomView()
  348. reloadToolbarTabsView()
  349. reloadSecondToolbar()
  350. updateRightMenuItemSelectedState()
  351. }
  352. //MARK: - 刷新tools工具
  353. func reloadToolsView() {
  354. toolbarManager?.reloadToolsData()
  355. toolsView.reloadData()
  356. }
  357. //MARK: - Action
  358. @objc func buttonClicked(_ sender: ComponentButton) {
  359. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  360. return
  361. }
  362. if sender.properties == toolbarManager.viewProperty {
  363. viewManager.showView = !viewManager.showView
  364. sender.properties.state = viewManager.showView ? .pressed : .normal
  365. sender.reloadData()
  366. } else if sender.properties == toolbarManager.pageProperty {
  367. viewManager.isPageEditMode = !viewManager.isPageEditMode
  368. sender.properties.state = viewManager.isPageEditMode ? .pressed : .normal
  369. sender.reloadData()
  370. viewManager.toolMode = .None
  371. }
  372. delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, sender.properties.identifier)
  373. reloadData()
  374. }
  375. @objc func tabsMoreButtonClicked(_ sender: ComponentButton) {
  376. guard let point = sender.superview?.convert(sender.frame.origin, to: view.window?.contentView) else { return }
  377. for item in moreTabsItems {
  378. item.state = .normal
  379. item.itemSelected = false
  380. }
  381. showGroupView(moreTabsItems, point)
  382. customRightGroupView.clickedAutoHide = true
  383. }
  384. //MARK: - 自定义工具栏
  385. func updateRightMenuItemSelectedState() {
  386. undoRedo_Menuitem_Property.itemSelected = false
  387. save_Menuitem_Property.itemSelected = false
  388. aiTools_Menuitem_Property.itemSelected = false
  389. batch_Menuitem_Property.itemSelected = false
  390. tts_Menuitem_Property.itemSelected = false
  391. ppt_Menuitem_Property.itemSelected = false
  392. print_Menuitem_Property.itemSelected = false
  393. share_Menuitem_Property.itemSelected = false
  394. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  395. return
  396. }
  397. for property in toolbarManager.validRightPropertys {
  398. if property == toolbarManager.undoProperty ||
  399. property == toolbarManager.redoProperty {
  400. undoRedo_Menuitem_Property.itemSelected = true
  401. } else if property == toolbarManager.saveProperty {
  402. save_Menuitem_Property.itemSelected = true
  403. } else if property == toolbarManager.aiToolsProperty {
  404. aiTools_Menuitem_Property.itemSelected = true
  405. } else if property == toolbarManager.batchProperty {
  406. batch_Menuitem_Property.itemSelected = true
  407. } else if property == toolbarManager.ttsProperty {
  408. tts_Menuitem_Property.itemSelected = true
  409. } else if property == toolbarManager.pptProperty {
  410. ppt_Menuitem_Property.itemSelected = true
  411. } else if property == toolbarManager.printProperty {
  412. print_Menuitem_Property.itemSelected = true
  413. } else if property == toolbarManager.shareProperty {
  414. share_Menuitem_Property.itemSelected = true
  415. }
  416. }
  417. }
  418. func showPageTurnMenuWithPoint(_ point: CGPoint) {
  419. if (customRightGroupView?.superview) != nil {
  420. return
  421. }
  422. updateRightMenuItemSelectedState()
  423. let items: [ComponentMenuitemProperty] = [ComponentMenuitemProperty.header(KMLocalizedString("Show Right Tools")), undoRedo_Menuitem_Property, save_Menuitem_Property, ComponentMenuitemProperty.divider(),
  424. aiTools_Menuitem_Property, batch_Menuitem_Property, tts_Menuitem_Property, ppt_Menuitem_Property, print_Menuitem_Property, share_Menuitem_Property]
  425. showGroupView(items, point)
  426. customRightGroupView.clickedAutoHide = false
  427. refreshRightMenuState()
  428. }
  429. func showGroupView(_ items: [ComponentMenuitemProperty], _ point: NSPoint) {
  430. var viewHeight: CGFloat = 8.0
  431. for item in items {
  432. item.state = .normal
  433. if item.type == .normal {
  434. viewHeight += 36
  435. } else if item.type == .divider {
  436. viewHeight += 8
  437. } else if item.type == .header {
  438. viewHeight += 36
  439. }
  440. }
  441. if customRightGroupView == nil {
  442. customRightGroupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
  443. }
  444. customRightGroupView.clickedAutoHide = false
  445. customRightGroupView?.frame = CGRectMake(0, 0, 160, viewHeight)
  446. customRightGroupView?.reloadData()
  447. customRightGroupView.groupDelegate = self
  448. customRightGroupView.showWithPoint(CGPoint(x: point.x, y: point.y-viewHeight), relativeTo: self.contendBox)
  449. customRightGroupView?.updateGroupInfo(items)
  450. }
  451. func hideGroupView() {
  452. customRightGroupView?.removeGroupView()
  453. }
  454. func refreshRightMenuState() {
  455. let totalItems = customRightItems
  456. var selectedCount = 0
  457. for item in totalItems {
  458. if item.itemSelected == true {
  459. selectedCount += 1
  460. }
  461. }
  462. var maxCount = 6
  463. if undoRedo_Menuitem_Property.itemSelected == true {
  464. maxCount = 5
  465. }
  466. if selectedCount == maxCount {
  467. for item in totalItems {
  468. if item.itemSelected == false {
  469. item.isDisabled = true
  470. }
  471. }
  472. } else {
  473. for item in totalItems {
  474. item.isDisabled = false
  475. }
  476. }
  477. if selectedCount == 5 && undoRedo_Menuitem_Property.itemSelected == false {
  478. //特殊情况,UndoRedo占两个空位
  479. undoRedo_Menuitem_Property.isDisabled = true
  480. }
  481. for item in totalItems {
  482. NotificationCenter.default.post(name: Notification.Name(rawValue: ComponentMenuItemUpdatedKey), object: item.identifier)
  483. }
  484. }
  485. //MARK: - MouseEvent
  486. override func rightMouseUp(with event: NSEvent) {
  487. super.rightMouseUp(with: event)
  488. var clickEnabled = true
  489. let windowPoint = event.locationInWindow
  490. if tabsMoreButton.superview?.isHidden == false {
  491. if CGRectContainsPoint(tabsMoreButton.frame, mainToolbarContendView.convert(windowPoint, from: nil)) {
  492. clickEnabled = false
  493. }
  494. }
  495. if clickEnabled {
  496. showPageTurnMenuWithPoint(windowPoint)
  497. }
  498. }
  499. }
  500. //MARK: - ComponentDropdownToolDelegate:工具模式
  501. extension KMPDFToolbarController: ComponentDropdownToolDelegate {
  502. func componentDropdownToolDidClicked(_ view: ComponentDropdownTool, menuItem: ComponentMenuitemProperty?) {
  503. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  504. return
  505. }
  506. for item in toolbarManager.toolsProperty.menuItemArr ?? [] {
  507. item.itemSelected = false
  508. item.state = .normal
  509. }
  510. menuItem?.itemSelected = true
  511. if menuItem == toolbarManager.tools_selectProperty {
  512. viewManager.viewToolsType = .Select
  513. } else if menuItem == toolbarManager.tools_scrollProperty {
  514. viewManager.viewToolsType = .Scroll
  515. } else if menuItem == toolbarManager.tools_contentProperty {
  516. viewManager.viewToolsType = .Content_Selection
  517. } else if menuItem == toolbarManager.tools_magnifyProperty {
  518. viewManager.viewToolsType = .Magnify
  519. } else if menuItem == toolbarManager.tools_areaProperty {
  520. viewManager.viewToolsType = .AreaZoom
  521. }
  522. reloadToolsView()
  523. }
  524. }
  525. //MARK: - ComponentSelectZoomDelegate:缩放比例
  526. extension KMPDFToolbarController: ComponentSelectZoomDelegate {
  527. func componentSelectZoomDidReduce(view: ComponentSelectZoom) {
  528. let zoomSting = view.properties.text
  529. var scale = CGFloat((NSString(string: zoomSting)).floatValue / 100.0)
  530. switch scale {
  531. case 0...0.25:
  532. scale = 0
  533. case 0.25...3:
  534. scale -= 0.25
  535. case 3.1...10:
  536. scale -= 0.4
  537. case 10.1...100:
  538. scale -= 1
  539. default:
  540. scale -= 1
  541. }
  542. pdfView?.scaleFactor = scale
  543. }
  544. func componentSelectZoomDidSelect(view: ComponentSelectZoom?, menuItemProperty: ComponentMenuitemProperty?) {
  545. if menuItemProperty?.identifier == KMPDFToolbar_Zoom_AdapWidth_Identifier {
  546. if pdfView?.scaleFactor != 1.0 {
  547. pdfView?.scaleFactor = 1.0
  548. pdfView?.autoScales = false
  549. }
  550. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_AdapPage_Identifier {
  551. let pageHeight = pdfView?.currentPage()!.size.height
  552. let pdfviewHeight = pdfView?.bounds.size.height
  553. pdfView?.scaleFactor = pdfviewHeight!/pageHeight!
  554. pdfView?.autoScales = false
  555. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_ActualSize_Identifier {
  556. pdfView?.autoScales = true
  557. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_10_Identifier {
  558. pdfView?.scaleFactor = 0.1
  559. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_25_Identifier {
  560. pdfView?.scaleFactor = 0.25
  561. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_50_Identifier {
  562. pdfView?.scaleFactor = 0.5
  563. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_75_Identifier {
  564. pdfView?.scaleFactor = 0.75
  565. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_100_Identifier {
  566. pdfView?.scaleFactor = 1.0
  567. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_150_Identifier {
  568. pdfView?.scaleFactor = 1.5
  569. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_200_Identifier {
  570. pdfView?.scaleFactor = 2.0
  571. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_400_Identifier {
  572. pdfView?.scaleFactor = 4.0
  573. } else if menuItemProperty?.identifier == KMPDFToolbar_Zoom_800_Identifier {
  574. pdfView?.scaleFactor = 8.0
  575. }
  576. }
  577. func componentSelectZoomDidAdd(view: ComponentSelectZoom) {
  578. let zoomSting = view.properties.text
  579. var scale = CGFloat((NSString(string: zoomSting)).floatValue / 100.0)
  580. switch scale {
  581. case 0...0.25:
  582. scale += 0.25
  583. case 0.25...3:
  584. scale += 0.25
  585. case 3.1...10:
  586. scale += 0.4
  587. case 10.1...100:
  588. scale += 1
  589. default:
  590. scale += 1
  591. }
  592. pdfView?.scaleFactor = scale
  593. }
  594. }
  595. //MARK: - ComponentTabsDelegate
  596. extension KMPDFToolbarController: ComponentTabsDelegate {
  597. func componentTabsDidSelected(_ view: ComponentTabs, _ property: ComponentTabsProperty) {
  598. guard let toolbarManager = self.toolbarManager, let _manager = self.viewManager else {
  599. return
  600. }
  601. _manager.viewToolsType = .Select
  602. _manager.isPageEditMode = false
  603. if property == toolbarManager.markupMode_Property {
  604. if _manager.toolMode == .Markup {
  605. _manager.toolMode = .None
  606. property.state = .normal
  607. view.refreshItems()
  608. } else {
  609. _manager.toolMode = .Markup
  610. }
  611. } else if property == toolbarManager.editMode_Property {
  612. if _manager.toolMode == .Edit {
  613. _manager.toolMode = .None
  614. property.state = .normal
  615. view.refreshItems()
  616. } else {
  617. _manager.toolMode = .Edit
  618. }
  619. } else if property == toolbarManager.formMode_Property {
  620. if _manager.toolMode == .Form {
  621. _manager.toolMode = .None
  622. property.state = .normal
  623. view.refreshItems()
  624. } else {
  625. _manager.toolMode = .Form
  626. }
  627. } else if property == toolbarManager.fillMode_Property {
  628. if _manager.toolMode == .Fill {
  629. _manager.toolMode = .None
  630. property.state = .normal
  631. view.refreshItems()
  632. } else {
  633. _manager.toolMode = .Fill
  634. }
  635. } else if property == toolbarManager.convertMode_Property {
  636. if _manager.toolMode == .Convert {
  637. _manager.toolMode = .None
  638. property.state = .normal
  639. view.refreshItems()
  640. } else {
  641. _manager.toolMode = .Convert
  642. }
  643. } else if property == toolbarManager.protectMode_Property {
  644. if _manager.toolMode == .Protect {
  645. _manager.toolMode = .None
  646. property.state = .normal
  647. view.refreshItems()
  648. } else {
  649. _manager.toolMode = .Protect
  650. }
  651. } else if property == toolbarManager.toolsMode_Property {
  652. if _manager.toolMode == .Tools {
  653. _manager.toolMode = .None
  654. property.state = .normal
  655. view.refreshItems()
  656. } else {
  657. _manager.toolMode = .Tools
  658. }
  659. }
  660. refreshTabsScrollViewVisiableRect()
  661. delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, property.identifier)
  662. reloadData()
  663. }
  664. }
  665. //MARK: - KMPDFSecToolbarControllerDelegate:二级工具栏
  666. extension KMPDFToolbarController: KMPDFSecToolbarControllerDelegate {
  667. func kmPDFSecToolbarControllerDidItemClicked(_ controller: KMPDFSecToolbarController, _ property: Any) {
  668. if let value = property as? ComponentButtonProperty {
  669. delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, value.identifier)
  670. } else if let value = property as? ComponentMenuitemProperty {
  671. delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, value.identifier)
  672. }
  673. }
  674. }
  675. //MARK: - ComponentGroupDelegate:右侧工具栏
  676. extension KMPDFToolbarController: ComponentGroupDelegate {
  677. func componentGroupDidDismiss(group: ComponentGroup?) {
  678. tabsMoreButton.properties.state = .normal
  679. tabsMoreButton.reloadData()
  680. }
  681. func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
  682. guard let property = menuItemProperty else {
  683. return
  684. }
  685. guard let toolbarManager = self.toolbarManager, let viewManager = self.viewManager else {
  686. return
  687. }
  688. if customRightItems.contains(property) {
  689. var validItems:[NSObject] = []
  690. if undoRedo_Menuitem_Property.itemSelected {
  691. validItems.append(toolbarManager.undoProperty)
  692. validItems.append(toolbarManager.redoProperty)
  693. }
  694. if save_Menuitem_Property.itemSelected {
  695. validItems.append(toolbarManager.saveProperty)
  696. }
  697. if aiTools_Menuitem_Property.itemSelected {
  698. validItems.append(toolbarManager.aiToolsProperty)
  699. }
  700. if batch_Menuitem_Property.itemSelected {
  701. validItems.append(toolbarManager.batchProperty)
  702. }
  703. if tts_Menuitem_Property.itemSelected {
  704. validItems.append(toolbarManager.ttsProperty)
  705. }
  706. if ppt_Menuitem_Property.itemSelected {
  707. validItems.append(toolbarManager.pptProperty)
  708. }
  709. if print_Menuitem_Property.itemSelected {
  710. validItems.append(toolbarManager.printProperty)
  711. }
  712. if share_Menuitem_Property.itemSelected {
  713. validItems.append(toolbarManager.shareProperty)
  714. }
  715. let sortArray = toolbarManager.totalRightPropertys
  716. let sortedArray = validItems.sorted {
  717. guard let indexA = sortArray.firstIndex(of: $0 as NSObject),
  718. let indexB = sortArray.firstIndex(of: $1 as NSObject) else {
  719. return false
  720. }
  721. return indexA < indexB
  722. }
  723. toolbarManager.validRightPropertys = sortedArray
  724. setUpRightViews()
  725. refreshRightMenuState()
  726. } else if moreTabsItems.contains(property) {
  727. viewManager.viewToolsType = .Select
  728. viewManager.isPageEditMode = false
  729. if property == markup_Menuitem_Property {
  730. viewManager.toolMode = .Markup
  731. } else if property == edit_Menuitem_Property {
  732. viewManager.toolMode = .Edit
  733. } else if property == form_Menuitem_Property {
  734. viewManager.toolMode = .Form
  735. } else if property == fill_Menuitem_Property {
  736. viewManager.toolMode = .Fill
  737. } else if property == toolbarManager.convertMode_Property {
  738. viewManager.toolMode = .Convert
  739. } else if property == protect_Menuitem_Property {
  740. viewManager.toolMode = .Protect
  741. } else if property == tools_Menuitem_Property {
  742. viewManager.toolMode = .Tools
  743. }
  744. tabsView.refreshItems()
  745. delegate?.kmPDFToolbarControllerDidToolbarItemClicked?(self, property.identifier)
  746. reloadData()
  747. }
  748. }
  749. }