KMEditPDFTextPropertyViewController.swift 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487
  1. //
  2. // KMEditPDFTextPropertyViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lxy on 2022/12/27.
  6. //
  7. import Cocoa
  8. class KMSliderItemView: NSView {
  9. var titleLabel: NSTextField {
  10. get {
  11. return self.titleLabel_
  12. }
  13. }
  14. private lazy var titleLabel_: NSTextField = {
  15. let view = NSTextField(labelWithString: "")
  16. return view
  17. }()
  18. var slider: NSSlider {
  19. get {
  20. return self.slider_
  21. }
  22. }
  23. private lazy var slider_: NSSlider = {
  24. let view = NSSlider()
  25. view.minValue = 0
  26. view.maxValue = 1
  27. view.target = self
  28. view.action = #selector(sliderValueDidChange)
  29. return view
  30. }()
  31. var box: NSBox {
  32. get {
  33. return self.box_
  34. }
  35. }
  36. private lazy var box_: NSBox = {
  37. let view = NSBox()
  38. view.boxType = .custom
  39. view.titlePosition = .noTitle
  40. view.contentViewMargins = .zero
  41. view.borderWidth = 0
  42. return view
  43. }()
  44. var minValue: Double = 0 {
  45. didSet {
  46. self.slider.minValue = self.minValue
  47. }
  48. }
  49. var maxValue: Double = 1 {
  50. didSet {
  51. self.slider.maxValue = self.maxValue
  52. }
  53. }
  54. var doubleValue: Double = 1 {
  55. didSet {
  56. self.slider.doubleValue = self.doubleValue
  57. }
  58. }
  59. var valueChange: ((Double)->Void)?
  60. convenience init() {
  61. self.init(frame: .zero)
  62. self.initSubViews()
  63. }
  64. func initSubViews() {
  65. self.addSubview(self.titleLabel_)
  66. self.addSubview(self.slider_)
  67. self.addSubview(self.box_)
  68. self.titleLabel_.km_add_top_constraint(constant: 0)
  69. self.titleLabel_.km_add_left_constraint(constant: 4)
  70. self.slider_.km_add_left_constraint(constant: 4)
  71. self.slider_.km_add_top_constraint(equalTo: self.titleLabel_, attribute: .bottom, constant: 4)
  72. self.slider_.km_add_height_constraint(constant: 26)
  73. self.slider_.km_add_right_constraint(equalTo: self.box_, attribute: .left, constant: -8)
  74. self.box_.km_add_right_constraint(constant: 0)
  75. self.box_.km_add_bottom_constraint(constant: -4)
  76. }
  77. @objc func sliderValueDidChange(_ sender: NSSlider) {
  78. self.valueChange?(sender.doubleValue)
  79. }
  80. }
  81. enum CPDFActiveAreasAlignType : Int {
  82. case Left
  83. case Vertical
  84. case Right
  85. case Top
  86. case Horizontally
  87. case Bottom
  88. case DisHorizontally
  89. case DisVertical
  90. }
  91. class KMEditPDFTextPropertyViewController: NSViewController {
  92. @IBOutlet weak var contentView: NSClipView!
  93. @IBOutlet weak var backgroundView: NSView!
  94. @IBOutlet weak var headerBox: NSBox!
  95. @IBOutlet weak var imageContentView: NSView!
  96. @IBOutlet weak var imageViewHeightConstraint: NSLayoutConstraint!
  97. @IBOutlet weak var propertyTitle: NSTextField!
  98. @IBOutlet weak var preImageView: NSImageView!
  99. @IBOutlet weak var textPresuppositionContentView: NSView!
  100. @IBOutlet weak var textPresuppositionBox: NSBox!
  101. @IBOutlet weak var resetTextPresuppositionBox: NSBox!
  102. @IBOutlet weak var textPresuppositionTopContstraint: NSLayoutConstraint!
  103. @IBOutlet weak var textPresuppositionHeightContstraint: NSLayoutConstraint!
  104. @IBOutlet weak var fontContentView: NSView!
  105. @IBOutlet weak var fontTitleLabel: NSTextField!
  106. @IBOutlet weak var fontImageView: NSButton!
  107. @IBOutlet weak var fontContentViewHeightConstraint: NSLayoutConstraint!
  108. @IBOutlet weak var fontContentViewTopConstraint: NSLayoutConstraint!
  109. @IBOutlet weak var fontNameBox: NSBox!
  110. @IBOutlet weak var fontStyleBox: NSBox!
  111. @IBOutlet weak var fontSizeBox: NSBox!
  112. @IBOutlet weak var leftAlignmentBox: NSBox!
  113. @IBOutlet weak var centerAlignmentBox: NSBox!
  114. @IBOutlet weak var rightAlignmentBox: NSBox!
  115. @IBOutlet weak var colorBox: NSBox!
  116. @IBOutlet weak var fontColorButton: NSButton!
  117. @IBOutlet weak var fontCustomColorButton: NSButton!
  118. @IBOutlet weak var alignmentTopConstraint: NSLayoutConstraint!
  119. @IBOutlet weak var alignmentView: KMEditPropertyAlignmentView!
  120. var textPresuppositionVC: KMDesignSelect?
  121. var textPresuppositionResetVC: KMDesignPropertySelector?
  122. var textPresuppositionResetString: String = ""
  123. var leftAlignmentVC: KMDesignPropertySelector?
  124. var centerAlignmentVC: KMDesignPropertySelector?
  125. var rightAlignmentVC: KMDesignPropertySelector?
  126. var fontNameVC: KMDesignSelect?
  127. var fontSizeVC: KMDesignSelect?
  128. var fontStyleVC: KMDesignSelect?
  129. var borderWidthVC: KMDesignSelect?
  130. @IBOutlet weak var fontBoldBox: NSBox!
  131. @IBOutlet weak var fontItalicBox: NSBox!
  132. var fontBoldVC: KMDesignButton?
  133. var fontItalicVC: KMDesignButton?
  134. @IBOutlet weak var fontAddBox: NSBox!
  135. @IBOutlet weak var fontReduceBox: NSBox!
  136. var fontAddVC: KMDesignButton?
  137. var fontReduceVC: KMDesignButton?
  138. @IBOutlet weak var opacityBox: NSBox!
  139. var opacitVC: KMDesignSelect?
  140. var textsAreas : [CPDFEditTextArea] = []
  141. var listView : CPDFListView!
  142. var fonts: [NSDictionary] = []
  143. var currentColor : NSColor = NSColor.black
  144. var alignment : NSTextAlignment = .left
  145. var fontName: String = "Helvetica" {
  146. didSet {
  147. if self.fontNameVC != nil {
  148. if self.fontNameVC!.items.contains(fontName) {
  149. self.fontNameVC?.stringValue = fontName
  150. } else {
  151. // self.fontNameVC?.stringValue = "Helvetica"
  152. self.fontNameVC?.stringValue = fontName
  153. }
  154. }
  155. }
  156. }
  157. var fontStyle: String = "Regular" {
  158. didSet {
  159. self.fontStyleVC?.stringValue = fontStyle
  160. }
  161. }
  162. var fontSize: CGFloat = 12 {
  163. didSet {
  164. if self.fontSize == -1 {
  165. self.fontSizeVC?.stringValue = "--"
  166. self.fontAddVC?.state = .Disabled
  167. self.fontReduceVC?.state = .Disabled
  168. } else {
  169. self.fontSizeVC?.stringValue = Int(ceil(fontSize)).description + "pt"
  170. self.fontAddVC?.state = .Norm
  171. self.fontReduceVC?.state = .Norm
  172. }
  173. }
  174. }
  175. var selectAreas: [Any] {
  176. get {
  177. return self.listView.editingAreas() ?? []
  178. }
  179. }
  180. weak var handdler: KMEditPDfHanddler?
  181. deinit {
  182. KMPrint("KMEditPDFTextPropertyViewController 已释放.")
  183. NSColorPanel.shared.setTarget(nil)
  184. NSColorPanel.shared.setAction(nil)
  185. NSColorPanel.shared.close()
  186. self.removeNotification()
  187. }
  188. override func viewDidLoad() {
  189. super.viewDidLoad()
  190. self.addNotification()
  191. self.setup()
  192. self.initData()
  193. // self.reloadData()
  194. self.updateLanguage()
  195. self.updatePreviewImage()
  196. self.updateUI()
  197. self.headerBox.isHidden = true
  198. self.imageViewHeightConstraint.constant = 0
  199. self.textPresuppositionTopContstraint.constant = 50
  200. self.alignmentTopConstraint.constant = 16+50
  201. }
  202. func setup() {
  203. // self.backgroundView.backgroundColor(KMAppearance.Layout.bgDrakColor())
  204. self.propertyTitle.font = NSFont.SFProTextSemiboldFont(14.0)
  205. self.propertyTitle.textColor = KMAppearance.Layout.h0Color()
  206. self.fontTitleLabel.font = NSFont.SFProTextSemiboldFont(12.0)
  207. self.fontTitleLabel.textColor = KMAppearance.Layout.h0Color()
  208. self.headerBox.borderWidth = 1
  209. self.headerBox.borderColor = KMAppearance.Interactive.s0Color()
  210. self.headerBox.cornerRadius = 4
  211. self.headerBox.fillColor = KMAppearance.Layout.l1Color()
  212. //
  213. self.fontColorButton.border(NSColor.clear, 0, 10)
  214. self.fontColorButton.target = self
  215. self.fontColorButton.action = #selector(fontColorAction)
  216. //alignment
  217. leftAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  218. leftAlignmentBox.contentView = leftAlignmentVC?.view
  219. leftAlignmentBox.fillColor = NSColor.clear
  220. leftAlignmentVC?.target = self
  221. leftAlignmentVC?.action = #selector(leftAlignmentAction)
  222. leftAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignLeft")!
  223. leftAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignLeftSelect")!
  224. leftAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  225. leftAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  226. leftAlignmentVC?.updateUI()
  227. centerAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  228. centerAlignmentBox.contentView = centerAlignmentVC?.view
  229. centerAlignmentBox.fillColor = NSColor.clear
  230. centerAlignmentVC?.target = self
  231. centerAlignmentVC?.action = #selector(centerAlignmentAction)
  232. centerAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignCenter")!
  233. centerAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  234. centerAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  235. centerAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  236. centerAlignmentVC?.updateUI()
  237. rightAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  238. rightAlignmentBox.contentView = rightAlignmentVC?.view
  239. rightAlignmentBox.fillColor = NSColor.clear
  240. rightAlignmentVC?.target = self
  241. rightAlignmentVC?.action = #selector(rightAlignmentAction)
  242. rightAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignRight")!
  243. rightAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignRightSelect")!
  244. rightAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  245. rightAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  246. rightAlignmentVC?.updateUI()
  247. let fontNameArray = KMEditPDFTextManager.manager.fetchTextFontNames()
  248. let familyNames = CPDFFont.familyNames
  249. fontNameVC = KMDesignSelect.init(withType: .PopButton)
  250. // fontNameVC?.isScrollPop = true
  251. fontNameBox.contentView = fontNameVC?.view
  252. fontNameBox.fillColor = NSColor.clear
  253. fontNameVC?.addItems(withObjectValues: familyNames)
  254. fontNameVC?.selectItem(at: 0)
  255. fontNameVC?.delete = self
  256. fontNameVC?.borderColor = KMAppearance.Interactive.s0Color()
  257. fontNameVC?.background = KMAppearance.Layout.l1Color()
  258. fontNameVC?.background_hov = KMAppearance.Layout.l1Color()
  259. fontNameVC?.background_focus = KMAppearance.Layout.l1Color()
  260. fontNameVC?.textColor = KMAppearance.Layout.h1Color()
  261. fontNameVC?.textColor_hov = KMAppearance.Layout.h1Color()
  262. fontNameVC?.textColor_focus = KMAppearance.Layout.h1Color()
  263. fontNameVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  264. fontNameVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  265. fontNameVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  266. fontNameVC?.updateUI()
  267. self.fontNameVC?.isScrollPop = true
  268. self.fontNameVC?.showVerticalScroller = true
  269. let styleArray = defaultFontStyles //KMEditPDFTextManager.manager.fetchFontStyleWithFontName(fontName: fontName)
  270. let fontStyleNames = CPDFFont.fontNames(forFamilyName: "Helvetica")
  271. fontStyleVC = KMDesignSelect.init(withType: .PopButton)
  272. fontStyleBox.contentView = fontStyleVC?.view
  273. fontStyleBox.fillColor = NSColor.clear
  274. fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  275. fontStyleVC?.selectItem(at: 0)
  276. fontStyleVC?.delete = self
  277. fontStyleVC?.borderColor = KMAppearance.Interactive.s0Color()
  278. fontStyleVC?.background = KMAppearance.Layout.l1Color()
  279. fontStyleVC?.background_hov = KMAppearance.Layout.l1Color()
  280. fontStyleVC?.background_focus = KMAppearance.Layout.l1Color()
  281. fontStyleVC?.textColor = KMAppearance.Layout.h1Color()
  282. fontStyleVC?.textColor_hov = KMAppearance.Layout.h1Color()
  283. fontStyleVC?.textColor_focus = KMAppearance.Layout.h1Color()
  284. fontStyleVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  285. fontStyleVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  286. fontStyleVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  287. fontStyleVC?.updateUI()
  288. self.fontBoldVC = KMDesignButton(withType: .Image)
  289. self.fontBoldBox.contentView = self.fontBoldVC?.view
  290. self.fontBoldBox.borderWidth = 0
  291. self.fontBoldVC?.target = self
  292. self.fontBoldVC?.action = #selector(fontBoldAction)
  293. self.fontBoldVC?.image = NSImage(named: "KMImageNameEditPDFFontBold")!
  294. self.fontBoldVC?.pagination()
  295. self.fontBoldVC?.initDefaultValue()
  296. self.fontItalicVC = KMDesignButton(withType: .Image)
  297. self.fontItalicBox.contentView = self.fontItalicVC?.view
  298. self.fontItalicBox.borderWidth = 0
  299. self.fontItalicVC?.target = self
  300. self.fontItalicVC?.action = #selector(fontItalicAction)
  301. self.fontItalicVC?.image = NSImage(named: "KMImageNameEditPDFFontItalic")!
  302. self.fontItalicVC?.pagination()
  303. self.fontItalicVC?.initDefaultValue()
  304. fontSizeVC = KMDesignSelect.init(withType: .Combox)
  305. fontSizeBox.contentView = fontSizeVC?.view
  306. fontSizeBox.fillColor = NSColor.clear
  307. fontSizeVC?.removeAllItems()
  308. fontSizeVC?.addItems(withObjectValues: self.supportFontSize())
  309. fontSizeVC?.selectItem(at: 0)
  310. fontSizeVC?.delete = self
  311. fontSizeVC?.borderColor = KMAppearance.Interactive.s0Color()
  312. fontSizeVC?.background = KMAppearance.Layout.l1Color()
  313. fontSizeVC?.background_hov = KMAppearance.Layout.l1Color()
  314. fontSizeVC?.background_focus = KMAppearance.Layout.l1Color()
  315. fontSizeVC?.textColor = KMAppearance.Layout.h1Color()
  316. fontSizeVC?.textColor_hov = KMAppearance.Layout.h1Color()
  317. fontSizeVC?.textColor_focus = KMAppearance.Layout.h1Color()
  318. fontSizeVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  319. fontSizeVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  320. fontSizeVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  321. fontSizeVC?.updateUI()
  322. self.fontSizeVC?.editable = true
  323. self.fontAddVC = KMDesignButton(withType: .Image)
  324. self.fontAddBox.contentView = self.fontAddVC?.view
  325. self.fontAddBox.borderWidth = 0
  326. self.fontAddVC?.target = self
  327. self.fontAddVC?.action = #selector(fontAddAction)
  328. self.fontAddVC?.image = NSImage(named: "KMImageNameEditPDFFontAdd")!
  329. self.fontAddVC?.pagination()
  330. self.fontAddVC?.initDefaultValue()
  331. self.fontReduceVC = KMDesignButton(withType: .Image)
  332. self.fontReduceBox.contentView = self.fontReduceVC?.view
  333. self.fontReduceBox.borderWidth = 0
  334. self.fontReduceVC?.target = self
  335. self.fontReduceVC?.action = #selector(fontReduceAction)
  336. self.fontReduceVC?.image = NSImage(named: "KMImageNameEditPDFFontReduce")!
  337. self.fontReduceVC?.pagination()
  338. self.fontReduceVC?.initDefaultValue()
  339. //textPresupposition
  340. textPresuppositionVC = KMDesignSelect.init(withType: .PopButton)
  341. textPresuppositionBox.contentView = textPresuppositionVC?.view
  342. textPresuppositionBox.fillColor = NSColor.clear
  343. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  344. textPresuppositionVC?.selectItem(at: 0)
  345. textPresuppositionVC?.delete = self
  346. textPresuppositionVC?.borderColor = KMAppearance.Interactive.s0Color()
  347. textPresuppositionVC?.background = KMAppearance.Layout.l1Color()
  348. textPresuppositionVC?.background_hov = KMAppearance.Layout.l1Color()
  349. textPresuppositionVC?.background_focus = KMAppearance.Layout.l1Color()
  350. textPresuppositionVC?.textColor = KMAppearance.Layout.h1Color()
  351. textPresuppositionVC?.textColor_hov = KMAppearance.Layout.h1Color()
  352. textPresuppositionVC?.textColor_focus = KMAppearance.Layout.h1Color()
  353. textPresuppositionVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  354. textPresuppositionVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  355. textPresuppositionVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  356. textPresuppositionVC?.updateUI()
  357. textPresuppositionResetVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  358. resetTextPresuppositionBox.contentView = textPresuppositionResetVC?.view
  359. resetTextPresuppositionBox.fillColor = NSColor.clear
  360. textPresuppositionResetVC?.borderWidth = 1
  361. textPresuppositionResetVC?.borderWidth_hov = 1
  362. textPresuppositionResetVC?.borderWidth_sel = 1
  363. textPresuppositionResetVC?.target = self
  364. textPresuppositionResetVC?.action = #selector(resetTextPresuppositionButtonAction)
  365. textPresuppositionResetVC?.image = NSImage(named: "KMImagePropertPanelTextDefaultMore")!
  366. textPresuppositionResetVC?._image_disabled = NSImage(named: "KMImagePropertPanelTextDefaultMore")!
  367. textPresuppositionResetVC?.background_hov = KMAppearance.Layout.l1Color()
  368. textPresuppositionResetVC?.background_disabled = KMAppearance.view_bg_dis_color()
  369. textPresuppositionResetVC?.cornerRadius = 4
  370. textPresuppositionResetVC?.cornerRadius_hov = 4
  371. textPresuppositionResetVC?.cornerRadius_disabled = 4
  372. textPresuppositionResetVC?.borderWidth_disabled = 1
  373. textPresuppositionResetVC?.borderColor_disabled = KMAppearance.view_border_dis_color()
  374. textPresuppositionResetVC?.updateUI()
  375. self.colorBox.borderColor = KMAppearance.Interactive.s0Color()
  376. let sliderItemView = KMSliderItemView()
  377. self.opacityBox.contentView = sliderItemView
  378. self.opacityBox.borderWidth = 0
  379. sliderItemView.titleLabel.stringValue = NSLocalizedString("Opacity", comment: "")
  380. sliderItemView.minValue = 0.0001
  381. sliderItemView.maxValue = 1
  382. sliderItemView.valueChange = { [weak self] value in
  383. self?.opacitVC?.stringValue = String(format: "%0.f%%", value*100)
  384. if let data = self?.opacitVC {
  385. self?.km_comboBoxSelectionDidChange(data)
  386. }
  387. }
  388. opacitVC = KMDesignSelect.init(withType: .PopButton)
  389. sliderItemView.box.contentView = opacitVC?.view
  390. opacitVC?.addItems(withObjectValues: ["25%", "50%", "75%", "100%"])
  391. opacitVC?.selectItem(at: 0)
  392. opacitVC?.delete = self
  393. opacitVC?.borderColor = KMAppearance.Interactive.s0Color()
  394. opacitVC?.background = KMAppearance.Layout.l1Color()
  395. opacitVC?.background_hov = KMAppearance.Layout.l1Color()
  396. opacitVC?.background_focus = KMAppearance.Layout.l1Color()
  397. opacitVC?.textColor = KMAppearance.Layout.h1Color()
  398. opacitVC?.textColor_hov = KMAppearance.Layout.h1Color()
  399. opacitVC?.textColor_focus = KMAppearance.Layout.h1Color()
  400. opacitVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  401. opacitVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  402. opacitVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  403. opacitVC?.updateUI()
  404. self.alignmentView.didChange = { [unowned self] view, areasArray, boundsArray in
  405. self.changeAreasAlign(areas: areasArray, newBounds: boundsArray)
  406. self._trackEvent()
  407. let textAreas = self.handdler?.editingTextAreas ?? []
  408. let imageAreas = self.handdler?.editingImageAreas ?? []
  409. if textAreas.count > 0 && imageAreas.count > 0 {
  410. self._trackAlignEvent()
  411. }
  412. }
  413. self.changeEffectiveAppearance()
  414. }
  415. func initData() {
  416. self.updateTextPresupposition(type: .commonly, needChangeListView: false)
  417. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  418. self.currentColor = model.color
  419. DispatchQueue.main.async {
  420. NSColorPanel.shared.color = model.color
  421. }
  422. self.fontColorButton.image = self.swatchWithColor(color: self.currentColor, size: NSSize(width: 20, height: 20))
  423. self.fonts = CPDFAnnotationModel.supportFonts() as! [NSDictionary]
  424. }
  425. func updateLanguage() {
  426. let areas = self.selectAreas
  427. if textsAreas.count > 0 && textsAreas.count != areas.count { //多选图片跟文字
  428. self.propertyTitle.stringValue = NSLocalizedString("Alignment", comment: "")
  429. } else {
  430. self.propertyTitle.stringValue = NSLocalizedString("Text", comment: "")
  431. }
  432. self.fontTitleLabel.stringValue = NSLocalizedString("Font", comment: "")
  433. }
  434. func addNotification() {
  435. NotificationCenter.default.addObserver(self, selector: #selector(changeEffectiveAppearance), name: NSNotification.Name(rawValue: "kEffectiveAppearance"), object: nil)
  436. }
  437. func removeNotification() {
  438. NotificationCenter.default.removeObserver(self)
  439. DistributedNotificationCenter.default().removeObserver(self)
  440. }
  441. @objc func changeEffectiveAppearance() {
  442. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  443. if isDarkModel {
  444. self.view.appearance = NSAppearance(named: .darkAqua)
  445. } else {
  446. self.view.appearance = NSAppearance(named: .aqua)
  447. }
  448. self.updateUI()
  449. }
  450. func updateUI() {
  451. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  452. if isDarkModel {
  453. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#252526"))
  454. self.textPresuppositionResetVC?.background_disabled = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  455. self.textPresuppositionResetVC?.borderColor = KMAppearance.Layout.w15Color()
  456. self.textPresuppositionResetVC?.borderColor_hov = KMAppearance.Interactive.a0Color()
  457. self.textPresuppositionResetVC?.borderColor_sel = KMAppearance.Layout.w15Color()
  458. self.textPresuppositionResetVC?.background = KMAppearance.Layout.l1Color()
  459. self.textPresuppositionResetVC?.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  460. self.fontBoldVC?.background_act = KMAppearance.Interactive.m1Color()
  461. self.fontBoldVC?.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  462. self.fontBoldVC?.borderColor_hov = KMAppearance.Interactive.a0Color()
  463. self.fontBoldVC?.borderWidth_act = 0
  464. self.fontItalicVC?.background_act = KMAppearance.Interactive.m1Color()
  465. self.fontItalicVC?.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  466. self.fontItalicVC?.borderColor_hov = KMAppearance.Interactive.a0Color()
  467. self.fontItalicVC?.borderWidth_act = 0
  468. self.fontAddVC?.background_act = KMAppearance.Interactive.m1Color()
  469. self.fontAddVC?.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  470. self.fontAddVC?.borderColor_hov = KMAppearance.Interactive.a0Color()
  471. self.fontReduceVC?.background_act = KMAppearance.Interactive.m1Color()
  472. self.fontReduceVC?.background_hov = NSColor(red: 71/255, green: 72/255, blue: 75/255, alpha: 1)
  473. self.fontReduceVC?.borderColor_hov = KMAppearance.Interactive.a0Color()
  474. self.leftAlignmentVC?.background_sel = KMAppearance.Interactive.m1Color()
  475. self.centerAlignmentVC?.background_sel = KMAppearance.Interactive.m1Color()
  476. self.rightAlignmentVC?.background_sel = KMAppearance.Interactive.m1Color()
  477. } else {
  478. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#FAFAFA"))
  479. self.propertyTitle.textColor = KMAppearance.Layout.h0Color()
  480. self.fontTitleLabel.textColor = KMAppearance.Layout.h0Color()
  481. self.headerBox.borderColor = KMAppearance.Interactive.s0Color()
  482. self.headerBox.fillColor = KMAppearance.Layout.l1Color()
  483. leftAlignmentBox.fillColor = NSColor.clear
  484. leftAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  485. leftAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  486. centerAlignmentBox.fillColor = NSColor.clear
  487. centerAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  488. centerAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  489. rightAlignmentBox.fillColor = NSColor.clear
  490. rightAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  491. rightAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  492. fontNameVC?.borderColor = KMAppearance.Interactive.s0Color()
  493. fontNameVC?.background = KMAppearance.Layout.l1Color()
  494. fontNameVC?.background_hov = KMAppearance.Layout.l1Color()
  495. fontNameVC?.background_focus = KMAppearance.Layout.l1Color()
  496. fontNameVC?.textColor = KMAppearance.Layout.h1Color()
  497. fontNameVC?.textColor_hov = KMAppearance.Layout.h1Color()
  498. fontNameVC?.textColor_focus = KMAppearance.Layout.h1Color()
  499. fontNameVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  500. fontNameVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  501. fontNameVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  502. fontStyleVC?.borderColor = KMAppearance.Interactive.s0Color()
  503. fontStyleVC?.background = KMAppearance.Layout.l1Color()
  504. fontStyleVC?.background_hov = KMAppearance.Layout.l1Color()
  505. fontStyleVC?.background_focus = KMAppearance.Layout.l1Color()
  506. fontStyleVC?.textColor = KMAppearance.Layout.h1Color()
  507. fontStyleVC?.textColor_hov = KMAppearance.Layout.h1Color()
  508. fontStyleVC?.textColor_focus = KMAppearance.Layout.h1Color()
  509. fontStyleVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  510. fontStyleVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  511. fontStyleVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  512. fontSizeVC?.borderColor = KMAppearance.Interactive.s0Color()
  513. fontSizeVC?.background = KMAppearance.Layout.l1Color()
  514. fontSizeVC?.background_hov = KMAppearance.Layout.l1Color()
  515. fontSizeVC?.background_focus = KMAppearance.Layout.l1Color()
  516. fontSizeVC?.textColor = KMAppearance.Layout.h1Color()
  517. fontSizeVC?.textColor_hov = KMAppearance.Layout.h1Color()
  518. fontSizeVC?.textColor_focus = KMAppearance.Layout.h1Color()
  519. fontSizeVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  520. fontSizeVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  521. fontSizeVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  522. textPresuppositionBox.fillColor = NSColor.clear
  523. textPresuppositionVC?.borderColor = KMAppearance.Interactive.s0Color()
  524. textPresuppositionVC?.background = KMAppearance.Layout.l1Color()
  525. textPresuppositionVC?.background_hov = KMAppearance.Layout.l1Color()
  526. textPresuppositionVC?.background_focus = KMAppearance.Layout.l1Color()
  527. textPresuppositionVC?.textColor = KMAppearance.Layout.h1Color()
  528. textPresuppositionVC?.textColor_hov = KMAppearance.Layout.h1Color()
  529. textPresuppositionVC?.textColor_focus = KMAppearance.Layout.h1Color()
  530. textPresuppositionVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  531. textPresuppositionVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  532. textPresuppositionVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  533. textPresuppositionResetVC?.borderColor = NSColor(red: 223/255, green: 225/255, blue: 229/255, alpha: 1)
  534. textPresuppositionResetVC?.borderColor_hov = NSColor.clear
  535. textPresuppositionResetVC?.borderColor_sel = KMAppearance.Layout.w15Color()
  536. textPresuppositionResetVC?.borderColor_act = KMAppearance.Layout.w15Color()
  537. textPresuppositionResetVC?.borderColor_disabled = KMAppearance.Layout.w15Color()
  538. textPresuppositionResetVC?.background = NSColor.white
  539. textPresuppositionResetVC?.background_hov = KMAppearance.view_bg_dis_color()
  540. textPresuppositionResetVC?.background_disabled = KMAppearance.view_bg_dis_color()
  541. textPresuppositionResetVC?.borderColor_disabled = KMAppearance.view_border_dis_color()
  542. textPresuppositionResetVC?.borderWidth = 1
  543. opacitVC?.borderColor = KMAppearance.Interactive.s0Color()
  544. opacitVC?.background = KMAppearance.Layout.l1Color()
  545. opacitVC?.background_hov = KMAppearance.Layout.l1Color()
  546. opacitVC?.background_focus = KMAppearance.Layout.l1Color()
  547. opacitVC?.textColor = KMAppearance.Layout.h1Color()
  548. opacitVC?.textColor_hov = KMAppearance.Layout.h1Color()
  549. opacitVC?.textColor_focus = KMAppearance.Layout.h1Color()
  550. opacitVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  551. opacitVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  552. opacitVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  553. self.fontBoldVC?.initDefaultValue()
  554. self.fontItalicVC?.initDefaultValue()
  555. }
  556. }
  557. func reloadData() {
  558. if self.selectAreas.count > 0 {
  559. textsAreas = []
  560. let areas = self.selectAreas
  561. self.alignmentView.editingAreas = areas
  562. for i in 0 ... areas.count-1 {
  563. if areas[i] is CPDFEditTextArea {
  564. textsAreas.append(areas[i] as! CPDFEditTextArea)
  565. }
  566. }
  567. if textsAreas.count == 1 && textsAreas.count == areas.count {
  568. self.headerBox.isHidden = true
  569. self.fontContentView.isHidden = false
  570. self.textPresuppositionContentView.isHidden = false
  571. // 88
  572. self.imageViewHeightConstraint.constant = 0
  573. // 152
  574. self.textPresuppositionTopContstraint.constant = 50
  575. self.fontContentViewHeightConstraint.constant = 193
  576. self.alignmentTopConstraint.constant = 16+50
  577. self.fontContentViewTopConstraint.constant = 8
  578. } else if textsAreas.count > 1 && textsAreas.count == areas.count {
  579. self.headerBox.isHidden = true
  580. self.fontContentView.isHidden = false
  581. self.textPresuppositionContentView.isHidden = false
  582. self.imageViewHeightConstraint.constant = 0
  583. self.textPresuppositionTopContstraint.constant = 50
  584. self.fontContentViewHeightConstraint.constant = 193
  585. self.alignmentTopConstraint.constant = 16+50
  586. self.fontContentViewTopConstraint.constant = 8
  587. } else if textsAreas.count > 0 && textsAreas.count != areas.count { //多选图片跟文字
  588. self.headerBox.isHidden = true
  589. self.fontContentView.isHidden = true
  590. self.textPresuppositionContentView.isHidden = true
  591. self.fontContentViewHeightConstraint.constant = 0
  592. self.textPresuppositionTopContstraint.constant = 16
  593. self.imageViewHeightConstraint.constant = 0
  594. self.alignmentTopConstraint.constant = 0
  595. self.fontContentViewTopConstraint.constant = 0
  596. }
  597. self.refreshSelectAreaProperty()
  598. self.updateLanguage()
  599. }
  600. }
  601. func refreshSelectAreaProperty(needDefaultData: Bool = false) {
  602. if self.selectAreas.count == 1 {
  603. let areas = self.selectAreas.first
  604. if areas is CPDFEditTextArea {
  605. let area = areas as! CPDFEditTextArea
  606. let cFont = self.listView.editingSelectionCFont(byRangeEdit: area)
  607. var sizeString = "\(self.listView.editingSelectionFontSize(byRangeEdit: area))"
  608. var fontName: String = cFont?.familyName ?? "Helvetica"
  609. let alignment = self.listView.currentSelectionAlignment(byRangeEdit: area)
  610. let color = self.listView.editingSelectionFontColor(byRangeEdit: area) ?? NSColor.black
  611. // fontName = KMEditPDFTextManager.manager.transformAreaTextFontName(fontName: fontName, fontNames: self.fontNameVC?.items ?? [])
  612. self.fontNameVC?.stringValue = fontName
  613. // if let data = self.listView?.isBoldCurrentSelection(byRangeEdit: area), data {
  614. // fontName += "-Bold"
  615. // }
  616. // if let data = self.listView?.isItalicCurrentSelection(byRangeEdit: area), data {
  617. // fontName += "-Italic"
  618. // }
  619. //获取默认数据
  620. if needDefaultData {
  621. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  622. fontName = model.fontName
  623. sizeString = model.fontSize.description
  624. }
  625. self.updateTextTextPresuppositionState()
  626. var fontN = fontName
  627. if let data = cFont {
  628. fontN = CPDFFont.convertAppleFont(data) ?? fontName
  629. }
  630. self.updateTextPresupposition(fontName: fontN, size: CGFloat(Float(sizeString)!), needChangeListView: false)
  631. self.currentColor = color
  632. DispatchQueue.main.async {
  633. NSColorPanel.shared.color = color
  634. }
  635. self.fontColorButton.image = self.swatchWithColor(color: color, size: NSSize(width: 20, height: 20))
  636. self.alignment = alignment
  637. self.selectAlignment(alignment: alignment)
  638. self.updatePreviewImage()
  639. let opacity = self.listView.opacity(for: areas as? CPDFEditArea)
  640. let sliderView = self.opacityBox.contentView as? KMSliderItemView
  641. sliderView?.doubleValue = Double(opacity)
  642. self.opacitVC?.stringValue = String(format: "%0.f%%", opacity*100)
  643. if let value = self.listView?.isBoldCurrentSelection(byRangeEdit: area) {
  644. self.fontBoldVC?.state = value ? .Act : .Norm
  645. }
  646. if let value = self.listView?.isItalicCurrentSelection(byRangeEdit: area) {
  647. self.fontItalicVC?.state = value ? .Act : .Norm
  648. }
  649. }
  650. } else if self.selectAreas.count > 1 {
  651. if let data = self.handdler?.editAreasFontNameIsEqual(), data {
  652. if let area = self.handdler?.editingTextAreas.first {
  653. let font = self.listView.editingSelectionCFont(byRangeEdit: area)
  654. self.fontNameVC?.stringValue = font?.familyName ?? ""
  655. }
  656. } else {
  657. self.fontNameVC?.stringValue = "--"
  658. }
  659. if let data = self.handdler?.editAreasFontStyleIsEqual(), data {
  660. if let area = self.handdler?.editingTextAreas.first {
  661. if let styleName = self.listView.editingSelectionCFont(byRangeEdit: area)?.styleName, styleName.isEmpty == false {
  662. self.fontStyleVC?.stringValue = styleName
  663. } else {
  664. self.fontStyleVC?.stringValue = "--"
  665. }
  666. }
  667. } else {
  668. self.fontStyleVC?.stringValue = "--"
  669. }
  670. if let data = self.handdler?.editAreasFontBoldIsEqual(), data {
  671. if let area = self.handdler?.editingTextAreas.first {
  672. let value = self.listView.isBoldCurrentSelection(byRangeEdit: area)
  673. self.fontBoldVC?.state = value ? .Act : .Norm
  674. } else {
  675. self.fontBoldVC?.state = .Disabled
  676. }
  677. } else {
  678. self.fontBoldVC?.state = .Disabled
  679. }
  680. if let data = self.handdler?.editAreasFontItalicIsEqual(), data {
  681. if let area = self.handdler?.editingTextAreas.first {
  682. let value = self.listView.isItalicCurrentSelection(byRangeEdit: area)
  683. self.fontItalicVC?.state = value ? .Act : .Norm
  684. } else {
  685. self.fontItalicVC?.state = .Disabled
  686. }
  687. } else {
  688. self.fontItalicVC?.state = .Disabled
  689. }
  690. if let data = self.handdler?.editAreasFontSizeIsEqual(), data {
  691. if let area = self.handdler?.editingTextAreas.first {
  692. let data = self.listView.editingSelectionFontSize(with: area)
  693. self.fontSizeVC?.stringValue = String(format: "%.0fpt", data)
  694. }
  695. self.fontAddVC?.state = .Norm
  696. self.fontReduceVC?.state = .Norm
  697. self.fontAddVC?.button.isEnabled = true
  698. self.fontReduceVC?.button.isEnabled = true
  699. } else {
  700. self.fontSizeVC?.stringValue = "--"
  701. self.fontAddVC?.state = .Disabled
  702. self.fontReduceVC?.state = .Disabled
  703. self.fontAddVC?.button.isEnabled = false
  704. self.fontReduceVC?.button.isEnabled = false
  705. }
  706. if let data = self.handdler?.editAreasTextAlignmentIsEqual(), data {
  707. } else {
  708. self.leftAlignmentVC?.state = .Disabled
  709. self.centerAlignmentVC?.state = .Disabled
  710. self.rightAlignmentVC?.state = .Disabled
  711. }
  712. if let data = self.handdler?.editAreasFontColorIsEqual(), data {
  713. if let area = self.handdler?.editingTextAreas.first {
  714. let color = self.listView?.editingSelectionFontColor(byRangeEdit: area) ?? NSColor.black
  715. self.fontColorButton.image = self.swatchWithColor(color: color, size: NSSize(width: 20, height: 20))
  716. } else {
  717. self.fontColorButton.image = NSImage(named: "KMImageNameEditPDFColorDisabled")
  718. }
  719. } else {
  720. self.fontColorButton.image = NSImage(named: "KMImageNameEditPDFColorDisabled")
  721. }
  722. }
  723. }
  724. override func mouseDown(with event: NSEvent) {
  725. }
  726. //MARK: ToolAction
  727. private func swatchWithColor(color:NSColor,size:NSSize) -> NSImage {
  728. let image = NSImage(size: size)
  729. image.lockFocus()
  730. color.drawSwatch(in: NSRect(x: 0, y: 0, width: size.width, height: size.height))
  731. image.unlockFocus()
  732. return image
  733. }
  734. private func changeAreasAlign(areas:[Any],newBounds:[String]) {
  735. var oldBounds : [String] = []
  736. for i in 0 ... areas.count-1 {
  737. let area : CPDFEditArea = areas[i] as! CPDFEditArea
  738. oldBounds.append(NSStringFromRect(area.bounds))
  739. self.listView.setBoundsEditArea(area, withBounds: NSRectFromString(newBounds[i]))
  740. }
  741. self.listView.setNeedsDisplayForVisiblePages()
  742. }
  743. }
  744. //MARK: - Action
  745. extension KMEditPDFTextPropertyViewController {
  746. @IBAction func fontColorAction(_ sender: Any) {
  747. self._trackEvent()
  748. let color = self.listView.editingSelectionFontColor(with: self.selectAreas.first as? CPDFEditTextArea)
  749. let panel = NSColorPanel.shared
  750. panel.setTarget(self)
  751. panel.setAction(#selector(fontColorChangeAction))
  752. panel.orderFront(nil)
  753. panel.showsAlpha = false
  754. if color != nil {
  755. if let cnt = self.handdler?.editingTextAreas.count, cnt <= 1 {
  756. panel.color = color ?? NSColor.black
  757. }
  758. }
  759. }
  760. @objc func fontColorChangeAction() {
  761. let color = NSColorPanel.shared.color
  762. self.currentColor = color
  763. self.fontColorButton.image = self.swatchWithColor(color: color, size: NSSize(width: 20, height: 20))
  764. let areas = self.handdler?.editingTextAreas ?? []
  765. if areas.count > 0 {
  766. for area in areas {
  767. self.listView.setEditingSelectionFontColor(color, with: area)
  768. }
  769. KMEditPDFPopToolBarWindow.shared.updateFontColor(fontColor: color)
  770. } else {
  771. KMEditPDFTextManager.manager.setCommonlyFontColor(color: self.currentColor)
  772. }
  773. self.updatePreviewImage()
  774. }
  775. @objc func fontBoldAction(_ sender: AnyObject) {
  776. let state = self.fontBoldVC?.state ?? .None
  777. if state == .Disabled {
  778. return
  779. }
  780. if state == .Act {
  781. self.fontBoldVC?.state = .Norm
  782. } else {
  783. self.fontBoldVC?.state = .Act
  784. }
  785. self.handdler?.fontBoldAction()
  786. self._trackEvent()
  787. }
  788. @objc func fontItalicAction(_ sender: AnyObject) {
  789. let state = self.fontItalicVC?.state ?? .None
  790. if state == .Disabled {
  791. return
  792. }
  793. if state == .Act {
  794. self.fontItalicVC?.state = .Norm
  795. } else {
  796. self.fontItalicVC?.state = .Act
  797. }
  798. self.handdler?.fontItalicAction()
  799. self._trackEvent()
  800. }
  801. @objc func fontAddAction(_ sender: AnyObject) {
  802. let state = self.fontAddVC?.state ?? .None
  803. if state == .Disabled {
  804. return
  805. }
  806. let size = Float(self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: "") ?? "12") ?? 1
  807. self.fontSizeVC?.stringValue = String(format: "%.0fpt", size+1)
  808. self.km_comboBoxSelectionDidChange(self.fontSizeVC!)
  809. self._trackEvent()
  810. }
  811. @objc func fontReduceAction(_ sender: AnyObject) {
  812. let state = self.fontReduceVC?.state ?? .None
  813. if state == .Disabled {
  814. return
  815. }
  816. let size = Float(self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: "") ?? "12") ?? 1
  817. if size < 1 {
  818. return
  819. }
  820. self.fontSizeVC?.stringValue = String(format: "%.0fpt", size-1)
  821. self.km_comboBoxSelectionDidChange(self.fontSizeVC!)
  822. self._trackEvent()
  823. }
  824. @objc func leftAlignmentAction() {
  825. self.leftAlignmentVC?.state = .Sel
  826. self.rightAlignmentVC?.state = .Norm
  827. self.centerAlignmentVC?.state = .Norm
  828. self.updateAlignment(alignment: .left)
  829. KMEditPDFPopToolBarWindow.shared.updateTextAlign(align: .left)
  830. self._trackEvent()
  831. }
  832. @objc func centerAlignmentAction() {
  833. self.leftAlignmentVC?.state = .Norm
  834. self.rightAlignmentVC?.state = .Norm
  835. self.centerAlignmentVC?.state = .Sel
  836. self.updateAlignment(alignment: .center)
  837. KMEditPDFPopToolBarWindow.shared.updateTextAlign(align: .center)
  838. self._trackEvent()
  839. }
  840. @objc func rightAlignmentAction() {
  841. self.leftAlignmentVC?.state = .Norm
  842. self.rightAlignmentVC?.state = .Sel
  843. self.centerAlignmentVC?.state = .Norm
  844. self.updateAlignment(alignment: .right)
  845. KMEditPDFPopToolBarWindow.shared.updateTextAlign(align: .right)
  846. self._trackEvent()
  847. }
  848. func selectAlignment(alignment: NSTextAlignment) {
  849. switch alignment {
  850. case .left:
  851. self.leftAlignmentAction()
  852. case .right:
  853. self.rightAlignmentAction()
  854. case .center:
  855. self.centerAlignmentAction()
  856. default:
  857. self.leftAlignmentAction()
  858. }
  859. }
  860. @objc func resetTextPresuppositionButtonAction(sender: NSButton) {
  861. let state = self.textPresuppositionResetVC?.state ?? .None
  862. if state == .Disabled {
  863. return
  864. }
  865. var popViewDataArr: [String] = []
  866. var dataArray = [NSLocalizedString("Redefine", comment: ""), NSLocalizedString("Reset", comment: "")]
  867. for string in dataArray {
  868. popViewDataArr.append(string)
  869. }
  870. //调整保存参数
  871. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  872. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  873. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  874. var disItems: [String] = dataArray
  875. if model.change || model.redefine {
  876. disItems.removeObject(NSLocalizedString("Reset", comment: ""))
  877. }
  878. if model.change {
  879. disItems.removeObject(NSLocalizedString("Redefine", comment: ""))
  880. }
  881. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(popViewDataArr)
  882. vc.background = KMAppearance.Layout.bgColor()
  883. vc.textColor = KMAppearance.Layout.h0Color()
  884. vc.enterFillColor = KMAppearance.Interactive.s0Color()
  885. vc.disItems = disItems
  886. let createFilePopover: NSPopover = NSPopover.init()
  887. createFilePopover.contentViewController = vc
  888. createFilePopover.animates = true
  889. createFilePopover.behavior = .semitransient
  890. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  891. createFilePopover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: -10, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY)
  892. // vc.customBoxWidthLayoutConstraint.constant = self.popWidth ?? sender.frame.width
  893. vc.downCallback = { [unowned self](downEntered: Bool, count: String) -> Void in
  894. if downEntered {
  895. if count == NSLocalizedString("Reset", comment: "") {
  896. self.resetTextPresuppositionData()
  897. } else if count == NSLocalizedString("Redefine", comment: "") {
  898. self.reDefineTextPresuppositionData()
  899. }
  900. createFilePopover.close()
  901. }
  902. }
  903. }
  904. func updateTextTextPresuppositionState() {
  905. let areas = self.selectAreas.first
  906. if areas is CPDFEditTextArea {
  907. var size: CGFloat = (abs(self.listView.editingSelectionFontSize(byRangeEdit: areas as? CPDFEditTextArea)))
  908. let cfont = self.listView.editingSelectionCFont(byRangeEdit: areas as? CPDFEditTextArea)
  909. var fontName = cfont?.familyName ?? "Helvetica"
  910. // fontName = KMEditPDFTextManager.manager.transformAreaTextFontName(fontName: fontName, fontNames: self.fontNameVC?.items ?? [])
  911. // if let data = self.listView?.isBoldCurrentSelection(byRangeEdit: areas as? CPDFEditTextArea), data {
  912. // fontName += "-Bold"
  913. // }
  914. //
  915. // if let data = self.listView?.isItalicCurrentSelection(byRangeEdit: areas as? CPDFEditTextArea), data {
  916. // fontName += "-Italic"
  917. // }
  918. var fontN = fontName
  919. if let data = cfont {
  920. fontN = CPDFFont.convertAppleFont(data) ?? fontName
  921. }
  922. let models = KMEditPDFTextManager.manager.fetchAllUserDefaultData()
  923. var index = 0
  924. for i in 0...models.count - 1 {
  925. let model = models[i]
  926. if model.fontName == fontN && size == model.fontSize {
  927. index = i
  928. }
  929. }
  930. //刷新样式
  931. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  932. textPresuppositionVC?.selectItem(at: index)
  933. }
  934. }
  935. }
  936. //MARK: - Update
  937. extension KMEditPDFTextPropertyViewController {
  938. func updateAlignment(alignment: NSTextAlignment) {
  939. if self.alignment != alignment {
  940. let areas = self.handdler?.editingTextAreas ?? []
  941. if areas.count > 0 {
  942. for area in areas {
  943. self.listView.setCurrentSelectionAlignment(alignment, with: area)
  944. }
  945. } else {
  946. KMEditPDFTextManager.manager.setFontAlignment(alignment: alignment)
  947. }
  948. self.alignment = alignment
  949. self.updatePreviewImage()
  950. }
  951. }
  952. // 更新字体预设
  953. func updateTextPresupposition(type: KMEditPDFTextFontType, needChangeListView: Bool = true) {
  954. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  955. let fontName: String = model.fontName
  956. let size: CGFloat = model.fontSize
  957. self.updateTextPresupposition(fontName: fontName, size: size, needChangeListView: needChangeListView)
  958. //刷新样式
  959. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  960. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  961. if type == .customize || type == .commonly {
  962. self.textPresuppositionResetVC?.state = .Disabled
  963. } else {
  964. self.textPresuppositionResetVC?.state = .Norm
  965. }
  966. }
  967. }
  968. extension KMEditPDFTextPropertyViewController: KMSelectPopButtonDelegate {
  969. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  970. if obj == textPresuppositionVC {
  971. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[obj.indexOfSelectedItem])
  972. self.updateTextPresupposition(type: type)
  973. } else if obj == fontNameVC {
  974. self.updateFontNameAndStyle(name: obj.stringValue, style: fontStyle)
  975. self.updatePreviewImage()
  976. let win = KMEditPDFPopToolBarWindow.shared
  977. if win.isVisible {
  978. (win.contentViewController as? KMEditPDFPopToolBarController)?.toolbarView?.reloadData()
  979. }
  980. } else if obj == fontSizeVC {
  981. let size = CGFloat(Float((obj.stringValue.replacingOccurrences(of: "pt", with: "")))!)
  982. self.updateFontSize(size: size)
  983. self.updatePreviewImage()
  984. } else if obj == fontStyleVC {
  985. self.updateFontNameAndStyle(name: fontName, style: obj.stringValue)
  986. self.updatePreviewImage()
  987. } else if obj == self.opacitVC {
  988. let stringValue = self.opacitVC?.stringValue ?? ""
  989. let value = (stringValue.components(separatedBy: "%").first?.stringToCGFloat() ?? 0) / 100
  990. let view = self.opacityBox.contentView as? KMSliderItemView
  991. view?.doubleValue = Double(value)
  992. let areas = self.listView.editingAreas() as? [CPDFEditArea] ?? []
  993. for area in areas {
  994. self.listView.setOpacityEditArea(area, opacity: value)
  995. }
  996. }
  997. }
  998. func km_controlTextDidChange(_ obj: KMDesignSelect) {
  999. if obj == self.fontSizeVC {
  1000. let format = NumberFormatter()
  1001. format.numberStyle = .decimal
  1002. var string = obj.stringValue.replacingOccurrences(of: "pt", with: "")
  1003. string = string.replacingOccurrences(of: "p", with: "")
  1004. let size = max(Float(string) ?? 1, 1)
  1005. self.fontSizeVC?.stringValue = format.string(from: NSNumber(value: size)) ?? ""
  1006. }
  1007. }
  1008. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  1009. if obj == self.fontSizeVC {
  1010. var string = obj.stringValue.replacingOccurrences(of: "pt", with: "")
  1011. string = string.replacingOccurrences(of: ",", with: "")
  1012. let size = Float(string) ?? 1
  1013. let sizeValue = max(size, 1)
  1014. self.fontSizeVC?.stringValue = String(format: "%.0fpt", sizeValue)
  1015. self.updateFontSize(size: size.cgFloat)
  1016. }
  1017. }
  1018. func km_cellViewWillShow(_ obj: KMDesignSelect, _ cellView: KMBox, _ index: Int) {
  1019. if obj.isEqual(to: self.textPresuppositionVC) == false {
  1020. return
  1021. }
  1022. if let label = cellView.contentView?.subviews.first as? NSTextField {
  1023. /* 14.0 "SFProText-Regular" */
  1024. let allValues = KMEditPDFTextFontType.allValues()
  1025. let idx = allValues.count-index-1
  1026. if idx == 0 { // custom
  1027. return
  1028. }
  1029. guard let value = allValues.safe_element(for: idx) as? String else {
  1030. return
  1031. }
  1032. let type = KMEditPDFTextFontType.typeOfRawValue(value: value)
  1033. var fontSize: CGFloat = 0
  1034. if type == .h1 {
  1035. fontSize = 20
  1036. } else if type == .h2 {
  1037. fontSize = 18
  1038. } else if type == .h3 {
  1039. fontSize = 16
  1040. } else if type == .b1 {
  1041. fontSize = 14
  1042. } else if type == .b2 {
  1043. fontSize = 12
  1044. } else if type == .b3 {
  1045. fontSize = 10
  1046. }
  1047. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  1048. let fontName: String = model.fontName
  1049. // let size: CGFloat = model.fontSize
  1050. let bold = fontName.contains("Bold")
  1051. let italic = fontName.contains("Oblique") || fontName.contains("Italic")
  1052. let attri = NSMutableAttributedString(attributedString: label.attributedStringValue)
  1053. if bold {
  1054. attri.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: fontSize), range: NSMakeRange(0, attri.string.count))
  1055. } else {
  1056. attri.addAttribute(.font, value: NSFont.systemFont(ofSize: fontSize), range: NSMakeRange(0, attri.string.count))
  1057. }
  1058. if italic {
  1059. attri.addAttribute(.obliqueness, value: 0.3, range: NSMakeRange(0, attri.string.count))
  1060. }
  1061. label.attributedStringValue = attri
  1062. }
  1063. }
  1064. func km_SelectPopoverWillShow(_ obj: KMDesignSelect) {
  1065. if obj.isEqual(to: self.fontNameVC) {
  1066. self._trackEvent()
  1067. } else if obj.isEqual(to: self.fontStyleVC) {
  1068. self._trackEvent()
  1069. } else if obj.isEqual(to: self.fontSizeVC) {
  1070. self._trackEvent()
  1071. }
  1072. }
  1073. }
  1074. //MARK: - TextPresupposition
  1075. extension KMEditPDFTextPropertyViewController {
  1076. //MARK: 基本属性调整
  1077. func updateTextPresupposition(fontName: String, size: CGFloat, needChangeListView: Bool = true) {
  1078. let fontNameArray = fontName.components(separatedBy: "-")
  1079. var name = ""
  1080. var style = ""
  1081. if fontNameArray.count > 0 {
  1082. name = fontNameArray.first!
  1083. } else {
  1084. name = "Helvetica"
  1085. }
  1086. if fontNameArray.count == 4 {
  1087. style = "\(fontNameArray[2]) \(fontNameArray[3])"
  1088. } else if fontNameArray.count == 3 {
  1089. style = "\(fontNameArray[1]) \(fontNameArray[2])"
  1090. } else if fontNameArray.count == 2 {
  1091. style = fontNameArray.last!
  1092. } else {
  1093. style = "Regular"
  1094. }
  1095. self.updateFontNameAndStyle(name: name, style: style, needChangeListView: needChangeListView, needSave: false)
  1096. self.updateFontSize(size: size, needChangeListView: needChangeListView, needSave: false)
  1097. self.updatePreviewImage()
  1098. }
  1099. func resetTextPresuppositionData() {
  1100. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1101. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1102. KMEditPDFTextManager.manager.resetTextPresupposition(type: type)
  1103. self.updateTextPresupposition(type: type)
  1104. }
  1105. func reDefineTextPresuppositionData(redefine: Bool = true) {
  1106. let fontStyle = self.fontStyle
  1107. let fontName = self.fontName + "-" + fontStyle
  1108. let fontSize = self.fontSize
  1109. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1110. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1111. KMEditPDFTextManager.manager.reDefineTextPresupposition(fontName: fontName,
  1112. fontSize: fontSize,
  1113. type: type)
  1114. self.updateTextPresupposition(type: type)
  1115. }
  1116. }
  1117. //MARK: - Private
  1118. // 更新字体名称+字重
  1119. extension KMEditPDFTextPropertyViewController {
  1120. // 更新字体名称 和 字重
  1121. func updateFontNameAndStyle(name: String, style: String, needChangeListView: Bool = true, needSave: Bool = true) {
  1122. // if fontName != name || fontStyle != style {
  1123. // let styleArray = defaultFontStyles //KMEditPDFTextManager.manager.fetchFontStyleWithFontName(fontName: name)
  1124. // var styleString = KMEditPDFTextManager.manager.checkFontStyle(style: style)
  1125. var styleString = style
  1126. let fontStyleNames = CPDFFont.fontNames(forFamilyName: name)
  1127. if !fontStyleNames.contains(style) {
  1128. self.fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  1129. self.fontStyleVC?.selectItem(at: 0)
  1130. // styleString = KMEditPDFTextManager.manager.checkFontStyle(style: self.fontStyleVC!.stringValue)
  1131. styleString = fontStyleNames.first ?? ""
  1132. } else {
  1133. self.fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  1134. self.fontStyleVC?.selectItem(at: fontStyleNames.firstIndex(of: style) ?? 0)
  1135. }
  1136. var fontName = "\(name)-\(styleString)"
  1137. if styleString.count == 0 {
  1138. fontName = name
  1139. }
  1140. //数据保存返回
  1141. if self.selectAreas.count > 0 {
  1142. if needChangeListView {
  1143. let areas = self.handdler?.editingTextAreas ?? []
  1144. for area in areas {
  1145. // self.listView.setEditingSelectionFontName(name, with: area)
  1146. let font = CPDFFont(familyName: name, fontStyle: style)
  1147. self.listView.setEditSelectionCFont(font, with: area)
  1148. // if styleString.contains("Bold") {
  1149. // self.listView.setCurrentSelectionIsBold(true, with: area)
  1150. // } else {
  1151. // self.listView.setCurrentSelectionIsBold(false, with: area)
  1152. // }
  1153. //
  1154. // if styleString.contains("Oblique") || styleString.contains("Italic") {
  1155. // self.listView.setCurrentSelectionIsItalic(true, with: area)
  1156. // } else {
  1157. // self.listView.setCurrentSelectionIsItalic(false, with: area)
  1158. // }
  1159. }
  1160. }
  1161. } else {
  1162. if needSave {
  1163. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  1164. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: fontName, fontSize: model.fontSize, type: .commonly)
  1165. }
  1166. }
  1167. self.fontName = name
  1168. self.fontStyle = self.fontStyleVC?.stringValue ?? "Regular"
  1169. if needSave {
  1170. //调整保存参数
  1171. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1172. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1173. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  1174. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: fontName, fontSize: model.fontSize, type: type)
  1175. }
  1176. //刷新样式
  1177. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  1178. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  1179. // }
  1180. self._boldButtonStateUpdate(fontStyle: styleString)
  1181. self._italicButtonStateUpdate(fontStyle: styleString)
  1182. }
  1183. func updateFontSize(size: CGFloat, needChangeListView: Bool = true, needSave: Bool = true) {
  1184. // var fontSize = Float((self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: ""))!) ?? 8.0
  1185. if fontSize != size {
  1186. let areas = self.handdler?.editingTextAreas ?? []
  1187. if areas.count > 0 {
  1188. if needChangeListView {
  1189. for area in areas {
  1190. self.listView.setEditingSelectionFontSize(size, with: area, isAutoSize: false)
  1191. }
  1192. }
  1193. } else {
  1194. if needSave {
  1195. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  1196. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: model.fontName, fontSize: size, type: .commonly)
  1197. }
  1198. }
  1199. self.fontSize = size
  1200. if needSave {
  1201. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1202. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1203. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  1204. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: model.fontName, fontSize: size, type: type)
  1205. }
  1206. //刷新样式
  1207. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  1208. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  1209. }
  1210. }
  1211. // Bold
  1212. private func _boldButtonStateUpdate(fontStyle fStyle: String) {
  1213. let fontStyleNames = self.fontStyleVC?.items ?? []
  1214. var hasBold = false
  1215. for name in fontStyleNames {
  1216. if name.contains("Bold") {
  1217. hasBold = true
  1218. break
  1219. }
  1220. }
  1221. if !hasBold {
  1222. // self.fontBoldVC?.state = .Disabled
  1223. return
  1224. }
  1225. let bold = fStyle.contains("Bold")
  1226. // self.fontBoldVC?.state = bold ? .Act : .Norm
  1227. }
  1228. private func _italicButtonStateUpdate(fontStyle fStyle: String) {
  1229. let fontStyleNames = self.fontStyleVC?.items ?? []
  1230. var hasItalic = false
  1231. for name in fontStyleNames {
  1232. if name.contains("Italic") || name.contains("Oblique") {
  1233. hasItalic = true
  1234. break
  1235. }
  1236. }
  1237. if !hasItalic {
  1238. // self.fontItalicVC?.state = .Disabled
  1239. return
  1240. }
  1241. let italic = fStyle.contains("Italic") || fStyle.contains("Oblique")
  1242. // self.fontItalicVC?.state = italic ? .Act : .Norm
  1243. }
  1244. //MARK: 刷新预览图片
  1245. private func updatePreviewImage() {
  1246. var alignment = self.alignment
  1247. var fontSize = Float((self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: ""))!) ?? 1.0
  1248. var fontName = self.fontNameVC?.stringValue ?? "Sample"
  1249. let fontStyle = KMEditPDFTextManager.manager.checkFontStyle(style: self.fontStyleVC?.stringValue ?? "")
  1250. let fontCurrentColor = self.currentColor
  1251. fontName = KMEditPDFTextManager.manager.checkFontName(fontName: (fontName + "-" + fontStyle))
  1252. fontSize = max(fontSize, 8)
  1253. let editringareas = self.selectAreas
  1254. let count = editringareas.count
  1255. // let editingSelectionString = self.listView.editingSelectionString()
  1256. let editingSelectionAlignment = self.listView.editingSelectionAlignment(with: editringareas.first as? CPDFEditTextArea)
  1257. if count == 1 {
  1258. let areas = editringareas.first
  1259. if areas is CPDFEditTextArea {
  1260. // string = editingSelectionString ?? NSLocalizedString("Sample", comment: "")
  1261. alignment = editingSelectionAlignment
  1262. }
  1263. }
  1264. let image = KMEditPDFTextManager.manager.fetchTextImage(alignment: .center,
  1265. fontName: fontName,
  1266. fontSize: CGFloat(fontSize),
  1267. color: fontCurrentColor,
  1268. imageSize: self.preImageView.frame.size)
  1269. self.preImageView.image = image
  1270. }
  1271. func supportFontSize() -> [String] {
  1272. return ["8pt", "9pt", "10pt", "11pt", "12pt", "14pt", "16pt", "18pt", "20pt", "22pt", "24pt", "26pt", "28pt", "36pt", "48pt", "72pt"]
  1273. }
  1274. private func _trackEvent() {
  1275. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditText":"SubTbr_EditText_PropertiesPanel_All"])
  1276. }
  1277. private func _trackAlignEvent() {
  1278. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditText":"SubTbr_EditContent_AlignContent"])
  1279. }
  1280. }