KMToolbarViewController.swift 148 KB

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