KMPDFSecToolbarController.swift 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. //
  2. // KMPDFSecToolbarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/8.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMPDFSecToolbarControllerDelegate: AnyObject {
  10. @objc optional func kmPDFSecToolbarControllerDidItemClickedEnable(_ controller: KMPDFSecToolbarController, _ property: Any) -> Bool
  11. @objc optional func kmPDFSecToolbarControllerDidItemClicked(_ controller: KMPDFSecToolbarController, _ property: Any)
  12. @objc optional func kmPDFSecToolbarControllerDidSelectTextDidBeginEditing(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect)
  13. @objc optional func kmPDFSecToolbarControllerDidSelectTextDidChange(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect)
  14. @objc optional func kmPDFSecToolbarControllerDidSelectTextDidEndEditing(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect)
  15. }
  16. class KMPDFSecToolbarController: KMNBaseViewController {
  17. @IBOutlet var contendBox: NSBox!
  18. @IBOutlet var sepDivider: ComponentDivider!
  19. @IBOutlet var infoContendView: NSView!
  20. @IBOutlet var rightContendView: NSView!
  21. @IBOutlet var moreToolsBGView: NSView!
  22. @IBOutlet var moreToolsView: ComponentDropdownTool!
  23. @IBOutlet var contendLeftConst: NSLayoutConstraint!
  24. @IBOutlet var contendViewWidthConst: NSLayoutConstraint!
  25. @IBOutlet var rightContendViewWidthConst: NSLayoutConstraint!
  26. private var _propertys: [NSObject] = []
  27. var propertys: [NSObject] {
  28. get {
  29. return _propertys
  30. }
  31. }
  32. private var propertysWidthValue: CGFloat = 0
  33. private var lastPropertyWidth: CGFloat = 0
  34. private var hidePropertys: [Any] = []
  35. private var rightPropertys: [Any] = []
  36. var pdfView: CPDFListView?
  37. var viewManager: KMPDFViewManager?
  38. weak open var delegate: KMPDFSecToolbarControllerDelegate?
  39. //MARK: - func
  40. override func viewWillLayout() {
  41. super.viewWillLayout()
  42. let contendXValue = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2
  43. contendLeftConst.constant = max(0, contendXValue)
  44. if contendXValue <= 0 {
  45. contendViewWidthConst.constant = CGRectGetWidth(view.frame)
  46. } else {
  47. contendViewWidthConst.constant = propertysWidthValue
  48. }
  49. hidePropertys.removeAll()
  50. moreToolsBGView.isHidden = true
  51. let subviews = infoContendView.subviews
  52. for view in subviews {
  53. if CGRectGetMidX(view.frame) > CGRectGetWidth(self.view.frame) - lastPropertyWidth {
  54. moreToolsBGView.isHidden = false
  55. view.isHidden = true
  56. if view is ComponentButton {
  57. hidePropertys.append((view as! ComponentButton).properties)
  58. } else if view is ComponentDropdownTool {
  59. hidePropertys.append((view as! ComponentDropdownTool).properties)
  60. }
  61. } else {
  62. view.isHidden = false
  63. }
  64. }
  65. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(setUpHidePropertys), object: nil)
  66. self.perform(#selector(setUpHidePropertys), with: nil, afterDelay: 0.35)
  67. }
  68. override func viewDidLoad() {
  69. super.viewDidLoad()
  70. // Do view setup here.
  71. setUpProperty()
  72. }
  73. override func updateUIThemeColor() {
  74. super.updateUIThemeColor()
  75. setUpUI()
  76. }
  77. override func updateUILanguage() {
  78. super.updateUILanguage()
  79. guard let _ = infoContendView else {
  80. return
  81. }
  82. let subviews = infoContendView.subviews
  83. for view in subviews {
  84. if let button = view as? ComponentButton {
  85. button.properties.buttonText = KMLocalizedString(button.properties.englishTitle ?? "")
  86. let buttonProperty = button.properties
  87. if buttonProperty.identifier == KMPDFToolbar_highlight_Identifier {
  88. button.toolTip = String(format: "%@ (⌃⌘H)", KMLocalizedString("Highlight", comment: ""))
  89. } else if buttonProperty.identifier == KMPDFToolbar_underline_Identifier {
  90. button.toolTip = String(format: "%@ (⌃⌘U)", KMLocalizedString("Underline", comment: ""))
  91. } else if buttonProperty.identifier == KMPDFToolbar_waveline_Identifier {
  92. button.toolTip = String(format: "%@ (⌃⌘V)", KMLocalizedString("Squiggly", comment: ""))
  93. } else if buttonProperty.identifier == KMPDFToolbar_strikethrough_Identifier {
  94. button.toolTip = String(format: "%@ (⌃⌘S)", KMLocalizedString("Strikethrough", comment: ""))
  95. } else if buttonProperty.identifier == KMPDFToolbar_text_Identifier {
  96. button.toolTip = String(format: "%@ (⌃⌘T)", KMLocalizedString("Text Note", comment: ""))
  97. } else if buttonProperty.identifier == KMPDFToolbar_note_Identifier {
  98. button.toolTip = String(format: "%@ (⌃⌘N)", KMLocalizedString("Anchored Note", comment: ""))
  99. } else if buttonProperty.identifier == KMPDFToolbar_pen_Identifier {
  100. button.toolTip = KMLocalizedString("Add freehand drawings by hand writing just like you do with a pen.", comment: "")
  101. } else if buttonProperty.identifier == KMPDFToolbar_eraser_Identifier {
  102. button.toolTip = KMLocalizedString("Eraser", comment: "")
  103. } else if buttonProperty.identifier == KMPDFToolbar_rectangle_Identifier {
  104. button.toolTip = KMLocalizedString("Draw rectangle; draw square by holding Shift key", comment: "")
  105. } else if buttonProperty.identifier == KMPDFToolbar_circle_Identifier {
  106. button.toolTip = KMLocalizedString("Draw oval; draw circle by holding Shift key", comment: "")
  107. } else if buttonProperty.identifier == KMPDFToolbar_arrow_Identifier {
  108. button.toolTip = KMLocalizedString("Draw arrow; draw straight arrow by holding Shift key", comment: "")
  109. } else if buttonProperty.identifier == KMPDFToolbar_stamp_Identifier {
  110. button.toolTip = KMLocalizedString("Add New Stamp", comment: "")
  111. } else if buttonProperty.identifier == KMPDFToolbar_line_Identifier {
  112. button.toolTip = KMLocalizedString("Draw line; draw straight line by holding Shift key", comment: "")
  113. } else if buttonProperty.identifier == KMPDFToolbar_sign_Identifier {
  114. button.toolTip = KMLocalizedString("Sign document by typing or drawing a signature", comment: "")
  115. } else if buttonProperty.identifier == KMPDFToolbar_eye_Identifier {
  116. button.toolTip = KMLocalizedString("Hide", comment: "")
  117. if self.pdfView?.hideNotes == true {
  118. button.toolTip = KMLocalizedString("Display", comment: "")
  119. }
  120. }
  121. else if buttonProperty.identifier == KMPDFToolbar_edit_text_Identifier {
  122. button.toolTip = KMLocalizedString("Add Text", comment: "")
  123. } else if buttonProperty.identifier == KMPDFToolbar_edit_image_Identifier {
  124. button.toolTip = KMLocalizedString("Add Image", comment: "")
  125. } else if buttonProperty.identifier == KMPDFToolbar_edit_link_Identifier {
  126. button.toolTip = KMLocalizedString("Select an area or text on a page for a link to be inserted.", comment: "")
  127. }
  128. else if buttonProperty.identifier == KMPDFToolbar_form_text_Identifier {
  129. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  130. } else if buttonProperty.identifier == KMPDFToolbar_form_checkbox_Identifier {
  131. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  132. } else if buttonProperty.identifier == KMPDFToolbar_form_radio_Identifier {
  133. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  134. } else if buttonProperty.identifier == KMPDFToolbar_form_list_Identifier {
  135. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  136. } else if buttonProperty.identifier == KMPDFToolbar_form_dropdown_Identifier {
  137. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  138. } else if buttonProperty.identifier == KMPDFToolbar_form_OK_Identifier {
  139. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  140. } else if buttonProperty.identifier == KMPDFToolbar_form_digitalSign_Identifier {
  141. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  142. }
  143. else if buttonProperty.identifier == KMPDFToolbar_fill_tick_Identifier {
  144. button.toolTip = KMLocalizedString("Add check mark", comment: "")
  145. } else if buttonProperty.identifier == KMPDFToolbar_fill_fork_Identifier {
  146. button.toolTip = KMLocalizedString("Add X", comment: "")
  147. } else if buttonProperty.identifier == KMPDFToolbar_fill_rectangle_Identifier {
  148. button.toolTip = KMLocalizedString("Add circle", comment: "")
  149. } else if buttonProperty.identifier == KMPDFToolbar_fill_line_Identifier {
  150. button.toolTip = KMLocalizedString("Add line", comment: "")
  151. } else if buttonProperty.identifier == KMPDFToolbar_fill_dot_Identifier {
  152. button.toolTip = KMLocalizedString("Add dot", comment: "")
  153. } else if buttonProperty.identifier == KMPDFToolbar_fill_date_Identifier {
  154. button.toolTip = KMLocalizedString("Date", comment: "")
  155. } else if buttonProperty.identifier == KMPDFToolbar_fill_sign_Identifier {
  156. button.toolTip = KMLocalizedString("Sign document by typing or drawing a signature", comment: "")
  157. }
  158. else if buttonProperty.identifier == KMPDFToolbar_convert_word_Identifier {
  159. button.toolTip = KMLocalizedString("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: "")
  160. } else if buttonProperty.identifier == KMPDFToolbar_convert_excel_Identifier {
  161. button.toolTip = KMLocalizedString("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: "")
  162. } else if buttonProperty.identifier == KMPDFToolbar_convert_ppt_Identifier {
  163. button.toolTip = KMLocalizedString("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: "")
  164. } else if buttonProperty.identifier == KMPDFToolbar_convert_image_Identifier {
  165. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  166. } else if buttonProperty.identifier == KMPDFToolbar_convert_imageToPDF_Identifier {
  167. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  168. }
  169. else if buttonProperty.identifier == KMPDFToolbar_protect_redact_Identifier {
  170. button.toolTip = KMLocalizedString("Mark for redaction", comment: "")
  171. } else if buttonProperty.identifier == KMPDFToolbar_protect_security_Identifier {
  172. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  173. } else if buttonProperty.identifier == KMPDFToolbar_protect_removeSecurity_Identifier {
  174. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  175. } else if buttonProperty.identifier == KMPDFToolbar_protect_digitalSign_Identifier {
  176. button.toolTip = KMLocalizedString("Digital signature ensures the authenticity and integrity of digital files. Click and drag the cursor to create a signature field on the page.", comment: "")
  177. }
  178. else if buttonProperty.identifier == KMPDFToolbar_tools_OCR_Identifier {
  179. button.toolTip = KMLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "")
  180. } else if buttonProperty.identifier == KMPDFToolbar_tools_merge_Identifier {
  181. button.toolTip = KMLocalizedString("Combine multiple documents into a new PDF, or borrow individual pages", comment: "")
  182. } else if buttonProperty.identifier == KMPDFToolbar_tools_TTS_Identifier {
  183. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  184. } else if buttonProperty.identifier == KMPDFToolbar_tools_batch_Identifier {
  185. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  186. } else if buttonProperty.identifier == KMPDFToolbar_tools_extractImage_Identifier {
  187. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  188. } else if buttonProperty.identifier == KMPDFToolbar_tools_AITools_Identifier {
  189. button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "")
  190. }
  191. } else if let dropdownTool = view as? ComponentDropdownTool {
  192. dropdownTool.properties.text = KMLocalizedString(dropdownTool.properties.englishTitle ?? "")
  193. for menuItem in dropdownTool.properties.menuItemArr ?? [] {
  194. menuItem.text = KMLocalizedString(menuItem.englishTitle)
  195. }
  196. } else if let select = view as? ComponentSelect {
  197. select.properties.placeholder = KMLocalizedString(select.properties.englishPlaceholder ?? "")
  198. for menuItem in select.menuitemPropertys {
  199. menuItem.text = KMLocalizedString(menuItem.englishTitle)
  200. }
  201. }
  202. }
  203. reloadMainview()
  204. }
  205. //MARK: - Setup
  206. func setUpProperty() {
  207. setUpUI()
  208. moreToolsBGView.wantsLayer = true
  209. moreToolsBGView.layer?.backgroundColor = contendBox.fillColor.cgColor
  210. moreToolsBGView.isHidden = true
  211. moreToolsView.properties = ComponentDropdownToolProperty(state: .normal, leftIcon: NSImage(named: "toolbar_doubleArrow_right"))
  212. moreToolsView.delegate = self
  213. }
  214. func setUpUI() {
  215. contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
  216. }
  217. @objc func setUpHidePropertys() {
  218. var menuItemArr: [ComponentMenuitemProperty] = []
  219. for item in hidePropertys {
  220. if item is ComponentButtonProperty {
  221. let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentButtonProperty).buttonText ?? "", identifier: (item as! ComponentButtonProperty).identifier)
  222. menuItemArr.append(menuItem)
  223. } else if item is ComponentDropdownToolProperty {
  224. let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentDropdownToolProperty).text ?? "", identifier: "")
  225. if let subItems = (item as! ComponentDropdownToolProperty).menuItemArr {
  226. menuItem.subPropertys = subItems
  227. }
  228. menuItemArr.append(menuItem)
  229. }
  230. }
  231. moreToolsView.properties.menuItemArr = menuItemArr
  232. }
  233. //MARK: - Getter
  234. func returnIDWithSubToolMode(_ subToolMode: KMPDFSubToolMode) -> String {
  235. if subToolMode == .Highlight {
  236. return KMPDFToolbar_highlight_Identifier
  237. } else if subToolMode == .Underline {
  238. return KMPDFToolbar_underline_Identifier
  239. } else if subToolMode == .Waveline {
  240. return KMPDFToolbar_waveline_Identifier
  241. } else if subToolMode == .Strikethrough {
  242. return KMPDFToolbar_strikethrough_Identifier
  243. } else if subToolMode == .Text {
  244. return KMPDFToolbar_text_Identifier
  245. } else if subToolMode == .Note {
  246. return KMPDFToolbar_note_Identifier
  247. } else if subToolMode == .Pen {
  248. return KMPDFToolbar_pen_Identifier
  249. } else if subToolMode == .Eraser {
  250. return KMPDFToolbar_eraser_Identifier
  251. } else if subToolMode == .Rectangle {
  252. return KMPDFToolbar_rectangle_Identifier
  253. } else if subToolMode == .Circle {
  254. return KMPDFToolbar_circle_Identifier
  255. } else if subToolMode == .Arrow {
  256. return KMPDFToolbar_arrow_Identifier
  257. } else if subToolMode == .Line {
  258. return KMPDFToolbar_line_Identifier
  259. } else if subToolMode == .Measure {
  260. return KMPDFToolbar_measure_Identifier
  261. } else if subToolMode == .Stamp {
  262. return KMPDFToolbar_stamp_Identifier
  263. } else if subToolMode == .Sign {
  264. return KMPDFToolbar_sign_Identifier
  265. } else if subToolMode == .Edit_text {
  266. return KMPDFToolbar_edit_text_Identifier
  267. } else if subToolMode == .Edit_Image {
  268. return KMPDFToolbar_edit_image_Identifier
  269. } else if subToolMode == .Edit_Link {
  270. return KMPDFToolbar_edit_link_Identifier
  271. } else if subToolMode == .Edit_Crop {
  272. return KMPDFToolbar_edit_crop_Identifier
  273. } else if subToolMode == .Fill_tick {
  274. return KMPDFToolbar_fill_tick_Identifier
  275. } else if subToolMode == .fill_fork {
  276. return KMPDFToolbar_fill_fork_Identifier
  277. } else if subToolMode == .fill_rectangle {
  278. return KMPDFToolbar_fill_rectangle_Identifier
  279. } else if subToolMode == .fill_line {
  280. return KMPDFToolbar_fill_line_Identifier
  281. } else if subToolMode == .fill_dot {
  282. return KMPDFToolbar_fill_dot_Identifier
  283. } else if subToolMode == .fill_date {
  284. return KMPDFToolbar_fill_date_Identifier
  285. } else if subToolMode == .fill_sign {
  286. return KMPDFToolbar_fill_sign_Identifier
  287. } else if subToolMode == .Form_text {
  288. return KMPDFToolbar_form_text_Identifier
  289. } else if subToolMode == .Form_checkbox {
  290. return KMPDFToolbar_form_checkbox_Identifier
  291. } else if subToolMode == .Form_radio {
  292. return KMPDFToolbar_form_radio_Identifier
  293. } else if subToolMode == .Form_list {
  294. return KMPDFToolbar_form_list_Identifier
  295. } else if subToolMode == .Form_dropdown {
  296. return KMPDFToolbar_form_dropdown_Identifier
  297. } else if subToolMode == .Form_OK {
  298. return KMPDFToolbar_form_OK_Identifier
  299. } else if subToolMode == .Form_digitalSign {
  300. return KMPDFToolbar_form_digitalSign_Identifier
  301. } else if subToolMode == .Redact {
  302. return KMPDFToolbar_protect_redact_Identifier
  303. } else if subToolMode == .Digital_Sign {
  304. return KMPDFToolbar_protect_digitalSign_Identifier
  305. } else if subToolMode == .Tool_OCR {
  306. return KMPDFToolbar_tools_OCR_Identifier
  307. }
  308. return ""
  309. }
  310. func returnSubToolModeWithID(_ identifier: String) -> KMPDFSubToolMode {
  311. if identifier == KMPDFToolbar_highlight_Identifier {
  312. return .Highlight
  313. } else if identifier == KMPDFToolbar_underline_Identifier {
  314. return .Underline
  315. } else if identifier == KMPDFToolbar_waveline_Identifier {
  316. return .Waveline
  317. } else if identifier == KMPDFToolbar_strikethrough_Identifier {
  318. return .Strikethrough
  319. } else if identifier == KMPDFToolbar_text_Identifier {
  320. return .Text
  321. } else if identifier == KMPDFToolbar_note_Identifier {
  322. return .Note
  323. } else if identifier == KMPDFToolbar_pen_Identifier {
  324. return .Pen
  325. } else if identifier == KMPDFToolbar_eraser_Identifier {
  326. return .Eraser
  327. } else if identifier == KMPDFToolbar_rectangle_Identifier {
  328. return .Rectangle
  329. } else if identifier == KMPDFToolbar_circle_Identifier {
  330. return .Circle
  331. } else if identifier == KMPDFToolbar_arrow_Identifier {
  332. return .Arrow
  333. } else if identifier == KMPDFToolbar_line_Identifier {
  334. return .Line
  335. } else if identifier == KMPDFToolbar_measure_Identifier {
  336. return .Measure
  337. } else if identifier == KMPDFToolbar_stamp_Identifier {
  338. return .Stamp
  339. } else if identifier == KMPDFToolbar_sign_Identifier {
  340. return .Sign
  341. } else if identifier == KMPDFToolbar_edit_text_Identifier {
  342. return .Edit_text
  343. } else if identifier == KMPDFToolbar_edit_image_Identifier {
  344. return .Edit_Image
  345. } else if identifier == KMPDFToolbar_edit_link_Identifier {
  346. return .Edit_Link
  347. } else if identifier == KMPDFToolbar_edit_crop_Identifier {
  348. return .Edit_Crop
  349. } else if identifier == KMPDFToolbar_fill_tick_Identifier {
  350. return .Fill_tick
  351. } else if identifier == KMPDFToolbar_fill_fork_Identifier {
  352. return .fill_fork
  353. } else if identifier == KMPDFToolbar_fill_rectangle_Identifier {
  354. return .fill_rectangle
  355. } else if identifier == KMPDFToolbar_fill_line_Identifier {
  356. return .fill_line
  357. } else if identifier == KMPDFToolbar_fill_dot_Identifier {
  358. return .fill_dot
  359. } else if identifier == KMPDFToolbar_fill_date_Identifier {
  360. return .fill_date
  361. } else if identifier == KMPDFToolbar_fill_sign_Identifier {
  362. return .fill_sign
  363. } else if identifier == KMPDFToolbar_form_text_Identifier {
  364. return .Form_text
  365. } else if identifier == KMPDFToolbar_form_checkbox_Identifier {
  366. return .Form_checkbox
  367. } else if identifier == KMPDFToolbar_form_radio_Identifier {
  368. return .Form_radio
  369. } else if identifier == KMPDFToolbar_form_list_Identifier {
  370. return .Form_list
  371. } else if identifier == KMPDFToolbar_form_dropdown_Identifier {
  372. return .Form_dropdown
  373. } else if identifier == KMPDFToolbar_form_OK_Identifier {
  374. return .Form_OK
  375. } else if identifier == KMPDFToolbar_form_digitalSign_Identifier {
  376. return .Form_digitalSign
  377. } else if identifier == KMPDFToolbar_protect_redact_Identifier {
  378. return .Redact
  379. } else if identifier == KMPDFToolbar_protect_digitalSign_Identifier {
  380. return .Digital_Sign
  381. } else if identifier == KMPDFToolbar_tools_OCR_Identifier {
  382. return .Tool_OCR
  383. }
  384. return .None
  385. }
  386. //MARK: - reload
  387. public func reloadMainPropertys(_ arr: [NSObject]) {
  388. _propertys.removeAll()
  389. for item in arr {
  390. _propertys.append(item)
  391. }
  392. setupMainView()
  393. }
  394. public func reloadRightPropertys(_ arr: [Any]) {
  395. rightPropertys.removeAll()
  396. for item in arr {
  397. rightPropertys.append(item)
  398. }
  399. setupRightView()
  400. }
  401. func setupMainView() {
  402. guard let _ = infoContendView else {
  403. return
  404. }
  405. let subviews = infoContendView.subviews
  406. for view in subviews {
  407. view.removeFromSuperview()
  408. }
  409. var itemXvalue: CGFloat = 0
  410. for property in propertys {
  411. if property is ComponentButtonProperty {
  412. let buttonProperty = (property as! ComponentButtonProperty)
  413. buttonProperty.buttonText = KMLocalizedString(buttonProperty.englishTitle ?? "")
  414. let button = ComponentButton.init()
  415. button.properties = buttonProperty
  416. if buttonProperty.onlyIcon {
  417. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28)
  418. } else {
  419. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28)
  420. }
  421. button.setTarget(self, action: #selector(buttonClicked(_:)))
  422. if buttonProperty.identifier == KMPDFToolbar_highlight_Identifier {
  423. button.keyEquivalent = "H"
  424. button.keyEquivalentModifierMask = [.control, .command]
  425. } else if buttonProperty.identifier == KMPDFToolbar_underline_Identifier {
  426. button.keyEquivalent = "U"
  427. button.keyEquivalentModifierMask = [.control, .command]
  428. } else if buttonProperty.identifier == KMPDFToolbar_waveline_Identifier {
  429. button.keyEquivalent = "V"
  430. button.keyEquivalentModifierMask = [.control, .command]
  431. } else if buttonProperty.identifier == KMPDFToolbar_strikethrough_Identifier {
  432. button.keyEquivalent = "S"
  433. button.keyEquivalentModifierMask = [.control, .command]
  434. } else if buttonProperty.identifier == KMPDFToolbar_text_Identifier {
  435. button.keyEquivalent = "T"
  436. button.keyEquivalentModifierMask = [.control, .command]
  437. } else if buttonProperty.identifier == KMPDFToolbar_note_Identifier {
  438. button.keyEquivalent = "N"
  439. button.keyEquivalentModifierMask = [.control, .command]
  440. } else if buttonProperty.identifier == KMPDFToolbar_pen_Identifier {
  441. button.keyEquivalent = "P"
  442. button.keyEquivalentModifierMask = [.control, .command]
  443. } else if buttonProperty.identifier == KMPDFToolbar_eraser_Identifier {
  444. button.keyEquivalent = "E"
  445. button.keyEquivalentModifierMask = [.control, .command]
  446. } else if buttonProperty.identifier == KMPDFToolbar_rectangle_Identifier {
  447. button.keyEquivalent = "R"
  448. button.keyEquivalentModifierMask = [.control, .command]
  449. } else if buttonProperty.identifier == KMPDFToolbar_circle_Identifier {
  450. button.keyEquivalent = "O"
  451. button.keyEquivalentModifierMask = [.control, .command]
  452. } else if buttonProperty.identifier == KMPDFToolbar_arrow_Identifier {
  453. button.keyEquivalent = "A"
  454. button.keyEquivalentModifierMask = [.control, .command]
  455. } else if buttonProperty.identifier == KMPDFToolbar_line_Identifier {
  456. button.keyEquivalent = "L"
  457. button.keyEquivalentModifierMask = [.control, .command]
  458. }
  459. else if buttonProperty.identifier == KMPDFToolbar_edit_text_Identifier {
  460. button.keyEquivalent = "T"
  461. button.keyEquivalentModifierMask = [.shift, .command]
  462. } else if buttonProperty.identifier == KMPDFToolbar_edit_image_Identifier {
  463. button.keyEquivalent = "I"
  464. button.keyEquivalentModifierMask = [.shift, .command]
  465. } else if buttonProperty.identifier == KMPDFToolbar_edit_link_Identifier {
  466. button.keyEquivalent = "L"
  467. button.keyEquivalentModifierMask = [.shift, .command]
  468. }
  469. infoContendView.addSubview(button)
  470. itemXvalue += CGRectGetWidth(button.frame)
  471. itemXvalue += 12
  472. lastPropertyWidth = CGRectGetWidth(button.frame)
  473. } else if property is ComponentDividerProperty {
  474. let divider = ComponentDivider.init()
  475. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16)
  476. divider.properties = (property as! ComponentDividerProperty)
  477. infoContendView.addSubview(divider)
  478. itemXvalue += 1
  479. itemXvalue += 12
  480. lastPropertyWidth = CGRectGetWidth(divider.frame)
  481. } else if property is ComponentDropdownToolProperty {
  482. let dropdownTool = ComponentDropdownTool.init()
  483. (property as! ComponentDropdownToolProperty).text = KMLocalizedString((property as! ComponentDropdownToolProperty).englishTitle ?? "")
  484. if let items = (property as! ComponentDropdownToolProperty).menuItemArr {
  485. for menuItem in items {
  486. menuItem.text = KMLocalizedString(menuItem.englishTitle)
  487. }
  488. }
  489. dropdownTool.properties = property as! ComponentDropdownToolProperty
  490. dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28)
  491. dropdownTool.delegate = self
  492. infoContendView.addSubview(dropdownTool)
  493. itemXvalue += CGRectGetWidth(dropdownTool.frame)
  494. itemXvalue += 12
  495. lastPropertyWidth = CGRectGetWidth(dropdownTool.frame)
  496. } else if property is ComponentSelectProperties {
  497. let selectView = ComponentSelect.init()
  498. (property as! ComponentSelectProperties).placeholder = KMLocalizedString((property as! ComponentSelectProperties).englishPlaceholder ?? "")
  499. selectView.properties = property as! ComponentSelectProperties
  500. selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28)
  501. if let items = selectView.properties.menuItemArr {
  502. for menuItem in items {
  503. menuItem.text = KMLocalizedString(menuItem.englishTitle)
  504. }
  505. selectView.updateMenuItemsArr(items)
  506. }
  507. selectView.delegate = self
  508. infoContendView.addSubview(selectView)
  509. itemXvalue += CGRectGetWidth(selectView.frame)
  510. itemXvalue += 12
  511. lastPropertyWidth = CGRectGetWidth(selectView.frame)
  512. }
  513. }
  514. itemXvalue -= 12
  515. propertysWidthValue = itemXvalue
  516. contendViewWidthConst.constant = propertysWidthValue
  517. contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2
  518. updateUILanguage()
  519. }
  520. func setupRightView() {
  521. let subviews = rightContendView.subviews
  522. for view in subviews {
  523. view.removeFromSuperview()
  524. }
  525. var itemXvalue: CGFloat = 0
  526. for property in rightPropertys {
  527. if property is ComponentButtonProperty {
  528. let buttonProperty = (property as! ComponentButtonProperty)
  529. let button = ComponentButton.init()
  530. button.properties = buttonProperty
  531. if buttonProperty.onlyIcon {
  532. button.frame = CGRectMake(itemXvalue, 0, 28, 28)
  533. } else {
  534. button.frame = CGRectMake(itemXvalue, 0, button.properties.propertyInfo.viewWidth, 28)
  535. }
  536. button.setTarget(self, action: #selector(buttonClicked(_:)))
  537. rightContendView.addSubview(button)
  538. itemXvalue += CGRectGetWidth(button.frame)
  539. itemXvalue += 12
  540. } else if property is ComponentDividerProperty {
  541. let divider = ComponentDivider.init()
  542. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16)
  543. divider.properties = (property as! ComponentDividerProperty)
  544. rightContendView.addSubview(divider)
  545. itemXvalue += 1
  546. itemXvalue += 12
  547. }
  548. }
  549. itemXvalue -= 12
  550. rightContendViewWidthConst.constant = itemXvalue
  551. }
  552. func reloadMainview() {
  553. guard let _ = infoContendView else {
  554. return
  555. }
  556. var itemXvalue: CGFloat = 0
  557. let subviews = infoContendView.subviews
  558. for view in subviews {
  559. if let button = view as? ComponentButton {
  560. if button.properties.onlyIcon {
  561. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28)
  562. } else {
  563. button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28)
  564. }
  565. button.reloadData()
  566. itemXvalue += CGRectGetWidth(button.frame)
  567. itemXvalue += 12
  568. } else if let dropdownTool = view as? ComponentDropdownTool {
  569. dropdownTool.properties = dropdownTool.properties
  570. dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28)
  571. itemXvalue += CGRectGetWidth(dropdownTool.frame)
  572. itemXvalue += 12
  573. } else if let selectView = view as? ComponentSelect {
  574. selectView.reloadData()
  575. selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28)
  576. itemXvalue += CGRectGetWidth(selectView.frame)
  577. itemXvalue += 12
  578. } else if let divider = view as? ComponentDivider {
  579. divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16)
  580. itemXvalue += 1
  581. itemXvalue += 12
  582. }
  583. }
  584. itemXvalue -= 12
  585. propertysWidthValue = itemXvalue
  586. contendViewWidthConst.constant = propertysWidthValue
  587. contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2
  588. }
  589. func reloadRightview() {
  590. guard let _ = infoContendView else {
  591. return
  592. }
  593. let subviews = rightContendView.subviews
  594. for view in subviews {
  595. if view is ComponentButton {
  596. (view as! ComponentButton).reloadData()
  597. }
  598. }
  599. }
  600. func refreshToolbarModeInfo() {
  601. guard let viewManager = self.viewManager else { return }
  602. let subviews = infoContendView.subviews
  603. for view in subviews {
  604. if view is ComponentButton {
  605. let item = (view as! ComponentButton)
  606. let resultID = self.returnIDWithSubToolMode(viewManager.subToolMode)
  607. if item.properties.identifier != resultID {
  608. if item.properties.state == .pressed {
  609. item.properties.state = .normal
  610. item.reloadData()
  611. }
  612. } else {
  613. if item.properties.state != .pressed {
  614. item.properties.state = .pressed
  615. item.reloadData()
  616. }
  617. }
  618. }
  619. }
  620. }
  621. //MARK: -
  622. @objc func buttonClicked(_ sender: ComponentButton) {
  623. self.buttonClickedWithProperty(sender.properties)
  624. }
  625. func buttonClickedWithProperty(_ property: ComponentButtonProperty) {
  626. if delegate?.kmPDFSecToolbarControllerDidItemClickedEnable?(self, property) == false {
  627. refreshToolbarModeInfo()
  628. return
  629. }
  630. let subToolMode = returnSubToolModeWithID(property.identifier)
  631. if subToolMode != .None {
  632. if viewManager?.subToolMode == subToolMode {
  633. viewManager?.subToolMode = .None
  634. } else {
  635. viewManager?.subToolMode = subToolMode
  636. }
  637. } else {
  638. viewManager?.subToolMode = .None
  639. }
  640. if viewManager?.subToolMode == .Highlight ||
  641. viewManager?.subToolMode == .Underline ||
  642. viewManager?.subToolMode == .Waveline ||
  643. viewManager?.subToolMode == .Strikethrough ||
  644. viewManager?.subToolMode == .Text ||
  645. viewManager?.subToolMode == .Note ||
  646. viewManager?.subToolMode == .Pen ||
  647. viewManager?.subToolMode == .Eraser ||
  648. viewManager?.subToolMode == .Rectangle ||
  649. viewManager?.subToolMode == .Circle ||
  650. viewManager?.subToolMode == .Arrow ||
  651. viewManager?.subToolMode == .Line ||
  652. viewManager?.subToolMode == .Measure ||
  653. viewManager?.subToolMode == .Stamp ||
  654. viewManager?.subToolMode == .Sign {
  655. if viewManager?.toolMode != .Markup {
  656. viewManager?.toolMode = .Markup
  657. }
  658. }
  659. refreshToolbarModeInfo()
  660. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property)
  661. }
  662. //MARK: - Mouse
  663. override func mouseDown(with event: NSEvent) {
  664. super.mouseDown(with: event)
  665. view.window?.makeFirstResponder(self)
  666. }
  667. }
  668. //MARK: - ComponentDropdownToolDelegate
  669. extension KMPDFSecToolbarController: ComponentDropdownToolDelegate {
  670. func componentDropdownToolDidClickedSelf(_ view: ComponentDropdownTool) {
  671. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, view.properties)
  672. }
  673. func componentDropdownToolDidShowPopupView(_ view: ComponentDropdownTool) {
  674. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, view.properties)
  675. }
  676. func componentDropdownToolDidClicked(_ view: ComponentDropdownTool, menuItem: ComponentMenuitemProperty?) {
  677. if let property = menuItem {
  678. property.itemSelected = false
  679. property.state = .normal
  680. if delegate?.kmPDFSecToolbarControllerDidItemClickedEnable?(self, property) == false {
  681. return
  682. }
  683. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property)
  684. }
  685. }
  686. }
  687. //MARK: - ComponentSelectDelegate
  688. extension KMPDFSecToolbarController: ComponentSelectDelegate {
  689. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  690. if let property = menuItemProperty {
  691. property.itemSelected = false
  692. property.state = .normal
  693. delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property)
  694. }
  695. }
  696. func componentSelectTextDidBeginEditing(_ view: ComponentSelect) {
  697. delegate?.kmPDFSecToolbarControllerDidSelectTextDidBeginEditing?(self, view)
  698. }
  699. func componentSelectTextDidChange(_ view: ComponentSelect) {
  700. delegate?.kmPDFSecToolbarControllerDidSelectTextDidChange?(self, view)
  701. }
  702. func componentSelectTextDidEndEditing(_ view: ComponentSelect) {
  703. delegate?.kmPDFSecToolbarControllerDidSelectTextDidEndEditing?(self, view)
  704. }
  705. }