Changed the T-Balancer detection and added more report details.
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;
44 using System.Windows.Forms;
45 using Aga.Controls.Tree;
46 using Aga.Controls.Tree.NodeControls;
47 using OpenHardwareMonitor.Hardware;
48 using OpenHardwareMonitor.Utilities;
50 namespace OpenHardwareMonitor.GUI {
51 public partial class MainForm : Form {
53 private Computer computer = new Computer();
55 private TreeModel treeModel;
56 private IDictionary<ISensor, Color> sensorPlotColors =
57 new Dictionary<ISensor, Color>();
58 private Color[] plotColorPalette;
59 private SensorSystemTray sensorSystemTray;
60 private NotifyIcon notifyIcon;
63 InitializeComponent();
64 this.Font = SystemFonts.MessageBoxFont;
65 treeView.Font = SystemFonts.MessageBoxFont;
66 plotPanel.Font = SystemFonts.MessageBoxFont;
68 nodeCheckBox.IsVisibleValueNeeded +=
69 new EventHandler<NodeControlValueEventArgs>(
70 nodeCheckBox_IsVisibleValueNeeded);
71 nodeCheckBox.CheckStateChanged +=
72 new EventHandler<TreePathEventArgs>(UpdatePlotSelection);
73 nodeTextBoxText.DrawText +=
74 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
75 nodeTextBoxValue.DrawText +=
76 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
77 nodeTextBoxMin.DrawText +=
78 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
79 nodeTextBoxMax.DrawText +=
80 new EventHandler<DrawEventArgs>(nodeTextBoxText_DrawText);
81 nodeTextBoxLimit.DrawText +=
82 new EventHandler<DrawEventArgs>(nodeTextBoxLimit_DrawText);
84 if (Utilities.Config.Contains("mainForm.Location.X")) {
85 int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
87 int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
89 this.Location = new Point(x, y);
91 StartPosition = FormStartPosition.CenterScreen;
94 Width = Utilities.Config.Get("mainForm.Width", Width);
95 Height = Utilities.Config.Get("mainForm.Height", Height);
97 treeModel = new TreeModel();
98 root = new Node(System.Environment.MachineName);
99 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
101 treeModel.Nodes.Add(root);
102 treeView.Model = treeModel;
104 notifyIcon = new NotifyIcon();
105 notifyIcon.ContextMenuStrip = this.notifyContextMenuStrip;
106 notifyIcon.Icon = EmbeddedResources.GetIcon("smallicon.ico");
107 notifyIcon.Text = "Open Hardware Monitor";
108 notifyIcon.DoubleClick += new EventHandler(this.restoreClick);
110 sensorSystemTray = new SensorSystemTray(computer);
112 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
113 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
116 plotColorPalette = new Color[14];
117 plotColorPalette[0] = Color.Blue;
118 plotColorPalette[1] = Color.OrangeRed;
119 plotColorPalette[2] = Color.Green;
120 plotColorPalette[3] = Color.LightSeaGreen;
121 plotColorPalette[4] = Color.Goldenrod;
122 plotColorPalette[5] = Color.DarkViolet;
123 plotColorPalette[6] = Color.YellowGreen;
124 plotColorPalette[7] = Color.SaddleBrown;
125 plotColorPalette[8] = Color.Gray;
126 plotColorPalette[9] = Color.RoyalBlue;
127 plotColorPalette[10] = Color.DeepPink;
128 plotColorPalette[11] = Color.MediumSeaGreen;
129 plotColorPalette[12] = Color.Olive;
130 plotColorPalette[13] = Color.Firebrick;
132 plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
133 minMenuItem.Checked = Config.Get(minMenuItem.Name, false);
134 maxMenuItem.Checked = Config.Get(maxMenuItem.Name, true);
135 limitMenuItem.Checked = Config.Get(limitMenuItem.Name, false);
137 minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
138 hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
140 voltMenuItem.Checked = Config.Get(voltMenuItem.Name, true);
141 clocksMenuItem.Checked = Config.Get(clocksMenuItem.Name, true);
142 loadMenuItem.Checked = Config.Get(loadMenuItem.Name, true);
143 tempMenuItem.Checked = Config.Get(tempMenuItem.Name, true);
144 fansMenuItem.Checked = Config.Get(fansMenuItem.Name, true);
146 timer.Enabled = true;
149 private void HardwareAdded(IHardware hardware) {
150 root.Nodes.Add(new HardwareNode(hardware));
153 private void HardwareRemoved(IHardware hardware) {
154 List<Node> nodesToRemove = new List<Node>();
155 foreach (Node node in root.Nodes) {
156 HardwareNode hardwareNode = node as HardwareNode;
157 if (hardwareNode != null && hardwareNode.Hardware == hardware)
158 nodesToRemove.Add(node);
160 foreach (Node node in nodesToRemove)
161 root.Nodes.Remove(node);
164 private void nodeTextBoxLimit_DrawText(object sender, DrawEventArgs e) {
165 SensorNode sensorNode = e.Node.Tag as SensorNode;
166 if (sensorNode != null)
167 e.Text = sensorNode.ValueToString(sensorNode.Sensor.Limit);
170 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
171 if (!plotMenuItem.Checked)
174 SensorNode sensorNode = e.Node.Tag as SensorNode;
175 if (sensorNode != null) {
177 if (sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
182 private void UpdatePlotSelection(object sender,
185 List<ISensor> selected = new List<ISensor>();
186 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
188 foreach (TreeNodeAdv node in treeView.AllNodes) {
189 SensorNode sensorNode = node.Tag as SensorNode;
190 if (sensorNode != null &&
191 sensorNode.Sensor.SensorType == SensorType.Temperature) {
192 if (sensorNode.Plot) {
193 colors.Add(sensorNode.Sensor,
194 plotColorPalette[colorIndex % plotColorPalette.Length]);
195 selected.Add(sensorNode.Sensor);
200 sensorPlotColors = colors;
201 plotPanel.SetSensors(selected, colors);
204 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
205 NodeControlValueEventArgs e) {
206 SensorNode node = e.Node.Tag as SensorNode;
207 e.Value = (node != null) &&
208 (node.Sensor.SensorType == SensorType.Temperature) &&
209 plotMenuItem.Checked;
212 private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
216 private void timer_Tick(object sender, EventArgs e) {
223 } catch (Exception exception) {
224 CrashReport.Save(exception);
229 treeView.Invalidate();
230 plotPanel.Invalidate();
231 sensorSystemTray.Redraw();
234 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
236 Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
237 Config.Set(minMenuItem.Name, minMenuItem.Checked);
238 Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
239 Config.Set(limitMenuItem.Name, limitMenuItem.Checked);
241 Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
242 Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
244 Config.Set(voltMenuItem.Name, voltMenuItem.Checked);
245 Config.Set(clocksMenuItem.Name, clocksMenuItem.Checked);
246 Config.Set(loadMenuItem.Name, loadMenuItem.Checked);
247 Config.Set(tempMenuItem.Name, tempMenuItem.Checked);
248 Config.Set(fansMenuItem.Name, fansMenuItem.Checked);
250 if (WindowState != FormWindowState.Minimized) {
251 Config.Set("mainForm.Location.X", Location.X);
252 Config.Set("mainForm.Location.Y", Location.Y);
253 Config.Set("mainForm.Width", Width);
254 Config.Set("mainForm.Height", Height);
257 sensorSystemTray.Dispose();
258 notifyIcon.Dispose();
263 private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
264 new AboutBox().ShowDialog();
267 private void plotToolStripMenuItem_CheckedChanged(object sender,
270 splitContainer.Panel2Collapsed = !plotMenuItem.Checked;
271 treeView.Invalidate();
274 private void valueToolStripMenuItem_CheckedChanged(object sender,
277 treeView.Columns[1].IsVisible = valueToolStripMenuItem.Checked;
280 private void minToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
282 treeView.Columns[2].IsVisible = minMenuItem.Checked;
285 private void maxToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
287 treeView.Columns[3].IsVisible = maxMenuItem.Checked;
290 private void limitToolStripMenuItem_CheckedChanged(object sender,
292 treeView.Columns[4].IsVisible = limitMenuItem.Checked;
295 private void treeView_Click(object sender, EventArgs e) {
297 MouseEventArgs m = e as MouseEventArgs;
298 if (m == null || m.Button != MouseButtons.Right)
301 NodeControlInfo info = treeView.GetNodeControlInfoAt(new Point(m.X, m.Y));
302 if (info.Control == null) {
303 columnsContextMenuStrip.Show(treeView, m.X, m.Y);
305 SensorNode node = info.Node.Tag as SensorNode;
306 if (node != null && node.Sensor != null) {
308 sensorContextMenuStrip.Items.Clear();
309 if (sensorSystemTray.Contains(node.Sensor)) {
310 ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
311 item.Click += delegate(object obj, EventArgs args) {
312 sensorSystemTray.Remove(node.Sensor);
314 sensorContextMenuStrip.Items.Add(item);
316 ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
317 item.Click += delegate(object obj, EventArgs args) {
318 sensorSystemTray.Add(node.Sensor);
320 sensorContextMenuStrip.Items.Add(item);
322 sensorContextMenuStrip.Show(treeView, m.X, m.Y);
327 private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
328 computer.SaveReport(new Version(Application.ProductVersion));
331 private void hddsensorsToolStripMenuItem_CheckedChanged(object sender,
334 computer.HDDEnabled = hddMenuItem.Checked;
335 UpdateSensorTypeChecked(null, null);
336 UpdatePlotSelection(null, null);
339 private void UpdateSensorTypeChecked(object sender, EventArgs e) {
340 foreach (HardwareNode node in root.Nodes) {
341 node.SetVisible(SensorType.Voltage, voltMenuItem.Checked);
342 node.SetVisible(SensorType.Clock, clocksMenuItem.Checked);
343 node.SetVisible(SensorType.Load, loadMenuItem.Checked);
344 node.SetVisible(SensorType.Temperature, tempMenuItem.Checked);
345 node.SetVisible(SensorType.Fan, fansMenuItem.Checked);
349 private void ToggleSysTray() {
351 notifyIcon.Visible = true;
355 notifyIcon.Visible = false;
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 restoreClick(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);