Fixed Issue 76.
3 Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 The contents of this file are subject to the Mozilla Public License Version
6 1.1 (the "License"); you may not use this file except in compliance with
7 the License. You may obtain a copy of the License at
9 http://www.mozilla.org/MPL/
11 Software distributed under the License is distributed on an "AS IS" basis,
12 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 for the specific language governing rights and limitations under the License.
15 The Original Code is the Open Hardware Monitor code.
17 The Initial Developer of the Original Code is
18 Michael Möller <m.moeller@gmx.ch>.
19 Portions created by the Initial Developer are Copyright (C) 2009-2010
20 the Initial Developer. All Rights Reserved.
24 Alternatively, the contents of this file may be used under the terms of
25 either the GNU General Public License Version 2 or later (the "GPL"), or
26 the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 in which case the provisions of the GPL or the LGPL are applicable instead
28 of those above. If you wish to allow use of your version of this file only
29 under the terms of either the GPL or the LGPL, and not to allow others to
30 use your version of this file under the terms of the MPL, indicate your
31 decision by deleting the provisions above and replace them with the notice
32 and other provisions required by the GPL or the LGPL. If you do not delete
33 the provisions above, a recipient may use your version of this file under
34 the terms of any one of the MPL, the GPL or the LGPL.
39 using System.Collections.Generic;
40 using System.ComponentModel;
41 using System.Configuration;
45 using System.Windows.Forms;
46 using Aga.Controls.Tree;
47 using Aga.Controls.Tree.NodeControls;
48 using OpenHardwareMonitor.Hardware;
49 using OpenHardwareMonitor.Utilities;
51 namespace OpenHardwareMonitor.GUI {
52 public partial class MainForm : Form {
54 private Computer computer = new Computer();
56 private TreeModel treeModel;
57 private IDictionary<ISensor, Color> sensorPlotColors =
58 new Dictionary<ISensor, Color>();
59 private Color[] plotColorPalette;
60 private SystemTray systemTray;
61 private StartupManager startupManager = new StartupManager();
62 private UpdateVisitor updateVisitor = new UpdateVisitor();
65 InitializeComponent();
66 this.Font = SystemFonts.MessageBoxFont;
67 treeView.Font = SystemFonts.MessageBoxFont;
68 plotPanel.Font = SystemFonts.MessageBoxFont;
70 nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
71 nodeCheckBox.CheckStateChanged += UpdatePlotSelection;
72 nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
73 nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
74 nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
75 nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
76 nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;
78 if (Utilities.Config.Contains("mainForm.Location.X")) {
79 int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
81 int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
83 this.Location = new Point(x, y);
85 StartPosition = FormStartPosition.CenterScreen;
88 Width = Utilities.Config.Get("mainForm.Width", Width);
89 Height = Utilities.Config.Get("mainForm.Height", Height);
91 foreach (TreeColumn column in treeView.Columns)
92 column.Width = Math.Max(20, Math.Min(400,
93 Config.Get("treeView.Columns." + column.Header + ".Width",
96 treeModel = new TreeModel();
97 root = new Node(System.Environment.MachineName);
98 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
100 treeModel.Nodes.Add(root);
101 treeView.Model = treeModel;
103 systemTray = new SystemTray(computer);
104 systemTray.HideShowCommand += hideShowClick;
105 systemTray.ExitCommand += exitClick;
107 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
108 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
111 timer.Enabled = true;
113 plotColorPalette = new Color[13];
114 plotColorPalette[0] = Color.Blue;
115 plotColorPalette[1] = Color.OrangeRed;
116 plotColorPalette[2] = Color.Green;
117 plotColorPalette[3] = Color.LightSeaGreen;
118 plotColorPalette[4] = Color.Goldenrod;
119 plotColorPalette[5] = Color.DarkViolet;
120 plotColorPalette[6] = Color.YellowGreen;
121 plotColorPalette[7] = Color.SaddleBrown;
122 plotColorPalette[8] = Color.RoyalBlue;
123 plotColorPalette[9] = Color.DeepPink;
124 plotColorPalette[10] = Color.MediumSeaGreen;
125 plotColorPalette[11] = Color.Olive;
126 plotColorPalette[12] = Color.Firebrick;
128 hiddenMenuItem.Checked = Config.Get(hiddenMenuItem.Name, false);
129 plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
131 valueMenuItem.Checked = Config.Get(valueMenuItem.Name, true);
132 minMenuItem.Checked = Config.Get(minMenuItem.Name, false);
133 maxMenuItem.Checked = Config.Get(maxMenuItem.Name, true);
135 startMinMenuItem.Checked = Config.Get(startMinMenuItem.Name, false);
136 minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
137 startupMenuItem.Checked = startupManager.Startup;
138 hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
140 celciusToolStripMenuItem.Checked =
141 UnitManager.TemperatureUnit == TemperatureUnit.Celcius;
142 fahrenheitToolStripMenuItem.Checked = !celciusToolStripMenuItem.Checked;
144 // Hide the auto startup menu item on Unix
145 int p = (int)System.Environment.OSVersion.Platform;
146 if ((p == 4) || (p == 128)) {
147 startupMenuItem.Visible = false;
150 if (startMinMenuItem.Checked) {
151 if (!minTrayMenuItem.Checked) {
152 WindowState = FormWindowState.Minimized;
159 // Create a handle, otherwise calling Close() does not fire FormClosed
160 IntPtr handle = Handle;
162 // Make sure the settings are saved when the user logs off
163 Microsoft.Win32.SystemEvents.SessionEnded +=
164 delegate(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
169 private void SubHardwareAdded(IHardware hardware, Node node) {
170 Node hardwareNode = new HardwareNode(hardware);
171 node.Nodes.Add(hardwareNode);
172 foreach (IHardware subHardware in hardware.SubHardware)
173 SubHardwareAdded(subHardware, hardwareNode);
176 private void HardwareAdded(IHardware hardware) {
177 Node hardwareNode = new HardwareNode(hardware);
178 root.Nodes.Add(hardwareNode);
179 foreach (IHardware subHardware in hardware.SubHardware)
180 SubHardwareAdded(subHardware, hardwareNode);
183 private void HardwareRemoved(IHardware hardware) {
184 List<Node> nodesToRemove = new List<Node>();
185 foreach (Node node in root.Nodes) {
186 HardwareNode hardwareNode = node as HardwareNode;
187 if (hardwareNode != null && hardwareNode.Hardware == hardware)
188 nodesToRemove.Add(node);
190 foreach (Node node in nodesToRemove)
191 root.Nodes.Remove(node);
194 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
195 Node node = e.Node.Tag as Node;
198 if (node.IsVisible) {
199 SensorNode sensorNode = node as SensorNode;
200 if (plotMenuItem.Checked && sensorNode != null &&
201 sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
204 e.TextColor = Color.DarkGray;
209 private void UpdatePlotSelection(object sender,
212 List<ISensor> selected = new List<ISensor>();
213 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
215 foreach (TreeNodeAdv node in treeView.AllNodes) {
216 SensorNode sensorNode = node.Tag as SensorNode;
217 if (sensorNode != null &&
218 sensorNode.Sensor.SensorType == SensorType.Temperature) {
219 if (sensorNode.Plot) {
220 colors.Add(sensorNode.Sensor,
221 plotColorPalette[colorIndex % plotColorPalette.Length]);
222 selected.Add(sensorNode.Sensor);
227 sensorPlotColors = colors;
228 plotPanel.SetSensors(selected, colors);
231 private void nodeTextBoxText_EditorShowing(object sender, CancelEventArgs e)
233 e.Cancel = !(treeView.CurrentNode != null &&
234 treeView.CurrentNode.Tag is SensorNode);
237 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
238 NodeControlValueEventArgs e) {
239 SensorNode node = e.Node.Tag as SensorNode;
240 e.Value = (node != null) &&
241 (node.Sensor.SensorType == SensorType.Temperature) &&
242 plotMenuItem.Checked;
245 private void exitClick(object sender, EventArgs e) {
249 private void timer_Tick(object sender, EventArgs e) {
250 computer.Accept(updateVisitor);
251 treeView.Invalidate();
252 plotPanel.Invalidate();
256 private void SaveConfiguration() {
257 Config.Set(hiddenMenuItem.Name, hiddenMenuItem.Checked);
258 Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
260 Config.Set(valueMenuItem.Name, valueMenuItem.Checked);
261 Config.Set(minMenuItem.Name, minMenuItem.Checked);
262 Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
264 Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
265 Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
266 Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
268 if (WindowState != FormWindowState.Minimized) {
269 Config.Set("mainForm.Location.X", Location.X);
270 Config.Set("mainForm.Location.Y", Location.Y);
271 Config.Set("mainForm.Width", Width);
272 Config.Set("mainForm.Height", Height);
275 foreach (TreeColumn column in treeView.Columns)
276 Config.Set("treeView.Columns." + column.Header + ".Width",
282 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
285 timer.Enabled = false;
286 systemTray.Dispose();
290 private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
291 new AboutBox().ShowDialog();
294 private void plotToolStripMenuItem_CheckedChanged(object sender,
297 splitContainer.Panel2Collapsed = !plotMenuItem.Checked;
298 treeView.Invalidate();
301 private void treeView_Click(object sender, EventArgs e) {
303 MouseEventArgs m = e as MouseEventArgs;
304 if (m == null || m.Button != MouseButtons.Right)
307 NodeControlInfo info = treeView.GetNodeControlInfoAt(new Point(m.X, m.Y));
308 if (info.Control != null) {
309 SensorNode node = info.Node.Tag as SensorNode;
310 if (node != null && node.Sensor != null) {
312 sensorContextMenuStrip.Items.Clear();
313 if (node.Sensor.Parameters.Length > 0) {
314 ToolStripMenuItem item = new ToolStripMenuItem("Parameters...");
315 item.Click += delegate(object obj, EventArgs args) {
316 ShowParameterForm(node.Sensor);
318 sensorContextMenuStrip.Items.Add(item);
320 EditableControl control = info.Control as EditableControl;
321 if (control != null) {
322 ToolStripMenuItem item = new ToolStripMenuItem("Rename");
323 item.Click += delegate(object obj, EventArgs args) {
326 sensorContextMenuStrip.Items.Add(item);
328 if (node.IsVisible) {
329 ToolStripMenuItem item = new ToolStripMenuItem("Hide");
330 item.Click += delegate(object obj, EventArgs args) {
331 node.IsVisible = false;
333 sensorContextMenuStrip.Items.Add(item);
335 ToolStripMenuItem item = new ToolStripMenuItem("Unhide");
336 item.Click += delegate(object obj, EventArgs args) {
337 node.IsVisible = true;
339 sensorContextMenuStrip.Items.Add(item);
341 if (systemTray.Contains(node.Sensor)) {
342 ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
343 item.Click += delegate(object obj, EventArgs args) {
344 systemTray.Remove(node.Sensor);
346 sensorContextMenuStrip.Items.Add(item);
348 ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
349 item.Click += delegate(object obj, EventArgs args) {
350 systemTray.Add(node.Sensor, true);
352 sensorContextMenuStrip.Items.Add(item);
354 sensorContextMenuStrip.Show(treeView, m.X, m.Y);
359 private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
360 string report = computer.GetReport();
361 if (saveFileDialog.ShowDialog() == DialogResult.OK) {
362 using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
368 private void hddsensorsToolStripMenuItem_CheckedChanged(object sender,
371 computer.HDDEnabled = hddMenuItem.Checked;
372 UpdatePlotSelection(null, null);
375 private void SysTrayHideShow() {
381 protected override void WndProc(ref Message m) {
382 const int WM_SYSCOMMAND = 0x112;
383 const int SC_MINIMIZE = 0xF020;
384 if (minTrayMenuItem.Checked &&
385 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
392 private void hideShowClick(object sender, EventArgs e) {
396 private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
397 ToolStripMenuItem item = sender as ToolStripMenuItem;
401 ISensor sensor = item.Owner.Tag as ISensor;
405 systemTray.Remove(sensor);
408 private void ShowParameterForm(ISensor sensor) {
409 ParameterForm form = new ParameterForm();
410 form.Parameters = sensor.Parameters;
411 form.captionLabel.Text = sensor.Name;
415 private void treeView_NodeMouseDoubleClick(object sender,
416 TreeNodeAdvMouseEventArgs e) {
417 SensorNode node = e.Node.Tag as SensorNode;
418 if (node != null && node.Sensor != null &&
419 node.Sensor.Parameters.Length > 0) {
420 ShowParameterForm(node.Sensor);
424 private void runOnWindowsStartupToolStripMenuItem_CheckedChanged(
425 object sender, EventArgs e)
427 startupManager.Startup = startupMenuItem.Checked;
430 private void minTrayMenuItem_CheckedChanged(object sender, EventArgs e) {
431 systemTray.IsMainIconEnabled = minTrayMenuItem.Checked;
434 private void hiddenSensorsMenuItem_CheckedChanged(object sender,
436 treeModel.ForceVisible = hiddenMenuItem.Checked;
439 private void valueMenuItem_CheckedChanged(object sender, EventArgs e) {
440 treeView.Columns[1].IsVisible = valueMenuItem.Checked;
443 private void minMenuItem_CheckedChanged(object sender, EventArgs e) {
444 treeView.Columns[2].IsVisible = minMenuItem.Checked;
447 private void maxMenuItem_CheckedChanged(object sender, EventArgs e) {
448 treeView.Columns[3].IsVisible = maxMenuItem.Checked;
451 private void celciusToolStripMenuItem_Click(object sender, EventArgs e) {
452 celciusToolStripMenuItem.Checked = true;
453 fahrenheitToolStripMenuItem.Checked = false;
454 UnitManager.TemperatureUnit = TemperatureUnit.Celcius;
457 private void fahrenheitToolStripMenuItem_Click(object sender, EventArgs e) {
458 celciusToolStripMenuItem.Checked = false;
459 fahrenheitToolStripMenuItem.Checked = true;
460 UnitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;