KMToolbarViewController.swift 152 KB

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