KMPreferenceManager.swift 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918
  1. //
  2. // KMPreferenceManager.swift
  3. // PDF Office
  4. //
  5. // Created by tangchao on 2023/2/3.
  6. //
  7. import Cocoa
  8. enum KMPreferenceGroup: String {
  9. case general, display, markup, infomation, other
  10. }
  11. let KMPreferenceInfoKey: String = "KMPreferenceInfoKey"
  12. typealias KMPreferenceKey = String
  13. /// general
  14. /// files
  15. let KMOpenLastUnclosedDocumentWhenAppStartKey: KMPreferenceKey = "KMOpenLastUnclosedDocumentWhenAppStartKey"
  16. let KMOpenLastUnlockedDocumentWhenAppStartKey: KMPreferenceKey = "KMOpenLastUnlockedDocumentWhenAppStartKey"
  17. let KMDocumentMaximunDisplayNumberKey: KMPreferenceKey = "KMDocumentMaximunDisplayNumberKey"
  18. let KMAutoSaveKey: KMPreferenceKey = "KMAutoSaveKey"
  19. let KMAutoSavePerNumberMinuteKey: KMPreferenceKey = "KMAutoSavePerNumberMinuteKey"
  20. let KMCloseFilePromptTypeKey: KMPreferenceKey = "KMCloseFilePromptTypeKey"
  21. /// open image file
  22. let KMOpenImageFileTypeKey: KMPreferenceKey = "KMOpenImageFileTypeKey"
  23. let KMSetDefaultPDFReaderKey: KMPreferenceKey = "KMSetDefaultPDFReaderKey"
  24. /// save password
  25. let KMSavePasswordTypeKey: KMPreferenceKey = "KMSavePasswordTypeKey"
  26. let KMGeneralAuthorNameKey: KMPreferenceKey = "KMGeneralAuthorNameKey"
  27. /// display
  28. let KMViewPageDisplayTypeKey: KMPreferenceKey = "KMViewPageDisplayTypeKey"
  29. let KMViewZoomScaleTypeKey: KMPreferenceKey = "KMViewZoomScaleTypeKey"
  30. let KMLeftSideDisplayTypeKey: KMPreferenceKey = "KMLeftSideDisplayTypeKey"
  31. let KMShowOutlineListKey: KMPreferenceKey = "KMShowOutlineListKey"
  32. let KMLeftSideExpandTypeKey: KMPreferenceKey = "KMLeftSideExpandTypeKey"
  33. let KMPropertyPanelExpandTypeKey: KMPreferenceKey = "KMPropertyPanelExpandTypeKey"
  34. let KMDisplayBackgroundNormalColorKey: KMPreferenceKey = "KMDisplayBackgroundNormalColorKey"
  35. let KMDisplayBackgroundFullScreenColorKey: KMPreferenceKey = "KMDisplayBackgroundFullScreenColorKey"
  36. let KMHighlightFormsKey: KMPreferenceKey = "KMHighlightFormsKey"
  37. let KMDisplayFieldHighlightingColorKey: KMPreferenceKey = "KMDisplayFieldHighlightingColorKey"
  38. let KMDisplayRequiredFieldHighlightingColorKey: KMPreferenceKey = "KMDisplayRequiredFieldHighlightingColorKey"
  39. let KMPageIndicatorTypeKey: KMPreferenceKey = "KMPageIndicatorTypeKey"
  40. let KMHighlightLinksKey: KMPreferenceKey = "KMHighlightLinksKey"
  41. /// markup
  42. let KMMarkupColorHighlightKey: KMPreferenceKey = "KMMarkupColorHighlightKey"
  43. let KMMarkupColorStrikthroughKey: KMPreferenceKey = "KMMarkupColorStrikthroughKey"
  44. let KMMarkupColorUnderlineKey: KMPreferenceKey = "KMMarkupColorUnderlineKey"
  45. let KMMarkupColorPenKey: KMPreferenceKey = "KMMarkupColorPenKey"
  46. let KMMarkupColorTextKey: KMPreferenceKey = "KMMarkupColorTextKey"
  47. let KMMarkupColorNoteKey: KMPreferenceKey = "KMMarkupColorNoteKey"
  48. let KMMarkupColorRectangleFillKey: KMPreferenceKey = "KMMarkupColorRectangleFillKey"
  49. let KMMarkupColorRectangleBorderKey: KMPreferenceKey = "KMMarkupColorRectangleBorderKey"
  50. let KMMarkupColorCircleFillKey: KMPreferenceKey = "KMMarkupColorCircleFillKey"
  51. let KMMarkupColorCircleBorderKey: KMPreferenceKey = "KMMarkupColorCircleBorderKey"
  52. let KMMarkupColorLineKey: KMPreferenceKey = "KMMarkupColorLineKey"
  53. let KMMarkupFontTextTypeKey: KMPreferenceKey = "KMMarkupFontTextTypeKey"
  54. let KMMarkupFontTextAligmentTypeKey: KMPreferenceKey = "KMMarkupFontTextAligmentTypeKey"
  55. let KMMarkupFontNoteTypeKey: KMPreferenceKey = "KMMarkupFontNoteTypeKey"
  56. /// 偏好设置已改变
  57. let KMPreferenceDidChangeNotificationName = "KMPreferenceDidChangeNotificationName"
  58. class KMPreferenceManager: NSObject {
  59. static let shared = KMPreferenceManager()
  60. private var generalGroupKeys: Array<KMPreferenceKey> = []
  61. private var displayGroupKeys: Array<KMPreferenceKey> = []
  62. private var markupGroupKeys: Array<KMPreferenceKey> = []
  63. override init() {
  64. super.init()
  65. /// 初始化
  66. generalGroupKeys = self.getDefaultKeys(for: .general)
  67. displayGroupKeys = self.getDefaultKeys(for: .display)
  68. markupGroupKeys = self.getDefaultKeys(for: .markup)
  69. let info = UserDefaults.standard.value(forKey: KMPreferenceInfoKey)
  70. if (info == nil) {
  71. let info = self.getDefaultInfo()
  72. UserDefaults.standard.set(info, forKey: KMPreferenceInfoKey)
  73. UserDefaults.standard.synchronize()
  74. }
  75. }
  76. // MARK: 保存/获取数据
  77. public func setData(data: Any,forKey key: KMPreferenceKey) -> Bool {
  78. return self.setData(data: data, forKey: key, in: findGroup(forKey: key))
  79. }
  80. public func setData(data: Any,forKey key: KMPreferenceKey, in group: KMPreferenceGroup) -> Bool {
  81. var info: [String : Any]?
  82. if (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) == nil) {
  83. info = self.getDefaultInfo()
  84. } else {
  85. info = (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) as! [String : Any])
  86. }
  87. var groupInfo: [String : Any] = info![group.rawValue] as! [String : Any]
  88. groupInfo.updateValue(data, forKey: key)
  89. info?.updateValue(groupInfo, forKey: group.rawValue)
  90. UserDefaults.standard.set(info, forKey: KMPreferenceInfoKey)
  91. UserDefaults.standard.synchronize()
  92. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  93. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KMPreferenceDidChangeNotificationName), object: [group], userInfo: [key : data])
  94. }
  95. return true
  96. }
  97. public func getData(forKey key: KMPreferenceKey) -> Any {
  98. var info: [String : Any]?
  99. if (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) == nil) {
  100. info = self.getDefaultInfo()
  101. } else {
  102. info = (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) as! [String : Any])
  103. }
  104. let groupInfo: [String : Any] = info![findGroup(forKey: key).rawValue] as! [String : Any]
  105. return groupInfo[key] as Any
  106. }
  107. // MarkUp
  108. public func getMarkData(forKey key:KMPreferenceKey) -> NSColor {
  109. var red: CGFloat = 0.0
  110. var green: CGFloat = 0.0
  111. var blue: CGFloat = 0.0
  112. var alpha: CGFloat = 0.0
  113. let color : NSColor = UserDefaults.standard.pdfListViewColor(forKey: key) ?? NSColor.white
  114. if color != nil {
  115. color.usingColorSpaceName(.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  116. }
  117. return color
  118. }
  119. public func setMarkData(color:NSColor,forKey key:KMPreferenceKey) {
  120. UserDefaults.standard.setPDFListViewColor(color, forKey: key)
  121. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  122. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KMPreferenceDidChangeNotificationName), object: [], userInfo: [key : color])
  123. }
  124. }
  125. public func setAlignment(alignment:Int,forKey key:KMPreferenceKey) {
  126. UserDefaults.standard.set(alignment, forKey: key)
  127. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  128. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KMPreferenceDidChangeNotificationName), object: [], userInfo: [key : alignment])
  129. }
  130. }
  131. public func getAlignment(for key:KMPreferenceKey) -> Int{
  132. let type : Int = UserDefaults.standard.object(forKey: key) as? Int ?? 1
  133. return type
  134. }
  135. private func dataToColor(colors:[Double]) -> NSColor {
  136. NSColor(red: colors[0], green: colors[1], blue: colors[2], alpha: colors[3])
  137. }
  138. /// Reset
  139. public func resetMarkUpData() {
  140. self.markupHighlightColor = self.dataToColor(colors: self.markupHighlightColorValues)
  141. self.markupStrikthroughColor = self.dataToColor(colors: self.markupStrikthroughColorValues)
  142. self.markupUnderlineColor = self.dataToColor(colors: self.markupUnderlineColorValues)
  143. self.markupPenColor = self.dataToColor(colors: self.markupPenColorValues)
  144. self.markupTextColor = self.dataToColor(colors: self.markupTextColorValues)
  145. self.markupNoteColor = self.dataToColor(colors: self.markupNoteColorValues)
  146. self.markupRectangleFillColor = self.dataToColor(colors: self.markupRectangleFillColorValues)
  147. self.markupRectangleBorderColor = self.dataToColor(colors: self.markupRectangleBorderColorValues)
  148. self.markupCircleFillColor = self.dataToColor(colors: self.markupCircleFillColorValues)
  149. self.markupCircleBorderColor = self.dataToColor(colors: self.markupCircleBorderColorValues)
  150. self.markupLineColor = self.dataToColor(colors: self.markupLineColorValues)
  151. }
  152. public func resetData(_ group: KMPreferenceGroup) {
  153. var info: [String : Any]?
  154. if (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) == nil) {
  155. info = self.getDefaultInfo()
  156. } else {
  157. info = (UserDefaults.standard.value(forKey: KMPreferenceInfoKey) as! [String : Any])
  158. }
  159. if(group == .markup) {
  160. self.resetMarkUpData()
  161. } else {
  162. let groupInfo = self.getDefaultInfo()[group.rawValue]
  163. info?.updateValue(groupInfo as Any, forKey: group.rawValue)
  164. UserDefaults.standard.set(info, forKey: KMPreferenceInfoKey)
  165. UserDefaults.standard.synchronize()
  166. }
  167. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  168. let info: [String : Any]? = UserDefaults.standard.value(forKey: KMPreferenceInfoKey) as? [String : Any]
  169. var groupInfo: [KMPreferenceKey : Any]?
  170. if (info != nil) {
  171. groupInfo = info![group.rawValue] as? [KMPreferenceKey : Any]
  172. }
  173. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KMPreferenceDidChangeNotificationName), object: [group], userInfo: groupInfo != nil ? groupInfo : [:])
  174. }
  175. }
  176. public func resetAllData() {
  177. let info = self.getDefaultInfo()
  178. UserDefaults.standard.set(info, forKey: KMPreferenceInfoKey)
  179. UserDefaults.standard.synchronize()
  180. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  181. var groppInfos: [KMPreferenceKey : Any] = [:]
  182. for groupInfo in info.values {
  183. for (key, value) in groupInfo {
  184. groppInfos.updateValue(value, forKey: key)
  185. }
  186. }
  187. NotificationCenter.default.post(name: NSNotification.Name(rawValue: KMPreferenceDidChangeNotificationName), object: [KMPreferenceGroup.general, KMPreferenceGroup.display, KMPreferenceGroup.markup, KMPreferenceGroup.infomation, KMPreferenceGroup.other], userInfo: groppInfos)
  188. }
  189. }
  190. // MARK: 注册 key
  191. public func register(_ key: KMPreferenceKey, to group: KMPreferenceGroup) -> Bool {
  192. if (group == .general) {
  193. if (self.generalGroupKeys.contains(key)) {
  194. return false
  195. }
  196. self.generalGroupKeys.append(key)
  197. }
  198. return true
  199. }
  200. // MARK: 获取信息
  201. private func findGroup(forKey key: KMPreferenceKey) -> KMPreferenceGroup {
  202. if (self.generalGroupKeys.contains(key)) {
  203. return .general
  204. } else if (self.displayGroupKeys.contains(key)) {
  205. return .display
  206. } else if (self.markupGroupKeys.contains(key)) {
  207. return .markup
  208. }
  209. return .other
  210. }
  211. private func getDefaultKeys(for group: KMPreferenceGroup) -> Array<KMPreferenceKey> {
  212. if (group == .general) {
  213. return [KMOpenLastUnclosedDocumentWhenAppStartKey,
  214. KMOpenLastUnlockedDocumentWhenAppStartKey,
  215. KMDocumentMaximunDisplayNumberKey,
  216. KMAutoSaveKey,
  217. KMAutoSavePerNumberMinuteKey,
  218. KMCloseFilePromptTypeKey,
  219. KMOpenImageFileTypeKey,
  220. KMSetDefaultPDFReaderKey,
  221. KMSavePasswordTypeKey,
  222. KMGeneralAuthorNameKey]
  223. } else if (group == .display) {
  224. return [KMViewPageDisplayTypeKey,
  225. KMViewZoomScaleTypeKey,
  226. KMLeftSideDisplayTypeKey,
  227. KMShowOutlineListKey,
  228. KMLeftSideExpandTypeKey,
  229. KMPropertyPanelExpandTypeKey,
  230. KMDisplayBackgroundNormalColorKey,
  231. KMDisplayBackgroundFullScreenColorKey,
  232. KMHighlightFormsKey,
  233. KMDisplayFieldHighlightingColorKey,
  234. KMDisplayRequiredFieldHighlightingColorKey,
  235. KMPageIndicatorTypeKey,
  236. KMHighlightLinksKey]
  237. } else if (group == .markup) {
  238. return [CHighlightNoteColorKey,
  239. CUnderlineNoteColorKey,
  240. CStrikeOutNoteColorKey,
  241. CInkNoteColorKey,
  242. CFreeTextNoteFontColorKey,
  243. CAnchoredNoteColorKey,
  244. CSquareNoteInteriorColorKey,
  245. CSquareNoteColorKey,
  246. CCircleNoteInteriorColorKey,
  247. CCircleNoteColorKey,
  248. CAnnotationSelfSignLineColorKey,
  249. KMMarkupFontTextTypeKey,
  250. CFreeTextNoteAlignmentKey,
  251. KMMarkupFontNoteTypeKey]
  252. }
  253. return []
  254. }
  255. private func getDefaultInfo() -> Dictionary<String, Dictionary<String, Any>> {
  256. return [KMPreferenceGroup.general.rawValue : [KMOpenLastUnclosedDocumentWhenAppStartKey : false,
  257. KMOpenLastUnlockedDocumentWhenAppStartKey : false,
  258. KMDocumentMaximunDisplayNumberKey : 10,
  259. KMAutoSaveKey : true,
  260. KMAutoSavePerNumberMinuteKey : 5,
  261. KMCloseFilePromptTypeKey : 0,
  262. KMOpenImageFileTypeKey : 0,
  263. KMSetDefaultPDFReaderKey : true,
  264. KMSavePasswordTypeKey : 2,
  265. KMGeneralAuthorNameKey : NSFullUserName()],
  266. KMPreferenceGroup.display.rawValue : [KMViewPageDisplayTypeKey : 1,
  267. KMViewZoomScaleTypeKey : 0,
  268. KMLeftSideDisplayTypeKey : 0,
  269. KMShowOutlineListKey: true,
  270. KMLeftSideExpandTypeKey : 0,
  271. KMPropertyPanelExpandTypeKey : 0,
  272. KMDisplayBackgroundNormalColorKey : self.displayBackgroundNormalColorValues,
  273. KMDisplayBackgroundFullScreenColorKey : self.displayBackgroundFullScreenColorValues,
  274. KMHighlightFormsKey : true,
  275. KMDisplayFieldHighlightingColorKey : self.displayFieldHighlightingColorValues,
  276. KMDisplayRequiredFieldHighlightingColorKey : self.displayRequiredFieldHighlightingColorValues,
  277. KMPageIndicatorTypeKey : 2,
  278. KMHighlightLinksKey : true],
  279. KMPreferenceGroup.markup.rawValue : [KMMarkupColorHighlightKey : self.markupHighlightColorValues,
  280. KMMarkupColorStrikthroughKey : self.markupStrikthroughColorValues,
  281. KMMarkupColorUnderlineKey : self.markupUnderlineColorValues,
  282. KMMarkupColorPenKey : self.markupPenColorValues,
  283. KMMarkupColorTextKey : self.markupTextColorValues,
  284. KMMarkupColorNoteKey : self.markupNoteColorValues,
  285. KMMarkupColorRectangleFillKey : self.markupRectangleFillColorValues,
  286. KMMarkupColorRectangleBorderKey : self.markupRectangleBorderColorValues,
  287. KMMarkupColorCircleFillKey : self.markupCircleFillColorValues,
  288. KMMarkupColorCircleBorderKey : self.markupCircleBorderColorValues,
  289. KMMarkupColorLineKey : self.markupLineColorValues,
  290. KMMarkupFontTextTypeKey : 1,
  291. KMMarkupFontTextAligmentTypeKey : 0,
  292. KMMarkupFontNoteTypeKey : 1],
  293. KMPreferenceGroup.infomation.rawValue : [:],
  294. KMPreferenceGroup.other.rawValue : [:]]
  295. }
  296. }
  297. //protocol KMPreferenceManagerColorPart: NSObjectProtocol {
  298. // var markupHighlightColorValues: [Double] { get }
  299. //}
  300. // MARK: 扩展 颜色
  301. extension KMPreferenceManager {
  302. fileprivate var displayBackgroundNormalColorValues: [Double] {
  303. get {
  304. return [206/255.0, 208/255.0, 212/255.0, 1.0]
  305. }
  306. }
  307. fileprivate var displayBackgroundFullScreenColorValues: [Double] {
  308. get {
  309. return [54/255.0, 56/255.0, 59/255.0, 1.0]
  310. }
  311. }
  312. fileprivate var displayFieldHighlightingColorValues: [Double] {
  313. get {
  314. return [189/255.0, 223/255.0, 253/255.0, 1.0]
  315. }
  316. }
  317. fileprivate var displayRequiredFieldHighlightingColorValues: [Double] {
  318. get {
  319. return [23/255.0, 112/255.0, 224/255.0, 1.0]
  320. }
  321. }
  322. fileprivate var markupHighlightColorValues: [Double] {
  323. get {
  324. return [255/255.0, 175/255.0, 37/255.0, 1.0]
  325. }
  326. }
  327. fileprivate var markupStrikthroughColorValues: [Double] {
  328. get {
  329. return [243/255.0, 70/255.0, 91/255.0, 1.0]
  330. }
  331. }
  332. fileprivate var markupUnderlineColorValues: [Double] {
  333. get {
  334. self.markupStrikthroughColorValues
  335. }
  336. }
  337. fileprivate var markupPenColorValues: [Double] {
  338. get {
  339. self.markupStrikthroughColorValues
  340. }
  341. }
  342. fileprivate var markupTextColorValues: [Double] {
  343. get {
  344. return [0/255.0, 0/255.0, 0/255.0, 0.0]
  345. }
  346. }
  347. fileprivate var markupNoteColorValues: [Double] {
  348. get {
  349. return [255/255.0, 213/255.0, 115/255.0, 1.0]
  350. }
  351. }
  352. fileprivate var markupRectangleFillColorValues: [Double] {
  353. get {
  354. return self.markupHighlightColorValues
  355. }
  356. }
  357. fileprivate var markupRectangleBorderColorValues: [Double] {
  358. get {
  359. self.markupStrikthroughColorValues
  360. }
  361. }
  362. fileprivate var markupCircleFillColorValues: [Double] {
  363. get {
  364. self.markupStrikthroughColorValues
  365. }
  366. }
  367. fileprivate var markupCircleBorderColorValues: [Double] {
  368. get {
  369. return self.markupHighlightColorValues
  370. }
  371. }
  372. fileprivate var markupLineColorValues: [Double] {
  373. get {
  374. self.markupStrikthroughColorValues
  375. }
  376. }
  377. private func setColor(_ color: NSColor, forKey key: KMPreferenceKey) -> Bool {
  378. var red: CGFloat = 0.0
  379. var green: CGFloat = 0.0
  380. var blue: CGFloat = 0.0
  381. var alpha: CGFloat = 0.0
  382. color.usingColorSpaceName(.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  383. return KMPreferenceManager.shared.setData(data: [red, green, blue, alpha], forKey: key)
  384. }
  385. private func getColor(forKey key: KMPreferenceKey) -> NSColor {
  386. let colors: [Double] = self.getData(forKey: key) as! [Double]
  387. return NSColor(red: colors[0], green: colors[1], blue: colors[2], alpha: colors[3])
  388. }
  389. }
  390. // MARK: 扩展 General
  391. extension KMPreferenceManager {
  392. var openLastUnclosedDocumentWhenAppStart: Bool {
  393. get {
  394. return self.getData(forKey: KMOpenLastUnclosedDocumentWhenAppStartKey) as! Bool
  395. }
  396. set {
  397. let _ = self.setData(data: newValue, forKey: KMOpenLastUnclosedDocumentWhenAppStartKey)
  398. }
  399. }
  400. var openLastUnlockedDocumentWhenAppStart: Bool {
  401. get {
  402. return self.getData(forKey: KMOpenLastUnlockedDocumentWhenAppStartKey) as! Bool
  403. }
  404. set {
  405. let _ = self.setData(data: newValue, forKey: KMOpenLastUnlockedDocumentWhenAppStartKey)
  406. }
  407. }
  408. var documentMaximunDisplayNumber: Int {
  409. get {
  410. return self.getData(forKey: KMDocumentMaximunDisplayNumberKey) as! Int
  411. }
  412. set {
  413. let _ = self.setData(data: newValue, forKey: KMDocumentMaximunDisplayNumberKey)
  414. }
  415. }
  416. var autoSave: Bool {
  417. get {
  418. return self.getData(forKey: KMAutoSaveKey) as! Bool
  419. }
  420. set {
  421. let _ = self.setData(data: newValue, forKey: KMAutoSaveKey)
  422. }
  423. }
  424. var autoSavePerNumberMinute: Int {
  425. get {
  426. return self.getData(forKey: KMAutoSavePerNumberMinuteKey) as! Int
  427. }
  428. set {
  429. let _ = self.setData(data: newValue, forKey: KMAutoSavePerNumberMinuteKey)
  430. }
  431. }
  432. var closeFilePromptType: KMPreferenceCloseFilePromptType {
  433. get {
  434. let type: Int? = self.getData(forKey: KMCloseFilePromptTypeKey) as? Int
  435. if (type != nil && type! == 1) { // 无提示,直接保存
  436. return .noPromp
  437. }
  438. return .promp
  439. }
  440. set {
  441. if (newValue == .promp || newValue == .noPromp) {
  442. let _ = self.setData(data: newValue.rawValue, forKey: KMCloseFilePromptTypeKey)
  443. }
  444. }
  445. }
  446. var openImageFileType: Int {
  447. get {
  448. return self.getData(forKey: KMOpenImageFileTypeKey) as! Int
  449. }
  450. set {
  451. let _ = self.setData(data: newValue, forKey: KMOpenImageFileTypeKey)
  452. }
  453. }
  454. var author: String {
  455. get {
  456. return self.getData(forKey: KMGeneralAuthorNameKey) as! String
  457. }
  458. set {
  459. let _ = self.setData(data: newValue, forKey: KMGeneralAuthorNameKey)
  460. }
  461. }
  462. var setDefaultPDFReader: Bool {
  463. get {
  464. return self.getData(forKey: KMSetDefaultPDFReaderKey) as! Bool
  465. }
  466. set {
  467. let result = KMTools.setDefaultPDFReader(newValue)
  468. if (result) {
  469. let _ = self.setData(data: newValue, forKey: KMSetDefaultPDFReaderKey)
  470. }
  471. }
  472. }
  473. var savePasswordType: KMPreferenceSavePasswordType {
  474. get {
  475. let type: Int? = self.getData(forKey: KMSavePasswordTypeKey) as? Int
  476. if (type == nil || type! == 2) {
  477. return .ask
  478. }
  479. if (type! == 0) {
  480. return .always
  481. } else if (type! == 1) {
  482. return .never
  483. }
  484. return .ask
  485. }
  486. set {
  487. if (newValue == .always || newValue == .never || newValue == .ask) {
  488. let _ = self.setData(data: newValue.rawValue, forKey: KMSavePasswordTypeKey)
  489. }
  490. }
  491. }
  492. }
  493. // MARK: 扩展 Display
  494. extension KMPreferenceManager {
  495. var viewPageDisplayType: KMPDFDisplayType {
  496. get {
  497. let type: Int? = self.getData(forKey: KMViewPageDisplayTypeKey) as? Int
  498. if (type == nil || type == 1) {
  499. return .singlePageContinuous
  500. }
  501. if (type! == 0) {
  502. return .singlePage
  503. } else if (type! == 2) {
  504. return .twoUp
  505. } else if (type! == 3) {
  506. return .twoUpContinuous
  507. } else if (type! == 4) {
  508. return .bookMode
  509. } else if (type! == 5) {
  510. return .bookContinuous
  511. }
  512. return .singlePageContinuous
  513. }
  514. set {
  515. if (newValue == .singlePage || newValue == .singlePageContinuous || newValue == .twoUp ||
  516. newValue == .twoUpContinuous || newValue == .bookMode || newValue == .bookContinuous) {
  517. let _ = self.setData(data: newValue.rawValue, forKey: KMViewPageDisplayTypeKey)
  518. }
  519. }
  520. }
  521. var viewZoomScaleType: KMPDFZoomType {
  522. get {
  523. let type: Int? = self.getData(forKey: KMViewZoomScaleTypeKey) as? Int
  524. if (type == nil || type! == 0) {
  525. return .width
  526. } else if (type! == 1) {
  527. return .fit
  528. } else if (type! == 2) {
  529. return .actualSize
  530. }
  531. return .width
  532. }
  533. set {
  534. if (newValue == .width || newValue == .fit || newValue == .actualSize) {
  535. let _ = self.setData(data: newValue.rawValue, forKey: KMViewZoomScaleTypeKey)
  536. }
  537. }
  538. }
  539. var leftSideDisplayType: KMPreferenceLeftSideDisplayType {
  540. get {
  541. let type: Int? = self.getData(forKey: KMLeftSideDisplayTypeKey) as? Int
  542. if (type == nil || type! == 0) {
  543. return .closeWhenOpenFile
  544. } else if (type! == 1) {
  545. return .openAppSaveLastSelect
  546. }
  547. return .closeWhenOpenFile
  548. }
  549. set {
  550. if (newValue == .closeWhenOpenFile || newValue == .openAppSaveLastSelect) {
  551. let _ = self.setData(data: newValue.rawValue, forKey: KMLeftSideDisplayTypeKey)
  552. }
  553. }
  554. }
  555. var showOutlineList: Bool {
  556. get {
  557. return self.getData(forKey: KMShowOutlineListKey) as! Bool
  558. }
  559. set {
  560. let _ = self.setData(data: newValue, forKey: KMShowOutlineListKey)
  561. }
  562. }
  563. // var leftSideExpandType: Int {
  564. // get {
  565. // return self.getData(forKey: KMLeftSideExpandTypeKey) as! Int
  566. // }
  567. // set {
  568. // let _ = self.setData(data: newValue, forKey: KMLeftSideExpandTypeKey)
  569. // }
  570. // }
  571. var propertyPanelExpandType: KMPreferencePropertyPanelExpandType {
  572. get {
  573. let type: Int? = self.getData(forKey: KMPropertyPanelExpandTypeKey) as? Int
  574. if (type == nil || type! == 0) {
  575. return .auto
  576. } else if (type! == 1) {
  577. return .manual
  578. }
  579. return .auto
  580. }
  581. set {
  582. if (newValue == .auto || newValue == .manual) {
  583. let _ = self.setData(data: newValue.rawValue, forKey: KMPropertyPanelExpandTypeKey)
  584. }
  585. }
  586. }
  587. var highlightForms: Bool {
  588. get {
  589. return self.getData(forKey: KMHighlightFormsKey) as! Bool
  590. }
  591. set {
  592. let _ = self.setData(data: newValue, forKey: KMHighlightFormsKey)
  593. }
  594. }
  595. var pageIndicatorType: KMPreferencePageIndicatorDisplayType {
  596. get {
  597. let type: Int? = self.getData(forKey: KMPageIndicatorTypeKey) as? Int
  598. if (type == nil || type! == 2) {
  599. return .never
  600. } else if (type! == 0) {
  601. return .automatic
  602. } else if (type! == 1) {
  603. return .always
  604. }
  605. return .never
  606. }
  607. set {
  608. if (newValue == .automatic || newValue == .always || newValue == .never) {
  609. let _ = self.setData(data: newValue.rawValue, forKey: KMPageIndicatorTypeKey)
  610. }
  611. }
  612. }
  613. var highlightLinks: Bool {
  614. get {
  615. return self.getData(forKey: KMHighlightLinksKey) as! Bool
  616. }
  617. set {
  618. let _ = self.setData(data: newValue, forKey: KMHighlightLinksKey)
  619. }
  620. }
  621. var displayBackgroundNormalColor: NSColor {
  622. get {
  623. return self.getColor(forKey: KMDisplayBackgroundNormalColorKey)
  624. }
  625. set {
  626. let _ = self.setColor(newValue, forKey: KMDisplayBackgroundNormalColorKey)
  627. }
  628. }
  629. var displayBackgroundFullScreenColor: NSColor {
  630. get {
  631. return self.getColor(forKey: KMDisplayBackgroundFullScreenColorKey)
  632. }
  633. set {
  634. let _ = self.setColor(newValue, forKey: KMDisplayBackgroundFullScreenColorKey)
  635. }
  636. }
  637. var displayFieldHighlightingColor: NSColor {
  638. get {
  639. return self.getColor(forKey: KMDisplayFieldHighlightingColorKey)
  640. }
  641. set {
  642. let _ = self.setColor(newValue, forKey: KMDisplayFieldHighlightingColorKey)
  643. }
  644. }
  645. var displayRequiredFieldHighlightingColor: NSColor {
  646. get {
  647. return self.getColor(forKey: KMDisplayRequiredFieldHighlightingColorKey)
  648. }
  649. set {
  650. let _ = self.setColor(newValue, forKey: KMDisplayRequiredFieldHighlightingColorKey)
  651. }
  652. }
  653. }
  654. // MARK: 扩展 Markup
  655. extension KMPreferenceManager {
  656. var markupHighlightColor: NSColor {
  657. get {
  658. return self.getMarkData(forKey: CHighlightNoteColorKey)
  659. }
  660. set {
  661. let _ = self.setMarkData(color: newValue, forKey: CHighlightNoteColorKey)
  662. }
  663. }
  664. var markupStrikthroughColor: NSColor {
  665. get {
  666. return self.getMarkData(forKey: CStrikeOutNoteColorKey)
  667. }
  668. set {
  669. let _ = self.setMarkData(color:newValue, forKey: CStrikeOutNoteColorKey)
  670. }
  671. }
  672. var markupUnderlineColor: NSColor {
  673. get {
  674. return self.getMarkData(forKey: CUnderlineNoteColorKey)
  675. }
  676. set {
  677. let _ = self.setMarkData(color:newValue, forKey: CUnderlineNoteColorKey)
  678. }
  679. }
  680. var markupPenColor: NSColor {
  681. get {
  682. return self.getMarkData(forKey: CInkNoteColorKey)
  683. }
  684. set {
  685. let _ = self.setMarkData(color:newValue, forKey: CInkNoteColorKey)
  686. }
  687. }
  688. var markupTextColor: NSColor {
  689. get {
  690. return self.getMarkData(forKey: CFreeTextNoteFontColorKey)
  691. }
  692. set {
  693. let _ = self.setMarkData(color:newValue, forKey: CFreeTextNoteFontColorKey)
  694. }
  695. }
  696. var markupNoteColor: NSColor {
  697. get {
  698. return self.getMarkData(forKey: CAnchoredNoteColorKey)
  699. }
  700. set {
  701. let _ = self.setMarkData(color:newValue, forKey: CAnchoredNoteColorKey)
  702. }
  703. }
  704. var markupRectangleFillColor: NSColor {
  705. get {
  706. return self.getMarkData(forKey: CSquareNoteInteriorColorKey)
  707. }
  708. set {
  709. let _ = self.setMarkData(color:newValue, forKey: CSquareNoteInteriorColorKey)
  710. }
  711. }
  712. var markupRectangleBorderColor: NSColor {
  713. get {
  714. return self.getMarkData(forKey: CSquareNoteColorKey)
  715. }
  716. set {
  717. let _ = self.setMarkData(color:newValue, forKey: CSquareNoteColorKey)
  718. }
  719. }
  720. var markupCircleFillColor: NSColor {
  721. get {
  722. return self.getMarkData(forKey: CCircleNoteInteriorColorKey)
  723. }
  724. set {
  725. let _ = self.setMarkData(color:newValue, forKey: CCircleNoteInteriorColorKey)
  726. }
  727. }
  728. var markupCircleBorderColor: NSColor {
  729. get {
  730. return self.getMarkData(forKey: CCircleNoteColorKey)
  731. }
  732. set {
  733. let _ = self.setMarkData(color:newValue, forKey: CCircleNoteColorKey)
  734. }
  735. }
  736. var markupLineColor: NSColor {
  737. get {
  738. return self.getMarkData(forKey: CAnnotationSelfSignLineColorKey)
  739. }
  740. set {
  741. let _ = self.setMarkData(color:newValue, forKey: CAnnotationSelfSignLineColorKey)
  742. }
  743. }
  744. var markupFontTextType: Int {
  745. get {
  746. return self.getData(forKey: KMMarkupFontTextTypeKey) as! Int
  747. }
  748. set {
  749. let _ = self.setData(data: newValue, forKey: KMMarkupFontTextTypeKey)
  750. }
  751. }
  752. var markupFontTextAligmentType: Int {
  753. get {
  754. return self.getAlignment(for: CFreeTextNoteAlignmentKey)
  755. }
  756. set {
  757. let _ = self.setAlignment(alignment: newValue, forKey: CFreeTextNoteAlignmentKey)
  758. }
  759. }
  760. var markupFontNoteType: Int {
  761. get {
  762. return self.getData(forKey: KMMarkupFontNoteTypeKey) as! Int
  763. }
  764. set {
  765. let _ = self.setData(data: newValue, forKey: KMMarkupFontNoteTypeKey)
  766. }
  767. }
  768. }
  769. // MARK: -
  770. // MARK: UserDefaults
  771. internal let kKMLastOpenFilepathKey = "lastOpenFilepath"
  772. internal let kKMViewSettingKey = "viewSetting"
  773. internal let kKMPageNumberKey = "pageNumber"
  774. extension KMPreferenceManager {
  775. var lastOpenFilepath: String? {
  776. get {
  777. return UserDefaults.standard.value(forKey: kKMLastOpenFilepathKey) as? String
  778. }
  779. set {
  780. UserDefaults.standard.set(newValue, forKey: kKMLastOpenFilepathKey)
  781. UserDefaults.standard.synchronize()
  782. }
  783. }
  784. var viewSetting: [KMPreferenceViewSetting : Any]? {
  785. get {
  786. return UserDefaults.standard.value(forKey: kKMViewSettingKey) as? [KMPreferenceViewSetting : Any]
  787. }
  788. set {
  789. if (newValue == nil) {
  790. UserDefaults.standard.set(newValue, forKey: kKMViewSettingKey)
  791. UserDefaults.standard.synchronize()
  792. return
  793. }
  794. var viewSetting: [String : Any]? = UserDefaults.standard.value(forKey: kKMViewSettingKey) as? [String : Any]
  795. var info: [String : Any] = [:]
  796. if (viewSetting != nil) {
  797. for (key, value) in viewSetting! {
  798. info.updateValue(value, forKey: key)
  799. }
  800. }
  801. for (key, value) in newValue! {
  802. if (key == .pageNumber) { // 只处理 枚举
  803. info.updateValue(value, forKey: key.rawValue)
  804. }
  805. }
  806. UserDefaults.standard.set(info, forKey: kKMViewSettingKey)
  807. UserDefaults.standard.synchronize()
  808. }
  809. }
  810. func setPageNumber(_ number: Int, forKey key: String) {
  811. UserDefaults.standard.set(number, forKey: "\(key)+\(kKMPageNumberKey)")
  812. UserDefaults.standard.synchronize()
  813. }
  814. func getPageNumber(forKey key: String) -> Int? {
  815. return UserDefaults.standard.value(forKey: "\(key)+\(kKMPageNumberKey)") as? Int
  816. }
  817. }
  818. // MARK: -
  819. // MARK: Qiuck
  820. extension KMPreferenceManager {
  821. internal func closeFileIsPrompt() -> Bool {
  822. return self.closeFilePromptType == .promp
  823. }
  824. func leftSideNeedCloseWhenOpenFile() -> Bool {
  825. return KMPreferenceManager.shared.leftSideDisplayType == .closeWhenOpenFile
  826. }
  827. var autoExpandPropertyPanel: Bool {
  828. get {
  829. return KMPreferenceManager.shared.propertyPanelExpandType == .auto
  830. }
  831. }
  832. var pageIndicatorIsShow: Bool {
  833. get {
  834. return KMPreferenceManager.shared.pageIndicatorType != .never
  835. }
  836. }
  837. }