GUI/MainForm.cs
author moel.mich
Thu, 20 May 2010 21:23:54 +0000
changeset 122 3ef997c53b50
parent 113 62a2848ec0a6
child 125 b1278888d9a9
permissions -rw-r--r--
Fixed Issue 10.
     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.IO;
    44 using System.Text;
    45 using System.Windows.Forms;
    46 using Aga.Controls.Tree;
    47 using Aga.Controls.Tree.NodeControls;
    48 using OpenHardwareMonitor.Hardware;
    49 using OpenHardwareMonitor.Utilities;
    50 
    51 namespace OpenHardwareMonitor.GUI {
    52   public partial class MainForm : Form {
    53 
    54     private Computer computer = new Computer();
    55     private Node root;
    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();
    64 
    65     public MainForm() {      
    66       InitializeComponent();
    67       this.Font = SystemFonts.MessageBoxFont;
    68       treeView.Font = SystemFonts.MessageBoxFont;
    69       plotPanel.Font = SystemFonts.MessageBoxFont;
    70       
    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);
    86 
    87       if (Utilities.Config.Contains("mainForm.Location.X")) {
    88         int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
    89         x = x < 0 ? 0 : x;
    90         int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
    91         y = y < 0 ? 0 : y;
    92         this.Location = new Point(x, y);
    93       } else {
    94         StartPosition = FormStartPosition.CenterScreen;
    95       }
    96 
    97       Width = Utilities.Config.Get("mainForm.Width", Width);
    98       Height = Utilities.Config.Get("mainForm.Height", Height);
    99 
   100       foreach (TreeColumn column in treeView.Columns) 
   101         column.Width = Math.Max(20, Math.Min(400, 
   102           Config.Get("treeView.Columns." + column.Header + ".Width",
   103           column.Width)));
   104 
   105       treeModel = new TreeModel();
   106       root = new Node(System.Environment.MachineName);
   107       root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
   108       
   109       treeModel.Nodes.Add(root);
   110       treeView.Model = treeModel;
   111       
   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);
   117 
   118       sensorSystemTray = new SensorSystemTray(computer);
   119 
   120       computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
   121       computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
   122       computer.Open();
   123 
   124       timer.Enabled = true;
   125 
   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;
   140 
   141       hiddenMenuItem.Checked = Config.Get(hiddenMenuItem.Name, false);
   142       plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
   143 
   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);
   148 
   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);
   153 
   154       celciusToolStripMenuItem.Checked = 
   155         UnitManager.TemperatureUnit == TemperatureUnit.Celcius;
   156       fahrenheitToolStripMenuItem.Checked = !celciusToolStripMenuItem.Checked;
   157 
   158       if (startMinMenuItem.Checked) {
   159         if (!minTrayMenuItem.Checked) {
   160           WindowState = FormWindowState.Minimized;
   161           Show();
   162         }
   163       } else {
   164         Show();
   165       }
   166 
   167       // Create a handle, otherwise calling Close() does not fire FormClosed     
   168       IntPtr handle = Handle;
   169     }
   170 
   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);  
   176     }
   177 
   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);     
   183     }
   184 
   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);
   191       }
   192       foreach (Node node in nodesToRemove)
   193         root.Nodes.Remove(node);
   194     }
   195 
   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);
   200     }
   201 
   202     private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {       
   203       Node node = e.Node.Tag as Node;
   204       if (node != null) {
   205         Color color;
   206         if (node.IsVisible) {
   207           SensorNode sensorNode = node as SensorNode;
   208           if (plotMenuItem.Checked && sensorNode != null &&
   209             sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
   210             e.TextColor = color;
   211         } else {
   212           e.TextColor = Color.DarkGray;
   213         }
   214       }
   215     }
   216 
   217     private void UpdatePlotSelection(object sender, 
   218       TreePathEventArgs e) 
   219     {
   220       List<ISensor> selected = new List<ISensor>();
   221       IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
   222       int colorIndex = 0;
   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);
   231           }
   232           colorIndex++;
   233         }
   234       }
   235       sensorPlotColors = colors;
   236       plotPanel.SetSensors(selected, colors);
   237     }
   238 
   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;
   245     }
   246 
   247     private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
   248       Close();      
   249     }
   250 
   251     private void timer_Tick(object sender, EventArgs e) {
   252       computer.Accept(updateVisitor);
   253       treeView.Invalidate();
   254       plotPanel.Invalidate();
   255       sensorSystemTray.Redraw();
   256     }
   257 
   258     private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
   259       
   260       Config.Set(hiddenMenuItem.Name, hiddenMenuItem.Checked);
   261       Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
   262 
   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);
   267 
   268       Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
   269       Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
   270       Config.Set(hddMenuItem.Name, hddMenuItem.Checked);   
   271 
   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);
   277       }
   278 
   279       foreach (TreeColumn column in treeView.Columns) 
   280         Config.Set("treeView.Columns." + column.Header + ".Width", 
   281           column.Width);
   282 
   283       timer.Enabled = false;
   284 
   285       sensorSystemTray.Dispose();
   286       notifyIcon.Dispose();
   287       computer.Close();
   288     }
   289 
   290     private void aboutToolStripMenuItem_Click(object sender, EventArgs e) {
   291       new AboutBox().ShowDialog();
   292     }
   293 
   294     private void plotToolStripMenuItem_CheckedChanged(object sender, 
   295       EventArgs e) 
   296     {
   297       splitContainer.Panel2Collapsed = !plotMenuItem.Checked;
   298       treeView.Invalidate();
   299     }
   300 
   301     private void treeView_Click(object sender, EventArgs e) {
   302       
   303       MouseEventArgs m = e as MouseEventArgs;
   304       if (m == null || m.Button != MouseButtons.Right)
   305         return;
   306 
   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) {
   311 
   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);
   317             };
   318             sensorContextMenuStrip.Items.Add(item);
   319           }
   320           if (node.IsVisible) {
   321             ToolStripMenuItem item = new ToolStripMenuItem("Hide");
   322             item.Click += delegate(object obj, EventArgs args) {
   323               node.IsVisible = false;
   324             };
   325             sensorContextMenuStrip.Items.Add(item);
   326           } else {
   327             ToolStripMenuItem item = new ToolStripMenuItem("Unhide");
   328             item.Click += delegate(object obj, EventArgs args) {
   329               node.IsVisible = true;
   330             };
   331             sensorContextMenuStrip.Items.Add(item);
   332           }         
   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);
   337             };
   338             sensorContextMenuStrip.Items.Add(item);
   339           } else {
   340             ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
   341             item.Click += delegate(object obj, EventArgs args) {
   342               sensorSystemTray.Add(node.Sensor, true);
   343             };
   344             sensorContextMenuStrip.Items.Add(item);
   345           }
   346           sensorContextMenuStrip.Show(treeView, m.X, m.Y);
   347         }
   348       }
   349     }
   350 
   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)) {
   355           w.Write(report);
   356         }
   357       }
   358     }
   359 
   360     private void hddsensorsToolStripMenuItem_CheckedChanged(object sender, 
   361       EventArgs e) 
   362     {
   363       computer.HDDEnabled = hddMenuItem.Checked;
   364       UpdatePlotSelection(null, null);      
   365     }
   366 
   367     private void SysTrayHideShow() {
   368       Visible = !Visible;
   369       if (Visible)
   370         Activate();    
   371     }
   372 
   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) {
   378         SysTrayHideShow();
   379       } else {      
   380         base.WndProc(ref m);
   381       }
   382     }
   383 
   384     private void hideShowClick(object sender, EventArgs e) {
   385       SysTrayHideShow();
   386     }
   387 
   388     private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
   389       ToolStripMenuItem item = sender as ToolStripMenuItem;
   390       if (item == null)
   391         return;
   392 
   393       ISensor sensor = item.Owner.Tag as ISensor;
   394       if (sensor == null)
   395         return;
   396 
   397       sensorSystemTray.Remove(sensor);
   398     }
   399 
   400     private void ShowParameterForm(ISensor sensor) {
   401       ParameterForm form = new ParameterForm();
   402       form.Parameters = sensor.Parameters;
   403       form.captionLabel.Text = sensor.Name;
   404       form.ShowDialog();
   405     }
   406 
   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);
   413       }
   414     }
   415 
   416     private void runOnWindowsStartupToolStripMenuItem_CheckedChanged(
   417       object sender, EventArgs e) 
   418     {
   419       startupManager.Startup = startupMenuItem.Checked;
   420     }
   421 
   422     private void minTrayMenuItem_CheckedChanged(object sender, EventArgs e) {
   423       notifyIcon.Visible = minTrayMenuItem.Checked;
   424     }
   425 
   426     private void hiddenSensorsMenuItem_CheckedChanged(object sender, 
   427       EventArgs e) {
   428       treeModel.ForceVisible = hiddenMenuItem.Checked;
   429     }
   430 
   431     private void valueMenuItem_CheckedChanged(object sender, EventArgs e) {
   432       treeView.Columns[1].IsVisible = valueMenuItem.Checked;
   433     }
   434 
   435     private void minMenuItem_CheckedChanged(object sender, EventArgs e) {
   436       treeView.Columns[2].IsVisible = minMenuItem.Checked;
   437     }
   438 
   439     private void maxMenuItem_CheckedChanged(object sender, EventArgs e) {
   440       treeView.Columns[3].IsVisible = maxMenuItem.Checked;
   441     }
   442 
   443     private void limitMenuItem_CheckedChanged(object sender, EventArgs e) {
   444       treeView.Columns[4].IsVisible = limitMenuItem.Checked;
   445     }
   446 
   447     private void celciusToolStripMenuItem_Click(object sender, EventArgs e) {
   448       celciusToolStripMenuItem.Checked = true;
   449       fahrenheitToolStripMenuItem.Checked = false;
   450       UnitManager.TemperatureUnit = TemperatureUnit.Celcius;
   451     }
   452 
   453     private void fahrenheitToolStripMenuItem_Click(object sender, EventArgs e) {
   454       celciusToolStripMenuItem.Checked = false;
   455       fahrenheitToolStripMenuItem.Checked = true;
   456       UnitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;
   457     }
   458   }
   459 }