KMPDFEditToolbar.swift 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. //
  2. // KMPDFEditToolbar.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2023/5/4.
  6. //
  7. import Cocoa
  8. enum KMPageEditType: Int {
  9. case pageRange = 1
  10. case leftRotate
  11. case rightRotate
  12. case insert
  13. case extract
  14. case replace
  15. case split
  16. case reverse
  17. case delete
  18. case zoomOut
  19. case zoomIn
  20. static var insert_files: Int {
  21. get {
  22. return self.insert.rawValue + 1000
  23. }
  24. }
  25. static var insert_blank_page: Int {
  26. get {
  27. return self.insert.rawValue + 1001
  28. }
  29. }
  30. static var insert_custom_page: Int {
  31. get {
  32. return self.insert.rawValue + 1002
  33. }
  34. }
  35. }
  36. class KMPDFEditToolbar: NSView {
  37. private var toolBar_ = KMToolbar()
  38. var toolBar: KMToolbar {
  39. get {
  40. return self.toolBar_
  41. }
  42. }
  43. private var zoomOutButton_: NSButton?
  44. private var zoomInButton_: NSButton?
  45. open var zoomOutButton: NSButton? {
  46. get {
  47. return self.zoomOutButton_
  48. }
  49. }
  50. open var zoomInButton: NSButton? {
  51. get {
  52. return self.zoomInButton_
  53. }
  54. }
  55. private var pageRangeView_: KMDesignSelect?
  56. open var pageRangeView: KMDesignSelect? {
  57. get {
  58. return self.pageRangeView_
  59. }
  60. }
  61. private var pageRangeViewItems = [KMTools.pageRangeTypeString(pageRange: .all),
  62. KMTools.pageRangeTypeString(pageRange: .odd),
  63. KMTools.pageRangeTypeString(pageRange: .even),
  64. KMTools.pageRangeTypeString(pageRange: .horizontal),
  65. KMTools.pageRangeTypeString(pageRange: .vertical),
  66. KMTools.pageRangeTypeString(pageRange: .custom)]
  67. var itemClick: KMItemClickBlock<KMPDFEditToolbar>?
  68. var pageRangeValueDidChange: KMValueDidChangeBlock?
  69. lazy var insertItemStrings: [String] = {
  70. return [NSLocalizedString("Insert a Blank Page", comment: ""),
  71. NSLocalizedString("Insert Custom Page", comment: ""),
  72. NSLocalizedString("Insert File", comment: "")]
  73. }()
  74. private weak var popover: NSPopover?
  75. override init(frame frameRect: NSRect) {
  76. super.init(frame: frameRect)
  77. self.initDefaultValue()
  78. self.initSubViews()
  79. }
  80. required init?(coder: NSCoder) {
  81. super.init(coder: coder)
  82. self.initDefaultValue()
  83. self.initSubViews()
  84. }
  85. public func initDefaultValue() {
  86. }
  87. public func initSubViews() {
  88. self.addSubview(self.toolBar)
  89. self.toolBar.frame = self.bounds
  90. self.toolBar.autoresizingMask = [.width, .height]
  91. self.toolBar.delegate = self
  92. let rightItemView = self.rightItemView
  93. self.addSubview(rightItemView)
  94. rightItemView.frame = NSMakeRect(NSWidth(self.frame)-80, 0, 80, NSHeight(self.frame))
  95. rightItemView.autoresizingMask = [.minXMargin, .height]
  96. }
  97. // MARK: - Publick Methods
  98. public func setPageRangeString(_ string: String) {
  99. self.pageRangeView?.stringValue = string
  100. self.pageRangeView?.editable = true
  101. }
  102. public func getItem(for itemId: String) -> KMToolBoxItem? {
  103. return self.toolBar.item(forItemIdentifier: itemId)
  104. }
  105. public func selectItem(for itemId: String) {
  106. self.getItem(for: itemId)?.isSelected = true
  107. }
  108. public func unSelectItem(for itemId: String) {
  109. self.getItem(for: itemId)?.isSelected = false
  110. }
  111. // MARK: - Actions
  112. @objc private func zoomOutButtonAction() {
  113. guard let callback = self.itemClick else {
  114. return
  115. }
  116. callback(self, KMPageEditType.zoomOut.rawValue)
  117. }
  118. @objc private func zoomInButtonAction() {
  119. guard let callback = self.itemClick else {
  120. return
  121. }
  122. callback(self, KMPageEditType.zoomIn.rawValue)
  123. }
  124. // MARK: toolBar 菜单事件
  125. @objc func pageRangeMenuAction(sender: KMToolbarClickButton) {
  126. }
  127. @objc func leftRotateMenuAction(sender: KMToolbarClickButton?) {
  128. guard let callback = self.itemClick else {
  129. return
  130. }
  131. callback(self, KMPageEditType.leftRotate.rawValue)
  132. }
  133. @objc func rightRotateMenuAction(sender: KMToolbarClickButton?) {
  134. guard let callback = self.itemClick else {
  135. return
  136. }
  137. callback(self, KMPageEditType.rightRotate.rawValue)
  138. }
  139. @objc func insertMenuAction(sender: KMToolbarClickButton) {
  140. if let _popover = self.popover, _popover.isShown {
  141. self.popover?.close()
  142. self.popover = nil
  143. return
  144. }
  145. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(self.insertItemStrings)
  146. let popover: NSPopover = NSPopover.init()
  147. self.popover = popover
  148. popover.contentViewController = vc
  149. popover.animates = true
  150. popover.behavior = .semitransient
  151. popover.setValue(true, forKey: "shouldHideAnchor")
  152. popover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: 10, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY)
  153. vc.downCallback = { [weak self] downEntered, count in
  154. self?.popover?.close()
  155. self?.popover = nil
  156. if (!downEntered) {
  157. return
  158. }
  159. guard let index = self?.insertItemStrings.firstIndex(of: count) else {
  160. return
  161. }
  162. if (index == 0) {
  163. self?.item_insertBlankPage(sender: nil)
  164. } else if (index == 1) {
  165. self?.item_insertCustomPage(sender: nil)
  166. } else if (index == 2) {
  167. self?.item_insertFile(sender: nil)
  168. }
  169. }
  170. }
  171. @objc func extractMenuAction(sender: KMToolbarClickButton?) {
  172. guard let callback = self.itemClick else {
  173. return
  174. }
  175. callback(self, KMPageEditType.extract.rawValue)
  176. }
  177. @objc func replaceMenuAction(sender: KMToolbarClickButton?) {
  178. guard let callback = self.itemClick else {
  179. return
  180. }
  181. callback(self, KMPageEditType.replace.rawValue)
  182. }
  183. @objc func splitMenuAction(sender: KMToolbarClickButton) {
  184. guard let callback = self.itemClick else {
  185. return
  186. }
  187. callback(self, KMPageEditType.split.rawValue)
  188. }
  189. @objc func reverseMenuAction(sender: KMToolbarClickButton) {
  190. guard let callback = self.itemClick else {
  191. return
  192. }
  193. callback(self, KMPageEditType.reverse.rawValue)
  194. }
  195. @objc func deleteMenuAction(sender: KMToolbarClickButton) {
  196. guard let callback = self.itemClick else {
  197. return
  198. }
  199. callback(self, KMPageEditType.delete.rawValue)
  200. }
  201. @objc func item_insertFile(sender: NSMenuItem?) {
  202. guard let callback = self.itemClick else {
  203. return
  204. }
  205. callback(self, KMPageEditType.insert_files)
  206. }
  207. @objc func item_insertBlankPage(sender: NSMenuItem?) {
  208. guard let callback = self.itemClick else {
  209. return
  210. }
  211. callback(self, KMPageEditType.insert_blank_page)
  212. }
  213. @objc func item_insertCustomPage(sender: NSMenuItem?) {
  214. guard let callback = self.itemClick else {
  215. return
  216. }
  217. callback(self, KMPageEditType.insert_custom_page)
  218. }
  219. private lazy var rightItemView: NSView = {
  220. let view = NSView()
  221. let size: CGFloat = 28
  222. let y: CGFloat = 6
  223. let zoomOutButton = NSButton()
  224. view.addSubview(zoomOutButton)
  225. zoomOutButton.frame = NSMakeRect(0, y, size, size)
  226. zoomOutButton.isBordered = false
  227. zoomOutButton.image = NSImage(named: "KMImageNamePageEditZoomOut")
  228. zoomOutButton.target = self
  229. zoomOutButton.action = #selector(zoomOutButtonAction)
  230. self.zoomOutButton_ = zoomOutButton
  231. let zoomInButton = NSButton()
  232. view.addSubview(zoomInButton)
  233. zoomInButton.frame = NSMakeRect(size+7, y, size, size)
  234. zoomInButton.isBordered = false
  235. zoomInButton.image = NSImage(named: "KMImageNamePageEditZoomIn")
  236. zoomInButton.target = self
  237. zoomInButton.action = #selector(zoomInButtonAction)
  238. self.zoomInButton_ = zoomInButton
  239. return view
  240. }()
  241. }
  242. // MARK: - KMNewToolbarDelegate
  243. extension KMPDFEditToolbar: KMNewToolbarDelegate {
  244. func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbar!) -> [String]! {
  245. return [KMToolbarPageEditPageRangeItemIdentifier,
  246. KMToolbarPageEditLeftRotateItemIdentifier,
  247. KMToolbarPageEditRightRotateItemIdentifier,
  248. KMToolbarDividerItemIdentifier,
  249. KMToolbarPageEditInsetItemIdentifier,
  250. KMToolbarPageEditExtractItemIdentifier,
  251. KMToolbarPageEditReplaceItemIdentifier,
  252. KMToolbarPageEditSplitItemIdentifier,
  253. KMToolbarPageEditReverseItemIdentifier,
  254. KMToolbarDividerItemIdentifier,
  255. KMToolbarPageEditDeleteItemIdentifier]
  256. }
  257. func toolbar(_ toolbar: KMToolbar!, itemForItemIdentifier identifier: String!) -> KMToolBoxItem! {
  258. let item = KMToolBoxItem(itemIdentifier: identifier)
  259. if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
  260. item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
  261. item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
  262. item?.target = self
  263. item?.btnTag = KMPageEditType.pageRange.rawValue
  264. // item?.toolTip = NSLocalizedString("pageRange", comment: "")
  265. item?.titleName = NSLocalizedString("pageRange ", comment: "")
  266. item?.boxImagePosition = KMToolBoxImagePosition.left
  267. item?.btnAction = #selector(pageRangeMenuAction)
  268. let view = NSView()
  269. item?.addSubview(view)
  270. view.frame = item!.bounds
  271. view.autoresizingMask = [.width,.height]
  272. view.wantsLayer = true
  273. view.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
  274. let comBoxView = KMDesignSelect(withType: .Combox)
  275. view.addSubview(comBoxView.view)
  276. comBoxView.view.frame = NSMakeRect(0, 0.5, NSWidth(view.frame), 21)
  277. comBoxView.view.autoresizingMask = [.width]
  278. comBoxView.removeAllItems()
  279. comBoxView.addItems(withObjectValues: self.pageRangeViewItems)
  280. comBoxView.selectItem(at: 0)
  281. comBoxView.placeholderString = NSLocalizedString("eg .1,3-5,10", comment: "")
  282. comBoxView.editable = false
  283. comBoxView.delete = self
  284. self.pageRangeView_ = comBoxView
  285. let menuItem = NSMenuItem.init(title: "pageRange", action: #selector(pageRangeMenuAction), target: self)
  286. item?.menuFormRepresentation = menuItem
  287. } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
  288. item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  289. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  290. item?.target = self
  291. item?.btnTag = KMPageEditType.leftRotate.rawValue
  292. item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
  293. item?.titleName = NSLocalizedString("", comment: "")
  294. item?.boxImagePosition = KMToolBoxImagePosition.left
  295. item?.btnAction = #selector(leftRotateMenuAction)
  296. let menuItem = NSMenuItem.init(title: "", action: #selector(leftRotateMenuAction), target: self)
  297. item?.menuFormRepresentation = menuItem
  298. } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
  299. item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
  300. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
  301. item?.target = self
  302. item?.btnTag = KMPageEditType.rightRotate.rawValue
  303. item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
  304. item?.titleName = NSLocalizedString("", comment: "")
  305. item?.boxImagePosition = KMToolBoxImagePosition.left
  306. item?.btnAction = #selector(rightRotateMenuAction)
  307. let menuItem = NSMenuItem.init(title: "", action: #selector(rightRotateMenuAction), target: self)
  308. item?.menuFormRepresentation = menuItem
  309. } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
  310. item?.image = NSImage(named: "KMImageNameMainToolPageInsert")
  311. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageInsert")
  312. item?.target = self
  313. item?.btnTag = KMPageEditType.insert.rawValue
  314. item?.toolTip = NSLocalizedString("Insert", comment: "")
  315. item?.titleName = NSLocalizedString("Insert", comment: "")
  316. item?.boxImagePosition = KMToolBoxImagePosition.expandLeft
  317. item?.btnAction = #selector(insertMenuAction)
  318. let menuItem = NSMenuItem.init(title: "Insert", action: #selector(insertMenuAction), target: self)
  319. item?.menuFormRepresentation = menuItem
  320. } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
  321. item?.image = NSImage(named: "KMImageNameMainToolPageExtract")
  322. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageExtract")
  323. item?.target = self
  324. item?.btnTag = KMPageEditType.extract.rawValue
  325. item?.toolTip = NSLocalizedString("Extract", comment: "")
  326. item?.titleName = NSLocalizedString("Extract", comment: "")
  327. item?.boxImagePosition = KMToolBoxImagePosition.left
  328. item?.btnAction = #selector(extractMenuAction)
  329. let menuItem = NSMenuItem.init(title: "Extract", action: #selector(extractMenuAction), target: self)
  330. item?.menuFormRepresentation = menuItem
  331. } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
  332. item?.image = NSImage(named: "KMImageNameMainToolPageReplace")
  333. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReplace")
  334. item?.target = self
  335. item?.btnTag = KMPageEditType.replace.rawValue
  336. item?.toolTip = NSLocalizedString("Replace", comment: "")
  337. item?.titleName = NSLocalizedString("Replace", comment: "")
  338. item?.boxImagePosition = KMToolBoxImagePosition.left
  339. item?.btnAction = #selector(replaceMenuAction)
  340. let menuItem = NSMenuItem.init(title: "Replace", action: #selector(replaceMenuAction), target: self)
  341. item?.menuFormRepresentation = menuItem
  342. } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
  343. item?.image = NSImage(named: "KMImageNameMainToolPageSplit")
  344. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageSplit")
  345. item?.target = self
  346. item?.btnTag = KMPageEditType.split.rawValue
  347. item?.toolTip = NSLocalizedString("Split the PDF into multiple files", comment: "")
  348. item?.titleName = NSLocalizedString("Split", comment: "")
  349. item?.boxImagePosition = KMToolBoxImagePosition.left
  350. item?.btnAction = #selector(splitMenuAction)
  351. let menuItem = NSMenuItem.init(title: "Split", action: #selector(splitMenuAction), target: self)
  352. item?.menuFormRepresentation = menuItem
  353. } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
  354. item?.image = NSImage(named: "KMImageNameMainToolPageReverse")
  355. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReverse")
  356. item?.target = self
  357. item?.btnTag = KMPageEditType.reverse.rawValue
  358. item?.toolTip = NSLocalizedString("Reverse", comment: "")
  359. item?.titleName = NSLocalizedString("Reverse", comment: "")
  360. item?.boxImagePosition = KMToolBoxImagePosition.left
  361. item?.btnAction = #selector(reverseMenuAction)
  362. let menuItem = NSMenuItem.init(title: "Reverse", action: #selector(reverseMenuAction), target: self)
  363. item?.menuFormRepresentation = menuItem
  364. } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
  365. item?.image = NSImage(named: "KMImageNameMainToolPageDelete")
  366. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageDelete")
  367. item?.target = self
  368. item?.btnTag = KMPageEditType.delete.rawValue
  369. item?.toolTip = NSLocalizedString("Delete", comment: "")
  370. item?.titleName = NSLocalizedString("", comment: "")
  371. item?.boxImagePosition = KMToolBoxImagePosition.left
  372. item?.btnAction = #selector(deleteMenuAction)
  373. let menuItem = NSMenuItem.init(title: "Delete", action: #selector(deleteMenuAction), target: self)
  374. item?.menuFormRepresentation = menuItem
  375. }
  376. return item
  377. }
  378. }
  379. // MARK: - KMSelectPopButtonDelegate
  380. extension KMPDFEditToolbar: KMSelectPopButtonDelegate {
  381. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  382. guard let callback = self.itemClick else {
  383. return
  384. }
  385. callback(self, KMPageEditType.pageRange.rawValue)
  386. }
  387. func km_controlTextDidChange(_ obj: KMDesignSelect) {
  388. }
  389. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  390. guard let callback = self.pageRangeValueDidChange else {
  391. return
  392. }
  393. callback(self.pageRangeView?.stringValue, nil)
  394. }
  395. }