KMGeneralPreferences.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. //
  2. // KMGeneralPreferences.swift
  3. // PDF Master
  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 showLeftSideButton: NSButton!
  29. @IBOutlet weak var rememberSnapshotButton: NSButton!
  30. @IBOutlet weak var normalButton: NSButton!
  31. @IBOutlet weak var fullScreenButton: NSButton!
  32. @IBOutlet weak var autoSaveNotesBackupButton: NSButton!
  33. @IBOutlet weak var keepSnapshotOnTopButton: NSButton!
  34. @IBOutlet var savePasswordsMatrix: NSMatrix!
  35. @IBOutlet var updateIntervalPopUpButton: NSPopUpButton!
  36. @IBOutlet var updateIntervalLabelField: NSTextField!
  37. var revertPDFSettingsButtons: [NSButton] = []
  38. var updateInterval: Int = 0 {
  39. didSet {
  40. }
  41. }
  42. /*
  43. @interface KMGeneralPreferences : NSViewController <SKPreferencePane> {
  44. NSInteger updateInterval;
  45. }
  46. - (IBAction)revertPDFViewSettings:(id)sender;
  47. - (IBAction)revertFullScreenPDFViewSettings:(id)sender;
  48. */
  49. /*
  50. static char KMGeneralPreferencesDefaultsObservationContext;
  51. static char KMGeneralPreferencesUpdaterObservationContext;
  52. @interface KMGeneralPreferences (Private)
  53. - (void)synchronizeUpdateInterval;
  54. - (void)updateRevertButtons;
  55. @end
  56. */
  57. deinit {
  58. KMPrint("KMGeneralPreferences deinit.")
  59. /*
  60. @try {
  61. [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeys:[NSArray arrayWithObjects:SKStringConstants.defaultPDFDisplaySettingsKey, SKStringConstants.defaultFullScreenPDFDisplaySettingsKey, nil]];
  62. #if VERSION_DMG
  63. [[SUUpdater sharedUpdater] removeObserver:self forKeyPath:AUTOMATICALLYCHECKSFORUPDATES_KEY];
  64. [[SUUpdater sharedUpdater] removeObserver:self forKeyPath:UPDATECHECKINTERVAL_KEY];
  65. #endif
  66. }
  67. @catch(id e) {}
  68. */
  69. }
  70. override var nibName: NSNib.Name? {
  71. return "GeneralPreferences"
  72. }
  73. override func loadView() {
  74. super.loadView()
  75. // self.showConvertMenuButton.state = [KMStatusBar systemStatusBar].isShow ? NSControlStateValueOn : NSControlStateValueOff;
  76. #if VERSION_FREE
  77. // if (![IAPProductsManager defaultManager].isAvailableAllFunction) {
  78. // [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"KMOpenDocumentInTab"];
  79. // }
  80. #endif
  81. // [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeys:[NSArray arrayWithObjects:SKStringConstants.defaultPDFDisplaySettingsKey, SKStringConstants.defaultFullScreenPDFDisplaySettingsKey, nil] context:&KMGeneralPreferencesDefaultsObservationContext];
  82. // [NSUserDefaultsController sharedUserDefaultsController]
  83. #if VERSION_DMG
  84. // [[SUUpdater sharedUpdater] addObserver:self forKeyPath:AUTOMATICALLYCHECKSFORUPDATES_KEY options:0 context:&KMGeneralPreferencesUpdaterObservationContext];
  85. // [[SUUpdater sharedUpdater] addObserver:self forKeyPath:UPDATECHECKINTERVAL_KEY options:0 context:&KMGeneralPreferencesUpdaterObservationContext];
  86. #endif
  87. }
  88. override func viewDidLoad() {
  89. super.viewDidLoad()
  90. self.authorLabel.stringValue = KMLocalizedString("Author:", nil)
  91. self.authorTextField.delegate = self
  92. self.authorTextField.stringValue = KMPreferenceManager.shared.author
  93. self.openTabLabel.stringValue = String(format: "%@:", KMLocalizedString("Open a document in", nil))
  94. for item in self.openTabButton.itemArray {
  95. item.title = KMLocalizedString(item.title, nil)
  96. }
  97. self.showConvertMenuButton.title = KMLocalizedString("Show PDF Reader Pro in menu bar", nil)
  98. self.defaultOpenButton.title = KMLocalizedString("Set PDF Reader Pro as the default PDF viewer", nil)
  99. self.defaultOpenButton.state = KMPreference.shared.setDefaultPDFReader ? .on : .off
  100. self.reopenLastOpenFilesButton.state = KMPreference.shared.openLastUnclosedDocumentWhenAppStart ? .on : .off
  101. self.autoSaveInfoBtn.title = KMLocalizedString("Autosave Documents", nil)
  102. self.autoSaveInfoBtn.state = AutoSaveManager.manager.autoSaveEnabled ? .on : .off
  103. self.autoSaveSlider.isEnabled = AutoSaveManager.manager.autoSaveEnabled
  104. if (AutoSaveManager.manager.timeInterval > 1) {
  105. self.autoSaveSlider.floatValue = Float((AutoSaveManager.manager.timeInterval - 1) / 19)
  106. } else {
  107. self.autoSaveSlider.floatValue = 0
  108. }
  109. self.autoSaveLbl.stringValue = String(format: "%.0f %@", AutoSaveManager.manager.timeInterval, KMLocalizedString("minute(s)", nil))
  110. self.showLeftSideButton.state = KMPreference.shared.showLeftSideBar ? .on : .off
  111. self.rememberSnapshotButton.state = KMPreference.shared.rememberSnapshot ? .on : .off
  112. self.autoSaveNotesBackupButton.state = KMPreference.shared.autoSaveNoteBackup ? .on : .off
  113. self.keepSnapshotOnTopButton.state = KMPreference.shared.keepSnapshotWindowToTop ? .on : .off
  114. self.authorLabel.sizeToFit()
  115. var frame = self.authorTextField.frame
  116. frame.origin.x = CGRectGetMaxX(self.authorLabel.frame)+5
  117. self.authorTextField.frame = frame
  118. self.openTabLabel.sizeToFit()
  119. frame = self.openTabButton.frame
  120. frame.origin.x = CGRectGetMaxX(self.openTabLabel.frame)+5
  121. self.openTabButton.frame = frame
  122. self.openTabButton.isEnabled = true
  123. self.revertPDFSettingsButtons = [self.normalButton, self.fullScreenButton]
  124. KMAutoSizeButtons(self.revertPDFSettingsButtons, rightAlign: false)
  125. _ = KMAutoSizeLabelFields([openFilesLabelField], [openFilesMatrix], false)
  126. let dw = KMAutoSizeLabelFields([updateIntervalLabelField], [updateIntervalPopUpButton], false)
  127. self.openFilesMatrix.sizeToFit()
  128. self.savePasswordsMatrix.sizeToFit()
  129. KMShiftAndResizeView(self.view, dx: 0.0, dw: dw)
  130. self._synchronizeUpdateInterval()
  131. self._updateRevertButtons()
  132. }
  133. @IBAction func revertPDFViewSettings(_ sender: AnyObject?) {
  134. // [[NSUserDefaultsController sharedUserDefaultsController] revertToInitialValueForKey:SKStringConstants.defaultPDFDisplaySettingsKey];
  135. }
  136. @IBAction func revertFullScreenPDFViewSettings(_ sender: AnyObject?) {
  137. // [[NSUserDefaultsController sharedUserDefaultsController] revertToInitialValueForKey:SKStringConstants.defaultFullScreenPDFDisplaySettingsKey];
  138. }
  139. @IBAction func authorTextFieldAction(_ sender: AnyObject?) {
  140. // NSString *userName = self.authorTextField.stringValue.length > 0 ? self.authorTextField.stringValue : @"";
  141. // [[NSUserDefaults standardUserDefaults] setObject:userName forKey:@"SKUserName"];
  142. // [[NSUserDefaults standardUserDefaults] synchronize];
  143. }
  144. @IBAction func defaultOpenButtonAction(_ sender: AnyObject?) {
  145. KMPreference.shared.setDefaultPDFReader = self.defaultOpenButton.state == .on
  146. }
  147. @IBAction func openTabButtonAction(_ sender: AnyObject?) {
  148. // if (@available(macOS 10.12, *)) {
  149. // NSWindowTabbingMode tabbingMode = NSWindowTabbingModeAutomatic;
  150. // if (self.openTabButton.indexOfSelectedItem == 0) {
  151. // #if VERSION_FREE
  152. // // if (![IAPProductsManager defaultManager].isAvailableAllFunction) {
  153. // // [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"KMOpenDocumentInTab"];
  154. // // [[KMPurchaseCompareWindowController sharedInstance] showWindow:nil];
  155. // // return;
  156. // // }
  157. // #endif
  158. // tabbingMode = NSWindowTabbingModePreferred;
  159. // } else if (self.openTabButton.indexOfSelectedItem == 1) {
  160. // tabbingMode = NSWindowTabbingModeDisallowed;
  161. // }
  162. // for (NSDocument *document in [[NSDocumentController sharedDocumentController] documents]) {
  163. // // if ([document isKindOfClass:[SKMainDocument class]]) {
  164. // // for (NSWindowController *windowController in document.windowControllers) {
  165. // // windowController.window.tabbingMode = tabbingMode;
  166. // // }
  167. // // }
  168. // }
  169. // }
  170. }
  171. @IBAction func showConvertMenuButtonAction(_ sender: AnyObject?) {
  172. // if ([self.showConvertMenuButton state]) {
  173. // // [KMStatusBar systemStatusBar].isShow = YES;
  174. // } else {
  175. // // [KMStatusBar systemStatusBar].isShow = NO;
  176. // }
  177. KMPreference.shared.showInMenuBar = self.showConvertMenuButton.state == .on
  178. }
  179. @IBAction func reopenLastOpenFilesAtStartupAction(_ sender: NSButton) {
  180. KMPreference.shared.openLastUnclosedDocumentWhenAppStart = sender.state == .on
  181. }
  182. @IBAction func showLeftSideAction(_ sender: Any) {
  183. KMPreference.shared.showLeftSideBar = self.showLeftSideButton.state == .on
  184. }
  185. @IBAction func rememberSnapshotAction(_ sender: Any) {
  186. KMPreference.shared.rememberSnapshot = self.rememberSnapshotButton.state == .on
  187. }
  188. @IBAction func autoSaveNoteBackupAction(_ sender: Any) {
  189. KMPreference.shared.autoSaveNoteBackup = self.autoSaveNotesBackupButton.state == .on
  190. }
  191. @IBAction func keepSnapshotOnTopAction(_ sender: Any) {
  192. KMPreference.shared.keepSnapshotWindowToTop = self.keepSnapshotOnTopButton.state == .on
  193. }
  194. @IBAction func autoSaveButtonAction(_ sender: AnyObject?) {
  195. AutoSaveManager.manager.autoSaveEnabled = self.autoSaveInfoBtn.state == .on
  196. self.autoSaveSlider.isEnabled = AutoSaveManager.manager.autoSaveEnabled
  197. }
  198. @IBAction func autoSaveSliderAction(_ sender: AnyObject?) {
  199. let value = 1 + 19 * self.autoSaveSlider.floatValue
  200. AutoSaveManager.manager.timeInterval = CGFloat(value)
  201. self.autoSaveLbl.stringValue = String(format: "%.0f %@", AutoSaveManager.manager.timeInterval, KMLocalizedString("minute(s)", nil))
  202. Self.cancelPreviousPerformRequests(withTarget: self, selector: #selector(autoSaveSliderFinish), object: nil)
  203. self.perform(#selector(autoSaveSliderFinish), with: nil, afterDelay: 1)
  204. }
  205. @objc func autoSaveSliderFinish() {
  206. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KAutoSaveTimeValueChangedNoti), object: nil)
  207. }
  208. /*
  209. #pragma mark Accessors
  210. - (void)setUpdateInterval:(NSInteger)interval {
  211. #if VERSION_DMG
  212. if (interval > 0)
  213. [[SUUpdater sharedUpdater] setUpdateCheckInterval:interval];
  214. [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates:interval > 0];
  215. #endif
  216. updateInterval = interval;
  217. }
  218. #pragma mark Actions
  219. #pragma mark KVO
  220. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  221. if (context == &KMGeneralPreferencesDefaultsObservationContext)
  222. [self updateRevertButtons];
  223. else if (context == &KMGeneralPreferencesUpdaterObservationContext)
  224. [self synchronizeUpdateInterval];
  225. else
  226. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  227. }
  228. @end
  229. */
  230. override var title: String? {
  231. set {
  232. super.title = newValue
  233. }
  234. get {
  235. return KMLocalizedString("General", "Preference pane label")
  236. }
  237. }
  238. override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  239. super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
  240. }
  241. }
  242. // MARK: - Private Methods
  243. extension KMGeneralPreferences {
  244. private func _synchronizeUpdateInterval() {
  245. // self.willChangeValue(forKey: UPDATEINTERVAL_KEY)
  246. #if VERSION_DMG
  247. // updateInterval = [[SUUpdater sharedUpdater] automaticallyChecksForUpdates] ? [[SUUpdater sharedUpdater] updateCheckInterval] : 0;
  248. #endif
  249. // self.didChangeValue(forKey: UPDATEINTERVAL_KEY)
  250. }
  251. private func _updateRevertButtons() {
  252. let initialValues = NSUserDefaultsController.shared.initialValues
  253. let sud = UserDefaults.standard
  254. if let data = sud.dictionary(forKey: SKDefaultPDFDisplaySettingsKey) {
  255. self.normalButton.isEnabled = NSDictionary(dictionary: data).isEqual(initialValues?[SKDefaultPDFDisplaySettingsKey]) == false
  256. } else {
  257. self.normalButton.isEnabled = true
  258. }
  259. if let data = sud.dictionary(forKey: SKDefaultFullScreenPDFDisplaySettingsKey) {
  260. self.fullScreenButton.isEnabled = NSDictionary(dictionary: data).isEqual(initialValues?[SKDefaultFullScreenPDFDisplaySettingsKey]) == false
  261. } else {
  262. self.fullScreenButton.isEnabled = true
  263. }
  264. }
  265. }
  266. extension KMGeneralPreferences: KMPreferencePane {
  267. func defaultsDidRevert() {
  268. let interval = Bundle.main.object(forInfoDictionaryKey: SUScheduledCheckIntervalKey)
  269. #if VERSION_DMG
  270. // [[SUUpdater sharedUpdater] setUpdateCheckInterval:interval];
  271. // [[SUUpdater sharedUpdater] setAutomaticallyChecksForUpdates:interval > 0.0];
  272. #endif
  273. }
  274. }
  275. extension KMGeneralPreferences: NSTextFieldDelegate {
  276. func controlTextDidChange(_ obj: Notification) {
  277. if self.authorTextField.isEqual(to: obj.object) { // 作者
  278. KMPreference.shared.author = self.authorTextField.stringValue
  279. }
  280. }
  281. }