Fixed Issue 59.
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 treeModel = new TreeModel();
101 root = new Node(System.Environment.MachineName);
102 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
104 treeModel.Nodes.Add(root);
105 treeView.Model = treeModel;
107 notifyIcon = new NotifyIcon();
108 notifyIcon.ContextMenuStrip = this.notifyContextMenuStrip;
109 notifyIcon.Icon = EmbeddedResources.GetIcon("smallicon.ico");
110 notifyIcon.Text = "Open Hardware Monitor";
111 notifyIcon.DoubleClick += new EventHandler(this.hideShowClick);
113 sensorSystemTray = new SensorSystemTray(computer);
115 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
116 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
119 timer.Enabled = true;
121 plotColorPalette = new Color[13];
122 plotColorPalette[0] = Color.Blue;
123 plotColorPalette[1] = Color.OrangeRed;
124 plotColorPalette[2] = Color.Green;
125 plotColorPalette[3] = Color.LightSeaGreen;
126 plotColorPalette[4] = Color.Goldenrod;
127 plotColorPalette[5] = Color.DarkViolet;
128 plotColorPalette[6] = Color.YellowGreen;
129 plotColorPalette[7] = Color.SaddleBrown;
130 plotColorPalette[8] = Color.RoyalBlue;
131 plotColorPalette[9] = Color.DeepPink;
132 plotColorPalette[10] = Color.MediumSeaGreen;
133 plotColorPalette[11] = Color.Olive;
134 plotColorPalette[12] = Color.Firebrick;
136 hiddenMenuItem.Checked = Config.Get(hiddenMenuItem.Name, false);
137 plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
139 valueMenuItem.Checked = Config.Get(valueMenuItem.Name, true);
140 minMenuItem.Checked = Config.Get(minMenuItem.Name, false);
141 maxMenuItem.Checked = Config.Get(maxMenuItem.Name, true);
142 limitMenuItem.Checked = Config.Get(limitMenuItem.Name, false);
144 startMinMenuItem.Checked = Config.Get(startMinMenuItem.Name, false);
145 minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
146 startupMenuItem.Checked = startupManager.Startup;
147 hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
149 if (startMinMenuItem.Checked) {
150 if (!minTrayMenuItem.Checked) {
151 WindowState = FormWindowState.Minimized;
158 // Create a handle, otherwise calling Close() does not fire FormClosed
159 IntPtr handle = Handle;
162 private void SubHardwareAdded(IHardware hardware, Node node) {
163 Node hardwareNode = new HardwareNode(hardware);
164 node.Nodes.Add(hardwareNode);
165 foreach (IHardware subHardware in hardware.SubHardware)
166 SubHardwareAdded(subHardware, hardwareNode);
169 private void HardwareAdded(IHardware hardware) {
170 Node hardwareNode = new HardwareNode(hardware);
171 root.Nodes.Add(hardwareNode);
172 foreach (IHardware subHardware in hardware.SubHardware)
173 SubHardwareAdded(subHardware, hardwareNode);
176 private void HardwareRemoved(IHardware hardware) {
177 List<Node> nodesToRemove = new List<Node>();
178 foreach (Node node in root.Nodes) {
179 HardwareNode hardwareNode = node as HardwareNode;
180 if (hardwareNode != null && hardwareNode.Hardware == hardware)
181 nodesToRemove.Add(node);
183 foreach (Node node in nodesToRemove)
184 root.Nodes.Remove(node);
187 private void nodeTextBoxLimit_DrawText(object sender, DrawEventArgs e) {
188 SensorNode sensorNode = e.Node.Tag as SensorNode;
189 if (sensorNode != null)
190 e.Text = sensorNode.ValueToString(sensorNode.Sensor.Limit);
193 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
194 Node node = e.Node.Tag as Node;
197 if (node.IsVisible) {
198 SensorNode sensorNode = node as SensorNode;
199 if (plotMenuItem.Checked && sensorNode != null &&
200 sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
203 e.TextColor = Color.DarkGray;
208 private void UpdatePlotSelection(object sender,
211 List<ISensor> selected = new List<ISensor>();
212 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
214 foreach (TreeNodeAdv node in treeView.AllNodes) {
215 SensorNode sensorNode = node.Tag as SensorNode;
216 if (sensorNode != null &&
217 sensorNode.Sensor.SensorType == SensorType.Temperature) {
218 if (sensorNode.Plot) {
219 colors.Add(sensorNode.Sensor,
220 plotColorPalette[colorIndex % plotColorPalette.Length]);
221 selected.Add(sensorNode.Sensor);
226 sensorPlotColors = colors;
227 plotPanel.SetSensors(selected, colors);
230 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
231 NodeControlValueEventArgs e) {
232 SensorNode node = e.Node.Tag as SensorNode;
233 e.Value = (node != null) &&
234 (node.Sensor.SensorType == SensorType.Temperature) &&
235 plotMenuItem.Checked;
238 private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
242 private void timer_Tick(object sender, EventArgs e) {
243 computer.Accept(updateVisitor);
244 treeView.Invalidate();
245 plotPanel.Invalidate();
246 sensorSystemTray.Redraw();
249 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
251 Config.Set(hiddenMenuItem.Name, hiddenMenuItem.Checked);
252 Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
254 Config.Set(valueMenuItem.Name, valueMenuItem.Checked);
255 Config.Set(minMenuItem.Name, minMenuItem.Checked);
256 Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
257 Config.Set(limitMenuItem.Name, limitMenuItem.Checked);
259 Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
260 Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
261 Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
263 if (WindowState != FormWindowState.Minimized) {
264 Config.Set("mainForm.Location.X", Location.X);
265 Config.Set("mainForm.Location.Y", Location.Y);
266 Config.Set("mainForm.Width", Width);
267 Config.Set("mainForm.Height", Height);
270 timer.Enabled = false;
272 sensorSystemTray.Dispose();
273 notifyIcon.Dispose();
277 private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
278 new AboutBox().ShowDialog();
281 private void plotToolStripMenuItem_CheckedChanged(object sender,
284 splitContainer.Panel2Collapsed = !plotMenuItem.Checked;
285 treeView.Invalidate();
288 private void treeView_Click(object sender, EventArgs e) {
290 MouseEventArgs m = e as MouseEventArgs;
291 if (m == null || m.Button != MouseButtons.Right)
294 NodeControlInfo info = treeView.GetNodeControlInfoAt(new Point(m.X, m.Y));
295 if (info.Control != null) {
296 SensorNode node = info.Node.Tag as SensorNode;
297 if (node != null && node.Sensor != null) {
299 sensorContextMenuStrip.Items.Clear();
300 if (node.Sensor.Parameters.Length > 0) {
301 ToolStripMenuItem item = new ToolStripMenuItem("Parameters...");
302 item.Click += delegate(object obj, EventArgs args) {
303 ShowParameterForm(node.Sensor);
305 sensorContextMenuStrip.Items.Add(item);
307 if (node.IsVisible) {
308 ToolStripMenuItem item = new ToolStripMenuItem("Hide");
309 item.Click += delegate(object obj, EventArgs args) {
310 node.IsVisible = false;
312 sensorContextMenuStrip.Items.Add(item);
314 ToolStripMenuItem item = new ToolStripMenuItem("Unhide");
315 item.Click += delegate(object obj, EventArgs args) {
316 node.IsVisible = true;
318 sensorContextMenuStrip.Items.Add(item);
320 if (sensorSystemTray.Contains(node.Sensor)) {
321 ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
322 item.Click += delegate(object obj, EventArgs args) {
323 sensorSystemTray.Remove(node.Sensor);
325 sensorContextMenuStrip.Items.Add(item);
327 ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
328 item.Click += delegate(object obj, EventArgs args) {
329 sensorSystemTray.Add(node.Sensor, true);
331 sensorContextMenuStrip.Items.Add(item);
333 sensorContextMenuStrip.Show(treeView, m.X, m.Y);
338 private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
339 string report = computer.GetReport();
340 if (saveFileDialog.ShowDialog() == DialogResult.OK) {
341 using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
347 private void hddsensorsToolStripMenuItem_CheckedChanged(object sender,
350 computer.HDDEnabled = hddMenuItem.Checked;
351 UpdatePlotSelection(null, null);
354 private void SysTrayHideShow() {
360 protected override void WndProc(ref Message m) {
361 const int WM_SYSCOMMAND = 0x112;
362 const int SC_MINIMIZE = 0xF020;
363 if (minTrayMenuItem.Checked &&
364 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
371 private void hideShowClick(object sender, EventArgs e) {
375 private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
376 ToolStripMenuItem item = sender as ToolStripMenuItem;
380 ISensor sensor = item.Owner.Tag as ISensor;
384 sensorSystemTray.Remove(sensor);
387 private void ShowParameterForm(ISensor sensor) {
388 ParameterForm form = new ParameterForm();
389 form.Parameters = sensor.Parameters;
390 form.captionLabel.Text = sensor.Name;
394 private void treeView_NodeMouseDoubleClick(object sender,
395 TreeNodeAdvMouseEventArgs e) {
396 SensorNode node = e.Node.Tag as SensorNode;
397 if (node != null && node.Sensor != null &&
398 node.Sensor.Parameters.Length > 0) {
399 ShowParameterForm(node.Sensor);
403 private void runOnWindowsStartupToolStripMenuItem_CheckedChanged(
404 object sender, EventArgs e)
406 startupManager.Startup = startupMenuItem.Checked;
409 private void minTrayMenuItem_CheckedChanged(object sender, EventArgs e) {
410 notifyIcon.Visible = minTrayMenuItem.Checked;
413 private void hiddenSensorsMenuItem_CheckedChanged(object sender,
415 treeModel.ForceVisible = hiddenMenuItem.Checked;
418 private void valueMenuItem_CheckedChanged(object sender, EventArgs e) {
419 treeView.Columns[1].IsVisible = valueMenuItem.Checked;
422 private void minMenuItem_CheckedChanged(object sender, EventArgs e) {
423 treeView.Columns[2].IsVisible = minMenuItem.Checked;
426 private void maxMenuItem_CheckedChanged(object sender, EventArgs e) {
427 treeView.Columns[3].IsVisible = maxMenuItem.Checked;
430 private void limitMenuItem_CheckedChanged(object sender, EventArgs e) {
431 treeView.Columns[4].IsVisible = limitMenuItem.Checked;