KMToolbarViewController.swift 118 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079
  1. //
  2. // KMToolbarViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lxy on 2022/12/2.
  6. //
  7. import Cocoa
  8. @objc enum KMToolbarViewType : Int {
  9. case None
  10. case Main
  11. case Annatiton
  12. case Page
  13. case Conversion
  14. case ScanOCR
  15. case editPDF
  16. case Form
  17. case FillSign
  18. case Tool
  19. case redact
  20. case Move
  21. case Magnify
  22. case Select
  23. case SelectZoom
  24. case LeftPanel
  25. case RightPanel
  26. case viewSetting
  27. func isToolMode() -> Bool {
  28. return (self == .Move || self == .Magnify || self == .Select || self == .SelectZoom)
  29. }
  30. func itemIdentifier() -> String {
  31. if (self == .Annatiton) {
  32. return KMDocumentAnnotationToolbarItemIdentifier
  33. } else if (self == .Page) {
  34. return KMDocumentPageToolbarItemIdentifier
  35. } else if (self == .Conversion) {
  36. return KMDocumentConversonToolbarItemIdentifier
  37. } else if (self == .ScanOCR) {
  38. return KMDocumentScanOCRToolbarItemIdentifier
  39. } else if (self == .editPDF) {
  40. return KMDocumentEditToolbarItemIdentifier
  41. } else if (self == .Form) {
  42. return KMDocumentFormToolbarItemIdentifier
  43. } else if (self == .FillSign) {
  44. return KMDocumentFillSginToolbarItemIdentifier
  45. } else if (self == .Tool) {
  46. return KMDocumentToolToolbarItemIdentifier
  47. } else if (self == .Move) {
  48. return KMToolbarMoveToolModeItemIdentifier
  49. } else if (self == .Magnify) {
  50. return KMToolbarMagnifyToolModeItemIdentifier
  51. } else if (self == .Select) {
  52. return KMToolbarSelectToolModeItemIdentifier
  53. } else if (self == .SelectZoom) {
  54. return KMToolbarZoomToSelectionItemIdentifier
  55. } else if (self == .LeftPanel) {
  56. return KMLeftControlToolbarItemIdentifier
  57. } else if (self == .RightPanel) {
  58. return KMRightControlToolbarItemIdentifier
  59. }
  60. return ""
  61. }
  62. }
  63. @objc enum KMToolbarType: Int {
  64. /// conversion
  65. case word = 3000
  66. case excel = 3001
  67. case ppt = 3002
  68. case rtf = 3003
  69. case csv = 3004
  70. case html = 3005
  71. case conversion_text = 3006
  72. case conversion_image = 3007
  73. /// tool
  74. case compress = 8000
  75. case merge = 8001
  76. case fileCompare = 8002
  77. case secure = 8003
  78. case redact = 8004
  79. case watermark = 8005
  80. case background = 8006
  81. case headerAndFooter = 8007
  82. case bates = 8008
  83. case crop = 8009
  84. case comparison = 8010
  85. }
  86. @objc protocol KMToolbarViewControllerDelegate {
  87. @objc optional func changeAnnotationModeAction(item:KMToolbarClickButton)
  88. @objc optional func showPDFLayoutModeAction(show:Bool)
  89. @objc optional func changePDFViewZoomInAction()
  90. @objc optional func changePDFViewZoomOutAction()
  91. @objc optional func changePDFViewGotoNextPageAction()
  92. @objc optional func changePDFViewGoToPreviousPageAction()
  93. @objc optional func changePDFViewGotoBackAction()
  94. @objc optional func changePDFViewGoToForwardAction()
  95. @objc optional func aiTranslationPDFFileAction()
  96. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomSting : String)
  97. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, zoomModel selectedTag:Int)
  98. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareAction toolbarItem: KMToolbarItemView)
  99. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareDocument item:NSMenuItem)
  100. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareFlatten item:NSMenuItem)
  101. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, shareOriginalPDF item:NSMenuItem)
  102. @objc optional func toolbarViewController(_ viewController: KMToolbarViewController, clickMode toolMode: KMToolbarViewType, toolbar toolbarItem: KMToolbarItemView, _ pages: [Int])
  103. @objc optional func toolbarViewController(_ viewController: KMToolbarViewController, clickChaildToolType: KMToolbarType, toolbar toolbarItem: KMToolbarItemView)
  104. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, scanOCRModel selectedTag:Int)
  105. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, itemDidClick toolbarItem: KMToolbarItemView)
  106. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, searchAction searchString: String, forward: Bool)
  107. @objc optional func toolbarViewController(_ viewController:KMToolbarViewController, menuItemDidClick toolbarItem: KMToolbarItemView, index: Int, info: Any?)
  108. }
  109. class KMToolbarViewController: NSViewController, NSTextFieldDelegate {
  110. var toolbar : KMToolbarView!
  111. var toolbarType : KMToolbarViewType = KMToolbarViewType.None
  112. var toolbarItems : [String : Any] = [:]
  113. @IBOutlet weak var mainWindowController : MainWindowController!
  114. open weak var delegate: KMToolbarViewControllerDelegate?
  115. @IBOutlet var zoomButton: NSPopUpButton!
  116. @IBOutlet var zoomView: NSView!
  117. @IBOutlet weak var zoomTextField: NSTextField!
  118. var pdfView : CPDFListView = CPDFListView()
  119. var shareButton = KMToolbarClickButton()
  120. private var bottomLine = NSView()
  121. // 是否显示所有注释
  122. var isShowAllAnnotations = true
  123. var ignoreCurrentAnnotationTypeChange = false
  124. private var _currentItemView: KMToolbarItemView?
  125. override func viewDidLoad() {
  126. super.viewDidLoad()
  127. self.zoomTextField.delegate = self
  128. NotificationCenter.default.addObserver(self, selector: #selector(listViewAnnotationTypeChangeNotification), name: Notification.Name("CPDFListViewAnnotationTypeChangeNotification"), object: nil)
  129. NotificationCenter.default.addObserver(self, selector: #selector(listViewAnnotationTypeChangeNotification), name: Notification.Name("CPDFListViewToolModeChangeNotification"), object: nil)
  130. }
  131. override func loadView() {
  132. super.loadView()
  133. self.toolbar = KMToolbarView.init(identifier: "KMToolbar_New")
  134. self.toolbar.frame = self.view.bounds
  135. self.toolbar.autoresizingMask = [.width,.height]
  136. self.toolbar.delegate = self
  137. self.view.addSubview(self.toolbar)
  138. self.view.addSubview(self.bottomLine)
  139. self.bottomLine.frame = NSMakeRect(0, 0, NSWidth(self.view.bounds), 1)
  140. self.bottomLine.autoresizingMask = [.width]
  141. self.bottomLine.wantsLayer = true
  142. self.bottomLine.layer?.backgroundColor = NSColor.km_init(hex: "#0000001A").cgColor
  143. }
  144. func updateType(newType:KMToolbarViewType) {
  145. if newType != toolbarType {
  146. toolbarType = newType
  147. if self.toolbar != nil && self.toolbar.superview != nil {
  148. self.toolbar.removeFromSuperview()
  149. }
  150. self.toolbar = KMToolbarView.init(identifier: "KMToolbar_New")
  151. self.toolbar.frame = self.view.bounds
  152. self.toolbar.autoresizingMask = [.width,.height]
  153. self.toolbar.delegate = self
  154. self.view.addSubview(self.toolbar)
  155. }
  156. }
  157. func reloadateToolbar() -> Void {
  158. toolbar.reloadData()
  159. }
  160. func resetToolbar() -> Void {
  161. for item in toolbar.items {
  162. item.isSelected = false
  163. }
  164. }
  165. // MARK: Action
  166. @IBAction func changeAnnotationMode(item: KMToolbarClickButton) {
  167. self.delegate?.changeAnnotationModeAction?(item: item)
  168. self._itemSetPromptFlag(item: item.clickObject as? KMToolbarItemView)
  169. }
  170. @IBAction func leftControllButtonAction(item: KMToolbarClickButton) {
  171. let tag = KMToolbarViewType(rawValue: item.tag) ?? .None
  172. if tag == .editPDF {
  173. if IAPProductsManager.default().isAvailableAllFunction() == false {
  174. KMPreference.shared.openDocumentType = .newWindow
  175. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  176. return
  177. }
  178. Task { @MainActor in
  179. self.delegate?.toolbarViewController?(self, clickMode: tag, toolbar: item.clickObject as! KMToolbarItemView, [])
  180. }
  181. } else {
  182. self.delegate?.toolbarViewController?(self, clickMode: tag, toolbar: item.clickObject as! KMToolbarItemView, [])
  183. }
  184. self._itemSetPromptFlag(item: item.clickObject as? KMToolbarItemView)
  185. }
  186. @objc private func _itemAction(_ item: KMToolbarClickButton) {
  187. if let data = item.clickObject as? KMToolbarItemView {
  188. if data.itemIdentifier == KMToolbarComparisonItemIdentifier {
  189. self._currentItemView = data
  190. if let subMenu = data.menuFormRepresentation?.submenu {
  191. subMenu.popUp(positioning: nil, at: item.frame.origin, in: item.superview)
  192. }
  193. return
  194. }
  195. }
  196. let itemView = item.clickObject as! KMToolbarItemView
  197. if itemView.itemIdentifier == KMDocumentRedactToolbarItemIdentifier {
  198. self.delegate?.toolbarViewController?(self, clickMode: .redact, toolbar: itemView, [])
  199. } else {
  200. self.delegate?.toolbarViewController?(self, itemDidClick: item.clickObject as! KMToolbarItemView)
  201. }
  202. self._itemSetPromptFlag(item: item.clickObject as? KMToolbarItemView)
  203. }
  204. @objc private func _menuItemAction(_ item: NSMenuItem) {
  205. guard let itemId = item.representedObject as? String else {
  206. NSSound.beep()
  207. return
  208. }
  209. let item_ = self.toolbarItemFindItemIdentifiers(value: itemId)
  210. self.delegate?.toolbarViewController?(self, menuItemDidClick: item_, index: 0, info: nil)
  211. self._itemSetPromptFlag(item: item_)
  212. }
  213. @objc private func _comparisonAction(sender: NSMenuItem) {
  214. if let data = self._currentItemView {
  215. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  216. } else {
  217. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarComparisonItemIdentifier), index: sender.tag, info: nil)
  218. }
  219. self._itemSetPromptFlag(itemIdentifier: KMToolbarComparisonItemIdentifier)
  220. }
  221. @IBAction func showPDFLayoutMode(sender: KMToolbarClickButton) {
  222. let item = sender.clickObject as? KMToolbarItemView
  223. if (item != nil) {
  224. item?.isSelected = !item!.isSelected
  225. }
  226. self.delegate?.showPDFLayoutModeAction?(show: true)
  227. self._itemSetPromptFlag(item: item)
  228. }
  229. @objc func cropMenuAction(item: KMToolbarItemView) {
  230. self.delegate?.toolbarViewController?(self, clickChaildToolType: .crop, toolbar: item)
  231. }
  232. @objc private func _cropAction(_ sender: NSMenuItem) {
  233. if let data = self._currentItemView {
  234. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  235. } else {
  236. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarCropIdentifier), index: sender.tag, info: nil)
  237. }
  238. self._itemSetPromptFlag(itemIdentifier: KMToolbarCropIdentifier)
  239. }
  240. @objc func batesMenuAction(sender: KMToolbarClickButton) {
  241. self._currentItemView = sender.clickObject as? KMToolbarItemView
  242. if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
  243. subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  244. }
  245. }
  246. @objc private func _batesAction(sender: NSMenuItem) {
  247. if let data = self._currentItemView {
  248. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  249. } else {
  250. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolBatesItemIdentifier), index: sender.tag, info: nil)
  251. }
  252. self._itemSetPromptFlag(itemIdentifier: KMToolbarToolBatesItemIdentifier)
  253. }
  254. @objc func headerfooterMenuAction(sender: KMToolbarClickButton) {
  255. self._currentItemView = sender.clickObject as? KMToolbarItemView
  256. if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
  257. subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  258. }
  259. }
  260. @objc private func _headerfooterAction(sender: NSMenuItem) {
  261. if let data = self._currentItemView {
  262. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  263. } else {
  264. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolHeaderFooterItemIdentifier), index: sender.tag, info: nil)
  265. }
  266. self._itemSetPromptFlag(itemIdentifier: KMToolbarToolHeaderFooterItemIdentifier)
  267. }
  268. @objc func backgroundMenuAction(sender: KMToolbarClickButton) {
  269. self._currentItemView = sender.clickObject as? KMToolbarItemView
  270. if let subMenu = (sender.clickObject as? KMToolbarItemView)?.menuFormRepresentation?.submenu {
  271. subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  272. }
  273. }
  274. @objc private func _backgroundAction(sender: NSMenuItem) {
  275. if let data = self._currentItemView {
  276. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  277. } else {
  278. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolBackgroundItemIdentifier), index: sender.tag, info: nil)
  279. }
  280. self._itemSetPromptFlag(itemIdentifier: KMToolbarToolBackgroundItemIdentifier)
  281. }
  282. @objc func watermarkMenuAction(sender: KMToolbarClickButton) {
  283. self._currentItemView = sender.clickObject as? KMToolbarItemView
  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 private func _watermarkAction(sender: NSMenuItem) {
  289. if let data = self._currentItemView {
  290. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  291. } else {
  292. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolWatermarkItemIdentifier), index: sender.tag, info: nil)
  293. }
  294. self._itemSetPromptFlag(itemIdentifier: KMToolbarToolWatermarkItemIdentifier)
  295. }
  296. @objc func redactMenuAction(sender: KMToolbarClickButton) {
  297. self.delegate?.toolbarViewController?(self, clickChaildToolType: .redact, toolbar: sender.clickObject as! KMToolbarItemView)
  298. self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
  299. }
  300. @objc func compressMenuAction(sender: KMToolbarClickButton) {
  301. self.delegate?.toolbarViewController?(self, clickChaildToolType: .compress, toolbar: sender.clickObject as! KMToolbarItemView)
  302. self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
  303. }
  304. @objc func secureMenuAction(sender: KMToolbarClickButton) {
  305. self.delegate?.toolbarViewController?(self, clickChaildToolType: .secure, toolbar: sender.clickObject as! KMToolbarItemView)
  306. self._itemSetPromptFlag(item: sender.clickObject as? KMToolbarItemView)
  307. }
  308. @objc private func _secureAction(sender: NSMenuItem) {
  309. if let data = self._currentItemView {
  310. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  311. } else {
  312. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolSecureItemIdentifier), index: sender.tag, info: nil)
  313. }
  314. self._itemSetPromptFlag(itemIdentifier: KMToolbarToolSecureItemIdentifier)
  315. }
  316. @objc func conversionMenuItemAction(sender: KMToolbarClickButton) {
  317. let item: KMToolbarItemView = sender.clickObject as! KMToolbarItemView
  318. var type: KMToolbarType = .word
  319. if (item.btnTag == KMToolbarType.excel.rawValue) {
  320. type = .excel
  321. } else if (item.btnTag == KMToolbarType.ppt.rawValue) {
  322. type = .ppt
  323. } else if (item.btnTag == KMToolbarType.rtf.rawValue) {
  324. type = .rtf
  325. } else if (item.btnTag == KMToolbarType.csv.rawValue) {
  326. type = .csv
  327. } else if (item.btnTag == KMToolbarType.html.rawValue) {
  328. type = .html
  329. } else if (item.btnTag == KMToolbarType.conversion_text.rawValue) {
  330. type = .conversion_text
  331. } else if (item.btnTag == KMToolbarType.conversion_image.rawValue) {
  332. type = .conversion_image
  333. }
  334. self.delegate?.toolbarViewController?(self, clickChaildToolType: type, toolbar: item)
  335. self._itemSetPromptFlag(item: item)
  336. }
  337. @objc private func _pdfToImageAction(sender: NSMenuItem) {
  338. if let data = self._currentItemView {
  339. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  340. } else {
  341. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionImageItemIdentifier), index: sender.tag, info: nil)
  342. }
  343. self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionImageItemIdentifier)
  344. }
  345. @objc private func _exportImageAction(sender: NSMenuItem) {
  346. if let data = self._currentItemView {
  347. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  348. } else {
  349. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionExportImageItemIdentifier), index: sender.tag, info: nil)
  350. }
  351. self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionExportImageItemIdentifier)
  352. }
  353. @objc private func _newPDFAction(sender: NSMenuItem) {
  354. if let data = self._currentItemView {
  355. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  356. } else {
  357. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarConversionCreatePDFItemIdentifier), index: sender.tag, info: nil)
  358. }
  359. self._itemSetPromptFlag(itemIdentifier: KMToolbarConversionCreatePDFItemIdentifier)
  360. }
  361. @IBAction func zoomModelSelectButtonAction(_ sender: NSPopUpButton) {
  362. self.delegate?.toolbarViewController?(self, zoomModel: sender.selectedTag())
  363. for item in sender.itemArray {
  364. item.state = .off
  365. }
  366. sender.selectedItem?.state = .on
  367. }
  368. @IBAction func zoomPDFViewButtonAction(sender:KMToolbarClickButton) {
  369. if sender.tag == 0 {
  370. self.delegate?.changePDFViewZoomOutAction?()
  371. } else if sender.tag == 1 {
  372. self.delegate?.changePDFViewZoomInAction?()
  373. } else if sender.tag == 2 {
  374. self.delegate?.changePDFViewGotoBackAction?()
  375. } else if sender.tag == 3 {
  376. self.delegate?.changePDFViewGoToForwardAction?()
  377. }
  378. }
  379. @IBAction func aiTranslationButtonAction(sender:KMToolbarClickButton) {
  380. self.delegate?.aiTranslationPDFFileAction?()
  381. }
  382. @IBAction func shareButtonAction(sender:KMToolbarClickButton) {
  383. self.shareButton = sender
  384. let menu = NSMenu()
  385. menu.addItem(withTitle: NSLocalizedString("Document", comment: ""), action: #selector(shareViaWithDocument), target: self)
  386. menu.addItem(withTitle: NSLocalizedString("Flattened Copy", comment: ""), action: #selector(shareViaWithFlatten), target: self)
  387. menu.addItem(withTitle: NSLocalizedString("Original PDF", comment: ""), action: #selector(shareViaWithOriginalPDF), target: self)
  388. menu.popUp(positioning: nil, at: NSPoint(x: sender.frame.origin.x, y: sender.frame.origin.y-10), in: sender.superview)
  389. self.delegate?.toolbarViewController?(self, shareAction: sender.clickObject as! KMToolbarItemView)
  390. }
  391. @IBAction func shareViaWithDocument(sender:NSMenuItem) {
  392. self.delegate?.toolbarViewController?(self, shareDocument: sender)
  393. }
  394. @IBAction func shareViaWithFlatten(sender:NSMenuItem) {
  395. self.delegate?.toolbarViewController?(self, shareFlatten: sender)
  396. }
  397. @IBAction func shareViaWithOriginalPDF(sender:NSMenuItem) {
  398. self.delegate?.toolbarViewController?(self, shareOriginalPDF: sender)
  399. }
  400. @objc func mergeMenuItemAction(sender: KMToolbarClickButton) {
  401. self.delegate?.toolbarViewController?(self, clickChaildToolType: .merge, toolbar: sender.clickObject as! KMToolbarItemView)
  402. }
  403. @IBAction func scanOCRModelSelect(sender:KMToolbarClickButton) {
  404. self.delegate?.toolbarViewController?(self, scanOCRModel: sender.tag)
  405. }
  406. // Form 对齐
  407. @IBAction func formsAlignmentAction(sender:KMToolbarClickButton) {
  408. }
  409. @objc private func _alignmentAction(sender: NSMenuItem) {
  410. if let data = self._currentItemView {
  411. self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
  412. } else {
  413. self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolFormAlignIdentifier), index: sender.tag, info: nil)
  414. }
  415. }
  416. // Form 更多操作
  417. @IBAction func formsMoreOperationAction(sender:KMToolbarClickButton) {
  418. }
  419. func toolbarItemFindItemIdentifiers(value : String) -> KMToolbarItemView{
  420. for item in self.toolbarItems {
  421. if item.key == value {
  422. return item.value as! KMToolbarItemView
  423. }
  424. }
  425. return KMToolbarItemView()
  426. }
  427. func controlTextDidEndEditing(_ obj: Notification) {
  428. let textField = obj.object as? NSTextField
  429. if textField == self.zoomTextField {
  430. self.delegate?.toolbarViewController?(self, zoomSting: self.zoomTextField.stringValue)
  431. }
  432. }
  433. func controlTextDidChange(_ obj: Notification) {
  434. }
  435. func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
  436. switch commandSelector {
  437. case #selector(NSResponder.insertNewline(_:)):
  438. if let inputView = control as? NSTextField {
  439. // //当当前TextField按下enter
  440. if inputView == zoomTextField {
  441. KMPrint("按下 enter")
  442. self.delegate?.toolbarViewController?(self, zoomSting: self.zoomTextField.stringValue)
  443. } else if let _ = control as? NSSearchField {
  444. self.delegate?.toolbarViewController?(self, searchAction: control.stringValue, forward: true)
  445. }
  446. }
  447. return true
  448. default:
  449. return false
  450. }
  451. }
  452. @objc func toggleCaseInsensitiveSearch(_ sender: NSMenuItem) {
  453. var value = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey)
  454. if value == 1 {
  455. value = 0
  456. } else {
  457. value = 1
  458. }
  459. UserDefaults.standard.setValue(value, forKey: SKCaseInsensitiveSearchKey)
  460. UserDefaults.standard.synchronize()
  461. }
  462. // MARK: - Private Methods
  463. private func _itemSetPromptFlag(item: KMToolbarItemView?) {
  464. if let item_ = item {
  465. if let identifier = item_.promptIdentifier {
  466. item?.isShowPrompt = false
  467. KMDataManager.ud_set(true, forKey: identifier)
  468. }
  469. }
  470. }
  471. private func _itemSetPromptFlag(itemIdentifier: String?) {
  472. let item = self.toolbarItemFindItemIdentifiers(value: itemIdentifier ?? "")
  473. self._itemSetPromptFlag(item: item)
  474. }
  475. }
  476. // MARK: - Public Methods
  477. extension KMToolbarViewController {
  478. func itemAction(_ item: KMToolbarItemView) {
  479. self._itemAction(item.clickButton)
  480. }
  481. }
  482. extension KMToolbarViewController : KMToolbarViewDelegate,NSToolbarItemValidation {
  483. func toolbarLeftDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  484. if toolbarType == .Main {
  485. return [KMLeftControlToolbarItemIdentifier,
  486. KMNewToolbarSpaceItemIdentifier, KMDocumentZoomViewToolbarItemIdentifier,
  487. KMDocumentPreviousPageToolbarItemIdentifier, KMDocumentHomeToolbarItemIdentifier]
  488. }
  489. return []
  490. }
  491. func toolbarRightDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  492. if toolbarType == .Main {
  493. return [KMDocumentViewDisplayToolbarItemIdentifier, KMDocumentShareToolbarItemIdentifier,
  494. KMDocumentSearchToolbarItemIdentifier, KMRightControlToolbarItemIdentifier]
  495. } else if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) {
  496. return [KMToolbarAnnotationSettingItemIdentifier]
  497. }
  498. return []
  499. }
  500. func toolbarAllowedItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  501. if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) {
  502. return [KMNewToolbarSpaceItemIdentifier,
  503. KMToolbarPageEditInsetItemIdentifier, KMToolbarToolMergeItemIdentifier, KMToolbarPageEditSplitItemIdentifier,
  504. KMToolbarToolCompressItemIdentifier, KMToolbarToolSecureItemIdentifier, KMToolbarToolWatermarkItemIdentifier,
  505. KMToolbarToolBackgroundItemIdentifier, KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier,
  506. KMToolbarToolCropItemIdentifier,
  507. KMToolbarConversionWordItemIdentifier, KMToolbarConversionExcelItemIdentifier, KMToolbarConversionPPTItemIdentifier,
  508. KMToolbarConversionRTFItemIdentifier, KMToolbarConversionCSVItemIdentifier, KMToolbarConversionHTMLItemIdentifier,
  509. KMToolbarConversionTextItemIdentifier, KMToolbarConversionImageItemIdentifier,
  510. KMToolbarMoveToolModeItemIdentifier,
  511. KMToolbarMagnifyToolModeItemIdentifier,
  512. KMToolbarSelectToolModeItemIdentifier,
  513. KMToolbarZoomToSelectionItemIdentifier,
  514. KMNewToolbarSpaceItemIdentifier,
  515. KMToolbarDividerItemIdentifier,
  516. KMNewToolbarSpaceItemIdentifier,
  517. KMToolbarHighlightAnnotationItemIdentifier,
  518. KMToolbarUnderlineAnnotationItemIdentifier,
  519. KMToolbarStrikeOutAnnotationItemIdentifier,
  520. KMToolbarInkAnnotationItemIdentifier,
  521. KMToolbarFreeTextAnnotationItemIdentifier,
  522. KMToolbarAnchoredAnnotationItemIdentifier,
  523. KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
  524. KMToolbarLinkAnnotationItemIdentifier,
  525. KMAnnotationStampToolbarItemIdentifier,
  526. KMToolbarSignSignatureAnnotationItemIdentifier,
  527. // KMToolbarDividerItemIdentifier,
  528. // KMToolbarShowToolbarItemIdentifier,
  529. KMToolbarToolRadioButtonItemIdentifier]
  530. }
  531. return []
  532. }
  533. func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  534. switch toolbarType {
  535. case .None:
  536. return []
  537. case .Main:
  538. return [KMDocumentAnnotationToolbarItemIdentifier,
  539. KMDocumentPageToolbarItemIdentifier,
  540. KMDocumentToolToolbarItemIdentifier,
  541. KMDocumentConversonToolbarItemIdentifier,
  542. KMDocumentFormToolbarItemIdentifier,
  543. KMDocumentFillSginToolbarItemIdentifier,
  544. KMDocumentEditToolbarItemIdentifier,
  545. KMDocumentDigitalSignToolbarItemIdentifier,
  546. KMDocumentRedactToolbarItemIdentifier,
  547. KMDocumentScanOCRToolbarItemIdentifier]
  548. case .Annatiton,.Magnify,.Move,.Select,.SelectZoom:
  549. let itemIdentifiers: [String]? = self.toolbar?.toolbarIdentifier != nil ? (UserDefaults.standard.object(forKey: self.toolbar?.toolbarIdentifier ?? "") as? [String]) : []
  550. if itemIdentifiers == nil || itemIdentifiers!.count <= 0 {
  551. return [KMToolbarMoveToolModeItemIdentifier,
  552. KMToolbarMagnifyToolModeItemIdentifier,
  553. KMToolbarSelectToolModeItemIdentifier,
  554. KMToolbarZoomToSelectionItemIdentifier,
  555. KMNewToolbarSpaceItemIdentifier,
  556. KMNewToolbarSpaceItemIdentifier,
  557. KMToolbarHighlightAnnotationItemIdentifier,
  558. KMToolbarUnderlineAnnotationItemIdentifier,
  559. KMToolbarStrikeOutAnnotationItemIdentifier,
  560. KMToolbarInkAnnotationItemIdentifier,
  561. KMToolbarFreeTextAnnotationItemIdentifier,
  562. KMToolbarAnchoredAnnotationItemIdentifier,
  563. KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
  564. KMToolbarLinkAnnotationItemIdentifier,
  565. KMNewToolbarSpaceItemIdentifier, KMNewToolbarSpaceItemIdentifier,
  566. KMAnnotationStampToolbarItemIdentifier, KMAnnotationImageToolbarItemIdentifier,
  567. KMToolbarSignSignatureAnnotationItemIdentifier, KMAnnotationTableToolbarItemIdentifier]
  568. }
  569. return itemIdentifiers!
  570. case .editPDF:
  571. return [KMToolbarAddTextEditPDFItemIdentifier,
  572. KMToolbarAddImageEditPDFItemIdentifier]
  573. case .Page:
  574. return []
  575. case .Tool:
  576. return [KMToolbarToolCompressItemIdentifier, KMToolbarToolMergeItemIdentifier,
  577. KMToolbarToolSecureItemIdentifier, KMToolbarComparisonItemIdentifier,
  578. KMToolbarToolWatermarkItemIdentifier, KMToolbarToolBackgroundItemIdentifier,
  579. KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier]
  580. case .Form:
  581. return [KMToolbarToolTextFieldItemIdentifier,
  582. KMToolbarToolCheckBoxItemIdentifier,
  583. KMToolbarToolRadioButtonItemIdentifier,
  584. KMToolbarToolListBoxItemIdentifier,
  585. KMToolbarToolPullDownmenuItemIdentifier,
  586. KMToolbarToolButtonIdentifier,
  587. KMToolbarToolSignBoxIdentifier,
  588. KMToolbarDividerItemIdentifier,
  589. KMToolbarToolFormAlignIdentifier]
  590. case .FillSign:
  591. return [
  592. // KMToolbarToolTextIdentifier,
  593. KMToolbarToolHookItemIdentifier,
  594. KMToolbarToolForkItemIdentifier,
  595. KMToolbarToolRectangleIdentifier,
  596. KMToolbarToolLineItemIdentifier,
  597. KMToolbarToolDotItemIdentifier,
  598. KMToolbarToolDateIdentifier,
  599. KMToolbarToolProfileIdentifier,
  600. KMToolbarFillSignSignatureIdentifier]
  601. case .Conversion:
  602. return [KMToolbarConversionCreatePDFItemIdentifier,
  603. KMToolbarConversionWordItemIdentifier,
  604. KMToolbarConversionExcelItemIdentifier,
  605. KMToolbarConversionPPTItemIdentifier,
  606. KMToolbarConversionRTFItemIdentifier,
  607. KMToolbarConversionCSVItemIdentifier,
  608. KMToolbarConversionHTMLItemIdentifier,
  609. KMToolbarConversionTextItemIdentifier,
  610. KMToolbarConversionImageItemIdentifier,
  611. KMToolbarDividerItemIdentifier, KMToolbarConversionOCRIdentifier, KMToolbarConversionExportImageItemIdentifier]
  612. case .ScanOCR:
  613. return [KMToolbarToolEnhancedScanIdentifier,
  614. KMToolbarToolOCRTextIdentifier]
  615. case .viewSetting:
  616. return [KMToolbarViewSettingIdentifier, KMToolbarCropIdentifier,
  617. KMToolbarSnapshotIdentifier, KMToolbarTTSIdentifier]
  618. default:
  619. break
  620. }
  621. return []
  622. }
  623. func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView {
  624. var item: KMToolbarItemView? = self.toolbarItems[identifier] as? KMToolbarItemView
  625. var create = false
  626. if let data = item {
  627. let pId = parentIdentifier(data.itemIdentifier ?? "")
  628. if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) && (pId != KMDocumentAnnotationToolbarItemIdentifier || data.itemIdentifier! == KMToolbarAnnotationSettingItemIdentifier) {
  629. create = true
  630. } else {
  631. if let toolbarId = self.toolbar.toolbarIdentifier {
  632. let itemIdentifiers = (UserDefaults.standard.object(forKey: toolbarId) as? [String]) ?? []
  633. if itemIdentifiers.contains(identifier) && annotationToolIdentifiers.contains(identifier) == false {
  634. create = true
  635. }
  636. }
  637. }
  638. }
  639. if item == nil || create {
  640. item = KMToolbarItemView.init(itemIdentifier: identifier)
  641. if isMainToolItem(identifier) {
  642. item = KMToolbarMainItemView(itemIdentifier: identifier)
  643. }
  644. self.toolbarItems[identifier] = item
  645. if isMainToolItem(identifier) {
  646. self._setupMainItem(item)
  647. } else {
  648. if (annotationToolIdentifiers.contains(identifier)) {
  649. self._setupAnnotationItem(item)
  650. } else if editPDFItemIdentifiers.contains(identifier) {
  651. self._setupEditItem(item)
  652. } else if conversionToolIdentifiers.contains(identifier) {
  653. self._setupConvertItem(item)
  654. } else if fillSignToolIdentifiers.contains(identifier) {
  655. self._setupFillSignItem(item)
  656. } else if formToolIdentifiers.contains(identifier) {
  657. self._setupFormItem(item)
  658. } else if toolToolIdentifiers.contains(identifier) {
  659. self._setupToolItem(item)
  660. } else if KMViewDisplayIdentifiers.contains(identifier) {
  661. self._setupViewDisplayItem(item)
  662. } else if pageEditToolIdentifiers.contains(identifier) {
  663. if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
  664. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRange)
  665. item?.target = self
  666. item?.btnTag = KMPageEditType.pageRange.rawValue
  667. // item?.toolTip = NSLocalizedString("pageRange", comment: "")
  668. item?.titleName = NSLocalizedString("Page Range", comment: "")
  669. item?.boxImagePosition = .imageExpandLeft
  670. // item?.btnAction = #selector(pageRangeMenuAction)
  671. item?.needExpandAction = true
  672. } else if (identifier == KMToolbarPageEditRotateItemIdentifier) {
  673. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  674. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  675. item?.target = self
  676. item?.btnTag = KMPageEditType.rightRotate.rawValue
  677. item?.toolTip = NSLocalizedString("Rotate", comment: "")
  678. item?.titleName = NSLocalizedString("Rotate", comment: "")
  679. item?.boxImagePosition = .imageLeft
  680. } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
  681. item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  682. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  683. item?.target = self
  684. item?.btnTag = KMPageEditType.leftRotate.rawValue
  685. item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
  686. item?.titleName = NSLocalizedString("", comment: "")
  687. item?.boxImagePosition = .imageLeft
  688. } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
  689. item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
  690. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
  691. item?.target = self
  692. item?.btnTag = KMPageEditType.rightRotate.rawValue
  693. item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
  694. item?.titleName = NSLocalizedString("", comment: "")
  695. item?.boxImagePosition = .imageLeft
  696. } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
  697. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  698. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  699. item?.target = self
  700. item?.btnTag = KMPageEditType.insert.rawValue
  701. // item?.toolTip = NSLocalizedString("Inserting pages into an existing PDF", comment: "")
  702. item?.titleName = NSLocalizedString("Insert", comment: "")
  703. item?.boxImagePosition = .imageExpandLeft
  704. // item?.btnAction = #selector(insertMenuAction)
  705. item?.needExpandAction = true
  706. } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
  707. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  708. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  709. item?.target = self
  710. item?.btnTag = KMPageEditType.extract.rawValue
  711. // item?.toolTip = NSLocalizedString("Exctract selected pages", comment: "")
  712. item?.titleName = NSLocalizedString("Extract", comment: "")
  713. item?.boxImagePosition = .imageExpandLeft
  714. // item?.btnAction = #selector(extractMenuAction)
  715. item?.needExpandAction = true
  716. } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
  717. item?.image = NSImage(named: KMImageNameToolbarReplace)
  718. item?.alternateImage = NSImage(named: KMImageNameToolbarReplace)
  719. item?.target = self
  720. item?.btnTag = KMPageEditType.replace.rawValue
  721. item?.toolTip = NSLocalizedString("Replace", comment: "")
  722. item?.titleName = NSLocalizedString("Replace", comment: "")
  723. item?.boxImagePosition = .imageLeft
  724. } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
  725. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  726. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  727. item?.target = self
  728. item?.btnTag = KMPageEditType.split.rawValue
  729. // item?.toolTip = NSLocalizedString("Split and save selected PDF pages as a new separate document", comment: "")
  730. item?.titleName = NSLocalizedString("Split", comment: "")
  731. item?.boxImagePosition = .imageExpandLeft
  732. item?.needExpandAction = true
  733. } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
  734. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  735. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  736. item?.target = self
  737. item?.btnTag = KMPageEditType.reverse.rawValue
  738. item?.toolTip = NSLocalizedString("Reverse", comment: "")
  739. item?.titleName = NSLocalizedString("Reverse", comment: "")
  740. item?.boxImagePosition = .imageLeft
  741. } else if (identifier == KMToolbarPageEditCopyItemIdentifier) {
  742. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  743. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  744. item?.target = self
  745. item?.btnTag = KMPageEditType.delete.rawValue
  746. item?.toolTip = NSLocalizedString("Copy", comment: "")
  747. item?.titleName = NSLocalizedString("Copy", comment: "")
  748. item?.boxImagePosition = .imageLeft
  749. } else if (identifier == KMToolbarPageEditPasteItemIdentifier) {
  750. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  751. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  752. item?.target = self
  753. item?.btnTag = KMPageEditType.delete.rawValue
  754. item?.toolTip = NSLocalizedString("Paste", comment: "")
  755. item?.titleName = NSLocalizedString("Paste", comment: "")
  756. item?.boxImagePosition = .imageLeft
  757. } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
  758. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  759. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  760. item?.target = self
  761. item?.btnTag = KMPageEditType.delete.rawValue
  762. item?.toolTip = NSLocalizedString("Delete", comment: "")
  763. item?.titleName = NSLocalizedString("Delete", comment: "")
  764. item?.boxImagePosition = .imageLeft
  765. }
  766. return item!
  767. }
  768. }
  769. }
  770. return item!
  771. }
  772. func validateToolbarItem(_ item: NSToolbarItem) -> Bool {
  773. return true
  774. }
  775. @objc func listViewAnnotationTypeChangeNotification(sender: Notification?) {
  776. // if let notiName = sender?.name, notiName == NSNotification.Name.CPDFListViewAnnotationTypeChange, self.ignoreCurrentAnnotationTypeChange {
  777. // }
  778. if (self.ignoreCurrentAnnotationTypeChange) {
  779. // 忽略后重置 这个属性是基于单次添加,所以使用后会重置
  780. // self.ignoreCurrentAnnotationTypeChange = false
  781. return
  782. }
  783. let annotationType : CAnnotationType = pdfView.annotationType
  784. if annotationType == .square || annotationType == .circle || annotationType == .arrow || annotationType == .line{
  785. UserDefaults.standard.set(pdfView.annotationType.rawValue, forKey: KMToolBarToolPDFShapeStyle)
  786. UserDefaults.standard.synchronize()
  787. }
  788. for item in self.toolbar.items {
  789. if self.toolbarType == .Annatiton || self.toolbarType == .Move || self.toolbarType == .Magnify ||
  790. self.toolbarType == .Select || self.toolbarType == .SelectZoom {
  791. item.isSelected = false
  792. if item.itemIdentifier == KMDocumentAnnotationToolbarItemIdentifier {
  793. item.isSelected = true
  794. } else if item.itemIdentifier == KMToolbarHighlightAnnotationItemIdentifier {
  795. if annotationType == .highlight {
  796. item.isSelected = true
  797. }
  798. } else if item.itemIdentifier == KMToolbarUnderlineAnnotationItemIdentifier {
  799. if annotationType == .underline {
  800. item.isSelected = true
  801. }
  802. } else if item.itemIdentifier == KMToolbarStrikeOutAnnotationItemIdentifier {
  803. if annotationType == .strikeOut {
  804. item.isSelected = true
  805. }
  806. } else if item.itemIdentifier == KMToolbarInkAnnotationItemIdentifier {
  807. if annotationType == .ink || annotationType == .eraser {
  808. item.isSelected = true
  809. }
  810. } else if item.itemIdentifier == KMToolbarFreeTextAnnotationItemIdentifier {
  811. if annotationType == .freeText {
  812. item.isSelected = true
  813. }
  814. } else if item.itemIdentifier == KMToolbarAnchoredAnnotationItemIdentifier {
  815. if annotationType == .anchored {
  816. item.isSelected = true
  817. }
  818. } else if item.itemIdentifier == KMToolbarSquareAnnotationItemIdentifier {
  819. if annotationType == .square {
  820. item.isSelected = true
  821. }
  822. } else if item.itemIdentifier == KMToolbarCircleAnnotationItemIdentifier {
  823. if annotationType == .circle {
  824. item.isSelected = true
  825. }
  826. } else if item.itemIdentifier == KMToolbarArrowAnnotationItemIdentifier {
  827. if annotationType == .arrow {
  828. item.isSelected = true
  829. }
  830. } else if item.itemIdentifier == KMToolbarLineAnnotationItemIdentifier {
  831. if annotationType == .line {
  832. item.isSelected = true
  833. }
  834. } else if item.itemIdentifier == KMToolbarLinkAnnotationItemIdentifier {
  835. if annotationType == .link {
  836. item.isSelected = true
  837. }
  838. } else if item.itemIdentifier == KMAnnotationStampToolbarItemIdentifier {
  839. if annotationType == .stamp {
  840. item.isSelected = true
  841. }
  842. } else if item.itemIdentifier == KMToolbarSignSignatureAnnotationItemIdentifier {
  843. if annotationType == .signSignature {
  844. item.isSelected = true
  845. }
  846. } else if pdfView.toolMode == .moveToolMode {
  847. if item.itemIdentifier == KMToolbarMoveToolModeItemIdentifier {
  848. item.isSelected = true
  849. }
  850. } else if pdfView.toolMode == .magnifyToolMode {
  851. if item.itemIdentifier == KMToolbarMagnifyToolModeItemIdentifier {
  852. item.isSelected = true
  853. }
  854. } else if pdfView.toolMode == .selectToolMode {
  855. if item.itemIdentifier == KMToolbarSelectToolModeItemIdentifier {
  856. item.isSelected = true
  857. }
  858. } else if pdfView.toolMode == .selectZoomToolMode {
  859. if item.itemIdentifier == KMToolbarZoomToSelectionItemIdentifier {
  860. item.isSelected = true
  861. }
  862. }
  863. if (item.itemIdentifier == KMToolbarShowToolbarItemIdentifier) {
  864. item.isSelected = !self.isShowAllAnnotations
  865. }
  866. } else if self.toolbarType == .FillSign {
  867. item.isSelected = false
  868. if pdfView.toolMode == .selfSignMode {
  869. if item.itemIdentifier == KMToolbarToolHookItemIdentifier {
  870. if annotationType == .signTure {
  871. item.isSelected = true
  872. }
  873. } else if item.itemIdentifier == KMToolbarToolForkItemIdentifier {
  874. if annotationType == .signFalse {
  875. item.isSelected = true
  876. }
  877. } else if item.itemIdentifier == KMToolbarToolLineItemIdentifier {
  878. if annotationType == .signLine {
  879. item.isSelected = true
  880. }
  881. } else if item.itemIdentifier == KMToolbarToolDotItemIdentifier {
  882. if annotationType == .signDot {
  883. item.isSelected = true
  884. }
  885. } else if item.itemIdentifier == KMToolbarToolRectangleIdentifier {
  886. if annotationType == .signCircle {
  887. item.isSelected = true
  888. }
  889. } else if item.itemIdentifier == KMToolbarToolDateIdentifier {
  890. if annotationType == .signDate {
  891. item.isSelected = true
  892. }
  893. } else if item.itemIdentifier == KMToolbarToolTextIdentifier {
  894. if annotationType == .signText {
  895. item.isSelected = true
  896. }
  897. } else if (item.itemIdentifier == KMToolbarFillSignSignatureIdentifier) {
  898. if (annotationType == .signSignature) {
  899. item.isSelected = true
  900. }
  901. }
  902. }
  903. } else if self.toolbarType == .Form {
  904. item.isSelected = false
  905. if pdfView.toolMode == .formToolMode {
  906. if item.itemIdentifier == KMToolbarToolTextFieldItemIdentifier {
  907. if annotationType == .textField {
  908. item.isSelected = true
  909. }
  910. } else if item.itemIdentifier == KMToolbarToolCheckBoxItemIdentifier {
  911. if annotationType == .checkBox {
  912. item.isSelected = true
  913. }
  914. } else if item.itemIdentifier == KMToolbarToolRadioButtonItemIdentifier {
  915. if annotationType == .radioButton {
  916. item.isSelected = true
  917. }
  918. } else if item.itemIdentifier == KMToolbarToolListBoxItemIdentifier {
  919. if annotationType == .listMenu {
  920. item.isSelected = true
  921. }
  922. } else if item.itemIdentifier == KMToolbarToolPullDownmenuItemIdentifier {
  923. if annotationType == .comboBox {
  924. item.isSelected = true
  925. }
  926. } else if item.itemIdentifier == KMToolbarToolButtonIdentifier {
  927. if annotationType == .actionButton {
  928. item.isSelected = true
  929. }
  930. } else if item.itemIdentifier == KMToolbarToolSignBoxIdentifier {
  931. if annotationType == .signature {
  932. item.isSelected = true
  933. }
  934. }
  935. }
  936. }
  937. }
  938. }
  939. }
  940. extension KMToolbarViewController: NSSearchFieldDelegate {
  941. }
  942. extension KMToolbarViewController {
  943. private func _setupMainItem(_ item: KMToolbarItemView?) {
  944. let identifier = item?.itemIdentifier
  945. if identifier == KMLeftControlToolbarItemIdentifier {
  946. item?.image = NSImage(named: "KMImageNameUXIconBtnTriLeftNor")
  947. item?.titleName = NSLocalizedString("Panel", comment: "")
  948. item?.target = self
  949. item?.toolTip = NSLocalizedString("View Settings", comment: "")
  950. item?.boxImagePosition = .imageAbove
  951. item?.selectBackgroundType = .imageBox
  952. item?.btnAction = #selector(_itemAction)
  953. } else if identifier == KMDocumentZoomToolbarItemIdentifier {
  954. item?.image = NSImage(named: "KMImageNameUXIconToolbarZoominNor")
  955. item?.titleName = NSLocalizedString("", comment: "")
  956. item?.target = self
  957. item?.btnTag = 1
  958. item?.toolTip = NSLocalizedString("Zoom In", comment: "")
  959. item?.boxImagePosition = .imageAbove
  960. item?.btnAction = #selector(zoomPDFViewButtonAction)
  961. } else if identifier == KMDocumentZoomOutToolbarItemIdentifier {
  962. item?.image = NSImage(named: "KMImageNameUXIconToolbarZoomoutNor")
  963. item?.titleName = NSLocalizedString("", comment: "")
  964. item?.target = self
  965. item?.btnTag = 0
  966. item?.toolTip = NSLocalizedString("Zoom Out", comment: "")
  967. item?.boxImagePosition = .imageAbove
  968. item?.btnAction = #selector(zoomPDFViewButtonAction)
  969. } else if identifier == KMDocumentZoomViewToolbarItemIdentifier{
  970. item?.titleName = NSLocalizedString("Zoom", comment: "")
  971. item?.target = self
  972. let view = KMToolbarZoomItemView(zoomView: self.zoomView)
  973. view.callback = { [weak self] idx, _ in
  974. if idx == 2 {
  975. self?.delegate?.changePDFViewZoomInAction?()
  976. } else if idx == 1 {
  977. self?.delegate?.changePDFViewZoomOutAction?()
  978. }
  979. }
  980. item?.customizeView = view
  981. } else if identifier == KMDocumentNextPageToolbarItemIdentifier {
  982. item?.image = NSImage(named: "KMImageNameToolbarPagenextNor")
  983. item?.titleName = NSLocalizedString("Next", comment: "")
  984. item?.target = self
  985. item?.toolTip = NSLocalizedString("Go To Next Page", comment: "")
  986. item?.boxImagePosition = .imageAbove
  987. item?.btnAction = #selector(_itemAction)
  988. } else if identifier == KMDocumentPreviousPageToolbarItemIdentifier {
  989. item?.titleName = NSLocalizedString("Zoom", comment: "")
  990. item?.target = self
  991. let view = KMToolbarPreviousNextItemView()
  992. view.callback = { [weak self] idx, _ in
  993. if idx == 1 {
  994. self?.delegate?.changePDFViewGoToPreviousPageAction?()
  995. } else if idx == 2 {
  996. self?.delegate?.changePDFViewGotoNextPageAction?()
  997. }
  998. }
  999. item?.customizeView = view
  1000. } else if identifier == KMDocumentHomeToolbarItemIdentifier {
  1001. item?.image = NSImage(named: "KMImageNameToolbarHomeNor")
  1002. item?.titleName = NSLocalizedString("Home", comment: "")
  1003. item?.target = self
  1004. item?.toolTip = NSLocalizedString("A Welcome Gift from Us", comment: "")
  1005. item?.boxImagePosition = .imageAbove
  1006. item?.selectBackgroundType = .imageBox
  1007. item?.btnAction = #selector(_itemAction)
  1008. } else if identifier == KMDocumentAnnotationToolbarItemIdentifier {
  1009. item?.titleName = NSLocalizedString("Tools", comment: "")
  1010. item?.image = NSImage(named: "KMImageNameUXIconToolbarMytoolsNor")
  1011. item?.target = self
  1012. item?.toolTip = String(format: "%@: %@, %@, %@, %@", KMLocalizedString("Tool Mode", nil),KMLocalizedString("Annotate", nil),KMLocalizedString("Scroll", nil),KMLocalizedString("Magnify", nil),KMLocalizedString("Select", nil))
  1013. item?.btnTag = KMToolbarViewType.Annatiton.rawValue
  1014. item?.btnAction = #selector(leftControllButtonAction)
  1015. item?.boxImagePosition = .imageAbove
  1016. item?.selectBackgroundType = .imageBox
  1017. } else if identifier == KMDocumentPageToolbarItemIdentifier {
  1018. item?.titleName = NSLocalizedString("Page Edit", comment: "")
  1019. item?.target = self
  1020. item?.image = NSImage(named: "KMImageNameUXIconToolbarPageeditNor")
  1021. item?.toolTip = NSLocalizedString("PDF page editor: insert, delete, extract, rotate, reposition, and replace pages in a PDF", comment: "")
  1022. item?.btnTag = KMToolbarViewType.Page.rawValue
  1023. item?.btnAction = #selector(leftControllButtonAction)
  1024. item?.boxImagePosition = .imageAbove
  1025. item?.selectBackgroundType = .imageBox
  1026. } else if identifier == KMDocumentConversonToolbarItemIdentifier {
  1027. item?.titleName = NSLocalizedString("Converter", comment: "")
  1028. item?.target = self
  1029. item?.image = NSImage(named: "KMImageNameUXIconToolbarConvertNor")
  1030. item?.toolTip = NSLocalizedString("Convert PDFs to Microsoft Word, PowerPoint, Excel, RTF, Text, Image, CSV, and more Offline", comment: "")
  1031. item?.btnTag = KMToolbarViewType.Conversion.rawValue
  1032. item?.btnAction = #selector(leftControllButtonAction)
  1033. item?.boxImagePosition = .imageAbove
  1034. item?.selectBackgroundType = .imageBox
  1035. item?.promptIdentifier = identifier
  1036. } else if identifier == KMDocumentScanOCRToolbarItemIdentifier {
  1037. item?.titleName = NSLocalizedString("OCR", comment: "")
  1038. item?.target = self
  1039. item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
  1040. item?.boxImagePosition = .imageAbove
  1041. item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
  1042. item?.selectBackgroundType = .imageBox
  1043. item?.btnAction = #selector(_itemAction)
  1044. item?.promptIdentifier = identifier
  1045. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
  1046. menuItem.representedObject = identifier
  1047. item?.menuFormRepresentation = menuItem
  1048. } else if identifier == KMToolbarToolEnhancedScanIdentifier {
  1049. item?.image = NSImage(named: "KMImageNameMainToolEnhancedScan")
  1050. item?.target = self
  1051. item?.btnTag = 0
  1052. item?.toolTip = NSLocalizedString("Enhanced Scan", comment: "")
  1053. item?.titleName = NSLocalizedString("Enhanced Scan", comment: "")
  1054. item?.boxImagePosition = .imageLeft
  1055. item?.selectBackgroundType = .imageBox
  1056. item?.btnAction = #selector(scanOCRModelSelect)
  1057. } else if identifier == KMToolbarToolOCRTextIdentifier {
  1058. item?.image = NSImage(named: "KMImageNameMainToolOCRText")
  1059. item?.target = self
  1060. item?.toolTip = NSLocalizedString("OCR Text Recognition", comment: "")
  1061. item?.titleName = NSLocalizedString("OCR Text Recognition", comment: "")
  1062. item?.boxImagePosition = .imageLeft
  1063. item?.selectBackgroundType = .imageBox
  1064. item?.btnAction = #selector(scanOCRModelSelect)
  1065. item?.promptIdentifier = identifier
  1066. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR Text Recognition", comment: ""), action: #selector(scanOCRModelSelect), target: self)
  1067. menuItem.representedObject = identifier
  1068. item?.menuFormRepresentation = menuItem
  1069. } else if identifier == KMDocumentEditToolbarItemIdentifier {
  1070. item?.titleName = NSLocalizedString("Edit PDF", comment: "")
  1071. item?.target = self
  1072. item?.image = NSImage(named: "KMImageNameUXIconToolbarEditNor")
  1073. item?.boxImagePosition = .imageAbove
  1074. item?.btnTag = KMToolbarViewType.editPDF.rawValue
  1075. item?.toolTip = NSLocalizedString("Edit text and image in PDF", comment: "")
  1076. item?.selectBackgroundType = .imageBox
  1077. item?.btnAction = #selector(leftControllButtonAction)
  1078. item?.promptIdentifier = identifier
  1079. let menuItem = NSMenuItem.init(title: NSLocalizedString("Edit PDF", comment: ""), action: #selector(leftControllButtonAction), target: self)
  1080. menuItem.tag = item!.btnTag
  1081. item?.menuFormRepresentation = menuItem
  1082. } else if identifier == KMDocumentFormToolbarItemIdentifier {
  1083. item?.titleName = NSLocalizedString("Forms", comment: "")
  1084. item?.target = self
  1085. item?.image = NSImage(named: "KMImageNameUXIconToolbarFormNor")
  1086. item?.boxImagePosition = .imageAbove
  1087. item?.btnTag = KMToolbarViewType.Form.rawValue
  1088. item?.toolTip = NSLocalizedString("Edit PDF Form", comment: "")
  1089. item?.selectBackgroundType = .imageBox
  1090. item?.btnAction = #selector(leftControllButtonAction)
  1091. item?.promptIdentifier = identifier
  1092. let menuItem = NSMenuItem.init(title: NSLocalizedString("Forms", comment: ""), action: #selector(leftControllButtonAction), target: self)
  1093. menuItem.tag = item!.btnTag
  1094. item?.menuFormRepresentation = menuItem
  1095. } else if identifier == KMDocumentFillSginToolbarItemIdentifier {
  1096. item?.titleName = NSLocalizedString("Fill & Sign", comment: "")
  1097. item?.target = self
  1098. item?.image = NSImage(named: "KMImageNameUXIconToolbarFillsignNor")
  1099. item?.boxImagePosition = .imageAbove
  1100. item?.btnTag = KMToolbarViewType.FillSign.rawValue
  1101. item?.toolTip = NSLocalizedString("Fill and sign forms", comment: "")
  1102. item?.selectBackgroundType = .imageBox
  1103. item?.btnAction = #selector(leftControllButtonAction)
  1104. item?.promptIdentifier = identifier
  1105. let menuItem = NSMenuItem.init(title: NSLocalizedString("Fill & Sign", comment: ""), action: #selector(leftControllButtonAction), target: self)
  1106. menuItem.tag = item!.btnTag
  1107. item?.menuFormRepresentation = menuItem
  1108. } else if identifier == KMDocumentToolToolbarItemIdentifier {
  1109. item?.titleName = NSLocalizedString("Editor", comment: "")
  1110. item?.target = self
  1111. item?.image = NSImage(named: "KMImageNameUXIconToolbarEdittoolNor")
  1112. item?.boxImagePosition = .imageAbove
  1113. item?.btnTag = KMToolbarViewType.Tool.rawValue
  1114. item?.toolTip = NSLocalizedString("Edit, delete, cut, copy, paste, and insert text in PDFs", comment: "")
  1115. item?.selectBackgroundType = .imageBox
  1116. item?.btnAction = #selector(leftControllButtonAction)
  1117. item?.promptIdentifier = identifier
  1118. } else if identifier == KMDocumentRedactToolbarItemIdentifier {
  1119. item?.titleName = NSLocalizedString("Redact Text", comment: "")
  1120. item?.target = self
  1121. item?.image = NSImage(named: "KMImageNameUXIconToolbarRedactNor")
  1122. item?.boxImagePosition = .imageAbove
  1123. item?.toolTip = NSLocalizedString("Mark for redaction", comment: "")
  1124. item?.selectBackgroundType = .imageBox
  1125. item?.btnAction = #selector(_itemAction)
  1126. item?.promptIdentifier = identifier
  1127. } else if identifier == KMDocumentAITranslationToolbarItemIdentifier {
  1128. item?.image = NSImage(named: "ic_function_other_AITranslation")
  1129. item?.titleName = "AI Translation"
  1130. item?.target = self
  1131. item?.toolTip = NSLocalizedString("AI Translation", comment: "")
  1132. item?.boxImagePosition = .imageOnly
  1133. item?.btnAction = #selector(aiTranslationButtonAction)
  1134. item?.promptIdentifier = identifier
  1135. } else if identifier == KMDocumentPrintToolbarItemIdentifier {
  1136. item?.image = NSImage(named: "KMImageNameMainToolbarPrint")
  1137. item?.titleName = "Print"
  1138. item?.target = self
  1139. item?.toolTip = NSLocalizedString("Print", comment: "")
  1140. item?.boxImagePosition = .imageOnly
  1141. item?.btnAction = #selector(_itemAction)
  1142. } else if identifier == KMDocumentViewDisplayToolbarItemIdentifier {
  1143. item?.image = NSImage(named: "KMImageNameUXIconToolbarPageviewNor")
  1144. item?.titleName = NSLocalizedString("Page Display", comment: "")
  1145. item?.target = self
  1146. item?.toolTip = NSLocalizedString("Page Display", comment: "")
  1147. item?.boxImagePosition = .imageAbove
  1148. item?.selectBackgroundType = .imageBox
  1149. item?.btnAction = #selector(_itemAction)
  1150. item?.promptIdentifier = identifier
  1151. let menuItem = NSMenuItem.init(title: NSLocalizedString("Page Display", comment: ""), action: #selector(_menuItemAction), target: self)
  1152. menuItem.representedObject = identifier
  1153. item?.menuFormRepresentation = menuItem
  1154. } else if identifier == KMDocumentShareToolbarItemIdentifier {
  1155. item?.image = NSImage(named: "KMImageNameUXIconToolbarShareNor")
  1156. item?.titleName = NSLocalizedString("Share", comment: "")
  1157. item?.target = self
  1158. item?.toolTip = NSLocalizedString("Share the file with others", comment: "")
  1159. item?.boxImagePosition = .imageAbove
  1160. item?.selectBackgroundType = .imageBox
  1161. item?.btnAction = #selector(shareButtonAction)
  1162. let menuItem = NSMenuItem.init(title: item!.titleName ?? "", action: nil, target: self)
  1163. let menu = NSMenu()
  1164. menu.addItem(withTitle: NSLocalizedString("Document", comment: ""), action: #selector(shareViaWithDocument), target: self)
  1165. menu.addItem(withTitle: NSLocalizedString("Flattened Copy", comment: ""), action: #selector(shareViaWithFlatten), target: self)
  1166. menu.addItem(withTitle: NSLocalizedString("Original PDF", comment: ""), action: #selector(shareViaWithOriginalPDF), target: self)
  1167. menuItem.submenu = menu
  1168. item?.menuFormRepresentation = menuItem
  1169. } else if identifier == KMDocumentSearchToolbarItemIdentifier {
  1170. item?.titleName = NSLocalizedString("Search", comment: "")
  1171. item?.target = self
  1172. let view = NSView()
  1173. view.frame = NSMakeRect(0, 0, 150, 40)
  1174. let boxView = NSView()
  1175. boxView.frame = NSMakeRect(0, 16, 150, 22)
  1176. view.addSubview(boxView)
  1177. let searchView = NSSearchField()
  1178. searchView.frame = NSMakeRect(0, 0, 150, 22)
  1179. searchView.placeholderString = NSLocalizedString("Search", comment: "")
  1180. searchView.sendsWholeSearchString = true
  1181. searchView.sendsSearchStringImmediately = true
  1182. searchView.drawsBackground = false
  1183. searchView.delegate = self
  1184. let menu = NSMenu()
  1185. let searchItem = menu.addItem(title: KMLocalizedString("Ignore Case", "Menu item title"), action: #selector(toggleCaseInsensitiveSearch), target: self)
  1186. (searchView.cell as? NSSearchFieldCell)?.searchMenuTemplate = menu
  1187. boxView.addSubview(searchView)
  1188. let titleLabel = NSTextField(labelWithString: NSLocalizedString("Search", comment: ""))
  1189. view.addSubview(titleLabel)
  1190. titleLabel.frame = NSMakeRect(0, 0, 130, 14)
  1191. titleLabel.alignment = .center
  1192. titleLabel.textColor = KMAppearance.subtitleColor()
  1193. titleLabel.font = KMToolbarMainItemView.textFont
  1194. item?.customizeView = view
  1195. let menuItem = NSMenuItem.init(title: NSLocalizedString("Search", comment: ""), action: #selector(_menuItemAction), target: self)
  1196. menuItem.representedObject = identifier
  1197. item?.menuFormRepresentation = menuItem
  1198. } else if identifier == KMRightControlToolbarItemIdentifier {
  1199. item?.image = NSImage(named: "KMImageNameUXIconBtnTriRightNor")
  1200. item?.titleName = NSLocalizedString("Properties", comment: "")
  1201. item?.target = self
  1202. item?.toolTip = NSLocalizedString("Show/Hide Annotation Properties Panel", comment: "")
  1203. item?.boxImagePosition = .imageAbove
  1204. item?.selectBackgroundType = .imageBox
  1205. item?.btnAction = #selector(_itemAction)
  1206. let menuItem = NSMenuItem.init(title: NSLocalizedString("Properties", comment: ""), action: #selector(_menuItemAction), target: self)
  1207. menuItem.representedObject = identifier
  1208. item?.menuFormRepresentation = menuItem
  1209. } else if identifier == KMToolbarToolRedactItemIdentifier {
  1210. item?.image = NSImage(named: "KMImageNameMainToolsRedact")
  1211. item?.target = self
  1212. item?.btnTag = KMToolbarType.redact.rawValue
  1213. item?.toolTip = NSLocalizedString("Redact", comment: "")
  1214. item?.titleName = NSLocalizedString("Redact", comment: "")
  1215. item?.selectBackgroundType = .imageBox
  1216. item?.btnAction = #selector(redactMenuAction)
  1217. item?.promptIdentifier = identifier
  1218. let menuItem = NSMenuItem.init(title: NSLocalizedString("Redact", comment: ""), action: #selector(redactMenuAction), target: self)
  1219. menuItem.tag = item!.btnTag
  1220. item?.menuFormRepresentation = menuItem
  1221. } else if identifier == KMDocumentDigitalSignToolbarItemIdentifier {
  1222. item?.image = NSImage(named: "DigitalSign_icon")
  1223. item?.target = self
  1224. // item?.btnTag = KMToolbarType.redact.rawValue
  1225. item?.toolTip = NSLocalizedString("Digital signature ensures the authenticity and integrity of digital files. Click and drag the cursor to create a signature field on the page.", comment: "")
  1226. item?.titleName = NSLocalizedString("Digital Sign", comment: "")
  1227. item?.selectBackgroundType = .imageBox
  1228. item?.boxImagePosition = .imageAbove
  1229. item?.btnAction = #selector(_itemAction)
  1230. item?.promptIdentifier = identifier
  1231. let menuItem = NSMenuItem.init(title: NSLocalizedString("Digital Sign", comment: ""), action: #selector(_menuItemAction), target: self)
  1232. menuItem.tag = item!.btnTag
  1233. item?.menuFormRepresentation = menuItem
  1234. }
  1235. }
  1236. private func _setupAnnotationItem(_ item: KMToolbarItemView?) {
  1237. let identifier = item?.itemIdentifier
  1238. if identifier == KMToolbarMoveToolModeItemIdentifier {
  1239. item?.titleName = NSLocalizedString("Scroll Tool", comment: "")
  1240. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPantool)
  1241. item?.target = self
  1242. item?.btnTag = KMToolbarViewType.Move.rawValue
  1243. item?.toolTip = NSLocalizedString("Scroll Tool", comment: "")
  1244. item?.boxImagePosition = .imageOnly
  1245. item?.btnAction = #selector(leftControllButtonAction)
  1246. } else if identifier == KMToolbarMagnifyToolModeItemIdentifier {
  1247. item?.titleName = NSLocalizedString("Magnify Tool", comment: "")
  1248. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsMagnifier)
  1249. item?.target = self
  1250. item?.btnTag = KMToolbarViewType.Magnify.rawValue
  1251. item?.toolTip = NSLocalizedString("Magnify Tool", comment: "")
  1252. item?.boxImagePosition = .imageOnly
  1253. item?.btnAction = #selector(leftControllButtonAction)
  1254. } else if identifier == KMToolbarSelectToolModeItemIdentifier {
  1255. item?.titleName = NSLocalizedString("Content Selection Tool", comment: "")
  1256. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsContentsel)
  1257. item?.target = self
  1258. item?.btnTag = KMToolbarViewType.Select.rawValue
  1259. item?.toolTip = NSLocalizedString("Content Selection Tool", comment: "")
  1260. item?.boxImagePosition = .imageOnly
  1261. item?.btnAction = #selector(leftControllButtonAction)
  1262. } else if identifier == KMToolbarZoomToSelectionItemIdentifier {
  1263. item?.titleName = NSLocalizedString("Zoom to selected area", comment: "")
  1264. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsAreazoom)
  1265. item?.target = self
  1266. item?.btnTag = KMToolbarViewType.SelectZoom.rawValue
  1267. item?.toolTip = NSLocalizedString("Zoom to selected area", comment: "")
  1268. item?.boxImagePosition = .imageOnly
  1269. item?.btnAction = #selector(leftControllButtonAction)
  1270. } else if identifier == KMToolbarHighlightAnnotationItemIdentifier {
  1271. item?.titleName = NSLocalizedString("Highlight", comment: "")
  1272. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
  1273. let imageV = KMNoteTypeImageView()
  1274. let color = UserDefaults.standard.PDFListViewColor(forKey: CHighlightNoteColorKey) ?? .red
  1275. item?.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
  1276. item?.target = self
  1277. item?.btnTag = CAnnotationType.highlight.rawValue
  1278. item?.toolTip = String(format: "%@ (⌃⌘H)", NSLocalizedString("Highlight", comment: ""))
  1279. item?.boxImagePosition = .imageOnly
  1280. item?.btnAction = #selector(changeAnnotationMode)
  1281. } else if identifier == KMToolbarUnderlineAnnotationItemIdentifier {
  1282. item?.titleName = NSLocalizedString("Underline", comment: "")
  1283. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
  1284. let imageV = KMNoteTypeImageView()
  1285. let color = UserDefaults.standard.PDFListViewColor(forKey: CUnderlineNoteColorKey) ?? .red
  1286. item?.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
  1287. item?.target = self
  1288. item?.btnTag = CAnnotationType.underline.rawValue
  1289. item?.toolTip = String(format: "%@ (⇧⌘M)", NSLocalizedString("Underline", comment: ""))
  1290. item?.boxImagePosition = .imageOnly
  1291. item?.btnAction = #selector(changeAnnotationMode)
  1292. } else if identifier == KMToolbarStrikeOutAnnotationItemIdentifier {
  1293. item?.titleName = NSLocalizedString("Strikethrough", comment: "")
  1294. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStrikeout)
  1295. let imageV = KMNoteTypeImageView()
  1296. let color = UserDefaults.standard.PDFListViewColor(forKey: CStrikeOutNoteColorKey) ?? .red
  1297. item?.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
  1298. item?.target = self
  1299. item?.btnTag = CAnnotationType.strikeOut.rawValue
  1300. item?.toolTip = String(format: "%@ (⌃⌘M)", NSLocalizedString("Strikethrough", comment: ""))
  1301. item?.boxImagePosition = .imageOnly
  1302. item?.btnAction = #selector(changeAnnotationMode)
  1303. } else if identifier == KMToolbarInkAnnotationItemIdentifier {
  1304. item?.titleName = NSLocalizedString("Freehand", comment: "")
  1305. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPen)
  1306. let imageV = KMNoteTypeImageView()
  1307. let color = UserDefaults.standard.PDFListViewColor(forKey: CInkNoteColorKey) ?? .red
  1308. item?.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
  1309. item?.target = self
  1310. item?.btnTag = CAnnotationType.ink.rawValue
  1311. item?.toolTip = NSLocalizedString("Add freehand drawings by hand writing just like you do with a pen.", comment: "")
  1312. item?.boxImagePosition = .imageOnly
  1313. item?.btnAction = #selector(changeAnnotationMode)
  1314. } else if identifier == KMToolbarFreeTextAnnotationItemIdentifier {
  1315. item?.titleName = NSLocalizedString("Text Note", comment: "")
  1316. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsText)
  1317. item?.target = self
  1318. item?.btnTag = CAnnotationType.freeText.rawValue
  1319. item?.toolTip = String(format: "%@ (⌘N)", NSLocalizedString("Text Note", comment: ""))
  1320. item?.boxImagePosition = .imageOnly
  1321. item?.btnAction = #selector(changeAnnotationMode)
  1322. } else if identifier == KMToolbarAnchoredAnnotationItemIdentifier {
  1323. item?.titleName = NSLocalizedString("Anchored Note", comment: "")
  1324. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsNote)
  1325. item?.target = self
  1326. item?.btnTag = CAnnotationType.anchored.rawValue
  1327. item?.toolTip = String(format: "%@ (⌥⌘N)", NSLocalizedString("Anchored Note", comment: ""))
  1328. item?.boxImagePosition = .imageOnly
  1329. item?.btnAction = #selector(changeAnnotationMode)
  1330. } else if identifier == KMToolbarSquareAnnotationItemIdentifier {
  1331. item?.titleName = NSLocalizedString("Square", comment: "")
  1332. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsRec)
  1333. item?.target = self
  1334. item?.btnTag = CAnnotationType.square.rawValue
  1335. item?.toolTip = NSLocalizedString("Draw rectangle; draw square by holding Shift key", comment: "")
  1336. item?.boxImagePosition = .imageOnly
  1337. item?.btnAction = #selector(changeAnnotationMode)
  1338. }else if identifier == KMToolbarCircleAnnotationItemIdentifier {
  1339. item?.titleName = NSLocalizedString("oval", comment: "")
  1340. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsOval)
  1341. item?.target = self
  1342. item?.btnTag = CAnnotationType.circle.rawValue
  1343. item?.toolTip = NSLocalizedString("Draw oval; draw circle by holding Shift key", comment: "")
  1344. item?.boxImagePosition = .imageOnly
  1345. item?.btnAction = #selector(changeAnnotationMode)
  1346. } else if identifier == KMToolbarArrowAnnotationItemIdentifier {
  1347. item?.titleName = NSLocalizedString("Arrow", comment: "")
  1348. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsArrow)
  1349. item?.target = self
  1350. item?.btnTag = CAnnotationType.arrow.rawValue
  1351. item?.toolTip = NSLocalizedString("Draw arrow; draw straight arrow by holding Shift key", comment: "")
  1352. item?.boxImagePosition = .imageOnly
  1353. item?.btnAction = #selector(changeAnnotationMode)
  1354. } else if identifier == KMToolbarLineAnnotationItemIdentifier {
  1355. item?.titleName = NSLocalizedString("Square", comment: "")
  1356. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLine)
  1357. item?.target = self
  1358. item?.btnTag = CAnnotationType.line.rawValue
  1359. item?.toolTip = NSLocalizedString("Draw line; draw straight line by holding Shift key", comment: "")
  1360. item?.boxImagePosition = .imageOnly
  1361. item?.btnAction = #selector(changeAnnotationMode)
  1362. } else if identifier == KMToolbarLinkAnnotationItemIdentifier {
  1363. item?.titleName = NSLocalizedString("Link", comment: "")
  1364. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLink)
  1365. item?.target = self
  1366. item?.btnTag = CAnnotationType.link.rawValue
  1367. item?.toolTip = NSLocalizedString("Select an area or text on a page for a link to be inserted.", comment: "")
  1368. item?.boxImagePosition = .imageOnly
  1369. item?.btnAction = #selector(changeAnnotationMode)
  1370. } else if identifier == KMToolbarSignSignatureAnnotationItemIdentifier {
  1371. item?.titleName = NSLocalizedString("SignSignature", comment: "")
  1372. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsSign)
  1373. item?.target = self
  1374. item?.btnTag = CAnnotationType.signSignature.rawValue
  1375. item?.toolTip = NSLocalizedString("Add beautiful handwriting or use your trackpad to create your own signature.", comment: "")
  1376. item?.boxImagePosition = .imageOnly
  1377. item?.btnAction = #selector(changeAnnotationMode)
  1378. } else if identifier == KMAnnotationStampToolbarItemIdentifier {
  1379. item?.titleName = NSLocalizedString("Stamp", comment: "")
  1380. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStamp)
  1381. item?.target = self
  1382. item?.btnTag = CAnnotationType.stamp.rawValue
  1383. item?.toolTip = NSLocalizedString("Add New Stamp", comment: "")
  1384. item?.boxImagePosition = .imageOnly
  1385. item?.btnAction = #selector(changeAnnotationMode)
  1386. } else if identifier == KMToolbarShowToolbarItemIdentifier {
  1387. item?.image = NSImage(named: "KMImageNameMainToolShow")
  1388. item?.selectedImage = NSImage(named: "KMImageNameMainToolHide")
  1389. item?.alternateImage = NSImage(named: "KMImageNameMainToolShow")
  1390. item?.selectedBackgroundColor = NSColor.clear
  1391. item?.target = self
  1392. item?.toolTip = NSLocalizedString("Hide", comment: "")
  1393. item?.titleName = NSLocalizedString("Hide", comment: "")
  1394. item?.boxImagePosition = .imageOnly
  1395. item?.btnAction = #selector(showPDFLayoutMode)
  1396. } else if identifier == KMToolbarAnnotationSettingItemIdentifier {
  1397. item?.image = NSImage(named: "KMImageNameUXIconBtnSetNor")
  1398. item?.target = self
  1399. item?.titleName = NSLocalizedString("Setting", comment: "")
  1400. item?.boxImagePosition = .imageOnly
  1401. item?.btnAction = #selector(_itemAction)
  1402. item?.selectBackgroundType = .imageBox
  1403. } else if identifier == KMAnnotationImageToolbarItemIdentifier {
  1404. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsImage)
  1405. item?.target = self
  1406. item?.titleName = NSLocalizedString("Image", comment: "")
  1407. item?.toolTip = NSLocalizedString("Choose an image to insert in a page.", comment: "")
  1408. item?.boxImagePosition = .imageOnly
  1409. item?.btnAction = #selector(_itemAction)
  1410. } else if identifier == KMAnnotationTableToolbarItemIdentifier {
  1411. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsTable)
  1412. item?.target = self
  1413. item?.btnTag = CAnnotationType.table.rawValue
  1414. item?.titleName = NSLocalizedString("Table", comment: "")
  1415. item?.toolTip = NSLocalizedString("Table", comment: "")
  1416. item?.boxImagePosition = .imageOnly
  1417. item?.btnAction = #selector(_itemAction)
  1418. }
  1419. }
  1420. private func _setupEditItem(_ item: KMToolbarItemView?) {
  1421. let identifier = item?.itemIdentifier
  1422. if identifier == KMToolbarAddTextEditPDFItemIdentifier {
  1423. item?.image = NSImage(named: "KMImageNameMainToolFreeText")
  1424. item?.target = self
  1425. item?.btnTag = CAnnotationType.addText.rawValue
  1426. item?.toolTip = NSLocalizedString("Add Text", comment: "")
  1427. item?.titleName = NSLocalizedString("Add Text", comment: "")
  1428. item?.boxImagePosition = .imageLeft
  1429. item?.btnAction = #selector(changeAnnotationMode)
  1430. } else if identifier == KMToolbarAddImageEditPDFItemIdentifier {
  1431. item?.image = NSImage(named: "KMImageNameMainToolEditImage")
  1432. item?.target = self
  1433. item?.btnTag = CAnnotationType.addImage.rawValue
  1434. item?.toolTip = NSLocalizedString("Add Image", comment: "")
  1435. item?.titleName = NSLocalizedString("Add Image", comment: "")
  1436. item?.boxImagePosition = .imageLeft
  1437. item?.btnAction = #selector(changeAnnotationMode)
  1438. }
  1439. }
  1440. private func _setupConvertItem(_ item: KMToolbarItemView?) {
  1441. let identifier = item?.itemIdentifier
  1442. if identifier == KMToolbarConversionWordItemIdentifier {
  1443. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertWord)
  1444. item?.target = self
  1445. item?.btnTag = KMToolbarType.word.rawValue
  1446. item?.toolTip = NSLocalizedString("Convert all the great work stored in your PDF to a Word document that’s easy to update. Keep the fonts and layouts intact — including bullets and tables.", comment: "")
  1447. item?.titleName = NSLocalizedString("To Word", comment: "")
  1448. item?.boxImagePosition = .imageLeft
  1449. item?.btnAction = #selector(conversionMenuItemAction)
  1450. item?.promptIdentifier = identifier
  1451. } else if identifier == KMToolbarConversionExcelItemIdentifier {
  1452. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExcel)
  1453. item?.target = self
  1454. item?.btnTag = KMToolbarType.excel.rawValue
  1455. item?.toolTip = NSLocalizedString("Skip the data entry steps and tedious reformatting tasks, too. When you convert to Excel, your data is preserved along with your columns, layouts, and formatting.", comment: "")
  1456. item?.titleName = NSLocalizedString("To Excel", comment: "")
  1457. item?.boxImagePosition = .imageLeft
  1458. item?.btnAction = #selector(conversionMenuItemAction)
  1459. item?.promptIdentifier = identifier
  1460. } else if identifier == KMToolbarConversionPPTItemIdentifier {
  1461. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPPT)
  1462. item?.target = self
  1463. item?.btnTag = KMToolbarType.ppt.rawValue
  1464. item?.toolTip = NSLocalizedString("When you use PDF Reader Pro to convert PDFs to PowerPoint, you know your formats will be saved, too. So you don’t have to bother redoing bullets, tables, objects, or master layouts.", comment: "")
  1465. item?.titleName = NSLocalizedString("To PPT", comment: "")
  1466. item?.boxImagePosition = .imageLeft
  1467. item?.btnAction = #selector(conversionMenuItemAction)
  1468. item?.promptIdentifier = identifier
  1469. } else if identifier == KMToolbarConversionRTFItemIdentifier {
  1470. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertRTF)
  1471. item?.target = self
  1472. item?.btnTag = KMToolbarType.rtf.rawValue
  1473. item?.toolTip = NSLocalizedString("Turn PDF documents into Rich Text Format (RTF) files that can be opened in virtually any word processor.", comment: "")
  1474. item?.titleName = NSLocalizedString("To RTF", comment: "")
  1475. item?.boxImagePosition = .imageLeft
  1476. item?.btnAction = #selector(conversionMenuItemAction)
  1477. item?.promptIdentifier = identifier
  1478. } else if identifier == KMToolbarConversionCSVItemIdentifier {
  1479. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCSV)
  1480. item?.target = self
  1481. item?.btnTag = KMToolbarType.csv.rawValue
  1482. item?.toolTip = NSLocalizedString("PDF To CSV", comment: "")
  1483. item?.titleName = NSLocalizedString("To CSV", comment: "")
  1484. item?.boxImagePosition = .imageLeft
  1485. item?.btnAction = #selector(conversionMenuItemAction)
  1486. item?.promptIdentifier = identifier
  1487. } else if identifier == KMToolbarConversionHTMLItemIdentifier {
  1488. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertHtml)
  1489. item?.target = self
  1490. item?.btnTag = KMToolbarType.html.rawValue
  1491. item?.toolTip = NSLocalizedString("PDF To HTML", comment: "")
  1492. item?.titleName = NSLocalizedString("To HTML", comment: "")
  1493. item?.boxImagePosition = .imageLeft
  1494. item?.btnAction = #selector(conversionMenuItemAction)
  1495. } else if identifier == KMToolbarConversionTextItemIdentifier {
  1496. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertText)
  1497. item?.target = self
  1498. item?.btnTag = KMToolbarType.conversion_text.rawValue
  1499. item?.toolTip = NSLocalizedString("PDF To Text", comment: "")
  1500. item?.titleName = NSLocalizedString("To Text", comment: "")
  1501. item?.boxImagePosition = .imageLeft
  1502. item?.btnAction = #selector(conversionMenuItemAction)
  1503. } else if identifier == KMToolbarConversionImageItemIdentifier {
  1504. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPDFToIMG)
  1505. item?.target = self
  1506. item?.btnTag = KMToolbarType.conversion_image.rawValue
  1507. // item?.toolTip = NSLocalizedString("Convert PDF to JPEG, PNG, TIFF, BMP, GIF or TGA files", comment: "")
  1508. item?.titleName = NSLocalizedString("To Image", comment: "")
  1509. item?.boxImagePosition = .imageExpandLeft
  1510. item?.needExpandAction = true
  1511. item?.btnAction = #selector(convertToImage)
  1512. item?.promptIdentifier = identifier
  1513. let menuItem = NSMenuItem.init(title: "To Image", action: #selector(conversionMenuItemAction), target: self)
  1514. let subMenu = NSMenu()
  1515. subMenu.addItem(title: NSLocalizedString("PDF To JPEG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpeg.rawValue)
  1516. subMenu.addItem(title: NSLocalizedString("PDF To JPG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpg.rawValue)
  1517. subMenu.addItem(title: NSLocalizedString("PDF To PNG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.png.rawValue)
  1518. subMenu.addItem(title: NSLocalizedString("PDF To GIF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.gif.rawValue)
  1519. subMenu.addItem(title: NSLocalizedString("PDF To TIFF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tiff.rawValue)
  1520. subMenu.addItem(title: NSLocalizedString("PDF To TGA", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tga.rawValue)
  1521. subMenu.addItem(title: NSLocalizedString("PDF To BMP", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.bmp.rawValue)
  1522. menuItem.submenu = subMenu
  1523. item?.menuFormRepresentation = menuItem
  1524. } else if item?.itemIdentifier == KMToolbarConversionExportImageItemIdentifier {
  1525. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExportImage)
  1526. item?.target = self
  1527. // item?.toolTip = NSLocalizedString("The range you can extract images includes current page, odd page, even page, custom page, and all pages.", comment: "")
  1528. item?.titleName = NSLocalizedString("Extract Images", comment: "")
  1529. item?.boxImagePosition = .imageExpandLeft
  1530. item?.needExpandAction = true
  1531. item?.promptIdentifier = identifier
  1532. let menuItem = NSMenuItem.init(title: "To Image", action: nil, target: self)
  1533. let subMenu = NSMenu()
  1534. subMenu.addItem(title: NSLocalizedString("Extract All Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 1)
  1535. subMenu.addItem(title: NSLocalizedString("Extract Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 2)
  1536. menuItem.submenu = subMenu
  1537. item?.menuFormRepresentation = menuItem
  1538. } else if item?.itemIdentifier == KMToolbarConversionOCRIdentifier {
  1539. item?.titleName = NSLocalizedString("OCR", comment: "")
  1540. item?.target = self
  1541. item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
  1542. item?.boxImagePosition = .imageLeft
  1543. item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
  1544. item?.btnAction = #selector(_itemAction)
  1545. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
  1546. menuItem.representedObject = KMToolbarConversionOCRIdentifier
  1547. item?.menuFormRepresentation = menuItem
  1548. } else if item?.itemIdentifier == KMToolbarConversionCreatePDFItemIdentifier {
  1549. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCreatPDF)
  1550. item?.target = self
  1551. // item?.toolTip = NSLocalizedString("Convert JPEG, JPG, PNG, TIFF, BMP or PSD files to PDFs", comment: "")
  1552. item?.titleName = NSLocalizedString("New PDF Document", comment: "")
  1553. item?.boxImagePosition = .imageExpandLeft
  1554. item?.needExpandAction = true
  1555. let menuItem = NSMenuItem.init(title: "New PDF Document", action: nil, target: self)
  1556. let subMenu = NSMenu()
  1557. subMenu.addItem(title: NSLocalizedString("New Blank Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 1)
  1558. subMenu.addItem(title: NSLocalizedString("New From Images", comment: ""), action: #selector(_newPDFAction), target: self, tag: 2)
  1559. subMenu.addItem(NSMenuItem.separator())
  1560. subMenu.addItem(title: NSLocalizedString("New From Web Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 3)
  1561. subMenu.addItem(title: NSLocalizedString("Import From Camera", comment: ""), action: #selector(_newPDFAction), target: self, tag: 4)
  1562. subMenu.addItem(NSMenuItem.separator())
  1563. subMenu.addItem(title: NSLocalizedString("Import From Scanner", comment: ""), action: #selector(_newPDFAction), target: self, tag: 5)
  1564. menuItem.submenu = subMenu
  1565. item?.menuFormRepresentation = menuItem
  1566. }
  1567. }
  1568. @objc func convertToImage(_ sender: KMToolbarItem) {
  1569. // if let subMenu = sender.menuFormRepresentation?.submenu {
  1570. // subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  1571. // }
  1572. }
  1573. private func _setupFillSignItem(_ item: KMToolbarItemView?) {
  1574. let identifier = item?.itemIdentifier
  1575. if identifier == KMToolbarToolHookItemIdentifier {
  1576. item?.image = NSImage(named: "KMImageNameFillSignHook")
  1577. item?.target = self
  1578. item?.btnTag = CAnnotationType.signTure.rawValue
  1579. item?.toolTip = NSLocalizedString("Signature", comment: "")
  1580. item?.titleName = NSLocalizedString("Signature", comment: "")
  1581. item?.boxImagePosition = .imageOnly
  1582. item?.btnAction = #selector(changeAnnotationMode)
  1583. } else if identifier == KMToolbarToolForkItemIdentifier {
  1584. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignFork)
  1585. item?.target = self
  1586. item?.btnTag = CAnnotationType.signFalse.rawValue
  1587. item?.toolTip = NSLocalizedString("Add X", comment: "")
  1588. item?.boxImagePosition = .imageOnly
  1589. item?.btnAction = #selector(changeAnnotationMode)
  1590. } else if identifier == KMToolbarToolLineItemIdentifier {
  1591. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignLine)
  1592. item?.target = self
  1593. item?.btnTag = CAnnotationType.signLine.rawValue
  1594. item?.toolTip = NSLocalizedString("Add line", comment: "")
  1595. item?.boxImagePosition = .imageOnly
  1596. item?.btnAction = #selector(changeAnnotationMode)
  1597. } else if identifier == KMToolbarToolDotItemIdentifier {
  1598. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignPoint)
  1599. item?.target = self
  1600. item?.btnTag = CAnnotationType.signDot.rawValue
  1601. item?.toolTip = NSLocalizedString("Add dot", comment: "")
  1602. item?.boxImagePosition = .imageOnly
  1603. item?.btnAction = #selector(changeAnnotationMode)
  1604. } else if identifier == KMToolbarToolRectangleIdentifier {
  1605. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignRoundedrec)
  1606. item?.target = self
  1607. item?.btnTag = CAnnotationType.signCircle.rawValue
  1608. item?.toolTip = NSLocalizedString("Add circle", comment: "")
  1609. item?.boxImagePosition = .imageOnly
  1610. item?.btnAction = #selector(changeAnnotationMode)
  1611. } else if identifier == KMToolbarToolTextIdentifier {
  1612. item?.image = NSImage(named: KMImageNameToolbarFreeText)
  1613. item?.target = self
  1614. item?.btnTag = CAnnotationType.signText.rawValue
  1615. item?.toolTip = NSLocalizedString("Add text", comment: "")
  1616. item?.titleName = NSLocalizedString("Text", comment: "")
  1617. item?.boxImagePosition = .imageOnly
  1618. item?.btnAction = #selector(changeAnnotationMode)
  1619. } else if identifier == KMToolbarToolDateIdentifier {
  1620. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignDate)
  1621. item?.target = self
  1622. item?.btnTag = CAnnotationType.signDate.rawValue
  1623. item?.toolTip = NSLocalizedString("Date", comment: "")
  1624. item?.boxImagePosition = .imageOnly
  1625. item?.btnAction = #selector(changeAnnotationMode)
  1626. } else if (identifier == KMToolbarToolProfileIdentifier) {
  1627. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMyprofile)
  1628. item?.target = self
  1629. item?.toolTip = NSLocalizedString("My Profile", comment: "")
  1630. item?.boxImagePosition = .imageOnly
  1631. item?.btnAction = #selector(_itemAction)
  1632. }else if (identifier == KMToolbarFillSignSignatureIdentifier) {
  1633. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMysignature)
  1634. item?.target = self
  1635. item?.btnTag = CAnnotationType.signSignature.rawValue
  1636. item?.toolTip = NSLocalizedString("Sign document by typing or drawing a signature", comment: "")
  1637. item?.boxImagePosition = .imageOnly
  1638. item?.btnAction = #selector(changeAnnotationMode)
  1639. }
  1640. }
  1641. private func _setupFormItem(_ item: KMToolbarItemView?) {
  1642. let identifier = item?.itemIdentifier
  1643. if identifier == KMToolbarToolTextFieldItemIdentifier {
  1644. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormTextfield)
  1645. item?.target = self
  1646. item?.btnTag = CAnnotationType.textField.rawValue
  1647. item?.toolTip = NSLocalizedString("Text Field", comment: "")
  1648. item?.titleName = NSLocalizedString("Text Field", comment: "")
  1649. item?.boxImagePosition = .imageLeft
  1650. item?.btnAction = #selector(changeAnnotationMode)
  1651. let menuItem = NSMenuItem.init(title: "TextField", action: #selector(changeAnnotationMode), target: self)
  1652. menuItem.tag = item!.btnTag
  1653. item?.menuFormRepresentation = menuItem
  1654. } else if identifier == KMToolbarToolCheckBoxItemIdentifier {
  1655. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormCheckbox)
  1656. item?.target = self
  1657. item?.btnTag = CAnnotationType.checkBox.rawValue
  1658. item?.toolTip = NSLocalizedString("Check Box", comment: "")
  1659. item?.titleName = NSLocalizedString("Check Box", comment: "")
  1660. item?.boxImagePosition = .imageLeft
  1661. item?.btnAction = #selector(changeAnnotationMode)
  1662. } else if identifier == KMToolbarToolRadioButtonItemIdentifier {
  1663. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormRadiobutton)
  1664. item?.target = self
  1665. item?.btnTag = CAnnotationType.radioButton.rawValue
  1666. item?.toolTip = NSLocalizedString("Radio Button", comment: "")
  1667. item?.titleName = NSLocalizedString("Radio Button", comment: "")
  1668. item?.boxImagePosition = .imageLeft
  1669. item?.btnAction = #selector(changeAnnotationMode)
  1670. let menuItem = NSMenuItem.init(title: "RadioButton", action: #selector(changeAnnotationMode), target: self)
  1671. menuItem.tag = item!.btnTag
  1672. item?.menuFormRepresentation = menuItem
  1673. } else if identifier == KMToolbarToolListBoxItemIdentifier {
  1674. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormListbox)
  1675. item?.target = self
  1676. item?.btnTag = CAnnotationType.listMenu.rawValue
  1677. item?.toolTip = NSLocalizedString("List Box", comment: "")
  1678. item?.titleName = NSLocalizedString("List Box", comment: "")
  1679. item?.boxImagePosition = .imageLeft
  1680. item?.btnAction = #selector(changeAnnotationMode)
  1681. let menuItem = NSMenuItem.init(title: "List Box", action: #selector(changeAnnotationMode), target: self)
  1682. menuItem.tag = item!.btnTag
  1683. item?.menuFormRepresentation = menuItem
  1684. } else if identifier == KMToolbarToolPullDownmenuItemIdentifier {
  1685. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormPulldownmenu)
  1686. item?.target = self
  1687. item?.btnTag = CAnnotationType.comboBox.rawValue
  1688. item?.toolTip = NSLocalizedString("Combo Box", comment: "")
  1689. item?.titleName = NSLocalizedString("Combo Box", comment: "")
  1690. item?.boxImagePosition = .imageLeft
  1691. item?.btnAction = #selector(changeAnnotationMode)
  1692. let menuItem = NSMenuItem.init(title: "PullDownmenu", action: #selector(changeAnnotationMode), target: self)
  1693. menuItem.tag = item!.btnTag
  1694. item?.menuFormRepresentation = menuItem
  1695. } else if identifier == KMToolbarToolButtonIdentifier {
  1696. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormButton)
  1697. item?.target = self
  1698. item?.btnTag = CAnnotationType.actionButton.rawValue
  1699. item?.toolTip = NSLocalizedString("Button", comment: "")
  1700. item?.titleName = NSLocalizedString("Button", comment: "")
  1701. item?.boxImagePosition = .imageLeft
  1702. item?.btnAction = #selector(changeAnnotationMode)
  1703. let menuItem = NSMenuItem.init(title: "Button", action: #selector(changeAnnotationMode), target: self)
  1704. menuItem.tag = item!.btnTag
  1705. item?.menuFormRepresentation = menuItem
  1706. } else if identifier == KMToolbarToolSignBoxIdentifier {
  1707. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormSign)
  1708. item?.target = self
  1709. item?.btnTag = CAnnotationType.signature.rawValue
  1710. item?.toolTip = NSLocalizedString("Signature", comment: "")
  1711. item?.titleName = NSLocalizedString("Signature", comment: "")
  1712. item?.boxImagePosition = .imageLeft
  1713. item?.btnAction = #selector(changeAnnotationMode)
  1714. let menuItem = NSMenuItem.init(title: "SignBox", action: #selector(changeAnnotationMode), target: self)
  1715. menuItem.tag = item!.btnTag
  1716. item?.menuFormRepresentation = menuItem
  1717. } else if identifier == KMToolbarToolFormAlignIdentifier {
  1718. item?.image = NSImage(named: KMImageNameUXIconPropertybarAlignLeftToor)
  1719. item?.target = self
  1720. // item?.toolTip = NSLocalizedString("Alignment", comment: "")
  1721. item?.titleName = NSLocalizedString("", comment: "")
  1722. item?.boxImagePosition = .imageExpandLeft
  1723. item?.needExpandAction = true
  1724. item?.btnAction = #selector(formsAlignmentAction)
  1725. let menuItem = NSMenuItem.init(title: "Alignment", action: #selector(formsAlignmentAction), target: self)
  1726. let subMenu = NSMenu()
  1727. subMenu.addItem(title: NSLocalizedString("Align Left", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignLeftNor", action: #selector(_alignmentAction), target: self, tag: 0)
  1728. subMenu.addItem(title: NSLocalizedString("Align Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVercenterNor", action: #selector(_alignmentAction), target: self, tag: 1)
  1729. subMenu.addItem(title: NSLocalizedString("Align Right", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignRightNor", action: #selector(_alignmentAction), target: self, tag: 2)
  1730. subMenu.addItem(NSMenuItem.separator())
  1731. subMenu.addItem(title: NSLocalizedString("Align Top", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignUpNor", action: #selector(_alignmentAction), target: self, tag: 3)
  1732. subMenu.addItem(title: NSLocalizedString("Align Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorcenterNor", action: #selector(_alignmentAction), target: self, tag: 4)
  1733. subMenu.addItem(title: NSLocalizedString("Align Bottom", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignDownNor", action: #selector(_alignmentAction), target: self, tag: 5)
  1734. subMenu.addItem(NSMenuItem.separator())
  1735. subMenu.addItem(title: NSLocalizedString("Distribute Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorsplitNor", action: #selector(_alignmentAction), target: self, tag: 6)
  1736. subMenu.addItem(title: NSLocalizedString("Distribute Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVersplitNor", action: #selector(_alignmentAction), target: self, tag: 7)
  1737. menuItem.submenu = subMenu
  1738. menuItem.tag = item!.btnTag
  1739. item?.menuFormRepresentation = menuItem
  1740. } else if identifier == KMToolbarToolFormMoreIdentifier {
  1741. item?.image = NSImage(named: "KMImageNameMainToolFormMore")
  1742. item?.target = self
  1743. item?.toolTip = NSLocalizedString("More", comment: "")
  1744. item?.titleName = NSLocalizedString("More", comment: "")
  1745. item?.boxImagePosition = .imageExpandLeft
  1746. item?.btnAction = #selector(formsMoreOperationAction)
  1747. let menuItem = NSMenuItem.init(title: "More", action: #selector(formsMoreOperationAction), target: self)
  1748. menuItem.tag = item!.btnTag
  1749. item?.menuFormRepresentation = menuItem
  1750. }
  1751. }
  1752. private func _setupViewDisplayItem(_ item: KMToolbarItemView?) {
  1753. let identifier = item?.itemIdentifier
  1754. if identifier == KMToolbarViewSettingIdentifier {
  1755. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayView)
  1756. item?.target = self
  1757. item?.toolTip = NSLocalizedString("View Settings", comment: "")
  1758. item?.titleName = NSLocalizedString("View Settings", comment: "")
  1759. item?.boxImagePosition = .imageLeft
  1760. item?.btnAction = #selector(_itemAction)
  1761. } else if identifier == KMToolbarCropIdentifier {
  1762. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTailor)
  1763. item?.target = self
  1764. // item?.toolTip = NSLocalizedString("Note: Cropping a PDF hides some of the PDF’s content without removing it.", comment: "")
  1765. item?.titleName = NSLocalizedString("Crop", comment: "")
  1766. item?.boxImagePosition = .imageExpandLeft
  1767. item?.needExpandAction = true
  1768. // item?.btnAction = #selector(cropMenuAction)
  1769. let menuItem = NSMenuItem.init(title: "Crop", action: #selector(cropMenuAction), target: self)
  1770. let subMenu = NSMenu()
  1771. // subMenu.addItem(title: NSLocalizedString("Crop All Pages", comment: ""), action: #selector(_cropAction), target: self, tag: 1)
  1772. subMenu.addItem(title: NSLocalizedString("Crop Current Page", comment: ""), action: #selector(_cropAction), target: self, tag: 2)
  1773. subMenu.addItem(title: NSLocalizedString("Auto Crop – Separate", comment: ""), action: #selector(_cropAction), target: self, tag: 3)
  1774. subMenu.addItem(title: NSLocalizedString("Auto Crop – Combined", comment: ""), action: #selector(_cropAction), target: self, tag: 4)
  1775. subMenu.addItem(title: NSLocalizedString("Select Area", comment: ""), action: #selector(_cropAction), target: self, tag: 5)
  1776. // subMenu.addItem(title: NSLocalizedString("Crop Options...", comment: ""), action: #selector(_cropAction), target: self, tag: 6)
  1777. menuItem.submenu = subMenu
  1778. item?.menuFormRepresentation = menuItem
  1779. } else if identifier == KMToolbarSnapshotIdentifier {
  1780. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplaySnapshot)
  1781. item?.target = self
  1782. item?.toolTip = NSLocalizedString("Take Snapshot", comment: "")
  1783. item?.titleName = NSLocalizedString("Snapshot", comment: "")
  1784. item?.boxImagePosition = .imageLeft
  1785. item?.btnAction = #selector(_itemAction)
  1786. } else if identifier == KMToolbarTTSIdentifier {
  1787. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTTS)
  1788. item?.target = self
  1789. item?.toolTip = NSLocalizedString("TTS (Text-to-speech)", comment: "")
  1790. item?.titleName = NSLocalizedString("TTS", comment: "")
  1791. item?.boxImagePosition = .imageLeft
  1792. item?.btnAction = #selector(_itemAction)
  1793. }
  1794. }
  1795. private func _setupToolItem(_ item: KMToolbarItemView?) {
  1796. let identifier = item?.itemIdentifier
  1797. if identifier == KMToolbarToolCropItemIdentifier {
  1798. item?.image = NSImage(named: "KMImageNameMainToolsCrop")
  1799. item?.alternateImage = NSImage(named: "KMImageNameMainToolsCrop")
  1800. item?.target = self
  1801. item?.btnTag = KMToolbarType.crop.rawValue
  1802. item?.toolTip = NSLocalizedString("Crop pages", comment: "")
  1803. item?.titleName = NSLocalizedString("Crop", comment: "")
  1804. item?.boxImagePosition = .imageExpandLeft
  1805. item?.btnAction = #selector(cropMenuAction)
  1806. let menuItem = NSMenuItem.init(title: "Crop", action: #selector(cropMenuAction), target: self)
  1807. item?.menuFormRepresentation = menuItem
  1808. } else if identifier == KMToolbarComparisonItemIdentifier {
  1809. item?.image = NSImage(named: KMImageNameUXIconBatchComparison)
  1810. item?.target = self
  1811. item?.btnTag = KMToolbarType.comparison.rawValue
  1812. // item?.toolTip = NSLocalizedString("Compare", comment: "")
  1813. item?.titleName = NSLocalizedString("Compare", comment: "")
  1814. item?.boxImagePosition = .imageExpandLeft
  1815. item?.needExpandAction = true
  1816. // item?.btnAction = #selector(_itemAction)
  1817. let menuItem = NSMenuItem.init(title: "Bates Number", action: #selector(_menuItemAction), target: self)
  1818. let subMenu = NSMenu()
  1819. subMenu.addItem(title: NSLocalizedString("Side-by-Side View", comment: ""), action: #selector(_comparisonAction), target: self, tag: 1)
  1820. subMenu.addItem(title: NSLocalizedString("Compare by File Overlay", comment: ""), action: #selector(_comparisonAction), target: self, tag: 2)
  1821. menuItem.submenu = subMenu
  1822. item?.menuFormRepresentation = menuItem
  1823. } else if identifier == KMToolbarToolBatesItemIdentifier {
  1824. item?.image = NSImage(named: "KMImageNameUXIconBatchBatesNor")
  1825. item?.target = self
  1826. item?.btnTag = KMToolbarType.bates.rawValue
  1827. // item?.toolTip = NSLocalizedString("Add PDF Bates numbering to your legal, medical, or business documents", comment: "")
  1828. item?.titleName = NSLocalizedString("Bates Number", comment: "")
  1829. item?.boxImagePosition = .imageExpandLeft
  1830. item?.needExpandAction = true
  1831. // item?.btnAction = #selector(batesMenuAction)
  1832. let menuItem = NSMenuItem.init(title: "Bates Number", action: #selector(batesMenuAction), target: self)
  1833. let subMenu = NSMenu()
  1834. subMenu.addItem(title: NSLocalizedString("Add Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 1)
  1835. subMenu.addItem(title: NSLocalizedString("Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 2)
  1836. subMenu.addItem(title: NSLocalizedString("Batch Add Batch Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 3)
  1837. subMenu.addItem(title: NSLocalizedString("Batch Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 4)
  1838. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_batesAction), target: self, tag: 5)
  1839. menuItem.submenu = subMenu
  1840. item?.menuFormRepresentation = menuItem
  1841. } else if identifier == KMToolbarToolHeaderFooterItemIdentifier {
  1842. item?.image = NSImage(named: "KMImageNameUXIconBatchHeaderandfooterNor")
  1843. item?.target = self
  1844. item?.btnTag = KMToolbarType.headerAndFooter.rawValue
  1845. // item?.toolTip = NSLocalizedString("Insert header, footer, and page numbers to PDF", comment: "")
  1846. item?.titleName = NSLocalizedString("Header & Footer", comment: "")
  1847. item?.boxImagePosition = .imageExpandLeft
  1848. item?.needExpandAction = true
  1849. // item?.btnAction = #selector(headerfooterMenuAction)
  1850. let menuItem = NSMenuItem.init(title: "Header & Footer", action: #selector(headerfooterMenuAction), target: self)
  1851. let subMenu = NSMenu()
  1852. subMenu.addItem(title: NSLocalizedString("Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 1)
  1853. subMenu.addItem(title: NSLocalizedString("Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 2)
  1854. subMenu.addItem(title: NSLocalizedString("Batch Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 3)
  1855. subMenu.addItem(title: NSLocalizedString("Batch Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 4)
  1856. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 5)
  1857. menuItem.submenu = subMenu
  1858. item?.menuFormRepresentation = menuItem
  1859. } else if identifier == KMToolbarToolBackgroundItemIdentifier {
  1860. item?.image = NSImage(named: "KMImageNameUXIconBatchBackgroundNor")
  1861. item?.target = self
  1862. item?.btnTag = KMToolbarType.background.rawValue
  1863. // item?.toolTip = NSLocalizedString("Insert PDF page background by color or image", comment: "")
  1864. item?.titleName = NSLocalizedString("Backgroud", comment: "")
  1865. item?.boxImagePosition = .imageExpandLeft
  1866. item?.needExpandAction = true
  1867. // item?.btnAction = #selector(backgroundMenuAction)
  1868. let menuItem = NSMenuItem.init(title: "Backgroud", action: #selector(backgroundMenuAction), target: self)
  1869. let subMenu = NSMenu()
  1870. subMenu.addItem(title: NSLocalizedString("Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 1)
  1871. subMenu.addItem(title: NSLocalizedString("Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 2)
  1872. subMenu.addItem(title: NSLocalizedString("Batch Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 3)
  1873. subMenu.addItem(title: NSLocalizedString("Batch Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 4)
  1874. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_backgroundAction), target: self, tag: 5)
  1875. menuItem.submenu = subMenu
  1876. item?.menuFormRepresentation = menuItem
  1877. } else if identifier == KMToolbarToolWatermarkItemIdentifier {
  1878. item?.image = NSImage(named: "KMImageNameMainToolsWatermark")
  1879. item?.target = self
  1880. item?.btnTag = KMToolbarType.watermark.rawValue
  1881. // item?.toolTip = NSLocalizedString("Watermark", comment: "")
  1882. item?.titleName = NSLocalizedString("Watermark", comment: "")
  1883. item?.boxImagePosition = .imageExpandLeft
  1884. item?.needExpandAction = true
  1885. // item?.btnAction = #selector(watermarkMenuAction)
  1886. let menuItem = NSMenuItem.init(title: "Watermark", action: #selector(watermarkMenuAction), target: self)
  1887. let subMenu = NSMenu()
  1888. subMenu.addItem(title: NSLocalizedString("Add Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 1)
  1889. subMenu.addItem(title: NSLocalizedString("Remove Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 2)
  1890. subMenu.addItem(title: NSLocalizedString("Batch Add Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 3)
  1891. subMenu.addItem(title: NSLocalizedString("Batch Remove Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 4)
  1892. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_watermarkAction), target: self, tag: 5)
  1893. menuItem.submenu = subMenu
  1894. item?.menuFormRepresentation = menuItem
  1895. } else if identifier == KMToolbarToolCompressItemIdentifier {
  1896. item?.image = NSImage(named: "KMImageNameUXIconBatchOptimizeNor")
  1897. item?.target = self
  1898. item?.btnTag = KMToolbarType.compress.rawValue
  1899. item?.boxImagePosition = .imageLeft
  1900. item?.toolTip = NSLocalizedString("Reduce file size", comment: "")
  1901. item?.titleName = NSLocalizedString("Compress", comment: "")
  1902. item?.btnAction = #selector(compressMenuAction)
  1903. } else if identifier == KMToolbarToolSecureItemIdentifier {
  1904. item?.image = NSImage(named: "KMImageNameUXIconBatchSafeNor")
  1905. item?.target = self
  1906. // item?.toolTip = NSLocalizedString("Batch encrypting PDF documents", comment: "")
  1907. item?.titleName = NSLocalizedString("Security", comment: "")
  1908. item?.boxImagePosition = .imageExpandLeft
  1909. item?.needExpandAction = true
  1910. // item?.btnAction = #selector(secureMenuAction)
  1911. let menuItem = NSMenuItem.init(title: NSLocalizedString("Security", comment: ""), action: #selector(secureMenuAction), target: self)
  1912. let subMenu = NSMenu()
  1913. subMenu.addItem(title: NSLocalizedString("Set Passwords", comment: ""), action: #selector(_secureAction), target: self, tag: 1)
  1914. subMenu.addItem(title: NSLocalizedString("Remove Security", comment: ""), action: #selector(_secureAction), target: self, tag: 2)
  1915. menuItem.submenu = subMenu
  1916. item?.menuFormRepresentation = menuItem
  1917. }else if identifier == KMToolbarToolMergeItemIdentifier {
  1918. item?.image = NSImage(named: "KMImageNameUXIconBatchMergeNor")
  1919. item?.target = self
  1920. item?.btnTag = KMToolbarType.merge.rawValue
  1921. item?.toolTip = NSLocalizedString("Combine multiple documents into a new PDF, or borrow individual pages", comment: "")
  1922. item?.titleName = NSLocalizedString("Merge", comment: "")
  1923. item?.boxImagePosition = .imageLeft
  1924. item?.btnAction = #selector(mergeMenuItemAction)
  1925. }
  1926. }
  1927. }
  1928. extension KMToolbarViewController: NSMenuItemValidation {
  1929. func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
  1930. if menuItem.action == #selector(toggleCaseInsensitiveSearch) {
  1931. menuItem.state = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey) == 1 ? .on : .off
  1932. }
  1933. return true
  1934. }
  1935. }
  1936. extension KMToolbarViewController {
  1937. func isEnable(isEnable: Bool = true) {
  1938. for item in toolbarItems {
  1939. let itemView: KMToolbarMainItemView = item.value as? KMToolbarMainItemView ?? KMToolbarMainItemView()
  1940. itemView.unEnabled = !isEnable
  1941. itemView.isSelected = false
  1942. }
  1943. }
  1944. }