Now calling display init. Not getting the expected error code though.
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 StartupManager startupManager = new StartupManager();
43 private UpdateVisitor updateVisitor = new UpdateVisitor();
44 private SensorGadget gadget;
45 private Form plotForm;
46 private PlotPanel plotPanel;
48 private UserOption showHiddenSensors;
49 private UserOption showPlot;
50 private UserOption showValue;
51 private UserOption showMin;
52 private UserOption showMax;
53 private UserOption startMinimized;
54 private UserOption minimizeToTray;
55 private UserOption minimizeOnClose;
56 private UserOption autoStart;
58 private UserOption readMainboardSensors;
59 private UserOption readCpuSensors;
60 private UserOption readRamSensors;
61 private UserOption readGpuSensors;
62 private UserOption readFanControllersSensors;
63 private UserOption readHddSensors;
65 private UserOption showGadget;
66 private UserRadioGroup plotLocation;
67 private WmiProvider wmiProvider;
69 private UserOption runWebServer;
70 private HttpServer server;
72 private bool selectionDragging = false;
75 InitializeComponent();
77 // check if the OpenHardwareMonitorLib assembly has the correct version
78 if (Assembly.GetAssembly(typeof(Computer)).GetName().Version !=
79 Assembly.GetExecutingAssembly().GetName().Version) {
81 "The version of the file OpenHardwareMonitorLib.dll is incompatible.",
82 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
86 this.settings = new PersistentSettings();
87 this.settings.Load(Path.ChangeExtension(
88 Application.ExecutablePath, ".config"));
90 this.unitManager = new UnitManager(settings);
92 // make sure the buffers used for double buffering are not disposed
93 // after each draw call
94 BufferedGraphicsManager.Current.MaximumBuffer =
95 Screen.PrimaryScreen.Bounds.Size;
97 // set the DockStyle here, to avoid conflicts with the MainMenu
98 this.splitContainer.Dock = DockStyle.Fill;
100 this.Font = SystemFonts.MessageBoxFont;
101 treeView.Font = SystemFonts.MessageBoxFont;
103 plotPanel = new PlotPanel(settings);
104 plotPanel.Font = SystemFonts.MessageBoxFont;
105 plotPanel.Dock = DockStyle.Fill;
107 nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
108 nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
109 nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
110 nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
111 nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
112 nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;
114 foreach (TreeColumn column in treeView.Columns)
115 column.Width = Math.Max(20, Math.Min(400,
116 settings.GetValue("treeView.Columns." + column.Header + ".Width",
119 treeModel = new TreeModel();
120 root = new Node(System.Environment.MachineName);
121 root.Image = Utilities.EmbeddedResources.GetImage("computer.png");
123 treeModel.Nodes.Add(root);
124 treeView.Model = treeModel;
126 this.computer = new Computer(settings);
128 systemTray = new SystemTray(computer, settings, unitManager);
129 systemTray.HideShowCommand += hideShowClick;
130 systemTray.ExitCommand += exitClick;
132 soundGraphDisplay = new SoundGraphDisplay(computer, settings, unitManager);
135 int p = (int)Environment.OSVersion.Platform;
136 if ((p == 4) || (p == 128)) { // Unix
137 treeView.RowHeight = Math.Max(treeView.RowHeight, 18);
138 splitContainer.BorderStyle = BorderStyle.None;
139 splitContainer.Border3DStyle = Border3DStyle.Adjust;
140 splitContainer.SplitterWidth = 4;
141 treeView.BorderStyle = BorderStyle.Fixed3D;
142 plotPanel.BorderStyle = BorderStyle.Fixed3D;
143 gadgetMenuItem.Visible = false;
144 minCloseMenuItem.Visible = false;
145 minTrayMenuItem.Visible = false;
146 startMinMenuItem.Visible = false;
148 treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);
150 gadget = new SensorGadget(computer, settings, unitManager);
151 gadget.HideShowCommand += hideShowClick;
153 wmiProvider = new WmiProvider(computer);
156 plotColorPalette = new Color[13];
157 plotColorPalette[0] = Color.Blue;
158 plotColorPalette[1] = Color.OrangeRed;
159 plotColorPalette[2] = Color.Green;
160 plotColorPalette[3] = Color.LightSeaGreen;
161 plotColorPalette[4] = Color.Goldenrod;
162 plotColorPalette[5] = Color.DarkViolet;
163 plotColorPalette[6] = Color.YellowGreen;
164 plotColorPalette[7] = Color.SaddleBrown;
165 plotColorPalette[8] = Color.RoyalBlue;
166 plotColorPalette[9] = Color.DeepPink;
167 plotColorPalette[10] = Color.MediumSeaGreen;
168 plotColorPalette[11] = Color.Olive;
169 plotColorPalette[12] = Color.Firebrick;
171 computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
172 computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);
176 timer.Enabled = true;
178 showHiddenSensors = new UserOption("hiddenMenuItem", false,
179 hiddenMenuItem, settings);
180 showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
181 treeModel.ForceVisible = showHiddenSensors.Value;
184 showValue = new UserOption("valueMenuItem", true, valueMenuItem,
186 showValue.Changed += delegate(object sender, EventArgs e) {
187 treeView.Columns[1].IsVisible = showValue.Value;
190 showMin = new UserOption("minMenuItem", false, minMenuItem, settings);
191 showMin.Changed += delegate(object sender, EventArgs e) {
192 treeView.Columns[2].IsVisible = showMin.Value;
195 showMax = new UserOption("maxMenuItem", true, maxMenuItem, settings);
196 showMax.Changed += delegate(object sender, EventArgs e) {
197 treeView.Columns[3].IsVisible = showMax.Value;
200 startMinimized = new UserOption("startMinMenuItem", false,
201 startMinMenuItem, settings);
203 minimizeToTray = new UserOption("minTrayMenuItem", true,
204 minTrayMenuItem, settings);
205 minimizeToTray.Changed += delegate(object sender, EventArgs e) {
206 systemTray.IsMainIconEnabled = minimizeToTray.Value;
209 minimizeOnClose = new UserOption("minCloseMenuItem", false,
210 minCloseMenuItem, settings);
212 autoStart = new UserOption(null, startupManager.Startup,
213 startupMenuItem, settings);
214 autoStart.Changed += delegate(object sender, EventArgs e) {
216 startupManager.Startup = autoStart.Value;
217 } catch (InvalidOperationException) {
218 MessageBox.Show("Updating the auto-startup option failed.", "Error",
219 MessageBoxButtons.OK, MessageBoxIcon.Error);
220 autoStart.Value = startupManager.Startup;
224 readMainboardSensors = new UserOption("mainboardMenuItem", true,
225 mainboardMenuItem, settings);
226 readMainboardSensors.Changed += delegate(object sender, EventArgs e) {
227 computer.MainboardEnabled = readMainboardSensors.Value;
230 readCpuSensors = new UserOption("cpuMenuItem", true,
231 cpuMenuItem, settings);
232 readCpuSensors.Changed += delegate(object sender, EventArgs e) {
233 computer.CPUEnabled = readCpuSensors.Value;
236 readRamSensors = new UserOption("ramMenuItem", true,
237 ramMenuItem, settings);
238 readRamSensors.Changed += delegate(object sender, EventArgs e) {
239 computer.RAMEnabled = readRamSensors.Value;
242 readGpuSensors = new UserOption("gpuMenuItem", true,
243 gpuMenuItem, settings);
244 readGpuSensors.Changed += delegate(object sender, EventArgs e) {
245 computer.GPUEnabled = readGpuSensors.Value;
248 readFanControllersSensors = new UserOption("fanControllerMenuItem", true,
249 fanControllerMenuItem, settings);
250 readFanControllersSensors.Changed += delegate(object sender, EventArgs e) {
251 computer.FanControllerEnabled = readFanControllersSensors.Value;
254 readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
256 readHddSensors.Changed += delegate(object sender, EventArgs e) {
257 computer.HDDEnabled = readHddSensors.Value;
260 showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
262 showGadget.Changed += delegate(object sender, EventArgs e) {
264 gadget.Visible = showGadget.Value;
267 celsiusMenuItem.Checked =
268 unitManager.TemperatureUnit == TemperatureUnit.Celsius;
269 fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;
271 server = new HttpServer(root, this.settings.GetValue("listenerPort", 8085));
272 if (server.PlatformNotSupported) {
273 webMenuItemSeparator.Visible = false;
274 webMenuItem.Visible = false;
277 runWebServer = new UserOption("runWebServerMenuItem", false,
278 runWebServerMenuItem, settings);
279 runWebServer.Changed += delegate(object sender, EventArgs e) {
280 if (runWebServer.Value)
281 server.StartHTTPListener();
283 server.StopHTTPListener();
286 InitializePlotForm();
289 if (soundGraphDisplay.IsDllLoaded)
292 //NativeWindow window;
293 soundGraphDisplay.Init(Handle);
295 //= Window.GetWindow(this);
296 //var wih = new WindowInteropHelper(window);
297 //IntPtr hWnd = wih.Handle;
302 startupMenuItem.Visible = startupManager.IsAvailable;
304 if (startMinMenuItem.Checked) {
305 if (!minTrayMenuItem.Checked) {
306 WindowState = FormWindowState.Minimized;
313 // Create a handle, otherwise calling Close() does not fire FormClosed
314 IntPtr handle = Handle;
316 // Make sure the settings are saved when the user logs off
317 Microsoft.Win32.SystemEvents.SessionEnded += delegate {
320 if (runWebServer.Value)
325 private void InitializePlotForm() {
326 plotForm = new Form();
327 plotForm.FormBorderStyle = FormBorderStyle.SizableToolWindow;
328 plotForm.ShowInTaskbar = false;
329 plotForm.StartPosition = FormStartPosition.Manual;
330 this.AddOwnedForm(plotForm);
331 plotForm.Bounds = new Rectangle {
332 X = settings.GetValue("plotForm.Location.X", -100000),
333 Y = settings.GetValue("plotForm.Location.Y", 100),
334 Width = settings.GetValue("plotForm.Width", 600),
335 Height = settings.GetValue("plotForm.Height", 400)
338 showPlot = new UserOption("plotMenuItem", false, plotMenuItem, settings);
339 plotLocation = new UserRadioGroup("plotLocation", 0,
340 new[] { plotWindowMenuItem, plotBottomMenuItem, plotRightMenuItem },
343 showPlot.Changed += delegate(object sender, EventArgs e) {
344 if (plotLocation.Value == 0) {
345 if (showPlot.Value && this.Visible)
350 splitContainer.Panel2Collapsed = !showPlot.Value;
352 treeView.Invalidate();
354 plotLocation.Changed += delegate(object sender, EventArgs e) {
355 switch (plotLocation.Value) {
357 splitContainer.Panel2.Controls.Clear();
358 splitContainer.Panel2Collapsed = true;
359 plotForm.Controls.Add(plotPanel);
360 if (showPlot.Value && this.Visible)
364 plotForm.Controls.Clear();
366 splitContainer.Orientation = Orientation.Horizontal;
367 splitContainer.Panel2.Controls.Add(plotPanel);
368 splitContainer.Panel2Collapsed = !showPlot.Value;
371 plotForm.Controls.Clear();
373 splitContainer.Orientation = Orientation.Vertical;
374 splitContainer.Panel2.Controls.Add(plotPanel);
375 splitContainer.Panel2Collapsed = !showPlot.Value;
380 plotForm.FormClosing += delegate(object sender, FormClosingEventArgs e) {
381 if (e.CloseReason == CloseReason.UserClosing) {
382 // just switch off the plotting when the user closes the form
383 if (plotLocation.Value == 0) {
384 showPlot.Value = false;
390 EventHandler moveOrResizePlotForm = delegate(object sender, EventArgs e) {
391 if (plotForm.WindowState != FormWindowState.Minimized) {
392 settings.SetValue("plotForm.Location.X", plotForm.Bounds.X);
393 settings.SetValue("plotForm.Location.Y", plotForm.Bounds.Y);
394 settings.SetValue("plotForm.Width", plotForm.Bounds.Width);
395 settings.SetValue("plotForm.Height", plotForm.Bounds.Height);
398 plotForm.Move += moveOrResizePlotForm;
399 plotForm.Resize += moveOrResizePlotForm;
401 plotForm.VisibleChanged += delegate(object sender, EventArgs e) {
402 Rectangle bounds = new Rectangle(plotForm.Location, plotForm.Size);
403 Screen screen = Screen.FromRectangle(bounds);
404 Rectangle intersection =
405 Rectangle.Intersect(screen.WorkingArea, bounds);
406 if (intersection.Width < Math.Min(16, bounds.Width) ||
407 intersection.Height < Math.Min(16, bounds.Height)) {
408 plotForm.Location = new Point(
409 screen.WorkingArea.Width / 2 - bounds.Width / 2,
410 screen.WorkingArea.Height / 2 - bounds.Height / 2);
414 this.VisibleChanged += delegate(object sender, EventArgs e) {
415 if (this.Visible && showPlot.Value && plotLocation.Value == 0)
422 private void InsertSorted(Collection<Node> nodes, HardwareNode node) {
424 while (i < nodes.Count && nodes[i] is HardwareNode &&
425 ((HardwareNode)nodes[i]).Hardware.HardwareType <
426 node.Hardware.HardwareType)
428 nodes.Insert(i, node);
431 private void SubHardwareAdded(IHardware hardware, Node node) {
432 HardwareNode hardwareNode =
433 new HardwareNode(hardware, settings, unitManager);
434 hardwareNode.PlotSelectionChanged += PlotSelectionChanged;
436 InsertSorted(node.Nodes, hardwareNode);
438 foreach (IHardware subHardware in hardware.SubHardware)
439 SubHardwareAdded(subHardware, hardwareNode);
442 private void HardwareAdded(IHardware hardware) {
443 SubHardwareAdded(hardware, root);
444 PlotSelectionChanged(this, null);
447 private void HardwareRemoved(IHardware hardware) {
448 List<HardwareNode> nodesToRemove = new List<HardwareNode>();
449 foreach (Node node in root.Nodes) {
450 HardwareNode hardwareNode = node as HardwareNode;
451 if (hardwareNode != null && hardwareNode.Hardware == hardware)
452 nodesToRemove.Add(hardwareNode);
454 foreach (HardwareNode hardwareNode in nodesToRemove) {
455 root.Nodes.Remove(hardwareNode);
456 hardwareNode.PlotSelectionChanged -= PlotSelectionChanged;
458 PlotSelectionChanged(this, null);
461 private void nodeTextBoxText_DrawText(object sender, DrawEventArgs e) {
462 Node node = e.Node.Tag as Node;
465 if (node.IsVisible) {
466 SensorNode sensorNode = node as SensorNode;
467 if (plotMenuItem.Checked && sensorNode != null &&
468 sensorPlotColors.TryGetValue(sensorNode.Sensor, out color))
471 e.TextColor = Color.DarkGray;
476 private void PlotSelectionChanged(object sender, EventArgs e) {
477 List<ISensor> selected = new List<ISensor>();
478 IDictionary<ISensor, Color> colors = new Dictionary<ISensor, Color>();
480 foreach (TreeNodeAdv node in treeView.AllNodes) {
481 SensorNode sensorNode = node.Tag as SensorNode;
482 if (sensorNode != null &&
483 sensorNode.Sensor.SensorType == SensorType.Temperature) {
484 if (sensorNode.Plot) {
485 colors.Add(sensorNode.Sensor,
486 plotColorPalette[colorIndex % plotColorPalette.Length]);
487 selected.Add(sensorNode.Sensor);
492 sensorPlotColors = colors;
493 plotPanel.SetSensors(selected, colors);
496 private void nodeTextBoxText_EditorShowing(object sender,
499 e.Cancel = !(treeView.CurrentNode != null &&
500 (treeView.CurrentNode.Tag is SensorNode ||
501 treeView.CurrentNode.Tag is HardwareNode));
504 private void nodeCheckBox_IsVisibleValueNeeded(object sender,
505 NodeControlValueEventArgs e) {
506 SensorNode node = e.Node.Tag as SensorNode;
507 e.Value = (node != null) &&
508 (node.Sensor.SensorType == SensorType.Temperature) &&
509 plotMenuItem.Checked;
512 private void exitClick(object sender, EventArgs e) {
516 private void timer_Tick(object sender, EventArgs e) {
517 computer.Accept(updateVisitor);
518 treeView.Invalidate();
519 plotPanel.Invalidate();
524 if (wmiProvider != null)
525 wmiProvider.Update();
528 private void SaveConfiguration() {
529 foreach (TreeColumn column in treeView.Columns)
530 settings.SetValue("treeView.Columns." + column.Header + ".Width",
533 this.settings.SetValue("listenerPort", server.ListenerPort);
535 string fileName = Path.ChangeExtension(
536 System.Windows.Forms.Application.ExecutablePath, ".config");
538 settings.Save(fileName);
539 } catch (UnauthorizedAccessException) {
540 MessageBox.Show("Access to the path '" + fileName + "' is denied. " +
541 "The current settings could not be saved.",
542 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
543 } catch (IOException) {
544 MessageBox.Show("The path '" + fileName + "' is not writeable. " +
545 "The current settings could not be saved.",
546 "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
550 private void MainForm_Load(object sender, EventArgs e) {
551 Rectangle newBounds = new Rectangle {
552 X = settings.GetValue("mainForm.Location.X", Location.X),
553 Y = settings.GetValue("mainForm.Location.Y", Location.Y),
554 Width = settings.GetValue("mainForm.Width", 470),
555 Height = settings.GetValue("mainForm.Height", 640)
558 Rectangle fullWorkingArea = new Rectangle(int.MaxValue, int.MaxValue,
559 int.MinValue, int.MinValue);
561 foreach (Screen screen in Screen.AllScreens)
562 fullWorkingArea = Rectangle.Union(fullWorkingArea, screen.Bounds);
564 Rectangle intersection = Rectangle.Intersect(fullWorkingArea, newBounds);
565 if (intersection.Width < 20 || intersection.Height < 20 ||
566 !settings.Contains("mainForm.Location.X")
568 newBounds.X = (Screen.PrimaryScreen.WorkingArea.Width / 2) -
571 newBounds.Y = (Screen.PrimaryScreen.WorkingArea.Height / 2) -
572 (newBounds.Height / 2);
575 this.Bounds = newBounds;
578 private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
580 systemTray.IsMainIconEnabled = false;
581 timer.Enabled = false;
584 if (runWebServer.Value)
586 systemTray.Dispose();
587 soundGraphDisplay.Dispose();
590 private void aboutMenuItem_Click(object sender, EventArgs e) {
591 new AboutBox().ShowDialog();
594 private void treeView_Click(object sender, EventArgs e) {
596 MouseEventArgs m = e as MouseEventArgs;
597 if (m == null || m.Button != MouseButtons.Right)
600 NodeControlInfo info = treeView.GetNodeControlInfoAt(
603 treeView.SelectedNode = info.Node;
604 if (info.Node != null) {
605 SensorNode node = info.Node.Tag as SensorNode;
606 if (node != null && node.Sensor != null) {
607 treeContextMenu.MenuItems.Clear();
608 if (node.Sensor.Parameters.Length > 0) {
609 MenuItem item = new MenuItem("Parameters...");
610 item.Click += delegate(object obj, EventArgs args) {
611 ShowParameterForm(node.Sensor);
613 treeContextMenu.MenuItems.Add(item);
615 if (nodeTextBoxText.EditEnabled) {
616 MenuItem item = new MenuItem("Rename");
617 item.Click += delegate(object obj, EventArgs args) {
618 nodeTextBoxText.BeginEdit();
620 treeContextMenu.MenuItems.Add(item);
622 if (node.IsVisible) {
623 MenuItem item = new MenuItem("Hide");
624 item.Click += delegate(object obj, EventArgs args) {
625 node.IsVisible = false;
627 treeContextMenu.MenuItems.Add(item);
629 MenuItem item = new MenuItem("Unhide");
630 item.Click += delegate(object obj, EventArgs args) {
631 node.IsVisible = true;
633 treeContextMenu.MenuItems.Add(item);
635 treeContextMenu.MenuItems.Add(new MenuItem("-"));
637 MenuItem item = new MenuItem("Show in Tray");
638 item.Checked = systemTray.Contains(node.Sensor);
639 item.Click += delegate(object obj, EventArgs args) {
641 systemTray.Remove(node.Sensor);
643 systemTray.Add(node.Sensor, true);
645 treeContextMenu.MenuItems.Add(item);
648 MenuItem item = new MenuItem("Show in iMON FrontView");
649 item.Checked = systemTray.Contains(node.Sensor);
650 item.Click += delegate(object obj, EventArgs args)
653 soundGraphDisplay.Remove(node.Sensor);
655 soundGraphDisplay.Add(node.Sensor, true);
657 treeContextMenu.MenuItems.Add(item);
659 if (gadget != null) {
660 MenuItem item = new MenuItem("Show in Gadget");
661 item.Checked = gadget.Contains(node.Sensor);
662 item.Click += delegate(object obj, EventArgs args) {
664 gadget.Remove(node.Sensor);
666 gadget.Add(node.Sensor);
669 treeContextMenu.MenuItems.Add(item);
671 if (node.Sensor.Control != null) {
672 treeContextMenu.MenuItems.Add(new MenuItem("-"));
673 IControl control = node.Sensor.Control;
674 MenuItem controlItem = new MenuItem("Control");
675 MenuItem defaultItem = new MenuItem("Default");
676 defaultItem.Checked = control.ControlMode == ControlMode.Default;
677 controlItem.MenuItems.Add(defaultItem);
678 defaultItem.Click += delegate(object obj, EventArgs args) {
679 control.SetDefault();
681 MenuItem manualItem = new MenuItem("Manual");
682 controlItem.MenuItems.Add(manualItem);
683 manualItem.Checked = control.ControlMode == ControlMode.Software;
684 for (int i = 0; i <= 100; i += 5) {
685 if (i <= control.MaxSoftwareValue &&
686 i >= control.MinSoftwareValue) {
687 MenuItem item = new MenuItem(i + " %");
688 item.RadioCheck = true;
689 manualItem.MenuItems.Add(item);
690 item.Checked = control.ControlMode == ControlMode.Software &&
691 Math.Round(control.SoftwareValue) == i;
692 int softwareValue = i;
693 item.Click += delegate(object obj, EventArgs args) {
694 control.SetSoftware(softwareValue);
698 treeContextMenu.MenuItems.Add(controlItem);
701 treeContextMenu.Show(treeView, new Point(m.X, m.Y));
704 HardwareNode hardwareNode = info.Node.Tag as HardwareNode;
705 if (hardwareNode != null && hardwareNode.Hardware != null) {
706 treeContextMenu.MenuItems.Clear();
708 if (nodeTextBoxText.EditEnabled) {
709 MenuItem item = new MenuItem("Rename");
710 item.Click += delegate(object obj, EventArgs args) {
711 nodeTextBoxText.BeginEdit();
713 treeContextMenu.MenuItems.Add(item);
716 treeContextMenu.Show(treeView, new Point(m.X, m.Y));
721 private void saveReportMenuItem_Click(object sender, EventArgs e) {
722 string report = computer.GetReport();
723 if (saveFileDialog.ShowDialog() == DialogResult.OK) {
724 using (TextWriter w = new StreamWriter(saveFileDialog.FileName)) {
730 private void SysTrayHideShow() {
736 protected override void WndProc(ref Message m) {
737 const int WM_SYSCOMMAND = 0x112;
738 const int SC_MINIMIZE = 0xF020;
739 const int SC_CLOSE = 0xF060;
741 if (m.Msg == SoundGraph.WM_DSP_PLUGIN_NOTIFY)
743 //Handling messages from our iMON Display
744 switch ((SoundGraph.DSPNotifyCode)m.WParam.ToInt32())
746 case SoundGraph.DSPNotifyCode.DSPNM_PLUGIN_SUCCEED:
747 case SoundGraph.DSPNotifyCode.DSPNM_IMON_RESTARTED:
748 case SoundGraph.DSPNotifyCode.DSPNM_HW_CONNECTED:
750 //Connection with our display is now open
751 //Check if we have LCD or VFD
752 //if ((lParam & DSPN_DSP_VFD) == DSPN_DSP_VFD) m_bVfdConnected = TRUE;
753 //if ((lParam & DSPN_DSP_LCD) == DSPN_DSP_LCD) m_bLcdConnected = TRUE;
754 soundGraphDisplay.DisplayPluginMessage(m.WParam.ToInt32(),false);
758 case SoundGraph.DSPNotifyCode.DSPNM_PLUGIN_FAILED:
759 case SoundGraph.DSPNotifyCode.DSPNM_HW_DISCONNECTED:
760 case SoundGraph.DSPNotifyCode.DSPNM_IMON_CLOSED:
762 //Connection with our display is closed
763 soundGraphDisplay.DisplayPluginMessage(m.LParam.ToInt32(), true);
767 case SoundGraph.DSPNotifyCode.DSPNM_LCD_TEXT_SCROLL_DONE:
775 else if (minimizeToTray.Value &&
776 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_MINIMIZE)
780 else if (minimizeOnClose.Value &&
781 m.Msg == WM_SYSCOMMAND && m.WParam.ToInt64() == SC_CLOSE)
784 * Apparently the user wants to minimize rather than close
785 * Now we still need to check if we're going to the tray or not
787 * Note: the correct way to do this would be to send out SC_MINIMIZE,
788 * but since the code here is so simple,
789 * that would just be a waste of time.
791 if (minimizeToTray.Value)
794 WindowState = FormWindowState.Minimized;
802 private void hideShowClick(object sender, EventArgs e) {
806 private void ShowParameterForm(ISensor sensor) {
807 ParameterForm form = new ParameterForm();
808 form.Parameters = sensor.Parameters;
809 form.captionLabel.Text = sensor.Name;
813 private void treeView_NodeMouseDoubleClick(object sender,
814 TreeNodeAdvMouseEventArgs e) {
815 SensorNode node = e.Node.Tag as SensorNode;
816 if (node != null && node.Sensor != null &&
817 node.Sensor.Parameters.Length > 0) {
818 ShowParameterForm(node.Sensor);
822 private void celsiusMenuItem_Click(object sender, EventArgs e) {
823 celsiusMenuItem.Checked = true;
824 fahrenheitMenuItem.Checked = false;
825 unitManager.TemperatureUnit = TemperatureUnit.Celsius;
828 private void fahrenheitMenuItem_Click(object sender, EventArgs e) {
829 celsiusMenuItem.Checked = false;
830 fahrenheitMenuItem.Checked = true;
831 unitManager.TemperatureUnit = TemperatureUnit.Fahrenheit;
834 private void sumbitReportMenuItem_Click(object sender, EventArgs e)
836 ReportForm form = new ReportForm();
837 form.Report = computer.GetReport();
841 private void resetMinMaxMenuItem_Click(object sender, EventArgs e) {
842 computer.Accept(new SensorVisitor(delegate(ISensor sensor) {
848 private void MainForm_MoveOrResize(object sender, EventArgs e) {
849 if (WindowState != FormWindowState.Minimized) {
850 settings.SetValue("mainForm.Location.X", Bounds.X);
851 settings.SetValue("mainForm.Location.Y", Bounds.Y);
852 settings.SetValue("mainForm.Width", Bounds.Width);
853 settings.SetValue("mainForm.Height", Bounds.Height);
857 private void resetClick(object sender, EventArgs e) {
858 // disable the fallback MainIcon during reset, otherwise icon visibility
860 systemTray.IsMainIconEnabled = false;
863 // restore the MainIcon setting
864 systemTray.IsMainIconEnabled = minimizeToTray.Value;
867 private void treeView_MouseMove(object sender, MouseEventArgs e) {
868 selectionDragging = selectionDragging &
869 (e.Button & (MouseButtons.Left | MouseButtons.Right)) > 0;
871 if (selectionDragging)
872 treeView.SelectedNode = treeView.GetNodeAt(e.Location);
875 private void treeView_MouseDown(object sender, MouseEventArgs e) {
876 selectionDragging = true;
879 private void treeView_MouseUp(object sender, MouseEventArgs e) {
880 selectionDragging = false;
883 private void serverPortMenuItem_Click(object sender, EventArgs e) {
884 new PortForm(this).ShowDialog();
887 public HttpServer Server {
888 get { return server; }