KMPDFEditToolbar.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  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. // MARK: - Actions
  103. @objc private func zoomOutButtonAction() {
  104. guard let callback = self.itemClick else {
  105. return
  106. }
  107. callback(self, KMPageEditType.zoomOut.rawValue)
  108. }
  109. @objc private func zoomInButtonAction() {
  110. guard let callback = self.itemClick else {
  111. return
  112. }
  113. callback(self, KMPageEditType.zoomIn.rawValue)
  114. }
  115. // MARK: toolBar 菜单事件
  116. @objc func pageRangeMenuAction(sender: KMToolbarClickButton) {
  117. }
  118. @objc func leftRotateMenuAction(sender: KMToolbarClickButton?) {
  119. guard let callback = self.itemClick else {
  120. return
  121. }
  122. callback(self, KMPageEditType.leftRotate.rawValue)
  123. }
  124. @objc func rightRotateMenuAction(sender: KMToolbarClickButton?) {
  125. guard let callback = self.itemClick else {
  126. return
  127. }
  128. callback(self, KMPageEditType.rightRotate.rawValue)
  129. }
  130. @objc func insertMenuAction(sender: KMToolbarClickButton) {
  131. if let _popover = self.popover, _popover.isShown {
  132. self.popover?.close()
  133. self.popover = nil
  134. return
  135. }
  136. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(self.insertItemStrings)
  137. let popover: NSPopover = NSPopover.init()
  138. self.popover = popover
  139. popover.contentViewController = vc
  140. popover.animates = true
  141. popover.behavior = .semitransient
  142. popover.setValue(true, forKey: "shouldHideAnchor")
  143. 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)
  144. vc.downCallback = { [weak self] downEntered, count in
  145. self?.popover?.close()
  146. self?.popover = nil
  147. if (!downEntered) {
  148. return
  149. }
  150. guard let index = self?.insertItemStrings.firstIndex(of: count) else {
  151. return
  152. }
  153. if (index == 0) {
  154. self?.item_insertBlankPage(sender: nil)
  155. } else if (index == 1) {
  156. self?.item_insertCustomPage(sender: nil)
  157. } else if (index == 2) {
  158. self?.item_insertFile(sender: nil)
  159. }
  160. }
  161. }
  162. @objc func extractMenuAction(sender: KMToolbarClickButton?) {
  163. guard let callback = self.itemClick else {
  164. return
  165. }
  166. callback(self, KMPageEditType.extract.rawValue)
  167. }
  168. @objc func replaceMenuAction(sender: KMToolbarClickButton?) {
  169. guard let callback = self.itemClick else {
  170. return
  171. }
  172. callback(self, KMPageEditType.replace.rawValue)
  173. }
  174. @objc func splitMenuAction(sender: KMToolbarClickButton) {
  175. guard let callback = self.itemClick else {
  176. return
  177. }
  178. callback(self, KMPageEditType.split.rawValue)
  179. }
  180. @objc func reverseMenuAction(sender: KMToolbarClickButton) {
  181. guard let callback = self.itemClick else {
  182. return
  183. }
  184. callback(self, KMPageEditType.reverse.rawValue)
  185. }
  186. @objc func deleteMenuAction(sender: KMToolbarClickButton) {
  187. guard let callback = self.itemClick else {
  188. return
  189. }
  190. callback(self, KMPageEditType.delete.rawValue)
  191. }
  192. @objc func item_insertFile(sender: NSMenuItem?) {
  193. guard let callback = self.itemClick else {
  194. return
  195. }
  196. callback(self, KMPageEditType.insert_files)
  197. }
  198. @objc func item_insertBlankPage(sender: NSMenuItem?) {
  199. guard let callback = self.itemClick else {
  200. return
  201. }
  202. callback(self, KMPageEditType.insert_blank_page)
  203. }
  204. @objc func item_insertCustomPage(sender: NSMenuItem?) {
  205. guard let callback = self.itemClick else {
  206. return
  207. }
  208. callback(self, KMPageEditType.insert_custom_page)
  209. }
  210. private lazy var rightItemView: NSView = {
  211. let view = NSView()
  212. let size: CGFloat = 28
  213. let y: CGFloat = 6
  214. let zoomOutButton = NSButton()
  215. view.addSubview(zoomOutButton)
  216. zoomOutButton.frame = NSMakeRect(0, y, size, size)
  217. zoomOutButton.isBordered = false
  218. zoomOutButton.image = NSImage(named: "KMImageNamePageEditZoomOut")
  219. zoomOutButton.target = self
  220. zoomOutButton.action = #selector(zoomOutButtonAction)
  221. self.zoomOutButton_ = zoomOutButton
  222. let zoomInButton = NSButton()
  223. view.addSubview(zoomInButton)
  224. zoomInButton.frame = NSMakeRect(size+7, y, size, size)
  225. zoomInButton.isBordered = false
  226. zoomInButton.image = NSImage(named: "KMImageNamePageEditZoomIn")
  227. zoomInButton.target = self
  228. zoomInButton.action = #selector(zoomInButtonAction)
  229. self.zoomInButton_ = zoomInButton
  230. return view
  231. }()
  232. }
  233. // MARK: - KMNewToolbarDelegate
  234. extension KMPDFEditToolbar: KMNewToolbarDelegate {
  235. func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbar!) -> [String]! {
  236. return [KMToolbarPageEditPageRangeItemIdentifier,
  237. KMToolbarPageEditLeftRotateItemIdentifier,
  238. KMToolbarPageEditRightRotateItemIdentifier,
  239. KMToolbarDividerItemIdentifier,
  240. KMToolbarPageEditInsetItemIdentifier,
  241. KMToolbarPageEditExtractItemIdentifier,
  242. KMToolbarPageEditReplaceItemIdentifier,
  243. KMToolbarPageEditSplitItemIdentifier,
  244. KMToolbarPageEditReverseItemIdentifier,
  245. KMToolbarDividerItemIdentifier,
  246. KMToolbarPageEditDeleteItemIdentifier]
  247. }
  248. func toolbar(_ toolbar: KMToolbar!, itemForItemIdentifier identifier: String!) -> KMToolBoxItem! {
  249. let item = KMToolBoxItem(itemIdentifier: identifier)
  250. if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
  251. item?.image = NSImage(named: "KMImageNameMainToolbarrRight")
  252. item?.alternateImage = NSImage(named: "KMImageNameMainToolbarrRight")
  253. item?.target = self
  254. item?.btnTag = KMPageEditType.pageRange.rawValue
  255. // item?.toolTip = NSLocalizedString("pageRange", comment: "")
  256. item?.titleName = NSLocalizedString("pageRange ", comment: "")
  257. item?.boxImagePosition = KMToolBoxImagePosition.left
  258. item?.btnAction = #selector(pageRangeMenuAction)
  259. let view = NSView()
  260. item?.addSubview(view)
  261. view.frame = item!.bounds
  262. view.autoresizingMask = [.width,.height]
  263. view.wantsLayer = true
  264. view.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
  265. let comBoxView = KMDesignSelect(withType: .Combox)
  266. view.addSubview(comBoxView.view)
  267. comBoxView.view.frame = NSMakeRect(0, 0.5, NSWidth(view.frame), 21)
  268. comBoxView.view.autoresizingMask = [.width]
  269. comBoxView.removeAllItems()
  270. comBoxView.addItems(withObjectValues: self.pageRangeViewItems)
  271. comBoxView.selectItem(at: 0)
  272. comBoxView.placeholderString = NSLocalizedString("eg .1,3-5,10", comment: "")
  273. comBoxView.editable = false
  274. comBoxView.delete = self
  275. self.pageRangeView_ = comBoxView
  276. let menuItem = NSMenuItem.init(title: "pageRange", action: #selector(pageRangeMenuAction), target: self)
  277. item?.menuFormRepresentation = menuItem
  278. } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
  279. item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  280. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  281. item?.target = self
  282. item?.btnTag = KMPageEditType.leftRotate.rawValue
  283. item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
  284. item?.titleName = NSLocalizedString("", comment: "")
  285. item?.boxImagePosition = KMToolBoxImagePosition.left
  286. item?.btnAction = #selector(leftRotateMenuAction)
  287. let menuItem = NSMenuItem.init(title: "", action: #selector(leftRotateMenuAction), target: self)
  288. item?.menuFormRepresentation = menuItem
  289. } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
  290. item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
  291. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
  292. item?.target = self
  293. item?.btnTag = KMPageEditType.rightRotate.rawValue
  294. item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
  295. item?.titleName = NSLocalizedString("", comment: "")
  296. item?.boxImagePosition = KMToolBoxImagePosition.left
  297. item?.btnAction = #selector(rightRotateMenuAction)
  298. let menuItem = NSMenuItem.init(title: "", action: #selector(rightRotateMenuAction), target: self)
  299. item?.menuFormRepresentation = menuItem
  300. } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
  301. item?.image = NSImage(named: "KMImageNameMainToolPageInsert")
  302. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageInsert")
  303. item?.target = self
  304. item?.btnTag = KMPageEditType.insert.rawValue
  305. item?.toolTip = NSLocalizedString("Insert", comment: "")
  306. item?.titleName = NSLocalizedString("Insert", comment: "")
  307. item?.boxImagePosition = KMToolBoxImagePosition.expandLeft
  308. item?.btnAction = #selector(insertMenuAction)
  309. let menuItem = NSMenuItem.init(title: "Insert", action: #selector(insertMenuAction), target: self)
  310. item?.menuFormRepresentation = menuItem
  311. } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
  312. item?.image = NSImage(named: "KMImageNameMainToolPageExtract")
  313. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageExtract")
  314. item?.target = self
  315. item?.btnTag = KMPageEditType.extract.rawValue
  316. item?.toolTip = NSLocalizedString("Extract", comment: "")
  317. item?.titleName = NSLocalizedString("Extract", comment: "")
  318. item?.boxImagePosition = KMToolBoxImagePosition.left
  319. item?.btnAction = #selector(extractMenuAction)
  320. let menuItem = NSMenuItem.init(title: "Extract", action: #selector(extractMenuAction), target: self)
  321. item?.menuFormRepresentation = menuItem
  322. } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
  323. item?.image = NSImage(named: "KMImageNameMainToolPageReplace")
  324. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReplace")
  325. item?.target = self
  326. item?.btnTag = KMPageEditType.replace.rawValue
  327. item?.toolTip = NSLocalizedString("Replace", comment: "")
  328. item?.titleName = NSLocalizedString("Replace", comment: "")
  329. item?.boxImagePosition = KMToolBoxImagePosition.left
  330. item?.btnAction = #selector(replaceMenuAction)
  331. let menuItem = NSMenuItem.init(title: "Replace", action: #selector(replaceMenuAction), target: self)
  332. item?.menuFormRepresentation = menuItem
  333. } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
  334. item?.image = NSImage(named: "KMImageNameMainToolPageSplit")
  335. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageSplit")
  336. item?.target = self
  337. item?.btnTag = KMPageEditType.split.rawValue
  338. item?.toolTip = NSLocalizedString("Split the PDF into multiple files", comment: "")
  339. item?.titleName = NSLocalizedString("Split", comment: "")
  340. item?.boxImagePosition = KMToolBoxImagePosition.left
  341. item?.btnAction = #selector(splitMenuAction)
  342. let menuItem = NSMenuItem.init(title: "Split", action: #selector(splitMenuAction), target: self)
  343. item?.menuFormRepresentation = menuItem
  344. } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
  345. item?.image = NSImage(named: "KMImageNameMainToolPageReverse")
  346. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageReverse")
  347. item?.target = self
  348. item?.btnTag = KMPageEditType.reverse.rawValue
  349. item?.toolTip = NSLocalizedString("Reverse", comment: "")
  350. item?.titleName = NSLocalizedString("Reverse", comment: "")
  351. item?.boxImagePosition = KMToolBoxImagePosition.left
  352. item?.btnAction = #selector(reverseMenuAction)
  353. let menuItem = NSMenuItem.init(title: "Reverse", action: #selector(reverseMenuAction), target: self)
  354. item?.menuFormRepresentation = menuItem
  355. } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
  356. item?.image = NSImage(named: "KMImageNameMainToolPageDelete")
  357. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageDelete")
  358. item?.target = self
  359. item?.btnTag = KMPageEditType.delete.rawValue
  360. item?.toolTip = NSLocalizedString("Delete", comment: "")
  361. item?.titleName = NSLocalizedString("", comment: "")
  362. item?.boxImagePosition = KMToolBoxImagePosition.left
  363. item?.btnAction = #selector(deleteMenuAction)
  364. let menuItem = NSMenuItem.init(title: "Delete", action: #selector(deleteMenuAction), target: self)
  365. item?.menuFormRepresentation = menuItem
  366. }
  367. return item
  368. }
  369. }
  370. // MARK: - KMSelectPopButtonDelegate
  371. extension KMPDFEditToolbar: KMSelectPopButtonDelegate {
  372. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  373. guard let callback = self.itemClick else {
  374. return
  375. }
  376. callback(self, KMPageEditType.pageRange.rawValue)
  377. }
  378. func km_controlTextDidChange(_ obj: KMDesignSelect) {
  379. }
  380. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  381. guard let callback = self.pageRangeValueDidChange else {
  382. return
  383. }
  384. callback(self.pageRangeView?.stringValue, nil)
  385. }
  386. }