KMToolbarViewController.swift 129 KB

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