KMToolbarViewController.swift 128 KB

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