KMGeneralPreferences.swift 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. //
  2. // KMGeneralPreferences.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2023/11/6.
  6. //
  7. import Cocoa
  8. class KMGeneralPreferences: NSViewController {
  9. /*
  10. #define @""
  11. #define AUTOMATICALLYCHECKSFORUPDATES_KEY @"automaticallyChecksForUpdates"
  12. #define UPDATECHECKINTERVAL_KEY @"updateCheckInterval"
  13. */
  14. private let UPDATEINTERVAL_KEY = "updateInterval"
  15. private let SUScheduledCheckIntervalKey = "SUScheduledCheckInterval"
  16. @IBOutlet weak var authorLabel: NSTextField!
  17. @IBOutlet weak var authorTextField: NSTextField!
  18. @IBOutlet weak var openTabLabel: NSTextField!
  19. @IBOutlet weak var openTabButton: NSPopUpButton!
  20. @IBOutlet weak var showConvertMenuButton: NSButton!
  21. @IBOutlet weak var defaultOpenButton: NSButton!
  22. @IBOutlet weak var reopenLastOpenFilesButton: NSButton!
  23. @IBOutlet weak var autoSaveLbl: NSTextField!
  24. @IBOutlet weak var autoSaveInfoBtn: NSButton!
  25. @IBOutlet weak var autoSaveSlider: NSSlider!
  26. @IBOutlet weak var openFilesLabelField: NSTextField!
  27. @IBOutlet weak var openFilesMatrix: NSMatrix!
  28. @IBOutlet weak var openFileForDefaultButton: NSButtonCell!
  29. @IBOutlet weak var openFileForMaximButton: NSButtonCell!
  30. @IBOutlet weak var openFileForFitButton: NSButtonCell!
  31. @IBOutlet weak var showLeftSideButton: NSButton!
  32. @IBOutlet weak var rememberSnapshotButton: NSButton!
  33. @IBOutlet weak var normalButton: NSButton!
  34. @IBOutlet weak var fullScreenButton: NSButton!
  35. @IBOutlet weak var autoSaveNotesBackupButton: NSButton!
  36. @IBOutlet weak var keepSnapshotOnTopButton: NSButton!
  37. @IBOutlet var savePasswordsMatrix: NSMatrix!
  38. @IBOutlet weak var savePwdForAlwaysButton: NSButtonCell!
  39. @IBOutlet weak var savePwdForNeverButton: NSButtonCell!
  40. @IBOutlet weak var savePwdForAskButton: NSButtonCell!
  41. @IBOutlet var updateIntervalPopUpButton: NSPopUpButton!
  42. @IBOutlet var updateIntervalLabelField: NSTextField!
  43. var revertPDFSettingsButtons: [NSButton] = []
  44. var updateInterval: Int = 0 {
  45. didSet {
  46. }
  47. }
  48. /*
  49. @interface KMGeneralPreferences : NSViewController <SKPreferencePane> {
  50. NSInteger updateInterval;
  51. }
  52. - (IBAction)revertPDFViewSettings:(id)sender;
  53. - (IBAction)revertFullScreenPDFViewSettings:(id)sender;
  54. */
  55. /*
  56. static char KMGeneralPreferencesDefaultsObservationContext;
  57. static char KMGeneralPreferencesUpdaterObservationContext;
  58. @interface KMGeneralPreferences (Private)
  59. - (void)synchronizeUpdateInterval;
  60. - (void)updateRevertButtons;
  61. @end
  62. */
  63. deinit {
  64. KMPrint("KMGeneralPreferences deinit.")
  65. /*
  66. @try {
  67. [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeys:[NSArray arrayWithObjects:SKStringConstants.defaultPDFDisplaySettingsKey, SKStringConstants.defaultFullScreenPDFDisplaySettingsKey, nil]];
  68. #if VERSION_DMG
  69. [[SUUpdater sharedUpdater] removeObserver:self forKeyPath:AUTOMATICALLYCHECKSFORUPDATES_KEY];
  70. [[SUUpdater sharedUpdater] removeObserver:self forKeyPath:UPDATECHECKINTERVAL_KEY];
  71. #endif
  72. }
  73. @catch(id e) {}
  74. */
  75. }
  76. override var nibName: NSNib.Name? {
  77. return "GeneralPreferences"
  78. }
  79. override func loadView() {
  80. super.loadView()
  81. // self.showConvertMenuButton.state = [KMStatusBar systemStatusBar].isShow ? NSControlStateValueOn : NSControlStateValueOff;
  82. #if VERSION_FREE
  83. if IAPProductsManager.default().isAvailableAllFunction() == false {
  84. KMPreference.shared.openDocumentType = .newWindow
  85. }
  86. #endif
  87. // [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeys:[NSArray arrayWithObjects:SKStringConstants.defaultPDFDisplaySettingsKey, SKStringConstants.defaultFullScreenPDFDisplaySettingsKey, nil] context:&KMGeneralPreferencesDefaultsObservationContext];
  88. // [NSUserDefaultsController sharedUserDefaultsController]
  89. #if VERSION_DMG
  90. // [[SUUpdater sharedUpdater] addObserver:self forKeyPath:AUTOMATICALLYCHECKSFORUPDATES_KEY options:0 context:&KMGeneralPreferencesUpdaterObservationContext];
  91. // [[SUUpdater sharedUpdater] addObserver:self forKeyPath:UPDATECHECKINTERVAL_KEY options:0 context:&KMGeneralPreferencesUpdaterObservationContext];
  92. #endif
  93. }
  94. override func viewDidLoad() {
  95. super.viewDidLoad()
  96. self.authorLabel.stringValue = KMLocalizedString("Author:", nil)
  97. self.authorTextField.delegate = self
  98. self.authorTextField.stringValue = KMPreferenceManager.shared.author
  99. self.openTabLabel.stringValue = String(format: "%@:", KMLocalizedString("Open a document in", nil))
  100. for item in self.openTabButton.itemArray {
  101. item.title = KMLocalizedString(item.title, nil)
  102. }
  103. self.showConvertMenuButton.title = KMLocalizedString("Show PDF Reader Pro in menu bar", nil)
  104. self.defaultOpenButton.title = KMLocalizedString("Set PDF Reader Pro as the default PDF viewer", nil)
  105. self.defaultOpenButton.state = KMPreference.shared.setDefaultPDFReader ? .on : .off
  106. self.reopenLastOpenFilesButton.state = KMPreference.shared.openLastUnclosedDocumentWhenAppStart ? .on : .off
  107. self.autoSaveInfoBtn.title = KMLocalizedString("Autosave Documents", nil)
  108. self.autoSaveInfoBtn.state = AutoSaveManager.manager.autoSaveEnabled ? .on : .off
  109. self.autoSaveSlider.isEnabled = AutoSaveManager.manager.autoSaveEnabled
  110. if (AutoSaveManager.manager.timeInterval > 1) {
  111. self.autoSaveSlider.floatValue = Float((AutoSaveManager.manager.timeInterval - 1) / 19)
  112. } else {
  113. self.autoSaveSlider.floatValue = 0
  114. }
  115. self.autoSaveLbl.stringValue = String(format: "%.0f %@", AutoSaveManager.manager.timeInterval, KMLocalizedString("minute(s)", nil))
  116. self._selectOpenFileType(KMPreference.shared.openFileType)
  117. self.showLeftSideButton.state = KMPreference.shared.showLeftSideBar ? .on : .off
  118. self.rememberSnapshotButton.state = KMPreference.shared.rememberSnapshot ? .on : .off
  119. self.autoSaveNotesBackupButton.state = KMPreference.shared.autoSaveNoteBackup ? .on : .off
  120. self.keepSnapshotOnTopButton.state = KMPreference.shared.keepSnapshotWindowToTop ? .on : .off
  121. self._selectSavePasswordType(KMPreference.shared.savePasswordType)
  122. self.authorLabel.sizeToFit()
  123. var frame = self.authorTextField.frame
  124. frame.origin.x = CGRectGetMaxX(self.authorLabel.frame)+5
  125. self.authorTextField.frame = frame
  126. self.openTabLabel.sizeToFit()
  127. frame = self.openTabButton.frame
  128. frame.origin.x = CGRectGetMaxX(self.openTabLabel.frame)+5
  129. self.openTabButton.frame = frame
  130. self.openTabButton.isEnabled = true
  131. self.revertPDFSettingsButtons = [self.normalButton, self.fullScreenButton]
  132. KMAutoSizeButtons(self.revertPDFSettingsButtons, rightAlign: false)
  133. _ = KMAutoSizeLabelFields([openFilesLabelField], [openFilesMatrix], false)
  134. let dw = KMAutoSizeLabelFields([updateIntervalLabelField], [updateIntervalPopUpButton], false)
  135. self.openFilesMatrix.sizeToFit()
  136. self.savePasswordsMatrix.sizeToFit()
  137. KMShiftAndResizeView(self.view, dx: 0.0, dw: dw)
  138. self._synchronizeUpdateInterval()
  139. self._updateRevertButtons()
  140. }
  141. @IBAction func revertPDFViewSettings(_ sender: AnyObject?) {
  142. // [[NSUserDefaultsController sharedUserDefaultsController] revertToInitialValueForKey:SKStringConstants.defaultPDFDisplaySettingsKey];
  143. KMPreference.shared.revertInitPDFViewSettingType = .normal
  144. }
  145. @IBAction func revertFullScreenPDFViewSettings(_ sender: AnyObject?) {
  146. // [[NSUserDefaultsController sharedUserDefaultsController] revertToInitialValueForKey:SKStringConstants.defaultFullScreenPDFDisplaySettingsKey];
  147. KMPreference.shared.revertInitPDFViewSettingType = .fullScreen
  148. }
  149. @IBAction func defaultOpenButtonAction(_ sender: AnyObject?) {
  150. KMPreference.shared.setDefaultPDFReader = self.defaultOpenButton.state == .on
  151. }
  152. @IBAction func openTabButtonAction(_ sender: AnyObject?) {
  153. var tabbingMode = NSWindow.TabbingMode.automatic
  154. if (self.openTabButton.indexOfSelectedItem == 0) {
  155. #if VERSION_FREE
  156. if IAPProductsManager.default().isAvailableAllFunction() == false {
  157. // // [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"KMOpenDocumentInTab"];
  158. KMPreference.shared.openDocumentType = .newWindow
  159. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  160. return
  161. }
  162. #endif
  163. tabbingMode = .preferred
  164. } else if (self.openTabButton.indexOfSelectedItem == 1) {
  165. tabbingMode = .disallowed
  166. }
  167. for document in NSDocumentController.shared.documents {
  168. guard let _doc = document as? KMMainDocument else {
  169. continue
  170. }
  171. for windowController in _doc.windowControllers {
  172. // windowController.window?.tabbingMode = tabbingMode
  173. }
  174. }
  175. }
  176. @IBAction func showConvertMenuButtonAction(_ sender: AnyObject?) {
  177. // if ([self.showConvertMenuButton state]) {
  178. // // [KMStatusBar systemStatusBar].isShow = YES;
  179. // } else {
  180. // // [KMStatusBar systemStatusBar].isShow = NO;
  181. // }
  182. KMPreference.shared.showInMenuBar = self.showConvertMenuButton.state == .on
  183. }
  184. @IBAction func reopenLastOpenFilesAtStartupAction(_ sender: NSButton) {
  185. KMPreference.shared.openLastUnclosedDocumentWhenAppStart = sender.state == .on
  186. }
  187. @IBAction func openFileForDefaultAction(_ sender: Any) {
  188. KMPreference.shared.openFileType = .default
  189. }
  190. @IBAction func openFileForMaximAction(_ sender: Any) {
  191. KMPreference.shared.openFileType = .maxim
  192. }
  193. @IBAction func openFileForFitAction(_ sender: Any) {
  194. KMPreference.shared.openFileType = .fit
  195. }
  196. @IBAction func showLeftSideAction(_ sender: Any) {
  197. KMPreference.shared.showLeftSideBar = self.showLeftSideButton.state == .on
  198. }
  199. @IBAction func rememberSnapshotAction(_ sender: Any) {
  200. KMPreference.shared.rememberSnapshot = self.rememberSnapshotButton.state == .on
  201. }
  202. @IBAction func autoSaveNoteBackupAction(_ sender: Any) {
  203. KMPreference.shared.autoSaveNoteBackup = self.autoSaveNotesBackupButton.state == .on
  204. }
  205. @IBAction func keepSnapshotOnTopAction(_ sender: Any) {
  206. KMPreference.shared.keepSnapshotWindowToTop = self.keepSnapshotOnTopButton.state == .on
  207. }
  208. @IBAction func autoSaveButtonAction(_ sender: AnyObject?) {
  209. AutoSaveManager.manager.autoSaveEnabled = self.autoSaveInfoBtn.state == .on
  210. self.autoSaveSlider.isEnabled = AutoSaveManager.manager.autoSaveEnabled
  211. }
  212. @IBAction func autoSaveSliderAction(_ sender: AnyObject?) {
  213. let value = 1 + 19 * self.autoSaveSlider.floatValue
  214. AutoSaveManager.manager.timeInterval = CGFloat(value)
  215. self.autoSaveLbl.stringValue = String(format: "%.0f %@", AutoSaveManager.manager.timeInterval, KMLocalizedString("minute(s)", nil))
  216. Self.cancelPreviousPerformRequests(withTarget: self, selector: #selector(autoSaveSliderFinish), object: nil)
  217. self.perform(#selector(autoSaveSliderFinish), with: nil, afterDelay: 1)
  218. }
  219. @objc func autoSaveSliderFinish() {
  220. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KAutoSaveTimeValueChangedNoti), object: nil)
  221. }
  222. @IBAction func savePwdForAlwaysAction(_ sender: Any) {
  223. KMPreference.shared.savePasswordType = .always
  224. }
  225. @IBAction func savePwdForNeverAction(_ sender: Any) {
  226. KMPreference.shared.savePasswordType = .never
  227. }
  228. @IBAction func savePwdForAskAction(_ sender: Any) {
  229. KMPreference.shared.savePasswordType = .ask
  230. }
  231. /*
  232. #pragma mark Accessors
  233. - (void)setUpdateInterval:(NSInteger)interval {
  234. #if VERSION_DMG
  235. if (interval > 0)
  236. [[SUUpdater sharedUpdater] setUpdateCheckInterval:interval];
  237. [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates:interval > 0];
  238. #endif
  239. updateInterval = interval;
  240. }
  241. #pragma mark Actions
  242. #pragma mark KVO
  243. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  244. if (context == &KMGeneralPreferencesDefaultsObservationContext)
  245. [self updateRevertButtons];
  246. else if (context == &KMGeneralPreferencesUpdaterObservationContext)
  247. [self synchronizeUpdateInterval];
  248. else
  249. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  250. }
  251. @end
  252. */
  253. override var title: String? {
  254. set {
  255. super.title = newValue
  256. }
  257. get {
  258. return KMLocalizedString("General", "Preference pane label")
  259. }
  260. }
  261. override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  262. super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
  263. }
  264. }
  265. // MARK: - Private Methods
  266. extension KMGeneralPreferences {
  267. private func _synchronizeUpdateInterval() {
  268. // self.willChangeValue(forKey: UPDATEINTERVAL_KEY)
  269. #if VERSION_DMG
  270. // updateInterval = [[SUUpdater sharedUpdater] automaticallyChecksForUpdates] ? [[SUUpdater sharedUpdater] updateCheckInterval] : 0;
  271. #endif
  272. // self.didChangeValue(forKey: UPDATEINTERVAL_KEY)
  273. }
  274. private func _updateRevertButtons() {
  275. let initialValues = NSUserDefaultsController.shared.initialValues
  276. let sud = UserDefaults.standard
  277. if let data = sud.dictionary(forKey: SKDefaultPDFDisplaySettingsKey) {
  278. self.normalButton.isEnabled = NSDictionary(dictionary: data).isEqual(initialValues?[SKDefaultPDFDisplaySettingsKey]) == false
  279. } else {
  280. self.normalButton.isEnabled = true
  281. }
  282. if let data = sud.dictionary(forKey: SKDefaultFullScreenPDFDisplaySettingsKey) {
  283. self.fullScreenButton.isEnabled = NSDictionary(dictionary: data).isEqual(initialValues?[SKDefaultFullScreenPDFDisplaySettingsKey]) == false
  284. } else {
  285. self.fullScreenButton.isEnabled = true
  286. }
  287. }
  288. private func _selectOpenFileType(_ type: KMPreferenceOpenFileType) {
  289. if type == .default {
  290. self.openFileForDefaultButton.state = .on
  291. self.openFileForMaximButton.state = .off
  292. self.openFileForFitButton.state = .off
  293. } else if type == .maxim {
  294. self.openFileForDefaultButton.state = .off
  295. self.openFileForMaximButton.state = .on
  296. self.openFileForFitButton.state = .off
  297. } else if type == .fit {
  298. self.openFileForDefaultButton.state = .off
  299. self.openFileForMaximButton.state = .off
  300. self.openFileForFitButton.state = .on
  301. }
  302. }
  303. private func _selectSavePasswordType(_ type: KMPreferenceSavePasswordType) {
  304. if type == .always {
  305. self.savePwdForAlwaysButton.state = .on
  306. self.savePwdForNeverButton.state = .off
  307. self.savePwdForAskButton.state = .off
  308. } else if type == .never {
  309. self.savePwdForAlwaysButton.state = .off
  310. self.savePwdForNeverButton.state = .on
  311. self.savePwdForAskButton.state = .off
  312. } else if type == .ask {
  313. self.savePwdForAlwaysButton.state = .off
  314. self.savePwdForNeverButton.state = .off
  315. self.savePwdForAskButton.state = .on
  316. }
  317. }
  318. }
  319. extension KMGeneralPreferences: KMPreferencePane {
  320. func defaultsDidRevert() {
  321. let interval = Bundle.main.object(forInfoDictionaryKey: SUScheduledCheckIntervalKey)
  322. #if VERSION_DMG
  323. // [[SUUpdater sharedUpdater] setUpdateCheckInterval:interval];
  324. // [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates:interval > 0.0];
  325. #endif
  326. }
  327. }
  328. extension KMGeneralPreferences: NSTextFieldDelegate {
  329. func controlTextDidChange(_ obj: Notification) {
  330. if self.authorTextField.isEqual(to: obj.object) { // 作者
  331. KMPreference.shared.author = self.authorTextField.stringValue
  332. }
  333. }
  334. }