KMToolbarViewController.swift 155 KB

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