KMToolbarViewController.swift 148 KB

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