KMToolbarViewController.swift 154 KB

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