Fixed Issue 10.
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 SensorSystemTray sensorSystemTray;
61 private NotifyIcon notifyIcon;
62 private StartupManager startupManager = new StartupManager();
63 private UpdateVisitor updateVisitor = new UpdateVisitor();
66 InitializeComponent();
67 this.Font = SystemFonts.MessageBoxFont;
68 treeView.Font = SystemFonts.MessageBoxFont;
69 plotPanel.Font = SystemFonts.MessageBoxFont;
71 nodeCheckBox.IsVisibleValueNeeded +=
72 new EventHandler<NodeControlValueEventArgs>(
73 nodeCheckBox_IsVisibleValueNeeded);
74 nodeCheckBox.CheckStateChanged +=
75 new EventHandler<TreePathEventArgs>(UpdatePlotSelection);
76 nodeTextBoxText.DrawText +=
77 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
78 nodeTextBoxValue.DrawText +=
79 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
80 nodeTextBoxMin.DrawText +=
81 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
82 nodeTextBoxMax.DrawText +=
83 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
84 nodeTextBoxLimit.DrawText +=
85 new EventHandler<DrawEventArgs>(nodeTextBoxLimit_DrawText);
87 if (Utilities.Config.Contains("mainForm.Location.X")) {
88 int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
90 int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
92 this.Location = new Point(x, y);
94 StartPosition = FormStartPosition.CenterScreen;
97 Width = Utilities.Config.Get("mainForm.Width", Width);
98 Height = Utilities.Config.Get("mainForm.Height", Height);
100 foreach (TreeColumn column in treeView.Columns)
101 column.Width = Math.Max(20, Math.Min(400,
102 Config.Get("treeView.Columns." + column.Header + ".Width",
105 treeModel = new TreeModel();
106 root = new Node(System.Environment.MachineName);
107 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
109 treeModel.Nodes.Add(root);
110 treeView.Model = treeModel;
112 notifyIcon = new NotifyIcon();
113 notifyIcon.ContextMenuStrip = this.notifyContextMenuStrip;
114 notifyIcon.Icon = EmbeddedResources.GetIcon("smallicon.ico");
115 notifyIcon.Text = "Open Hardware Monitor";
116 notifyIcon.DoubleClick += new EventHandler(this.hideShowClick);
118 sensorSystemTray = new SensorSystemTray(computer);
120 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
121 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
124 timer.Enabled = true;
126 plotColorPalette = new Color[13];
127 plotColorPalette[0] = Color.Blue;
128 plotColorPalette[1] = Color.OrangeRed;
129 plotColorPalette[2] = Color.Green;
130 plotColorPalette[3] = Color.LightSeaGreen;
131 plotColorPalette[4] = Color.Goldenrod;
132 plotColorPalette[5] = Color.DarkViolet;
133 plotColorPalette[6] = Color.YellowGreen;
134 plotColorPalette[7] = Color.SaddleBrown;
135 plotColorPalette[8] = Color.RoyalBlue;
136 plotColorPalette[9] = Color.DeepPink;
137 plotColorPalette[10] = Color.MediumSeaGreen;
138 plotColorPalette[11] = Color.Olive;
139 plotColorPalette[12] = Color.Firebrick;
141 hiddenMenuItem.Checked = Config.Get(hiddenMenuItem.Name, false);
142 plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
144 valueMenuItem.Checked = Config.Get(valueMenuItem.Name, true);
145 minMenuItem.Checked = Config.Get(minMenuItem.Name, false);
146 maxMenuItem.Checked = Config.Get(maxMenuItem.Name, true);
147 limitMenuItem.Checked = Config.Get(limitMenuItem.Name, false);
149 startMinMenuItem.Checked = Config.Get(startMinMenuItem.Name, false);
150 minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
151 startupMenuItem.Checked = startupManager.Startup;
152 hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
154 celciusToolStripMenuItem.Checked =
155 UnitManager.TemperatureUnit == TemperatureUnit.Celcius;
156 fahrenheitToolStripMenuItem.Checked = !celciusToolStripMenuItem.Checked;
158 if (startMinMenuItem.Checked) {
159 if (!minTrayMenuItem.Checked) {
160 WindowState = FormWindowState.Minimized;
167 // Create a handle, otherwise calling Close() does not fire FormClosed
168 IntPtr handle = Handle;
171 private void SubHardwareAdded(IHardware hardware, Node node) {
172 Node hardwareNode = new HardwareNode(hardware);
173 node.Nodes.Add(hardwareNode);
174 foreach (IHardware subHardware in hardware.SubHardware)
175 SubHardwareAdded(subHardware, hardwareNode);
178 private void HardwareAdded(IHardware hardware) {
179 Node hardwareNode = new HardwareNode(hardware);
180 root.Nodes.Add(hardwareNode);
181 foreach (IHardware subHardware in hardware.SubHardware)
182 SubHardwareAdded(subHardware, hardwareNode);
185 private void HardwareRemoved(IHardware hardware) {
186 List<Node> nodesToRemove = new List<Node>();
187 foreach (Node node in root.Nodes) {
188 HardwareNode hardwareNode = node as HardwareNode;
189 if (hardwareNode != null && hardwareNode.Hardware == hardware)
190 nodesToRemove.Add(node);
192 foreach (Node node in nodesToRemove)
193 root.Nodes.Remove(node);
196 private void nodeTextBoxLimit_DrawText(object sender, DrawEventArgs e) {
197 SensorNode sensorNode = e.Node.Tag as SensorNode;
198 if (sensorNode != null)
199 e.Text = sensorNode.ValueToString(sensorNode.Sensor.Limit);
202 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
203 Node node = e.Node.Tag as Node;
206 if (node.IsVisible) {
207 SensorNode sensorNode = node as SensorNode;
208 if (plotMenuItem.Checked && sensorNode != null &&
209 sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
212 e.TextColor = Color.DarkGray;
217 private void UpdatePlotSelection(object sender,
220 List<ISensor> selected = new List<ISensor>();
221 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
223 foreach (TreeNodeAdv node in treeView.AllNodes) {
224 SensorNode sensorNode = node.Tag as SensorNode;
225 if (sensorNode != null &&
226 sensorNode.Sensor.SensorType == SensorType.Temperature) {
227 if (sensorNode.Plot) {
228 colors.Add(sensorNode.Sensor,
229 plotColorPalette[colorIndex % plotColorPalette.Length]);
230 selected.Add(sensorNode.Sensor);
235 sensorPlotColors = colors;
236 plotPanel.SetSensors(selected, colors);
239 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
240 NodeControlValueEventArgs e) {
241 SensorNode node = e.Node.Tag as SensorNode;
242 e.Value = (node != null) &&
243 (node.Sensor.SensorType == SensorType.Temperature) &&
244 plotMenuItem.Checked;
247 private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
251 private void timer_Tick(object sender, EventArgs e) {
252 computer.Accept(updateVisitor);
253 treeView.Invalidate();
254 plotPanel.Invalidate();
255 sensorSystemTray.Redraw();
258 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
260 Config.Set(hiddenMenuItem.Name, hiddenMenuItem.Checked);
261 Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
263 Config.Set(valueMenuItem.Name, valueMenuItem.Checked);
264 Config.Set(minMenuItem.Name, minMenuItem.Checked);
265 Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
266 Config.Set(limitMenuItem.Name, limitMenuItem.Checked);
268 Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
269 Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
270 Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
272 if (WindowState != FormWindowState.Minimized) {
273 Config.Set("mainForm.Location.X", Location.X);
274 Config.Set("mainForm.Location.Y", Location.Y);
275 Config.Set("mainForm.Width", Width);
276 Config.Set("mainForm.Height", Height);
279 foreach (TreeColumn column in treeView.Columns)
280 Config.Set("treeView.Columns." + column.Header + ".Width",
283 timer.Enabled = false;
285 sensorSystemTray.Dispose();
286 notifyIcon.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 if (node.IsVisible) {
321 ToolStripMenuItem item = new ToolStripMenuItem("Hide");
322 item.Click += delegate(object obj, EventArgs args) {
323 node.IsVisible = false;
325 sensorContextMenuStrip.Items.Add(item);
327 ToolStripMenuItem item = new ToolStripMenuItem("Unhide");
328 item.Click += delegate(object obj, EventArgs args) {
329 node.IsVisible = true;
331 sensorContextMenuStrip.Items.Add(item);
333 if (sensorSystemTray.Contains(node.Sensor)) {
334 ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
335 item.Click += delegate(object obj, EventArgs args) {
336 sensorSystemTray.Remove(node.Sensor);
338 sensorContextMenuStrip.Items.Add(item);
340 ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
341 item.Click += delegate(object obj, EventArgs args) {
342 sensorSystemTray.Add(node.Sensor, true);
344 sensorContextMenuStrip.Items.Add(item);
346 sensorContextMenuStrip.Show(treeView, m.X, m.Y);
351 private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
352 string report = computer.GetReport();
353 if (saveFileDialog.ShowDialog() == DialogResult.OK) {
354 using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
360 private void hddsensorsToolStripMenuItem_CheckedChanged(object sender,
363 computer.HDDEnabled = hddMenuItem.Checked;
364 UpdatePlotSelection(null, null);
367 private void SysTrayHideShow() {
373 protected override void WndProc(ref Message m) {
374 const int WM_SYSCOMMAND = 0x112;
375 const int SC_MINIMIZE = 0xF020;
376 if (minTrayMenuItem.Checked &&
377 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
384 private void hideShowClick(object sender, EventArgs e) {
388 private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
389 ToolStripMenuItem item = sender as ToolStripMenuItem;
393 ISensor sensor = item.Owner.Tag as ISensor;
397 sensorSystemTray.Remove(sensor);
400 private void ShowParameterForm(ISensor sensor) {
401 ParameterForm form = new ParameterForm();
402 form.Parameters = sensor.Parameters;
403 form.captionLabel.Text = sensor.Name;
407 private void treeView_NodeMouseDoubleClick(object sender,
408 TreeNodeAdvMouseEventArgs e) {
409 SensorNode node = e.Node.Tag as SensorNode;
410 if (node != null && node.Sensor != null &&
411 node.Sensor.Parameters.Length > 0) {
412 ShowParameterForm(node.Sensor);
416 private void runOnWindowsStartupToolStripMenuItem_CheckedChanged(
417 object sender, EventArgs e)
419 startupManager.Startup = startupMenuItem.Checked;
422 private void minTrayMenuItem_CheckedChanged(object sender, EventArgs e) {
423 notifyIcon.Visible = minTrayMenuItem.Checked;
426 private void hiddenSensorsMenuItem_CheckedChanged(object sender,
428 treeModel.ForceVisible = hiddenMenuItem.Checked;
431 private void valueMenuItem_CheckedChanged(object sender, EventArgs e) {
432 treeView.Columns[1].IsVisible = valueMenuItem.Checked;
435 private void minMenuItem_CheckedChanged(object sender, EventArgs e) {
436 treeView.Columns[2].IsVisible = minMenuItem.Checked;
439 private void maxMenuItem_CheckedChanged(object sender, EventArgs e) {
440 treeView.Columns[3].IsVisible = maxMenuItem.Checked;
443 private void limitMenuItem_CheckedChanged(object sender, EventArgs e) {
444 treeView.Columns[4].IsVisible = limitMenuItem.Checked;
447 private void celciusToolStripMenuItem_Click(object sender, EventArgs e) {
448 celciusToolStripMenuItem.Checked = true;
449 fahrenheitToolStripMenuItem.Checked = false;
450 UnitManager.TemperatureUnit = TemperatureUnit.Celcius;
453 private void fahrenheitToolStripMenuItem_Click(object sender, EventArgs e) {
454 celciusToolStripMenuItem.Checked = false;
455 fahrenheitToolStripMenuItem.Checked = true;
456 UnitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;