KMToolbarViewController.swift 151 KB

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