KMMeasureController.swift 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. //
  2. // KMMeasureController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/12/7.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. class KMMeasureController: NSViewController {
  10. @IBOutlet var typeSegmented: ComponentSegmented!
  11. //Color
  12. @IBOutlet var colorBGView: NSView!
  13. @IBOutlet var colorLabel: NSTextField!
  14. @IBOutlet var fontColorGroup: ComponentCColorGroup!
  15. @IBOutlet var borderColorGroup: ComponentCColorGroup!
  16. @IBOutlet var fillColorGroup: ComponentCColorGroup!
  17. @IBOutlet var fillColorImage: NSImageView!
  18. @IBOutlet var opacitySlider: ComponentSlider!
  19. @IBOutlet var opacitySelect: ComponentSelect!
  20. @IBOutlet var colorBGViewHeightConst: NSLayoutConstraint!
  21. @IBOutlet var opacityViewTopConst: NSLayoutConstraint!
  22. //Line
  23. @IBOutlet var lineBGView: NSView!
  24. @IBOutlet var lineLabel: NSTextField!
  25. @IBOutlet var lineTypeSelector: ComponentCSelectorGroup!
  26. @IBOutlet var lineWidthSlider: ComponentSlider!
  27. @IBOutlet var lineWidthSelect: ComponentSelect!
  28. @IBOutlet var linedashInfoView: NSView!
  29. @IBOutlet var lineDashSlider: ComponentSlider!
  30. @IBOutlet var lineDashSelect: ComponentSelect!
  31. @IBOutlet var lineBGViewHeightConst: NSLayoutConstraint!
  32. @IBOutlet var arrowTypeView: NSView!
  33. @IBOutlet var arrowTypeTopConst: NSLayoutConstraint!
  34. @IBOutlet var arrow_leftTypeSelect: ComponentSelect!
  35. @IBOutlet var arrow_RightTypeSelect: ComponentSelect!
  36. //Font
  37. @IBOutlet var fontBGView: NSView!
  38. @IBOutlet var fontLabel: NSTextField!
  39. @IBOutlet var fontNameSelect: ComponentSelect!
  40. @IBOutlet var fontStyleSelect: ComponentSelect!
  41. @IBOutlet var fontSizeSelect: ComponentSelect!
  42. //Display Label
  43. @IBOutlet var displayBGView: NSView!
  44. @IBOutlet var displayLabel: NSTextField!
  45. @IBOutlet var displayLengthCheckBox: ComponentCheckBox!
  46. @IBOutlet var displayArea_CheckBox: ComponentCheckBox!
  47. private let line_Property = ComponentSegmentedProperty(size: .s, active: false, iconImage: NSImage(named: "measure_line_gray"), iconImage_active: NSImage(named: "measure_line"))
  48. private let multiLine_Property = ComponentSegmentedProperty(size: .s, active: false, iconImage: NSImage(named: "measure_multiLine_gray"), iconImage_active: NSImage(named: "measure_multiLine"))
  49. private let polygon_Property = ComponentSegmentedProperty(size: .s, active: false, iconImage: NSImage(named: "measure_polygon_gray"), iconImage_active: NSImage(named: "measure_polygon"))
  50. private let rectangle_Property = ComponentSegmentedProperty(size: .s, active: false, iconImage: NSImage(named: "measure_rectangle_gray"), iconImage_active: NSImage(named: "measure_rectangle"))
  51. private var familyNames = CPDFFont.familyNames
  52. private let solidProperty = ComponentCSelectorProperty.init(size: .s, state: .normal, text: "", iconImage: NSImage(named: "lineStyle_solid"))
  53. private let dashProperty = ComponentCSelectorProperty.init(size: .s, state: .normal, text: "", iconImage: NSImage(named: "lineStyle_dash"))
  54. private var annotations: [CPDFFreeTextAnnotation] = []
  55. var annotationType: CAnnotationType = .measureLine
  56. var pdfView: CPDFListView?
  57. //MARK: - func
  58. override func viewDidAppear() {
  59. super.viewDidAppear()
  60. opacitySlider.reloadData()
  61. lineWidthSlider.reloadData()
  62. lineDashSlider.reloadData()
  63. }
  64. override func viewDidLoad() {
  65. super.viewDidLoad()
  66. // Do view setup here.
  67. annotationType = CPDFPolylineAnnotation.default_measureType()
  68. setupProperty()
  69. reloadData()
  70. }
  71. func setupProperty() {
  72. if true {
  73. var itemArr: [ComponentSegmentedProperty] = []
  74. itemArr.append(line_Property)
  75. itemArr.append(multiLine_Property)
  76. itemArr.append(polygon_Property)
  77. itemArr.append(rectangle_Property)
  78. typeSegmented.updateItemProperty(itemArr)
  79. }
  80. typeSegmented.delegate = self
  81. //Color
  82. colorLabel.stringValue = KMLocalizedString("Color")
  83. colorLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  84. colorLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  85. fontColorGroup.delegate = self
  86. borderColorGroup.delegate = self
  87. fillColorGroup.delegate = self
  88. opacitySlider.properties = ComponentSliderProperty(size: .m, percent: 1)
  89. opacitySlider.delegate = self
  90. opacitySelect.properties = ComponentSelectProperties(size: .s,
  91. state: .normal,
  92. creatable: true,
  93. text: "100%",
  94. textUnit: "%",
  95. regexString: "0123456789%")
  96. if true {
  97. var opacityItems: [ComponentMenuitemProperty] = []
  98. for string in ["25%", "50%", "75%", "100%"] {
  99. let item = ComponentMenuitemProperty(type: .normal, text: string)
  100. opacityItems.append(item)
  101. }
  102. opacitySelect.updateMenuItemsArr(opacityItems)
  103. }
  104. opacitySelect.delegate = self
  105. //Line
  106. lineLabel.stringValue = KMLocalizedString("Line")
  107. lineLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  108. lineLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  109. lineTypeSelector.updateItemProperty([solidProperty, dashProperty])
  110. lineTypeSelector.delegate = self
  111. lineWidthSlider.properties = ComponentSliderProperty(size: .m, percent: 1)
  112. lineWidthSlider.delegate = self
  113. lineWidthSelect.properties = ComponentSelectProperties(size: .s,
  114. state: .normal,
  115. creatable: true,
  116. text: "2",
  117. textUnit: " pt",
  118. regexString: "0123456789 pt")
  119. if true {
  120. var opacityItems: [ComponentMenuitemProperty] = []
  121. for string in ["1 pt", "3 pt", "6 pt", "9 pt", "12 pt", "15 pt", "18 pt"] {
  122. let item = ComponentMenuitemProperty(type: .normal, text: string)
  123. opacityItems.append(item)
  124. }
  125. lineWidthSelect.updateMenuItemsArr(opacityItems)
  126. }
  127. lineWidthSelect.delegate = self
  128. lineDashSlider.properties = ComponentSliderProperty(size: .m, percent: 1)
  129. lineDashSlider.delegate = self
  130. lineDashSelect.properties = ComponentSelectProperties(size: .s,
  131. state: .normal,
  132. creatable: true,
  133. text: "2",
  134. textUnit: " pt",
  135. regexString: "0123456789 pt")
  136. if true {
  137. var opacityItems: [ComponentMenuitemProperty] = []
  138. for string in ["1 pt", "3 pt", "6 pt", "9 pt", "12 pt", "15 pt", "18 pt"] {
  139. let item = ComponentMenuitemProperty(type: .normal, text: string)
  140. opacityItems.append(item)
  141. }
  142. lineDashSelect.updateMenuItemsArr(opacityItems)
  143. }
  144. lineDashSelect.delegate = self
  145. //ArrowType
  146. arrow_leftTypeSelect.properties = ComponentSelectProperties(size: .s,
  147. state: .normal,
  148. creatable: false)
  149. if true {
  150. let stringItems = ["None", "Arrow Open", "Arrow Close", "Square", "Oval", "Diamond", "Butt", "Slash", "R Open Arrow", "R Close Arrow"]
  151. let imageNames = ["arrowType_line", "arrowType_left_Arrow_open", "arrowType_left_Arrow_close",
  152. "arrowType_left_Square", "arrowType_left_Oval", "arrowType_left_Diamond",
  153. "arrowType_left_Butt", "arrowType_left_Slash", "arrowType_left_Open_arrow",
  154. "arrowType_left_Close_arrow"]
  155. var opacityItems: [ComponentMenuitemProperty] = []
  156. for i in 0...stringItems.count-1 {
  157. let string = stringItems[i]
  158. let imageName = imageNames[i]
  159. let item = ComponentMenuitemProperty(type: .normal, lefticon: NSImage(named: imageName), text: string, identifier: string)
  160. opacityItems.append(item)
  161. }
  162. arrow_leftTypeSelect.updateMenuItemsArr(opacityItems)
  163. }
  164. arrow_leftTypeSelect.delegate = self
  165. arrow_RightTypeSelect.properties = ComponentSelectProperties(size: .s,
  166. state: .normal,
  167. creatable: false)
  168. if true {
  169. let stringItems = ["None", "Arrow Open", "Arrow Close", "Square", "Oval", "Diamond", "Butt", "Slash", "R Open Arrow", "R Close Arrow"]
  170. let imageNames = ["arrowType_line", "arrowType_right_Arrow_open", "arrowType_right_Arrow_close",
  171. "arrowType_right_Square", "arrowType_right_Oval", "arrowType_right_Diamond",
  172. "arrowType_right_Butt", "arrowType_right_Slash", "arrowType_right_Open_arrow",
  173. "arrowType_right_Close_arrow"]
  174. var opacityItems: [ComponentMenuitemProperty] = []
  175. for i in 0...stringItems.count-1 {
  176. let string = stringItems[i]
  177. let imageName = imageNames[i]
  178. let item = ComponentMenuitemProperty(type: .normal, lefticon: NSImage(named: imageName), text: string, identifier: string)
  179. opacityItems.append(item)
  180. }
  181. arrow_RightTypeSelect.updateMenuItemsArr(opacityItems)
  182. }
  183. arrow_RightTypeSelect.delegate = self
  184. //Font
  185. fontNameSelect.properties = ComponentSelectProperties(size: .s,
  186. state: .normal,
  187. text: "")
  188. if true {
  189. var menuItemArr: [ComponentMenuitemProperty] = []
  190. for string in familyNames {
  191. let item = ComponentMenuitemProperty(type: .normal, text: string, identifier: string)
  192. menuItemArr.append(item)
  193. }
  194. fontNameSelect.updateMenuItemsArr(menuItemArr)
  195. }
  196. fontNameSelect.delegate = self
  197. fontStyleSelect.properties = ComponentSelectProperties(size: .s,
  198. state: .normal,
  199. text: "")
  200. fontStyleSelect.delegate = self
  201. fontSizeSelect.properties = ComponentSelectProperties(size: .s,
  202. state: .normal,
  203. creatable: true,
  204. text: "12 pt",
  205. textUnit: " pt",
  206. regexString: "0123456789")
  207. if true {
  208. var sizeItemArr: [ComponentMenuitemProperty] = []
  209. for string in KMHeaderFooterManager.getFontSize() {
  210. let item = ComponentMenuitemProperty(type: .normal, text: string + " pt", identifier: string)
  211. sizeItemArr.append(item)
  212. }
  213. fontSizeSelect.updateMenuItemsArr(sizeItemArr)
  214. }
  215. fontSizeSelect.delegate = self
  216. //Display Label
  217. displayLabel.stringValue = KMLocalizedString("Display Label")
  218. displayLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
  219. displayLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  220. displayLengthCheckBox.properties = ComponentCheckBoxProperty(size: .m, text: KMLocalizedString("Length"))
  221. displayLengthCheckBox.setTarget(self, action: #selector(checkBoxClicked(_:)))
  222. displayArea_CheckBox.properties = ComponentCheckBoxProperty(size: .m, text: KMLocalizedString("Area"))
  223. displayArea_CheckBox.setTarget(self, action: #selector(checkBoxClicked(_:)))
  224. }
  225. func reloadData() {
  226. guard let pdfView = self.pdfView else {
  227. return
  228. }
  229. line_Property.active = false
  230. multiLine_Property.active = false
  231. polygon_Property.active = false
  232. rectangle_Property.active = false
  233. if annotationType == .measureLine {
  234. line_Property.active = true
  235. } else if annotationType == .measurePolyLine {
  236. multiLine_Property.active = true
  237. } else if annotationType == .measurePolyGon {
  238. polygon_Property.active = true
  239. } else if annotationType == .measureSquare {
  240. rectangle_Property.active = true
  241. }
  242. typeSegmented.reloadData()
  243. colorBGViewHeightConst.constant = 192
  244. fillColorGroup.isHidden = false
  245. fillColorImage.isHidden = false
  246. opacityViewTopConst.constant = 48
  247. displayBGView.isHidden = false
  248. arrowTypeView.isHidden = false
  249. if annotationType == .measureLine ||
  250. annotationType == .measurePolyLine {
  251. colorBGViewHeightConst.constant = 152
  252. fillColorGroup.isHidden = true
  253. fillColorImage.isHidden = true
  254. opacityViewTopConst.constant = 8
  255. displayBGView.isHidden = true
  256. } else if annotationType == .measurePolyGon ||
  257. annotationType == .measureSquare {
  258. arrowTypeView.isHidden = true
  259. }
  260. if true {
  261. let colors: [NSColor] = KMAnnotationPropertiesColorManager.manager.measureColors
  262. if colors.count > 4 {
  263. let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[0])
  264. let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[1])
  265. let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[2])
  266. let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[3])
  267. let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: colors[4])
  268. fontColorGroup.setUpWithColorPropertys([colorAProperty, colorBProperty, colorCProperty, colorDProperty], customItemProperty: colorEProperty)
  269. }
  270. }
  271. if true {
  272. let colors: [NSColor] = KMAnnotationPropertiesColorManager.manager.measure_Border_Colors
  273. if colors.count > 4 {
  274. let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[0])
  275. let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[1])
  276. let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[2])
  277. let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[3])
  278. let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: colors[4])
  279. borderColorGroup.setUpWithColorPropertys([colorAProperty, colorBProperty, colorCProperty, colorDProperty], customItemProperty: colorEProperty)
  280. }
  281. }
  282. if true {
  283. let colors: [NSColor] = KMAnnotationPropertiesColorManager.manager.measure_Fill_Colors
  284. if colors.count > 4 {
  285. let colorAProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[0])
  286. let colorBProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[1])
  287. let colorCProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[2])
  288. let colorDProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: false, color: colors[3])
  289. let colorEProperty = ComponentCColorProperty(colorType: .color, state: .normal, isCustom: true, color: colors[4])
  290. fillColorGroup.setUpWithColorPropertys([colorAProperty, colorBProperty, colorCProperty, colorDProperty], customItemProperty: colorEProperty)
  291. }
  292. }
  293. self.annotations.removeAll()
  294. let allAnnotations: [CPDFAnnotation] = pdfView.activeAnnotations as? [CPDFAnnotation] ?? []
  295. for annotation in allAnnotations {
  296. if annotation is CPDFFreeTextAnnotation {
  297. annotations.append((annotation as! CPDFFreeTextAnnotation))
  298. }
  299. }
  300. var firstAnnotation: CPDFFreeTextAnnotation?
  301. if annotations.count > 0 {
  302. firstAnnotation = annotations.first
  303. }
  304. //Color
  305. var fontColor: NSColor?
  306. var borderColor: NSColor?
  307. var fillColor: NSColor?
  308. var opacity: CGFloat = 0
  309. //Line
  310. var lineBorderStyle: CPDFBorderStyle?
  311. var lineBorderWidth: CGFloat?
  312. var dashPattern: CGFloat?
  313. var startLineStyle: CPDFLineStyle = .none
  314. var endLineStyle: CPDFLineStyle = .none
  315. //Font
  316. var fontNameString: String?
  317. var fontStyleString: String?
  318. var fontSize: CGFloat?
  319. //Display Label
  320. var displayLength: Bool = false
  321. var displayArea: Bool = false
  322. if annotations.count == 0 {
  323. //Color
  324. fontColor = CPDFPolylineAnnotation.default_measure_Color(annotationType: self.annotationType)
  325. borderColor = CPDFPolylineAnnotation.default_measure_BorderColor(annotationType: self.annotationType)
  326. fillColor = CPDFPolylineAnnotation.default_measure_FillColor(annotationType: self.annotationType)
  327. opacity = CPDFPolylineAnnotation.default_measure_Opacity(annotationType: self.annotationType)
  328. //Line
  329. lineBorderStyle = CPDFPolylineAnnotation.default_measure_LineStyle(annotationType: self.annotationType)
  330. lineBorderWidth = CPDFPolylineAnnotation.default_measure_LineWidth(annotationType: self.annotationType)
  331. var dash = 1.0
  332. for dashPattern in CPDFPolylineAnnotation.default_measure_DashPattern(annotationType: self.annotationType) {
  333. if let value = dashPattern as? CGFloat {
  334. dash = value
  335. break
  336. }
  337. }
  338. dashPattern = dash
  339. startLineStyle = CPDFPolylineAnnotation.default_measure_Arrow_StartLineStyle(annotationType: self.annotationType)
  340. endLineStyle = CPDFPolylineAnnotation.default_measure_Arrow_EndLineStyle(annotationType: self.annotationType)
  341. //Font
  342. fontNameString = CPDFPolylineAnnotation.default_measure_FontName(annotationType: self.annotationType)
  343. fontStyleString = CPDFPolylineAnnotation.default_measure_FontStyle(annotationType: self.annotationType)
  344. fontSize = CPDFPolylineAnnotation.default_measure_FontSize(annotationType: self.annotationType)
  345. } else if let annotation = firstAnnotation {
  346. }
  347. //Color
  348. fontColorGroup.currentColor = fontColor
  349. borderColorGroup.currentColor = borderColor
  350. fillColorGroup.currentColor = fillColor
  351. opacitySlider.properties.percent = opacity
  352. opacitySelect.properties.text = String(format: "%.0f%@", opacity*100, "%")
  353. fontColorGroup.refreshUI()
  354. borderColorGroup.refreshUI()
  355. fillColorGroup.refreshUI()
  356. opacitySlider.reloadData()
  357. opacitySelect.reloadData()
  358. //Line
  359. dashProperty.state = .normal
  360. solidProperty.state = .normal
  361. if lineBorderStyle == .dashed {
  362. dashProperty.state = .pressed
  363. } else if lineBorderStyle == .solid {
  364. solidProperty.state = .pressed
  365. }
  366. lineTypeSelector.reloadData()
  367. var percent: CGFloat = 0
  368. if let value = lineBorderWidth, value > 0 {
  369. percent = (value - 1)/17
  370. lineWidthSlider.properties.percent = percent
  371. lineWidthSelect.properties.text = String(format: "%.0f%@", value, " pt")
  372. } else {
  373. lineWidthSlider.properties.percent = 0
  374. lineWidthSelect.properties.text = "0 pt"
  375. }
  376. lineWidthSlider.reloadData()
  377. lineWidthSelect.reloadData()
  378. linedashInfoView.isHidden = true
  379. arrowTypeTopConst.constant = 8
  380. lineBGViewHeightConst.constant = 112
  381. if arrowTypeView.isHidden {
  382. lineBGViewHeightConst.constant = 72
  383. }
  384. if lineBorderStyle == .dashed {
  385. linedashInfoView.isHidden = false
  386. arrowTypeTopConst.constant = 48
  387. lineBGViewHeightConst.constant = 152
  388. if arrowTypeView.isHidden {
  389. lineBGViewHeightConst.constant = 112
  390. }
  391. var dash = 1.0
  392. if let value = dashPattern {
  393. dash = value
  394. }
  395. let percent: CGFloat = (CGFloat(dash) - 1)/17
  396. lineDashSlider.properties.percent = percent
  397. lineDashSlider.reloadData()
  398. lineDashSelect.properties.text = String(format: "%.0f%@", CGFloat(dash), " pt")
  399. lineDashSelect.reloadData()
  400. }
  401. arrow_leftTypeSelect.selectItemAtIndex(startLineStyle.rawValue)
  402. arrow_RightTypeSelect.selectItemAtIndex(endLineStyle.rawValue)
  403. //Font
  404. if let familyName = fontNameString {
  405. var styleNames = CPDFFont.fontNames(forFamilyName: familyName)
  406. var menuItemArr: [ComponentMenuitemProperty] = []
  407. if styleNames.count == 0 {
  408. styleNames.append("Regular")
  409. }
  410. for string in styleNames {
  411. let item = ComponentMenuitemProperty(type: .normal, text: string, identifier: string)
  412. menuItemArr.append(item)
  413. }
  414. fontStyleSelect.updateMenuItemsArr(menuItemArr)
  415. }
  416. if let value = fontNameString {
  417. fontNameSelect.properties.text = value
  418. } else {
  419. fontNameSelect.properties.text = "-"
  420. }
  421. if let value = fontStyleString {
  422. fontStyleSelect.properties.text = value
  423. } else {
  424. fontStyleSelect.properties.text = "-"
  425. }
  426. if let value = fontSize {
  427. fontSizeSelect.properties.text = String(format: "%.0f", value)
  428. } else {
  429. fontSizeSelect.properties.text = "-"
  430. }
  431. fontNameSelect.reloadData()
  432. fontStyleSelect.reloadData()
  433. fontSizeSelect.reloadData()
  434. }
  435. //MARK: - Action
  436. @objc func checkBoxClicked(_ sender: ComponentCheckBox) {
  437. if sender == displayLengthCheckBox {
  438. } else if sender == displayArea_CheckBox {
  439. }
  440. }
  441. //MARK: - Mouse
  442. override func mouseDown(with event: NSEvent) {
  443. super.mouseDown(with: event)
  444. view.window?.makeFirstResponder(nil)
  445. }
  446. }
  447. //MARK: - ComponentCColorDelegate
  448. extension KMMeasureController: ComponentCColorDelegate {
  449. func componentCColorDidChooseColor(_ view: NSView, _ color: NSColor?) {
  450. if view == fontColorGroup {
  451. CPDFPolylineAnnotation.update_default_measure_Color(annotationType: self.annotationType, color)
  452. } else if view == borderColorGroup {
  453. CPDFPolylineAnnotation.update_default_measure_BorderColor(annotationType: self.annotationType, color)
  454. } else if view == fillColorGroup {
  455. CPDFPolylineAnnotation.update_default_measure_FillColor(annotationType: self.annotationType, color)
  456. }
  457. reloadData()
  458. }
  459. }
  460. //MARK: - ComponentSliderDelegate
  461. extension KMMeasureController: ComponentSliderDelegate {
  462. func componentSliderDidUpdate(_ view: ComponentSlider) {
  463. if view == opacitySlider {
  464. let percent = view.properties.percent
  465. CPDFPolylineAnnotation.update_default_measure_Opacity(annotationType: self.annotationType, percent)
  466. } else if view == lineWidthSlider {
  467. let percent = view.properties.percent * 17 + 1
  468. CPDFPolylineAnnotation.update_default_measure_LineWidth(annotationType: self.annotationType, percent)
  469. } else if view == lineDashSlider {
  470. let percent = view.properties.percent * 17 + 1
  471. CPDFPolylineAnnotation.update_default_measure_DashPattern(annotationType: self.annotationType, percent)
  472. }
  473. reloadData()
  474. }
  475. }
  476. //MARK: - ComponentSelectDelegate
  477. extension KMMeasureController: ComponentSelectDelegate {
  478. func componentSelectTextDidEndEditing(_ view: ComponentSelect, removeUnit text: String?) {
  479. if let result = text {
  480. if view == opacitySelect {
  481. let opacity = max(0, min(1, result.stringToCGFloat()/100))
  482. CPDFPolylineAnnotation.update_default_measure_Opacity(annotationType: self.annotationType, opacity)
  483. } else if view == lineWidthSelect {
  484. var value = result.stringToCGFloat()
  485. if value > 18 {
  486. value = 18
  487. } else if value < 1 {
  488. value = 1
  489. }
  490. CPDFPolylineAnnotation.update_default_measure_LineWidth(annotationType: self.annotationType, value)
  491. } else if view == lineDashSelect {
  492. var value = result.stringToCGFloat()
  493. if value > 18 {
  494. value = 18
  495. } else if value < 1 {
  496. value = 1
  497. }
  498. CPDFPolylineAnnotation.update_default_measure_DashPattern(annotationType: self.annotationType, value)
  499. }
  500. reloadData()
  501. }
  502. }
  503. func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) {
  504. if var result = menuItemProperty?.text {
  505. if let textUnit = view?.properties.textUnit {
  506. result = result.stringByDeleteCharString(textUnit)
  507. }
  508. if view == opacitySelect {
  509. let opacity = max(0, min(1, result.stringToCGFloat()/100))
  510. CPDFPolylineAnnotation.update_default_measure_Opacity(annotationType: self.annotationType, opacity)
  511. } else if view == lineWidthSelect {
  512. var value = result.stringToCGFloat()
  513. if value > 18 {
  514. value = 18
  515. } else if value < 1 {
  516. value = 1
  517. }
  518. CPDFPolylineAnnotation.update_default_measure_LineWidth(annotationType: self.annotationType, value)
  519. } else if view == lineDashSelect {
  520. var value = result.stringToCGFloat()
  521. if value > 18 {
  522. value = 18
  523. } else if value < 1 {
  524. value = 1
  525. }
  526. CPDFPolylineAnnotation.update_default_measure_DashPattern(annotationType: self.annotationType, value)
  527. } else if view == fontNameSelect {
  528. var styleName = "Regular"
  529. let styleNames = CPDFFont.fontNames(forFamilyName: result)
  530. if let first = styleNames.first {
  531. styleName = first
  532. }
  533. CPDFPolylineAnnotation.update_default_measure_Font(self.annotationType, CPDFFont(familyName: result, fontStyle: styleName))
  534. } else if view == fontStyleSelect {
  535. let styleName = fontNameSelect.properties.text ?? "Helvetica"
  536. CPDFPolylineAnnotation.update_default_measure_Font(self.annotationType, CPDFFont(familyName: result, fontStyle: styleName))
  537. } else if view == fontSizeSelect {
  538. let size = result.stringToCGFloat()
  539. CPDFPolylineAnnotation.update_default_measure_FontSize(self.annotationType, size)
  540. }
  541. reloadData()
  542. }
  543. }
  544. }
  545. //MARK: - ComponentCSelectorGroupDelegate
  546. extension KMMeasureController: ComponentCSelectorGroupDelegate {
  547. func componentCSelectorGroupDidChoose(_ view: ComponentCSelectorGroup, _ item: ComponentCSelectorItem) {
  548. if view == lineTypeSelector {
  549. if item.properties == solidProperty {
  550. CPDFPolylineAnnotation.update_default_measure_Style(annotationType: self.annotationType, .solid)
  551. } else if item.properties == dashProperty {
  552. CPDFPolylineAnnotation.update_default_measure_Style(annotationType: self.annotationType, .dashed)
  553. }
  554. }
  555. reloadData()
  556. }
  557. }
  558. //MARK: - ComponentSegmentedDelegate
  559. extension KMMeasureController: ComponentSegmentedDelegate {
  560. func componentSegmentedDidSelected(_ view: ComponentSegmented, item: ComponentSegmentedItem) {
  561. if item.properties == line_Property {
  562. annotationType = .measureLine
  563. } else if item.properties == multiLine_Property {
  564. annotationType = .measurePolyLine
  565. } else if item.properties == polygon_Property {
  566. annotationType = .measurePolyGon
  567. } else if item.properties == rectangle_Property {
  568. annotationType = .measureSquare
  569. }
  570. CPDFPolylineAnnotation.update_default_measureType(annotationType: annotationType)
  571. self.pdfView?.annotationType = annotationType
  572. reloadData()
  573. }
  574. }