KMEditPDFTextPropertyViewController.swift 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327
  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. //alignment
  215. leftAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  216. leftAlignmentBox.contentView = leftAlignmentVC?.view
  217. leftAlignmentBox.fillColor = NSColor.clear
  218. leftAlignmentVC?.target = self
  219. leftAlignmentVC?.action = #selector(leftAlignmentAction)
  220. leftAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignLeft")!
  221. leftAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignLeftSelect")!
  222. leftAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  223. leftAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  224. leftAlignmentVC?.updateUI()
  225. centerAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  226. centerAlignmentBox.contentView = centerAlignmentVC?.view
  227. centerAlignmentBox.fillColor = NSColor.clear
  228. centerAlignmentVC?.target = self
  229. centerAlignmentVC?.action = #selector(centerAlignmentAction)
  230. centerAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignCenter")!
  231. centerAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignCenterSelect")!
  232. centerAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  233. centerAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  234. centerAlignmentVC?.updateUI()
  235. rightAlignmentVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  236. rightAlignmentBox.contentView = rightAlignmentVC?.view
  237. rightAlignmentBox.fillColor = NSColor.clear
  238. rightAlignmentVC?.target = self
  239. rightAlignmentVC?.action = #selector(rightAlignmentAction)
  240. rightAlignmentVC?.image = NSImage(named: "KMImageNameEditPDFAlignRight")!
  241. rightAlignmentVC?.image_sel = NSImage(named: "KMImageNameEditPDFAlignRightSelect")!
  242. rightAlignmentVC?.background_hov = KMAppearance.Layout.l1Color()
  243. rightAlignmentVC?.background_sel = KMAppearance.view_bg_dis_color()
  244. rightAlignmentVC?.updateUI()
  245. let fontNameArray = KMEditPDFTextManager.manager.fetchTextFontNames()
  246. let familyNames = CPDFFont.familyNames
  247. fontNameVC = KMDesignSelect.init(withType: .PopButton)
  248. // fontNameVC?.isScrollPop = true
  249. fontNameBox.contentView = fontNameVC?.view
  250. fontNameBox.fillColor = NSColor.clear
  251. fontNameVC?.addItems(withObjectValues: familyNames)
  252. fontNameVC?.selectItem(at: 0)
  253. fontNameVC?.delete = self
  254. fontNameVC?.borderColor = KMAppearance.Interactive.s0Color()
  255. fontNameVC?.background = KMAppearance.Layout.l1Color()
  256. fontNameVC?.background_hov = KMAppearance.Layout.l1Color()
  257. fontNameVC?.background_focus = KMAppearance.Layout.l1Color()
  258. fontNameVC?.textColor = KMAppearance.Layout.h1Color()
  259. fontNameVC?.textColor_hov = KMAppearance.Layout.h1Color()
  260. fontNameVC?.textColor_focus = KMAppearance.Layout.h1Color()
  261. fontNameVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  262. fontNameVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  263. fontNameVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  264. fontNameVC?.updateUI()
  265. self.fontNameVC?.isScrollPop = true
  266. self.fontNameVC?.showVerticalScroller = true
  267. let styleArray = defaultFontStyles //KMEditPDFTextManager.manager.fetchFontStyleWithFontName(fontName: fontName)
  268. let fontStyleNames = CPDFFont.fontNames(forFamilyName: "Helvetica")
  269. fontStyleVC = KMDesignSelect.init(withType: .PopButton)
  270. fontStyleBox.contentView = fontStyleVC?.view
  271. fontStyleBox.fillColor = NSColor.clear
  272. fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  273. fontStyleVC?.selectItem(at: 0)
  274. fontStyleVC?.delete = self
  275. fontStyleVC?.borderColor = KMAppearance.Interactive.s0Color()
  276. fontStyleVC?.background = KMAppearance.Layout.l1Color()
  277. fontStyleVC?.background_hov = KMAppearance.Layout.l1Color()
  278. fontStyleVC?.background_focus = KMAppearance.Layout.l1Color()
  279. fontStyleVC?.textColor = KMAppearance.Layout.h1Color()
  280. fontStyleVC?.textColor_hov = KMAppearance.Layout.h1Color()
  281. fontStyleVC?.textColor_focus = KMAppearance.Layout.h1Color()
  282. fontStyleVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  283. fontStyleVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  284. fontStyleVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  285. fontStyleVC?.updateUI()
  286. self.fontBoldVC = KMDesignButton(withType: .Image)
  287. self.fontBoldBox.contentView = self.fontBoldVC?.view
  288. self.fontBoldBox.borderWidth = 0
  289. self.fontBoldVC?.target = self
  290. self.fontBoldVC?.action = #selector(fontBoldAction)
  291. self.fontBoldVC?.image = NSImage(named: "KMImageNameEditPDFFontBold")!
  292. self.fontBoldVC?.pagination()
  293. self.fontBoldVC?.initDefaultValue()
  294. self.fontItalicVC = KMDesignButton(withType: .Image)
  295. self.fontItalicBox.contentView = self.fontItalicVC?.view
  296. self.fontItalicBox.borderWidth = 0
  297. self.fontItalicVC?.target = self
  298. self.fontItalicVC?.action = #selector(fontItalicAction)
  299. self.fontItalicVC?.image = NSImage(named: "KMImageNameEditPDFFontItalic")!
  300. self.fontItalicVC?.pagination()
  301. self.fontItalicVC?.initDefaultValue()
  302. fontSizeVC = KMDesignSelect.init(withType: .Combox)
  303. fontSizeBox.contentView = fontSizeVC?.view
  304. fontSizeBox.fillColor = NSColor.clear
  305. fontSizeVC?.removeAllItems()
  306. fontSizeVC?.addItems(withObjectValues: self.supportFontSize())
  307. fontSizeVC?.selectItem(at: 0)
  308. fontSizeVC?.delete = self
  309. fontSizeVC?.borderColor = KMAppearance.Interactive.s0Color()
  310. fontSizeVC?.background = KMAppearance.Layout.l1Color()
  311. fontSizeVC?.background_hov = KMAppearance.Layout.l1Color()
  312. fontSizeVC?.background_focus = KMAppearance.Layout.l1Color()
  313. fontSizeVC?.textColor = KMAppearance.Layout.h1Color()
  314. fontSizeVC?.textColor_hov = KMAppearance.Layout.h1Color()
  315. fontSizeVC?.textColor_focus = KMAppearance.Layout.h1Color()
  316. fontSizeVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  317. fontSizeVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  318. fontSizeVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  319. fontSizeVC?.updateUI()
  320. self.fontSizeVC?.editable = true
  321. self.fontAddVC = KMDesignButton(withType: .Image)
  322. self.fontAddBox.contentView = self.fontAddVC?.view
  323. self.fontAddBox.borderWidth = 0
  324. self.fontAddVC?.target = self
  325. self.fontAddVC?.action = #selector(fontAddAction)
  326. self.fontAddVC?.image = NSImage(named: "KMImageNameEditPDFFontAdd")!
  327. self.fontAddVC?.pagination()
  328. self.fontAddVC?.initDefaultValue()
  329. self.fontReduceVC = KMDesignButton(withType: .Image)
  330. self.fontReduceBox.contentView = self.fontReduceVC?.view
  331. self.fontReduceBox.borderWidth = 0
  332. self.fontReduceVC?.target = self
  333. self.fontReduceVC?.action = #selector(fontReduceAction)
  334. self.fontReduceVC?.image = NSImage(named: "KMImageNameEditPDFFontReduce")!
  335. self.fontReduceVC?.pagination()
  336. self.fontReduceVC?.initDefaultValue()
  337. //textPresupposition
  338. textPresuppositionVC = KMDesignSelect.init(withType: .PopButton)
  339. textPresuppositionBox.contentView = textPresuppositionVC?.view
  340. textPresuppositionBox.fillColor = NSColor.clear
  341. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  342. textPresuppositionVC?.selectItem(at: 0)
  343. textPresuppositionVC?.delete = self
  344. textPresuppositionVC?.borderColor = KMAppearance.Interactive.s0Color()
  345. textPresuppositionVC?.background = KMAppearance.Layout.l1Color()
  346. textPresuppositionVC?.background_hov = KMAppearance.Layout.l1Color()
  347. textPresuppositionVC?.background_focus = KMAppearance.Layout.l1Color()
  348. textPresuppositionVC?.textColor = KMAppearance.Layout.h1Color()
  349. textPresuppositionVC?.textColor_hov = KMAppearance.Layout.h1Color()
  350. textPresuppositionVC?.textColor_focus = KMAppearance.Layout.h1Color()
  351. textPresuppositionVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  352. textPresuppositionVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  353. textPresuppositionVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  354. textPresuppositionVC?.updateUI()
  355. textPresuppositionResetVC = KMDesignPropertySelector.init(withType: .Icon_Btn)
  356. resetTextPresuppositionBox.contentView = textPresuppositionResetVC?.view
  357. resetTextPresuppositionBox.fillColor = NSColor.clear
  358. textPresuppositionResetVC?.target = self
  359. textPresuppositionResetVC?.action = #selector(resetTextPresuppositionButtonAction)
  360. textPresuppositionResetVC?.image = NSImage(named: "KMImagePropertPanelTextDefaultMore")!
  361. textPresuppositionResetVC?._image_disabled = NSImage(named: "KMImagePropertPanelTextDefaultMore")!
  362. textPresuppositionResetVC?.background_hov = KMAppearance.Layout.l1Color()
  363. textPresuppositionResetVC?.background_disabled = KMAppearance.view_bg_dis_color()
  364. textPresuppositionResetVC?.cornerRadius = 4
  365. textPresuppositionResetVC?.cornerRadius_hov = 4
  366. textPresuppositionResetVC?.cornerRadius_disabled = 4
  367. textPresuppositionResetVC?.borderWidth_disabled = 1
  368. textPresuppositionResetVC?.borderColor_disabled = KMAppearance.view_border_dis_color()
  369. textPresuppositionResetVC?.updateUI()
  370. // self.colorBox.borderColor = NSColor.km_init(hex: "#DFE1E5")
  371. self.colorBox.borderColor = KMAppearance.Interactive.s0Color()
  372. let sliderItemView = KMSliderItemView()
  373. self.opacityBox.contentView = sliderItemView
  374. self.opacityBox.borderWidth = 0
  375. sliderItemView.titleLabel.stringValue = NSLocalizedString("Opacity", comment: "")
  376. // #616469
  377. sliderItemView.minValue = 0.0001
  378. sliderItemView.maxValue = 1
  379. sliderItemView.valueChange = { [weak self] value in
  380. self?.opacitVC?.stringValue = String(format: "%0.f%%", value*100)
  381. // self?.opacitVC?.stringValue = self?.opacitVC?.stringValue ?? ""
  382. if let data = self?.opacitVC {
  383. self?.km_comboBoxSelectionDidChange(data)
  384. }
  385. }
  386. opacitVC = KMDesignSelect.init(withType: .PopButton)
  387. sliderItemView.box.contentView = opacitVC?.view
  388. // fontStyleBox.fillColor = NSColor.clear
  389. opacitVC?.addItems(withObjectValues: ["25%", "50%", "75%", "100%"])
  390. opacitVC?.selectItem(at: 0)
  391. opacitVC?.delete = self
  392. opacitVC?.borderColor = KMAppearance.Interactive.s0Color()
  393. opacitVC?.background = KMAppearance.Layout.l1Color()
  394. opacitVC?.background_hov = KMAppearance.Layout.l1Color()
  395. opacitVC?.background_focus = KMAppearance.Layout.l1Color()
  396. opacitVC?.textColor = KMAppearance.Layout.h1Color()
  397. opacitVC?.textColor_hov = KMAppearance.Layout.h1Color()
  398. opacitVC?.textColor_focus = KMAppearance.Layout.h1Color()
  399. opacitVC?.popViewControllerBackground = KMAppearance.Layout.bgColor()
  400. opacitVC?.popViewControllerTextColor = KMAppearance.Layout.h0Color()
  401. opacitVC?.popViewControllerEnterFillColor = KMAppearance.Interactive.s0Color()
  402. opacitVC?.updateUI()
  403. self.alignmentView.didChange = { [unowned self] view, areasArray, boundsArray in
  404. self.changeAreasAlign(areas: areasArray, newBounds: boundsArray)
  405. self._trackEvent()
  406. let textAreas = self.handdler?.editingTextAreas ?? []
  407. let imageAreas = self.handdler?.editingImageAreas ?? []
  408. if textAreas.count > 0 && imageAreas.count > 0 {
  409. self._trackAlignEvent()
  410. }
  411. }
  412. }
  413. func initData() {
  414. self.updateTextPresupposition(type: .commonly, needChangeListView: false)
  415. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  416. self.currentColor = model.color
  417. DispatchQueue.main.async {
  418. NSColorPanel.shared.color = model.color
  419. }
  420. self.fontColorButton.image = self.swatchWithColor(color: self.currentColor, size: NSSize(width: 20, height: 20))
  421. self.fonts = CPDFAnnotationModel.supportFonts() as! [NSDictionary]
  422. }
  423. func updateLanguage() {
  424. let areas = self.selectAreas
  425. if textsAreas.count > 0 && textsAreas.count != areas.count { //多选图片跟文字
  426. self.propertyTitle.stringValue = NSLocalizedString("General Properties", comment: "")
  427. } else {
  428. self.propertyTitle.stringValue = NSLocalizedString("Text", comment: "")
  429. }
  430. self.fontTitleLabel.stringValue = NSLocalizedString("Font", comment: "")
  431. }
  432. func addNotification() {
  433. NotificationCenter.default.addObserver(self, selector: #selector(changeEffectiveAppearance), name: NSNotification.Name(rawValue: "kEffectiveAppearance"), object: nil)
  434. }
  435. func removeNotification() {
  436. NotificationCenter.default.removeObserver(self)
  437. DistributedNotificationCenter.default().removeObserver(self)
  438. }
  439. @objc func changeEffectiveAppearance() {
  440. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  441. if isDarkModel {
  442. self.view.appearance = NSAppearance(named: .darkAqua)
  443. } else {
  444. self.view.appearance = NSAppearance(named: .aqua)
  445. }
  446. self.updateUI()
  447. }
  448. func updateUI() {
  449. let isDarkModel = KMAdvertisementConfig.isDarkModel()
  450. if isDarkModel {
  451. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#252526"))
  452. } else {
  453. self.backgroundView.backgroundColor(NSColor.km_init(hex: "#FAFAFA"))
  454. }
  455. }
  456. func reloadData() {
  457. if self.selectAreas.count > 0 {
  458. textsAreas = []
  459. // fontNameVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.fetchTextFontNames())
  460. let areas = self.selectAreas
  461. self.alignmentView.editingAreas = areas
  462. for i in 0 ... areas.count-1 {
  463. if areas[i] is CPDFEditTextArea {
  464. textsAreas.append(areas[i] as! CPDFEditTextArea)
  465. }
  466. }
  467. if textsAreas.count == 1 && textsAreas.count == areas.count {
  468. self.headerBox.isHidden = true
  469. self.fontContentView.isHidden = false
  470. self.textPresuppositionContentView.isHidden = false
  471. // 88
  472. self.imageViewHeightConstraint.constant = 0
  473. // 152
  474. self.textPresuppositionTopContstraint.constant = 50
  475. self.fontContentViewHeightConstraint.constant = 193
  476. self.alignmentTopConstraint.constant = 16+50
  477. self.fontContentViewTopConstraint.constant = 8
  478. } else if textsAreas.count > 1 && textsAreas.count == areas.count {
  479. self.headerBox.isHidden = true
  480. self.fontContentView.isHidden = false
  481. self.textPresuppositionContentView.isHidden = false
  482. self.imageViewHeightConstraint.constant = 0
  483. self.textPresuppositionTopContstraint.constant = 50
  484. self.fontContentViewHeightConstraint.constant = 193
  485. self.alignmentTopConstraint.constant = 16+50
  486. self.fontContentViewTopConstraint.constant = 8
  487. } else if textsAreas.count > 0 && textsAreas.count != areas.count { //多选图片跟文字
  488. self.headerBox.isHidden = true
  489. self.fontContentView.isHidden = true
  490. self.textPresuppositionContentView.isHidden = true
  491. self.fontContentViewHeightConstraint.constant = 0
  492. self.textPresuppositionTopContstraint.constant = 16
  493. self.imageViewHeightConstraint.constant = 0
  494. self.alignmentTopConstraint.constant = 0
  495. self.fontContentViewTopConstraint.constant = 0
  496. }
  497. self.refreshSelectAreaProperty()
  498. self.updateLanguage()
  499. }
  500. }
  501. func refreshSelectAreaProperty(needDefaultData: Bool = false) {
  502. if self.selectAreas.count == 1 {
  503. let areas = self.selectAreas.first
  504. if areas is CPDFEditTextArea {
  505. let area = areas as! CPDFEditTextArea
  506. var sizeString = "\(self.listView.editingSelectionFontSize(byRangeEdit: area))"
  507. var fontName: String = self.listView.editingSelectionCFont(byRangeEdit: area)?.familyName ?? "Helvetica"
  508. let alignment = self.listView.currentSelectionAlignment(byRangeEdit: area)
  509. let color = self.listView.editingSelectionFontColor(byRangeEdit: area) ?? NSColor.black
  510. // fontName = KMEditPDFTextManager.manager.transformAreaTextFontName(fontName: fontName, fontNames: self.fontNameVC?.items ?? [])
  511. self.fontNameVC?.stringValue = fontName
  512. if let data = self.listView?.isBoldCurrentSelection(byRangeEdit: area), data {
  513. fontName += "-Bold"
  514. }
  515. if let data = self.listView?.isItalicCurrentSelection(byRangeEdit: area), data {
  516. fontName += "-Italic"
  517. }
  518. //获取默认数据
  519. if needDefaultData {
  520. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  521. fontName = model.fontName
  522. sizeString = model.fontSize.description
  523. }
  524. self.updateTextTextPresuppositionState()
  525. self.updateTextPresupposition(fontName: fontName, size: CGFloat(Float(sizeString)!), needChangeListView: false)
  526. self.currentColor = color
  527. DispatchQueue.main.async {
  528. NSColorPanel.shared.color = color
  529. }
  530. self.fontColorButton.image = self.swatchWithColor(color: color, size: NSSize(width: 20, height: 20))
  531. self.alignment = alignment
  532. self.selectAlignment(alignment: alignment)
  533. self.updatePreviewImage()
  534. let opacity = self.listView.opacity(for: areas as? CPDFEditArea)
  535. let sliderView = self.opacityBox.contentView as? KMSliderItemView
  536. sliderView?.doubleValue = Double(opacity)
  537. self.opacitVC?.stringValue = String(format: "%0.f%%", opacity*100)
  538. if let value = self.listView?.isBoldCurrentSelection(byRangeEdit: area) {
  539. self.fontBoldVC?.state = value ? .Act : .Norm
  540. }
  541. if let value = self.listView?.isItalicCurrentSelection(byRangeEdit: area) {
  542. self.fontItalicVC?.state = value ? .Act : .Norm
  543. }
  544. }
  545. } else if self.selectAreas.count > 1 {
  546. if let data = self.handdler?.editAreasFontNameIsEqual(), data {
  547. if let area = self.handdler?.editingTextAreas.first {
  548. let font = self.listView.editingSelectionCFont(byRangeEdit: area)
  549. self.fontNameVC?.stringValue = font?.familyName ?? ""
  550. }
  551. } else {
  552. self.fontNameVC?.stringValue = "--"
  553. }
  554. if let data = self.handdler?.editAreasFontStyleIsEqual(), data {
  555. if let area = self.handdler?.editingTextAreas.first {
  556. if let styleName = self.listView.editingSelectionCFont(byRangeEdit: area)?.styleName, styleName.isEmpty == false {
  557. self.fontStyleVC?.stringValue = styleName
  558. } else {
  559. self.fontStyleVC?.stringValue = "--"
  560. }
  561. }
  562. } else {
  563. self.fontStyleVC?.stringValue = "--"
  564. }
  565. if let data = self.handdler?.editAreasFontBoldIsEqual(), data {
  566. if let area = self.handdler?.editingTextAreas.first {
  567. let value = self.listView.isBoldCurrentSelection(byRangeEdit: area)
  568. self.fontBoldVC?.state = value ? .Act : .Norm
  569. } else {
  570. self.fontBoldVC?.state = .Disabled
  571. }
  572. } else {
  573. self.fontBoldVC?.state = .Disabled
  574. }
  575. if let data = self.handdler?.editAreasFontItalicIsEqual(), data {
  576. if let area = self.handdler?.editingTextAreas.first {
  577. let value = self.listView.isItalicCurrentSelection(byRangeEdit: area)
  578. self.fontItalicVC?.state = value ? .Act : .Norm
  579. } else {
  580. self.fontItalicVC?.state = .Disabled
  581. }
  582. } else {
  583. self.fontItalicVC?.state = .Disabled
  584. }
  585. if let data = self.handdler?.editAreasFontSizeIsEqual(), data {
  586. if let area = self.handdler?.editingTextAreas.first {
  587. let data = self.listView.editingSelectionFontSize(with: area)
  588. self.fontSizeVC?.stringValue = String(format: "%.0fpt", data)
  589. }
  590. self.fontAddVC?.state = .Norm
  591. self.fontReduceVC?.state = .Norm
  592. self.fontAddVC?.button.isEnabled = true
  593. self.fontReduceVC?.button.isEnabled = true
  594. } else {
  595. self.fontSizeVC?.stringValue = "--"
  596. self.fontAddVC?.state = .Disabled
  597. self.fontReduceVC?.state = .Disabled
  598. self.fontAddVC?.button.isEnabled = false
  599. self.fontReduceVC?.button.isEnabled = false
  600. }
  601. if let data = self.handdler?.editAreasTextAlignmentIsEqual(), data {
  602. } else {
  603. self.leftAlignmentVC?.state = .Disabled
  604. self.centerAlignmentVC?.state = .Disabled
  605. self.rightAlignmentVC?.state = .Disabled
  606. }
  607. }
  608. }
  609. override func mouseDown(with event: NSEvent) {
  610. }
  611. //MARK: ToolAction
  612. private func swatchWithColor(color:NSColor,size:NSSize) -> NSImage {
  613. let image = NSImage(size: size)
  614. image.lockFocus()
  615. color.drawSwatch(in: NSRect(x: 0, y: 0, width: size.width, height: size.height))
  616. image.unlockFocus()
  617. return image
  618. }
  619. private func changeAreasAlign(areas:[Any],newBounds:[String]) {
  620. var oldBounds : [String] = []
  621. for i in 0 ... areas.count-1 {
  622. let area : CPDFEditArea = areas[i] as! CPDFEditArea
  623. oldBounds.append(NSStringFromRect(area.bounds))
  624. self.listView.setBoundsEditArea(area, withBounds: NSRectFromString(newBounds[i]))
  625. }
  626. self.listView.setNeedsDisplayForVisiblePages()
  627. }
  628. }
  629. //MARK: - Action
  630. extension KMEditPDFTextPropertyViewController {
  631. @IBAction func fontColorAction(_ sender: Any) {
  632. self._trackEvent()
  633. let color = self.listView.editingSelectionFontColor(with: self.selectAreas.first as? CPDFEditTextArea)
  634. let panel = NSColorPanel.shared
  635. panel.setTarget(self)
  636. panel.setAction(#selector(fontColorChangeAction))
  637. panel.orderFront(nil)
  638. panel.showsAlpha = false
  639. if color != nil {
  640. panel.color = color ?? NSColor.black
  641. }
  642. }
  643. @objc func fontColorChangeAction() {
  644. let color = NSColorPanel.shared.color
  645. self.currentColor = color
  646. self.fontColorButton.image = self.swatchWithColor(color: color, size: NSSize(width: 20, height: 20))
  647. let areas = self.handdler?.editingTextAreas ?? []
  648. if areas.count > 0 {
  649. for area in areas {
  650. self.listView.setEditingSelectionFontColor(color, with: area)
  651. }
  652. } else {
  653. KMEditPDFTextManager.manager.setCommonlyFontColor(color: self.currentColor)
  654. }
  655. self.updatePreviewImage()
  656. }
  657. @objc func fontBoldAction(_ sender: AnyObject) {
  658. let state = self.fontBoldVC?.state ?? .None
  659. if state == .Disabled {
  660. return
  661. }
  662. if state == .Act {
  663. self.fontBoldVC?.state = .Norm
  664. } else {
  665. self.fontBoldVC?.state = .Act
  666. }
  667. self.handdler?.fontBoldAction()
  668. self._trackEvent()
  669. }
  670. @objc func fontItalicAction(_ sender: AnyObject) {
  671. let state = self.fontItalicVC?.state ?? .None
  672. if state == .Disabled {
  673. return
  674. }
  675. if state == .Act {
  676. self.fontItalicVC?.state = .Norm
  677. } else {
  678. self.fontItalicVC?.state = .Act
  679. }
  680. self.handdler?.fontItalicAction()
  681. self._trackEvent()
  682. }
  683. @objc func fontAddAction(_ sender: AnyObject) {
  684. let state = self.fontAddVC?.state ?? .None
  685. if state == .Disabled {
  686. return
  687. }
  688. let size = Float(self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: "") ?? "12") ?? 1
  689. self.fontSizeVC?.stringValue = String(format: "%.0fpt", size+1)
  690. self.km_comboBoxSelectionDidChange(self.fontSizeVC!)
  691. self._trackEvent()
  692. }
  693. @objc func fontReduceAction(_ sender: AnyObject) {
  694. let state = self.fontReduceVC?.state ?? .None
  695. if state == .Disabled {
  696. return
  697. }
  698. let size = Float(self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: "") ?? "12") ?? 1
  699. if size < 1 {
  700. return
  701. }
  702. self.fontSizeVC?.stringValue = String(format: "%.0fpt", size-1)
  703. self.km_comboBoxSelectionDidChange(self.fontSizeVC!)
  704. self._trackEvent()
  705. }
  706. @objc func leftAlignmentAction() {
  707. self.leftAlignmentVC?.state = .Sel
  708. self.rightAlignmentVC?.state = .Norm
  709. self.centerAlignmentVC?.state = .Norm
  710. self.updateAlignment(alignment: .left)
  711. self._trackEvent()
  712. }
  713. @objc func centerAlignmentAction() {
  714. self.leftAlignmentVC?.state = .Norm
  715. self.rightAlignmentVC?.state = .Norm
  716. self.centerAlignmentVC?.state = .Sel
  717. self.updateAlignment(alignment: .center)
  718. self._trackEvent()
  719. }
  720. @objc func rightAlignmentAction() {
  721. self.leftAlignmentVC?.state = .Norm
  722. self.rightAlignmentVC?.state = .Sel
  723. self.centerAlignmentVC?.state = .Norm
  724. self.updateAlignment(alignment: .right)
  725. self._trackEvent()
  726. }
  727. func selectAlignment(alignment: NSTextAlignment) {
  728. switch alignment {
  729. case .left:
  730. self.leftAlignmentAction()
  731. case .right:
  732. self.rightAlignmentAction()
  733. case .center:
  734. self.centerAlignmentAction()
  735. default:
  736. self.leftAlignmentAction()
  737. }
  738. }
  739. @objc func resetTextPresuppositionButtonAction(sender: NSButton) {
  740. let state = self.textPresuppositionResetVC?.state ?? .None
  741. if state == .Disabled {
  742. return
  743. }
  744. var popViewDataArr: [String] = []
  745. var dataArray = [NSLocalizedString("Redefine", comment: ""), NSLocalizedString("Reset", comment: "")]
  746. for string in dataArray {
  747. popViewDataArr.append(string)
  748. }
  749. //调整保存参数
  750. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  751. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  752. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  753. var disItems: [String] = dataArray
  754. if model.change || model.redefine {
  755. disItems.removeObject(NSLocalizedString("Reset", comment: ""))
  756. }
  757. if model.change {
  758. disItems.removeObject(NSLocalizedString("Redefine", comment: ""))
  759. }
  760. let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr(popViewDataArr)
  761. vc.background = KMAppearance.Layout.bgColor()
  762. vc.textColor = KMAppearance.Layout.h0Color()
  763. vc.enterFillColor = KMAppearance.Interactive.s0Color()
  764. vc.disItems = disItems
  765. let createFilePopover: NSPopover = NSPopover.init()
  766. createFilePopover.contentViewController = vc
  767. createFilePopover.animates = true
  768. createFilePopover.behavior = .semitransient
  769. createFilePopover.setValue(true, forKey: "shouldHideAnchor")
  770. 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)
  771. // vc.customBoxWidthLayoutConstraint.constant = self.popWidth ?? sender.frame.width
  772. vc.downCallback = { [unowned self](downEntered: Bool, count: String) -> Void in
  773. if downEntered {
  774. if count == NSLocalizedString("Reset", comment: "") {
  775. self.resetTextPresuppositionData()
  776. } else if count == NSLocalizedString("Redefine", comment: "") {
  777. self.reDefineTextPresuppositionData()
  778. }
  779. createFilePopover.close()
  780. }
  781. }
  782. }
  783. func updateTextTextPresuppositionState() {
  784. let areas = self.selectAreas.first
  785. if areas is CPDFEditTextArea {
  786. var size: CGFloat = (abs(self.listView.editingSelectionFontSize(byRangeEdit: areas as? CPDFEditTextArea)))
  787. var fontName = self.listView.editingSelectionCFont(byRangeEdit: areas as? CPDFEditTextArea)?.familyName ?? "Helvetica"
  788. // fontName = KMEditPDFTextManager.manager.transformAreaTextFontName(fontName: fontName, fontNames: self.fontNameVC?.items ?? [])
  789. if let data = self.listView?.isBoldCurrentSelection(byRangeEdit: areas as? CPDFEditTextArea), data {
  790. fontName += "-Bold"
  791. }
  792. if let data = self.listView?.isItalicCurrentSelection(byRangeEdit: areas as? CPDFEditTextArea), data {
  793. fontName += "-Italic"
  794. }
  795. let models = KMEditPDFTextManager.manager.fetchAllUserDefaultData()
  796. var index = 0
  797. for i in 0...models.count - 1 {
  798. let model = models[i]
  799. if model.fontName == fontName && size == model.fontSize {
  800. index = i
  801. }
  802. }
  803. //刷新样式
  804. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  805. textPresuppositionVC?.selectItem(at: index)
  806. }
  807. }
  808. }
  809. //MARK: - Update
  810. extension KMEditPDFTextPropertyViewController {
  811. func updateAlignment(alignment: NSTextAlignment) {
  812. if self.alignment != alignment {
  813. let areas = self.handdler?.editingTextAreas ?? []
  814. if areas.count > 0 {
  815. for area in areas {
  816. self.listView.setCurrentSelectionAlignment(alignment, with: area)
  817. }
  818. } else {
  819. KMEditPDFTextManager.manager.setFontAlignment(alignment: alignment)
  820. }
  821. self.alignment = alignment
  822. self.updatePreviewImage()
  823. }
  824. }
  825. func updateTextPresupposition(type: KMEditPDFTextFontType, needChangeListView: Bool = true) {
  826. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  827. let fontName: String = model.fontName
  828. let size: CGFloat = model.fontSize
  829. self.updateTextPresupposition(fontName: fontName, size: size, needChangeListView: needChangeListView)
  830. //刷新样式
  831. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  832. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  833. if type == .customize || type == .commonly {
  834. self.textPresuppositionResetVC?.state = .Disabled
  835. } else {
  836. self.textPresuppositionResetVC?.state = .Norm
  837. }
  838. }
  839. }
  840. extension KMEditPDFTextPropertyViewController: KMSelectPopButtonDelegate {
  841. func km_comboBoxSelectionDidChange(_ obj: KMDesignSelect) {
  842. if obj == textPresuppositionVC {
  843. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[obj.indexOfSelectedItem])
  844. self.updateTextPresupposition(type: type)
  845. } else if obj == fontNameVC {
  846. self.updateFontNameAndStyle(name: obj.stringValue, style: fontStyle)
  847. self.updatePreviewImage()
  848. let win = KMEditPDFPopToolBarWindow.shared
  849. if win.isVisible {
  850. (win.contentViewController as? KMEditPDFPopToolBarController)?.toolbarView?.reloadData()
  851. }
  852. } else if obj == fontSizeVC {
  853. let size = CGFloat(Float((obj.stringValue.replacingOccurrences(of: "pt", with: "")))!)
  854. self.updateFontSize(size: size)
  855. self.updatePreviewImage()
  856. } else if obj == fontStyleVC {
  857. self.updateFontNameAndStyle(name: fontName, style: obj.stringValue)
  858. self.updatePreviewImage()
  859. } else if obj == self.opacitVC {
  860. let stringValue = self.opacitVC?.stringValue ?? ""
  861. let value = (stringValue.components(separatedBy: "%").first?.stringToCGFloat() ?? 0) / 100
  862. let view = self.opacityBox.contentView as? KMSliderItemView
  863. view?.doubleValue = Double(value)
  864. let areas = self.listView.editingAreas() as? [CPDFEditArea] ?? []
  865. for area in areas {
  866. self.listView.setOpacityEditArea(area, opacity: value)
  867. }
  868. }
  869. }
  870. func km_controlTextDidChange(_ obj: KMDesignSelect) {
  871. if obj == self.fontSizeVC {
  872. let format = NumberFormatter()
  873. format.numberStyle = .decimal
  874. var string = obj.stringValue.replacingOccurrences(of: "pt", with: "")
  875. string = string.replacingOccurrences(of: "p", with: "")
  876. let size = max(Float(string) ?? 1, 1)
  877. self.fontSizeVC?.stringValue = format.string(from: NSNumber(value: size)) ?? ""
  878. }
  879. }
  880. func km_controlTextDidEndEditing(_ obj: KMDesignSelect) {
  881. if obj == self.fontSizeVC {
  882. var string = obj.stringValue.replacingOccurrences(of: "pt", with: "")
  883. string = string.replacingOccurrences(of: ",", with: "")
  884. let size = Float(string) ?? 1
  885. let sizeValue = max(size, 1)
  886. self.fontSizeVC?.stringValue = String(format: "%.0fpt", sizeValue)
  887. self.updateFontSize(size: size.cgFloat)
  888. }
  889. }
  890. func km_cellViewWillShow(_ obj: KMDesignSelect, _ cellView: KMBox, _ index: Int) {
  891. if obj.isEqual(to: self.textPresuppositionVC) == false {
  892. return
  893. }
  894. if let label = cellView.contentView?.subviews.first as? NSTextField {
  895. /* 14.0 "SFProText-Regular" */
  896. let allValues = KMEditPDFTextFontType.allValues()
  897. let idx = allValues.count-index-1
  898. if idx == 0 { // custom
  899. return
  900. }
  901. guard let value = allValues.safe_element(for: idx) as? String else {
  902. return
  903. }
  904. let type = KMEditPDFTextFontType.typeOfRawValue(value: value)
  905. var fontSize: CGFloat = 0
  906. if type == .h1 {
  907. fontSize = 20
  908. } else if type == .h2 {
  909. fontSize = 18
  910. } else if type == .h3 {
  911. fontSize = 16
  912. } else if type == .b1 {
  913. fontSize = 14
  914. } else if type == .b2 {
  915. fontSize = 12
  916. } else if type == .b3 {
  917. fontSize = 10
  918. }
  919. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  920. let fontName: String = model.fontName
  921. // let size: CGFloat = model.fontSize
  922. let bold = fontName.contains("Bold")
  923. let italic = fontName.contains("Oblique") || fontName.contains("Italic")
  924. let attri = NSMutableAttributedString(attributedString: label.attributedStringValue)
  925. if bold {
  926. attri.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: fontSize), range: NSMakeRange(0, attri.string.count))
  927. } else {
  928. attri.addAttribute(.font, value: NSFont.systemFont(ofSize: fontSize), range: NSMakeRange(0, attri.string.count))
  929. }
  930. if italic {
  931. attri.addAttribute(.obliqueness, value: 0.3, range: NSMakeRange(0, attri.string.count))
  932. }
  933. label.attributedStringValue = attri
  934. }
  935. }
  936. func km_SelectPopoverWillShow(_ obj: KMDesignSelect) {
  937. if obj.isEqual(to: self.fontNameVC) {
  938. self._trackEvent()
  939. } else if obj.isEqual(to: self.fontStyleVC) {
  940. self._trackEvent()
  941. } else if obj.isEqual(to: self.fontSizeVC) {
  942. self._trackEvent()
  943. }
  944. }
  945. }
  946. //MARK: - TextPresupposition
  947. extension KMEditPDFTextPropertyViewController {
  948. //MARK: 基本属性调整
  949. func updateTextPresupposition(fontName: String, size: CGFloat, needChangeListView: Bool = true) {
  950. let fontNameArray = fontName.components(separatedBy: "-")
  951. var name = ""
  952. var style = ""
  953. if fontNameArray.count > 0 {
  954. name = fontNameArray.first!
  955. } else {
  956. name = "Helvetica"
  957. }
  958. if fontNameArray.count == 4 {
  959. style = "\(fontNameArray[2]) \(fontNameArray[3])"
  960. } else if fontNameArray.count == 3 {
  961. style = "\(fontNameArray[1]) \(fontNameArray[2])"
  962. } else if fontNameArray.count == 2 {
  963. style = fontNameArray.last!
  964. } else {
  965. style = "Regular"
  966. }
  967. self.updateFontNameAndStyle(name: name, style: style, needChangeListView: needChangeListView, needSave: false)
  968. self.updateFontSize(size: size, needChangeListView: needChangeListView, needSave: false)
  969. self.updatePreviewImage()
  970. }
  971. func resetTextPresuppositionData() {
  972. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  973. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  974. KMEditPDFTextManager.manager.resetTextPresupposition(type: type)
  975. self.updateTextPresupposition(type: type)
  976. }
  977. func reDefineTextPresuppositionData(redefine: Bool = true) {
  978. let fontStyle = self.fontStyle
  979. let fontName = self.fontName + "-" + fontStyle
  980. let fontSize = self.fontSize
  981. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  982. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  983. KMEditPDFTextManager.manager.reDefineTextPresupposition(fontName: fontName,
  984. fontSize: fontSize,
  985. type: type)
  986. self.updateTextPresupposition(type: type)
  987. }
  988. }
  989. //MARK: - Private
  990. extension KMEditPDFTextPropertyViewController {
  991. func updateFontNameAndStyle(name: String, style: String, needChangeListView: Bool = true, needSave: Bool = true) {
  992. // if fontName != name || fontStyle != style {
  993. // let styleArray = defaultFontStyles //KMEditPDFTextManager.manager.fetchFontStyleWithFontName(fontName: name)
  994. var styleString = KMEditPDFTextManager.manager.checkFontStyle(style: style)
  995. let fontStyleNames = CPDFFont.fontNames(forFamilyName: name)
  996. if !fontStyleNames.contains(style) {
  997. self.fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  998. self.fontStyleVC?.selectItem(at: 0)
  999. styleString = KMEditPDFTextManager.manager.checkFontStyle(style: self.fontStyleVC!.stringValue)
  1000. } else {
  1001. self.fontStyleVC?.addItems(withObjectValues: fontStyleNames)
  1002. self.fontStyleVC?.selectItem(at: fontStyleNames.firstIndex(of: style) ?? 0)
  1003. }
  1004. var fontName = "\(name)-\(styleString)"
  1005. if styleString.count == 0 {
  1006. fontName = name
  1007. }
  1008. //数据保存返回
  1009. if self.selectAreas.count > 0 {
  1010. if needChangeListView {
  1011. let areas = self.handdler?.editingTextAreas ?? []
  1012. for area in areas {
  1013. self.listView.setEditingSelectionFontName(name, with: area)
  1014. if styleString.contains("Bold") {
  1015. self.listView.setCurrentSelectionIsBold(true, with: area)
  1016. } else {
  1017. self.listView.setCurrentSelectionIsBold(false, with: area)
  1018. }
  1019. if styleString.contains("Oblique") || styleString.contains("Italic") {
  1020. self.listView.setCurrentSelectionIsItalic(true, with: area)
  1021. } else {
  1022. self.listView.setCurrentSelectionIsItalic(false, with: area)
  1023. }
  1024. }
  1025. }
  1026. } else {
  1027. if needSave {
  1028. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  1029. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: fontName, fontSize: model.fontSize, type: .commonly)
  1030. }
  1031. }
  1032. self.fontName = name
  1033. self.fontStyle = self.fontStyleVC?.stringValue ?? "Regular"
  1034. if needSave {
  1035. //调整保存参数
  1036. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1037. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1038. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  1039. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: fontName, fontSize: model.fontSize, type: type)
  1040. }
  1041. //刷新样式
  1042. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  1043. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  1044. // }
  1045. self._boldButtonStateUpdate(fontStyle: styleString)
  1046. self._italicButtonStateUpdate(fontStyle: styleString)
  1047. }
  1048. func updateFontSize(size: CGFloat, needChangeListView: Bool = true, needSave: Bool = true) {
  1049. // var fontSize = Float((self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: ""))!) ?? 8.0
  1050. if fontSize != size {
  1051. let areas = self.handdler?.editingTextAreas ?? []
  1052. if areas.count > 0 {
  1053. if needChangeListView {
  1054. for area in areas {
  1055. self.listView.setEditingSelectionFontSize(size, with: area, isAutoSize: false)
  1056. }
  1057. }
  1058. } else {
  1059. if needSave {
  1060. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: .commonly)
  1061. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: model.fontName, fontSize: size, type: .commonly)
  1062. }
  1063. }
  1064. self.fontSize = size
  1065. if needSave {
  1066. let index = self.textPresuppositionVC?.indexOfSelectedItem ?? 0
  1067. let type = KMEditPDFTextFontType.typeOfRawValue(value: KMEditPDFTextFontType.allValues()[index])
  1068. let model = KMEditPDFTextManager.manager.fetchUserDefaultData(type: type)
  1069. KMEditPDFTextManager.manager.changeTextPresupposition(fontName: model.fontName, fontSize: size, type: type)
  1070. }
  1071. //刷新样式
  1072. textPresuppositionVC?.addItems(withObjectValues: KMEditPDFTextManager.manager.updateTextPresuppositionFontNameArray())
  1073. textPresuppositionVC?.selectItem(at: textPresuppositionVC!.indexOfSelectedItem)
  1074. }
  1075. }
  1076. // Bold
  1077. private func _boldButtonStateUpdate(fontStyle fStyle: String) {
  1078. let fontStyleNames = self.fontStyleVC?.items ?? []
  1079. var hasBold = false
  1080. for name in fontStyleNames {
  1081. if name.contains("Bold") {
  1082. hasBold = true
  1083. break
  1084. }
  1085. }
  1086. if !hasBold {
  1087. // self.fontBoldVC?.state = .Disabled
  1088. return
  1089. }
  1090. let bold = fStyle.contains("Bold")
  1091. // self.fontBoldVC?.state = bold ? .Act : .Norm
  1092. }
  1093. private func _italicButtonStateUpdate(fontStyle fStyle: String) {
  1094. let fontStyleNames = self.fontStyleVC?.items ?? []
  1095. var hasItalic = false
  1096. for name in fontStyleNames {
  1097. if name.contains("Italic") || name.contains("Oblique") {
  1098. hasItalic = true
  1099. break
  1100. }
  1101. }
  1102. if !hasItalic {
  1103. // self.fontItalicVC?.state = .Disabled
  1104. return
  1105. }
  1106. let italic = fStyle.contains("Italic") || fStyle.contains("Oblique")
  1107. // self.fontItalicVC?.state = italic ? .Act : .Norm
  1108. }
  1109. //MARK: 刷新预览图片
  1110. private func updatePreviewImage() {
  1111. var alignment = self.alignment
  1112. var fontSize = Float((self.fontSizeVC?.stringValue.replacingOccurrences(of: "pt", with: ""))!) ?? 1.0
  1113. var fontName = self.fontNameVC?.stringValue ?? "Sample"
  1114. let fontStyle = KMEditPDFTextManager.manager.checkFontStyle(style: self.fontStyleVC?.stringValue ?? "")
  1115. let fontCurrentColor = self.currentColor
  1116. fontName = KMEditPDFTextManager.manager.checkFontName(fontName: (fontName + "-" + fontStyle))
  1117. fontSize = max(fontSize, 8)
  1118. let editringareas = self.selectAreas
  1119. let count = editringareas.count
  1120. // let editingSelectionString = self.listView.editingSelectionString()
  1121. let editingSelectionAlignment = self.listView.editingSelectionAlignment(with: editringareas.first as? CPDFEditTextArea)
  1122. if count == 1 {
  1123. let areas = editringareas.first
  1124. if areas is CPDFEditTextArea {
  1125. // string = editingSelectionString ?? NSLocalizedString("Sample", comment: "")
  1126. alignment = editingSelectionAlignment
  1127. }
  1128. }
  1129. let image = KMEditPDFTextManager.manager.fetchTextImage(alignment: .center,
  1130. fontName: fontName,
  1131. fontSize: CGFloat(fontSize),
  1132. color: fontCurrentColor,
  1133. imageSize: self.preImageView.frame.size)
  1134. self.preImageView.image = image
  1135. }
  1136. func supportFontSize() -> [String] {
  1137. return ["8pt", "9pt", "10pt", "11pt", "12pt", "14pt", "16pt", "18pt", "20pt", "22pt", "24pt", "26pt", "28pt", "36pt", "48pt", "72pt"]
  1138. }
  1139. private func _trackEvent() {
  1140. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditText":"SubTbr_EditText_PropertiesPanel_All"])
  1141. }
  1142. private func _trackAlignEvent() {
  1143. kTrackEventManager.trackEvent(event: "SubTbr_EditPDF", withProperties: ["SubTbr_EditText":"SubTbr_EditContent_AlignContent"])
  1144. }
  1145. }