GUI/MainForm.cs
author moel.mich
Sat, 27 Feb 2010 15:55:17 +0000
changeset 63 1a7c13ac7348
parent 57 142907c75be4
child 64 15181001ee61
permissions -rw-r--r--
Added support for sensor parameters. Fixed Core and Thread count detection for Intel Core i7 CPUs with disabled HyperThreading.
     1 /*
     2   
     3   Version: MPL 1.1/GPL 2.0/LGPL 2.1
     4 
     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
     8  
     9   http://www.mozilla.org/MPL/
    10 
    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.
    14 
    15   The Original Code is the Open Hardware Monitor code.
    16 
    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.
    21 
    22   Contributor(s):
    23 
    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.
    35  
    36 */
    37 
    38 using System;
    39 using System.Collections.Generic;
    40 using System.ComponentModel;
    41 using System.Configuration;
    42 using System.Drawing;
    43 using System.Text;
    44 using System.Windows.Forms;
    45 using Aga.Controls.Tree;
    46 using Aga.Controls.Tree.NodeControls;
    47 using OpenHardwareMonitor.Hardware;
    48 using OpenHardwareMonitor.Utilities;
    49 
    50 namespace OpenHardwareMonitor.GUI {
    51   public partial class MainForm : Form {
    52 
    53     private Computer computer = new Computer();
    54     private Node root;
    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;
    61 
    62     public MainForm() {      
    63       InitializeComponent();
    64       this.Font = SystemFonts.MessageBoxFont;
    65       treeView.Font = SystemFonts.MessageBoxFont;
    66       plotPanel.Font = SystemFonts.MessageBoxFont;
    67       
    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);
    83 
    84       if (Utilities.Config.Contains("mainForm.Location.X")) {
    85         int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
    86         x = x < 0 ? 0 : x;
    87         int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
    88         y = y < 0 ? 0 : y;
    89         this.Location = new Point(x, y);
    90       } else {
    91         StartPosition = FormStartPosition.CenterScreen;
    92       }
    93 
    94       Width = Utilities.Config.Get("mainForm.Width", Width);
    95       Height = Utilities.Config.Get("mainForm.Height", Height);
    96          
    97       treeModel = new TreeModel();
    98       root = new Node(System.Environment.MachineName);
    99       root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
   100       
   101       treeModel.Nodes.Add(root);
   102       treeView.Model = treeModel;
   103       
   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);
   109 
   110       sensorSystemTray = new SensorSystemTray(computer);
   111 
   112       computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
   113       computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
   114       computer.Open();
   115 
   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;
   131 
   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);
   136 
   137       startMinMenuItem.Checked = Config.Get(startMinMenuItem.Name, false); 
   138       minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
   139       hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
   140 
   141       voltMenuItem.Checked = Config.Get(voltMenuItem.Name, true);
   142       clocksMenuItem.Checked = Config.Get(clocksMenuItem.Name, true);
   143       loadMenuItem.Checked = Config.Get(loadMenuItem.Name, true);
   144       tempMenuItem.Checked = Config.Get(tempMenuItem.Name, true);
   145       fansMenuItem.Checked = Config.Get(fansMenuItem.Name, true);
   146       flowsMenuItem.Checked = Config.Get(flowsMenuItem.Name, true);
   147      
   148       timer.Enabled = true;
   149 
   150       if (startMinMenuItem.Checked) {
   151         if (minTrayMenuItem.Checked) {
   152           notifyIcon.Visible = true;
   153         } else {
   154           WindowState = FormWindowState.Minimized;
   155           Show();
   156         }
   157       } else {
   158         Show();
   159       }
   160     }
   161 
   162     private void HardwareAdded(IHardware hardware) {
   163       root.Nodes.Add(new HardwareNode(hardware));
   164     }
   165 
   166     private void HardwareRemoved(IHardware hardware) {      
   167       List<Node> nodesToRemove = new List<Node>();
   168       foreach (Node node in root.Nodes) {
   169         HardwareNode hardwareNode = node as HardwareNode;
   170         if (hardwareNode != null && hardwareNode.Hardware == hardware)
   171           nodesToRemove.Add(node);
   172       }
   173       foreach (Node node in nodesToRemove)
   174         root.Nodes.Remove(node);
   175     }
   176 
   177     private void nodeTextBoxLimit_DrawText(object sender, DrawEventArgs e) {
   178       SensorNode sensorNode = e.Node.Tag as SensorNode;
   179       if (sensorNode != null) 
   180         e.Text = sensorNode.ValueToString(sensorNode.Sensor.Limit);
   181     }
   182 
   183     private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
   184       if (!plotMenuItem.Checked)
   185         return;      
   186 
   187       SensorNode sensorNode = e.Node.Tag as SensorNode;
   188       if (sensorNode != null) {
   189         Color color;
   190         if (sensorPlotColors.TryGetValue(sensorNode.Sensor, out color)) 
   191           e.TextColor = color;        
   192       }
   193     }
   194 
   195     private void UpdatePlotSelection(object sender, 
   196       TreePathEventArgs e) 
   197     {
   198       List<ISensor> selected = new List<ISensor>();
   199       IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
   200       int colorIndex = 0;
   201       foreach (TreeNodeAdv node in treeView.AllNodes) {
   202         SensorNode sensorNode = node.Tag as SensorNode;
   203         if (sensorNode != null && 
   204           sensorNode.Sensor.SensorType == SensorType.Temperature) {
   205           if (sensorNode.Plot) {
   206             colors.Add(sensorNode.Sensor,
   207               plotColorPalette[colorIndex % plotColorPalette.Length]);
   208             selected.Add(sensorNode.Sensor);
   209           }
   210           colorIndex++;
   211         }
   212       }
   213       sensorPlotColors = colors;
   214       plotPanel.SetSensors(selected, colors);
   215     }
   216 
   217     private void nodeCheckBox_IsVisibleValueNeeded(object sender, 
   218       NodeControlValueEventArgs e) {
   219       SensorNode node = e.Node.Tag as SensorNode;
   220       e.Value = (node != null) && 
   221         (node.Sensor.SensorType == SensorType.Temperature) && 
   222         plotMenuItem.Checked;
   223     }
   224 
   225     private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
   226       Close();
   227     }
   228 
   229     private void timer_Tick(object sender, EventArgs e) {
   230       
   231       #if !DEBUG
   232       try {
   233       #endif
   234         computer.Update();        
   235       #if !DEBUG
   236       } catch (Exception exception) {
   237         CrashReport.Save(exception);
   238         Close();
   239       }
   240       #endif
   241             
   242       treeView.Invalidate();
   243       plotPanel.Invalidate();
   244       sensorSystemTray.Redraw();
   245     }
   246 
   247     private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
   248             
   249       Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
   250       Config.Set(minMenuItem.Name, minMenuItem.Checked);
   251       Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
   252       Config.Set(limitMenuItem.Name, limitMenuItem.Checked);
   253 
   254       Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
   255       Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
   256       Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
   257 
   258       Config.Set(voltMenuItem.Name, voltMenuItem.Checked);
   259       Config.Set(clocksMenuItem.Name, clocksMenuItem.Checked);
   260       Config.Set(loadMenuItem.Name, loadMenuItem.Checked);
   261       Config.Set(tempMenuItem.Name, tempMenuItem.Checked);
   262       Config.Set(fansMenuItem.Name, fansMenuItem.Checked);
   263       Config.Set(flowsMenuItem.Name, flowsMenuItem.Checked);
   264 
   265       if (WindowState != FormWindowState.Minimized) {
   266         Config.Set("mainForm.Location.X", Location.X);
   267         Config.Set("mainForm.Location.Y", Location.Y);
   268         Config.Set("mainForm.Width", Width);
   269         Config.Set("mainForm.Height", Height);
   270       }
   271            
   272       sensorSystemTray.Dispose();
   273       notifyIcon.Dispose();
   274       computer.Close();
   275     }
   276 
   277     private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
   278       new AboutBox().ShowDialog();
   279     }
   280 
   281     private void plotToolStripMenuItem_CheckedChanged(object sender, 
   282       EventArgs e) 
   283     {
   284       splitContainer.Panel2Collapsed = !plotMenuItem.Checked;
   285       treeView.Invalidate();
   286     }
   287 
   288     private void valueToolStripMenuItem_CheckedChanged(object sender, 
   289       EventArgs e) 
   290     {
   291       treeView.Columns[1].IsVisible = valueToolStripMenuItem.Checked;
   292     }
   293 
   294     private void minToolStripMenuItem_CheckedChanged(object sender, EventArgs e) 
   295     {
   296       treeView.Columns[2].IsVisible = minMenuItem.Checked;
   297     }
   298 
   299     private void maxToolStripMenuItem_CheckedChanged(object sender, EventArgs e) 
   300     {
   301       treeView.Columns[3].IsVisible = maxMenuItem.Checked;
   302     }
   303 
   304     private void limitToolStripMenuItem_CheckedChanged(object sender, 
   305       EventArgs e) {
   306       treeView.Columns[4].IsVisible = limitMenuItem.Checked;
   307     }
   308 
   309     private void treeView_Click(object sender, EventArgs e) {
   310       
   311       MouseEventArgs m = e as MouseEventArgs;
   312       if (m == null || m.Button != MouseButtons.Right)
   313         return;
   314 
   315       NodeControlInfo info = treeView.GetNodeControlInfoAt(new Point(m.X, m.Y));
   316       if (info.Control == null) {
   317         columnsContextMenuStrip.Show(treeView, m.X, m.Y);
   318       } else {
   319         SensorNode node = info.Node.Tag as SensorNode;
   320         if (node != null && node.Sensor != null) {
   321 
   322           sensorContextMenuStrip.Items.Clear();
   323           if (node.Sensor.Parameters.Length > 0) {
   324             ToolStripMenuItem item = new ToolStripMenuItem("Parameters...");
   325             item.Click += delegate(object obj, EventArgs args) {
   326               ShowParameterForm(node.Sensor);
   327             };
   328             sensorContextMenuStrip.Items.Add(item);
   329           }
   330           if (sensorSystemTray.Contains(node.Sensor)) {
   331             ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
   332             item.Click += delegate(object obj, EventArgs args) {
   333               sensorSystemTray.Remove(node.Sensor);
   334             };
   335             sensorContextMenuStrip.Items.Add(item);
   336           } else {
   337             ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
   338             item.Click += delegate(object obj, EventArgs args) {
   339               sensorSystemTray.Add(node.Sensor, true);
   340             };
   341             sensorContextMenuStrip.Items.Add(item);
   342           }
   343           sensorContextMenuStrip.Show(treeView, m.X, m.Y);
   344         }
   345       }
   346     }
   347 
   348     private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
   349       computer.SaveReport(new Version(Application.ProductVersion));      
   350     }
   351 
   352     private void hddsensorsToolStripMenuItem_CheckedChanged(object sender, 
   353       EventArgs e) 
   354     {
   355       computer.HDDEnabled = hddMenuItem.Checked;
   356       UpdateSensorTypeChecked(null, null);
   357       UpdatePlotSelection(null, null);      
   358     }
   359 
   360     private void UpdateSensorTypeChecked(object sender, EventArgs e) {
   361       foreach (HardwareNode node in root.Nodes) {
   362         node.SetVisible(SensorType.Voltage, voltMenuItem.Checked);
   363         node.SetVisible(SensorType.Clock, clocksMenuItem.Checked);
   364         node.SetVisible(SensorType.Load, loadMenuItem.Checked);
   365         node.SetVisible(SensorType.Temperature, tempMenuItem.Checked);
   366         node.SetVisible(SensorType.Fan, fansMenuItem.Checked);
   367         node.SetVisible(SensorType.Flow, flowsMenuItem.Checked);
   368       }
   369     }
   370 
   371     private void ToggleSysTray() {
   372       if (notifyIcon.Visible) {
   373         Visible = true;
   374         notifyIcon.Visible = false;
   375         Activate(); 
   376       } else {
   377         notifyIcon.Visible = true;
   378         Visible = false;           
   379       }
   380     }
   381 
   382     protected override void WndProc(ref Message m) {
   383       const int WM_SYSCOMMAND = 0x112;
   384       const int SC_MINIMIZE = 0xF020;
   385       if (minTrayMenuItem.Checked && 
   386         m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
   387         ToggleSysTray();
   388       } else {      
   389         base.WndProc(ref m);
   390       }
   391     }
   392 
   393     private void restoreClick(object sender, EventArgs e) {
   394       ToggleSysTray();
   395     }
   396 
   397     private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
   398       ToolStripMenuItem item = sender as ToolStripMenuItem;
   399       if (item == null)
   400         return;
   401 
   402       ISensor sensor = item.Owner.Tag as ISensor;
   403       if (sensor == null)
   404         return;
   405 
   406       sensorSystemTray.Remove(sensor);
   407     }
   408 
   409     private void ShowParameterForm(ISensor sensor) {
   410       ParameterForm form = new ParameterForm();
   411       form.Parameters = sensor.Parameters;
   412       form.captionLabel.Text = sensor.Name;
   413       form.ShowDialog();
   414     }
   415 
   416     private void treeView_NodeMouseDoubleClick(object sender, 
   417       TreeNodeAdvMouseEventArgs e) {
   418       SensorNode node = e.Node.Tag as SensorNode;
   419       if (node != null && node.Sensor != null && 
   420         node.Sensor.Parameters.Length > 0) {
   421         ShowParameterForm(node.Sensor);
   422       }
   423     }
   424   }
   425 }