KMToolbarViewController.swift 134 KB

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