source: Common/Theme.cs

Last change on this file was 14, checked in by chronos, 21 months ago
  • Modified: Various improvements.
File size: 9.5 KB
Line 
1using System.Windows.Forms;
2using System.Drawing;
3using System.ComponentModel;
4
5namespace Common
6{
7 public class Theme
8 {
9 public delegate void ApplyThemeHandler(Component component);
10 public static event ApplyThemeHandler OnApplyTheme;
11 public static Color ColorWindow;
12 public static Color ColorWindowText;
13 public static Color ColorControl;
14 public static Color ColorControlText;
15 public static Color ColorControlSelected;
16 public static bool Used;
17 private static string _name;
18 public static string Name
19 {
20 get => _name;
21 set
22 {
23 _name = value;
24 switch (value)
25 {
26 case "Dark":
27 ColorWindow = Color.FromArgb(0x20, 0x20, 0x20);
28 ColorWindowText = Color.White;
29 ColorControl = Color.FromArgb(0x40, 0x40, 0x40);
30 ColorControlText = Color.White;
31 ColorControlSelected = Color.FromArgb(255, 96, 125, 155);
32 break;
33 case "Light":
34 ColorWindow = Color.White;
35 ColorWindowText = Color.Black;
36 ColorControl = Color.FromArgb(0xe0, 0xe0, 0xe0);
37 ColorControlText = Color.Black;
38 ColorControlSelected = Color.FromArgb(255, 196, 225, 255);
39 break;
40 default:
41 _name = "System";
42 ColorWindow = Color.FromKnownColor(KnownColor.Window);
43 ColorWindowText = Color.FromKnownColor(KnownColor.WindowText);
44 ColorControl = Color.FromKnownColor(KnownColor.Control);
45 ColorControlText = Color.FromKnownColor(KnownColor.ControlText);
46 ColorControlSelected = Color.FromArgb(255, 196, 225, 255);
47 break;
48 }
49 }
50 }
51
52 static Theme()
53 {
54 Name = "System";
55 }
56
57 public static Color AdjustColor(Color color)
58 {
59 if (color == Color.White) color = ColorWindow;
60 else if (color == Color.Black) color = ColorWindowText;
61 else
62 {
63 if (Name == "Dark")
64 {
65 // Exchange dark with light colors and vice versa
66 if (color == Color.DarkBlue) color = Color.LightBlue;
67 else if (color == Color.LightBlue) color = Color.DarkBlue;
68 else if (color == Color.DarkGreen) color = Color.LightGreen;
69 else if (color == Color.LightGreen) color = Color.DarkGreen;
70 else if (color == Color.DarkRed) color = Color.LightCoral;
71 else if (color == Color.LightCoral) color = Color.DarkRed;
72 else if (color == Color.PowderBlue) color = Color.Navy;
73 else if (color == Color.Navy) color = Color.PowderBlue;
74 else if (color == Color.LightCyan) color = Color.DarkCyan;
75 else if (color == Color.DarkCyan) color = Color.LightCyan;
76 else if (color == Color.Cyan) color = Color.Teal;
77 else if (color == Color.Teal) color = Color.Cyan;
78 else if (color == Color.Yellow) color = Color.Brown;
79 else if (color == Color.Brown) color = Color.Yellow;
80 else if (color == Color.LightGray) color = Color.DarkGray;
81 else if (color == Color.DarkGray) color = Color.LightGray;
82 else if (color == Color.Orchid) color = Color.DarkOrchid;
83 else if (color == Color.DarkOrchid) color = Color.Orchid;
84 }
85 }
86
87 return color;
88 }
89
90 public static void ApplyTheme(Component component)
91 {
92 if (component is Control control)
93 {
94 foreach (Control child in control.Controls)
95 {
96 ApplyTheme(child);
97 }
98
99 if ((control is TextBox) || (control is NumericUpDown) || (control is ComboBox) || (control is RichTextBox)
100 || (control is ListView))
101 {
102 control.BackColor = ColorWindow;
103 control.ForeColor = ColorWindowText;
104 }
105 else
106 {
107 control.BackColor = ColorControl;
108 control.ForeColor = ColorControlText;
109 }
110 if (control.ContextMenuStrip != null)
111 {
112 ApplyTheme(control.ContextMenuStrip);
113 }
114 }
115
116 if (component is SplitButton splitButton)
117 {
118 ApplyTheme(splitButton.Menu);
119 }
120 if ((component is Button button) && (Name == "System"))
121 {
122 button.UseVisualStyleBackColor = true;
123 } else
124 if (component is LinkLabel linkLabel)
125 {
126 linkLabel.LinkColor = ColorControlText;
127 linkLabel.ActiveLinkColor = ColorControlText;
128 linkLabel.VisitedLinkColor = ColorControlText;
129 } else
130 if (component is TabControl tabControl)
131 {
132 foreach (TabPage tabPage in tabControl.TabPages)
133 {
134 ApplyTheme(tabPage);
135 }
136 } else
137 if (component is ToolStrip toolStrip)
138 {
139 toolStrip.RenderMode = ToolStripRenderMode.Professional;
140 toolStrip.Renderer = new ToolStripProfessionalRenderer(new ThemeColorTable());
141 foreach (ToolStripItem item in toolStrip.Items)
142 {
143 if (item is ToolStripMenuItem toolStripMenuItem)
144 {
145 if (toolStripMenuItem.DropDownItems.Count > 0)
146 {
147 foreach (ToolStripItem dropDownItem in toolStripMenuItem.DropDownItems)
148 {
149 ApplyTheme(dropDownItem);
150 }
151 }
152 }
153 ApplyTheme(item);
154 }
155 } else
156 if (component is ToolStripItem toolStripItem)
157 {
158 toolStripItem.ForeColor = ColorControlText;
159 toolStripItem.BackColor = ColorControl;
160 if (toolStripItem is ToolStripMenuItem toolStripMenuItem)
161 {
162 if (toolStripMenuItem.DropDownItems.Count > 0)
163 {
164 foreach (ToolStripItem dropDownItem in toolStripMenuItem.DropDownItems)
165 {
166 ApplyTheme(dropDownItem);
167 }
168 }
169 }
170 } else
171 if (component is DataGridView dataGridView)
172 {
173 dataGridView.BackgroundColor = ColorWindow;
174 dataGridView.DefaultCellStyle.BackColor = ColorWindow;
175 dataGridView.DefaultCellStyle.ForeColor = ColorWindowText;
176 dataGridView.ColumnHeadersDefaultCellStyle.BackColor = ColorWindow;
177 dataGridView.ColumnHeadersDefaultCellStyle.ForeColor = ColorWindowText;
178 } else
179 if (component is RichTextBox richTextBox)
180 {
181 richTextBox.SelectAll();
182 richTextBox.SelectionColor = ColorWindowText;
183 richTextBox.SelectionLength = 0;
184 } else
185 {
186 OnApplyTheme?.Invoke(component);
187 }
188 }
189
190 public static void UseTheme(Form form)
191 {
192 if (!Used && (_name == "System")) return;
193 ApplyTheme(form);
194 Used = true;
195 }
196 }
197
198 public class ThemeColorTable : ProfessionalColorTable
199 {
200 public override Color MenuStripGradientBegin => Theme.ColorControl;
201 public override Color MenuStripGradientEnd => Theme.ColorControl;
202 public override Color ToolStripContentPanelGradientBegin => Theme.ColorControl;
203 public override Color ToolStripContentPanelGradientEnd => Theme.ColorControl;
204 public override Color ToolStripDropDownBackground => Theme.ColorControl;
205 public override Color ToolStripGradientBegin => Theme.ColorControl;
206 public override Color ToolStripGradientMiddle => Theme.ColorControl;
207 public override Color ToolStripGradientEnd => Theme.ColorControl;
208 public override Color MenuItemSelected => Theme.ColorControlSelected;
209 public override Color MenuItemSelectedGradientBegin => Theme.ColorControlSelected;
210 public override Color MenuItemSelectedGradientEnd => Theme.ColorControlSelected;
211 public override Color ImageMarginGradientBegin => Theme.ColorControl;
212 public override Color ImageMarginGradientMiddle => Theme.ColorControl;
213 public override Color ImageMarginGradientEnd => Theme.ColorControl;
214 public override Color MenuItemPressedGradientBegin => Theme.ColorControlSelected;
215 public override Color MenuItemPressedGradientMiddle => Theme.ColorControlSelected;
216 public override Color MenuItemPressedGradientEnd => Theme.ColorControlSelected;
217 }
218}
Note: See TracBrowser for help on using the repository browser.