/Source/AlephNote.Common/Themes/AlephTheme.cs

https://github.com/Mikescher/AlephNote · C# · 312 lines · 267 code · 44 blank · 1 comment · 0 complexity · 7c1444440357472b4eb0aca6091bc161 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. namespace AlephNote.Common.Themes
  6. {
  7. [DebuggerDisplay("{Name} v{Version} ({SourceFilename})")]
  8. public sealed class AlephTheme
  9. {
  10. #region Definition
  11. public enum AlephThemePropType { Color, Brush, Thickness, Integer, Double, Boolean, CornerRadius }
  12. public static readonly Tuple<string, AlephThemePropType>[] THEME_PROPERTIES =
  13. {
  14. Tuple.Create("window.background", AlephThemePropType.Brush ),
  15. Tuple.Create("window.foreground", AlephThemePropType.Brush ),
  16. Tuple.Create("window.splitter", AlephThemePropType.Brush ),
  17. Tuple.Create("window.notetitle:foreground", AlephThemePropType.Brush ),
  18. Tuple.Create("window.notetitle:caret", AlephThemePropType.Brush ),
  19. Tuple.Create("window.notetitle.placeholder", AlephThemePropType.Brush ),
  20. Tuple.Create("window.changedate:foreground", AlephThemePropType.Brush ),
  21. Tuple.Create("window.menubar:background", AlephThemePropType.Brush ),
  22. Tuple.Create("window.menubar:foreground", AlephThemePropType.Brush ),
  23. Tuple.Create("window.menubar.submenu:foreground", AlephThemePropType.Brush ),
  24. Tuple.Create("window.tageditor.popup:background", AlephThemePropType.Brush ),
  25. Tuple.Create("window.tageditor.popup:bordercolor", AlephThemePropType.Brush ),
  26. Tuple.Create("window.tageditor.popup:foreground", AlephThemePropType.Brush ),
  27. Tuple.Create("window.tageditor.placeholder", AlephThemePropType.Brush ),
  28. Tuple.Create("window.tageditor.foreground", AlephThemePropType.Brush ),
  29. Tuple.Create("window.tageditor.tag:background", AlephThemePropType.Brush ),
  30. Tuple.Create("window.tageditor.tag:bordercolor_default", AlephThemePropType.Brush ),
  31. Tuple.Create("window.tageditor.tag:bordercolor_highlighted", AlephThemePropType.Brush ),
  32. Tuple.Create("window.tageditor.tag:foreground", AlephThemePropType.Brush ),
  33. Tuple.Create("window.tageditor.tag:borderradius", AlephThemePropType.CornerRadius),
  34. Tuple.Create("window.tageditor.tag:highlight", AlephThemePropType.Color ),
  35. Tuple.Create("window.tageditor.tagbutton:foreground", AlephThemePropType.Brush ),
  36. Tuple.Create("window.tageditor.tagbutton:background", AlephThemePropType.Brush ),
  37. Tuple.Create("window.tageditor.tagbutton:border", AlephThemePropType.Brush ),
  38. Tuple.Create("window.tageditor.tagbutton:border_thickness", AlephThemePropType.Thickness ),
  39. Tuple.Create("window.tageditor.tagbutton.popup:background", AlephThemePropType.Brush ),
  40. Tuple.Create("window.tageditor.tagbutton.popup:bordercolor", AlephThemePropType.Brush ),
  41. Tuple.Create("window.tageditor.tagbutton.popup:foreground", AlephThemePropType.Brush ),
  42. Tuple.Create("window.tageditor.tagbutton.popup:border_thickness", AlephThemePropType.Thickness ),
  43. Tuple.Create("window.tageditor.tagbutton.popup:padding", AlephThemePropType.Thickness ),
  44. Tuple.Create("window.tageditor.tagbutton.popup:margin", AlephThemePropType.Thickness ),
  45. Tuple.Create("window.pathdisplay:foregroud", AlephThemePropType.Brush ),
  46. Tuple.Create("window.pathdisplay.element:foregroud", AlephThemePropType.Brush ),
  47. Tuple.Create("window.pathdisplay.element:background", AlephThemePropType.Brush ),
  48. Tuple.Create("window.pathdisplay.element:background_hover", AlephThemePropType.Brush ),
  49. Tuple.Create("window.pathdisplay.element:border", AlephThemePropType.Brush ),
  50. Tuple.Create("window.pathdisplay.button:foreground", AlephThemePropType.Brush ),
  51. Tuple.Create("window.pathdisplay.button:background", AlephThemePropType.Brush ),
  52. Tuple.Create("window.pathdisplay.button:border", AlephThemePropType.Brush ),
  53. Tuple.Create("window.pathdisplay.popup:background", AlephThemePropType.Brush ),
  54. Tuple.Create("window.pathdisplay.popup:border", AlephThemePropType.Brush ),
  55. Tuple.Create("window.pathdisplay.popup:border_thickness", AlephThemePropType.Thickness ),
  56. Tuple.Create("window.pathdisplay.popup.text:foreground", AlephThemePropType.Brush ),
  57. Tuple.Create("window.pathdisplay.popup.list:foreground", AlephThemePropType.Brush ),
  58. Tuple.Create("window.pathdisplay.popup.list:background", AlephThemePropType.Brush ),
  59. Tuple.Create("window.pathdisplay.popup.list.selected:foreground", AlephThemePropType.Brush ),
  60. Tuple.Create("window.pathdisplay.popup.list.selected:background", AlephThemePropType.Brush ),
  61. Tuple.Create("window.pathdisplay.popup.button:foreground", AlephThemePropType.Brush ),
  62. Tuple.Create("window.pathdisplay.popup.button:background", AlephThemePropType.Brush ),
  63. Tuple.Create("window.pathdisplay.popup.button:border", AlephThemePropType.Brush ),
  64. Tuple.Create("window.inlinesearch:background", AlephThemePropType.Brush ),
  65. Tuple.Create("window.inlinesearch:foreground", AlephThemePropType.Brush ),
  66. Tuple.Create("window.inlinesearch.textbox:background", AlephThemePropType.Brush ),
  67. Tuple.Create("window.inlinesearch.textbox:foreground", AlephThemePropType.Brush ),
  68. Tuple.Create("window.inlinesearch.btnSearch:background", AlephThemePropType.Brush ),
  69. Tuple.Create("window.inlinesearch.btnSearch:foreground", AlephThemePropType.Brush ),
  70. Tuple.Create("window.inlinesearch.btnCaseIns:background", AlephThemePropType.Brush ),
  71. Tuple.Create("window.inlinesearch.btnCaseIns:foreground", AlephThemePropType.Brush ),
  72. Tuple.Create("window.inlinesearch.btnWholeWord:background", AlephThemePropType.Brush ),
  73. Tuple.Create("window.inlinesearch.btnWholeWord:foreground", AlephThemePropType.Brush ),
  74. Tuple.Create("window.inlinesearch.btnRegex:background", AlephThemePropType.Brush ),
  75. Tuple.Create("window.inlinesearch.btnRegex:foreground", AlephThemePropType.Brush ),
  76. Tuple.Create("window.globalsearch.input:foreground", AlephThemePropType.Brush ),
  77. Tuple.Create("window.globalsearch.input:background", AlephThemePropType.Brush ),
  78. Tuple.Create("window.globalsearch.input:border", AlephThemePropType.Brush ),
  79. Tuple.Create("window.globalsearch.placeholder:foreground", AlephThemePropType.Brush ),
  80. Tuple.Create("window.globalsearch.button:foreground", AlephThemePropType.Brush ),
  81. Tuple.Create("window.globalsearch.button:background", AlephThemePropType.Brush ),
  82. Tuple.Create("window.globalsearch.button:border", AlephThemePropType.Brush ),
  83. Tuple.Create("window.globalsearch.button:border_thickness", AlephThemePropType.Thickness ),
  84. Tuple.Create("window.globalsearch.tagbutton:foreground", AlephThemePropType.Brush ),
  85. Tuple.Create("window.globalsearch.tagbutton:background", AlephThemePropType.Brush ),
  86. Tuple.Create("window.globalsearch.tagbutton:border", AlephThemePropType.Brush ),
  87. Tuple.Create("window.globalsearch.tagbutton:border_thickness", AlephThemePropType.Thickness ),
  88. Tuple.Create("window.globalsearch.tagbutton.popup:background", AlephThemePropType.Brush ),
  89. Tuple.Create("window.globalsearch.tagbutton.popup:bordercolor", AlephThemePropType.Brush ),
  90. Tuple.Create("window.globalsearch.tagbutton.popup:foreground", AlephThemePropType.Brush ),
  91. Tuple.Create("window.globalsearch.tagbutton.popup:border_thickness", AlephThemePropType.Thickness ),
  92. Tuple.Create("window.globalsearch.tagbutton.popup:padding", AlephThemePropType.Thickness ),
  93. Tuple.Create("window.globalsearch.tagbutton.popup:margin", AlephThemePropType.Thickness ),
  94. Tuple.Create("window.notesview.flat:background", AlephThemePropType.Brush ),
  95. Tuple.Create("window.notesview.flat:foreground", AlephThemePropType.Brush ),
  96. Tuple.Create("window.notesview.flat:bordercolor", AlephThemePropType.Brush ),
  97. Tuple.Create("window.notesview.flat.selected:background", AlephThemePropType.Brush ),
  98. Tuple.Create("window.notesview.flat.selected:foreground", AlephThemePropType.Brush ),
  99. Tuple.Create("window.notesview.flat.datetime1:foreground", AlephThemePropType.Brush ),
  100. Tuple.Create("window.notesview.flat.datetime2:foreground", AlephThemePropType.Brush ),
  101. Tuple.Create("window.notesview.flat.preview:foreground", AlephThemePropType.Brush ),
  102. Tuple.Create("window.notesview.flat.separator", AlephThemePropType.Brush ),
  103. Tuple.Create("window.notesview.flat.vborder:foreground", AlephThemePropType.Brush ),
  104. Tuple.Create("window.notesview.flat.vborder:background", AlephThemePropType.Brush ),
  105. Tuple.Create("window.notesview.flat.vborder:margin", AlephThemePropType.Thickness ),
  106. Tuple.Create("window.notesview.flat.scrollbar_v:visible", AlephThemePropType.Boolean ),
  107. Tuple.Create("window.notesview.hierarchical.list:background", AlephThemePropType.Brush ),
  108. Tuple.Create("window.notesview.hierarchical.list:foreground", AlephThemePropType.Brush ),
  109. Tuple.Create("window.notesview.hierarchical.list:bordercolor", AlephThemePropType.Brush ),
  110. Tuple.Create("window.notesview.hierarchical.list.selected:background", AlephThemePropType.Brush ),
  111. Tuple.Create("window.notesview.hierarchical.list.selected:foreground", AlephThemePropType.Brush ),
  112. Tuple.Create("window.notesview.hierarchical.list.datetime1:foreground", AlephThemePropType.Brush ),
  113. Tuple.Create("window.notesview.hierarchical.list.datetime2:foreground", AlephThemePropType.Brush ),
  114. Tuple.Create("window.notesview.hierarchical.list.preview:foreground", AlephThemePropType.Brush ),
  115. Tuple.Create("window.notesview.hierarchical.list.separator", AlephThemePropType.Brush ),
  116. Tuple.Create("window.notesview.hierarchical.list.vborder:foreground", AlephThemePropType.Brush ),
  117. Tuple.Create("window.notesview.hierarchical.list.vborder:background", AlephThemePropType.Brush ),
  118. Tuple.Create("window.notesview.hierarchical.list.vborder:margin", AlephThemePropType.Thickness ),
  119. Tuple.Create("window.notesview.hierarchical.list.scrollbar_v:visible", AlephThemePropType.Boolean ),
  120. Tuple.Create("window.notesview.hierarchical.splitter", AlephThemePropType.Brush ),
  121. Tuple.Create("window.notesview.hierarchical.tree:background", AlephThemePropType.Brush ),
  122. Tuple.Create("window.notesview.hierarchical.tree:foreground", AlephThemePropType.Brush ),
  123. Tuple.Create("window.notesview.hierarchical.tree:bordercolor", AlephThemePropType.Brush ),
  124. Tuple.Create("window.notesview.hierarchical.tree.selected:background", AlephThemePropType.Brush ),
  125. Tuple.Create("window.notesview.hierarchical.tree.selected:foreground", AlephThemePropType.Brush ),
  126. Tuple.Create("window.notesview.hierarchical.tree.scrollbar_v:visible", AlephThemePropType.Boolean ),
  127. Tuple.Create("window.statusbar:background", AlephThemePropType.Brush ),
  128. Tuple.Create("window.statusbar:foreground", AlephThemePropType.Brush ),
  129. Tuple.Create("window.statusbar.btnReload:foreground", AlephThemePropType.Brush ),
  130. Tuple.Create("window.statusbar.btnReload:background", AlephThemePropType.Brush ),
  131. Tuple.Create("window.statusbar.btnReload:border", AlephThemePropType.Brush ),
  132. //-------------------------------------------------------------------------------------
  133. Tuple.Create("scintilla.background", AlephThemePropType.Color ),
  134. Tuple.Create("scintilla.bordercolor", AlephThemePropType.Brush ),
  135. Tuple.Create("scintilla.whitespace:size", AlephThemePropType.Integer ),
  136. Tuple.Create("scintilla.whitespace:color", AlephThemePropType.Color ),
  137. Tuple.Create("scintilla.whitespace:background", AlephThemePropType.Color ),
  138. Tuple.Create("scintilla.caret:foreground", AlephThemePropType.Color ),
  139. Tuple.Create("scintilla.caret:background", AlephThemePropType.Color ),
  140. Tuple.Create("scintilla.caret:background_alpha", AlephThemePropType.Integer ),
  141. Tuple.Create("scintilla.caret:visible", AlephThemePropType.Boolean ),
  142. Tuple.Create("scintilla.selection:foreground", AlephThemePropType.Color ),
  143. Tuple.Create("scintilla.selection:override_foreground", AlephThemePropType.Boolean ),
  144. Tuple.Create("scintilla.selection:background", AlephThemePropType.Color ),
  145. Tuple.Create("scintilla.scrollbar_h:visible", AlephThemePropType.Boolean ),
  146. Tuple.Create("scintilla.scrollbar_v:visible", AlephThemePropType.Boolean ),
  147. Tuple.Create("scintilla.default:foreground", AlephThemePropType.Color ),
  148. Tuple.Create("scintilla.default:background", AlephThemePropType.Color ),
  149. Tuple.Create("scintilla.default:underline", AlephThemePropType.Boolean ),
  150. Tuple.Create("scintilla.default:bold", AlephThemePropType.Boolean ),
  151. Tuple.Create("scintilla.default:italic", AlephThemePropType.Boolean ),
  152. Tuple.Create("scintilla.link:foreground", AlephThemePropType.Color ),
  153. Tuple.Create("scintilla.link:background", AlephThemePropType.Color ),
  154. Tuple.Create("scintilla.link:underline", AlephThemePropType.Boolean ),
  155. Tuple.Create("scintilla.link:bold", AlephThemePropType.Boolean ),
  156. Tuple.Create("scintilla.link:italic", AlephThemePropType.Boolean ),
  157. Tuple.Create("scintilla.markdown.default:foreground", AlephThemePropType.Color ),
  158. Tuple.Create("scintilla.markdown.default:background", AlephThemePropType.Color ),
  159. Tuple.Create("scintilla.markdown.default:underline", AlephThemePropType.Boolean ),
  160. Tuple.Create("scintilla.markdown.default:bold", AlephThemePropType.Boolean ),
  161. Tuple.Create("scintilla.markdown.default:italic", AlephThemePropType.Boolean ),
  162. Tuple.Create("scintilla.markdown.emph:foreground", AlephThemePropType.Color ),
  163. Tuple.Create("scintilla.markdown.emph:background", AlephThemePropType.Color ),
  164. Tuple.Create("scintilla.markdown.emph:underline", AlephThemePropType.Boolean ),
  165. Tuple.Create("scintilla.markdown.emph:bold", AlephThemePropType.Boolean ),
  166. Tuple.Create("scintilla.markdown.emph:italic", AlephThemePropType.Boolean ),
  167. Tuple.Create("scintilla.markdown.strong_emph:foreground", AlephThemePropType.Color ),
  168. Tuple.Create("scintilla.markdown.strong_emph:background", AlephThemePropType.Color ),
  169. Tuple.Create("scintilla.markdown.strong_emph:underline", AlephThemePropType.Boolean ),
  170. Tuple.Create("scintilla.markdown.strong_emph:bold", AlephThemePropType.Boolean ),
  171. Tuple.Create("scintilla.markdown.strong_emph:italic", AlephThemePropType.Boolean ),
  172. Tuple.Create("scintilla.markdown.header:foreground", AlephThemePropType.Color ),
  173. Tuple.Create("scintilla.markdown.header:background", AlephThemePropType.Color ),
  174. Tuple.Create("scintilla.markdown.header:underline", AlephThemePropType.Boolean ),
  175. Tuple.Create("scintilla.markdown.header:bold", AlephThemePropType.Boolean ),
  176. Tuple.Create("scintilla.markdown.header:italic", AlephThemePropType.Boolean ),
  177. Tuple.Create("scintilla.markdown.code:foreground", AlephThemePropType.Color ),
  178. Tuple.Create("scintilla.markdown.code:background", AlephThemePropType.Color ),
  179. Tuple.Create("scintilla.markdown.code:underline", AlephThemePropType.Boolean ),
  180. Tuple.Create("scintilla.markdown.code:bold", AlephThemePropType.Boolean ),
  181. Tuple.Create("scintilla.markdown.code:italic", AlephThemePropType.Boolean ),
  182. Tuple.Create("scintilla.markdown.list:foreground", AlephThemePropType.Color ),
  183. Tuple.Create("scintilla.markdown.list:background", AlephThemePropType.Color ),
  184. Tuple.Create("scintilla.markdown.list:underline", AlephThemePropType.Boolean ),
  185. Tuple.Create("scintilla.markdown.list:bold", AlephThemePropType.Boolean ),
  186. Tuple.Create("scintilla.markdown.list:italic", AlephThemePropType.Boolean ),
  187. Tuple.Create("scintilla.markdown.url:foreground", AlephThemePropType.Color ),
  188. Tuple.Create("scintilla.markdown.url:background", AlephThemePropType.Color ),
  189. Tuple.Create("scintilla.markdown.url:underline", AlephThemePropType.Boolean ),
  190. Tuple.Create("scintilla.markdown.url:underline_link", AlephThemePropType.Boolean ),
  191. Tuple.Create("scintilla.markdown.url:bold", AlephThemePropType.Boolean ),
  192. Tuple.Create("scintilla.markdown.url:italic", AlephThemePropType.Boolean ),
  193. Tuple.Create("scintilla.margin.numbers:foreground", AlephThemePropType.Color ),
  194. Tuple.Create("scintilla.margin.numbers:background", AlephThemePropType.Color ),
  195. Tuple.Create("scintilla.margin.numbers:underline", AlephThemePropType.Boolean ),
  196. Tuple.Create("scintilla.margin.numbers:bold", AlephThemePropType.Boolean ),
  197. Tuple.Create("scintilla.margin.numbers:italic", AlephThemePropType.Boolean ),
  198. Tuple.Create("scintilla.margin.symbols:background", AlephThemePropType.Color ),
  199. Tuple.Create("scintilla.search.local:color", AlephThemePropType.Color ),
  200. Tuple.Create("scintilla.search.local:alpha", AlephThemePropType.Integer ),
  201. Tuple.Create("scintilla.search.local:outline_alpha", AlephThemePropType.Integer ),
  202. Tuple.Create("scintilla.search.local:under_text", AlephThemePropType.Boolean ),
  203. Tuple.Create("scintilla.search.global:color", AlephThemePropType.Color ),
  204. Tuple.Create("scintilla.search.global:alpha", AlephThemePropType.Integer ),
  205. Tuple.Create("scintilla.search.global:outline_alpha", AlephThemePropType.Integer ),
  206. Tuple.Create("scintilla.search.global:under_text", AlephThemePropType.Boolean ),
  207. };
  208. public static readonly Tuple<string, Uri>[] RESOURCES =
  209. {
  210. Tuple.Create("folder_all.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/folder_all.png") ),
  211. Tuple.Create("folder_any.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/folder_any.png") ),
  212. Tuple.Create("folder_none.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/folder_none.png") ),
  213. Tuple.Create("folder_root.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/folder_root.png") ),
  214. Tuple.Create("IconGreen.ico", new Uri("pack://application:,,,/AlephNote.App;component/Resources/IconGreen.ico") ),
  215. Tuple.Create("IconRed.ico", new Uri("pack://application:,,,/AlephNote.App;component/Resources/IconRed.ico") ),
  216. Tuple.Create("IconSync.ico", new Uri("pack://application:,,,/AlephNote.App;component/Resources/IconSync.ico") ),
  217. Tuple.Create("IconYellow.ico", new Uri("pack://application:,,,/AlephNote.App;component/Resources/IconYellow.ico") ),
  218. Tuple.Create("lock.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/lock.png") ),
  219. Tuple.Create("lock_open.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/lock_open.png") ),
  220. Tuple.Create("lock_small.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/lock_small.png") ),
  221. Tuple.Create("plus.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/plus.png") ),
  222. Tuple.Create("refresh.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/refresh.png") ),
  223. Tuple.Create("star.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/star.png") ),
  224. Tuple.Create("tag.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/tag.png") ),
  225. Tuple.Create("margin_check_mix.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/margin_check_mix.png") ),
  226. Tuple.Create("margin_check_off.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/margin_check_off.png") ),
  227. Tuple.Create("margin_check_on.png", new Uri("pack://application:,,,/AlephNote.App;component/Resources/margin_check_on.png") ),
  228. };
  229. #endregion
  230. public string Name { get; }
  231. public Version Version { get; }
  232. public string Author { get; }
  233. public CompatibilityVersionRange Compatibility { get; }
  234. public string SourceFilename { get; }
  235. public string Source { get; }
  236. public AlephThemeType ThemeType { get; }
  237. public IReadOnlyDictionary<string, byte[]> Resources { get; }
  238. private readonly Dictionary<string, AlephThemePropertyValue> _allProperties = new Dictionary<string, AlephThemePropertyValue>();
  239. public AlephTheme(string n, Version v, CompatibilityVersionRange c, string fn, string src, string a, AlephThemeType att, IReadOnlyDictionary<string, byte[]> res)
  240. {
  241. Name = n;
  242. Version = v;
  243. Author = a;
  244. Compatibility = c;
  245. SourceFilename = fn;
  246. Source = src;
  247. ThemeType = att;
  248. Resources = res;
  249. }
  250. public void AddProperty(string name, AlephThemePropertyValue value)
  251. {
  252. _allProperties.Add(name.ToLower(), value);
  253. }
  254. public AlephThemePropertyValue TryGet(string name)
  255. {
  256. return _allProperties.TryGetValue(name.ToLower(), out var result) ? result : null;
  257. }
  258. public string GetXmlStr(string name)
  259. {
  260. var obj = TryGet(name);
  261. return obj?.XmlDirectValue ?? "N/A";
  262. }
  263. public static Uri GetDefaultResourceUri(string name)
  264. {
  265. return RESOURCES.First(p => string.Equals(p.Item1, name, StringComparison.CurrentCultureIgnoreCase)).Item2;
  266. }
  267. }
  268. }