Better formatting FrontView lines. Now cycling through each FrontView sensor every 2 seconds.
Fixing character conversion when sending VFD text.
Using special FrontView characters for ?C and ?F.
3 This Source Code Form is subject to the terms of the Mozilla Public
4 License, v. 2.0. If a copy of the MPL was not distributed with this
5 file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
8 Copyright (C) 2010 Paul Werelds <paul@werelds.net>
9 Copyright (C) 2012 Prince Samuel <prince.samuel@gmail.com>
14 using System.Collections.Generic;
15 using System.Collections.ObjectModel;
16 using System.ComponentModel;
19 using System.Reflection;
20 using System.Windows.Forms;
22 using Aga.Controls.Tree;
23 using Aga.Controls.Tree.NodeControls;
24 using OpenHardwareMonitor.Hardware;
25 using OpenHardwareMonitor.WMI;
26 using OpenHardwareMonitor.Utilities;
29 namespace OpenHardwareMonitor.GUI {
30 public partial class MainForm : Form {
32 private PersistentSettings settings;
33 private UnitManager unitManager;
34 private Computer computer;
36 private TreeModel treeModel;
37 private IDictionary<ISensor, Color> sensorPlotColors =
38 new Dictionary<ISensor, Color>();
39 private Color[] plotColorPalette;
40 private SystemTray systemTray;
41 private SoundGraphDisplay soundGraphDisplay;
42 private bool displayTick;
43 private StartupManager startupManager = new StartupManager();
44 private UpdateVisitor updateVisitor = new UpdateVisitor();
45 private SensorGadget gadget;
46 private Form plotForm;
47 private PlotPanel plotPanel;
49 private UserOption showHiddenSensors;
50 private UserOption showPlot;
51 private UserOption showValue;
52 private UserOption showMin;
53 private UserOption showMax;
54 private UserOption startMinimized;
55 private UserOption minimizeToTray;
56 private UserOption minimizeOnClose;
57 private UserOption autoStart;
59 private UserOption readMainboardSensors;
60 private UserOption readCpuSensors;
61 private UserOption readRamSensors;
62 private UserOption readGpuSensors;
63 private UserOption readFanControllersSensors;
64 private UserOption readHddSensors;
66 private UserOption showGadget;
67 private UserRadioGroup plotLocation;
68 private WmiProvider wmiProvider;
70 private UserOption runWebServer;
71 private HttpServer server;
73 private bool selectionDragging = false;
76 InitializeComponent();
78 // check if the OpenHardwareMonitorLib assembly has the correct version
79 if (Assembly.GetAssembly(typeof(Computer)).GetName().Version !=
80 Assembly.GetExecutingAssembly().GetName().Version) {
82 "The version of the file OpenHardwareMonitorLib.dll is incompatible.",
83 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
87 this.settings = new PersistentSettings();
88 this.settings.Load(Path.ChangeExtension(
89 Application.ExecutablePath, ".config"));
91 this.unitManager = new UnitManager(settings);
93 // make sure the buffers used for double buffering are not disposed
94 // after each draw call
95 BufferedGraphicsManager.Current.MaximumBuffer =
96 Screen.PrimaryScreen.Bounds.Size;
98 // set the DockStyle here, to avoid conflicts with the MainMenu
99 this.splitContainer.Dock = DockStyle.Fill;
101 this.Font = SystemFonts.MessageBoxFont;
102 treeView.Font = SystemFonts.MessageBoxFont;
104 plotPanel = new PlotPanel(settings);
105 plotPanel.Font = SystemFonts.MessageBoxFont;
106 plotPanel.Dock = DockStyle.Fill;
108 nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
109 nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
110 nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
111 nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
112 nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
113 nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;
115 foreach (TreeColumn column in treeView.Columns)
116 column.Width = Math.Max(20, Math.Min(400,
117 settings.GetValue("treeView.Columns." + column.Header + ".Width",
120 treeModel = new TreeModel();
121 root = new Node(System.Environment.MachineName);
122 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
124 treeModel.Nodes.Add(root);
125 treeView.Model = treeModel;
127 this.computer = new Computer(settings);
129 systemTray = new SystemTray(computer, settings, unitManager);
130 systemTray.HideShowCommand += hideShowClick;
131 systemTray.ExitCommand += exitClick;
133 soundGraphDisplay = new SoundGraphDisplay(computer, settings, unitManager);
136 int p = (int)Environment.OSVersion.Platform;
137 if ((p == 4) || (p == 128)) { // Unix
138 treeView.RowHeight = Math.Max(treeView.RowHeight, 18);
139 splitContainer.BorderStyle = BorderStyle.None;
140 splitContainer.Border3DStyle = Border3DStyle.Adjust;
141 splitContainer.SplitterWidth = 4;
142 treeView.BorderStyle = BorderStyle.Fixed3D;
143 plotPanel.BorderStyle = BorderStyle.Fixed3D;
144 gadgetMenuItem.Visible = false;
145 minCloseMenuItem.Visible = false;
146 minTrayMenuItem.Visible = false;
147 startMinMenuItem.Visible = false;
149 treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);
151 gadget = new SensorGadget(computer, settings, unitManager);
152 gadget.HideShowCommand += hideShowClick;
154 wmiProvider = new WmiProvider(computer);
157 plotColorPalette = new Color[13];
158 plotColorPalette[0] = Color.Blue;
159 plotColorPalette[1] = Color.OrangeRed;
160 plotColorPalette[2] = Color.Green;
161 plotColorPalette[3] = Color.LightSeaGreen;
162 plotColorPalette[4] = Color.Goldenrod;
163 plotColorPalette[5] = Color.DarkViolet;
164 plotColorPalette[6] = Color.YellowGreen;
165 plotColorPalette[7] = Color.SaddleBrown;
166 plotColorPalette[8] = Color.RoyalBlue;
167 plotColorPalette[9] = Color.DeepPink;
168 plotColorPalette[10] = Color.MediumSeaGreen;
169 plotColorPalette[11] = Color.Olive;
170 plotColorPalette[12] = Color.Firebrick;
172 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
173 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
177 timer.Enabled = true;
179 showHiddenSensors = new UserOption("hiddenMenuItem", false,
180 hiddenMenuItem, settings);
181 showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
182 treeModel.ForceVisible = showHiddenSensors.Value;
185 showValue = new UserOption("valueMenuItem", true, valueMenuItem,
187 showValue.Changed += delegate(object sender, EventArgs e) {
188 treeView.Columns[1].IsVisible = showValue.Value;
191 showMin = new UserOption("minMenuItem", false, minMenuItem, settings);
192 showMin.Changed += delegate(object sender, EventArgs e) {
193 treeView.Columns[2].IsVisible = showMin.Value;
196 showMax = new UserOption("maxMenuItem", true, maxMenuItem, settings);
197 showMax.Changed += delegate(object sender, EventArgs e) {
198 treeView.Columns[3].IsVisible = showMax.Value;
201 startMinimized = new UserOption("startMinMenuItem", false,
202 startMinMenuItem, settings);
204 minimizeToTray = new UserOption("minTrayMenuItem", true,
205 minTrayMenuItem, settings);
206 minimizeToTray.Changed += delegate(object sender, EventArgs e) {
207 systemTray.IsMainIconEnabled = minimizeToTray.Value;
210 minimizeOnClose = new UserOption("minCloseMenuItem", false,
211 minCloseMenuItem, settings);
213 autoStart = new UserOption(null, startupManager.Startup,
214 startupMenuItem, settings);
215 autoStart.Changed += delegate(object sender, EventArgs e) {
217 startupManager.Startup = autoStart.Value;
218 } catch (InvalidOperationException) {
219 MessageBox.Show("Updating the auto-startup option failed.", "Error",
220 MessageBoxButtons.OK, MessageBoxIcon.Error);
221 autoStart.Value = startupManager.Startup;
225 readMainboardSensors = new UserOption("mainboardMenuItem", true,
226 mainboardMenuItem, settings);
227 readMainboardSensors.Changed += delegate(object sender, EventArgs e) {
228 computer.MainboardEnabled = readMainboardSensors.Value;
231 readCpuSensors = new UserOption("cpuMenuItem", true,
232 cpuMenuItem, settings);
233 readCpuSensors.Changed += delegate(object sender, EventArgs e) {
234 computer.CPUEnabled = readCpuSensors.Value;
237 readRamSensors = new UserOption("ramMenuItem", true,
238 ramMenuItem, settings);
239 readRamSensors.Changed += delegate(object sender, EventArgs e) {
240 computer.RAMEnabled = readRamSensors.Value;
243 readGpuSensors = new UserOption("gpuMenuItem", true,
244 gpuMenuItem, settings);
245 readGpuSensors.Changed += delegate(object sender, EventArgs e) {
246 computer.GPUEnabled = readGpuSensors.Value;
249 readFanControllersSensors = new UserOption("fanControllerMenuItem", true,
250 fanControllerMenuItem, settings);
251 readFanControllersSensors.Changed += delegate(object sender, EventArgs e) {
252 computer.FanControllerEnabled = readFanControllersSensors.Value;
255 readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
257 readHddSensors.Changed += delegate(object sender, EventArgs e) {
258 computer.HDDEnabled = readHddSensors.Value;
261 showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
263 showGadget.Changed += delegate(object sender, EventArgs e) {
265 gadget.Visible = showGadget.Value;
268 celsiusMenuItem.Checked =
269 unitManager.TemperatureUnit == TemperatureUnit.Celsius;
270 fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;
272 server = new HttpServer(root, this.settings.GetValue("listenerPort", 8085));
273 if (server.PlatformNotSupported) {
274 webMenuItemSeparator.Visible = false;
275 webMenuItem.Visible = false;
278 runWebServer = new UserOption("runWebServerMenuItem", false,
279 runWebServerMenuItem, settings);
280 runWebServer.Changed += delegate(object sender, EventArgs e) {
281 if (runWebServer.Value)
282 server.StartHTTPListener();
284 server.StopHTTPListener();
287 InitializePlotForm();
290 soundGraphDisplay.Init();
294 startupMenuItem.Visible = startupManager.IsAvailable;
296 if (startMinMenuItem.Checked) {
297 if (!minTrayMenuItem.Checked) {
298 WindowState = FormWindowState.Minimized;
305 // Create a handle, otherwise calling Close() does not fire FormClosed
306 IntPtr handle = Handle;
308 // Make sure the settings are saved when the user logs off
309 Microsoft.Win32.SystemEvents.SessionEnded += delegate {
312 if (runWebServer.Value)
317 private void InitializePlotForm() {
318 plotForm = new Form();
319 plotForm.FormBorderStyle = FormBorderStyle.SizableToolWindow;
320 plotForm.ShowInTaskbar = false;
321 plotForm.StartPosition = FormStartPosition.Manual;
322 this.AddOwnedForm(plotForm);
323 plotForm.Bounds = new Rectangle {
324 X = settings.GetValue("plotForm.Location.X", -100000),
325 Y = settings.GetValue("plotForm.Location.Y", 100),
326 Width = settings.GetValue("plotForm.Width", 600),
327 Height = settings.GetValue("plotForm.Height", 400)
330 showPlot = new UserOption("plotMenuItem", false, plotMenuItem, settings);
331 plotLocation = new UserRadioGroup("plotLocation", 0,
332 new[] { plotWindowMenuItem, plotBottomMenuItem, plotRightMenuItem },
335 showPlot.Changed += delegate(object sender, EventArgs e) {
336 if (plotLocation.Value == 0) {
337 if (showPlot.Value && this.Visible)
342 splitContainer.Panel2Collapsed = !showPlot.Value;
344 treeView.Invalidate();
346 plotLocation.Changed += delegate(object sender, EventArgs e) {
347 switch (plotLocation.Value) {
349 splitContainer.Panel2.Controls.Clear();
350 splitContainer.Panel2Collapsed = true;
351 plotForm.Controls.Add(plotPanel);
352 if (showPlot.Value && this.Visible)
356 plotForm.Controls.Clear();
358 splitContainer.Orientation = Orientation.Horizontal;
359 splitContainer.Panel2.Controls.Add(plotPanel);
360 splitContainer.Panel2Collapsed = !showPlot.Value;
363 plotForm.Controls.Clear();
365 splitContainer.Orientation = Orientation.Vertical;
366 splitContainer.Panel2.Controls.Add(plotPanel);
367 splitContainer.Panel2Collapsed = !showPlot.Value;
372 plotForm.FormClosing += delegate(object sender, FormClosingEventArgs e) {
373 if (e.CloseReason == CloseReason.UserClosing) {
374 // just switch off the plotting when the user closes the form
375 if (plotLocation.Value == 0) {
376 showPlot.Value = false;
382 EventHandler moveOrResizePlotForm = delegate(object sender, EventArgs e) {
383 if (plotForm.WindowState != FormWindowState.Minimized) {
384 settings.SetValue("plotForm.Location.X", plotForm.Bounds.X);
385 settings.SetValue("plotForm.Location.Y", plotForm.Bounds.Y);
386 settings.SetValue("plotForm.Width", plotForm.Bounds.Width);
387 settings.SetValue("plotForm.Height", plotForm.Bounds.Height);
390 plotForm.Move += moveOrResizePlotForm;
391 plotForm.Resize += moveOrResizePlotForm;
393 plotForm.VisibleChanged += delegate(object sender, EventArgs e) {
394 Rectangle bounds = new Rectangle(plotForm.Location, plotForm.Size);
395 Screen screen = Screen.FromRectangle(bounds);
396 Rectangle intersection =
397 Rectangle.Intersect(screen.WorkingArea, bounds);
398 if (intersection.Width < Math.Min(16, bounds.Width) ||
399 intersection.Height < Math.Min(16, bounds.Height)) {
400 plotForm.Location = new Point(
401 screen.WorkingArea.Width / 2 - bounds.Width / 2,
402 screen.WorkingArea.Height / 2 - bounds.Height / 2);
406 this.VisibleChanged += delegate(object sender, EventArgs e) {
407 if (this.Visible && showPlot.Value && plotLocation.Value == 0)
414 private void InsertSorted(Collection<Node> nodes, HardwareNode node) {
416 while (i < nodes.Count && nodes[i] is HardwareNode &&
417 ((HardwareNode)nodes[i]).Hardware.HardwareType <
418 node.Hardware.HardwareType)
420 nodes.Insert(i, node);
423 private void SubHardwareAdded(IHardware hardware, Node node) {
424 HardwareNode hardwareNode =
425 new HardwareNode(hardware, settings, unitManager);
426 hardwareNode.PlotSelectionChanged += PlotSelectionChanged;
428 InsertSorted(node.Nodes, hardwareNode);
430 foreach (IHardware subHardware in hardware.SubHardware)
431 SubHardwareAdded(subHardware, hardwareNode);
434 private void HardwareAdded(IHardware hardware) {
435 SubHardwareAdded(hardware, root);
436 PlotSelectionChanged(this, null);
439 private void HardwareRemoved(IHardware hardware) {
440 List<HardwareNode> nodesToRemove = new List<HardwareNode>();
441 foreach (Node node in root.Nodes) {
442 HardwareNode hardwareNode = node as HardwareNode;
443 if (hardwareNode != null && hardwareNode.Hardware == hardware)
444 nodesToRemove.Add(hardwareNode);
446 foreach (HardwareNode hardwareNode in nodesToRemove) {
447 root.Nodes.Remove(hardwareNode);
448 hardwareNode.PlotSelectionChanged -= PlotSelectionChanged;
450 PlotSelectionChanged(this, null);
453 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
454 Node node = e.Node.Tag as Node;
457 if (node.IsVisible) {
458 SensorNode sensorNode = node as SensorNode;
459 if (plotMenuItem.Checked && sensorNode != null &&
460 sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
463 e.TextColor = Color.DarkGray;
468 private void PlotSelectionChanged(object sender, EventArgs e) {
469 List<ISensor> selected = new List<ISensor>();
470 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
472 foreach (TreeNodeAdv node in treeView.AllNodes) {
473 SensorNode sensorNode = node.Tag as SensorNode;
474 if (sensorNode != null &&
475 sensorNode.Sensor.SensorType == SensorType.Temperature) {
476 if (sensorNode.Plot) {
477 colors.Add(sensorNode.Sensor,
478 plotColorPalette[colorIndex % plotColorPalette.Length]);
479 selected.Add(sensorNode.Sensor);
484 sensorPlotColors = colors;
485 plotPanel.SetSensors(selected, colors);
488 private void nodeTextBoxText_EditorShowing(object sender,
491 e.Cancel = !(treeView.CurrentNode != null &&
492 (treeView.CurrentNode.Tag is SensorNode ||
493 treeView.CurrentNode.Tag is HardwareNode));
496 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
497 NodeControlValueEventArgs e) {
498 SensorNode node = e.Node.Tag as SensorNode;
499 e.Value = (node != null) &&
500 (node.Sensor.SensorType == SensorType.Temperature) &&
501 plotMenuItem.Checked;
504 private void exitClick(object sender, EventArgs e) {
509 private void timer_Tick(object sender, EventArgs e) {
510 computer.Accept(updateVisitor);
511 treeView.Invalidate();
512 plotPanel.Invalidate();
517 if (wmiProvider != null)
518 wmiProvider.Update();
520 if (soundGraphDisplay != null)
522 soundGraphDisplay.Redraw();
524 displayTick=!displayTick;
527 soundGraphDisplay.SetText(" ---", "");
531 soundGraphDisplay.SetText(" -+-", "");
538 private void SaveConfiguration() {
539 foreach (TreeColumn column in treeView.Columns)
540 settings.SetValue("treeView.Columns." + column.Header + ".Width",
543 this.settings.SetValue("listenerPort", server.ListenerPort);
545 string fileName = Path.ChangeExtension(
546 System.Windows.Forms.Application.ExecutablePath, ".config");
548 settings.Save(fileName);
549 } catch (UnauthorizedAccessException) {
550 MessageBox.Show("Access to the path '" + fileName + "' is denied. " +
551 "The current settings could not be saved.",
552 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
553 } catch (IOException) {
554 MessageBox.Show("The path '" + fileName + "' is not writeable. " +
555 "The current settings could not be saved.",
556 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
560 private void MainForm_Load(object sender, EventArgs e) {
561 Rectangle newBounds = new Rectangle {
562 X = settings.GetValue("mainForm.Location.X", Location.X),
563 Y = settings.GetValue("mainForm.Location.Y", Location.Y),
564 Width = settings.GetValue("mainForm.Width", 470),
565 Height = settings.GetValue("mainForm.Height", 640)
568 Rectangle fullWorkingArea = new Rectangle(int.MaxValue, int.MaxValue,
569 int.MinValue, int.MinValue);
571 foreach (Screen screen in Screen.AllScreens)
572 fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds);
574 Rectangle intersection = Rectangle.Intersect(fullWorkingArea, newBounds);
575 if (intersection.Width < 20 || intersection.Height < 20 ||
576 !settings.Contains("mainForm.Location.X")
578 newBounds.X = (Screen.PrimaryScreen.WorkingArea.Width / 2) -
581 newBounds.Y = (Screen.PrimaryScreen.WorkingArea.Height / 2) -
582 (newBounds.Height / 2);
585 this.Bounds = newBounds;
588 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
590 systemTray.IsMainIconEnabled = false;
591 timer.Enabled = false;
594 if (runWebServer.Value)
596 systemTray.Dispose();
597 soundGraphDisplay.Dispose();
600 private void aboutMenuItem_Click(object sender, EventArgs e) {
601 new AboutBox().ShowDialog();
604 private void treeView_Click(object sender, EventArgs e) {
606 MouseEventArgs m = e as MouseEventArgs;
607 if (m == null || m.Button != MouseButtons.Right)
610 NodeControlInfo info = treeView.GetNodeControlInfoAt(
613 treeView.SelectedNode = info.Node;
614 if (info.Node != null) {
615 SensorNode node = info.Node.Tag as SensorNode;
616 if (node != null && node.Sensor != null) {
617 treeContextMenu.MenuItems.Clear();
618 if (node.Sensor.Parameters.Length > 0) {
619 MenuItem item = new MenuItem("Parameters...");
620 item.Click += delegate(object obj, EventArgs args) {
621 ShowParameterForm(node.Sensor);
623 treeContextMenu.MenuItems.Add(item);
625 if (nodeTextBoxText.EditEnabled) {
626 MenuItem item = new MenuItem("Rename");
627 item.Click += delegate(object obj, EventArgs args) {
628 nodeTextBoxText.BeginEdit();
630 treeContextMenu.MenuItems.Add(item);
632 if (node.IsVisible) {
633 MenuItem item = new MenuItem("Hide");
634 item.Click += delegate(object obj, EventArgs args) {
635 node.IsVisible = false;
637 treeContextMenu.MenuItems.Add(item);
639 MenuItem item = new MenuItem("Unhide");
640 item.Click += delegate(object obj, EventArgs args) {
641 node.IsVisible = true;
643 treeContextMenu.MenuItems.Add(item);
645 treeContextMenu.MenuItems.Add(new MenuItem("-"));
647 MenuItem item = new MenuItem("Show in Tray");
648 item.Checked = systemTray.Contains(node.Sensor);
649 item.Click += delegate(object obj, EventArgs args) {
651 systemTray.Remove(node.Sensor);
653 systemTray.Add(node.Sensor, true);
655 treeContextMenu.MenuItems.Add(item);
658 MenuItem item = new MenuItem("Show in iMON FrontView");
659 item.Checked = soundGraphDisplay.Contains(node.Sensor);
660 item.Click += delegate(object obj, EventArgs args)
663 soundGraphDisplay.Remove(node.Sensor);
665 soundGraphDisplay.Add(node.Sensor, true);
667 treeContextMenu.MenuItems.Add(item);
669 if (gadget != null) {
670 MenuItem item = new MenuItem("Show in Gadget");
671 item.Checked = gadget.Contains(node.Sensor);
672 item.Click += delegate(object obj, EventArgs args) {
674 gadget.Remove(node.Sensor);
676 gadget.Add(node.Sensor);
679 treeContextMenu.MenuItems.Add(item);
681 if (node.Sensor.Control != null) {
682 treeContextMenu.MenuItems.Add(new MenuItem("-"));
683 IControl control = node.Sensor.Control;
684 MenuItem controlItem = new MenuItem("Control");
685 MenuItem defaultItem = new MenuItem("Default");
686 defaultItem.Checked = control.ControlMode == ControlMode.Default;
687 controlItem.MenuItems.Add(defaultItem);
688 defaultItem.Click += delegate(object obj, EventArgs args) {
689 control.SetDefault();
691 MenuItem manualItem = new MenuItem("Manual");
692 controlItem.MenuItems.Add(manualItem);
693 manualItem.Checked = control.ControlMode == ControlMode.Software;
694 for (int i = 0; i <= 100; i += 5) {
695 if (i <= control.MaxSoftwareValue &&
696 i >= control.MinSoftwareValue) {
697 MenuItem item = new MenuItem(i + " %");
698 item.RadioCheck = true;
699 manualItem.MenuItems.Add(item);
700 item.Checked = control.ControlMode == ControlMode.Software &&
701 Math.Round(control.SoftwareValue) == i;
702 int softwareValue = i;
703 item.Click += delegate(object obj, EventArgs args) {
704 control.SetSoftware(softwareValue);
708 treeContextMenu.MenuItems.Add(controlItem);
711 treeContextMenu.Show(treeView, new Point(m.X, m.Y));
714 HardwareNode hardwareNode = info.Node.Tag as HardwareNode;
715 if (hardwareNode != null && hardwareNode.Hardware != null) {
716 treeContextMenu.MenuItems.Clear();
718 if (nodeTextBoxText.EditEnabled) {
719 MenuItem item = new MenuItem("Rename");
720 item.Click += delegate(object obj, EventArgs args) {
721 nodeTextBoxText.BeginEdit();
723 treeContextMenu.MenuItems.Add(item);
726 treeContextMenu.Show(treeView, new Point(m.X, m.Y));
731 private void saveReportMenuItem_Click(object sender, EventArgs e) {
732 string report = computer.GetReport();
733 if (saveFileDialog.ShowDialog() == DialogResult.OK) {
734 using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
740 private void SysTrayHideShow() {
746 protected override void WndProc(ref Message m) {
747 const int WM_SYSCOMMAND = 0x112;
748 const int SC_MINIMIZE = 0xF020;
749 const int SC_CLOSE = 0xF060;
752 if (minimizeToTray.Value &&
753 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_MINIMIZE)
757 else if (minimizeOnClose.Value &&
758 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_CLOSE)
761 * Apparently the user wants to minimize rather than close
762 * Now we still need to check if we're going to the tray or not
764 * Note: the correct way to do this would be to send out SC_MINIMIZE,
765 * but since the code here is so simple,
766 * that would just be a waste of time.
768 if (minimizeToTray.Value)
771 WindowState = FormWindowState.Minimized;
779 private void hideShowClick(object sender, EventArgs e) {
783 private void ShowParameterForm(ISensor sensor) {
784 ParameterForm form = new ParameterForm();
785 form.Parameters = sensor.Parameters;
786 form.captionLabel.Text = sensor.Name;
790 private void treeView_NodeMouseDoubleClick(object sender,
791 TreeNodeAdvMouseEventArgs e) {
792 SensorNode node = e.Node.Tag as SensorNode;
793 if (node != null && node.Sensor != null &&
794 node.Sensor.Parameters.Length > 0) {
795 ShowParameterForm(node.Sensor);
799 private void celsiusMenuItem_Click(object sender, EventArgs e) {
800 celsiusMenuItem.Checked = true;
801 fahrenheitMenuItem.Checked = false;
802 unitManager.TemperatureUnit = TemperatureUnit.Celsius;
805 private void fahrenheitMenuItem_Click(object sender, EventArgs e) {
806 celsiusMenuItem.Checked = false;
807 fahrenheitMenuItem.Checked = true;
808 unitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;
811 private void sumbitReportMenuItem_Click(object sender, EventArgs e)
813 ReportForm form = new ReportForm();
814 form.Report = computer.GetReport();
818 private void resetMinMaxMenuItem_Click(object sender, EventArgs e) {
819 computer.Accept(new SensorVisitor(delegate(ISensor sensor) {
825 private void MainForm_MoveOrResize(object sender, EventArgs e) {
826 if (WindowState != FormWindowState.Minimized) {
827 settings.SetValue("mainForm.Location.X", Bounds.X);
828 settings.SetValue("mainForm.Location.Y", Bounds.Y);
829 settings.SetValue("mainForm.Width", Bounds.Width);
830 settings.SetValue("mainForm.Height", Bounds.Height);
834 private void resetClick(object sender, EventArgs e) {
835 // disable the fallback MainIcon during reset, otherwise icon visibility
837 systemTray.IsMainIconEnabled = false;
840 // restore the MainIcon setting
841 systemTray.IsMainIconEnabled = minimizeToTray.Value;
844 private void treeView_MouseMove(object sender, MouseEventArgs e) {
845 selectionDragging = selectionDragging &
846 (e.Button & (MouseButtons.Left | MouseButtons.Right)) > 0;
848 if (selectionDragging)
849 treeView.SelectedNode = treeView.GetNodeAt(e.Location);
852 private void treeView_MouseDown(object sender, MouseEventArgs e) {
853 selectionDragging = true;
856 private void treeView_MouseUp(object sender, MouseEventArgs e) {
857 selectionDragging = false;
860 private void serverPortMenuItem_Click(object sender, EventArgs e) {
861 new PortForm(this).ShowDialog();
864 public HttpServer Server {
865 get { return server; }