KMToolbarViewController.swift 127 KB

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