KMToolbarViewController.swift 131 KB

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