KMPurchaseFirstTrialWindowController.swift 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. //
  2. // KMPurchaseFirstTrialWindowController.swift
  3. // PDF Reader Pro Edition
  4. //
  5. // Created by zenghong on 11/22/23.
  6. //
  7. import Cocoa
  8. @objc class KMPurchaseFirstTrialWindowController: NSWindowController,NSTextFieldDelegate,NSTextViewDelegate {
  9. @IBOutlet weak var contentImageView: NSImageView!
  10. @IBOutlet weak var titleField: NSTextField!
  11. @IBOutlet weak var rView: NSView!
  12. @IBOutlet weak var trialTitleField: NSTextField!
  13. @IBOutlet weak var trialMessageField: NSTextField!
  14. @IBOutlet weak var trialFeaturesField: NSTextField!
  15. @IBOutlet weak var imageView1: NSImageView!
  16. @IBOutlet weak var imageView2: NSImageView!
  17. @IBOutlet weak var imageView3: NSImageView!
  18. @IBOutlet weak var imageView4: NSImageView!
  19. @IBOutlet weak var imageView5: NSImageView!
  20. @IBOutlet weak var imageView6: NSImageView!
  21. @IBOutlet weak var imageView7: NSImageView!
  22. @IBOutlet weak var features1Field: NSTextField!
  23. @IBOutlet weak var features2Field: NSTextField!
  24. @IBOutlet weak var features3Field: NSTextField!
  25. @IBOutlet weak var features4Field: NSTextField!
  26. @IBOutlet weak var features5Field: NSTextField!
  27. @IBOutlet weak var features6Field: NSTextField!
  28. @IBOutlet weak var nameTextFieldView: NSView!
  29. @IBOutlet weak var nameTextField: NSTextField!
  30. @IBOutlet weak var nameInvalidLabel: NSTextField!
  31. @IBOutlet weak var emailTextFieldView: NSView!
  32. @IBOutlet weak var emailTextField: NSTextField!
  33. @IBOutlet weak var emailInvalidLabel: NSTextField!
  34. @IBOutlet var bottomTextView: NSTextView! //CustomTextView!
  35. @IBOutlet weak var btnBox: NSBox!
  36. @IBOutlet weak var activateTrialNowBtn: KMButton!
  37. @IBOutlet weak var buyNowBox: NSBox!
  38. @IBOutlet weak var buyNowBtn: HyperLinkButton!
  39. @IBOutlet weak var enterLicenseBox: NSBox!
  40. @IBOutlet weak var enterLicenseBtn: HyperLinkButton!
  41. @objc var buttonActionBlock: ((_ firstTrialWinVC: KMPurchaseFirstTrialWindowController, _ btn: KMButton, _ email : String, _ name : String)->Void)?
  42. //MARK: 打开文件
  43. @objc static func currentFirstTrialWC() -> KMPurchaseFirstTrialWindowController {
  44. if let controller: KMPurchaseFirstTrialWindowController = KMPurchaseFirstTrialWindowController.fetchSampleController() {
  45. return controller
  46. } else {
  47. let purchaseLimitWC: KMPurchaseFirstTrialWindowController = KMPurchaseFirstTrialWindowController.init(windowNibName: "KMPurchaseFirstTrialWindowController")
  48. return purchaseLimitWC
  49. }
  50. }
  51. static func fetchSampleController() -> KMPurchaseFirstTrialWindowController? {
  52. for window in NSApp.windows {
  53. let controller = window.windowController
  54. if controller is KMPurchaseFirstTrialWindowController {
  55. return controller as? KMPurchaseFirstTrialWindowController
  56. }
  57. }
  58. return nil
  59. }
  60. deinit {
  61. DistributedNotificationCenter.default.removeObserver(self)
  62. NotificationCenter.default.removeObserver(self)
  63. }
  64. override func windowDidLoad() {
  65. super.windowDidLoad()
  66. DistributedNotificationCenter.default.addObserver(self, selector: #selector(themeChanged(_:)), name: NSNotification.Name(rawValue:"AppleInterfaceThemeChangedNotification"), object: nil)
  67. NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeVisible(_:)), name: NSWindow.didBecomeKeyNotification, object: nil)
  68. self.activateTrialNowBtn.tag = 10001
  69. self.buyNowBtn.tag = 10002
  70. self.enterLicenseBtn.tag = 10003
  71. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  72. self.emailTextField.delegate = self
  73. self.nameTextField.delegate = self
  74. self.nameTextFieldView.wantsLayer = true
  75. self.nameTextFieldView.layer?.masksToBounds = true
  76. self.nameTextFieldView.layer?.cornerRadius = 4.0
  77. self.emailTextFieldView.wantsLayer = true
  78. self.emailTextFieldView.layer?.masksToBounds = true
  79. self.emailTextFieldView.layer?.cornerRadius = 4.0
  80. self.bottomTextView.delegate = self;
  81. self.titleField.wantsLayer = true
  82. self.titleField.alphaValue = 0.8
  83. self.imageView2.wantsLayer = true
  84. self.imageView2.alphaValue = 0.8
  85. self.imageView3.wantsLayer = true
  86. self.imageView3.alphaValue = 0.8
  87. self.imageView4.wantsLayer = true
  88. self.imageView4.alphaValue = 0.8
  89. self.imageView5.wantsLayer = true
  90. self.imageView5.alphaValue = 0.8
  91. self.imageView6.wantsLayer = true
  92. self.imageView6.alphaValue = 0.8
  93. self.imageView7.wantsLayer = true
  94. self.imageView7.alphaValue = 0.8
  95. self.features1Field.wantsLayer = true
  96. self.features1Field.alphaValue = 0.8
  97. self.features2Field.wantsLayer = true
  98. self.features2Field.alphaValue = 0.8
  99. self.features2Field.wantsLayer = true
  100. self.features2Field.alphaValue = 0.8
  101. self.features2Field.wantsLayer = true
  102. self.features2Field.alphaValue = 0.8
  103. self.features2Field.wantsLayer = true
  104. self.features2Field.alphaValue = 0.8
  105. self.features2Field.wantsLayer = true
  106. self.features2Field.alphaValue = 0.8
  107. self.reloadData()
  108. }
  109. @objc func reloadData () {
  110. self.titleField.stringValue = NSLocalizedString("Unlock All Advanced Features", comment: "")
  111. let customFont = NSFont(name: "Ubuntu Bold", size: 16)
  112. self.titleField.font = customFont
  113. self.trialTitleField.stringValue = "👋🏻 " + NSLocalizedString("7-day Free Trial", comment: "")
  114. self.trialTitleField.font = NSFont(name: "Ubuntu-Bold", size: 26)
  115. self.trialMessageField.stringValue = NSLocalizedString("PDF Reader Pro offers a 7-day free trial of the full functions.", comment: "")
  116. self.trialMessageField.font = NSFont(name: "SFProText-Regular", size: 14)
  117. self.trialFeaturesField.stringValue = NSLocalizedString("Enter your email to get free trial:", comment: "")
  118. self.trialFeaturesField.font = NSFont(name: "SFProText-Semibold", size: 16)
  119. self.features1Field.stringValue = NSLocalizedString("Edit PDF", comment: "")
  120. self.features2Field.stringValue = NSLocalizedString("Organize pages", comment: "")
  121. self.features3Field.stringValue = NSLocalizedString("Convert PDFs ", comment: "")
  122. self.features4Field.stringValue = NSLocalizedString("Digital signature", comment: "")
  123. self.features5Field.stringValue = NSLocalizedString("Create & fill form", comment: "")
  124. self.features6Field.stringValue = NSLocalizedString("OCR", comment: "")
  125. self.features1Field.font = NSFont(name: "SFProText-Regular", size: 13)
  126. self.features2Field.font = NSFont(name: "SFProText-Regular", size: 13)
  127. self.features3Field.font = NSFont(name: "SFProText-Regular", size: 13)
  128. self.features4Field.font = NSFont(name: "SFProText-Regular", size: 13)
  129. self.features5Field.font = NSFont(name: "SFProText-Regular", size: 13)
  130. self.features6Field.font = NSFont(name: "SFProText-Regular", size: 13)
  131. self.nameTextField.placeholderString = NSLocalizedString("User name", comment: "")
  132. self.emailTextField.placeholderString = NSLocalizedString("Email", comment: "")
  133. self.nameTextField.font = NSFont(name: "SFProText-Regular", size: 14)
  134. self.emailTextField.font = NSFont(name: "SFProText-Regular", size: 14)
  135. self.nameTextField.becomeFirstResponder()
  136. self.nameInvalidLabel.stringValue = NSLocalizedString("Please enter valid username", comment: "")
  137. self.emailInvalidLabel.stringValue = NSLocalizedString("Please enter valid email", comment: "")
  138. self.nameInvalidLabel.isHidden = true
  139. self.emailInvalidLabel.isHidden = true
  140. self.activateTrialNowBtn.title = NSLocalizedString("Apply", comment: "")
  141. self.activateTrialNowBtn.font = NSFont(name: "Ubuntu-Medium", size: 16)
  142. self.buyNowBtn.font = NSFont(name: "SFProText-semibold", size: 14)
  143. self.enterLicenseBtn.font = NSFont(name: "SFProText-semibold", size: 14)
  144. self.rView.wantsLayer = true
  145. self.rView.layer?.cornerRadius = 8
  146. self.rView.layer?.masksToBounds = true
  147. self.btnBox.wantsLayer = true
  148. self.btnBox.layer?.cornerRadius = 24
  149. self.updateViewColor()
  150. }
  151. //MARK: Noti
  152. @objc func themeChanged(_ notification: NSNotification) {
  153. DispatchQueue.main.async {
  154. self.reloadData()
  155. }
  156. }
  157. @objc func windowDidBecomeVisible(_ obj: Notification) {
  158. self.reloadData()
  159. }
  160. @objc func updateViewColor () {
  161. // self.trialMessageField.textColor = KMAppearance.kmColor_Layout_H0()
  162. // self.trialFeaturesField.textColor = KMAppearance.kmColor_Layout_H0()
  163. //
  164. self.features1Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  165. self.features2Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  166. self.features3Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  167. self.features4Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  168. self.features5Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  169. self.features6Field.textColor = NSColor(red: 14.0/255.0, green: 17.0/255.0, blue: 20.0/255.0, alpha: 1)
  170. self.nameTextFieldView.layer?.borderWidth = 1.0
  171. if (KMAppearance.isDarkMode)(){
  172. // self.nameTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  173. // } else {
  174. // self.nameTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  175. }
  176. self.emailTextFieldView.layer?.borderWidth = 1.0
  177. if (KMAppearance.isDarkMode)(){
  178. // self.emailTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  179. // } else {
  180. // self.emailTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  181. }
  182. if (KMAppearance.isDarkMode)() {
  183. // self.nameTextField.textColor = KMAppearance.kmColor_Layout_W0()
  184. // self.emailTextField.textColor = KMAppearance.kmColor_Layout_W0()
  185. //
  186. self.rView.layer?.backgroundColor = NSColor(red: 24.0/255.0, green: 22.0/255.0, blue: 31.0/255.0, alpha: 0.9).cgColor
  187. self.activateTrialNowBtn.title = NSLocalizedString("Free Trial", comment: "")
  188. self.btnBox.fillColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1)
  189. self.btnBox.layer?.backgroundColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1).cgColor
  190. self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1).cgColor
  191. self.activateTrialNowBtn.setTitleColor(NSColor(red: 7.0/255.0, green: 1.0/255.0, blue: 34.0/255.0, alpha: 1))
  192. // self.activateTrialNowBtn.mouseMoveCallback = { (mouseEntered) in
  193. // if mouseEntered {
  194. // self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1).cgColor
  195. // self.btnBox.fillColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1)
  196. // self.btnBox.layer?.backgroundColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1).cgColor
  197. // } else {
  198. // self.btnBox.fillColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1)
  199. // self.btnBox.layer?.backgroundColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1).cgColor
  200. // self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1).cgColor
  201. // }
  202. // }
  203. // self.activateTrialNowBtn.setBaseLineOffset(2)
  204. self.titleField.textColor = NSColor(red: 0.0/255.0, green: 33.0/255.0, blue: 67.0/255.0, alpha: 1)
  205. self.trialTitleField.textColor = NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1)
  206. self.buyNowBtn.title = NSLocalizedString("Buy Now", comment: "")
  207. self.buyNowBtn.setTitleColor(NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1))
  208. // self.buyNowBtn.mouseMoveCallback = { (mouseEntered) in
  209. // if mouseEntered {
  210. // self.buyNowBtn.setTitleColor(NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1))
  211. // } else {
  212. // self.buyNowBtn.setTitleColor(NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1))
  213. // }
  214. // }
  215. self.enterLicenseBtn.title = NSLocalizedString("Enter License", comment: "")
  216. self.enterLicenseBtn.setTitleColor(NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1))
  217. // self.enterLicenseBtn.mouseMoveCallback = { (mouseEntered) in
  218. // if mouseEntered {
  219. // self.enterLicenseBtn.setTitleColor(NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1))
  220. // } else {
  221. // self.enterLicenseBtn.setTitleColor(NSColor(red: 181.0/255.0, green: 177.0/255.0, blue: 239.0/255.0, alpha: 1))
  222. // }
  223. // }
  224. self.nameTextFieldView.layer?.backgroundColor = NSColor(red: 57.0/255.0, green: 58.0/255.0, blue: 70.0/255.0, alpha: 1).cgColor
  225. self.emailTextFieldView.layer?.backgroundColor = NSColor(red: 57.0/255.0, green: 58.0/255.0, blue: 70.0/255.0, alpha: 1).cgColor
  226. let stringValue : String = NSLocalizedString("By applying for free trial, you confirm that you agree this Privacy Policy.", comment: "")
  227. let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: NSLocalizedString("By applying for free trial, you confirm that you agree this Privacy Policy.", comment: ""))
  228. let privacyPolicy : String = NSLocalizedString("Privacy Policy.", comment: "")
  229. let allRange = (stringValue as NSString).range(of: stringValue)
  230. // attributedString.addAttributes([NSAttributedString.Key.foregroundColor : KMAppearance.kmColor_Layout_W70()], range: allRange)
  231. attributedString.addAttributes([NSAttributedString.Key.font :NSFont(name: "SFProText-Regular", size: 12.0) as Any], range: allRange)
  232. let urlString : String = "https://www.pdfreaderpro.com/privacy-policy"
  233. let encodedURLString : String = urlString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
  234. let linkRange = (stringValue as NSString).range(of: privacyPolicy)
  235. attributedString.addAttribute(.link, value: NSURL(string: encodedURLString)!, range: linkRange)
  236. attributedString.addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: linkRange)
  237. self.bottomTextView.linkTextAttributes = [
  238. // NSAttributedString.Key.foregroundColor: KMAppearance.kmColor_Interactive_A0(),
  239. NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
  240. ]
  241. self.bottomTextView.textStorage?.setAttributedString(attributedString)
  242. self.bottomTextView.isEditable = false // TextView不可编辑
  243. self.bottomTextView.isSelectable = true // TextView可选择
  244. self.bottomTextView.sizeToFit()
  245. } else {
  246. // self.nameTextField.textColor = KMAppearance.kmColor_Layout_H0()
  247. // self.emailTextField.textColor = KMAppearance.kmColor_Layout_H0()
  248. self.rView.layer?.backgroundColor = NSColor(red: 248.0/255.0, green: 249.0/255.0, blue: 255.0/255.0, alpha: 1).cgColor
  249. self.btnBox.fillColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1)
  250. self.btnBox.layer?.backgroundColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1).cgColor
  251. self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1).cgColor
  252. self.activateTrialNowBtn.setTitleColor(NSColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1))
  253. // self.activateTrialNowBtn.mouseMoveCallback = { (mouseEntered) in
  254. // if mouseEntered {
  255. // self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 0.0/255.0, green: 207.0/255.0, blue: 133.0/255.0, alpha: 1).cgColor
  256. // self.btnBox.fillColor = NSColor(red: 0.0/255.0, green: 207.0/255.0, blue: 133.0/255.0, alpha: 1)
  257. // self.btnBox.layer?.backgroundColor = NSColor(red: 0.0/255.0, green: 207.0/255.0, blue: 133.0/255.0, alpha: 1).cgColor
  258. // } else {
  259. // self.activateTrialNowBtn.layer?.backgroundColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1).cgColor
  260. // self.btnBox.fillColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1)
  261. // self.btnBox.layer?.backgroundColor = NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1).cgColor
  262. // }
  263. // }
  264. self.titleField.textColor = NSColor(red: 0.0/255.0, green: 33.0/255.0, blue: 67.0/255.0, alpha: 1)
  265. self.trialTitleField.textColor = NSColor(red: 0.0/255.0, green: 33.0/255.0, blue: 67.0/255.0, alpha: 1)
  266. self.buyNowBtn.title = NSLocalizedString("Buy Now", comment: "")
  267. self.buyNowBtn.setTitleColor(NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1))
  268. // self.buyNowBtn.mouseMoveCallback = { (mouseEntered) in
  269. // if mouseEntered {
  270. // self.buyNowBtn.setTitleColor(NSColor(red: 8.0/255.0, green: 124.0/255.0, blue: 255.0/255.0, alpha: 1))
  271. // } else {
  272. // self.buyNowBtn.setTitleColor(NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1))
  273. // }
  274. // }
  275. self.enterLicenseBtn.title = NSLocalizedString("Enter License", comment: "")
  276. self.enterLicenseBtn.setTitleColor(NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1))
  277. // self.enterLicenseBtn.mouseMoveCallback = { (mouseEntered) in
  278. // if mouseEntered {
  279. // self.enterLicenseBtn.setTitleColor(NSColor(red: 8.0/255.0, green: 124.0/255.0, blue: 255.0/255.0, alpha: 1))
  280. // } else {
  281. // self.enterLicenseBtn.setTitleColor(NSColor(red: 39.0/255.0, green: 60.0/255.0, blue: 98.0/255.0, alpha: 1))
  282. // }
  283. // }
  284. self.nameTextFieldView.layer?.backgroundColor = NSColor(red: 235.0/255.0, green: 236.0/255.0, blue: 250.0/255.0, alpha: 1).cgColor
  285. self.emailTextFieldView.layer?.backgroundColor = NSColor(red: 235.0/255.0, green: 236.0/255.0, blue: 250.0/255.0, alpha: 1).cgColor
  286. let stringValue : String = NSLocalizedString("By applying for free trial, you confirm that you agree this Privacy Policy.", comment: "")
  287. let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: NSLocalizedString("By applying for free trial, you confirm that you agree this Privacy Policy.", comment: ""))
  288. let privacyPolicy : String = NSLocalizedString("Privacy Policy.", comment: "")
  289. let urlString : String = "https://www.pdfreaderpro.com/privacy-policy"
  290. let encodedURLString : String = urlString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed)!
  291. let linkRange = (stringValue as NSString).range(of: privacyPolicy)
  292. attributedString.addAttribute(NSAttributedString.Key.link, value: NSURL(string: encodedURLString)!, range: linkRange)
  293. attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: linkRange)
  294. let allRange = (stringValue as NSString).range(of: stringValue)
  295. // attributedString.addAttributes([NSAttributedString.Key.foregroundColor : KMAppearance.kmColor_Layout_H1()], range: allRange)
  296. attributedString.addAttributes([NSAttributedString.Key.font :NSFont(name: "SFProText-Regular", size: 12.0) as Any], range: allRange)
  297. // 设置悬停时链接文本颜色
  298. // let hoverColor = NSColor.blue
  299. // attributedString.addAttribute(NSAttributedString.Key(rawValue: "NSMouseInRectAttribute"), value: hoverColor, range: linkRange)
  300. // 设置TextView的富文本属性
  301. self.bottomTextView.linkTextAttributes = [
  302. // NSAttributedString.Key.foregroundColor: KMAppearance.kmColor_Interactive_A0(),
  303. NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue
  304. ]
  305. self.bottomTextView.textStorage?.setAttributedString(attributedString)
  306. self.bottomTextView.isEditable = false // TextView不可编辑
  307. self.bottomTextView.isSelectable = true // TextView可选择
  308. self.bottomTextView.sizeToFit()
  309. }
  310. self.buyNowBtn.sizeToFit()
  311. self.enterLicenseBtn.sizeToFit()
  312. }
  313. func validateEmail(_ strEmail: String) -> Bool {
  314. let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
  315. let emailTest: NSPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex)
  316. return emailTest.evaluate(with: strEmail)
  317. }
  318. //MARK: Btn Action
  319. @IBAction func activateTrialNowAction(_ sender: KMButton) {
  320. guard let callBack = self.buttonActionBlock else {
  321. return
  322. }
  323. var isValidate: Bool = true
  324. if self.validateEmail(self.emailTextField.stringValue) == true {
  325. self.emailInvalidLabel.isHidden = true
  326. isValidate = true && isValidate
  327. } else {
  328. self.emailInvalidLabel.isHidden = false
  329. isValidate = false && isValidate
  330. }
  331. if self.nameTextField.stringValue.isEmpty == false {
  332. self.nameInvalidLabel.isHidden = true
  333. isValidate = true && isValidate
  334. } else {
  335. self.nameInvalidLabel.isHidden = false
  336. isValidate = false && isValidate
  337. }
  338. if isValidate == false {
  339. return
  340. }
  341. callBack(self,sender,self.emailTextField.stringValue,self.nameTextField.stringValue)
  342. // FMTrackEventManager.default().trackOnceEvent("PUW", withProperties: ["PUW_Btn":"Btn_PUW_ActivateTrialNow"])
  343. }
  344. @IBAction func buyNowAction(_ sender: HyperLinkButton) {
  345. guard let callBack = self.buttonActionBlock else {
  346. return
  347. }
  348. callBack(self,sender,self.emailTextField.stringValue,self.nameTextField.stringValue)
  349. // FMTrackEventManager.default().trackOnceEvent("PUW", withProperties: ["PUW_Btn":"Btn_PUW_BuyNow"])
  350. }
  351. @IBAction func enterLicenseAction(_ sender: HyperLinkButton) {
  352. guard let callBack = self.buttonActionBlock else {
  353. return
  354. }
  355. callBack(self,sender,self.emailTextField.stringValue,self.nameTextField.stringValue)
  356. // FMTrackEventManager.default().trackOnceEvent("PUW", withProperties: ["PUW_Btn":"Btn_PUW_Enter_The_License"])
  357. }
  358. //MARK: NSTextFieldDelegate
  359. func controlTextDidChange(_ obj: Notification) {
  360. // if obj.object == nil {
  361. // return
  362. // }
  363. // let textField = obj.object as! NSTextField
  364. // if self.emailTextField.isEqual(textField) {
  365. // self.emailInvalidLabel.isHidden = true
  366. //
  367. // self.nameTextFieldView.layer?.borderWidth = 0.0
  368. // if (KMAppearance.isDarkMode)(){
  369. // self.nameTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  370. // } else {
  371. // self.nameTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  372. // }
  373. //
  374. // self.emailTextFieldView.layer?.borderWidth = 1.0
  375. // if (KMAppearance.isDarkMode)(){
  376. // self.emailTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  377. // } else {
  378. // self.emailTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  379. // }
  380. //
  381. // }
  382. //
  383. // if self.nameTextField.isEqual(textField) {
  384. // self.nameInvalidLabel.isHidden = true
  385. //
  386. // self.nameTextFieldView.layer?.borderWidth = 1.0
  387. // if (KMAppearance.isDarkMode)(){
  388. // self.nameTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  389. // } else {
  390. // self.nameTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  391. // }
  392. //
  393. // self.emailTextFieldView.layer?.borderWidth = 0.0
  394. // if (KMAppearance.isDarkMode)(){
  395. // self.emailTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  396. // } else {
  397. // self.emailTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  398. // }
  399. // }
  400. }
  401. func controlTextDidEndEditing(_ obj: Notification) {
  402. // let fied: NSTextField = obj.object as! NSTextField;
  403. // if fied.isEqual(self.emailTextField) {
  404. // if self.validateEmail(self.emailTextField.stringValue) == true {
  405. // self.emailInvalidLabel.isHidden = true
  406. // } else {
  407. // self.emailInvalidLabel.isHidden = false;
  408. // }
  409. // self.nameTextFieldView.layer?.borderWidth = 1.0
  410. // if (KMAppearance.isDarkMode)(){
  411. // self.nameTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  412. // } else {
  413. // self.nameTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  414. // }
  415. //
  416. // self.emailTextFieldView.layer?.borderWidth = 0.0
  417. // if (KMAppearance.isDarkMode)(){
  418. // self.emailTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  419. // } else {
  420. // self.emailTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  421. // }
  422. // }
  423. // if fied.isEqual(self.nameTextField) {
  424. // if self.nameTextField.stringValue.isEmpty == false {
  425. // self.nameInvalidLabel.isHidden = true
  426. // } else {
  427. // self.nameInvalidLabel.isHidden = false;
  428. // }
  429. // self.nameTextFieldView.layer?.borderWidth = 0.0
  430. // if (KMAppearance.isDarkMode)(){
  431. // self.nameTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  432. // } else {
  433. // self.nameTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  434. // }
  435. //
  436. // self.emailTextFieldView.layer?.borderWidth = 1.0
  437. // if (KMAppearance.isDarkMode)(){
  438. // self.emailTextFieldView.layer?.borderColor = KMAppearance.kmColor_Layout_W30().cgColor
  439. // } else {
  440. // self.emailTextFieldView.layer?.borderColor = NSColor(red: 0.0/255.0, green: 85.0/255.0, blue: 251.0/255.0, alpha: 1).cgColor
  441. // }
  442. // }
  443. }
  444. func textView(_ textView: NSTextView, clickedOnLink link: Any, at charIndex: Int) -> Bool {
  445. guard let url = link as? URL else {
  446. return false
  447. }
  448. NSWorkspace.shared.open(url)
  449. return true
  450. }
  451. }