KMToolbarViewController.swift 138 KB

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