KMToolbarViewController.swift 151 KB

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