KMToolbarViewController.swift 144 KB

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