GUI/MainForm.cs
author moel.mich
Thu, 11 Nov 2010 21:22:24 +0000
changeset 241 52007c404f32
parent 232 475b7160e3bc
child 244 99f16e21cdc8
permissions -rw-r--r--
Fixed a problem, where the MainForm location and size was lost when the application is started minimized and exited without ever showing the form. This caused MainForm_Load to be never called (location and size was not loaded), but the default size and location were still saved. The new implementation only saves the location and size when one of the two is changed.
moel@1
     1
/*
moel@1
     2
  
moel@1
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@1
     4
moel@1
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@1
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@1
     7
  the License. You may obtain a copy of the License at
moel@1
     8
 
moel@1
     9
  http://www.mozilla.org/MPL/
moel@1
    10
moel@1
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@1
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@1
    13
  for the specific language governing rights and limitations under the License.
moel@1
    14
moel@1
    15
  The Original Code is the Open Hardware Monitor code.
moel@1
    16
moel@1
    17
  The Initial Developer of the Original Code is 
moel@1
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@1
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@1
    20
  the Initial Developer. All Rights Reserved.
moel@1
    21
paulwerelds@223
    22
  Contributor(s): Paul Werelds
moel@1
    23
moel@1
    24
  Alternatively, the contents of this file may be used under the terms of
moel@1
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@1
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@1
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@1
    28
  of those above. If you wish to allow use of your version of this file only
moel@1
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@1
    30
  use your version of this file under the terms of the MPL, indicate your
moel@1
    31
  decision by deleting the provisions above and replace them with the notice
moel@1
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@1
    33
  the provisions above, a recipient may use your version of this file under
moel@1
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@1
    35
 
moel@1
    36
*/
moel@1
    37
moel@1
    38
using System;
moel@1
    39
using System.Collections.Generic;
moel@1
    40
using System.ComponentModel;
moel@1
    41
using System.Drawing;
moel@83
    42
using System.IO;
moel@1
    43
using System.Windows.Forms;
moel@1
    44
using Aga.Controls.Tree;
moel@1
    45
using Aga.Controls.Tree.NodeControls;
moel@1
    46
using OpenHardwareMonitor.Hardware;
paulwerelds@227
    47
using OpenHardwareMonitor.WMI;
moel@1
    48
moel@1
    49
namespace OpenHardwareMonitor.GUI {
moel@1
    50
  public partial class MainForm : Form {
moel@1
    51
moel@165
    52
    private PersistentSettings settings;
moel@165
    53
    private UnitManager unitManager;
moel@165
    54
    private Computer computer;
moel@1
    55
    private Node root;
moel@1
    56
    private TreeModel treeModel;
moel@1
    57
    private IDictionary<ISensor, Color> sensorPlotColors = 
moel@1
    58
      new Dictionary<ISensor, Color>();
moel@1
    59
    private Color[] plotColorPalette;
moel@133
    60
    private SystemTray systemTray;    
moel@82
    61
    private StartupManager startupManager = new StartupManager();
moel@110
    62
    private UpdateVisitor updateVisitor = new UpdateVisitor();
moel@176
    63
    private SensorGadget gadget;
moel@1
    64
moel@156
    65
    private UserOption showHiddenSensors;
moel@156
    66
    private UserOption showPlot;
moel@156
    67
    private UserOption showValue;
moel@156
    68
    private UserOption showMin;
moel@156
    69
    private UserOption showMax;
moel@156
    70
    private UserOption startMinimized;
moel@156
    71
    private UserOption minimizeToTray;
paulwerelds@198
    72
    private UserOption minimizeOnClose;
moel@156
    73
    private UserOption autoStart;
moel@156
    74
    private UserOption readHddSensors;
moel@176
    75
    private UserOption showGadget;
paulwerelds@223
    76
paulwerelds@223
    77
    private WmiProvider wmiProvider;
moel@156
    78
moel@28
    79
    public MainForm() {      
moel@1
    80
      InitializeComponent();
moel@156
    81
moel@165
    82
      this.settings = new PersistentSettings();      
moel@165
    83
      this.settings.Load(Path.ChangeExtension(
paulwerelds@198
    84
        Application.ExecutablePath, ".config"));
moel@165
    85
moel@165
    86
      this.unitManager = new UnitManager(settings);
moel@165
    87
moel@156
    88
      // set the DockStyle here, to avoid conflicts with the MainMenu
moel@156
    89
      this.splitContainer.Dock = DockStyle.Fill;
moel@202
    90
            
moel@1
    91
      this.Font = SystemFonts.MessageBoxFont;
moel@1
    92
      treeView.Font = SystemFonts.MessageBoxFont;
moel@63
    93
      plotPanel.Font = SystemFonts.MessageBoxFont;
moel@1
    94
      
moel@133
    95
      nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
moel@133
    96
      nodeCheckBox.CheckStateChanged += UpdatePlotSelection;
moel@133
    97
      nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
moel@133
    98
      nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
moel@133
    99
      nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
moel@133
   100
      nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
moel@141
   101
      nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;
moel@1
   102
moel@113
   103
      foreach (TreeColumn column in treeView.Columns) 
moel@165
   104
        column.Width = Math.Max(20, Math.Min(400,
moel@166
   105
          settings.GetValue("treeView.Columns." + column.Header + ".Width",
moel@113
   106
          column.Width)));
moel@113
   107
moel@1
   108
      treeModel = new TreeModel();
moel@1
   109
      root = new Node(System.Environment.MachineName);
moel@1
   110
      root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
moel@1
   111
      
moel@1
   112
      treeModel.Nodes.Add(root);
moel@165
   113
      treeView.Model = treeModel;
moel@40
   114
moel@165
   115
      this.computer = new Computer(settings);
moel@165
   116
moel@165
   117
      systemTray = new SystemTray(computer, settings);
moel@133
   118
      systemTray.HideShowCommand += hideShowClick;
moel@133
   119
      systemTray.ExitCommand += exitClick;
moel@1
   120
moel@202
   121
      int p = (int)Environment.OSVersion.Platform;
moel@202
   122
      if ((p == 4) || (p == 128)) { // Unix
moel@202
   123
        splitContainer.BorderStyle = BorderStyle.None;
moel@202
   124
        splitContainer.Border3DStyle = Border3DStyle.Adjust;
moel@202
   125
        splitContainer.SplitterWidth = 4;
moel@202
   126
        treeView.BorderStyle = BorderStyle.Fixed3D;
moel@202
   127
        plotPanel.BorderStyle = BorderStyle.Fixed3D;
moel@202
   128
        gadgetMenuItem.Visible = false;
moel@202
   129
        minCloseMenuItem.Visible = false;
moel@202
   130
      } else { // Windows
moel@202
   131
        gadget = new SensorGadget(computer, settings, unitManager);
moel@232
   132
        wmiProvider = new WmiProvider(computer);
moel@202
   133
      }          
moel@176
   134
moel@28
   135
      computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
moel@232
   136
      computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);        
paulwerelds@223
   137
moel@28
   138
      computer.Open();
moel@28
   139
moel@86
   140
      timer.Enabled = true;
moel@86
   141
moel@111
   142
      plotColorPalette = new Color[13];
moel@1
   143
      plotColorPalette[0] = Color.Blue;
moel@1
   144
      plotColorPalette[1] = Color.OrangeRed;
moel@1
   145
      plotColorPalette[2] = Color.Green;
moel@1
   146
      plotColorPalette[3] = Color.LightSeaGreen;
moel@1
   147
      plotColorPalette[4] = Color.Goldenrod;
moel@1
   148
      plotColorPalette[5] = Color.DarkViolet;
moel@1
   149
      plotColorPalette[6] = Color.YellowGreen;
moel@1
   150
      plotColorPalette[7] = Color.SaddleBrown;
moel@111
   151
      plotColorPalette[8] = Color.RoyalBlue;
moel@111
   152
      plotColorPalette[9] = Color.DeepPink;
moel@111
   153
      plotColorPalette[10] = Color.MediumSeaGreen;
moel@111
   154
      plotColorPalette[11] = Color.Olive;
moel@111
   155
      plotColorPalette[12] = Color.Firebrick;
moel@1
   156
paulwerelds@223
   157
      showHiddenSensors = new UserOption("hiddenMenuItem", false,
paulwerelds@223
   158
        hiddenMenuItem, settings);
moel@156
   159
      showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
moel@156
   160
        treeModel.ForceVisible = showHiddenSensors.Value;
moel@156
   161
      };
moel@111
   162
moel@165
   163
      showPlot = new UserOption("plotMenuItem", false, plotMenuItem, settings);
moel@156
   164
      showPlot.Changed += delegate(object sender, EventArgs e) {
moel@156
   165
        splitContainer.Panel2Collapsed = !showPlot.Value;
moel@156
   166
        treeView.Invalidate();
moel@156
   167
      };
moel@1
   168
paulwerelds@223
   169
      showValue = new UserOption("valueMenuItem", true, valueMenuItem,
paulwerelds@223
   170
        settings);
moel@156
   171
      showValue.Changed += delegate(object sender, EventArgs e) {
moel@156
   172
        treeView.Columns[1].IsVisible = showValue.Value;
moel@156
   173
      };
moel@122
   174
moel@165
   175
      showMin = new UserOption("minMenuItem", false, minMenuItem, settings);
moel@156
   176
      showMin.Changed += delegate(object sender, EventArgs e) {
moel@156
   177
        treeView.Columns[2].IsVisible = showMin.Value;
moel@156
   178
      };
moel@156
   179
moel@165
   180
      showMax = new UserOption("maxMenuItem", true, maxMenuItem, settings);
moel@156
   181
      showMax.Changed += delegate(object sender, EventArgs e) {
moel@156
   182
        treeView.Columns[3].IsVisible = showMax.Value;
moel@156
   183
      };
moel@156
   184
paulwerelds@223
   185
      startMinimized = new UserOption("startMinMenuItem", false,
paulwerelds@223
   186
        startMinMenuItem, settings);
moel@156
   187
paulwerelds@223
   188
      minimizeToTray = new UserOption("minTrayMenuItem", true,
paulwerelds@223
   189
        minTrayMenuItem, settings);
moel@156
   190
      minimizeToTray.Changed += delegate(object sender, EventArgs e) {
moel@156
   191
        systemTray.IsMainIconEnabled = minimizeToTray.Value;
moel@156
   192
      };
moel@156
   193
paulwerelds@223
   194
      minimizeOnClose = new UserOption("minCloseMenuItem", false,
paulwerelds@223
   195
        minCloseMenuItem, settings);
paulwerelds@198
   196
paulwerelds@223
   197
      autoStart = new UserOption(null, startupManager.Startup,
paulwerelds@223
   198
        startupMenuItem, settings);
moel@156
   199
      autoStart.Changed += delegate(object sender, EventArgs e) {
moel@185
   200
        try {
moel@185
   201
          startupManager.Startup = autoStart.Value;
moel@185
   202
        } catch (InvalidOperationException) {
moel@185
   203
          MessageBox.Show("Updating the auto-startup option failed.", "Error", 
moel@185
   204
            MessageBoxButtons.OK, MessageBoxIcon.Error);
moel@185
   205
          autoStart.Value = startupManager.Startup;
moel@185
   206
        }
moel@156
   207
      };
moel@156
   208
paulwerelds@223
   209
      readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
paulwerelds@223
   210
        settings);
moel@156
   211
      readHddSensors.Changed += delegate(object sender, EventArgs e) {
moel@156
   212
        computer.HDDEnabled = readHddSensors.Value;
moel@156
   213
        UpdatePlotSelection(null, null);
moel@156
   214
      };
moel@156
   215
paulwerelds@223
   216
      showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
paulwerelds@223
   217
        settings);
moel@176
   218
      showGadget.Changed += delegate(object sender, EventArgs e) {
moel@202
   219
        if (gadget != null) 
moel@202
   220
          gadget.Visible = showGadget.Value;
moel@176
   221
      };
moel@176
   222
moel@156
   223
      celciusMenuItem.Checked = 
moel@165
   224
        unitManager.TemperatureUnit == TemperatureUnit.Celcius;
moel@156
   225
      fahrenheitMenuItem.Checked = !celciusMenuItem.Checked;
moel@55
   226
moel@142
   227
      startupMenuItem.Visible = startupManager.IsAvailable;
moel@125
   228
      
moel@55
   229
      if (startMinMenuItem.Checked) {
moel@82
   230
        if (!minTrayMenuItem.Checked) {
moel@55
   231
          WindowState = FormWindowState.Minimized;
moel@55
   232
          Show();
moel@55
   233
        }
moel@55
   234
      } else {
moel@55
   235
        Show();
moel@55
   236
      }
moel@70
   237
moel@71
   238
      // Create a handle, otherwise calling Close() does not fire FormClosed     
moel@71
   239
      IntPtr handle = Handle;
moel@128
   240
moel@128
   241
      // Make sure the settings are saved when the user logs off
paulwerelds@223
   242
      Microsoft.Win32.SystemEvents.SessionEnded += delegate {
paulwerelds@223
   243
        SaveConfiguration();
paulwerelds@223
   244
      };  
moel@1
   245
    }
moel@128
   246
    
moel@64
   247
    private void SubHardwareAdded(IHardware hardware, Node node) {
moel@165
   248
      Node hardwareNode = new HardwareNode(hardware, settings, unitManager);
moel@64
   249
      node.Nodes.Add(hardwareNode);
moel@64
   250
      foreach (IHardware subHardware in hardware.SubHardware)
moel@64
   251
        SubHardwareAdded(subHardware, hardwareNode);  
moel@64
   252
    }
moel@64
   253
moel@28
   254
    private void HardwareAdded(IHardware hardware) {
moel@165
   255
      Node hardwareNode = new HardwareNode(hardware, settings, unitManager);
moel@64
   256
      root.Nodes.Add(hardwareNode);
moel@64
   257
      foreach (IHardware subHardware in hardware.SubHardware)
moel@64
   258
        SubHardwareAdded(subHardware, hardwareNode);     
moel@1
   259
    }
moel@1
   260
moel@28
   261
    private void HardwareRemoved(IHardware hardware) {      
moel@1
   262
      List<Node> nodesToRemove = new List<Node>();
moel@28
   263
      foreach (Node node in root.Nodes) {
moel@28
   264
        HardwareNode hardwareNode = node as HardwareNode;
moel@28
   265
        if (hardwareNode != null && hardwareNode.Hardware == hardware)
moel@28
   266
          nodesToRemove.Add(node);
moel@28
   267
      }
moel@1
   268
      foreach (Node node in nodesToRemove)
moel@1
   269
        root.Nodes.Remove(node);
moel@1
   270
    }
moel@1
   271
moel@111
   272
    private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {       
moel@111
   273
      Node node = e.Node.Tag as Node;
moel@111
   274
      if (node != null) {
moel@1
   275
        Color color;
moel@111
   276
        if (node.IsVisible) {
moel@111
   277
          SensorNode sensorNode = node as SensorNode;
moel@111
   278
          if (plotMenuItem.Checked && sensorNode != null &&
moel@111
   279
            sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
moel@111
   280
            e.TextColor = color;
moel@111
   281
        } else {
moel@111
   282
          e.TextColor = Color.DarkGray;
moel@111
   283
        }
moel@1
   284
      }
moel@1
   285
    }
moel@1
   286
moel@1
   287
    private void UpdatePlotSelection(object sender, 
moel@1
   288
      TreePathEventArgs e) 
moel@1
   289
    {
moel@1
   290
      List<ISensor> selected = new List<ISensor>();
moel@1
   291
      IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
moel@1
   292
      int colorIndex = 0;
moel@1
   293
      foreach (TreeNodeAdv node in treeView.AllNodes) {
moel@1
   294
        SensorNode sensorNode = node.Tag as SensorNode;
moel@1
   295
        if (sensorNode != null && 
moel@1
   296
          sensorNode.Sensor.SensorType == SensorType.Temperature) {
moel@1
   297
          if (sensorNode.Plot) {
moel@1
   298
            colors.Add(sensorNode.Sensor,
moel@1
   299
              plotColorPalette[colorIndex % plotColorPalette.Length]);
moel@1
   300
            selected.Add(sensorNode.Sensor);
moel@1
   301
          }
moel@1
   302
          colorIndex++;
moel@1
   303
        }
moel@1
   304
      }
moel@1
   305
      sensorPlotColors = colors;
moel@1
   306
      plotPanel.SetSensors(selected, colors);
moel@1
   307
    }
moel@1
   308
paulwerelds@223
   309
    private void nodeTextBoxText_EditorShowing(object sender,
paulwerelds@223
   310
      CancelEventArgs e) 
moel@141
   311
    {
moel@141
   312
      e.Cancel = !(treeView.CurrentNode != null &&
moel@141
   313
        treeView.CurrentNode.Tag is SensorNode);
moel@141
   314
    }
moel@141
   315
moel@1
   316
    private void nodeCheckBox_IsVisibleValueNeeded(object sender, 
moel@1
   317
      NodeControlValueEventArgs e) {
moel@1
   318
      SensorNode node = e.Node.Tag as SensorNode;
moel@1
   319
      e.Value = (node != null) && 
moel@1
   320
        (node.Sensor.SensorType == SensorType.Temperature) && 
moel@1
   321
        plotMenuItem.Checked;
moel@1
   322
    }
moel@1
   323
moel@133
   324
    private void exitClick(object sender, EventArgs e) {
paulwerelds@198
   325
      Close();
moel@1
   326
    }
moel@1
   327
moel@86
   328
    private void timer_Tick(object sender, EventArgs e) {
moel@110
   329
      computer.Accept(updateVisitor);
moel@1
   330
      treeView.Invalidate();
moel@1
   331
      plotPanel.Invalidate();
paulwerelds@223
   332
      systemTray.Redraw();
moel@202
   333
      if (gadget != null)
moel@202
   334
        gadget.Redraw();
paulwerelds@223
   335
paulwerelds@223
   336
      if (wmiProvider != null)
paulwerelds@223
   337
        wmiProvider.Update();
moel@1
   338
    }
moel@1
   339
moel@128
   340
    private void SaveConfiguration() {
moel@128
   341
      foreach (TreeColumn column in treeView.Columns)
moel@166
   342
        settings.SetValue("treeView.Columns." + column.Header + ".Width",
moel@113
   343
          column.Width);
moel@113
   344
moel@212
   345
      string fileName = Path.ChangeExtension(
moel@212
   346
          System.Windows.Forms.Application.ExecutablePath, ".config");
moel@212
   347
      try {
moel@212
   348
        settings.Save(fileName);
moel@212
   349
      } catch (UnauthorizedAccessException) {
paulwerelds@214
   350
        MessageBox.Show("Access to the path '" + fileName + "' is denied. " +
moel@212
   351
          "The current seetings could not be saved.", 
moel@212
   352
          "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
moel@212
   353
      }
moel@128
   354
    }
moel@128
   355
paulwerelds@214
   356
    private void MainForm_Load(object sender, EventArgs e) {
paulwerelds@214
   357
      Rectangle newBounds = new Rectangle {
paulwerelds@214
   358
        X = settings.GetValue("mainForm.Location.X", Location.X),
paulwerelds@214
   359
        Y = settings.GetValue("mainForm.Location.Y", Location.Y),
paulwerelds@214
   360
        Width = settings.GetValue("mainForm.Width", 470),
paulwerelds@214
   361
        Height = settings.GetValue("mainForm.Height", 640)
paulwerelds@214
   362
      };
paulwerelds@214
   363
paulwerelds@223
   364
      Rectangle fullWorkingArea = new Rectangle(int.MaxValue, int.MaxValue,
paulwerelds@214
   365
        int.MinValue, int.MinValue);
paulwerelds@214
   366
paulwerelds@214
   367
      foreach (Screen screen in Screen.AllScreens)
paulwerelds@223
   368
        fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds);
paulwerelds@214
   369
paulwerelds@223
   370
      Rectangle intersection = Rectangle.Intersect(fullWorkingArea, newBounds);
paulwerelds@214
   371
      if (intersection.Width < 20 || intersection.Height < 20 ||
paulwerelds@214
   372
        !settings.Contains("mainForm.Location.X")
paulwerelds@214
   373
      ) {
paulwerelds@214
   374
        newBounds.X = (Screen.PrimaryScreen.WorkingArea.Width / 2) -
paulwerelds@214
   375
                      (newBounds.Width/2);
paulwerelds@214
   376
paulwerelds@214
   377
        newBounds.Y = (Screen.PrimaryScreen.WorkingArea.Height / 2) -
paulwerelds@214
   378
                      (newBounds.Height / 2);
paulwerelds@214
   379
      }
paulwerelds@214
   380
paulwerelds@214
   381
      this.Bounds = newBounds;
paulwerelds@214
   382
    }
paulwerelds@214
   383
    
paulwerelds@214
   384
    private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
moel@156
   385
      Visible = false;
moel@128
   386
      SaveConfiguration();
moel@128
   387
moel@86
   388
      timer.Enabled = false;
moel@133
   389
      systemTray.Dispose();      
moel@28
   390
      computer.Close();
moel@1
   391
    }
moel@1
   392
moel@156
   393
    private void aboutMenuItem_Click(object sender, EventArgs e) {
moel@1
   394
      new AboutBox().ShowDialog();
moel@1
   395
    }
moel@1
   396
moel@1
   397
    private void treeView_Click(object sender, EventArgs e) {
moel@1
   398
      
moel@1
   399
      MouseEventArgs m = e as MouseEventArgs;
moel@1
   400
      if (m == null || m.Button != MouseButtons.Right)
moel@1
   401
        return;
moel@1
   402
paulwerelds@223
   403
      NodeControlInfo info = treeView.GetNodeControlInfoAt(
paulwerelds@223
   404
        new Point(m.X, m.Y)
paulwerelds@223
   405
      );
moel@156
   406
      treeView.SelectedNode = info.Node;
moel@156
   407
      if (info.Node != null) {
moel@40
   408
        SensorNode node = info.Node.Tag as SensorNode;
moel@40
   409
        if (node != null && node.Sensor != null) {
moel@156
   410
          sensorContextMenu.MenuItems.Clear();
moel@63
   411
          if (node.Sensor.Parameters.Length > 0) {
moel@156
   412
            MenuItem item = new MenuItem("Parameters...");
moel@63
   413
            item.Click += delegate(object obj, EventArgs args) {
moel@63
   414
              ShowParameterForm(node.Sensor);
moel@63
   415
            };
moel@156
   416
            sensorContextMenu.MenuItems.Add(item);
moel@63
   417
          }
moel@156
   418
          if (nodeTextBoxText.EditEnabled) {
moel@156
   419
            MenuItem item = new MenuItem("Rename");
moel@141
   420
            item.Click += delegate(object obj, EventArgs args) {
moel@156
   421
              nodeTextBoxText.BeginEdit();
moel@141
   422
            };
moel@156
   423
            sensorContextMenu.MenuItems.Add(item);
moel@176
   424
          }
moel@111
   425
          if (node.IsVisible) {
moel@156
   426
            MenuItem item = new MenuItem("Hide");
moel@111
   427
            item.Click += delegate(object obj, EventArgs args) {
moel@111
   428
              node.IsVisible = false;
moel@111
   429
            };
moel@156
   430
            sensorContextMenu.MenuItems.Add(item);
moel@111
   431
          } else {
moel@156
   432
            MenuItem item = new MenuItem("Unhide");
moel@111
   433
            item.Click += delegate(object obj, EventArgs args) {
moel@111
   434
              node.IsVisible = true;
moel@111
   435
            };
moel@156
   436
            sensorContextMenu.MenuItems.Add(item);
moel@176
   437
          }
moel@176
   438
          sensorContextMenu.MenuItems.Add(new MenuItem("-"));
moel@178
   439
          {
moel@178
   440
            MenuItem item = new MenuItem("Show in Tray");
moel@178
   441
            item.Checked = systemTray.Contains(node.Sensor);
moel@178
   442
            item.Click += delegate(object obj, EventArgs args) {
moel@178
   443
              if (item.Checked)
moel@178
   444
                systemTray.Remove(node.Sensor);
moel@178
   445
              else
moel@178
   446
                systemTray.Add(node.Sensor, true);
moel@178
   447
            };
moel@178
   448
            sensorContextMenu.MenuItems.Add(item);
moel@178
   449
          }
moel@211
   450
          if (gadget != null) {
moel@178
   451
            MenuItem item = new MenuItem("Show in Gadget");
moel@178
   452
            item.Checked = gadget.Contains(node.Sensor);
moel@178
   453
            item.Click += delegate(object obj, EventArgs args) {
moel@178
   454
              if (item.Checked) {
moel@178
   455
                gadget.Remove(node.Sensor);
moel@178
   456
              } else {
moel@178
   457
                gadget.Add(node.Sensor);
moel@178
   458
              }
moel@178
   459
            };
moel@178
   460
            sensorContextMenu.MenuItems.Add(item);
moel@178
   461
          }
moel@176
   462
moel@156
   463
          sensorContextMenu.Show(treeView, new Point(m.X, m.Y));
moel@40
   464
        }
moel@40
   465
      }
moel@1
   466
    }
moel@1
   467
moel@156
   468
    private void saveReportMenuItem_Click(object sender, EventArgs e) {
moel@83
   469
      string report = computer.GetReport();
moel@83
   470
      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
moel@83
   471
        using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
moel@83
   472
          w.Write(report);
moel@83
   473
        }
moel@83
   474
      }
moel@1
   475
    }
moel@1
   476
moel@82
   477
    private void SysTrayHideShow() {
moel@82
   478
      Visible = !Visible;
moel@82
   479
      if (Visible)
moel@82
   480
        Activate();    
moel@27
   481
    }
moel@27
   482
moel@27
   483
    protected override void WndProc(ref Message m) {
moel@27
   484
      const int WM_SYSCOMMAND = 0x112;
moel@27
   485
      const int SC_MINIMIZE = 0xF020;
paulwerelds@198
   486
      const int SC_CLOSE = 0xF060;
paulwerelds@198
   487
moel@156
   488
      if (minimizeToTray.Value && 
moel@28
   489
        m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE) {
moel@82
   490
        SysTrayHideShow();
paulwerelds@198
   491
      } else if(minimizeOnClose.Value && 
paulwerelds@198
   492
        m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_CLOSE) {
paulwerelds@198
   493
        /*
paulwerelds@198
   494
         * Apparently the user wants to minimize rather than close
paulwerelds@198
   495
         * Now we still need to check if we're going to the tray or not
paulwerelds@198
   496
         * 
paulwerelds@198
   497
         * Note: the correct way to do this would be to send out SC_MINIMIZE,
paulwerelds@198
   498
         * but since the code here is so simple,
paulwerelds@198
   499
         * that would just be a waste of time.
paulwerelds@198
   500
         */
paulwerelds@198
   501
        if (minimizeToTray.Value)
paulwerelds@198
   502
          SysTrayHideShow();
paulwerelds@198
   503
        else
paulwerelds@198
   504
          WindowState = FormWindowState.Minimized;
moel@27
   505
      } else {      
moel@27
   506
        base.WndProc(ref m);
moel@27
   507
      }
moel@27
   508
    }
moel@27
   509
moel@82
   510
    private void hideShowClick(object sender, EventArgs e) {
moel@82
   511
      SysTrayHideShow();
moel@27
   512
    }
moel@27
   513
moel@63
   514
    private void ShowParameterForm(ISensor sensor) {
moel@63
   515
      ParameterForm form = new ParameterForm();
moel@63
   516
      form.Parameters = sensor.Parameters;
moel@63
   517
      form.captionLabel.Text = sensor.Name;
moel@63
   518
      form.ShowDialog();
moel@63
   519
    }
moel@63
   520
moel@63
   521
    private void treeView_NodeMouseDoubleClick(object sender, 
moel@63
   522
      TreeNodeAdvMouseEventArgs e) {
moel@63
   523
      SensorNode node = e.Node.Tag as SensorNode;
moel@63
   524
      if (node != null && node.Sensor != null && 
moel@63
   525
        node.Sensor.Parameters.Length > 0) {
moel@63
   526
        ShowParameterForm(node.Sensor);
moel@63
   527
      }
moel@63
   528
    }
moel@82
   529
moel@156
   530
    private void celciusMenuItem_Click(object sender, EventArgs e) {
moel@156
   531
      celciusMenuItem.Checked = true;
moel@156
   532
      fahrenheitMenuItem.Checked = false;
moel@165
   533
      unitManager.TemperatureUnit = TemperatureUnit.Celcius;
moel@122
   534
    }
moel@122
   535
moel@156
   536
    private void fahrenheitMenuItem_Click(object sender, EventArgs e) {
moel@156
   537
      celciusMenuItem.Checked = false;
moel@156
   538
      fahrenheitMenuItem.Checked = true;
moel@165
   539
      unitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;
moel@122
   540
    }
moel@150
   541
moel@156
   542
    private void sumbitReportMenuItem_Click(object sender, EventArgs e) 
moel@150
   543
    {
moel@150
   544
      ReportForm form = new ReportForm();
moel@150
   545
      form.Report = computer.GetReport();
moel@150
   546
      form.ShowDialog();      
moel@150
   547
    }
moel@151
   548
moel@151
   549
    private void resetMinMaxMenuItem_Click(object sender, EventArgs e) {
moel@159
   550
      computer.Accept(new SensorVisitor(delegate(ISensor sensor) {
moel@159
   551
        sensor.ResetMin();
moel@159
   552
        sensor.ResetMax();
moel@159
   553
      }));
moel@151
   554
    }
moel@241
   555
moel@241
   556
    private void MainForm_MoveOrResize(object sender, EventArgs e) {
moel@241
   557
      if (WindowState != FormWindowState.Minimized) {
moel@241
   558
        settings.SetValue("mainForm.Location.X", Bounds.X);
moel@241
   559
        settings.SetValue("mainForm.Location.Y", Bounds.Y);
moel@241
   560
        settings.SetValue("mainForm.Width", Bounds.Width);
moel@241
   561
        settings.SetValue("mainForm.Height", Bounds.Height);
moel@241
   562
      }
moel@241
   563
    }
moel@1
   564
  }
moel@1
   565
}