KMToolbarViewController.swift 152 KB

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