Inheritance: System.Windows.Forms.UserControl
Ejemplo n.º 1
0
        public MainForm()
        {
            InitializeComponent();

              // check if the OpenHardwareMonitorLib assembly has the correct version
              if (Assembly.GetAssembly(typeof(Computer)).GetName().Version !=
            Assembly.GetExecutingAssembly().GetName().Version) {
            MessageBox.Show(
              "The version of the file OpenHardwareMonitorLib.dll is incompatible.",
              "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Environment.Exit(0);
              }

              this.settings = new PersistentSettings();
              this.settings.Load(Path.ChangeExtension(
            Application.ExecutablePath, ".config"));

              this.unitManager = new UnitManager(settings);

              // make sure the buffers used for double buffering are not disposed
              // after each draw call
              BufferedGraphicsManager.Current.MaximumBuffer =
            Screen.PrimaryScreen.Bounds.Size;

              // set the DockStyle here, to avoid conflicts with the MainMenu
              this.splitContainer.Dock = DockStyle.Fill;

              this.Font = SystemFonts.MessageBoxFont;
              treeView.Font = SystemFonts.MessageBoxFont;

              plotPanel = new PlotPanel(settings, unitManager);
              plotPanel.Font = SystemFonts.MessageBoxFont;
              plotPanel.Dock = DockStyle.Fill;

              nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
              nodeTextBoxText.DrawText += nodeTextBoxText_DrawText;
              nodeTextBoxValue.DrawText += nodeTextBoxText_DrawText;
              nodeTextBoxMin.DrawText += nodeTextBoxText_DrawText;
              nodeTextBoxMax.DrawText += nodeTextBoxText_DrawText;
              nodeTextBoxText.EditorShowing += nodeTextBoxText_EditorShowing;

              foreach (TreeColumn column in treeView.Columns)
            column.Width = Math.Max(20, Math.Min(400,
              settings.GetValue("treeView.Columns." + column.Header + ".Width",
              column.Width)));

              treeModel = new TreeModel();
              root = new Node(System.Environment.MachineName);
              root.Image = Utilities.EmbeddedResources.GetImage("computer.png");

              treeModel.Nodes.Add(root);
              treeView.Model = treeModel;

              this.computer = new Computer(settings);

              systemTray = new SystemTray(computer, settings, unitManager);
              systemTray.HideShowCommand += hideShowClick;
              systemTray.ExitCommand += exitClick;

              int p = (int)Environment.OSVersion.Platform;
              if ((p == 4) || (p == 128)) { // Unix
            treeView.RowHeight = Math.Max(treeView.RowHeight, 18);
            splitContainer.BorderStyle = BorderStyle.None;
            splitContainer.Border3DStyle = Border3DStyle.Adjust;
            splitContainer.SplitterWidth = 4;
            treeView.BorderStyle = BorderStyle.Fixed3D;
            plotPanel.BorderStyle = BorderStyle.Fixed3D;
            gadgetMenuItem.Visible = false;
            minCloseMenuItem.Visible = false;
            minTrayMenuItem.Visible = false;
            startMinMenuItem.Visible = false;
              } else { // Windows
            treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);

            gadget = new SensorGadget(computer, settings, unitManager);
            gadget.HideShowCommand += hideShowClick;

            wmiProvider = new WmiProvider(computer);
              }

              logger = new Logger(computer);

              plotColorPalette = new Color[13];
              plotColorPalette[0] = Color.Blue;
              plotColorPalette[1] = Color.OrangeRed;
              plotColorPalette[2] = Color.Green;
              plotColorPalette[3] = Color.LightSeaGreen;
              plotColorPalette[4] = Color.Goldenrod;
              plotColorPalette[5] = Color.DarkViolet;
              plotColorPalette[6] = Color.YellowGreen;
              plotColorPalette[7] = Color.SaddleBrown;
              plotColorPalette[8] = Color.RoyalBlue;
              plotColorPalette[9] = Color.DeepPink;
              plotColorPalette[10] = Color.MediumSeaGreen;
              plotColorPalette[11] = Color.Olive;
              plotColorPalette[12] = Color.Firebrick;

              computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
              computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);

              computer.Open();

              timer.Enabled = true;

              showHiddenSensors = new UserOption("hiddenMenuItem", false,
            hiddenMenuItem, settings);
              showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
            treeModel.ForceVisible = showHiddenSensors.Value;
              };

              showValue = new UserOption("valueMenuItem", true, valueMenuItem,
            settings);
              showValue.Changed += delegate(object sender, EventArgs e) {
            treeView.Columns[1].IsVisible = showValue.Value;
              };

              showMin = new UserOption("minMenuItem", false, minMenuItem, settings);
              showMin.Changed += delegate(object sender, EventArgs e) {
            treeView.Columns[2].IsVisible = showMin.Value;
              };

              showMax = new UserOption("maxMenuItem", true, maxMenuItem, settings);
              showMax.Changed += delegate(object sender, EventArgs e) {
            treeView.Columns[3].IsVisible = showMax.Value;
              };

              startMinimized = new UserOption("startMinMenuItem", false,
            startMinMenuItem, settings);

              minimizeToTray = new UserOption("minTrayMenuItem", true,
            minTrayMenuItem, settings);
              minimizeToTray.Changed += delegate(object sender, EventArgs e) {
            systemTray.IsMainIconEnabled = minimizeToTray.Value;
              };

              minimizeOnClose = new UserOption("minCloseMenuItem", false,
            minCloseMenuItem, settings);

              autoStart = new UserOption(null, startupManager.Startup,
            startupMenuItem, settings);
              autoStart.Changed += delegate(object sender, EventArgs e) {
            try {
              startupManager.Startup = autoStart.Value;
            } catch (InvalidOperationException) {
              MessageBox.Show("Updating the auto-startup option failed.", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
              autoStart.Value = startupManager.Startup;
            }
              };

              readMainboardSensors = new UserOption("mainboardMenuItem", true,
            mainboardMenuItem, settings);
              readMainboardSensors.Changed += delegate(object sender, EventArgs e) {
            computer.MainboardEnabled = readMainboardSensors.Value;
              };

              readCpuSensors = new UserOption("cpuMenuItem", true,
            cpuMenuItem, settings);
              readCpuSensors.Changed += delegate(object sender, EventArgs e) {
            computer.CPUEnabled = readCpuSensors.Value;
              };

              readRamSensors = new UserOption("ramMenuItem", true,
            ramMenuItem, settings);
              readRamSensors.Changed += delegate(object sender, EventArgs e) {
            computer.RAMEnabled = readRamSensors.Value;
              };

              readGpuSensors = new UserOption("gpuMenuItem", true,
            gpuMenuItem, settings);
              readGpuSensors.Changed += delegate(object sender, EventArgs e) {
            computer.GPUEnabled = readGpuSensors.Value;
              };

              readFanControllersSensors = new UserOption("fanControllerMenuItem", true,
            fanControllerMenuItem, settings);
              readFanControllersSensors.Changed += delegate(object sender, EventArgs e) {
            computer.FanControllerEnabled = readFanControllersSensors.Value;
              };

              readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
            settings);
              readHddSensors.Changed += delegate(object sender, EventArgs e) {
            computer.HDDEnabled = readHddSensors.Value;
              };

              showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
            settings);
              showGadget.Changed += delegate(object sender, EventArgs e) {
            if (gadget != null)
              gadget.Visible = showGadget.Value;
              };

              celsiusMenuItem.Checked =
            unitManager.TemperatureUnit == TemperatureUnit.Celsius;
              fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;

              server = new HttpServer(root, this.settings.GetValue("listenerPort", 8085));
              if (server.PlatformNotSupported) {
            webMenuItemSeparator.Visible = false;
            webMenuItem.Visible = false;
              }

              runWebServer = new UserOption("runWebServerMenuItem", false,
            runWebServerMenuItem, settings);
              runWebServer.Changed += delegate(object sender, EventArgs e) {
            if (runWebServer.Value)
              server.StartHTTPListener();
            else
              server.StopHTTPListener();
              };

              logSensors = new UserOption("logSensorsMenuItem", false, logSensorsMenuItem,
            settings);

              loggingInterval = new UserRadioGroup("loggingInterval", 0,
            new[] { log1sMenuItem, log2sMenuItem, log5sMenuItem, log10sMenuItem,
            log30sMenuItem, log1minMenuItem, log2minMenuItem, log5minMenuItem,
            log10minMenuItem, log30minMenuItem, log1hMenuItem, log2hMenuItem,
            log6hMenuItem},
            settings);
              loggingInterval.Changed += (sender, e) => {
            switch (loggingInterval.Value) {
              case 0: logger.LoggingInterval = new TimeSpan(0, 0, 1); break;
              case 1: logger.LoggingInterval = new TimeSpan(0, 0, 2); break;
              case 2: logger.LoggingInterval = new TimeSpan(0, 0, 5); break;
              case 3: logger.LoggingInterval = new TimeSpan(0, 0, 10); break;
              case 4: logger.LoggingInterval = new TimeSpan(0, 0, 30); break;
              case 5: logger.LoggingInterval = new TimeSpan(0, 1, 0); break;
              case 6: logger.LoggingInterval = new TimeSpan(0, 2, 0); break;
              case 7: logger.LoggingInterval = new TimeSpan(0, 5, 0); break;
              case 8: logger.LoggingInterval = new TimeSpan(0, 10, 0); break;
              case 9: logger.LoggingInterval = new TimeSpan(0, 30, 0); break;
              case 10: logger.LoggingInterval = new TimeSpan(1, 0, 0); break;
              case 11: logger.LoggingInterval = new TimeSpan(2, 0, 0); break;
              case 12: logger.LoggingInterval = new TimeSpan(6, 0, 0); break;
            }
              };

              InitializePlotForm();

              startupMenuItem.Visible = startupManager.IsAvailable;

              if (startMinMenuItem.Checked) {
            if (!minTrayMenuItem.Checked) {
              WindowState = FormWindowState.Minimized;
              Show();
            }
              } else {
            Show();
              }

              // Create a handle, otherwise calling Close() does not fire FormClosed
              IntPtr handle = Handle;

              // Make sure the settings are saved when the user logs off
              Microsoft.Win32.SystemEvents.SessionEnded += delegate {
            computer.Close();
            SaveConfiguration();
            if (runWebServer.Value)
              server.Quit();
              };
        }
Ejemplo n.º 2
0
        public MainForm()
        {
            InitializeComponent();

            // check if the OpenHardwareMonitorLib assembly has the correct version
            if (Assembly.GetAssembly(typeof(Computer)).GetName().Version !=
                Assembly.GetExecutingAssembly().GetName().Version)
            {
                MessageBox.Show(
                    "The version of the file OpenHardwareMonitorLib.dll is incompatible.",
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(0);
            }

            this.settings = new PersistentSettings();
            this.settings.Load(Path.ChangeExtension(
                                   Application.ExecutablePath, ".config"));

            this.unitManager = new UnitManager(settings);

            // make sure the buffers used for double buffering are not disposed
            // after each draw call
            BufferedGraphicsManager.Current.MaximumBuffer =
                Screen.PrimaryScreen.Bounds.Size;

            // set the DockStyle here, to avoid conflicts with the MainMenu
            this.splitContainer.Dock = DockStyle.Fill;

            this.Font     = SystemFonts.MessageBoxFont;
            treeView.Font = SystemFonts.MessageBoxFont;

            // Set the bounds immediately, so that our child components can be
            // properly placed.
            this.Bounds = new Rectangle {
                X      = settings.GetValue("mainForm.Location.X", Location.X),
                Y      = settings.GetValue("mainForm.Location.Y", Location.Y),
                Width  = settings.GetValue("mainForm.Width", 470),
                Height = settings.GetValue("mainForm.Height", 640)
            };

            plotPanel      = new PlotPanel(settings, unitManager);
            plotPanel.Font = SystemFonts.MessageBoxFont;
            plotPanel.Dock = DockStyle.Fill;

            nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
            nodeTextBoxText.DrawText          += nodeTextBoxText_DrawText;
            nodeTextBoxValue.DrawText         += nodeTextBoxText_DrawText;
            nodeTextBoxMin.DrawText           += nodeTextBoxText_DrawText;
            nodeTextBoxMax.DrawText           += nodeTextBoxText_DrawText;
            nodeTextBoxText.EditorShowing     += nodeTextBoxText_EditorShowing;

            foreach (TreeColumn column in treeView.Columns)
            {
                column.Width = Math.Max(20, Math.Min(400,
                                                     settings.GetValue("treeView.Columns." + column.Header + ".Width",
                                                                       column.Width)));
            }

            treeModel  = new TreeModel();
            root       = new Node(System.Environment.MachineName);
            root.Image = Utilities.EmbeddedResources.GetImage("computer.png");

            treeModel.Nodes.Add(root);
            treeView.Model = treeModel;

            this.computer = new Computer(settings);

            systemTray = new SystemTray(computer, settings, unitManager);
            systemTray.HideShowCommand += hideShowClick;
            systemTray.ExitCommand     += exitClick;

            int p = (int)Environment.OSVersion.Platform;

            if ((p == 4) || (p == 128)) // Unix
            {
                treeView.RowHeight           = Math.Max(treeView.RowHeight, 18);
                splitContainer.BorderStyle   = BorderStyle.None;
                splitContainer.Border3DStyle = Border3DStyle.Adjust;
                splitContainer.SplitterWidth = 4;
                treeView.BorderStyle         = BorderStyle.Fixed3D;
                plotPanel.BorderStyle        = BorderStyle.Fixed3D;
                gadgetMenuItem.Visible       = false;
                minCloseMenuItem.Visible     = false;
                minTrayMenuItem.Visible      = false;
                startMinMenuItem.Visible     = false;
            }
            else // Windows
            {
                treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);

                gadget = new SensorGadget(computer, settings, unitManager);
                gadget.HideShowCommand += hideShowClick;

                wmiProvider = new WmiProvider(computer);
            }

            logger = new Logger(computer);

            plotColorPalette     = new Color[13];
            plotColorPalette[0]  = Color.Blue;
            plotColorPalette[1]  = Color.OrangeRed;
            plotColorPalette[2]  = Color.Green;
            plotColorPalette[3]  = Color.LightSeaGreen;
            plotColorPalette[4]  = Color.Goldenrod;
            plotColorPalette[5]  = Color.DarkViolet;
            plotColorPalette[6]  = Color.YellowGreen;
            plotColorPalette[7]  = Color.SaddleBrown;
            plotColorPalette[8]  = Color.RoyalBlue;
            plotColorPalette[9]  = Color.DeepPink;
            plotColorPalette[10] = Color.MediumSeaGreen;
            plotColorPalette[11] = Color.Olive;
            plotColorPalette[12] = Color.Firebrick;

            computer.HardwareAdded   += new HardwareEventHandler(HardwareAdded);
            computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);

            computer.Open();

            timer.Enabled = true;

            showHiddenSensors = new UserOption("hiddenMenuItem", false,
                                               hiddenMenuItem, settings);
            showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
                treeModel.ForceVisible = showHiddenSensors.Value;
            };

            showValue = new UserOption("valueMenuItem", true, valueMenuItem,
                                       settings);
            showValue.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[1].IsVisible = showValue.Value;
            };

            showMin          = new UserOption("minMenuItem", false, minMenuItem, settings);
            showMin.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[2].IsVisible = showMin.Value;
            };

            showMax          = new UserOption("maxMenuItem", true, maxMenuItem, settings);
            showMax.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[3].IsVisible = showMax.Value;
            };

            startMinimized = new UserOption("startMinMenuItem", false,
                                            startMinMenuItem, settings);

            minimizeToTray = new UserOption("minTrayMenuItem", true,
                                            minTrayMenuItem, settings);
            minimizeToTray.Changed += delegate(object sender, EventArgs e) {
                systemTray.IsMainIconEnabled = minimizeToTray.Value;
            };

            minimizeOnClose = new UserOption("minCloseMenuItem", false,
                                             minCloseMenuItem, settings);

            autoStart = new UserOption(null, startupManager.Startup,
                                       startupMenuItem, settings);
            autoStart.Changed += delegate(object sender, EventArgs e) {
                try {
                    startupManager.Startup = autoStart.Value;
                } catch (InvalidOperationException) {
                    MessageBox.Show("Updating the auto-startup option failed.", "Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    autoStart.Value = startupManager.Startup;
                }
            };

            readMainboardSensors = new UserOption("mainboardMenuItem", true,
                                                  mainboardMenuItem, settings);
            readMainboardSensors.Changed += delegate(object sender, EventArgs e) {
                computer.MainboardEnabled = readMainboardSensors.Value;
            };

            readCpuSensors = new UserOption("cpuMenuItem", true,
                                            cpuMenuItem, settings);
            readCpuSensors.Changed += delegate(object sender, EventArgs e) {
                computer.CPUEnabled = readCpuSensors.Value;
            };

            readRamSensors = new UserOption("ramMenuItem", true,
                                            ramMenuItem, settings);
            readRamSensors.Changed += delegate(object sender, EventArgs e) {
                computer.RAMEnabled = readRamSensors.Value;
            };

            readGpuSensors = new UserOption("gpuMenuItem", true,
                                            gpuMenuItem, settings);
            readGpuSensors.Changed += delegate(object sender, EventArgs e) {
                computer.GPUEnabled = readGpuSensors.Value;
            };

            readFanControllersSensors = new UserOption("fanControllerMenuItem", true,
                                                       fanControllerMenuItem, settings);
            readFanControllersSensors.Changed += delegate(object sender, EventArgs e) {
                computer.FanControllerEnabled = readFanControllersSensors.Value;
            };

            readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
                                            settings);
            readHddSensors.Changed += delegate(object sender, EventArgs e) {
                computer.HDDEnabled = readHddSensors.Value;
            };

            readNicSensors = new UserOption("nicMenuItem", true, nicMenuItem,
                                            settings);
            readNicSensors.Changed += delegate(object sender, EventArgs e) {
                computer.NICEnabled = readNicSensors.Value;
            };

            showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
                                        settings);
            showGadget.Changed += delegate(object sender, EventArgs e) {
                if (gadget != null)
                {
                    gadget.Visible = showGadget.Value;
                }
            };

            celsiusMenuItem.Checked =
                unitManager.TemperatureUnit == TemperatureUnit.Celsius;
            fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;

            server = new HttpServer(root, this.settings.GetValue("listenerPort", 8085));
            if (server.PlatformNotSupported)
            {
                webMenuItemSeparator.Visible = false;
                webMenuItem.Visible          = false;
            }

            runWebServer = new UserOption("runWebServerMenuItem", false,
                                          runWebServerMenuItem, settings);
            runWebServer.Changed += delegate(object sender, EventArgs e) {
                if (runWebServer.Value)
                {
                    server.StartHTTPListener();
                }
                else
                {
                    server.StopHTTPListener();
                }
            };

            logSensors = new UserOption("logSensorsMenuItem", false, logSensorsMenuItem,
                                        settings);

            loggingInterval = new UserRadioGroup("loggingInterval", 0,
                                                 new[] { log1sMenuItem, log2sMenuItem, log5sMenuItem, log10sMenuItem,
                                                         log30sMenuItem, log1minMenuItem, log2minMenuItem, log5minMenuItem,
                                                         log10minMenuItem, log30minMenuItem, log1hMenuItem, log2hMenuItem,
                                                         log6hMenuItem },
                                                 settings);
            loggingInterval.Changed += (sender, e) => {
                switch (loggingInterval.Value)
                {
                case 0: logger.LoggingInterval = new TimeSpan(0, 0, 1); break;

                case 1: logger.LoggingInterval = new TimeSpan(0, 0, 2); break;

                case 2: logger.LoggingInterval = new TimeSpan(0, 0, 5); break;

                case 3: logger.LoggingInterval = new TimeSpan(0, 0, 10); break;

                case 4: logger.LoggingInterval = new TimeSpan(0, 0, 30); break;

                case 5: logger.LoggingInterval = new TimeSpan(0, 1, 0); break;

                case 6: logger.LoggingInterval = new TimeSpan(0, 2, 0); break;

                case 7: logger.LoggingInterval = new TimeSpan(0, 5, 0); break;

                case 8: logger.LoggingInterval = new TimeSpan(0, 10, 0); break;

                case 9: logger.LoggingInterval = new TimeSpan(0, 30, 0); break;

                case 10: logger.LoggingInterval = new TimeSpan(1, 0, 0); break;

                case 11: logger.LoggingInterval = new TimeSpan(2, 0, 0); break;

                case 12: logger.LoggingInterval = new TimeSpan(6, 0, 0); break;
                }
            };

            sensorValuesTimeWindow = new UserRadioGroup("sensorValuesTimeWindow", 10,
                                                        new[] { timeWindow30sMenuItem, timeWindow1minMenuItem, timeWindow2minMenuItem,
                                                                timeWindow5minMenuItem, timeWindow10minMenuItem, timeWindow30minMenuItem,
                                                                timeWindow1hMenuItem, timeWindow2hMenuItem, timeWindow6hMenuItem,
                                                                timeWindow12hMenuItem, timeWindow24hMenuItem },
                                                        settings);
            sensorValuesTimeWindow.Changed += (sender, e) => {
                TimeSpan timeWindow = TimeSpan.Zero;
                switch (sensorValuesTimeWindow.Value)
                {
                case 0: timeWindow = new TimeSpan(0, 0, 30); break;

                case 1: timeWindow = new TimeSpan(0, 1, 0); break;

                case 2: timeWindow = new TimeSpan(0, 2, 0); break;

                case 3: timeWindow = new TimeSpan(0, 5, 0); break;

                case 4: timeWindow = new TimeSpan(0, 10, 0); break;

                case 5: timeWindow = new TimeSpan(0, 30, 0); break;

                case 6: timeWindow = new TimeSpan(1, 0, 0); break;

                case 7: timeWindow = new TimeSpan(2, 0, 0); break;

                case 8: timeWindow = new TimeSpan(6, 0, 0); break;

                case 9: timeWindow = new TimeSpan(12, 0, 0); break;

                case 10: timeWindow = new TimeSpan(24, 0, 0); break;
                }

                computer.Accept(new SensorVisitor(delegate(ISensor sensor) {
                    sensor.ValuesTimeWindow = timeWindow;
                }));
            };

            InitializePlotForm();
            InitializeSplitter();

            startupMenuItem.Visible = startupManager.IsAvailable;

            if (startMinMenuItem.Checked)
            {
                if (!minTrayMenuItem.Checked)
                {
                    WindowState = FormWindowState.Minimized;
                    Show();
                }
            }
            else
            {
                Show();
            }

            // Create a handle, otherwise calling Close() does not fire FormClosed
            IntPtr handle = Handle;

            // Make sure the settings are saved when the user logs off
            Microsoft.Win32.SystemEvents.SessionEnded += delegate {
                computer.Close();
                SaveConfiguration();
                if (runWebServer.Value)
                {
                    server.Quit();
                }
            };
        }
Ejemplo n.º 3
0
        public MainForm()
        {
            InitializeComponent();

            // check if the OpenHardwareMonitorLib assembly has the correct version
            if (Assembly.GetAssembly(typeof(Computer)).GetName().Version !=
                Assembly.GetExecutingAssembly().GetName().Version)
            {
                MessageBox.Show(
                    "The version of the file OpenHardwareMonitorLib.dll is incompatible.",
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Environment.Exit(0);
            }

            this.settings = new PersistentSettings();
            this.settings.Load(Path.ChangeExtension(
                                   Application.ExecutablePath, ".config"));

            this.unitManager = new UnitManager(settings);

            // make sure the buffers used for double buffering are not disposed
            // after each draw call
            BufferedGraphicsManager.Current.MaximumBuffer =
                Screen.PrimaryScreen.Bounds.Size;

            // set the DockStyle here, to avoid conflicts with the MainMenu
            this.splitContainer.Dock = DockStyle.Fill;

            this.Font     = SystemFonts.MessageBoxFont;
            treeView.Font = SystemFonts.MessageBoxFont;

            plotPanel      = new PlotPanel(settings);
            plotPanel.Font = SystemFonts.MessageBoxFont;
            plotPanel.Dock = DockStyle.Fill;

            nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
            nodeTextBoxText.DrawText          += nodeTextBoxText_DrawText;
            nodeTextBoxValue.DrawText         += nodeTextBoxText_DrawText;
            nodeTextBoxMin.DrawText           += nodeTextBoxText_DrawText;
            nodeTextBoxMax.DrawText           += nodeTextBoxText_DrawText;
            nodeTextBoxText.EditorShowing     += nodeTextBoxText_EditorShowing;

            foreach (TreeColumn column in treeView.Columns)
            {
                column.Width = Math.Max(20, Math.Min(400,
                                                     settings.GetValue("treeView.Columns." + column.Header + ".Width",
                                                                       column.Width)));
            }

            treeModel  = new TreeModel();
            root       = new Node(System.Environment.MachineName);
            root.Image = Utilities.EmbeddedResources.GetImage("computer.png");

            treeModel.Nodes.Add(root);
            treeView.Model = treeModel;

            this.computer = new Computer(settings);

            systemTray = new SystemTray(computer, settings);
            systemTray.HideShowCommand += hideShowClick;
            systemTray.ExitCommand     += exitClick;

            int p = (int)Environment.OSVersion.Platform;

            if ((p == 4) || (p == 128)) // Unix
            {
                treeView.RowHeight           = Math.Max(treeView.RowHeight, 18);
                splitContainer.BorderStyle   = BorderStyle.None;
                splitContainer.Border3DStyle = Border3DStyle.Adjust;
                splitContainer.SplitterWidth = 4;
                treeView.BorderStyle         = BorderStyle.Fixed3D;
                plotPanel.BorderStyle        = BorderStyle.Fixed3D;
                gadgetMenuItem.Visible       = false;
                minCloseMenuItem.Visible     = false;
                minTrayMenuItem.Visible      = false;
                startMinMenuItem.Visible     = false;
            }
            else // Windows
            {
                treeView.RowHeight = Math.Max(treeView.Font.Height + 1, 18);

                gadget = new SensorGadget(computer, settings, unitManager);
                gadget.HideShowCommand += hideShowClick;

                wmiProvider = new WmiProvider(computer);
            }

            plotColorPalette     = new Color[13];
            plotColorPalette[0]  = Color.Blue;
            plotColorPalette[1]  = Color.OrangeRed;
            plotColorPalette[2]  = Color.Green;
            plotColorPalette[3]  = Color.LightSeaGreen;
            plotColorPalette[4]  = Color.Goldenrod;
            plotColorPalette[5]  = Color.DarkViolet;
            plotColorPalette[6]  = Color.YellowGreen;
            plotColorPalette[7]  = Color.SaddleBrown;
            plotColorPalette[8]  = Color.RoyalBlue;
            plotColorPalette[9]  = Color.DeepPink;
            plotColorPalette[10] = Color.MediumSeaGreen;
            plotColorPalette[11] = Color.Olive;
            plotColorPalette[12] = Color.Firebrick;

            computer.HardwareAdded   += new HardwareEventHandler(HardwareAdded);
            computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);

            computer.Open();

            timer.Enabled = true;

            showHiddenSensors = new UserOption("hiddenMenuItem", false,
                                               hiddenMenuItem, settings);
            showHiddenSensors.Changed += delegate(object sender, EventArgs e) {
                treeModel.ForceVisible = showHiddenSensors.Value;
            };

            showValue = new UserOption("valueMenuItem", true, valueMenuItem,
                                       settings);
            showValue.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[1].IsVisible = showValue.Value;
            };

            showMin          = new UserOption("minMenuItem", false, minMenuItem, settings);
            showMin.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[2].IsVisible = showMin.Value;
            };

            showMax          = new UserOption("maxMenuItem", true, maxMenuItem, settings);
            showMax.Changed += delegate(object sender, EventArgs e) {
                treeView.Columns[3].IsVisible = showMax.Value;
            };

            startMinimized = new UserOption("startMinMenuItem", false,
                                            startMinMenuItem, settings);

            minimizeToTray = new UserOption("minTrayMenuItem", true,
                                            minTrayMenuItem, settings);
            minimizeToTray.Changed += delegate(object sender, EventArgs e) {
                systemTray.IsMainIconEnabled = minimizeToTray.Value;
            };

            minimizeOnClose = new UserOption("minCloseMenuItem", false,
                                             minCloseMenuItem, settings);

            autoStart = new UserOption(null, startupManager.Startup,
                                       startupMenuItem, settings);
            autoStart.Changed += delegate(object sender, EventArgs e) {
                try {
                    startupManager.Startup = autoStart.Value;
                } catch (InvalidOperationException) {
                    MessageBox.Show("Updating the auto-startup option failed.", "Error",
                                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    autoStart.Value = startupManager.Startup;
                }
            };

            readHddSensors = new UserOption("hddMenuItem", true, hddMenuItem,
                                            settings);
            readHddSensors.Changed += delegate(object sender, EventArgs e) {
                computer.HDDEnabled = readHddSensors.Value;
            };

            showGadget = new UserOption("gadgetMenuItem", false, gadgetMenuItem,
                                        settings);
            showGadget.Changed += delegate(object sender, EventArgs e) {
                if (gadget != null)
                {
                    gadget.Visible = showGadget.Value;
                }
            };

            celsiusMenuItem.Checked =
                unitManager.TemperatureUnit == TemperatureUnit.Celsius;
            fahrenheitMenuItem.Checked = !celsiusMenuItem.Checked;

            HttpClient.ServerURL = this.settings.GetValue("dataServerAddress", "");

            server       = new HttpServer(root, this.settings.GetValue("listenerPort", 8085));
            runWebServer = new UserOption("runWebServerMenuItem", false,
                                          runWebServerMenuItem, settings);
            runWebServer.Changed += delegate(object sender, EventArgs e)
            {
                if (runWebServer.Value)
                {
                    runWebServer.Value = server.startHTTPListener();
                }
                else
                {
                    server.stopHTTPListener();
                }
            };


            InitializePlotForm();

            startupMenuItem.Visible = startupManager.IsAvailable;

            if (startMinMenuItem.Checked)
            {
                if (!minTrayMenuItem.Checked)
                {
                    WindowState = FormWindowState.Minimized;
                    Show();
                }
            }
            else
            {
                Show();
            }

            // Create a handle, otherwise calling Close() does not fire FormClosed
            IntPtr handle = Handle;

            // Make sure the settings are saved when the user logs off
            Microsoft.Win32.SystemEvents.SessionEnded += delegate {
                SaveConfiguration();
                if (runWebServer.Value)
                {
                    server.Quit();
                }
            };
        }