KMToolbarViewController.swift 129 KB

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