KMToolbarViewController.swift 139 KB

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