KMToolbarViewController.swift 148 KB

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