GUI/MainForm.cs
author moel.mich
Sun, 27 Jun 2010 10:54:19 +0000
changeset 141 a78cc5c55216
parent 136 fa2957aa0699
child 142 48e487749709
permissions -rw-r--r--
Fixed Issue 76.
     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 SystemTray systemTray;    
    61     private StartupManager startupManager = new StartupManager();
    62     private UpdateVisitor updateVisitor = new UpdateVisitor();
    63 
    64     public MainForm() {      
    65       InitializeComponent();
    66       this.Font = SystemFonts.MessageBoxFont;
    67       treeView.Font = SystemFonts.MessageBoxFont;
    68       plotPanel.Font = SystemFonts.MessageBoxFont;
    69       
    70       nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
    71       nodeCheckBox.CheckStateChanged += UpdatePlotSelection;
    72       nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
    73       nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
    74       nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
    75       nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
    76       nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;
    77 
    78       if (Utilities.Config.Contains("mainForm.Location.X")) {
    79         int x = Utilities.Config.Get("mainForm.Location.X", Location.X);
    80         x = x < 0 ? 0 : x;
    81         int y = Utilities.Config.Get("mainForm.Location.Y", Location.Y);
    82         y = y < 0 ? 0 : y;
    83         this.Location = new Point(x, y);
    84       } else {
    85         StartPosition = FormStartPosition.CenterScreen;
    86       }
    87 
    88       Width = Utilities.Config.Get("mainForm.Width", Width);
    89       Height = Utilities.Config.Get("mainForm.Height", Height);
    90 
    91       foreach (TreeColumn column in treeView.Columns) 
    92         column.Width = Math.Max(20, Math.Min(400, 
    93           Config.Get("treeView.Columns." + column.Header + ".Width",
    94           column.Width)));
    95 
    96       treeModel = new TreeModel();
    97       root = new Node(System.Environment.MachineName);
    98       root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
    99       
   100       treeModel.Nodes.Add(root);
   101       treeView.Model = treeModel;     
   102 
   103       systemTray = new SystemTray(computer);
   104       systemTray.HideShowCommand += hideShowClick;
   105       systemTray.ExitCommand += exitClick;
   106 
   107       computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
   108       computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
   109       computer.Open();
   110 
   111       timer.Enabled = true;
   112 
   113       plotColorPalette = new Color[13];
   114       plotColorPalette[0] = Color.Blue;
   115       plotColorPalette[1] = Color.OrangeRed;
   116       plotColorPalette[2] = Color.Green;
   117       plotColorPalette[3] = Color.LightSeaGreen;
   118       plotColorPalette[4] = Color.Goldenrod;
   119       plotColorPalette[5] = Color.DarkViolet;
   120       plotColorPalette[6] = Color.YellowGreen;
   121       plotColorPalette[7] = Color.SaddleBrown;
   122       plotColorPalette[8] = Color.RoyalBlue;
   123       plotColorPalette[9] = Color.DeepPink;
   124       plotColorPalette[10] = Color.MediumSeaGreen;
   125       plotColorPalette[11] = Color.Olive;
   126       plotColorPalette[12] = Color.Firebrick;
   127 
   128       hiddenMenuItem.Checked = Config.Get(hiddenMenuItem.Name, false);
   129       plotMenuItem.Checked = Config.Get(plotMenuItem.Name, false);
   130 
   131       valueMenuItem.Checked = Config.Get(valueMenuItem.Name, true);
   132       minMenuItem.Checked = Config.Get(minMenuItem.Name, false);
   133       maxMenuItem.Checked = Config.Get(maxMenuItem.Name, true);
   134 
   135       startMinMenuItem.Checked = Config.Get(startMinMenuItem.Name, false); 
   136       minTrayMenuItem.Checked = Config.Get(minTrayMenuItem.Name, true);
   137       startupMenuItem.Checked = startupManager.Startup;
   138       hddMenuItem.Checked = Config.Get(hddMenuItem.Name, true);
   139 
   140       celciusToolStripMenuItem.Checked = 
   141         UnitManager.TemperatureUnit == TemperatureUnit.Celcius;
   142       fahrenheitToolStripMenuItem.Checked = !celciusToolStripMenuItem.Checked;
   143 
   144       // Hide the auto startup menu item on Unix
   145       int p = (int)System.Environment.OSVersion.Platform;
   146       if ((p == 4) || (p == 128)) {
   147         startupMenuItem.Visible = false;
   148       }
   149       
   150       if (startMinMenuItem.Checked) {
   151         if (!minTrayMenuItem.Checked) {
   152           WindowState = FormWindowState.Minimized;
   153           Show();
   154         }
   155       } else {
   156         Show();
   157       }
   158 
   159       // Create a handle, otherwise calling Close() does not fire FormClosed     
   160       IntPtr handle = Handle;
   161 
   162       // Make sure the settings are saved when the user logs off
   163       Microsoft.Win32.SystemEvents.SessionEnded +=
   164         delegate(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
   165           SaveConfiguration();
   166         };
   167     }
   168     
   169     private void SubHardwareAdded(IHardware hardware, Node node) {
   170       Node hardwareNode = new HardwareNode(hardware);
   171       node.Nodes.Add(hardwareNode);
   172       foreach (IHardware subHardware in hardware.SubHardware)
   173         SubHardwareAdded(subHardware, hardwareNode);  
   174     }
   175 
   176     private void HardwareAdded(IHardware hardware) {
   177       Node hardwareNode = new HardwareNode(hardware);
   178       root.Nodes.Add(hardwareNode);
   179       foreach (IHardware subHardware in hardware.SubHardware)
   180         SubHardwareAdded(subHardware, hardwareNode);     
   181     }
   182 
   183     private void HardwareRemoved(IHardware hardware) {      
   184       List<Node> nodesToRemove = new List<Node>();
   185       foreach (Node node in root.Nodes) {
   186         HardwareNode hardwareNode = node as HardwareNode;
   187         if (hardwareNode != null && hardwareNode.Hardware == hardware)
   188           nodesToRemove.Add(node);
   189       }
   190       foreach (Node node in nodesToRemove)
   191         root.Nodes.Remove(node);
   192     }
   193 
   194     private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {       
   195       Node node = e.Node.Tag as Node;
   196       if (node != null) {
   197         Color color;
   198         if (node.IsVisible) {
   199           SensorNode sensorNode = node as SensorNode;
   200           if (plotMenuItem.Checked && sensorNode != null &&
   201             sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
   202             e.TextColor = color;
   203         } else {
   204           e.TextColor = Color.DarkGray;
   205         }
   206       }
   207     }
   208 
   209     private void UpdatePlotSelection(object sender, 
   210       TreePathEventArgs e) 
   211     {
   212       List<ISensor> selected = new List<ISensor>();
   213       IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
   214       int colorIndex = 0;
   215       foreach (TreeNodeAdv node in treeView.AllNodes) {
   216         SensorNode sensorNode = node.Tag as SensorNode;
   217         if (sensorNode != null && 
   218           sensorNode.Sensor.SensorType == SensorType.Temperature) {
   219           if (sensorNode.Plot) {
   220             colors.Add(sensorNode.Sensor,
   221               plotColorPalette[colorIndex % plotColorPalette.Length]);
   222             selected.Add(sensorNode.Sensor);
   223           }
   224           colorIndex++;
   225         }
   226       }
   227       sensorPlotColors = colors;
   228       plotPanel.SetSensors(selected, colors);
   229     }
   230 
   231     private void nodeTextBoxText_EditorShowing(object sender, CancelEventArgs e) 
   232     {
   233       e.Cancel = !(treeView.CurrentNode != null &&
   234         treeView.CurrentNode.Tag is SensorNode);
   235     }
   236 
   237     private void nodeCheckBox_IsVisibleValueNeeded(object sender, 
   238       NodeControlValueEventArgs e) {
   239       SensorNode node = e.Node.Tag as SensorNode;
   240       e.Value = (node != null) && 
   241         (node.Sensor.SensorType == SensorType.Temperature) && 
   242         plotMenuItem.Checked;
   243     }
   244 
   245     private void exitClick(object sender, EventArgs e) {
   246       Close();      
   247     }
   248 
   249     private void timer_Tick(object sender, EventArgs e) {
   250       computer.Accept(updateVisitor);
   251       treeView.Invalidate();
   252       plotPanel.Invalidate();
   253       systemTray.Redraw();
   254     }
   255 
   256     private void SaveConfiguration() {
   257       Config.Set(hiddenMenuItem.Name, hiddenMenuItem.Checked);
   258       Config.Set(plotMenuItem.Name, plotMenuItem.Checked);
   259 
   260       Config.Set(valueMenuItem.Name, valueMenuItem.Checked);
   261       Config.Set(minMenuItem.Name, minMenuItem.Checked);
   262       Config.Set(maxMenuItem.Name, maxMenuItem.Checked);
   263 
   264       Config.Set(startMinMenuItem.Name, startMinMenuItem.Checked);
   265       Config.Set(minTrayMenuItem.Name, minTrayMenuItem.Checked);
   266       Config.Set(hddMenuItem.Name, hddMenuItem.Checked);
   267 
   268       if (WindowState != FormWindowState.Minimized) {
   269         Config.Set("mainForm.Location.X", Location.X);
   270         Config.Set("mainForm.Location.Y", Location.Y);
   271         Config.Set("mainForm.Width", Width);
   272         Config.Set("mainForm.Height", Height);
   273       }
   274 
   275       foreach (TreeColumn column in treeView.Columns)
   276         Config.Set("treeView.Columns." + column.Header + ".Width",
   277           column.Width);
   278 
   279       Config.Save();
   280     }
   281 
   282     private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
   283       SaveConfiguration();
   284 
   285       timer.Enabled = false;
   286       systemTray.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           EditableControl control = info.Control as EditableControl;
   321           if (control != null) {
   322             ToolStripMenuItem item = new ToolStripMenuItem("Rename");
   323             item.Click += delegate(object obj, EventArgs args) {
   324               control.BeginEdit();
   325             };
   326             sensorContextMenuStrip.Items.Add(item);
   327           }          
   328           if (node.IsVisible) {
   329             ToolStripMenuItem item = new ToolStripMenuItem("Hide");
   330             item.Click += delegate(object obj, EventArgs args) {
   331               node.IsVisible = false;
   332             };
   333             sensorContextMenuStrip.Items.Add(item);
   334           } else {
   335             ToolStripMenuItem item = new ToolStripMenuItem("Unhide");
   336             item.Click += delegate(object obj, EventArgs args) {
   337               node.IsVisible = true;
   338             };
   339             sensorContextMenuStrip.Items.Add(item);
   340           }         
   341           if (systemTray.Contains(node.Sensor)) {
   342             ToolStripMenuItem item = new ToolStripMenuItem("Remove From Tray");
   343             item.Click += delegate(object obj, EventArgs args) {
   344               systemTray.Remove(node.Sensor);
   345             };
   346             sensorContextMenuStrip.Items.Add(item);
   347           } else {
   348             ToolStripMenuItem item = new ToolStripMenuItem("Add To Tray");
   349             item.Click += delegate(object obj, EventArgs args) {
   350               systemTray.Add(node.Sensor, true);
   351             };
   352             sensorContextMenuStrip.Items.Add(item);
   353           }
   354           sensorContextMenuStrip.Show(treeView, m.X, m.Y);
   355         }
   356       }
   357     }
   358 
   359     private void saveReportToolStripMenuItem_Click(object sender, EventArgs e) {
   360       string report = computer.GetReport();
   361       if (saveFileDialog.ShowDialog() == DialogResult.OK) {
   362         using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
   363           w.Write(report);
   364         }
   365       }
   366     }
   367 
   368     private void hddsensorsToolStripMenuItem_CheckedChanged(object sender, 
   369       EventArgs e) 
   370     {
   371       computer.HDDEnabled = hddMenuItem.Checked;
   372       UpdatePlotSelection(null, null);      
   373     }
   374 
   375     private void SysTrayHideShow() {
   376       Visible = !Visible;
   377       if (Visible)
   378         Activate();    
   379     }
   380 
   381     protected override void WndProc(ref Message m) {
   382       const int WM_SYSCOMMAND = 0x112;
   383       const int SC_MINIMIZE = 0xF020;
   384       if (minTrayMenuItem.Checked && 
   385         m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
   386         SysTrayHideShow();
   387       } else {      
   388         base.WndProc(ref m);
   389       }
   390     }
   391 
   392     private void hideShowClick(object sender, EventArgs e) {
   393       SysTrayHideShow();
   394     }
   395 
   396     private void removeToolStripMenuItem_Click(object sender, EventArgs e) {
   397       ToolStripMenuItem item = sender as ToolStripMenuItem;
   398       if (item == null)
   399         return;
   400 
   401       ISensor sensor = item.Owner.Tag as ISensor;
   402       if (sensor == null)
   403         return;
   404 
   405       systemTray.Remove(sensor);
   406     }
   407 
   408     private void ShowParameterForm(ISensor sensor) {
   409       ParameterForm form = new ParameterForm();
   410       form.Parameters = sensor.Parameters;
   411       form.captionLabel.Text = sensor.Name;
   412       form.ShowDialog();
   413     }
   414 
   415     private void treeView_NodeMouseDoubleClick(object sender, 
   416       TreeNodeAdvMouseEventArgs e) {
   417       SensorNode node = e.Node.Tag as SensorNode;
   418       if (node != null && node.Sensor != null && 
   419         node.Sensor.Parameters.Length > 0) {
   420         ShowParameterForm(node.Sensor);
   421       }
   422     }
   423 
   424     private void runOnWindowsStartupToolStripMenuItem_CheckedChanged(
   425       object sender, EventArgs e) 
   426     {
   427       startupManager.Startup = startupMenuItem.Checked;
   428     }
   429 
   430     private void minTrayMenuItem_CheckedChanged(object sender, EventArgs e) {
   431       systemTray.IsMainIconEnabled = minTrayMenuItem.Checked;
   432     }
   433 
   434     private void hiddenSensorsMenuItem_CheckedChanged(object sender, 
   435       EventArgs e) {
   436       treeModel.ForceVisible = hiddenMenuItem.Checked;
   437     }
   438 
   439     private void valueMenuItem_CheckedChanged(object sender, EventArgs e) {
   440       treeView.Columns[1].IsVisible = valueMenuItem.Checked;
   441     }
   442 
   443     private void minMenuItem_CheckedChanged(object sender, EventArgs e) {
   444       treeView.Columns[2].IsVisible = minMenuItem.Checked;
   445     }
   446 
   447     private void maxMenuItem_CheckedChanged(object sender, EventArgs e) {
   448       treeView.Columns[3].IsVisible = maxMenuItem.Checked;
   449     }
   450 
   451     private void celciusToolStripMenuItem_Click(object sender, EventArgs e) {
   452       celciusToolStripMenuItem.Checked = true;
   453       fahrenheitToolStripMenuItem.Checked = false;
   454       UnitManager.TemperatureUnit = TemperatureUnit.Celcius;
   455     }
   456 
   457     private void fahrenheitToolStripMenuItem_Click(object sender, EventArgs e) {
   458       celciusToolStripMenuItem.Checked = false;
   459       fahrenheitToolStripMenuItem.Checked = true;
   460       UnitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;
   461     }
   462   }
   463 }