KMPDFEditToolbar.swift 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. //
  2. // KMPDFEditToolbar.swift
  3. // EaseUS PDF Editor
  4. //
  5. // Created by tangchao on 2023/5/4.
  6. //
  7. import Cocoa
  8. enum KMPageEditType: Int {
  9. case none = 0
  10. case pageRange = 1
  11. case leftRotate
  12. case rightRotate
  13. case insert
  14. case extract
  15. case replace
  16. case split
  17. case reverse
  18. case copy
  19. case delete
  20. case zoomOut
  21. case zoomIn
  22. case paste = 100
  23. // static let none: KMPageEditType = KMPageEditType(rawValue: 0)!
  24. // static let paste: KMPageEditType = KMPageEditType(rawValue: 100)!
  25. static var insert_files: Int {
  26. get {
  27. return self.insert.rawValue + 1000
  28. }
  29. }
  30. static var insert_blank_page: Int {
  31. get {
  32. return self.insert.rawValue + 1001
  33. }
  34. }
  35. static var insert_custom_page: Int {
  36. get {
  37. return self.insert.rawValue + 1002
  38. }
  39. }
  40. static var insert_fromImage: Int {
  41. get {
  42. return self.insert.rawValue + 1003
  43. }
  44. }
  45. static var insert_fromClipboard: Int {
  46. get {
  47. return self.insert.rawValue + 1004
  48. }
  49. }
  50. static var insert_fromScanner: Int {
  51. get {
  52. return self.insert.rawValue + 1005
  53. }
  54. }
  55. static var extract_selected_pages: Int {
  56. get {
  57. return self.extract.rawValue + 2000
  58. }
  59. }
  60. static var split_selected_pages: Int {
  61. get {
  62. return self.split.rawValue + 3000
  63. }
  64. }
  65. }
  66. class KMPDFEditToolbar: NSView {
  67. private var toolBar_ = KMToolbarView.init(identifier: "KMPageEditIdentifier")
  68. var toolBar: KMToolbarView {
  69. get {
  70. return self.toolBar_
  71. }
  72. }
  73. private var zoomOutButton_: NSButton?
  74. private var zoomInButton_: NSButton?
  75. open var zoomOutButton: NSButton? {
  76. get {
  77. return self.zoomOutButton_
  78. }
  79. }
  80. open var zoomInButton: NSButton? {
  81. get {
  82. return self.zoomInButton_
  83. }
  84. }
  85. private var pageRangeView_: KMDesignSelect?
  86. open var pageRangeView: KMDesignSelect? {
  87. get {
  88. return self.pageRangeView_
  89. }
  90. }
  91. private var pageRangeViewItems = [KMTools.pageRangeTypeString(pageRange: .all),
  92. KMTools.pageRangeTypeString(pageRange: .odd),
  93. KMTools.pageRangeTypeString(pageRange: .even),
  94. KMTools.pageRangeTypeString(pageRange: .horizontal),
  95. KMTools.pageRangeTypeString(pageRange: .vertical),
  96. KMTools.pageRangeTypeString(pageRange: .custom)]
  97. var itemClick: KMItemClickBlock<KMPDFEditToolbar>?
  98. var pageRangeitemClick: ((KMPageRange)->Void)?
  99. var pageRangeValueDidChange: KMValueDidChangeBlock?
  100. lazy var insertItemStrings: [String] = {
  101. return [NSLocalizedString("Blank Page", comment: ""),
  102. NSLocalizedString("Blank Page - Custom...", comment: ""),
  103. NSLocalizedString("From PDF", comment: ""),
  104. NSLocalizedString("From Image", comment: ""),
  105. NSLocalizedString("From Clipboard", comment: ""),
  106. NSLocalizedString("Import From Scanner", comment: "")]
  107. }()
  108. private weak var popover: NSPopover?
  109. override init(frame frameRect: NSRect) {
  110. super.init(frame: frameRect)
  111. self.initDefaultValue()
  112. self.initSubViews()
  113. }
  114. required init?(coder: NSCoder) {
  115. super.init(coder: coder)
  116. self.initDefaultValue()
  117. self.initSubViews()
  118. }
  119. public func initDefaultValue() {
  120. }
  121. public func initSubViews() {
  122. self.addSubview(self.toolBar)
  123. self.toolBar.frame = self.bounds
  124. self.toolBar.autoresizingMask = [.width, .height]
  125. self.toolBar.delegate = self
  126. // let rightItemView = self.rightItemView
  127. // self.addSubview(rightItemView)
  128. // rightItemView.frame = NSMakeRect(NSWidth(self.frame)-80, 0, 80, NSHeight(self.frame))
  129. // rightItemView.autoresizingMask = [.minXMargin, .height]
  130. }
  131. // MARK: - Publick Methods
  132. public func setPageRangeString(_ string: String) {
  133. self.pageRangeView?.stringValue = string
  134. self.pageRangeView?.editable = true
  135. }
  136. public func getItem(for itemId: String) -> KMToolbarItemView? {
  137. return self.toolBar.itemForItemIdentifier(itemId)
  138. }
  139. public func selectItem(for itemId: String) {
  140. self.getItem(for: itemId)?.isSelected = true
  141. }
  142. public func unSelectItem(for itemId: String) {
  143. self.getItem(for: itemId)?.isSelected = false
  144. }
  145. // MARK: - Actions
  146. @objc private func zoomOutButtonAction() {
  147. guard let callback = self.itemClick else {
  148. return
  149. }
  150. callback(self, KMPageEditType.zoomOut.rawValue)
  151. }
  152. @objc private func zoomInButtonAction() {
  153. guard let callback = self.itemClick else {
  154. return
  155. }
  156. callback(self, KMPageEditType.zoomIn.rawValue)
  157. }
  158. // MARK: toolBar 菜单事件
  159. @objc func pageRangeMenuAction(sender: KMToolbarClickButton) {
  160. if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
  161. subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  162. }
  163. }
  164. @objc private func _pageRangeAction(sender: NSMenuItem) {
  165. guard let type = KMPageRange(rawValue: sender.tag) else {
  166. return
  167. }
  168. guard let callback = self.pageRangeitemClick else {
  169. return
  170. }
  171. callback(type)
  172. }
  173. @objc func leftRotateMenuAction(sender: KMToolbarClickButton?) {
  174. guard let callback = self.itemClick else {
  175. return
  176. }
  177. callback(self, KMPageEditType.leftRotate.rawValue)
  178. }
  179. @objc func rightRotateMenuAction(sender: KMToolbarClickButton?) {
  180. guard let callback = self.itemClick else {
  181. return
  182. }
  183. callback(self, KMPageEditType.rightRotate.rawValue)
  184. }
  185. @objc func insertMenuAction(sender: KMToolbarClickButton) {
  186. guard let callback = self.itemClick else {
  187. return
  188. }
  189. callback(self, KMPageEditType.insert.rawValue)
  190. if let _popover = self.popover, _popover.isShown {
  191. self.popover?.close()
  192. self.popover = nil
  193. return
  194. }
  195. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(self.insertItemStrings)
  196. let popover: NSPopover = NSPopover.init()
  197. self.popover = popover
  198. popover.contentViewController = vc
  199. popover.animates = true
  200. popover.behavior = .semitransient
  201. popover.setValue(true, forKey: "shouldHideAnchor")
  202. 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)
  203. vc.downCallback = { [weak self] downEntered, count in
  204. self?.popover?.close()
  205. self?.popover = nil
  206. if (!downEntered) {
  207. return
  208. }
  209. guard let index = self?.insertItemStrings.firstIndex(of: count) else {
  210. return
  211. }
  212. if (index == 0) {
  213. self?.item_insertBlankPage(sender: nil)
  214. } else if (index == 1) {
  215. self?.item_insertCustomPage(sender: nil)
  216. } else if (index == 2) {
  217. self?.item_insertFile(sender: nil)
  218. }
  219. }
  220. }
  221. @objc func extractMenuAction(sender: KMToolbarClickButton?) {
  222. // guard let callback = self.itemClick else {
  223. // return
  224. // }
  225. // callback(self, KMPageEditType.insert.rawValue)
  226. if let _popover = self.popover, _popover.isShown {
  227. self.popover?.close()
  228. self.popover = nil
  229. return
  230. }
  231. let array = [NSLocalizedString("Extract selected pages", comment: ""), NSLocalizedString("Extract", comment: "")]
  232. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(array)
  233. let popover: NSPopover = NSPopover.init()
  234. self.popover = popover
  235. popover.contentViewController = vc
  236. popover.animates = true
  237. popover.behavior = .semitransient
  238. popover.setValue(true, forKey: "shouldHideAnchor")
  239. if let data = sender {
  240. popover.show(relativeTo: CGRect(x: sender?.bounds.origin.x ?? 0, y: 10, width: sender?.bounds.size.width ?? 0, height: sender?.bounds.size.height ?? 0), of: data, preferredEdge: .maxY)
  241. }
  242. vc.downCallback = { [weak self] downEntered, count in
  243. self?.popover?.close()
  244. self?.popover = nil
  245. if (!downEntered) {
  246. return
  247. }
  248. guard let index = array.firstIndex(of: count) else {
  249. return
  250. }
  251. if (index == 0) {
  252. guard let callback = self?.itemClick else {
  253. return
  254. }
  255. callback(self, KMPageEditType.extract_selected_pages)
  256. } else if (index == 1) {
  257. guard let callback = self?.itemClick else {
  258. return
  259. }
  260. callback(self, KMPageEditType.extract.rawValue)
  261. }
  262. }
  263. }
  264. @objc private func _extractMenuItemAction(_ sender: NSMenuItem) {
  265. if (sender.tag == 1) {
  266. guard let callback = self.itemClick else {
  267. return
  268. }
  269. callback(self, KMPageEditType.extract_selected_pages)
  270. } else if (sender.tag == 2) {
  271. guard let callback = self.itemClick else {
  272. return
  273. }
  274. callback(self, KMPageEditType.extract.rawValue)
  275. }
  276. }
  277. @objc func replaceMenuAction(sender: KMToolbarClickButton?) {
  278. guard let callback = self.itemClick else {
  279. return
  280. }
  281. callback(self, KMPageEditType.replace.rawValue)
  282. }
  283. @objc func splitMenuAction(sender: KMToolbarClickButton) {
  284. if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
  285. subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  286. }
  287. }
  288. @objc func reverseMenuAction(sender: KMToolbarClickButton) {
  289. guard let callback = self.itemClick else {
  290. return
  291. }
  292. callback(self, KMPageEditType.reverse.rawValue)
  293. }
  294. @objc func copyMenuAction(sender: KMToolbarClickButton) {
  295. guard let callback = self.itemClick else {
  296. return
  297. }
  298. callback(self, KMPageEditType.copy.rawValue)
  299. }
  300. @objc func pasteMenuAction(sender: KMToolbarClickButton) {
  301. guard let callback = self.itemClick else {
  302. return
  303. }
  304. callback(self, KMPageEditType.paste.rawValue)
  305. }
  306. @objc func deleteMenuAction(sender: KMToolbarClickButton) {
  307. guard let callback = self.itemClick else {
  308. return
  309. }
  310. callback(self, KMPageEditType.delete.rawValue)
  311. }
  312. @objc func item_insertFile(sender: NSMenuItem?) {
  313. guard let callback = self.itemClick else {
  314. return
  315. }
  316. callback(self, KMPageEditType.insert_files)
  317. }
  318. @objc func item_insertBlankPage(sender: NSMenuItem?) {
  319. guard let callback = self.itemClick else {
  320. return
  321. }
  322. callback(self, KMPageEditType.insert_blank_page)
  323. }
  324. @objc func item_insertCustomPage(sender: NSMenuItem?) {
  325. guard let callback = self.itemClick else {
  326. return
  327. }
  328. callback(self, KMPageEditType.insert_custom_page)
  329. }
  330. @objc func item_insertFromImage(sender: NSMenuItem?) {
  331. guard let callback = self.itemClick else {
  332. return
  333. }
  334. callback(self, KMPageEditType.insert_fromImage)
  335. }
  336. @objc func item_insertFromClipboard(sender: NSMenuItem?) {
  337. guard let callback = self.itemClick else {
  338. return
  339. }
  340. callback(self, KMPageEditType.insert_fromClipboard)
  341. }
  342. @objc func item_insertFromScanner(sender: NSMenuItem?) {
  343. guard let callback = self.itemClick else {
  344. return
  345. }
  346. callback(self, KMPageEditType.insert_fromScanner)
  347. }
  348. @objc private func _splitAction(sender: NSMenuItem) {
  349. if (sender.tag == 1) {
  350. guard let callback = self.itemClick else {
  351. return
  352. }
  353. callback(self, KMPageEditType.split.rawValue)
  354. return
  355. }
  356. guard let callback = self.itemClick else {
  357. return
  358. }
  359. callback(self, KMPageEditType.split_selected_pages)
  360. }
  361. private lazy var rightItemView: NSView = {
  362. let view = NSView()
  363. let size: CGFloat = 28
  364. let y: CGFloat = 6
  365. let zoomInButton = NSButton()
  366. view.addSubview(zoomInButton)
  367. zoomInButton.frame = NSMakeRect(0, y, size, size)
  368. zoomInButton.isBordered = false
  369. zoomInButton.image = NSImage(named: "KMImageNamePageEditZoomIn")
  370. zoomInButton.target = self
  371. zoomInButton.action = #selector(zoomInButtonAction)
  372. self.zoomInButton_ = zoomInButton
  373. let zoomOutButton = NSButton()
  374. view.addSubview(zoomOutButton)
  375. zoomOutButton.frame = NSMakeRect(size+7, y, size, size)
  376. zoomOutButton.isBordered = false
  377. zoomOutButton.image = NSImage(named: "KMImageNamePageEditZoomOut")
  378. zoomOutButton.target = self
  379. zoomOutButton.action = #selector(zoomOutButtonAction)
  380. self.zoomOutButton_ = zoomOutButton
  381. return view
  382. }()
  383. }
  384. // MARK: - KMNewToolbarDelegate
  385. extension KMPDFEditToolbar: KMToolbarViewDelegate {
  386. func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  387. return [KMToolbarPageEditPageRangeItemIdentifier,
  388. // KMToolbarPageEditLeftRotateItemIdentifier,
  389. // KMToolbarPageEditRightRotateItemIdentifier,
  390. KMToolbarDividerItemIdentifier,
  391. KMToolbarPageEditInsetItemIdentifier,
  392. KMToolbarPageEditReplaceItemIdentifier,
  393. KMToolbarPageEditExtractItemIdentifier,
  394. KMToolbarPageEditSplitItemIdentifier, KMToolbarDividerItemIdentifier,
  395. KMToolbarPageEditReverseItemIdentifier,
  396. KMToolbarPageEditCopyItemIdentifier,
  397. KMToolbarPageEditPasteItemIdentifier, KMToolbarPageEditRotateItemIdentifier,
  398. KMToolbarPageEditDeleteItemIdentifier]
  399. }
  400. func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView {
  401. let item: KMToolbarItemView? = KMToolbarCustomItemView(itemIdentifier: identifier)
  402. if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
  403. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRange)
  404. item?.target = self
  405. item?.btnTag = KMPageEditType.pageRange.rawValue
  406. // item?.toolTip = NSLocalizedString("pageRange", comment: "")
  407. item?.titleName = NSLocalizedString("Page Range", comment: "")
  408. item?.boxImagePosition = .imageExpandLeft
  409. // item?.btnAction = #selector(pageRangeMenuAction)
  410. item?.needExpandAction = true
  411. // let view = NSView()
  412. // item?.addSubview(view)
  413. // view.frame = item!.bounds
  414. // view.autoresizingMask = [.width,.height]
  415. // view.wantsLayer = true
  416. // view.layer?.backgroundColor = NSColor.km_init(hex: "#F7F8FA").cgColor
  417. // let comBoxView = KMDesignSelect(withType: .Combox)
  418. // view.addSubview(comBoxView.view)
  419. // comBoxView.view.frame = NSMakeRect(0, 0.5, NSWidth(view.frame), 21)
  420. // comBoxView.view.autoresizingMask = [.width]
  421. // comBoxView.removeAllItems()
  422. // comBoxView.addItems(withObjectValues: self.pageRangeViewItems)
  423. // comBoxView.selectItem(at: 0)
  424. // comBoxView.placeholderString = NSLocalizedString("eg .1,3-5,10", comment: "")
  425. // comBoxView.editable = false
  426. // comBoxView.delete = self
  427. // self.pageRangeView_ = comBoxView
  428. let menuItem = NSMenuItem.init(title: NSLocalizedString("Page Range", comment: ""), action: #selector(pageRangeMenuAction), target: self)
  429. let subMenu = NSMenu()
  430. subMenu.addItem(title: NSLocalizedString("Odd Pages Only", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.odd.rawValue)
  431. subMenu.addItem(title: NSLocalizedString("Even Pages Only", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.even.rawValue)
  432. subMenu.addItem(title: NSLocalizedString("Portrait pages", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.vertical.rawValue)
  433. subMenu.addItem(title: NSLocalizedString("Landscape pages", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.horizontal.rawValue)
  434. subMenu.addItem(title: NSLocalizedString("All Pages", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.all.rawValue)
  435. subMenu.addItem(.separator())
  436. subMenu.addItem(title: NSLocalizedString("Customize", comment: ""), action: #selector(_pageRangeAction), target: self, tag: KMPageRange.custom.rawValue)
  437. menuItem.submenu = subMenu
  438. item?.menuFormRepresentation = menuItem
  439. } else if (identifier == KMToolbarPageEditRotateItemIdentifier) {
  440. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  441. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  442. item?.target = self
  443. item?.btnTag = KMPageEditType.rightRotate.rawValue
  444. item?.toolTip = NSLocalizedString("Rotate", comment: "")
  445. item?.titleName = NSLocalizedString("Rotate", comment: "")
  446. item?.boxImagePosition = .imageLeft
  447. item?.btnAction = #selector(rightRotateMenuAction)
  448. let menuItem = NSMenuItem.init(title: NSLocalizedString("Rotate", comment: ""), action: #selector(rightRotateMenuAction), target: self)
  449. item?.menuFormRepresentation = menuItem
  450. } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
  451. item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  452. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  453. item?.target = self
  454. item?.btnTag = KMPageEditType.leftRotate.rawValue
  455. item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
  456. item?.titleName = NSLocalizedString("", comment: "")
  457. item?.boxImagePosition = .imageLeft
  458. item?.btnAction = #selector(leftRotateMenuAction)
  459. let menuItem = NSMenuItem.init(title: NSLocalizedString("Rotate Left", comment: ""), action: #selector(leftRotateMenuAction), target: self)
  460. item?.menuFormRepresentation = menuItem
  461. } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
  462. item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
  463. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
  464. item?.target = self
  465. item?.btnTag = KMPageEditType.rightRotate.rawValue
  466. item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
  467. item?.titleName = NSLocalizedString("", comment: "")
  468. item?.boxImagePosition = .imageLeft
  469. item?.btnAction = #selector(rightRotateMenuAction)
  470. let menuItem = NSMenuItem.init(title: NSLocalizedString("Rotate Right", comment: ""), action: #selector(rightRotateMenuAction), target: self)
  471. item?.menuFormRepresentation = menuItem
  472. } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
  473. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  474. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  475. item?.target = self
  476. item?.btnTag = KMPageEditType.insert.rawValue
  477. // item?.toolTip = NSLocalizedString("Inserting pages into an existing PDF", comment: "")
  478. item?.titleName = NSLocalizedString("Insert", comment: "")
  479. item?.boxImagePosition = .imageExpandLeft
  480. // item?.btnAction = #selector(insertMenuAction)
  481. item?.needExpandAction = true
  482. let menuItem = NSMenuItem.init(title: NSLocalizedString("Insert", comment: ""), action: nil, target: self)
  483. let subMenu = NSMenu()
  484. menuItem.submenu = subMenu
  485. _ = subMenu.addItem(title: self.insertItemStrings[0], action: #selector(item_insertBlankPage) , target: self)
  486. _ = subMenu.addItem(title: self.insertItemStrings[1], action: #selector(item_insertCustomPage) , target: self)
  487. _ = subMenu.addItem(title: self.insertItemStrings[2], action: #selector(item_insertFile) , target: self)
  488. _ = subMenu.addItem(title: self.insertItemStrings[3], action: #selector(item_insertFromImage) , target: self)
  489. _ = subMenu.addItem(title: self.insertItemStrings[4], action: #selector(item_insertFromClipboard) , target: self)
  490. _ = subMenu.addItem(title: self.insertItemStrings[5], action: #selector(item_insertFromScanner) , target: self)
  491. item?.menuFormRepresentation = menuItem
  492. } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
  493. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  494. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  495. item?.target = self
  496. item?.btnTag = KMPageEditType.extract.rawValue
  497. // item?.toolTip = NSLocalizedString("Exctract selected pages", comment: "")
  498. item?.titleName = NSLocalizedString("Extract", comment: "")
  499. item?.boxImagePosition = .imageExpandLeft
  500. // item?.btnAction = #selector(extractMenuAction)
  501. item?.needExpandAction = true
  502. let menuItem = NSMenuItem.init(title: NSLocalizedString("Extract", comment: ""), action: nil, target: self)
  503. let subMenu = NSMenu()
  504. menuItem.submenu = subMenu
  505. subMenu.addItem(title: NSLocalizedString("Extract selected pages", comment: ""), action: #selector(_extractMenuItemAction) , target: self, tag: 1)
  506. subMenu.addItem(title: NSLocalizedString("Extract", comment: ""), action: #selector(_extractMenuItemAction) , target: self, tag: 2)
  507. item?.menuFormRepresentation = menuItem
  508. } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
  509. item?.image = NSImage(named: KMImageNameToolbarReplace)
  510. item?.alternateImage = NSImage(named: KMImageNameToolbarReplace)
  511. item?.target = self
  512. item?.btnTag = KMPageEditType.replace.rawValue
  513. item?.toolTip = NSLocalizedString("Replace", comment: "")
  514. item?.titleName = NSLocalizedString("Replace", comment: "")
  515. item?.boxImagePosition = .imageLeft
  516. item?.btnAction = #selector(replaceMenuAction)
  517. let menuItem = NSMenuItem.init(title: NSLocalizedString("Replace", comment: ""), action: #selector(replaceMenuAction), target: self)
  518. item?.menuFormRepresentation = menuItem
  519. } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
  520. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  521. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  522. item?.target = self
  523. item?.btnTag = KMPageEditType.split.rawValue
  524. // item?.toolTip = NSLocalizedString("Split and save selected PDF pages as a new separate document", comment: "")
  525. item?.titleName = NSLocalizedString("Split", comment: "")
  526. item?.boxImagePosition = .imageExpandLeft
  527. item?.needExpandAction = true
  528. // item?.btnAction = #selector(splitMenuAction)
  529. let menuItem = NSMenuItem.init(title: NSLocalizedString("Split", comment: ""), action: nil, target: self)
  530. let subMenu = NSMenu()
  531. subMenu.addItem(title: NSLocalizedString("Split selected pages", comment: ""), action: #selector(_splitAction), target: self, tag: 0)
  532. subMenu.addItem(title: NSLocalizedString("Split", comment: ""), action: #selector(_splitAction), target: self, tag: 1)
  533. menuItem.submenu = subMenu
  534. item?.menuFormRepresentation = menuItem
  535. } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
  536. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  537. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  538. item?.target = self
  539. item?.btnTag = KMPageEditType.reverse.rawValue
  540. item?.toolTip = NSLocalizedString("Reverse", comment: "")
  541. item?.titleName = NSLocalizedString("Reverse", comment: "")
  542. item?.boxImagePosition = .imageLeft
  543. item?.btnAction = #selector(reverseMenuAction)
  544. let menuItem = NSMenuItem.init(title: NSLocalizedString("Reverse", comment: ""), action: #selector(reverseMenuAction), target: self)
  545. item?.menuFormRepresentation = menuItem
  546. } else if (identifier == KMToolbarPageEditCopyItemIdentifier) {
  547. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  548. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  549. item?.target = self
  550. item?.btnTag = KMPageEditType.delete.rawValue
  551. item?.toolTip = NSLocalizedString("Copy", comment: "")
  552. item?.titleName = NSLocalizedString("Copy", comment: "")
  553. item?.boxImagePosition = .imageLeft
  554. item?.btnAction = #selector(copyMenuAction)
  555. let menuItem = NSMenuItem.init(title: NSLocalizedString("Copy", comment: ""), action: #selector(copyMenuAction), target: self)
  556. item?.menuFormRepresentation = menuItem
  557. } else if (identifier == KMToolbarPageEditPasteItemIdentifier) {
  558. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  559. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  560. item?.target = self
  561. item?.btnTag = KMPageEditType.delete.rawValue
  562. item?.toolTip = NSLocalizedString("Paste", comment: "")
  563. item?.titleName = NSLocalizedString("Paste", comment: "")
  564. item?.boxImagePosition = .imageLeft
  565. item?.btnAction = #selector(pasteMenuAction)
  566. let menuItem = NSMenuItem.init(title: NSLocalizedString("Paste", comment: ""), action: #selector(pasteMenuAction), target: self)
  567. item?.menuFormRepresentation = menuItem
  568. } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
  569. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  570. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  571. item?.target = self
  572. item?.btnTag = KMPageEditType.delete.rawValue
  573. item?.toolTip = NSLocalizedString("Delete", comment: "")
  574. item?.titleName = NSLocalizedString("Delete", comment: "")
  575. item?.boxImagePosition = .imageLeft
  576. item?.btnAction = #selector(deleteMenuAction)
  577. let menuItem = NSMenuItem.init(title: NSLocalizedString("Delete", comment: ""), action: #selector(deleteMenuAction), target: self)
  578. item?.menuFormRepresentation = menuItem
  579. }
  580. return item!
  581. }
  582. }
  583. // MARK: - KMSelectPopButtonDelegate
  584. extension KMPDFEditToolbar: KMSelectPopButtonDelegate {
  585. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  586. guard let callback = self.itemClick else {
  587. return
  588. }
  589. callback(self, KMPageEditType.pageRange.rawValue)
  590. }
  591. func km_controlTextDidChange(_ obj: KMDesignSelect) {
  592. }
  593. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  594. guard let callback = self.pageRangeValueDidChange else {
  595. return
  596. }
  597. callback(self.pageRangeView?.stringValue, nil)
  598. }
  599. }