KMToolbarViewController.swift 127 KB

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