public SensorNode(ISensor sensor, PersistentSettings settings, 
            UnitManager unitManager)
            : base()
        {
            this.sensor = sensor;
              this.settings = settings;
              this.unitManager = unitManager;
              switch (sensor.SensorType) {
            case SensorType.Voltage: format = "{0:F3} V"; break;
            case SensorType.Clock: format = "{0:F0} MHz"; break;
            case SensorType.Load: format = "{0:F1} %"; break;
            case SensorType.Temperature: format = "{0:F1} °C"; break;
            case SensorType.Fan: format = "{0:F0} RPM"; break;
            case SensorType.Flow: format = "{0:F0} L/h"; break;
            case SensorType.Control: format = "{0:F1} %"; break;
            case SensorType.Level: format = "{0:F1} %"; break;
            case SensorType.Power: format = "{0:F1} W"; break;
            case SensorType.Data: format = "{0:F1} GB"; break;
            case SensorType.Factor: format = "{0:F3}"; break;
            case SensorType.DataRate: format = "{0:bf}/s"; break;
              }

              bool hidden = settings.GetValue(new Identifier(sensor.Identifier,
            "hidden").ToString(), sensor.IsDefaultHidden);
              base.IsVisible = !hidden;

              this.Plot = settings.GetValue(new Identifier(sensor.Identifier,
            "plot").ToString(), false);
        }
Пример #2
0
 public ComputerHardware()
 {
     settings    = new OpenHardwareMonitor.PersistentSettings();
     unitManager = new OpenHardwareMonitor.GUI.UnitManager(settings);
     treeModel   = new OpenHardwareMonitor.GUI.TreeModel();
     root        = new OpenHardwareMonitor.GUI.Node(System.Environment.MachineName);
     root.Image  = OpenHardwareMonitor.Utilities.EmbeddedResources.GetImage("computer.png");
     treeModel.Nodes.Add(root);
     treeModel.ForceVisible = true;
 }
    public HardwareNode(IHardware hardware, PersistentSettings settings, 
      UnitManager unitManager) : base() 
    {
      this.settings = settings;
      this.unitManager = unitManager;
      this.hardware = hardware;
      this.Image = HardwareTypeImage.Instance.GetImage(hardware.HardwareType);

      foreach (SensorType sensorType in Enum.GetValues(typeof(SensorType)))
        typeNodes.Add(new TypeNode(sensorType));

      foreach (ISensor sensor in hardware.Sensors)
        SensorAdded(sensor);

      hardware.SensorAdded +=new SensorEventHandler(SensorAdded);
      hardware.SensorRemoved += new SensorEventHandler(SensorRemoved);
    }
    public PlotPanel(PersistentSettings settings, UnitManager unitManager) {
      this.settings = settings;
      this.unitManager = unitManager;

      this.model = CreatePlotModel();

      this.plot = new Plot();
      this.plot.Dock = DockStyle.Fill;
      this.plot.Model = model;
      this.plot.BackColor = Color.White;
      this.plot.ContextMenu = CreateMenu();

      UpdateAxesPosition();

      this.SuspendLayout();
      this.Controls.Add(plot);
      this.ResumeLayout(true);
    }
Пример #5
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();
              };
        }
        public SensorNotifyIcon(SystemTray sensorSystemTray, ISensor sensor,
            bool balloonTip, PersistentSettings settings, UnitManager unitManager)
        {
            this.unitManager = unitManager;
              this.sensor = sensor;
              this.notifyIcon = new NotifyIconAdv();

              Color defaultColor = Color.Black;
              if (sensor.SensorType == SensorType.Load ||
              sensor.SensorType == SensorType.Control ||
              sensor.SensorType == SensorType.Level)
              {
            defaultColor = Color.FromArgb(0xff, 0x70, 0x8c, 0xf1);
              }
              Color = settings.GetValue(new Identifier(sensor.Identifier,
            "traycolor").ToString(), defaultColor);

              this.pen = new Pen(Color.FromArgb(96, Color.Black));

              ContextMenu contextMenu = new ContextMenu();
              MenuItem hideShowItem = new MenuItem("Hide/Show");
              hideShowItem.Click += delegate(object obj, EventArgs args) {
            sensorSystemTray.SendHideShowCommand();
              };
              contextMenu.MenuItems.Add(hideShowItem);
              contextMenu.MenuItems.Add(new MenuItem("-"));
              MenuItem removeItem = new MenuItem("Remove Sensor");
              removeItem.Click += delegate(object obj, EventArgs args) {
            sensorSystemTray.Remove(this.sensor);
              };
              contextMenu.MenuItems.Add(removeItem);
              MenuItem colorItem = new MenuItem("Change Color...");
              colorItem.Click += delegate(object obj, EventArgs args) {
            ColorDialog dialog = new ColorDialog();
            dialog.Color = Color;
            if (dialog.ShowDialog() == DialogResult.OK) {
              Color = dialog.Color;
              settings.SetValue(new Identifier(sensor.Identifier,
            "traycolor").ToString(), Color);
            }
              };
              contextMenu.MenuItems.Add(colorItem);
              contextMenu.MenuItems.Add(new MenuItem("-"));
              MenuItem exitItem = new MenuItem("Exit");
              exitItem.Click += delegate(object obj, EventArgs args) {
            sensorSystemTray.SendExitCommand();
              };
              contextMenu.MenuItems.Add(exitItem);
              this.notifyIcon.ContextMenu = contextMenu;
              this.notifyIcon.DoubleClick += delegate(object obj, EventArgs args) {
            sensorSystemTray.SendHideShowCommand();
              };

              // get the default dpi to create an icon with the correct size
              float dpiX, dpiY;
              using (Bitmap b = new Bitmap(1, 1, PixelFormat.Format32bppArgb)) {
            dpiX = b.HorizontalResolution;
            dpiY = b.VerticalResolution;
              }

              // adjust the size of the icon to current dpi (default is 16x16 at 96 dpi)
              int width = (int)Math.Round(16 * dpiX / 96);
              int height = (int)Math.Round(16 * dpiY / 96);

              // make sure it does never get smaller than 16x16
              width = width < 16 ? 16 : width;
              height = height < 16 ? 16 : height;

              // adjust the font size to the icon size
              FontFamily family = SystemFonts.MessageBoxFont.FontFamily;
              float baseSize;
              switch (family.Name) {
            case "Segoe UI": baseSize = 12; break;
            case "Tahoma": baseSize = 11; break;
            default: baseSize = 12; break;
              }

              this.font = new Font(family,
            baseSize * width / 16.0f, GraphicsUnit.Pixel);
              this.smallFont = new Font(family,
            0.75f * baseSize * width / 16.0f, GraphicsUnit.Pixel);

              this.bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
              this.graphics = Graphics.FromImage(this.bitmap);

              if (Environment.OSVersion.Version.Major > 5) {
            this.graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
            this.graphics.SmoothingMode = SmoothingMode.HighQuality;
              }
        }
Пример #7
0
        public MainForm()
        {
            InitializeComponent();

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

            this.unitManager = new UnitManager(settings);

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

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

            nodeCheckBox.IsVisibleValueNeeded += nodeCheckBox_IsVisibleValueNeeded;
            nodeCheckBox.CheckStateChanged    += UpdatePlotSelection;
            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);
            }

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

            computer.Open();

            timer.Enabled = true;

            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;

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

            showPlot          = new UserOption("plotMenuItem", false, plotMenuItem, settings);
            showPlot.Changed += delegate(object sender, EventArgs e) {
                splitContainer.Panel2Collapsed = !showPlot.Value;
                treeView.Invalidate();
            };

            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;
                UpdatePlotSelection(null, null);
            };

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

            celciusMenuItem.Checked =
                unitManager.TemperatureUnit == TemperatureUnit.Celcius;
            fahrenheitMenuItem.Checked = !celciusMenuItem.Checked;

            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();
            };
        }
Пример #8
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;

            this.sensor.Width = DpiHelper.LogicalToDeviceUnits(250);
            this.value.Width  = DpiHelper.LogicalToDeviceUnits(100);
            this.min.Width    = DpiHelper.LogicalToDeviceUnits(100);
            this.max.Width    = DpiHelper.LogicalToDeviceUnits(100);

            foreach (TreeColumn column in treeView.Columns)
            {
                column.Width = Math.Max(DpiHelper.LogicalToDeviceUnits(20), Math.Min(
                                            DpiHelper.LogicalToDeviceUnits(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;

            if (Hardware.OperatingSystem.IsUnix) // Unix
            {
                treeView.RowHeight = Math.Max(treeView.RowHeight,
                                              DpiHelper.LogicalToDeviceUnits(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 +
                                              DpiHelper.LogicalToDeviceUnits(1),
                                              DpiHelper.LogicalToDeviceUnits(18));

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

            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();

            Microsoft.Win32.SystemEvents.PowerModeChanged += PowerModeChanged;

            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();
                }
            };
        }
        public SensorNotifyIcon(SystemTray sensorSystemTray, ISensor sensor,
                                bool balloonTip, PersistentSettings settings, UnitManager unitManager)
        {
            this.unitManager = unitManager;
            this.sensor      = sensor;
            this.notifyIcon  = new NotifyIconAdv();

            Color defaultColor = Color.Black;

            if (sensor.SensorType == SensorType.Load ||
                sensor.SensorType == SensorType.Control ||
                sensor.SensorType == SensorType.Level)
            {
                defaultColor = Color.FromArgb(0xff, 0x70, 0x8c, 0xf1);
            }
            Color = settings.GetValue(new Identifier(sensor.Identifier,
                                                     "traycolor").ToString(), defaultColor);

            this.pen = new Pen(Color.FromArgb(96, Color.Black));

            ContextMenu contextMenu  = new ContextMenu();
            MenuItem    hideShowItem = new MenuItem("Hide/Show");

            hideShowItem.Click += delegate(object obj, EventArgs args) {
                sensorSystemTray.SendHideShowCommand();
            };
            contextMenu.MenuItems.Add(hideShowItem);
            contextMenu.MenuItems.Add(new MenuItem("-"));
            MenuItem removeItem = new MenuItem("Remove Sensor");

            removeItem.Click += delegate(object obj, EventArgs args) {
                sensorSystemTray.Remove(this.sensor);
            };
            contextMenu.MenuItems.Add(removeItem);
            MenuItem colorItem = new MenuItem("Change Color...");

            colorItem.Click += delegate(object obj, EventArgs args) {
                ColorDialog dialog = new ColorDialog();
                dialog.Color = Color;
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    Color = dialog.Color;
                    settings.SetValue(new Identifier(sensor.Identifier,
                                                     "traycolor").ToString(), Color);
                }
            };
            contextMenu.MenuItems.Add(colorItem);
            contextMenu.MenuItems.Add(new MenuItem("-"));
            MenuItem exitItem = new MenuItem("Exit");

            exitItem.Click += delegate(object obj, EventArgs args) {
                sensorSystemTray.SendExitCommand();
            };
            contextMenu.MenuItems.Add(exitItem);
            this.notifyIcon.ContextMenu  = contextMenu;
            this.notifyIcon.DoubleClick += delegate(object obj, EventArgs args) {
                sensorSystemTray.SendHideShowCommand();
            };

            // get the default dpi to create an icon with the correct size
            float dpiX, dpiY;

            using (Bitmap b = new Bitmap(1, 1, PixelFormat.Format32bppArgb)) {
                dpiX = b.HorizontalResolution;
                dpiY = b.VerticalResolution;
            }

            // adjust the size of the icon to current dpi (default is 16x16 at 96 dpi)
            int width  = (int)Math.Round(16 * dpiX / 96);
            int height = (int)Math.Round(16 * dpiY / 96);

            // make sure it does never get smaller than 16x16
            width  = width < 16 ? 16 : width;
            height = height < 16 ? 16 : height;

            // adjust the font size to the icon size
            FontFamily family = SystemFonts.MessageBoxFont.FontFamily;
            float      baseSize;

            switch (family.Name)
            {
            case "Segoe UI": baseSize = 12; break;

            case "Tahoma": baseSize = 11; break;

            default: baseSize = 12; break;
            }

            this.font = new Font(family,
                                 baseSize * width / 16.0f, GraphicsUnit.Pixel);
            this.smallFont = new Font(family,
                                      0.75f * baseSize * width / 16.0f, GraphicsUnit.Pixel);

            this.bitmap   = new Bitmap(width, height, PixelFormat.Format32bppArgb);
            this.graphics = Graphics.FromImage(this.bitmap);

            if (Environment.OSVersion.Version.Major > 5)
            {
                this.graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                this.graphics.SmoothingMode     = SmoothingMode.HighQuality;
            }
        }
        public void Update()
        {
            Icon icon = notifyIcon.Icon;

            switch (sensor.SensorType)
            {
            case SensorType.Load:
            case SensorType.Control:
            case SensorType.Level:
                notifyIcon.Icon = CreatePercentageIcon();
                break;

            default:
                notifyIcon.Icon = CreateTransparentIcon();
                break;
            }

            if (icon != null)
            {
                icon.Dispose();
            }

            string format = "";

            switch (sensor.SensorType)
            {
            case SensorType.Voltage: format = "\n{0}: {1:F2} V"; break;

            case SensorType.Clock: format = "\n{0}: {1:F0} MHz"; break;

            case SensorType.Load: format = "\n{0}: {1:F1} %"; break;

            case SensorType.Temperature: format = "\n{0}: {1:F1} °C"; break;

            case SensorType.Fan: format = "\n{0}: {1:F0} RPM"; break;

            case SensorType.Flow: format = "\n{0}: {1:F0} L/h"; break;

            case SensorType.Control: format = "\n{0}: {1:F1} %"; break;

            case SensorType.Level: format = "\n{0}: {1:F1} %"; break;

            case SensorType.Power: format = "\n{0}: {1:F0} W"; break;

            case SensorType.Data: format = "\n{0}: {1:F0} GB"; break;

            case SensorType.Factor: format = "\n{0}: {1:F3} GB"; break;
            }
            string formattedValue = string.Format(format, sensor.Name, sensor.Value);

            if (sensor.SensorType == SensorType.Temperature &&
                unitManager.TemperatureUnit == TemperatureUnit.Fahrenheit)
            {
                format         = "\n{0}: {1:F1} °F";
                formattedValue = string.Format(format, sensor.Name,
                                               UnitManager.CelsiusToFahrenheit(sensor.Value));
            }

            string hardwareName = sensor.Hardware.Name;

            hardwareName = hardwareName.Substring(0,
                                                  Math.Min(63 - formattedValue.Length, hardwareName.Length));
            string text = hardwareName + formattedValue;

            if (text.Length > 63)
            {
                text = null;
            }

            notifyIcon.Text    = text;
            notifyIcon.Visible = true;
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            int      w = Size.Width;

            g.Clear(Color.Transparent);

            DrawBackground(g);

            int x;
            int y = topMargin;

            if (sensors.Count == 0)
            {
                x = leftBorder + 1;
                g.DrawString("Right-click on a sensor in the main window and select " +
                             "\"Show in Gadget\" to show the sensor here.",
                             smallFont, Brushes.White,
                             new Rectangle(x, y - 1, w - rightBorder - x, 0));
            }

            foreach (KeyValuePair <IHardware, IList <ISensor> > pair in sensors)
            {
                if (hardwareNames.Value)
                {
                    if (y > topMargin)
                    {
                        y += hardwareLineHeight - sensorLineHeight;
                    }
                    x = leftBorder + 1;
                    g.DrawImage(HardwareTypeImage.Instance.GetImage(pair.Key.HardwareType),
                                new Rectangle(x, y + 1, iconSize, iconSize));
                    x += iconSize + 1;
                    g.DrawString(pair.Key.Name, largeFont, Brushes.White,
                                 new Rectangle(x, y - 1, w - rightBorder - x, 0),
                                 stringFormat);
                    y += hardwareLineHeight;
                }

                foreach (ISensor sensor in pair.Value)
                {
                    int remainingWidth;


                    if ((sensor.SensorType != SensorType.Load &&
                         sensor.SensorType != SensorType.Control &&
                         sensor.SensorType != SensorType.Level) || !sensor.Value.HasValue)
                    {
                        string formatted;

                        if (sensor.Value.HasValue)
                        {
                            string format = "";
                            switch (sensor.SensorType)
                            {
                            case SensorType.Voltage:
                                format = "{0:F3} V";
                                break;

                            case SensorType.Clock:
                                format = "{0:F0} MHz";
                                break;

                            case SensorType.Fan:
                                format = "{0:F0} RPM";
                                break;

                            case SensorType.Flow:
                                format = "{0:F0} L/h";
                                break;

                            case SensorType.Power:
                                format = "{0:F1} W";
                                break;

                            case SensorType.Data:
                                format = "{0:F1} GB";
                                break;

                            case SensorType.Factor:
                                format = "{0:F3}";
                                break;

                            case SensorType.SmallData:
                                format = "{0:F1} MB";
                                break;

                            case SensorType.RawValue:
                                format = "{0:F0}";
                                break;
                            }

                            switch (sensor.SensorType)
                            {
                            case SensorType.Temperature:
                                if (unitManager.TemperatureUnit == TemperatureUnit.Fahrenheit)
                                {
                                    formatted = string.Format("{0:F1} °F",
                                                              UnitManager.CelsiusToFahrenheit(sensor.Value));
                                }
                                else
                                {
                                    formatted = string.Format("{0:F1} °C", sensor.Value);
                                }
                                break;

                            case SensorType.Throughput:
                                if (sensor.Value < 1)
                                {
                                    formatted =
                                        string.Format("{0:F1} KB/s", sensor.Value * 0x400);
                                }
                                else
                                {
                                    formatted =
                                        string.Format("{0:F1} MB/s", sensor.Value);
                                }

                                break;

                            case SensorType.TimeSpan:
                                TimeSpan s = TimeSpan.FromSeconds(sensor.Value.Value);
                                formatted = s.ToString("g");
                                break;

                            default:
                                formatted = string.Format(format, sensor.Value);
                                break;
                            }
                        }
                        else
                        {
                            formatted = "-";
                        }

                        g.DrawString(formatted, smallFont, darkWhite,
                                     new RectangleF(-1, y - 1, w - rightMargin + 3, 0),
                                     alignRightStringFormat);

                        remainingWidth = w - (int)Math.Floor(g.MeasureString(formatted,
                                                                             smallFont, w, StringFormat.GenericTypographic).Width) -
                                         rightMargin;
                    }
                    else
                    {
                        DrawProgress(g, w - progressWidth - rightMargin,
                                     y + 0.35f * sensorLineHeight, progressWidth,
                                     0.6f * sensorLineHeight, 0.01f * (float)sensor.Value.Value);

                        remainingWidth = w - progressWidth - rightMargin;
                    }

                    remainingWidth -= leftMargin + 2;
                    if (remainingWidth > 0)
                    {
                        g.DrawString(sensor.Name, smallFont, darkWhite,
                                     new RectangleF(leftMargin - 1, y - 1, remainingWidth, 0),
                                     trimStringFormat);
                    }

                    y += sensorLineHeight;
                }
            }
        }
        public SensorGadget(IComputer computer, PersistentSettings settings,
                            UnitManager unitManager)
        {
            this.unitManager          = unitManager;
            this.settings             = settings;
            computer.HardwareAdded   += new HardwareEventHandler(HardwareAdded);
            computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);

            this.darkWhite = new SolidBrush(Color.FromArgb(0xF0, 0xF0, 0xF0));

            this.stringFormat             = new StringFormat();
            this.stringFormat.FormatFlags = StringFormatFlags.NoWrap;

            this.trimStringFormat             = new StringFormat();
            this.trimStringFormat.Trimming    = StringTrimming.EllipsisCharacter;
            this.trimStringFormat.FormatFlags = StringFormatFlags.NoWrap;

            this.alignRightStringFormat             = new StringFormat();
            this.alignRightStringFormat.Alignment   = StringAlignment.Far;
            this.alignRightStringFormat.FormatFlags = StringFormatFlags.NoWrap;

            if (File.Exists("gadget_background.png"))
            {
                try {
                    Image newBack = new Bitmap("gadget_background.png");
                    back.Dispose();
                    back = newBack;
                } catch { }
            }

            if (File.Exists("gadget_image.png"))
            {
                try {
                    image = new Bitmap("gadget_image.png");
                } catch {}
            }

            if (File.Exists("gadget_foreground.png"))
            {
                try {
                    fore = new Bitmap("gadget_foreground.png");
                } catch { }
            }

            if (File.Exists("gadget_bar_background.png"))
            {
                try {
                    Image newBarBack = new Bitmap("gadget_bar_background.png");
                    barBack.Dispose();
                    barBack = newBarBack;
                } catch { }
            }

            if (File.Exists("gadget_bar_foreground.png"))
            {
                try {
                    Image newBarColor = new Bitmap("gadget_bar_foreground.png");
                    barFore.Dispose();
                    barFore = newBarColor;
                } catch { }
            }

            this.Location = new Point(
                settings.GetValue("sensorGadget.Location.X", 100),
                settings.GetValue("sensorGadget.Location.Y", 100));
            LocationChanged += delegate(object sender, EventArgs e) {
                settings.SetValue("sensorGadget.Location.X", Location.X);
                settings.SetValue("sensorGadget.Location.Y", Location.Y);
            };

            // get the custom to default dpi ratio
            using (Bitmap b = new Bitmap(1, 1)) {
                scale = b.HorizontalResolution / 96.0f;
            }

            SetFontSize(settings.GetValue("sensorGadget.FontSize", 7.5f));
            Resize(settings.GetValue("sensorGadget.Width", Size.Width));

            ContextMenu contextMenu       = new ContextMenu();
            MenuItem    hardwareNamesItem = new MenuItem("Hardware Names");

            contextMenu.MenuItems.Add(hardwareNamesItem);
            MenuItem fontSizeMenu = new MenuItem("Font Size");

            for (int i = 0; i < 4; i++)
            {
                float  size;
                string name;
                switch (i)
                {
                case 0: size = 6.5f; name = "Small"; break;

                case 1: size = 7.5f; name = "Medium"; break;

                case 2: size = 9f; name = "Large"; break;

                case 3: size = 11f; name = "Very Large"; break;

                default: throw new NotImplementedException();
                }
                MenuItem item = new MenuItem(name);
                item.Checked = fontSize == size;
                item.Click  += delegate(object sender, EventArgs e) {
                    SetFontSize(size);
                    settings.SetValue("sensorGadget.FontSize", size);
                    foreach (MenuItem mi in fontSizeMenu.MenuItems)
                    {
                        mi.Checked = mi == item;
                    }
                };
                fontSizeMenu.MenuItems.Add(item);
            }
            contextMenu.MenuItems.Add(fontSizeMenu);
            contextMenu.MenuItems.Add(new MenuItem("-"));
            MenuItem lockItem = new MenuItem("Lock Position and Size");

            contextMenu.MenuItems.Add(lockItem);
            contextMenu.MenuItems.Add(new MenuItem("-"));
            MenuItem alwaysOnTopItem = new MenuItem("Always on Top");

            contextMenu.MenuItems.Add(alwaysOnTopItem);
            MenuItem opacityMenu = new MenuItem("Opacity");

            contextMenu.MenuItems.Add(opacityMenu);
            Opacity = (byte)settings.GetValue("sensorGadget.Opacity", 255);
            for (int i = 0; i < 5; i++)
            {
                MenuItem item = new MenuItem((20 * (i + 1)).ToString() + " %");
                byte     o    = (byte)(51 * (i + 1));
                item.Checked = Opacity == o;
                item.Click  += delegate(object sender, EventArgs e) {
                    Opacity = o;
                    settings.SetValue("sensorGadget.Opacity", Opacity);
                    foreach (MenuItem mi in opacityMenu.MenuItems)
                    {
                        mi.Checked = mi == item;
                    }
                };
                opacityMenu.MenuItems.Add(item);
            }
            this.ContextMenu = contextMenu;

            hardwareNames = new UserOption("sensorGadget.Hardwarenames", true,
                                           hardwareNamesItem, settings);
            hardwareNames.Changed += delegate(object sender, EventArgs e) {
                Resize();
            };

            alwaysOnTop = new UserOption("sensorGadget.AlwaysOnTop", false,
                                         alwaysOnTopItem, settings);
            alwaysOnTop.Changed += delegate(object sender, EventArgs e) {
                this.AlwaysOnTop = alwaysOnTop.Value;
            };
            lockPositionAndSize = new UserOption("sensorGadget.LockPositionAndSize",
                                                 false, lockItem, settings);
            lockPositionAndSize.Changed += delegate(object sender, EventArgs e) {
                this.LockPositionAndSize = lockPositionAndSize.Value;
            };

            HitTest += delegate(object sender, HitTestEventArgs e) {
                if (lockPositionAndSize.Value)
                {
                    return;
                }

                if (e.Location.X < leftBorder)
                {
                    e.HitResult = HitResult.Left;
                    return;
                }
                if (e.Location.X > Size.Width - 1 - rightBorder)
                {
                    e.HitResult = HitResult.Right;
                    return;
                }
            };

            SizeChanged += delegate(object sender, EventArgs e) {
                settings.SetValue("sensorGadget.Width", Size.Width);
                Redraw();
            };

            VisibleChanged += delegate(object sender, EventArgs e) {
                Rectangle bounds       = new Rectangle(Location, Size);
                Screen    screen       = Screen.FromRectangle(bounds);
                Rectangle intersection =
                    Rectangle.Intersect(screen.WorkingArea, bounds);
                if (intersection.Width < Math.Min(16, bounds.Width) ||
                    intersection.Height < Math.Min(16, bounds.Height))
                {
                    Location = new Point(
                        screen.WorkingArea.Width / 2 - bounds.Width / 2,
                        screen.WorkingArea.Height / 2 - bounds.Height / 2);
                }
            };

            MouseDoubleClick += delegate(object obj, MouseEventArgs args) {
                SendHideShowCommand();
            };
        }
Пример #13
0
        public SensorNode(ISensor sensor, PersistentSettings settings,
                          UnitManager unitManager)
        {
            Sensor           = sensor;
            this.settings    = settings;
            this.unitManager = unitManager;
            switch (sensor.SensorType)
            {
            case SensorType.Voltage:
                format = "{0:F3} V";
                break;

            case SensorType.Clock:
                format = "{0:F0} MHz";
                break;

            case SensorType.Load:
                format = "{0:F1} %";
                break;

            case SensorType.Temperature:
                format = "{0:F1} °C";
                break;

            case SensorType.Fan:
                format = "{0:F0} RPM";
                break;

            case SensorType.Flow:
                format = "{0:F0} L/h";
                break;

            case SensorType.Control:
                format = "{0:F1} %";
                break;

            case SensorType.Level:
                format = "{0:F1} %";
                break;

            case SensorType.Power:
                format = "{0:F1} W";
                break;

            case SensorType.Data:
                format = "{0:F1} GB";
                break;

            case SensorType.Factor:
                format = "{0:F3}";
                break;
            }

            var hidden = settings.GetValue(new Identifier(sensor.Identifier,
                                                          "hidden").ToString(), sensor.IsDefaultHidden);

            base.IsVisible = !hidden;

            Plot = settings.GetValue(new Identifier(sensor.Identifier,
                                                    "plot").ToString(), false);
        }
    public SystemTray(IComputer computer, PersistentSettings settings,
      UnitManager unitManager) 
    {
      this.computer = computer;
      this.settings = settings;
      this.unitManager = unitManager;
      computer.HardwareAdded += new HardwareEventHandler(HardwareAdded);
      computer.HardwareRemoved += new HardwareEventHandler(HardwareRemoved);

      this.mainIcon = new NotifyIconAdv();

      ContextMenu contextMenu = new ContextMenu();
      MenuItem hideShowItem = new MenuItem("Hide/Show");
      hideShowItem.Click += delegate(object obj, EventArgs args) {
        SendHideShowCommand();
      };
      contextMenu.MenuItems.Add(hideShowItem);
      contextMenu.MenuItems.Add(new MenuItem("-"));      
      MenuItem exitItem = new MenuItem("Exit");
      exitItem.Click += delegate(object obj, EventArgs args) {
        SendExitCommand();
      };
      contextMenu.MenuItems.Add(exitItem);
      this.mainIcon.ContextMenu = contextMenu;
      this.mainIcon.DoubleClick += delegate(object obj, EventArgs args) {
        SendHideShowCommand();
      };
      this.mainIcon.Icon = EmbeddedResources.GetIcon("smallicon.ico");
      this.mainIcon.Text = "Open Hardware Monitor";
    }