KMToolbarViewController.swift 155 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800
  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. func zoomDidChange(pdfView: CPDFView?) {
  608. guard let scale = pdfView?.scaleFactor else {
  609. return
  610. }
  611. // 置空数据
  612. for item in self.zoomButton.itemArray {
  613. item.state = .off
  614. }
  615. if scale == 0.1 {
  616. let item = self.zoomButton.itemArray.safe_element(for: 5) as? NSMenuItem
  617. item?.state = .on
  618. } else if scale == 0.25 {
  619. let item = self.zoomButton.itemArray.safe_element(for: 6) as? NSMenuItem
  620. item?.state = .on
  621. } else if scale == 0.5 {
  622. let item = self.zoomButton.itemArray.safe_element(for: 7) as? NSMenuItem
  623. item?.state = .on
  624. } else if scale == 0.75 {
  625. let item = self.zoomButton.itemArray.safe_element(for: 8) as? NSMenuItem
  626. item?.state = .on
  627. } else if scale == 1 {
  628. let item = self.zoomButton.itemArray.safe_element(for: 9) as? NSMenuItem
  629. item?.state = .on
  630. } else if scale == 1.5 {
  631. let item = self.zoomButton.itemArray.safe_element(for: 10) as? NSMenuItem
  632. item?.state = .on
  633. } else if scale == 2 {
  634. let item = self.zoomButton.itemArray.safe_element(for: 11) as? NSMenuItem
  635. item?.state = .on
  636. } else if scale == 4 {
  637. let item = self.zoomButton.itemArray.safe_element(for: 12) as? NSMenuItem
  638. item?.state = .on
  639. } else if scale == 8 {
  640. let item = self.zoomButton.itemArray.safe_element(for: 13) as? NSMenuItem
  641. item?.state = .on
  642. } else if scale == 16 {
  643. let item = self.zoomButton.itemArray.safe_element(for: 14) as? NSMenuItem
  644. item?.state = .on
  645. } else if scale == 32 {
  646. let item = self.zoomButton.itemArray.safe_element(for: 15) as? NSMenuItem
  647. item?.state = .on
  648. } else if scale == 64 {
  649. let item = self.zoomButton.itemArray.safe_element(for: 16) as? NSMenuItem
  650. item?.state = .on
  651. } else if scale == 100 {
  652. let item = self.zoomButton.itemArray.safe_element(for: 17) as? NSMenuItem
  653. item?.state = .on
  654. }
  655. }
  656. }
  657. extension KMToolbarViewController : KMToolbarViewDelegate,NSToolbarItemValidation {
  658. func toolbarLeftDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  659. if toolbarType == .Main {
  660. if let model = KMDataManager.toolbar_getData() {
  661. return model.leftCellIdentifiers ?? []
  662. }
  663. return [KMLeftControlToolbarItemIdentifier,
  664. KMNewToolbarSpaceItemIdentifier, KMDocumentZoomViewToolbarItemIdentifier,
  665. KMDocumentPreviousPageToolbarItemIdentifier, KMDocumentHomeToolbarItemIdentifier]
  666. }
  667. return []
  668. }
  669. func toolbarRightDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  670. if toolbarType == .Main {
  671. if let model = KMDataManager.toolbar_getData() {
  672. return model.rightCellIdentifiers ?? []
  673. }
  674. return [KMDocumentViewDisplayToolbarItemIdentifier, KMDocumentShareToolbarItemIdentifier,
  675. KMDocumentSearchToolbarItemIdentifier, KMRightControlToolbarItemIdentifier]
  676. } else if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) {
  677. // return [KMToolbarAnnotationSettingItemIdentifier]
  678. }
  679. return []
  680. }
  681. func toolbarAllowedItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  682. switch toolbarType {
  683. case .None:
  684. return []
  685. case .Main:
  686. var defaultCellIdentifiers = mainToolIdentifiers
  687. if defaultCellIdentifiers.contains(KMDocumentHomeToolbarItemIdentifier) {
  688. defaultCellIdentifiers.removeObject(KMDocumentHomeToolbarItemIdentifier)
  689. }
  690. return defaultCellIdentifiers
  691. case .Annatiton,.Magnify,.Move,.Select,.SelectZoom:
  692. // return annotationToolIdentifiers
  693. return [KMNewToolbarSpaceItemIdentifier,
  694. KMToolbarPageEditInsetItemIdentifier, KMToolbarToolMergeItemIdentifier, KMToolbarPageEditSplitItemIdentifier,
  695. KMToolbarToolCompressItemIdentifier, KMToolbarToolSecureItemIdentifier, KMToolbarToolWatermarkItemIdentifier,
  696. KMToolbarToolBackgroundItemIdentifier, KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier,KMToolbarMeasureItemIdentifier,
  697. KMToolbarAIItemIdentifier,
  698. KMToolbarCropIdentifier,
  699. KMToolbarConversionWordItemIdentifier, KMToolbarConversionExcelItemIdentifier, KMToolbarConversionPPTItemIdentifier,
  700. KMToolbarConversionRTFItemIdentifier, KMToolbarConversionCSVItemIdentifier, KMToolbarConversionHTMLItemIdentifier,
  701. KMToolbarConversionTextItemIdentifier, KMToolbarConversionImageItemIdentifier,
  702. KMToolbarMoveToolModeItemIdentifier,
  703. KMToolbarMagnifyToolModeItemIdentifier,
  704. KMToolbarSelectToolModeItemIdentifier,
  705. KMToolbarZoomToSelectionItemIdentifier,
  706. KMNewToolbarSpaceItemIdentifier,
  707. KMToolbarDividerItemIdentifier,
  708. KMNewToolbarSpaceItemIdentifier,
  709. KMToolbarHighlightAnnotationItemIdentifier,
  710. KMToolbarUnderlineAnnotationItemIdentifier,
  711. KMToolbarStrikeOutAnnotationItemIdentifier, KMToolbarSquigglyAnnotationItemIdentifier,
  712. KMToolbarInkAnnotationItemIdentifier, KMToolbarEraserAnnotationItemIdentifier,
  713. KMToolbarFreeTextAnnotationItemIdentifier,
  714. KMToolbarAnchoredAnnotationItemIdentifier,
  715. KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
  716. KMToolbarLinkAnnotationItemIdentifier,
  717. KMAnnotationStampToolbarItemIdentifier,
  718. KMToolbarSignSignatureAnnotationItemIdentifier,
  719. KMToolbarDividerItemIdentifier,
  720. KMToolbarShowToolbarItemIdentifier
  721. //
  722. // KMToolbarToolRadioButtonItemIdentifier
  723. ]
  724. case .editPDF:
  725. return editPDFItemIdentifiers
  726. case .Page:
  727. return pageEditToolIdentifiers
  728. case .Tool:
  729. return toolToolIdentifiers
  730. case .Form:
  731. return formToolIdentifiers
  732. case .FillSign:
  733. return fillSignToolIdentifiers
  734. case .Conversion:
  735. return conversionToolIdentifiers
  736. case .viewSetting:
  737. return [KMToolbarViewSettingIdentifier, KMToolbarCropIdentifier,
  738. KMToolbarSnapshotIdentifier, KMToolbarTTSIdentifier]
  739. default:
  740. break
  741. }
  742. return []
  743. }
  744. func toolbarDefaultItemIdentifiers(_ toolbar: KMToolbarView) -> [String] {
  745. switch toolbarType {
  746. case .None:
  747. return []
  748. case .Main:
  749. if let model = KMDataManager.toolbar_getData() {
  750. return model.centerCellIdentifiers ?? []
  751. }
  752. return [KMDocumentAnnotationToolbarItemIdentifier,
  753. KMDocumentPageToolbarItemIdentifier,
  754. KMDocumentToolToolbarItemIdentifier,
  755. KMDocumentConversonToolbarItemIdentifier,
  756. KMDocumentFormToolbarItemIdentifier,
  757. KMDocumentFillSginToolbarItemIdentifier,
  758. KMDocumentEditToolbarItemIdentifier,
  759. KMDocumentSignToolbarItemIdentifier,
  760. KMDocumentRedactToolbarItemIdentifier,
  761. KMDocumentScanOCRToolbarItemIdentifier,
  762. KMDocumentAIToolsToolbarItemIdentifier]
  763. case .Annatiton,.Magnify,.Move,.Select,.SelectZoom:
  764. let itemIdentifiers: [String]? = self.toolbar?.toolbarIdentifier != nil ? (UserDefaults.standard.object(forKey: self.toolbar?.toolbarIdentifier ?? "") as? [String]) : []
  765. if itemIdentifiers == nil || itemIdentifiers!.count <= 0 {
  766. return [KMToolbarMoveToolModeItemIdentifier,
  767. KMToolbarMagnifyToolModeItemIdentifier,
  768. KMToolbarSelectToolModeItemIdentifier,
  769. KMToolbarZoomToSelectionItemIdentifier,
  770. KMNewToolbarSpaceItemIdentifier,
  771. KMNewToolbarSpaceItemIdentifier,
  772. KMToolbarHighlightAnnotationItemIdentifier,
  773. KMToolbarUnderlineAnnotationItemIdentifier,
  774. KMToolbarStrikeOutAnnotationItemIdentifier, KMToolbarSquigglyAnnotationItemIdentifier,
  775. KMToolbarInkAnnotationItemIdentifier, KMToolbarEraserAnnotationItemIdentifier,
  776. KMToolbarFreeTextAnnotationItemIdentifier,
  777. KMToolbarAnchoredAnnotationItemIdentifier,
  778. KMToolbarSquareAnnotationItemIdentifier, KMToolbarCircleAnnotationItemIdentifier, KMToolbarArrowAnnotationItemIdentifier, KMToolbarLineAnnotationItemIdentifier,
  779. KMToolbarLinkAnnotationItemIdentifier,
  780. KMNewToolbarSpaceItemIdentifier, KMNewToolbarSpaceItemIdentifier,
  781. KMAnnotationStampToolbarItemIdentifier, KMAnnotationImageToolbarItemIdentifier,
  782. KMToolbarSignSignatureAnnotationItemIdentifier, KMAnnotationTableToolbarItemIdentifier,
  783. KMToolbarDividerItemIdentifier, KMToolbarShowToolbarItemIdentifier]
  784. }
  785. return itemIdentifiers!
  786. case .editPDF:
  787. return [KMToolbarAddTextEditPDFItemIdentifier,
  788. KMToolbarAddImageEditPDFItemIdentifier]
  789. case .Page:
  790. return []
  791. case .Tool:
  792. return [KMToolbarToolCompressItemIdentifier, KMToolbarToolMergeItemIdentifier,
  793. KMToolbarToolSecureItemIdentifier, KMToolbarComparisonItemIdentifier,
  794. KMToolbarToolWatermarkItemIdentifier, KMToolbarToolBackgroundItemIdentifier,
  795. KMToolbarToolHeaderFooterItemIdentifier, KMToolbarToolBatesItemIdentifier,
  796. KMToolbarMeasureItemIdentifier]
  797. case .Form:
  798. return [KMToolbarToolTextFieldItemIdentifier,
  799. KMToolbarToolCheckBoxItemIdentifier,
  800. KMToolbarToolRadioButtonItemIdentifier,
  801. KMToolbarToolListBoxItemIdentifier,
  802. KMToolbarToolPullDownmenuItemIdentifier,
  803. KMToolbarToolButtonIdentifier,
  804. // KMToolbarToolSignBoxIdentifier,
  805. KMToolbarDividerItemIdentifier,
  806. KMToolbarToolFormAlignIdentifier]
  807. case .FillSign:
  808. return [
  809. // KMToolbarToolTextIdentifier,
  810. KMToolbarToolHookItemIdentifier,
  811. KMToolbarToolForkItemIdentifier,
  812. KMToolbarToolRectangleIdentifier,
  813. KMToolbarToolLineItemIdentifier,
  814. KMToolbarToolDotItemIdentifier,
  815. KMToolbarToolDateIdentifier,
  816. KMToolbarToolProfileIdentifier,
  817. KMToolbarFillSignSignatureIdentifier]
  818. case .Conversion:
  819. return [
  820. // KMToolbarConversionCreatePDFItemIdentifier,
  821. KMToolbarConversionWordItemIdentifier,
  822. KMToolbarConversionPPTItemIdentifier,
  823. KMToolbarConversionExcelItemIdentifier,
  824. // KMToolbarConversionRTFItemIdentifier,
  825. // KMToolbarConversionCSVItemIdentifier,
  826. // KMToolbarConversionHTMLItemIdentifier,
  827. // KMToolbarConversionTextItemIdentifier,
  828. KMToolbarConversionImageItemIdentifier, KMToolbarConversionImageToPDFItemIdentifier, KMToolbarConversionOtherItemIdentifier,
  829. KMToolbarDividerItemIdentifier, KMToolbarConversionOCRIdentifier, KMToolbarConversionExportImageItemIdentifier]
  830. case .ScanOCR:
  831. return [KMToolbarToolEnhancedScanIdentifier,
  832. KMToolbarToolOCRTextIdentifier]
  833. case .viewSetting:
  834. return [KMToolbarViewSettingIdentifier, KMToolbarCropIdentifier,
  835. KMToolbarSnapshotIdentifier /*, KMToolbarTTSIdentifier*/]
  836. case .sign:
  837. return [KMToolbarToolSignBoxIdentifier, KMSignDigitalSignToolbarItemIdentifier]
  838. default:
  839. break
  840. }
  841. return []
  842. }
  843. func toolbar(_ toolbar: KMToolbarView, itemFor identifier: String) -> KMToolbarItemView {
  844. var item: KMToolbarItemView? = self.toolbarItems[identifier] as? KMToolbarItemView
  845. var create = false
  846. if let data = item {
  847. let pId = parentIdentifier(data.itemIdentifier ?? "")
  848. if [.Annatiton,.Magnify,.Move,.Select,.SelectZoom].contains(toolbarType) && (pId != KMDocumentAnnotationToolbarItemIdentifier || data.itemIdentifier! == KMToolbarAnnotationSettingItemIdentifier) {
  849. create = true
  850. } else {
  851. if let toolbarId = self.toolbar?.toolbarIdentifier {
  852. let itemIdentifiers = (UserDefaults.standard.object(forKey: toolbarId) as? [String]) ?? []
  853. if itemIdentifiers.contains(identifier) && annotationToolIdentifiers.contains(identifier) == false {
  854. create = true
  855. }
  856. if create == false {
  857. if pId == KMDocumentAnnotationToolbarItemIdentifier {
  858. create = NSAppearance.current != self.view.window?.appearance
  859. }
  860. }
  861. }
  862. }
  863. }
  864. if create == false {
  865. if KMDataManager.default.toolbarConfigDataUpdated {
  866. create = true
  867. }
  868. }
  869. if item == nil || create {
  870. if isMainToolItem(identifier) {
  871. item = KMToolbarMainItemView(itemIdentifier: identifier)
  872. } else if annotationToolIdentifiers.contains(identifier) {
  873. item = KMToolbarCustomItemView.init(itemIdentifier: identifier)
  874. } else {
  875. item = KMToolbarCustomItemView.init(itemIdentifier: identifier)
  876. }
  877. self.toolbarItems[identifier] = item
  878. if isMainToolItem(identifier) {
  879. self._setupMainItem(item)
  880. } else {
  881. if (annotationToolIdentifiers.contains(identifier)) {
  882. self._setupAnnotationItem(item)
  883. } else if editPDFItemIdentifiers.contains(identifier) {
  884. self._setupEditItem(item)
  885. } else if conversionToolIdentifiers.contains(identifier) {
  886. self._setupConvertItem(item)
  887. } else if fillSignToolIdentifiers.contains(identifier) {
  888. self._setupFillSignItem(item)
  889. } else if formToolIdentifiers.contains(identifier) {
  890. self._setupFormItem(item)
  891. } else if toolToolIdentifiers.contains(identifier) {
  892. self._setupToolItem(item)
  893. } else if KMViewDisplayIdentifiers.contains(identifier) {
  894. self._setupViewDisplayItem(item)
  895. } else if pageEditToolIdentifiers.contains(identifier) {
  896. if (identifier == KMToolbarPageEditPageRangeItemIdentifier) {
  897. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRange)
  898. item?.target = self
  899. item?.btnTag = KMPageEditType.pageRange.rawValue
  900. // item?.toolTip = NSLocalizedString("pageRange", comment: "")
  901. item?.titleName = NSLocalizedString("Page Range", comment: "")
  902. item?.boxImagePosition = .imageExpandLeft
  903. // item?.btnAction = #selector(pageRangeMenuAction)
  904. item?.needExpandAction = true
  905. } else if (identifier == KMToolbarPageEditRotateItemIdentifier) {
  906. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  907. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageRotate)
  908. item?.target = self
  909. item?.btnTag = KMPageEditType.rightRotate.rawValue
  910. item?.toolTip = NSLocalizedString("Rotate", comment: "")
  911. item?.titleName = NSLocalizedString("Rotate", comment: "")
  912. item?.boxImagePosition = .imageLeft
  913. } else if (identifier == KMToolbarPageEditLeftRotateItemIdentifier) {
  914. item?.image = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  915. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageLeftRotate")
  916. item?.target = self
  917. item?.btnTag = KMPageEditType.leftRotate.rawValue
  918. item?.toolTip = NSLocalizedString("Rotate Left", comment: "")
  919. item?.titleName = NSLocalizedString("", comment: "")
  920. item?.boxImagePosition = .imageLeft
  921. } else if (identifier == KMToolbarPageEditRightRotateItemIdentifier) {
  922. item?.image = NSImage(named: "KMImageNameMainToolPageRightRotate")
  923. item?.alternateImage = NSImage(named: "KMImageNameMainToolPageRightRotate")
  924. item?.target = self
  925. item?.btnTag = KMPageEditType.rightRotate.rawValue
  926. item?.toolTip = NSLocalizedString("Rotate Right", comment: "")
  927. item?.titleName = NSLocalizedString("", comment: "")
  928. item?.boxImagePosition = .imageLeft
  929. } else if (identifier == KMToolbarPageEditInsetItemIdentifier) {
  930. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  931. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageInsert)
  932. item?.target = self
  933. item?.btnTag = KMPageEditType.insert.rawValue
  934. item?.isShowCustomToolTip = true
  935. item?.toolTip = NSLocalizedString("Inserting pages into an existing PDF", comment: "")
  936. item?.isPopToolTip = true
  937. item?.titleName = NSLocalizedString("Insert", comment: "")
  938. item?.boxImagePosition = .imageOnly
  939. item?.btnAction = #selector(_itemAction)
  940. let menuItem = NSMenuItem.init(title: NSLocalizedString("Insert", comment: ""), action: #selector(_menuItemAction), target: self)
  941. item?.menuFormRepresentation = menuItem
  942. menuItem.representedObject = identifier
  943. } else if (identifier == KMToolbarPageEditExtractItemIdentifier) {
  944. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  945. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageExtract)
  946. item?.target = self
  947. item?.btnTag = KMPageEditType.extract.rawValue
  948. // item?.toolTip = NSLocalizedString("Exctract selected pages", comment: "")
  949. item?.titleName = NSLocalizedString("Extract", comment: "")
  950. item?.boxImagePosition = .imageExpandLeft
  951. // item?.btnAction = #selector(extractMenuAction)
  952. item?.needExpandAction = true
  953. } else if (identifier == KMToolbarPageEditReplaceItemIdentifier) {
  954. item?.image = NSImage(named: KMImageNameToolbarReplace)
  955. item?.alternateImage = NSImage(named: KMImageNameToolbarReplace)
  956. item?.target = self
  957. item?.btnTag = KMPageEditType.replace.rawValue
  958. item?.toolTip = NSLocalizedString("Replace", comment: "")
  959. item?.titleName = NSLocalizedString("Replace", comment: "")
  960. item?.boxImagePosition = .imageLeft
  961. } else if (identifier == KMToolbarPageEditSplitItemIdentifier) {
  962. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  963. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageSplit)
  964. item?.target = self
  965. item?.btnTag = KMPageEditType.split.rawValue
  966. item?.isShowCustomToolTip = true
  967. item?.toolTip = NSLocalizedString("Split and save selected PDF pages as a new separate document", comment: "")
  968. item?.isPopToolTip = true
  969. item?.titleName = NSLocalizedString("Split", comment: "")
  970. item?.boxImagePosition = .imageOnly
  971. item?.btnAction = #selector(_itemAction)
  972. let menuItem = NSMenuItem.init(title: NSLocalizedString("Split", comment: ""), action: #selector(_menuItemAction), target: self)
  973. item?.menuFormRepresentation = menuItem
  974. menuItem.representedObject = identifier
  975. } else if (identifier == KMToolbarPageEditReverseItemIdentifier) {
  976. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  977. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageReverse)
  978. item?.target = self
  979. item?.btnTag = KMPageEditType.reverse.rawValue
  980. item?.toolTip = NSLocalizedString("Reverse", comment: "")
  981. item?.titleName = NSLocalizedString("Reverse", comment: "")
  982. item?.boxImagePosition = .imageLeft
  983. } else if (identifier == KMToolbarPageEditCopyItemIdentifier) {
  984. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  985. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageCopy)
  986. item?.target = self
  987. item?.btnTag = KMPageEditType.delete.rawValue
  988. item?.toolTip = NSLocalizedString("Copy", comment: "")
  989. item?.titleName = NSLocalizedString("Copy", comment: "")
  990. item?.boxImagePosition = .imageLeft
  991. } else if (identifier == KMToolbarPageEditPasteItemIdentifier) {
  992. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  993. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPagePaste)
  994. item?.target = self
  995. item?.btnTag = KMPageEditType.delete.rawValue
  996. item?.toolTip = NSLocalizedString("Paste", comment: "")
  997. item?.titleName = NSLocalizedString("Paste", comment: "")
  998. item?.boxImagePosition = .imageLeft
  999. } else if (identifier == KMToolbarPageEditDeleteItemIdentifier) {
  1000. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  1001. item?.alternateImage = NSImage(named: KMImageNameUXIconSubtoolbarPageDelete)
  1002. item?.target = self
  1003. item?.btnTag = KMPageEditType.delete.rawValue
  1004. item?.toolTip = NSLocalizedString("Delete", comment: "")
  1005. item?.titleName = NSLocalizedString("Delete", comment: "")
  1006. item?.boxImagePosition = .imageLeft
  1007. }
  1008. return item!
  1009. } else if KMSignIdentifiers.contains(identifier) {
  1010. self._setupSignItem(item)
  1011. }
  1012. }
  1013. } else {
  1014. if item?.itemIdentifier == KMToolbarToolSignBoxIdentifier {
  1015. item?.isSelected = false
  1016. }
  1017. }
  1018. return item!
  1019. }
  1020. func validateToolbarItem(_ item: NSToolbarItem) -> Bool {
  1021. return true
  1022. }
  1023. @objc func listViewAnnotationTypeChangeNotification(sender: Notification?) {
  1024. // if let notiName = sender?.name, notiName == NSNotification.Name.CPDFListViewAnnotationTypeChange, self.ignoreCurrentAnnotationTypeChange {
  1025. // }
  1026. if (self.ignoreCurrentAnnotationTypeChange) {
  1027. // 忽略后重置 这个属性是基于单次添加,所以使用后会重置
  1028. // self.ignoreCurrentAnnotationTypeChange = false
  1029. return
  1030. }
  1031. let annotationType : CAnnotationType = pdfView?.annotationType ?? .unkown
  1032. if annotationType == .square || annotationType == .circle || annotationType == .arrow || annotationType == .line{
  1033. UserDefaults.standard.set(annotationType.rawValue, forKey: KMToolBarToolPDFShapeStyle)
  1034. UserDefaults.standard.synchronize()
  1035. }
  1036. let toolMode = pdfView?.toolMode ?? .none
  1037. for item in self.toolbar?.items ?? [] {
  1038. if self.toolbarType == .Annatiton || self.toolbarType == .Move || self.toolbarType == .Magnify ||
  1039. self.toolbarType == .Select || self.toolbarType == .SelectZoom {
  1040. item.isSelected = false
  1041. if item.itemIdentifier == KMDocumentAnnotationToolbarItemIdentifier {
  1042. item.isSelected = true
  1043. } else if item.itemIdentifier == KMToolbarHighlightAnnotationItemIdentifier {
  1044. if annotationType == .highlight {
  1045. item.isSelected = true
  1046. }
  1047. } else if item.itemIdentifier == KMToolbarUnderlineAnnotationItemIdentifier {
  1048. if annotationType == .underline {
  1049. item.isSelected = true
  1050. }
  1051. } else if item.itemIdentifier == KMToolbarStrikeOutAnnotationItemIdentifier {
  1052. if annotationType == .strikeOut {
  1053. item.isSelected = true
  1054. }
  1055. } else if item.itemIdentifier == KMToolbarSquigglyAnnotationItemIdentifier {
  1056. if annotationType == .squiggly {
  1057. item.isSelected = true
  1058. }
  1059. } else if item.itemIdentifier == KMToolbarInkAnnotationItemIdentifier {
  1060. if annotationType == .ink { //|| annotationType == .eraser
  1061. item.isSelected = true
  1062. }
  1063. } else if item.itemIdentifier == KMToolbarEraserAnnotationItemIdentifier {
  1064. if annotationType == .eraser {
  1065. item.isSelected = true
  1066. }
  1067. } else if item.itemIdentifier == KMToolbarFreeTextAnnotationItemIdentifier {
  1068. if annotationType == .freeText {
  1069. item.isSelected = true
  1070. }
  1071. } else if item.itemIdentifier == KMToolbarAnchoredAnnotationItemIdentifier {
  1072. if annotationType == .anchored {
  1073. item.isSelected = true
  1074. }
  1075. } else if item.itemIdentifier == KMToolbarSquareAnnotationItemIdentifier {
  1076. if annotationType == .square {
  1077. item.isSelected = true
  1078. }
  1079. } else if item.itemIdentifier == KMToolbarCircleAnnotationItemIdentifier {
  1080. if annotationType == .circle {
  1081. item.isSelected = true
  1082. }
  1083. } else if item.itemIdentifier == KMToolbarArrowAnnotationItemIdentifier {
  1084. if annotationType == .arrow {
  1085. item.isSelected = true
  1086. }
  1087. } else if item.itemIdentifier == KMToolbarLineAnnotationItemIdentifier {
  1088. if annotationType == .line {
  1089. item.isSelected = true
  1090. }
  1091. } else if item.itemIdentifier == KMToolbarLinkAnnotationItemIdentifier {
  1092. if annotationType == .link {
  1093. item.isSelected = true
  1094. }
  1095. } else if item.itemIdentifier == KMAnnotationStampToolbarItemIdentifier {
  1096. if annotationType == .stamp {
  1097. item.isSelected = true
  1098. }
  1099. } else if item.itemIdentifier == KMToolbarSignSignatureAnnotationItemIdentifier {
  1100. if annotationType == .signSignature {
  1101. item.isSelected = true
  1102. }
  1103. } else if toolMode == .moveToolMode {
  1104. if item.itemIdentifier == KMToolbarMoveToolModeItemIdentifier {
  1105. item.isSelected = true
  1106. }
  1107. } else if toolMode == .magnifyToolMode {
  1108. if item.itemIdentifier == KMToolbarMagnifyToolModeItemIdentifier {
  1109. item.isSelected = true
  1110. }
  1111. } else if toolMode == .selectToolMode {
  1112. if item.itemIdentifier == KMToolbarSelectToolModeItemIdentifier {
  1113. item.isSelected = true
  1114. }
  1115. } else if toolMode == .selectZoomToolMode {
  1116. if item.itemIdentifier == KMToolbarZoomToSelectionItemIdentifier {
  1117. item.isSelected = true
  1118. }
  1119. }
  1120. if (item.itemIdentifier == KMToolbarShowToolbarItemIdentifier) {
  1121. item.isSelected = !self.isShowAllAnnotations
  1122. }
  1123. } else if self.toolbarType == .FillSign {
  1124. item.isSelected = false
  1125. if toolMode == .selfSignMode {
  1126. if item.itemIdentifier == KMToolbarToolHookItemIdentifier {
  1127. if annotationType == .signTure {
  1128. item.isSelected = true
  1129. }
  1130. } else if item.itemIdentifier == KMToolbarToolForkItemIdentifier {
  1131. if annotationType == .signFalse {
  1132. item.isSelected = true
  1133. }
  1134. } else if item.itemIdentifier == KMToolbarToolLineItemIdentifier {
  1135. if annotationType == .signLine {
  1136. item.isSelected = true
  1137. }
  1138. } else if item.itemIdentifier == KMToolbarToolDotItemIdentifier {
  1139. if annotationType == .signDot {
  1140. item.isSelected = true
  1141. }
  1142. } else if item.itemIdentifier == KMToolbarToolRectangleIdentifier {
  1143. if annotationType == .signCircle {
  1144. item.isSelected = true
  1145. }
  1146. } else if item.itemIdentifier == KMToolbarToolDateIdentifier {
  1147. if annotationType == .signDate {
  1148. item.isSelected = true
  1149. }
  1150. } else if item.itemIdentifier == KMToolbarToolTextIdentifier {
  1151. if annotationType == .signText {
  1152. item.isSelected = true
  1153. }
  1154. } else if (item.itemIdentifier == KMToolbarFillSignSignatureIdentifier) {
  1155. if (annotationType == .signSignature) {
  1156. item.isSelected = true
  1157. }
  1158. }
  1159. }
  1160. } else if self.toolbarType == .Form {
  1161. item.isSelected = false
  1162. if toolMode == .formToolMode {
  1163. if item.itemIdentifier == KMToolbarToolTextFieldItemIdentifier {
  1164. if annotationType == .textField {
  1165. item.isSelected = true
  1166. }
  1167. } else if item.itemIdentifier == KMToolbarToolCheckBoxItemIdentifier {
  1168. if annotationType == .checkBox {
  1169. item.isSelected = true
  1170. }
  1171. } else if item.itemIdentifier == KMToolbarToolRadioButtonItemIdentifier {
  1172. if annotationType == .radioButton {
  1173. item.isSelected = true
  1174. }
  1175. } else if item.itemIdentifier == KMToolbarToolListBoxItemIdentifier {
  1176. if annotationType == .listMenu {
  1177. item.isSelected = true
  1178. }
  1179. } else if item.itemIdentifier == KMToolbarToolPullDownmenuItemIdentifier {
  1180. if annotationType == .comboBox {
  1181. item.isSelected = true
  1182. }
  1183. } else if item.itemIdentifier == KMToolbarToolButtonIdentifier {
  1184. if annotationType == .actionButton {
  1185. item.isSelected = true
  1186. }
  1187. } else if item.itemIdentifier == KMToolbarToolSignBoxIdentifier {
  1188. if annotationType == .signature {
  1189. item.isSelected = true
  1190. }
  1191. }
  1192. }
  1193. }
  1194. }
  1195. }
  1196. }
  1197. extension KMToolbarViewController: NSSearchFieldDelegate {
  1198. }
  1199. extension KMToolbarViewController {
  1200. private func _setupMainItem(_ item: KMToolbarItemView?) {
  1201. let identifier = item?.itemIdentifier
  1202. if identifier == KMLeftControlToolbarItemIdentifier {
  1203. item?.image = NSImage(named: "KMImageNameUXIconBtnTriLeftNor")
  1204. item?.titleName = NSLocalizedString("Panel", comment: "")
  1205. item?.target = self
  1206. item?.toolTip = NSLocalizedString("View Settings", comment: "")
  1207. item?.boxImagePosition = .imageAbove
  1208. item?.selectBackgroundType = .imageBox
  1209. item?.btnAction = #selector(_itemAction)
  1210. } else if identifier == KMDocumentZoomViewToolbarItemIdentifier{
  1211. item?.titleName = NSLocalizedString("Zoom", comment: "")
  1212. item?.target = self
  1213. let view = KMToolbarZoomItemView(zoomView: self.zoomView)
  1214. view.callback = { [weak self] idx, _ in
  1215. if idx == 2 {
  1216. self?.delegate?.changePDFViewZoomInAction?()
  1217. } else if idx == 1 {
  1218. self?.delegate?.changePDFViewZoomOutAction?()
  1219. }
  1220. }
  1221. item?.customizeView = view
  1222. } else if identifier == KMDocumentPreviousPageToolbarItemIdentifier {
  1223. item?.titleName = NSLocalizedString("Zoom", comment: "")
  1224. item?.target = self
  1225. let view = KMToolbarPreviousNextItemView()
  1226. view.callback = { [weak self] idx, _ in
  1227. if idx == 1 {
  1228. self?.delegate?.changePDFViewGoToPreviousPageAction?()
  1229. } else if idx == 2 {
  1230. self?.delegate?.changePDFViewGotoNextPageAction?()
  1231. }
  1232. }
  1233. item?.customizeView = view
  1234. } else if identifier == KMDocumentHomeToolbarItemIdentifier {
  1235. item?.image = NSImage(named: "KMImageNameToolbarHomeNor")
  1236. item?.titleName = NSLocalizedString("Home", comment: "")
  1237. item?.target = self
  1238. item?.toolTip = NSLocalizedString("A Welcome Gift from Us", comment: "")
  1239. item?.boxImagePosition = .imageAbove
  1240. item?.selectBackgroundType = .imageBox
  1241. item?.btnAction = #selector(_itemAction)
  1242. } else if identifier == KMDocumentAnnotationToolbarItemIdentifier {
  1243. item?.titleName = NSLocalizedString("Tools", comment: "")
  1244. item?.image = NSImage(named: "KMImageNameUXIconToolbarMytoolsNor")
  1245. item?.target = self
  1246. item?.toolTip = String(format: "%@: %@, %@, %@, %@", KMLocalizedString("Tool Mode"),KMLocalizedString("Annotate"),KMLocalizedString("Scroll"),KMLocalizedString("Magnify"),KMLocalizedString("Select"))
  1247. item?.btnTag = KMToolbarViewType.Annatiton.rawValue
  1248. item?.btnAction = #selector(leftControllButtonAction)
  1249. item?.boxImagePosition = .imageAbove
  1250. item?.selectBackgroundType = .imageBox
  1251. let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
  1252. menuItem.target = self
  1253. menuItem.representedObject = identifier
  1254. item?.menuFormRepresentation = menuItem
  1255. } else if identifier == KMDocumentPageToolbarItemIdentifier {
  1256. item?.titleName = NSLocalizedString("Page Edit", comment: "")
  1257. item?.target = self
  1258. item?.image = NSImage(named: "KMImageNameUXIconToolbarPageeditNor")
  1259. item?.toolTip = NSLocalizedString("PDF page editor: insert, delete, extract, rotate, reposition, and replace pages in a PDF", comment: "")
  1260. item?.btnTag = KMToolbarViewType.Page.rawValue
  1261. item?.btnAction = #selector(leftControllButtonAction)
  1262. item?.boxImagePosition = .imageAbove
  1263. item?.selectBackgroundType = .imageBox
  1264. let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
  1265. menuItem.target = self
  1266. menuItem.representedObject = identifier
  1267. item?.menuFormRepresentation = menuItem
  1268. } else if identifier == KMDocumentConversonToolbarItemIdentifier {
  1269. item?.titleName = NSLocalizedString("Converter", comment: "")
  1270. item?.target = self
  1271. item?.image = NSImage(named: "KMImageNameUXIconToolbarConvertNor")
  1272. item?.toolTip = NSLocalizedString("Convert PDFs to Microsoft Word, PowerPoint, Excel, RTF, Text, Image, CSV, and more Offline", comment: "")
  1273. item?.btnTag = KMToolbarViewType.Conversion.rawValue
  1274. item?.btnAction = #selector(leftControllButtonAction)
  1275. item?.boxImagePosition = .imageAbove
  1276. item?.selectBackgroundType = .imageBox
  1277. item?.promptIdentifier = identifier
  1278. let menuItem = NSMenuItem(title: NSLocalizedString("Converter", comment: ""), action: #selector(_menuItemAction), keyEquivalent: "")
  1279. menuItem.target = self
  1280. menuItem.representedObject = identifier
  1281. item?.menuFormRepresentation = menuItem
  1282. } else if identifier == KMDocumentScanOCRToolbarItemIdentifier {
  1283. item?.titleName = NSLocalizedString("OCR", comment: "")
  1284. item?.target = self
  1285. item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
  1286. item?.boxImagePosition = .imageAbove
  1287. item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
  1288. item?.selectBackgroundType = .imageBox
  1289. item?.btnAction = #selector(OCRbtnAction1)
  1290. item?.promptIdentifier = identifier
  1291. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
  1292. menuItem.representedObject = identifier
  1293. item?.menuFormRepresentation = menuItem
  1294. } else if identifier == KMToolbarToolEnhancedScanIdentifier {
  1295. item?.image = NSImage(named: "KMImageNameMainToolEnhancedScan")
  1296. item?.target = self
  1297. item?.btnTag = 0
  1298. item?.toolTip = NSLocalizedString("Enhanced Scan", comment: "")
  1299. item?.titleName = NSLocalizedString("Enhanced Scan", comment: "")
  1300. item?.boxImagePosition = .imageLeft
  1301. item?.selectBackgroundType = .imageBox
  1302. item?.btnAction = #selector(scanOCRModelSelect)
  1303. } else if identifier == KMToolbarToolOCRTextIdentifier {
  1304. item?.image = NSImage(named: "KMImageNameMainToolOCRText")
  1305. item?.target = self
  1306. item?.toolTip = NSLocalizedString("OCR Text Recognition", comment: "")
  1307. item?.titleName = NSLocalizedString("OCR Text Recognition", comment: "")
  1308. item?.boxImagePosition = .imageLeft
  1309. item?.selectBackgroundType = .imageBox
  1310. item?.btnAction = #selector(scanOCRModelSelect)
  1311. item?.promptIdentifier = identifier
  1312. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR Text Recognition", comment: ""), action: #selector(scanOCRModelSelect), target: self)
  1313. menuItem.representedObject = identifier
  1314. item?.menuFormRepresentation = menuItem
  1315. } else if identifier == KMDocumentEditToolbarItemIdentifier {
  1316. item?.titleName = NSLocalizedString("Edit PDF", comment: "")
  1317. item?.target = self
  1318. item?.image = NSImage(named: "KMImageNameUXIconToolbarEditNor")
  1319. item?.boxImagePosition = .imageAbove
  1320. item?.btnTag = KMToolbarViewType.editPDF.rawValue
  1321. item?.toolTip = NSLocalizedString("Edit text and image in PDF ", comment: "")
  1322. item?.selectBackgroundType = .imageBox
  1323. item?.btnAction = #selector(leftControllButtonAction)
  1324. item?.promptIdentifier = identifier
  1325. let menuItem = NSMenuItem.init(title: NSLocalizedString("Edit PDF", comment: ""), action: #selector(_menuItemAction), target: self)
  1326. menuItem.tag = item!.btnTag
  1327. menuItem.representedObject = identifier
  1328. item?.menuFormRepresentation = menuItem
  1329. } else if identifier == KMDocumentFormToolbarItemIdentifier {
  1330. item?.titleName = NSLocalizedString("Forms", comment: "")
  1331. item?.target = self
  1332. item?.image = NSImage(named: "KMImageNameUXIconToolbarFormNor")
  1333. item?.boxImagePosition = .imageAbove
  1334. item?.btnTag = KMToolbarViewType.Form.rawValue
  1335. item?.toolTip = NSLocalizedString("Edit PDF Form", comment: "")
  1336. item?.selectBackgroundType = .imageBox
  1337. item?.btnAction = #selector(leftControllButtonAction)
  1338. item?.promptIdentifier = identifier
  1339. let menuItem = NSMenuItem.init(title: NSLocalizedString("Forms", comment: ""), action: #selector(_menuItemAction), target: self)
  1340. menuItem.tag = item!.btnTag
  1341. menuItem.representedObject = identifier
  1342. item?.menuFormRepresentation = menuItem
  1343. } else if identifier == KMDocumentFillSginToolbarItemIdentifier {
  1344. item?.titleName = NSLocalizedString("Fill & Sign", comment: "")
  1345. item?.target = self
  1346. item?.image = NSImage(named: "KMImageNameUXIconToolbarFillsignNor")
  1347. item?.boxImagePosition = .imageAbove
  1348. item?.btnTag = KMToolbarViewType.FillSign.rawValue
  1349. item?.toolTip = NSLocalizedString("Fill and sign forms", comment: "")
  1350. item?.selectBackgroundType = .imageBox
  1351. item?.btnAction = #selector(leftControllButtonAction)
  1352. item?.promptIdentifier = identifier
  1353. let menuItem = NSMenuItem.init(title: NSLocalizedString("Fill & Sign", comment: ""), action: #selector(_menuItemAction), target: self)
  1354. menuItem.tag = item!.btnTag
  1355. menuItem.representedObject = identifier
  1356. item?.menuFormRepresentation = menuItem
  1357. } else if identifier == KMDocumentToolToolbarItemIdentifier {
  1358. item?.titleName = NSLocalizedString("Editor", comment: "")
  1359. item?.target = self
  1360. item?.image = NSImage(named: "KMImageNameUXIconToolbarEdittoolNor")
  1361. item?.boxImagePosition = .imageAbove
  1362. item?.btnTag = KMToolbarViewType.Tool.rawValue
  1363. item?.toolTip = NSLocalizedString("Edit, delete, cut, copy, paste, and insert text in PDFs", comment: "")
  1364. item?.selectBackgroundType = .imageBox
  1365. item?.btnAction = #selector(leftControllButtonAction)
  1366. item?.promptIdentifier = identifier
  1367. let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
  1368. menuItem.target = self
  1369. menuItem.representedObject = identifier
  1370. item?.menuFormRepresentation = menuItem
  1371. } else if identifier == KMDocumentRedactToolbarItemIdentifier {
  1372. item?.titleName = NSLocalizedString("Redact Text", comment: "")
  1373. item?.target = self
  1374. item?.image = NSImage(named: "KMImageNameUXIconToolbarRedactNor")
  1375. item?.boxImagePosition = .imageAbove
  1376. item?.toolTip = NSLocalizedString("Mark for redaction", comment: "")
  1377. item?.selectBackgroundType = .imageBox
  1378. item?.btnAction = #selector(_itemAction)
  1379. item?.promptIdentifier = identifier
  1380. let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
  1381. menuItem.target = self
  1382. menuItem.representedObject = identifier
  1383. item?.menuFormRepresentation = menuItem
  1384. } else if identifier == KMDocumentAITranslationToolbarItemIdentifier {
  1385. item?.image = NSImage(named: "ic_function_other_AITranslation")
  1386. item?.titleName = "AI Translation"
  1387. item?.target = self
  1388. item?.toolTip = NSLocalizedString("AI Translation", comment: "")
  1389. item?.boxImagePosition = .imageOnly
  1390. item?.btnAction = #selector(aiTranslationButtonAction)
  1391. item?.promptIdentifier = identifier
  1392. } else if identifier == KMDocumentPrintToolbarItemIdentifier {
  1393. item?.image = NSImage(named: "KMImageNameToolbarPrintNor")
  1394. item?.titleName = "Print"
  1395. item?.target = self
  1396. item?.toolTip = NSLocalizedString("Print", comment: "")
  1397. item?.boxImagePosition = .imageOnly
  1398. item?.btnAction = #selector(_itemAction)
  1399. } else if identifier == KMDocumentViewDisplayToolbarItemIdentifier {
  1400. item?.image = NSImage(named: "KMImageNameUXIconToolbarPageviewNor")
  1401. item?.titleName = NSLocalizedString("Page Display", comment: "")
  1402. item?.target = self
  1403. item?.toolTip = NSLocalizedString("Page Display", comment: "")
  1404. item?.boxImagePosition = .imageAbove
  1405. item?.selectBackgroundType = .imageBox
  1406. item?.btnAction = #selector(_itemAction)
  1407. item?.promptIdentifier = identifier
  1408. let menuItem = NSMenuItem.init(title: NSLocalizedString("Page Display", comment: ""), action: #selector(_menuItemAction), target: self)
  1409. menuItem.representedObject = identifier
  1410. item?.menuFormRepresentation = menuItem
  1411. } else if identifier == KMDocumentAIToolsToolbarItemIdentifier {
  1412. item?.image = NSImage(named: "KMImageNameUXIconAINor")
  1413. item?.titleName = NSLocalizedString("AI Tools", comment: "")
  1414. item?.target = self
  1415. item?.toolTip = NSLocalizedString("AI Tools", comment: "")
  1416. item?.boxImagePosition = .imageAbove
  1417. item?.selectBackgroundType = .imageBox
  1418. item?.btnAction = #selector(_itemAction)
  1419. item?.promptIdentifier = identifier
  1420. let menuItem = NSMenuItem.init(title: NSLocalizedString("AI Tools", comment: ""), action: #selector(_menuItemAction), target: self)
  1421. menuItem.representedObject = identifier
  1422. item?.menuFormRepresentation = menuItem
  1423. } else if identifier == KMDocumentShareToolbarItemIdentifier {
  1424. item?.image = NSImage(named: "KMImageNameUXIconToolbarShareNor")
  1425. item?.titleName = NSLocalizedString("Share", comment: "")
  1426. item?.target = self
  1427. // item?.toolTip = NSLocalizedString("Share the file with others", comment: "")
  1428. item?.boxImagePosition = .imageAbove
  1429. item?.selectBackgroundType = .imageBox
  1430. item?.btnAction = #selector(shareButtonAction)
  1431. let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
  1432. let menu = NSMenu()
  1433. _ = menu.addItem(withTitle: NSLocalizedString("Document", comment: ""), action: #selector(shareViaWithDocument), target: self)
  1434. _ = menu.addItem(withTitle: NSLocalizedString("Flattened Copy", comment: ""), action: #selector(shareViaWithFlatten), target: self)
  1435. _ = menu.addItem(withTitle: NSLocalizedString("Original PDF", comment: ""), action: #selector(shareViaWithOriginalPDF), target: self)
  1436. menuItem.submenu = menu
  1437. item?.menuFormRepresentation = menuItem
  1438. } else if identifier == KMDocumentSearchToolbarItemIdentifier {
  1439. item?.titleName = NSLocalizedString("Search", comment: "")
  1440. item?.target = self
  1441. let view = NSView()
  1442. view.frame = NSMakeRect(0, 0, 150, 40)
  1443. let boxView = NSView()
  1444. boxView.frame = NSMakeRect(0, 16, 150, 22)
  1445. view.addSubview(boxView)
  1446. let searchView = NSSearchField()
  1447. searchView.frame = NSMakeRect(0, 0, 150, 22)
  1448. searchView.placeholderString = NSLocalizedString("Search", comment: "")
  1449. searchView.sendsWholeSearchString = true
  1450. searchView.sendsSearchStringImmediately = true
  1451. searchView.drawsBackground = false
  1452. searchView.delegate = self
  1453. self.searchField = searchView
  1454. self.refreshSearchBarMenu()
  1455. boxView.addSubview(searchView)
  1456. let titleLabel = NSTextField(labelWithString: NSLocalizedString("Search", comment: ""))
  1457. view.addSubview(titleLabel)
  1458. titleLabel.frame = NSMakeRect(0, 0, 130, 14)
  1459. titleLabel.alignment = .center
  1460. titleLabel.textColor = KMAppearance.subtitleColor()
  1461. titleLabel.font = KMToolbarMainItemView.textFont
  1462. item?.customizeView = view
  1463. let menuItem = NSMenuItem.init(title: NSLocalizedString("Search", comment: ""), action: #selector(_menuItemAction), target: self)
  1464. menuItem.representedObject = identifier
  1465. item?.menuFormRepresentation = menuItem
  1466. } else if identifier == KMDocumentPageInputToolbarItemIdentifier {
  1467. item?.titleName = NSLocalizedString("Page", comment: "")
  1468. // item?.target = self
  1469. let view = KMToolbarPageInputItemView()
  1470. item?.customizeView = view
  1471. view.totalNumber = Int((self.pdfView?.document.pageCount ?? 0))
  1472. view.currentPageIndex = (self.pdfView?.currentPageIndex ?? 0) + 1
  1473. view.enterAction = { [weak self] stringV in
  1474. if let data = self?.toolbarItemFindItemIdentifiers(value: KMDocumentPageInputToolbarItemIdentifier) {
  1475. self?.delegate?.toolbarViewController?(self!, viewItemDidClick: data, index: 0, info: stringV)
  1476. }
  1477. }
  1478. // let menuItem = NSMenuItem.init(title: NSLocalizedString("Search", comment: ""), action: #selector(_menuItemAction), target: self)
  1479. // menuItem.representedObject = identifier
  1480. // item?.menuFormRepresentation = menuItem
  1481. } else if identifier == KMRightControlToolbarItemIdentifier {
  1482. item?.image = NSImage(named: "KMImageNameUXIconBtnTriRightNor")
  1483. item?.titleName = NSLocalizedString("Properties", comment: "")
  1484. item?.target = self
  1485. item?.toolTip = NSLocalizedString("Show/Hide Annotation Properties Panel", comment: "")
  1486. item?.boxImagePosition = .imageAbove
  1487. item?.selectBackgroundType = .imageBox
  1488. item?.btnAction = #selector(_itemAction)
  1489. let menuItem = NSMenuItem.init(title: NSLocalizedString("Properties", comment: ""), action: #selector(_menuItemAction), target: self)
  1490. menuItem.representedObject = identifier
  1491. item?.menuFormRepresentation = menuItem
  1492. } else if identifier == KMToolbarToolRedactItemIdentifier {
  1493. item?.image = NSImage(named: "KMImageNameMainToolsRedact")
  1494. item?.target = self
  1495. item?.btnTag = KMToolbarType.redact.rawValue
  1496. item?.toolTip = NSLocalizedString("Redact", comment: "")
  1497. item?.titleName = NSLocalizedString("Redact", comment: "")
  1498. item?.selectBackgroundType = .imageBox
  1499. item?.btnAction = #selector(redactMenuAction)
  1500. item?.promptIdentifier = identifier
  1501. let menuItem = NSMenuItem.init(title: NSLocalizedString("Redact", comment: ""), action: #selector(redactMenuAction), target: self)
  1502. menuItem.tag = item!.btnTag
  1503. menuItem.representedObject = identifier
  1504. item?.menuFormRepresentation = menuItem
  1505. } else if identifier == KMDocumentDigitalSignToolbarItemIdentifier {
  1506. item?.image = NSImage(named: "DigitalSign_icon")
  1507. item?.target = self
  1508. 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: "")
  1509. item?.titleName = NSLocalizedString("Digital Sign", comment: "")
  1510. item?.selectBackgroundType = .imageBox
  1511. item?.boxImagePosition = .imageAbove
  1512. item?.btnAction = #selector(_itemAction)
  1513. item?.promptIdentifier = identifier
  1514. let menuItem = NSMenuItem.init(title: NSLocalizedString("Digital Sign", comment: ""), action: #selector(_menuItemAction), target: self)
  1515. menuItem.tag = item!.btnTag
  1516. menuItem.representedObject = identifier
  1517. item?.menuFormRepresentation = menuItem
  1518. } else if identifier == KMDocumentPreviousBackToolbarItemIdentifier {
  1519. let view = KMToolbarPreviousBackItemView()
  1520. item?.customizeView = view
  1521. view.callback = { [weak self] idx, _ in
  1522. if idx == 1 {
  1523. self?.delegate?.changePDFViewGoToForwardAction?()
  1524. } else if idx == 2 {
  1525. self?.delegate?.changePDFViewGotoBackAction?()
  1526. }
  1527. }
  1528. } else if identifier == KMDocumentFirstLastToolbarItemIdentifier {
  1529. let view = KMToolbarFirstLastItemView()
  1530. item?.customizeView = view
  1531. view.callback = { [weak self] idx, _ in
  1532. if let item = self?.toolbarItemFindItemIdentifiers(value: identifier!) {
  1533. self?.delegate?.toolbarViewController?(self!, viewItemDidClick: item, index: idx, info: nil)
  1534. }
  1535. }
  1536. } else if identifier == KMDocumentPageIndicatorToolbarItemIdentifier {
  1537. // let view = KMToolbarPageIndicatorItemView(zoomView: nil)
  1538. // item?.customizeView = view
  1539. } else if identifier == KMDocumentPresentationToolbarItemIdentifier {
  1540. item?.image = NSImage(named: "KMImageNameToolbarSlideshowNor")
  1541. item?.titleName = NSLocalizedString("Presentation", comment: "")
  1542. item?.selectBackgroundType = .imageBox
  1543. item?.boxImagePosition = .imageAbove
  1544. item?.target = self
  1545. item?.btnTag = KMToolbarType.conversion_image.rawValue
  1546. // item?.toolTip = NSLocalizedString("Convert PDF to JPEG, PNG, TIFF, BMP, GIF or TGA files", comment: "")
  1547. item?.btnAction = #selector(_itemAction)
  1548. item?.promptIdentifier = identifier
  1549. let menuItem = NSMenuItem(title: item?.titleName ?? "", action: #selector(_menuItemAction), keyEquivalent: "")
  1550. menuItem.target = self
  1551. menuItem.representedObject = identifier
  1552. item?.menuFormRepresentation = menuItem
  1553. } else if identifier == KMToolbarFixedSpaceItemIdentifier {
  1554. let view = NSView()
  1555. view.frame = NSMakeRect(0, 0, 36, 36)
  1556. item?.customizeView = view
  1557. } else if identifier == KMDocumentSignToolbarItemIdentifier {
  1558. item?.image = NSImage(named: "DigitalSign_icon")
  1559. item?.target = self
  1560. item?.toolTip = NSLocalizedString("Signature", comment: "")
  1561. item?.titleName = NSLocalizedString("Signature", comment: "")
  1562. item?.selectBackgroundType = .imageBox
  1563. item?.boxImagePosition = .imageAbove
  1564. item?.btnAction = #selector(_itemAction)
  1565. item?.promptIdentifier = identifier
  1566. let menuItem = NSMenuItem.init(title: NSLocalizedString("Signature", comment: ""), action: #selector(_menuItemAction), target: self)
  1567. menuItem.tag = item!.btnTag
  1568. menuItem.representedObject = identifier
  1569. item?.menuFormRepresentation = menuItem
  1570. }
  1571. }
  1572. private func _setupAnnotationItem(_ item: KMToolbarItemView?) {
  1573. let identifier = item?.itemIdentifier
  1574. if identifier == KMToolbarMoveToolModeItemIdentifier {
  1575. item?.titleName = NSLocalizedString("Scroll Tool", comment: "")
  1576. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPantool)
  1577. item?.target = self
  1578. item?.btnTag = KMToolbarViewType.Move.rawValue
  1579. item?.isShowCustomToolTip = true
  1580. item?.toolTip = NSLocalizedString("Scroll Tool", comment: "")
  1581. item?.isPopToolTip = true
  1582. item?.boxImagePosition = .imageOnly
  1583. item?.btnAction = #selector(leftControllButtonAction)
  1584. } else if identifier == KMToolbarMagnifyToolModeItemIdentifier {
  1585. item?.titleName = NSLocalizedString("Magnify Tool", comment: "")
  1586. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsMagnifier)
  1587. item?.target = self
  1588. item?.btnTag = KMToolbarViewType.Magnify.rawValue
  1589. item?.isShowCustomToolTip = true
  1590. item?.toolTip = NSLocalizedString("Magnify Tool", comment: "")
  1591. item?.isPopToolTip = true
  1592. item?.boxImagePosition = .imageOnly
  1593. item?.btnAction = #selector(leftControllButtonAction)
  1594. } else if identifier == KMToolbarSelectToolModeItemIdentifier {
  1595. item?.titleName = NSLocalizedString("Content Selection Tool", comment: "")
  1596. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsContentsel)
  1597. item?.target = self
  1598. item?.btnTag = KMToolbarViewType.Select.rawValue
  1599. item?.isShowCustomToolTip = true
  1600. item?.toolTip = NSLocalizedString("Content Selection Tool", comment: "")
  1601. item?.isPopToolTip = true
  1602. item?.boxImagePosition = .imageOnly
  1603. item?.btnAction = #selector(leftControllButtonAction)
  1604. } else if identifier == KMToolbarZoomToSelectionItemIdentifier {
  1605. item?.titleName = NSLocalizedString("Zoom to selected area", comment: "")
  1606. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsAreazoom)
  1607. item?.target = self
  1608. item?.btnTag = KMToolbarViewType.SelectZoom.rawValue
  1609. item?.isShowCustomToolTip = true
  1610. item?.toolTip = NSLocalizedString("Zoom to selected area", comment: "")
  1611. item?.isPopToolTip = true
  1612. item?.boxImagePosition = .imageOnly
  1613. item?.btnAction = #selector(leftControllButtonAction)
  1614. } else if identifier == KMToolbarHighlightAnnotationItemIdentifier {
  1615. item?.titleName = NSLocalizedString("Highlight", comment: "")
  1616. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
  1617. let imageV = KMNoteTypeImageView()
  1618. let color = UserDefaults.standard.PDFListViewColor(forKey: CHighlightNoteColorKey) ?? .red
  1619. item?.image = imageV.noteTypeImage(withType: SKNHighlightString, color: color)
  1620. item?.target = self
  1621. item?.btnTag = CAnnotationType.highlight.rawValue
  1622. item?.isShowCustomToolTip = true
  1623. item?.toolTip = String(format: "%@ (⌃⌘H)", NSLocalizedString("Highlight", comment: ""))
  1624. item?.isPopToolTip = true
  1625. item?.boxImagePosition = .imageOnly
  1626. item?.btnAction = #selector(changeAnnotationMode)
  1627. } else if identifier == KMToolbarUnderlineAnnotationItemIdentifier {
  1628. item?.titleName = NSLocalizedString("Underline", comment: "")
  1629. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsUnderline)
  1630. let imageV = KMNoteTypeImageView()
  1631. let color = UserDefaults.standard.PDFListViewColor(forKey: CUnderlineNoteColorKey) ?? .red
  1632. item?.image = imageV.noteTypeImage(withType: SKNUnderlineString, color: color)
  1633. item?.target = self
  1634. item?.btnTag = CAnnotationType.underline.rawValue
  1635. item?.isShowCustomToolTip = true
  1636. item?.toolTip = String(format: "%@ (⇧⌘M)", NSLocalizedString("Underline", comment: ""))
  1637. item?.isPopToolTip = true
  1638. item?.boxImagePosition = .imageOnly
  1639. item?.btnAction = #selector(changeAnnotationMode)
  1640. } else if identifier == KMToolbarStrikeOutAnnotationItemIdentifier {
  1641. item?.titleName = NSLocalizedString("Strikethrough", comment: "")
  1642. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStrikeout)
  1643. let imageV = KMNoteTypeImageView()
  1644. let color = UserDefaults.standard.PDFListViewColor(forKey: CStrikeOutNoteColorKey) ?? .red
  1645. item?.image = imageV.noteTypeImage(withType: SKNStrikeOutString, color: color)
  1646. item?.target = self
  1647. item?.btnTag = CAnnotationType.strikeOut.rawValue
  1648. item?.isShowCustomToolTip = true
  1649. item?.toolTip = String(format: "%@ (⌃⌘M)", NSLocalizedString("Strikethrough", comment: ""))
  1650. item?.isPopToolTip = true
  1651. item?.boxImagePosition = .imageOnly
  1652. item?.btnAction = #selector(changeAnnotationMode)
  1653. } else if identifier == KMToolbarSquigglyAnnotationItemIdentifier {
  1654. item?.titleName = NSLocalizedString("Squiggly", comment: "")
  1655. let imageV = KMNoteTypeImageView()
  1656. let color = UserDefaults.standard.PDFListViewColor(forKey: CSquigglyNoteColorKey)
  1657. item?.image = imageV.noteTypeImage(withType: "Squiggly", color: color ?? NSColor(red: 255/255.0, green: 115/255.0, blue: 22/255.0, alpha: 1.0))
  1658. item?.target = self
  1659. item?.btnTag = CAnnotationType.squiggly.rawValue
  1660. item?.isShowCustomToolTip = true
  1661. item?.toolTip = String(format: "%@ (⌃⌘W)", NSLocalizedString("Squiggly", comment: ""))
  1662. item?.isPopToolTip = true
  1663. item?.boxImagePosition = .imageOnly
  1664. item?.btnAction = #selector(changeAnnotationMode)
  1665. } else if identifier == KMToolbarInkAnnotationItemIdentifier {
  1666. item?.titleName = NSLocalizedString("Freehand", comment: "")
  1667. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPen)
  1668. let imageV = KMNoteTypeImageView()
  1669. let color = UserDefaults.standard.PDFListViewColor(forKey: CInkNoteColorKey) ?? .red
  1670. item?.image = imageV.noteTypeImage(withType: SKNInkString, color: color)
  1671. item?.target = self
  1672. item?.btnTag = CAnnotationType.ink.rawValue
  1673. item?.isShowCustomToolTip = true
  1674. item?.toolTip = NSLocalizedString("Add freehand drawings by hand writing just like you do with a pen.", comment: "")
  1675. item?.isPopToolTip = true
  1676. item?.boxImagePosition = .imageOnly
  1677. item?.btnAction = #selector(changeAnnotationMode)
  1678. } else if identifier == KMToolbarEraserAnnotationItemIdentifier {
  1679. item?.titleName = NSLocalizedString("Eraser", comment: "")
  1680. // item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsPen)
  1681. let imageV = KMNoteTypeImageView()
  1682. let color = UserDefaults.standard.PDFListViewColor(forKey: CInkNoteColorKey) ?? .red
  1683. item?.image = imageV.noteTypeImage(withType: "eraser", color: color)
  1684. item?.target = self
  1685. item?.btnTag = CAnnotationType.eraser.rawValue
  1686. item?.isShowCustomToolTip = true
  1687. item?.toolTip = NSLocalizedString("Eraser", comment: "")
  1688. item?.isPopToolTip = true
  1689. item?.boxImagePosition = .imageOnly
  1690. item?.btnAction = #selector(changeAnnotationMode)
  1691. } else if identifier == KMToolbarFreeTextAnnotationItemIdentifier {
  1692. item?.titleName = NSLocalizedString("Text Note", comment: "")
  1693. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsText)
  1694. item?.target = self
  1695. item?.btnTag = CAnnotationType.freeText.rawValue
  1696. item?.isShowCustomToolTip = true
  1697. item?.toolTip = String(format: "%@ (⌘N)", NSLocalizedString("Text Note", comment: ""))
  1698. item?.isPopToolTip = true
  1699. item?.boxImagePosition = .imageOnly
  1700. item?.btnAction = #selector(changeAnnotationMode)
  1701. } else if identifier == KMToolbarAnchoredAnnotationItemIdentifier {
  1702. item?.titleName = NSLocalizedString("Anchored Note", comment: "")
  1703. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsNote)
  1704. item?.target = self
  1705. item?.btnTag = CAnnotationType.anchored.rawValue
  1706. item?.isShowCustomToolTip = true
  1707. item?.toolTip = String(format: "%@ (⌥⌘N)", NSLocalizedString("Anchored Note", comment: ""))
  1708. item?.isPopToolTip = true
  1709. item?.boxImagePosition = .imageOnly
  1710. item?.btnAction = #selector(changeAnnotationMode)
  1711. } else if identifier == KMToolbarSquareAnnotationItemIdentifier {
  1712. item?.titleName = NSLocalizedString("Rectangle", comment: "")
  1713. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsRec)
  1714. item?.target = self
  1715. item?.btnTag = CAnnotationType.square.rawValue
  1716. item?.isShowCustomToolTip = true
  1717. item?.toolTip = NSLocalizedString("Draw rectangle; draw square by holding Shift key", comment: "")
  1718. item?.isPopToolTip = true
  1719. item?.boxImagePosition = .imageOnly
  1720. item?.btnAction = #selector(changeAnnotationMode)
  1721. }else if identifier == KMToolbarCircleAnnotationItemIdentifier {
  1722. item?.titleName = NSLocalizedString("Circle", comment: "")
  1723. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsOval)
  1724. item?.target = self
  1725. item?.btnTag = CAnnotationType.circle.rawValue
  1726. item?.isShowCustomToolTip = true
  1727. item?.toolTip = NSLocalizedString("Draw oval; draw circle by holding Shift key", comment: "")
  1728. item?.isPopToolTip = true
  1729. item?.boxImagePosition = .imageOnly
  1730. item?.btnAction = #selector(changeAnnotationMode)
  1731. } else if identifier == KMToolbarArrowAnnotationItemIdentifier {
  1732. item?.titleName = NSLocalizedString("Arrow", comment: "")
  1733. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsArrow)
  1734. item?.target = self
  1735. item?.btnTag = CAnnotationType.arrow.rawValue
  1736. item?.isShowCustomToolTip = true
  1737. item?.toolTip = NSLocalizedString("Draw arrow; draw straight arrow by holding Shift key", comment: "")
  1738. item?.isPopToolTip = true
  1739. item?.boxImagePosition = .imageOnly
  1740. item?.btnAction = #selector(changeAnnotationMode)
  1741. } else if identifier == KMToolbarLineAnnotationItemIdentifier {
  1742. item?.titleName = NSLocalizedString("Line", comment: "")
  1743. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLine)
  1744. item?.target = self
  1745. item?.btnTag = CAnnotationType.line.rawValue
  1746. item?.isShowCustomToolTip = true
  1747. item?.toolTip = NSLocalizedString("Draw line; draw straight line by holding Shift key", comment: "")
  1748. item?.isPopToolTip = true
  1749. item?.boxImagePosition = .imageOnly
  1750. item?.btnAction = #selector(changeAnnotationMode)
  1751. } else if identifier == KMToolbarLinkAnnotationItemIdentifier {
  1752. item?.titleName = NSLocalizedString("Link", comment: "")
  1753. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsLink)
  1754. item?.target = self
  1755. item?.btnTag = CAnnotationType.link.rawValue
  1756. item?.isShowCustomToolTip = true
  1757. item?.toolTip = NSLocalizedString("Select an area or text on a page for a link to be inserted.", comment: "")
  1758. item?.isPopToolTip = true
  1759. item?.boxImagePosition = .imageOnly
  1760. item?.btnAction = #selector(changeAnnotationMode)
  1761. } else if identifier == KMToolbarSignSignatureAnnotationItemIdentifier {
  1762. item?.titleName = NSLocalizedString("Signature", comment: "")
  1763. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsSign)
  1764. item?.target = self
  1765. item?.btnTag = CAnnotationType.signSignature.rawValue
  1766. item?.isShowCustomToolTip = true
  1767. item?.toolTip = NSLocalizedString("Add beautiful handwriting or use your trackpad to create your own signature.", comment: "")
  1768. item?.isPopToolTip = true
  1769. item?.boxImagePosition = .imageOnly
  1770. item?.btnAction = #selector(changeAnnotationMode)
  1771. } else if identifier == KMAnnotationStampToolbarItemIdentifier {
  1772. item?.titleName = NSLocalizedString("Stamp", comment: "")
  1773. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsStamp)
  1774. item?.target = self
  1775. item?.btnTag = CAnnotationType.stamp.rawValue
  1776. item?.isShowCustomToolTip = true
  1777. item?.toolTip = NSLocalizedString("Add New Stamp", comment: "")
  1778. item?.isPopToolTip = true
  1779. item?.boxImagePosition = .imageOnly
  1780. item?.btnAction = #selector(changeAnnotationMode)
  1781. } else if identifier == KMToolbarShowToolbarItemIdentifier {
  1782. item?.image = NSImage(named: "KMImageNameMainToolShow")
  1783. item?.selectedImage = NSImage(named: "KMImageNameMainToolHide")
  1784. item?.alternateImage = NSImage(named: "KMImageNameMainToolShow")
  1785. item?.selectedBackgroundColor = NSColor.clear
  1786. item?.target = self
  1787. item?.isShowCustomToolTip = true
  1788. item?.toolTip = NSLocalizedString("Hide", comment: "")
  1789. item?.isPopToolTip = true
  1790. item?.titleName = NSLocalizedString("Hide", comment: "")
  1791. item?.boxImagePosition = .imageOnly
  1792. item?.btnAction = #selector(showPDFLayoutMode)
  1793. let menuItem = NSMenuItem.init(title: NSLocalizedString("Hide", comment: ""), action: #selector(_menuItemAction), target: self)
  1794. item?.menuFormRepresentation = menuItem
  1795. menuItem.representedObject = identifier
  1796. } else if identifier == KMToolbarAnnotationSettingItemIdentifier {
  1797. item?.image = NSImage(named: "KMImageNameUXIconBtnSetNor")
  1798. item?.target = self
  1799. item?.isShowCustomToolTip = true
  1800. item?.toolTip = String(format: "%@\n%@", NSLocalizedString("Customize Toolbar", comment: ""),NSLocalizedString("Drag-and-drop tools to change their order", comment: ""))
  1801. item?.isPopToolTip = true
  1802. item?.titleName = NSLocalizedString("Setting", comment: "")
  1803. item?.boxImagePosition = .imageOnly
  1804. item?.btnAction = #selector(_itemAction)
  1805. item?.selectBackgroundType = .imageBox
  1806. } else if identifier == KMAnnotationImageToolbarItemIdentifier {
  1807. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsImage)
  1808. item?.target = self
  1809. item?.titleName = NSLocalizedString("Image", comment: "")
  1810. item?.isShowCustomToolTip = true
  1811. item?.toolTip = NSLocalizedString("Choose an image to insert in a page.", comment: "")
  1812. item?.isPopToolTip = true
  1813. item?.boxImagePosition = .imageOnly
  1814. item?.btnAction = #selector(_itemAction)
  1815. } else if identifier == KMAnnotationTableToolbarItemIdentifier {
  1816. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarMytoolsTable)
  1817. item?.target = self
  1818. item?.btnTag = CAnnotationType.table.rawValue
  1819. item?.titleName = NSLocalizedString("Table", comment: "")
  1820. item?.isShowCustomToolTip = true
  1821. item?.toolTip = NSLocalizedString("Table", comment: "")
  1822. item?.isPopToolTip = true
  1823. item?.boxImagePosition = .imageOnly
  1824. item?.btnAction = #selector(_itemAction)
  1825. let menuItem = NSMenuItem.init(title: NSLocalizedString("Table", comment: ""), action: #selector(_menuItemAction), target: self)
  1826. item?.menuFormRepresentation = menuItem
  1827. menuItem.representedObject = identifier
  1828. }
  1829. }
  1830. private func _setupEditItem(_ item: KMToolbarItemView?) {
  1831. let identifier = item?.itemIdentifier
  1832. if identifier == KMToolbarAddTextEditPDFItemIdentifier {
  1833. item?.image = NSImage(named: "KMImageNameButtonEidtPDFText")
  1834. item?.target = self
  1835. item?.toolTip = NSLocalizedString("Add Text", comment: "")
  1836. item?.titleName = NSLocalizedString("Add Text", comment: "")
  1837. item?.boxImagePosition = .imageLeft
  1838. item?.btnAction = #selector(changeAnnotationMode)
  1839. } else if identifier == KMToolbarAddImageEditPDFItemIdentifier {
  1840. item?.image = NSImage(named: "KMImageNameButtonEidtPDFImage")
  1841. item?.target = self
  1842. item?.toolTip = NSLocalizedString("Add Image", comment: "")
  1843. item?.titleName = NSLocalizedString("Add Image", comment: "")
  1844. item?.boxImagePosition = .imageLeft
  1845. item?.btnAction = #selector(changeAnnotationMode)
  1846. }
  1847. }
  1848. private func _setupConvertItem(_ item: KMToolbarItemView?) {
  1849. let identifier = item?.itemIdentifier
  1850. if identifier == KMToolbarConversionWordItemIdentifier {
  1851. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertWord)
  1852. item?.target = self
  1853. item?.btnTag = KMToolbarType.word.rawValue
  1854. 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: "")
  1855. item?.titleName = NSLocalizedString("To Word", comment: "")
  1856. item?.boxImagePosition = .imageLeft
  1857. item?.btnAction = #selector(conversionMenuItemAction)
  1858. item?.promptIdentifier = identifier
  1859. let menuItem = NSMenuItem.init(title: NSLocalizedString("To Word", comment: ""), action: #selector(_menuItemAction), target: self)
  1860. menuItem.representedObject = identifier
  1861. item?.menuFormRepresentation = menuItem
  1862. } else if identifier == KMToolbarConversionExcelItemIdentifier {
  1863. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExcel)
  1864. item?.target = self
  1865. item?.btnTag = KMToolbarType.excel.rawValue
  1866. 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: "")
  1867. item?.titleName = NSLocalizedString("To Excel", comment: "")
  1868. item?.boxImagePosition = .imageLeft
  1869. item?.btnAction = #selector(conversionMenuItemAction)
  1870. item?.promptIdentifier = identifier
  1871. let menuItem = NSMenuItem.init(title: NSLocalizedString("To Excel", comment: ""), action: #selector(_menuItemAction), target: self)
  1872. menuItem.representedObject = identifier
  1873. item?.menuFormRepresentation = menuItem
  1874. } else if identifier == KMToolbarConversionPPTItemIdentifier {
  1875. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPPT)
  1876. item?.target = self
  1877. item?.btnTag = KMToolbarType.ppt.rawValue
  1878. 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: "")
  1879. item?.titleName = NSLocalizedString("To PPT", comment: "")
  1880. item?.boxImagePosition = .imageLeft
  1881. item?.btnAction = #selector(conversionMenuItemAction)
  1882. item?.promptIdentifier = identifier
  1883. let menuItem = NSMenuItem.init(title: NSLocalizedString("To PPT", comment: ""), action: #selector(_menuItemAction), target: self)
  1884. menuItem.representedObject = identifier
  1885. item?.menuFormRepresentation = menuItem
  1886. } else if identifier == KMToolbarConversionRTFItemIdentifier {
  1887. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertRTF)
  1888. item?.target = self
  1889. item?.btnTag = KMToolbarType.rtf.rawValue
  1890. item?.toolTip = NSLocalizedString("Turn PDF documents into Rich Text Format (RTF) files that can be opened in virtually any word processor.", comment: "")
  1891. item?.titleName = NSLocalizedString("To RTF", comment: "")
  1892. item?.boxImagePosition = .imageLeft
  1893. item?.btnAction = #selector(conversionMenuItemAction)
  1894. item?.promptIdentifier = identifier
  1895. let menuItem = NSMenuItem.init(title: NSLocalizedString("To RTF", comment: ""), action: #selector(_menuItemAction), target: self)
  1896. menuItem.representedObject = identifier
  1897. item?.menuFormRepresentation = menuItem
  1898. } else if identifier == KMToolbarConversionCSVItemIdentifier {
  1899. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCSV)
  1900. item?.target = self
  1901. item?.btnTag = KMToolbarType.csv.rawValue
  1902. item?.toolTip = NSLocalizedString("PDF To CSV", comment: "")
  1903. item?.titleName = NSLocalizedString("To CSV", comment: "")
  1904. item?.boxImagePosition = .imageLeft
  1905. item?.btnAction = #selector(conversionMenuItemAction)
  1906. item?.promptIdentifier = identifier
  1907. let menuItem = NSMenuItem.init(title: NSLocalizedString("To CSV", comment: ""), action: #selector(_menuItemAction), target: self)
  1908. menuItem.representedObject = identifier
  1909. item?.menuFormRepresentation = menuItem
  1910. } else if identifier == KMToolbarConversionHTMLItemIdentifier {
  1911. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertHtml)
  1912. item?.target = self
  1913. item?.btnTag = KMToolbarType.html.rawValue
  1914. item?.toolTip = NSLocalizedString("PDF To HTML", comment: "")
  1915. item?.titleName = NSLocalizedString("To HTML", comment: "")
  1916. item?.boxImagePosition = .imageLeft
  1917. item?.btnAction = #selector(conversionMenuItemAction)
  1918. let menuItem = NSMenuItem.init(title: NSLocalizedString("To HTML", comment: ""), action: #selector(_menuItemAction), target: self)
  1919. menuItem.representedObject = identifier
  1920. item?.menuFormRepresentation = menuItem
  1921. } else if identifier == KMToolbarConversionTextItemIdentifier {
  1922. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertText)
  1923. item?.target = self
  1924. item?.btnTag = KMToolbarType.conversion_text.rawValue
  1925. item?.toolTip = NSLocalizedString("PDF To Text", comment: "")
  1926. item?.titleName = NSLocalizedString("To Text", comment: "")
  1927. item?.boxImagePosition = .imageLeft
  1928. item?.btnAction = #selector(conversionMenuItemAction)
  1929. let menuItem = NSMenuItem.init(title: NSLocalizedString("To Text", comment: ""), action: #selector(_menuItemAction), target: self)
  1930. menuItem.representedObject = identifier
  1931. item?.menuFormRepresentation = menuItem
  1932. } else if identifier == KMToolbarConversionImageToPDFItemIdentifier {
  1933. item?.image = NSImage(named: KMImageNameToolbarImageToPDF)
  1934. item?.target = self
  1935. item?.btnTag = KMToolbarType.conversion_imageToPDF.rawValue
  1936. item?.toolTip = NSLocalizedString("Image To PDF", comment: "")
  1937. item?.titleName = NSLocalizedString("Image To PDF", comment: "")
  1938. item?.boxImagePosition = .imageLeft
  1939. item?.btnAction = #selector(conversionMenuItemAction)
  1940. let menuItem = NSMenuItem.init(title: NSLocalizedString("Image To PDF", comment: ""), action: #selector(_menuItemAction), target: self)
  1941. menuItem.representedObject = identifier
  1942. item?.menuFormRepresentation = menuItem
  1943. }
  1944. else if identifier == KMToolbarConversionOtherItemIdentifier {
  1945. item?.image = NSImage(named: "KMImageNameToolbarPDFToOther")
  1946. item?.target = self
  1947. item?.btnTag = KMToolbarType.conversion_other.rawValue
  1948. item?.titleName = NSLocalizedString("To Other", comment: "")
  1949. item?.boxImagePosition = .imageExpandLeft
  1950. item?.needExpandAction = true
  1951. item?.btnAction = nil
  1952. item?.promptIdentifier = identifier
  1953. let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
  1954. let subMenu = NSMenu()
  1955. let textI = subMenu.addItem_r(title: NSLocalizedString("To Text", comment: ""), action: #selector(_menuItemAction), target: self, tag: KMPDFConvertType.text.rawValue)
  1956. textI?.representedObject = identifier
  1957. let rtfI = subMenu.addItem_r(title: NSLocalizedString("To RTF", comment: ""), action: #selector(_menuItemAction), target: self, tag: KMPDFConvertType.rtf.rawValue)
  1958. rtfI?.representedObject = identifier
  1959. let htmlI = subMenu.addItem_r(title: NSLocalizedString("To HTML", comment: ""), action: #selector(_menuItemAction), target: self, tag: KMPDFConvertType.html.rawValue)
  1960. htmlI?.representedObject = identifier
  1961. let csvI = subMenu.addItem_r(title: NSLocalizedString("To CSV", comment: ""), action: #selector(_menuItemAction), target: self, tag: KMPDFConvertType.csv.rawValue)
  1962. csvI?.representedObject = identifier
  1963. let jsonI = subMenu.addItem_r(title: NSLocalizedString("To Json", comment: ""), action: #selector(_menuItemAction), target: self, tag: KMPDFConvertType.json.rawValue)
  1964. jsonI?.representedObject = identifier
  1965. menuItem.submenu = subMenu
  1966. item?.menuFormRepresentation = menuItem
  1967. }
  1968. else if identifier == KMToolbarConversionImageItemIdentifier {
  1969. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertPDFToIMG)
  1970. item?.target = self
  1971. item?.btnTag = KMToolbarType.conversion_image.rawValue
  1972. // item?.toolTip = NSLocalizedString("Convert PDF to JPEG, PNG, TIFF, BMP, GIF or TGA files", comment: "")
  1973. item?.titleName = NSLocalizedString("To Image", comment: "")
  1974. item?.boxImagePosition = .imageExpandLeft
  1975. item?.needExpandAction = true
  1976. item?.btnAction = #selector(convertToImage)
  1977. item?.promptIdentifier = identifier
  1978. let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
  1979. let subMenu = NSMenu()
  1980. subMenu.addItem(title: NSLocalizedString("PDF To JPEG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpeg.rawValue)
  1981. subMenu.addItem(title: NSLocalizedString("PDF To JPG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.jpg.rawValue)
  1982. subMenu.addItem(title: NSLocalizedString("PDF To PNG", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.png.rawValue)
  1983. subMenu.addItem(title: NSLocalizedString("PDF To GIF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.gif.rawValue)
  1984. subMenu.addItem(title: NSLocalizedString("PDF To TIFF", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tiff.rawValue)
  1985. subMenu.addItem(title: NSLocalizedString("PDF To TGA", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.tga.rawValue)
  1986. subMenu.addItem(title: NSLocalizedString("PDF To BMP", comment: ""), action: #selector(_pdfToImageAction), target: self, tag: KMPDFConvertType.bmp.rawValue)
  1987. menuItem.submenu = subMenu
  1988. item?.menuFormRepresentation = menuItem
  1989. } else if item?.itemIdentifier == KMToolbarConversionExportImageItemIdentifier {
  1990. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertExportImage)
  1991. item?.target = self
  1992. // item?.toolTip = NSLocalizedString("The range you can extract images includes current page, odd page, even page, custom page, and all pages.", comment: "")
  1993. item?.titleName = NSLocalizedString("Extract Images", comment: "")
  1994. item?.boxImagePosition = .imageExpandLeft
  1995. item?.needExpandAction = true
  1996. item?.promptIdentifier = identifier
  1997. let menuItem = NSMenuItem.init(title: item?.titleName ?? "", action: nil, target: self)
  1998. let subMenu = NSMenu()
  1999. subMenu.addItem(title: NSLocalizedString("Extract All Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 1)
  2000. subMenu.addItem(title: NSLocalizedString("Extract Images", comment: ""), action: #selector(_exportImageAction), target: self, tag: 2)
  2001. menuItem.submenu = subMenu
  2002. item?.menuFormRepresentation = menuItem
  2003. } else if item?.itemIdentifier == KMToolbarConversionOCRIdentifier {
  2004. item?.titleName = NSLocalizedString("OCR", comment: "")
  2005. item?.target = self
  2006. item?.image = NSImage(named: "KMImageNameToolbarOCRNor")
  2007. item?.boxImagePosition = .imageLeft
  2008. item?.toolTip = NSLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
  2009. item?.btnAction = #selector(OCRbtnAction2)
  2010. let menuItem = NSMenuItem.init(title: NSLocalizedString("OCR", comment: ""), action: #selector(_menuItemAction), target: self)
  2011. menuItem.representedObject = KMToolbarConversionOCRIdentifier
  2012. item?.menuFormRepresentation = menuItem
  2013. } else if item?.itemIdentifier == KMToolbarConversionCreatePDFItemIdentifier {
  2014. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarConvertCreatPDF)
  2015. item?.target = self
  2016. // item?.toolTip = NSLocalizedString("Convert JPEG, JPG, PNG, TIFF, BMP or PSD files to PDFs", comment: "")
  2017. item?.titleName = NSLocalizedString("New PDF Document", comment: "")
  2018. item?.boxImagePosition = .imageExpandLeft
  2019. item?.needExpandAction = true
  2020. let menuItem = NSMenuItem.init(title: "New PDF Document", action: nil, target: self)
  2021. let subMenu = NSMenu()
  2022. subMenu.addItem(title: NSLocalizedString("New Blank Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 1)
  2023. subMenu.addItem(title: NSLocalizedString("New From Images", comment: ""), action: #selector(_newPDFAction), target: self, tag: 2)
  2024. subMenu.addItem(NSMenuItem.separator())
  2025. subMenu.addItem(title: NSLocalizedString("New From Web Page", comment: ""), action: #selector(_newPDFAction), target: self, tag: 3)
  2026. subMenu.addItem(title: NSLocalizedString("Import From Camera", comment: ""), action: #selector(_newPDFAction), target: self, tag: 4)
  2027. subMenu.addItem(NSMenuItem.separator())
  2028. subMenu.addItem(title: NSLocalizedString("Import From Scanner", comment: ""), action: #selector(_newPDFAction), target: self, tag: 5)
  2029. menuItem.submenu = subMenu
  2030. item?.menuFormRepresentation = menuItem
  2031. }
  2032. }
  2033. @objc func convertToImage(_ sender: KMToolbarItem) {
  2034. // if let subMenu = sender.menuFormRepresentation?.submenu {
  2035. // subMenu.popUp(positioning: nil, at: sender.frame.origin, in: sender.superview)
  2036. // }
  2037. }
  2038. private func _setupFillSignItem(_ item: KMToolbarItemView?) {
  2039. let identifier = item?.itemIdentifier
  2040. if identifier == KMToolbarToolHookItemIdentifier {
  2041. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignTick)
  2042. item?.target = self
  2043. item?.btnTag = CAnnotationType.signTure.rawValue
  2044. item?.toolTip = NSLocalizedString("Signature", comment: "")
  2045. item?.titleName = NSLocalizedString("Signature", comment: "")
  2046. item?.boxImagePosition = .imageOnly
  2047. item?.btnAction = #selector(changeAnnotationMode)
  2048. } else if identifier == KMToolbarToolForkItemIdentifier {
  2049. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignFork)
  2050. item?.target = self
  2051. item?.btnTag = CAnnotationType.signFalse.rawValue
  2052. item?.toolTip = NSLocalizedString("Add X", comment: "")
  2053. item?.boxImagePosition = .imageOnly
  2054. item?.btnAction = #selector(changeAnnotationMode)
  2055. } else if identifier == KMToolbarToolLineItemIdentifier {
  2056. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignLine)
  2057. item?.target = self
  2058. item?.btnTag = CAnnotationType.signLine.rawValue
  2059. item?.toolTip = NSLocalizedString("Add line", comment: "")
  2060. item?.boxImagePosition = .imageOnly
  2061. item?.btnAction = #selector(changeAnnotationMode)
  2062. } else if identifier == KMToolbarToolDotItemIdentifier {
  2063. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignPoint)
  2064. item?.target = self
  2065. item?.btnTag = CAnnotationType.signDot.rawValue
  2066. item?.toolTip = NSLocalizedString("Add dot", comment: "")
  2067. item?.boxImagePosition = .imageOnly
  2068. item?.btnAction = #selector(changeAnnotationMode)
  2069. } else if identifier == KMToolbarToolRectangleIdentifier {
  2070. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignRoundedrec)
  2071. item?.target = self
  2072. item?.btnTag = CAnnotationType.signCircle.rawValue
  2073. item?.toolTip = NSLocalizedString("Add circle", comment: "")
  2074. item?.boxImagePosition = .imageOnly
  2075. item?.btnAction = #selector(changeAnnotationMode)
  2076. } else if identifier == KMToolbarToolTextIdentifier {
  2077. item?.image = NSImage(named: KMImageNameToolbarFreeText)
  2078. item?.target = self
  2079. item?.btnTag = CAnnotationType.signText.rawValue
  2080. item?.toolTip = NSLocalizedString("Add text", comment: "")
  2081. item?.titleName = NSLocalizedString("Text", comment: "")
  2082. item?.boxImagePosition = .imageOnly
  2083. item?.btnAction = #selector(changeAnnotationMode)
  2084. } else if identifier == KMToolbarToolDateIdentifier {
  2085. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignDate)
  2086. item?.target = self
  2087. item?.btnTag = CAnnotationType.signDate.rawValue
  2088. item?.toolTip = NSLocalizedString("Date", comment: "")
  2089. item?.boxImagePosition = .imageOnly
  2090. item?.btnAction = #selector(changeAnnotationMode)
  2091. } else if (identifier == KMToolbarToolProfileIdentifier) {
  2092. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMyprofile)
  2093. item?.target = self
  2094. item?.toolTip = NSLocalizedString("My Profile", comment: "")
  2095. item?.boxImagePosition = .imageOnly
  2096. item?.btnAction = #selector(_itemAction)
  2097. }else if (identifier == KMToolbarFillSignSignatureIdentifier) {
  2098. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFillsignMysignature)
  2099. item?.target = self
  2100. item?.btnTag = CAnnotationType.signSignature.rawValue
  2101. item?.toolTip = NSLocalizedString("Sign document by typing or drawing a signature", comment: "")
  2102. item?.boxImagePosition = .imageOnly
  2103. item?.btnAction = #selector(changeAnnotationMode)
  2104. }
  2105. }
  2106. private func _setupFormItem(_ item: KMToolbarItemView?) {
  2107. let identifier = item?.itemIdentifier
  2108. if identifier == KMToolbarToolTextFieldItemIdentifier {
  2109. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormTextfield)
  2110. item?.target = self
  2111. item?.btnTag = CAnnotationType.textField.rawValue
  2112. item?.toolTip = NSLocalizedString("Text Field", comment: "")
  2113. item?.titleName = NSLocalizedString("Text Field", comment: "")
  2114. item?.boxImagePosition = .imageLeft
  2115. item?.btnAction = #selector(changeAnnotationMode)
  2116. let menuItem = NSMenuItem.init(title: "TextField", action: #selector(changeAnnotationMode), target: self)
  2117. menuItem.tag = item!.btnTag
  2118. item?.menuFormRepresentation = menuItem
  2119. } else if identifier == KMToolbarToolCheckBoxItemIdentifier {
  2120. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormCheckbox)
  2121. item?.target = self
  2122. item?.btnTag = CAnnotationType.checkBox.rawValue
  2123. item?.toolTip = NSLocalizedString("Check Box", comment: "")
  2124. item?.titleName = NSLocalizedString("Check Box", comment: "")
  2125. item?.boxImagePosition = .imageLeft
  2126. item?.btnAction = #selector(changeAnnotationMode)
  2127. } else if identifier == KMToolbarToolRadioButtonItemIdentifier {
  2128. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormRadiobutton)
  2129. item?.target = self
  2130. item?.btnTag = CAnnotationType.radioButton.rawValue
  2131. item?.toolTip = NSLocalizedString("Radio Button", comment: "")
  2132. item?.titleName = NSLocalizedString("Radio Button", comment: "")
  2133. item?.boxImagePosition = .imageLeft
  2134. item?.btnAction = #selector(changeAnnotationMode)
  2135. let menuItem = NSMenuItem.init(title: "RadioButton", action: #selector(changeAnnotationMode), target: self)
  2136. menuItem.tag = item!.btnTag
  2137. item?.menuFormRepresentation = menuItem
  2138. } else if identifier == KMToolbarToolListBoxItemIdentifier {
  2139. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormListbox)
  2140. item?.target = self
  2141. item?.btnTag = CAnnotationType.listMenu.rawValue
  2142. item?.toolTip = NSLocalizedString("List Box", comment: "")
  2143. item?.titleName = NSLocalizedString("List Box", comment: "")
  2144. item?.boxImagePosition = .imageLeft
  2145. item?.btnAction = #selector(changeAnnotationMode)
  2146. let menuItem = NSMenuItem.init(title: "List Box", action: #selector(changeAnnotationMode), target: self)
  2147. menuItem.tag = item!.btnTag
  2148. item?.menuFormRepresentation = menuItem
  2149. } else if identifier == KMToolbarToolPullDownmenuItemIdentifier {
  2150. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormPulldownmenu)
  2151. item?.target = self
  2152. item?.btnTag = CAnnotationType.comboBox.rawValue
  2153. item?.toolTip = NSLocalizedString("Combo Box", comment: "")
  2154. item?.titleName = NSLocalizedString("Combo Box", comment: "")
  2155. item?.boxImagePosition = .imageLeft
  2156. item?.btnAction = #selector(changeAnnotationMode)
  2157. let menuItem = NSMenuItem.init(title: "PullDownmenu", action: #selector(changeAnnotationMode), target: self)
  2158. menuItem.tag = item!.btnTag
  2159. item?.menuFormRepresentation = menuItem
  2160. } else if identifier == KMToolbarToolButtonIdentifier {
  2161. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormButton)
  2162. item?.target = self
  2163. item?.btnTag = CAnnotationType.actionButton.rawValue
  2164. item?.toolTip = NSLocalizedString("Button", comment: "")
  2165. item?.titleName = NSLocalizedString("Button", comment: "")
  2166. item?.boxImagePosition = .imageLeft
  2167. item?.btnAction = #selector(changeAnnotationMode)
  2168. let menuItem = NSMenuItem.init(title: "Button", action: #selector(changeAnnotationMode), target: self)
  2169. menuItem.tag = item!.btnTag
  2170. item?.menuFormRepresentation = menuItem
  2171. } else if identifier == KMToolbarToolSignBoxIdentifier {
  2172. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarFormSign)
  2173. item?.target = self
  2174. item?.btnTag = CAnnotationType.signature.rawValue
  2175. item?.toolTip = NSLocalizedString("Add Electronic Signature", comment: "")
  2176. item?.titleName = NSLocalizedString("Add Electronic Signature", comment: "")
  2177. item?.boxImagePosition = .imageLeft
  2178. item?.btnAction = #selector(changeAnnotationMode)
  2179. let menuItem = NSMenuItem.init(title: "SignBox", action: #selector(changeAnnotationMode), target: self)
  2180. menuItem.tag = item!.btnTag
  2181. item?.menuFormRepresentation = menuItem
  2182. } else if identifier == KMToolbarToolFormAlignIdentifier {
  2183. item?.image = NSImage(named: KMImageNameUXIconPropertybarAlignLeftToor)
  2184. item?.target = self
  2185. // item?.toolTip = NSLocalizedString("Alignment", comment: "")
  2186. item?.titleName = NSLocalizedString("", comment: "")
  2187. item?.boxImagePosition = .imageExpandLeft
  2188. item?.needExpandAction = true
  2189. item?.btnAction = #selector(formsAlignmentAction)
  2190. item?.pdfView = self.pdfView
  2191. let menuItem = NSMenuItem.init(title: "Alignment", action: nil, target: self)
  2192. let subMenu = NSMenu()
  2193. subMenu.addItem(title: NSLocalizedString("Align Left", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignLeftNor", action: #selector(formsAlignmentAction), target: self, tag: 0)
  2194. subMenu.addItem(title: NSLocalizedString("Align Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVercenterNor", action: #selector(formsAlignmentAction), target: self, tag: 1)
  2195. subMenu.addItem(title: NSLocalizedString("Align Right", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignRightNor", action: #selector(formsAlignmentAction), target: self, tag: 2)
  2196. subMenu.addItem(NSMenuItem.separator())
  2197. subMenu.addItem(title: NSLocalizedString("Align Top", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignUpNor", action: #selector(formsAlignmentAction), target: self, tag: 3)
  2198. subMenu.addItem(title: NSLocalizedString("Align Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorcenterNor", action: #selector(formsAlignmentAction), target: self, tag: 4)
  2199. subMenu.addItem(title: NSLocalizedString("Align Bottom", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignDownNor", action: #selector(formsAlignmentAction), target: self, tag: 5)
  2200. subMenu.addItem(NSMenuItem.separator())
  2201. subMenu.addItem(title: NSLocalizedString("Distribute Horizontally", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignHorsplitNor", action: #selector(formsAlignmentAction), target: self, tag: 6)
  2202. subMenu.addItem(title: NSLocalizedString("Distribute Vertically", comment: ""), imageNamed: "KMImageNameUXIconPropertybarAlignVersplitNor", action: #selector(formsAlignmentAction), target: self, tag: 7)
  2203. menuItem.submenu = subMenu
  2204. menuItem.tag = item!.btnTag
  2205. item?.menuFormRepresentation = menuItem
  2206. } else if identifier == KMToolbarToolFormMoreIdentifier {
  2207. item?.image = NSImage(named: "KMImageNameMainToolFormMore")
  2208. item?.target = self
  2209. item?.toolTip = NSLocalizedString("More", comment: "")
  2210. item?.titleName = NSLocalizedString("More", comment: "")
  2211. item?.boxImagePosition = .imageExpandLeft
  2212. item?.btnAction = #selector(formsMoreOperationAction)
  2213. let menuItem = NSMenuItem.init(title: "More", action: #selector(formsMoreOperationAction), target: self)
  2214. menuItem.tag = item!.btnTag
  2215. item?.menuFormRepresentation = menuItem
  2216. }
  2217. }
  2218. private func _setupViewDisplayItem(_ item: KMToolbarItemView?) {
  2219. let identifier = item?.itemIdentifier
  2220. if identifier == KMToolbarViewSettingIdentifier {
  2221. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayView)
  2222. item?.target = self
  2223. item?.toolTip = NSLocalizedString("View Settings", comment: "")
  2224. item?.titleName = NSLocalizedString("View Settings", comment: "")
  2225. item?.boxImagePosition = .imageLeft
  2226. item?.btnAction = #selector(_itemAction)
  2227. } else if identifier == KMToolbarCropIdentifier {
  2228. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTailor)
  2229. item?.target = self
  2230. // item?.toolTip = NSLocalizedString("Note: Cropping a PDF hides some of the PDF’s content without removing it.", comment: "")
  2231. item?.titleName = NSLocalizedString("Crop", comment: "")
  2232. item?.boxImagePosition = .imageExpandLeft
  2233. item?.needExpandAction = true
  2234. // item?.btnAction = #selector(cropMenuAction)
  2235. let menuItem = NSMenuItem.init(title: NSLocalizedString("Crop", comment: ""), action: #selector(cropMenuAction), target: self)
  2236. let subMenu = NSMenu()
  2237. // subMenu.addItem(title: NSLocalizedString("Crop All Pages", comment: ""), action: #selector(_cropAction), target: self, tag: 1)
  2238. subMenu.addItem(title: NSLocalizedString("Crop Current Page", comment: ""), action: #selector(_cropAction), target: self, tag: 2)
  2239. subMenu.addItem(title: NSLocalizedString("Auto Crop – Separate", comment: ""), action: #selector(_cropAction), target: self, tag: 3)
  2240. subMenu.addItem(title: NSLocalizedString("Auto Crop – Combined", comment: ""), action: #selector(_cropAction), target: self, tag: 4)
  2241. subMenu.addItem(title: NSLocalizedString("Select Area", comment: ""), action: #selector(_cropAction), target: self, tag: 5)
  2242. // subMenu.addItem(title: NSLocalizedString("Crop Options...", comment: ""), action: #selector(_cropAction), target: self, tag: 6)
  2243. menuItem.submenu = subMenu
  2244. item?.menuFormRepresentation = menuItem
  2245. } else if identifier == KMToolbarSnapshotIdentifier {
  2246. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplaySnapshot)
  2247. item?.target = self
  2248. item?.toolTip = NSLocalizedString("Take Snapshot", comment: "")
  2249. item?.titleName = NSLocalizedString("Snapshot", comment: "")
  2250. item?.boxImagePosition = .imageLeft
  2251. item?.btnAction = #selector(_itemAction)
  2252. } else if identifier == KMToolbarTTSIdentifier {
  2253. item?.image = NSImage(named: KMImageNameUXIconSubtoolbarDisplayTTS)
  2254. item?.target = self
  2255. item?.toolTip = NSLocalizedString("TTS (Text-to-speech)", comment: "")
  2256. item?.titleName = NSLocalizedString("TTS", comment: "")
  2257. item?.boxImagePosition = .imageLeft
  2258. item?.btnAction = #selector(_itemAction)
  2259. }
  2260. }
  2261. private func _setupToolItem(_ item: KMToolbarItemView?) {
  2262. let identifier = item?.itemIdentifier
  2263. if identifier == KMToolbarToolCropItemIdentifier {
  2264. item?.image = NSImage(named: "KMImageNameMainToolsCrop")
  2265. item?.alternateImage = NSImage(named: "KMImageNameMainToolsCrop")
  2266. item?.target = self
  2267. item?.btnTag = KMToolbarType.crop.rawValue
  2268. item?.toolTip = NSLocalizedString("Crop pages", comment: "")
  2269. item?.titleName = NSLocalizedString("Crop", comment: "")
  2270. item?.boxImagePosition = .imageExpandLeft
  2271. item?.btnAction = #selector(cropMenuAction)
  2272. let menuItem = NSMenuItem.init(title: "Crop", action: #selector(cropMenuAction), target: self)
  2273. item?.menuFormRepresentation = menuItem
  2274. } else if identifier == KMToolbarComparisonItemIdentifier {
  2275. item?.image = NSImage(named: KMImageNameUXIconBatchComparison)
  2276. item?.target = self
  2277. item?.btnTag = KMToolbarType.comparison.rawValue
  2278. // item?.toolTip = NSLocalizedString("Compare", comment: "")
  2279. item?.titleName = NSLocalizedString("Compare", comment: "")
  2280. item?.boxImagePosition = .imageExpandLeft
  2281. item?.needExpandAction = true
  2282. // item?.btnAction = #selector(_itemAction)
  2283. let menuItem = NSMenuItem.init(title: NSLocalizedString("Compare", comment: ""), action: nil, target: self)
  2284. let subMenu = NSMenu()
  2285. subMenu.addItem(title: NSLocalizedString("Side-by-Side View", comment: ""), action: #selector(_comparisonAction), target: self, tag: 1)
  2286. subMenu.addItem(title: NSLocalizedString("Compare by File Overlay", comment: ""), action: #selector(_comparisonAction), target: self, tag: 2)
  2287. menuItem.submenu = subMenu
  2288. item?.menuFormRepresentation = menuItem
  2289. } else if identifier == KMToolbarToolBatesItemIdentifier {
  2290. item?.image = NSImage(named: "KMImageNameUXIconBatchBatesNor")
  2291. item?.target = self
  2292. item?.btnTag = KMToolbarType.bates.rawValue
  2293. // item?.toolTip = NSLocalizedString("Add PDF Bates numbering to your legal, medical, or business documents", comment: "")
  2294. item?.titleName = NSLocalizedString("Bates Numbers", comment: "")
  2295. item?.boxImagePosition = .imageExpandLeft
  2296. item?.needExpandAction = true
  2297. // item?.btnAction = #selector(batesMenuAction)
  2298. let menuItem = NSMenuItem.init(title: NSLocalizedString("Bates Numbers", comment: ""), action: nil, target: self)
  2299. let subMenu = NSMenu()
  2300. subMenu.addItem(title: NSLocalizedString("Add Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 1)
  2301. subMenu.addItem(title: NSLocalizedString("Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 2)
  2302. subMenu.addItem(title: NSLocalizedString("Batch Add Batch Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 3)
  2303. subMenu.addItem(title: NSLocalizedString("Batch Remove Bates Numbers", comment: ""), action: #selector(_batesAction), target: self, tag: 4)
  2304. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_batesAction), target: self, tag: 5)
  2305. menuItem.submenu = subMenu
  2306. item?.menuFormRepresentation = menuItem
  2307. } else if identifier == KMToolbarAIItemIdentifier {
  2308. item?.image = NSImage(named: "KMImageNameUXIconAINor")
  2309. item?.target = self
  2310. item?.btnTag = KMToolbarType.aiTools.rawValue
  2311. item?.titleName = NSLocalizedString("AI Tools", comment: "")
  2312. item?.boxImagePosition = .imageExpandLeft
  2313. item?.needExpandAction = true
  2314. let menuItem = NSMenuItem.init(title: "AI Tools", action: nil, target: self)
  2315. let subMenu = NSMenu()
  2316. subMenu.addItem(title: NSLocalizedString("AI Summarize", comment: ""), action: #selector(_AIAction), target: self, tag: 1)
  2317. subMenu.addItem(title: NSLocalizedString("AI Rewrite", comment: ""), action: #selector(_AIAction), target: self, tag: 2)
  2318. subMenu.addItem(title: NSLocalizedString("AI Proofread", comment: ""), action: #selector(_AIAction), target: self, tag: 3)
  2319. subMenu.addItem(title: NSLocalizedString("AI Translate", comment: ""), action: #selector(_AIAction), target: self, tag: 4)
  2320. menuItem.submenu = subMenu
  2321. item?.menuFormRepresentation = menuItem
  2322. } else if identifier == KMToolbarToolHeaderFooterItemIdentifier {
  2323. item?.image = NSImage(named: "KMImageNameUXIconBatchHeaderandfooterNor")
  2324. item?.target = self
  2325. item?.btnTag = KMToolbarType.headerAndFooter.rawValue
  2326. // item?.toolTip = NSLocalizedString("Insert header, footer, and page numbers to PDF", comment: "")
  2327. item?.titleName = NSLocalizedString("Header & Footer", comment: "")
  2328. item?.boxImagePosition = .imageExpandLeft
  2329. item?.needExpandAction = true
  2330. // item?.btnAction = #selector(headerfooterMenuAction)
  2331. let menuItem = NSMenuItem.init(title: NSLocalizedString("Header & Footer", comment: ""), action: nil, target: self)
  2332. let subMenu = NSMenu()
  2333. subMenu.addItem(title: NSLocalizedString("Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 1)
  2334. subMenu.addItem(title: NSLocalizedString("Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 2)
  2335. subMenu.addItem(title: NSLocalizedString("Batch Add Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 3)
  2336. subMenu.addItem(title: NSLocalizedString("Batch Remove Header & Footer", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 4)
  2337. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_headerfooterAction), target: self, tag: 5)
  2338. menuItem.submenu = subMenu
  2339. item?.menuFormRepresentation = menuItem
  2340. } else if identifier == KMToolbarToolBackgroundItemIdentifier {
  2341. item?.image = NSImage(named: "KMImageNameUXIconBatchBackgroundNor")
  2342. item?.target = self
  2343. item?.btnTag = KMToolbarType.background.rawValue
  2344. // item?.toolTip = NSLocalizedString("Insert PDF page background by color or image", comment: "")
  2345. item?.titleName = NSLocalizedString("Background", comment: "")
  2346. item?.boxImagePosition = .imageExpandLeft
  2347. item?.needExpandAction = true
  2348. // item?.btnAction = #selector(backgroundMenuAction)
  2349. let menuItem = NSMenuItem.init(title: NSLocalizedString("Background", comment: ""), action: nil, target: self)
  2350. let subMenu = NSMenu()
  2351. subMenu.addItem(title: NSLocalizedString("Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 1)
  2352. subMenu.addItem(title: NSLocalizedString("Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 2)
  2353. subMenu.addItem(title: NSLocalizedString("Batch Add Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 3)
  2354. subMenu.addItem(title: NSLocalizedString("Batch Remove Background", comment: ""), action: #selector(_backgroundAction), target: self, tag: 4)
  2355. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_backgroundAction), target: self, tag: 5)
  2356. menuItem.submenu = subMenu
  2357. item?.menuFormRepresentation = menuItem
  2358. } else if identifier == KMToolbarToolWatermarkItemIdentifier {
  2359. item?.image = NSImage(named: "KMImageNameUXIconBatchWatermarkNor")
  2360. item?.target = self
  2361. item?.btnTag = KMToolbarType.watermark.rawValue
  2362. // item?.toolTip = NSLocalizedString("Watermark", comment: "")
  2363. item?.titleName = NSLocalizedString("Watermark", comment: "")
  2364. item?.boxImagePosition = .imageExpandLeft
  2365. item?.needExpandAction = true
  2366. // item?.btnAction = #selector(watermarkMenuAction)
  2367. let menuItem = NSMenuItem.init(title: NSLocalizedString("Watermark", comment: ""), action: nil, target: self)
  2368. let subMenu = NSMenu()
  2369. subMenu.addItem(title: NSLocalizedString("Add Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 1)
  2370. subMenu.addItem(title: NSLocalizedString("Remove Watermark", comment: ""), action: #selector(_watermarkAction), target: self, tag: 2)
  2371. subMenu.addItem(title: NSLocalizedString("Batch Add Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 3)
  2372. subMenu.addItem(title: NSLocalizedString("Batch Remove Watermarks", comment: ""), action: #selector(_watermarkAction), target: self, tag: 4)
  2373. subMenu.addItem(title: NSLocalizedString("Manage Templates", comment: ""), action: #selector(_watermarkAction), target: self, tag: 5)
  2374. menuItem.submenu = subMenu
  2375. item?.menuFormRepresentation = menuItem
  2376. } else if identifier == KMToolbarToolCompressItemIdentifier {
  2377. item?.image = NSImage(named: "KMImageNameUXIconBatchOptimizeNor")
  2378. item?.target = self
  2379. item?.btnTag = KMToolbarType.compress.rawValue
  2380. item?.boxImagePosition = .imageLeft
  2381. item?.toolTip = NSLocalizedString("Reduce file size", comment: "")
  2382. item?.titleName = NSLocalizedString("Compress", comment: "")
  2383. item?.btnAction = #selector(compressMenuAction)
  2384. let menuItem = NSMenuItem.init(title: NSLocalizedString("Compress", comment: ""), action: #selector(_menuItemAction), target: self)
  2385. item?.menuFormRepresentation = menuItem
  2386. menuItem.representedObject = identifier
  2387. } else if identifier == KMToolbarToolSecureItemIdentifier {
  2388. item?.image = NSImage(named: "KMImageNameUXIconBatchSafeNor")
  2389. item?.target = self
  2390. // item?.toolTip = NSLocalizedString("Batch encrypting PDF documents", comment: "")
  2391. item?.titleName = NSLocalizedString("Security", comment: "")
  2392. item?.boxImagePosition = .imageExpandLeft
  2393. item?.needExpandAction = true
  2394. // item?.btnAction = #selector(secureMenuAction)
  2395. let menuItem = NSMenuItem.init(title: NSLocalizedString("Security", comment: ""), action: nil, target: self)
  2396. let subMenu = NSMenu()
  2397. subMenu.addItem(title: NSLocalizedString("Set Passwords", comment: ""), action: #selector(_secureAction), target: self, tag: 1)
  2398. subMenu.addItem(title: NSLocalizedString("Remove Security", comment: ""), action: #selector(_secureAction), target: self, tag: 2)
  2399. menuItem.submenu = subMenu
  2400. item?.menuFormRepresentation = menuItem
  2401. }else if identifier == KMToolbarToolMergeItemIdentifier {
  2402. item?.image = NSImage(named: "KMImageNameUXIconBatchMergeNor")
  2403. item?.target = self
  2404. item?.btnTag = KMToolbarType.merge.rawValue
  2405. item?.toolTip = NSLocalizedString("Combine multiple documents into a new PDF, or borrow individual pages", comment: "")
  2406. item?.titleName = NSLocalizedString("Merge", comment: "")
  2407. item?.boxImagePosition = .imageLeft
  2408. item?.btnAction = #selector(mergeMenuItemAction)
  2409. let menuItem = NSMenuItem.init(title: NSLocalizedString("Merge", comment: ""), action: #selector(_menuItemAction), target: self)
  2410. item?.menuFormRepresentation = menuItem
  2411. menuItem.representedObject = identifier
  2412. } else if identifier == KMToolbarMeasureItemIdentifier {
  2413. item?.image = NSImage(named: "KMImageNameUXIconMeasureNor")
  2414. item?.target = self
  2415. item?.titleName = NSLocalizedString("Measure", comment: "")
  2416. item?.boxImagePosition = .imageExpandLeft
  2417. item?.needExpandAction = true
  2418. item?.btnAction = #selector(_itemAction)
  2419. let menuItem = NSMenuItem.init(title: NSLocalizedString("Measure", comment: ""), action: nil, target: self)
  2420. let subMenu = NSMenu()
  2421. subMenu.addItem(title: NSLocalizedString("Line", comment: ""), action: #selector(_measureAction), target: self, tag: 1)
  2422. subMenu.addItem(title: NSLocalizedString("Multilines", comment: ""), action: #selector(_measureAction), target: self, tag: 2)
  2423. subMenu.addItem(title: NSLocalizedString("Polygon", comment: ""), action: #selector(_measureAction), target: self, tag: 3)
  2424. subMenu.addItem(title: NSLocalizedString("Rectangle", comment: ""), action: #selector(_measureAction), target: self, tag: 4)
  2425. menuItem.submenu = subMenu
  2426. item?.menuFormRepresentation = menuItem
  2427. }
  2428. }
  2429. private func _setupSignItem(_ item: KMToolbarItemView?) {
  2430. let identifier = item?.itemIdentifier
  2431. if identifier == KMSignDigitalSignToolbarItemIdentifier {
  2432. item?.image = NSImage(named: "DigitalSign_icon")
  2433. item?.target = self
  2434. 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: "")
  2435. item?.titleName = NSLocalizedString("Digital Sign", comment: "")
  2436. // item?.selectBackgroundType = .imageBox
  2437. item?.boxImagePosition = .imageLeft
  2438. item?.btnAction = #selector(_itemAction)
  2439. item?.promptIdentifier = identifier
  2440. let menuItem = NSMenuItem.init(title: NSLocalizedString("Digital Sign", comment: ""), action: #selector(_menuItemAction), target: self)
  2441. menuItem.tag = item!.btnTag
  2442. menuItem.representedObject = identifier
  2443. item?.menuFormRepresentation = menuItem
  2444. }
  2445. }
  2446. }
  2447. extension KMToolbarViewController: NSMenuItemValidation {
  2448. func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
  2449. if menuItem.action == #selector(toggleCaseInsensitiveSearch) {
  2450. menuItem.state = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey) == 1 ? .on : .off
  2451. } else if menuItem.action == #selector(formsAlignmentAction) {
  2452. let cnt = self.pdfView?.activeAnnotations.count ?? 0
  2453. if menuItem.tag < 6 {
  2454. if cnt >= 2 {
  2455. return true
  2456. }
  2457. } else {
  2458. if cnt >= 3 {
  2459. return true
  2460. }
  2461. }
  2462. return false
  2463. }
  2464. return true
  2465. }
  2466. }
  2467. extension KMToolbarViewController {
  2468. func isEnable(isEnable: Bool = true) {
  2469. for item in toolbarItems {
  2470. let itemView: KMToolbarMainItemView = item.value as? KMToolbarMainItemView ?? KMToolbarMainItemView()
  2471. itemView.unEnabled = !isEnable
  2472. itemView.isSelected = false
  2473. if let cv = itemView.customizeView {
  2474. self.subviewsdEnable(view: cv, isEnable: isEnable)
  2475. }
  2476. }
  2477. }
  2478. func subviewsdEnable(view: NSView, isEnable: Bool) {
  2479. if let data = view as? NSButton {
  2480. data.isEnabled = isEnable
  2481. }
  2482. if let data = (view as? NSTextField) {
  2483. data.isEnabled = isEnable
  2484. }
  2485. for subview in view.subviews {
  2486. if subview.subviews.count != 0 {
  2487. self.subviewsdEnable(view: subview, isEnable: isEnable)
  2488. }
  2489. if let data = subview as? NSButton {
  2490. data.isEnabled = isEnable
  2491. }
  2492. if let data = (subview as? NSTextField) {
  2493. data.isEnabled = isEnable
  2494. }
  2495. }
  2496. }
  2497. }
  2498. extension KMToolbarViewController {
  2499. func refreshSearchBarMenu() {
  2500. let words = UserDefaults.standard.array(forKey: "kmDocumentSearchWordArrays") as? [String] ?? []
  2501. let searchMenu = NSMenu()
  2502. // for word in words {
  2503. // var truncatedWord = word
  2504. // if word.count > 15 {
  2505. // truncatedWord = String(word.prefix(15)) + "..."
  2506. // }
  2507. // let item = searchMenu.addItem(withTitle: truncatedWord, action: #selector(searchPDFKeyWord(_:)), keyEquivalent: "")
  2508. // item.representedObject = word
  2509. // }
  2510. let attributes: [NSAttributedString.Key: Any] = [.font: NSFont(name: "Helvetica", size: 12.0)!]
  2511. // if !words.isEmpty {
  2512. // let attributedString = NSAttributedString(string: NSLocalizedString("Search History", comment: ""), attributes: attributes)
  2513. // let item = NSMenuItem()
  2514. // item.attributedTitle = attributedString
  2515. // searchMenu.insertItem(item, at: 0)
  2516. // searchMenu.addItem(NSMenuItem.separator())
  2517. //
  2518. // let attributedString1 = NSAttributedString(string: NSLocalizedString("Clear Search History", comment: ""), attributes: attributes)
  2519. // let item1 = NSMenuItem()
  2520. // item1.attributedTitle = attributedString1
  2521. // item1.action = #selector(clearSearchWordHistory(_:))
  2522. // item1.target = self
  2523. // searchMenu.addItem(item1)
  2524. //
  2525. // searchMenu.insertItem(NSMenuItem.separator(), at: 0)
  2526. // }
  2527. //
  2528. // let attributedString2 = NSAttributedString(string: NSLocalizedString("Ignore Case", comment: ""), attributes: attributes)
  2529. // let ignoreItem = NSMenuItem()
  2530. // ignoreItem.attributedTitle = attributedString2
  2531. // ignoreItem.action = #selector(toggleCaseInsensitiveSearch)
  2532. // ignoreItem.target = self
  2533. // searchMenu.insertItem(ignoreItem, at: 0)
  2534. let attri = NSAttributedString(string: NSLocalizedString("Search", comment: ""), attributes: attributes)
  2535. let item = NSMenuItem()
  2536. item.attributedTitle = attri
  2537. item.action = #selector(searchItemAction)
  2538. item.target = self
  2539. searchMenu.insertItem(item, at: 0)
  2540. let attri2 = NSAttributedString(string: NSLocalizedString("Replace", comment: ""), attributes: attributes)
  2541. let item2 = NSMenuItem()
  2542. item2.attributedTitle = attri2
  2543. item2.action = #selector(replaceItemAction)
  2544. item2.target = self
  2545. searchMenu.insertItem(item2, at: 1)
  2546. (self.searchField.cell as? NSSearchFieldCell)?.searchMenuTemplate = searchMenu
  2547. }
  2548. @objc func searchItemAction(_ sender: NSMenuItem) {
  2549. let item = self.toolbarItemFindItemIdentifiers(value: KMDocumentSearchToolbarItemIdentifier)
  2550. if item.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
  2551. self.delegate?.toolbarViewController?(self, menuItemDidClick: item, index: 11, info: nil)
  2552. }
  2553. }
  2554. @objc func replaceItemAction(_ sender: NSMenuItem) {
  2555. let item = self.toolbarItemFindItemIdentifiers(value: KMDocumentSearchToolbarItemIdentifier)
  2556. if item.itemIdentifier == KMDocumentSearchToolbarItemIdentifier {
  2557. self.delegate?.toolbarViewController?(self, menuItemDidClick: item, index: 12, info: nil)
  2558. }
  2559. }
  2560. @objc func toggleCaseInsensitiveSearch(_ sender: NSMenuItem) {
  2561. var value = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
  2562. KMDataManager.ud_set(value == 0 ? 1 : 0, forKey: SKCaseInsensitiveSearchKey)
  2563. // let caseInsensitive = UserDefaults.standard.bool(forKey: "SKCaseInsensitiveFindKey")
  2564. // UserDefaults.standard.set(!caseInsensitive, forKey: "SKCaseInsensitiveFindKey")
  2565. self.searchPDFKey(self.searchField.stringValue)
  2566. }
  2567. @objc func searchPDFKeyWord(_ item: NSMenuItem) {
  2568. guard let word = item.representedObject as? String else {
  2569. return
  2570. }
  2571. self.searchPDFKey(word)
  2572. }
  2573. func searchPDFKey(_ string: String) {
  2574. self.searchField.stringValue = string
  2575. self.delegate?.toolbarViewController?(self, searchAction: string, forward: true)
  2576. let word = string
  2577. var words = UserDefaults.standard.array(forKey: "kmDocumentSearchWordArrays") as? [String] ?? []
  2578. var mutableWords = words
  2579. if let index = mutableWords.firstIndex(of: word) {
  2580. mutableWords.remove(at: index)
  2581. }
  2582. mutableWords.insert(word, at: 0)
  2583. if mutableWords.count > 10 {
  2584. mutableWords.removeLast()
  2585. }
  2586. UserDefaults.standard.set(mutableWords, forKey: "kmDocumentSearchWordArrays")
  2587. UserDefaults.standard.synchronize()
  2588. refreshSearchBarMenu()
  2589. }
  2590. @objc func clearSearchWordHistory(_ sender: Any) {
  2591. UserDefaults.standard.removeObject(forKey: "kmDocumentSearchWordArrays")
  2592. UserDefaults.standard.synchronize()
  2593. refreshSearchBarMenu()
  2594. }
  2595. }