示例#1
0
 public LdextinctionControl(LuiConfig Config) : base(Config)
 {
     InitializeComponent();
     Init();
     Beta.ValueChanged += Beta_ValueChanged;
     SaveData.Click    += (sender, e) => SaveOutput();
 }
示例#2
0
 public void ChildrenMatchConfig(LuiConfig config)
 {
     // Set all options dialogs to match the given config.
     foreach (ListViewItem it in OptionsListView.Items)
     {
         ((LuiOptionsDialog)it.Tag).MatchConfig(config);
     }
 }
示例#3
0
 void SetChildConfig(LuiConfig config)
 {
     // Set all options dialogs to reference & match the given config.
     foreach (ListViewItem it in OptionsListView.Items)
     {
         ((LuiOptionsDialog)it.Tag).Config = config;
     }
 }
示例#4
0
        public AbsorbanceControl(LuiConfig Config) : base(Config)
        {
            InitializeComponent();

            CurvesView.Graph = Graph;

            SaveData.Click  += (sender, e) => SaveOutput();
            SaveData.Enabled = false;

            ClearBlank.Click  += ClearBlank_Click;
            ClearBlank.Enabled = false;
        }
示例#5
0
        public LdalignControl(LuiConfig Config) : base(Config)
        {
            InitializeComponent();
            Init();

            Beta.ValueChanged += Beta_ValueChanged;
            SaveData.Click    += (sender, e) => SaveOutput();

            DdgConfigBox.Config    = Config;
            DdgConfigBox.Commander = Commander;
            DdgConfigBox.AllowZero = false;
            DdgConfigBox.HandleParametersChanged(this, EventArgs.Empty);
        }
示例#6
0
        void LoadConfig_Click(object sender, EventArgs e)
        {
            var ofd = new OpenFileDialog
            {
                Filter   = "XML Files|*.xml",
                FileName = "config.xml"
            };

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                // Update options dialogs to match the new config.
                // The new config is not instantiated and the old config is not replaced.
                ChildrenMatchConfig(LuiConfig.FromFile(ofd.FileName));
                HandleCanApply(sender, e);
            }
        }
示例#7
0
        public void SetupLuiConfig()
        {
            Config = new LuiConfig
            {
                ConfigFile = ConfigFile,
                LogFile    = "./log.txt",
                LogLevel   = "DEBUG"
            };

            gpibParameters1 = new GpibProviderParameters
            {
                TypeName    = "LuiHardware.gpib.NIGpibProvider",
                Name        = "NI PCI Card",
                BoardNumber = 0
            };

            gpibParameters2 = new GpibProviderParameters
            {
                TypeName = "LuiHardware.gpib.PrologixGpibProvider",
                Name     = "USB GPIB Controller",
                PortName = "COM1",
                Timeout  = 300
            };

            cameraParameters = new CameraParameters
            {
                TypeName    = "LuiHardware.camera.CameraTempControlled",
                Name        = "Andor USB CCD",
                Dir         = "./",
                Temperature = 20
            };

            ddgParameters = new DelayGeneratorParameters
            {
                TypeName     = "LuiHardware.ddg.DDG535",
                Name         = "Primary DDG",
                GpibAddress  = 15,
                GpibProvider = gpibParameters1
            };

            Config.AddParameters(gpibParameters1);
            Config.AddParameters(gpibParameters2);
            Config.AddParameters(cameraParameters);
            Config.AddParameters(ddgParameters);
        }
示例#8
0
        public TrldControl(LuiConfig Config) : base(Config)
        {
            InitializeComponent();
            Init();

            Beta.ValueChanged += Beta_ValueChanged;

            TimesList.AllowEdit            = false;
            TimesView.DefaultValuesNeeded += (sender, e) => { e.Row.Cells["Value"].Value = 0; };
            TimesView.DataSource           = new BindingSource(TimesList, null);
            TimesView.CellValidating      += TimesView_CellValidating;
            TimesView.CellEndEdit         += TimesView_CellEndEdit;

            SaveData.Click += (sender, e) => SaveOutput();

            DdgConfigBox.Config    = Config;
            DdgConfigBox.Commander = Commander;
            DdgConfigBox.AllowZero = false;
            DdgConfigBox.HandleParametersChanged(this, EventArgs.Empty);
        }
示例#9
0
        public CalibrateControl(LuiConfig config) : base(config)
        {
            InitializeComponent();

            CalibrationList.AllowEdit = true;
            CalibrationListView.DefaultValuesNeeded   += CalibrationListView_DefaultValuesNeeded;
            CalibrationListView.EditingControlShowing += CalibrationListView_EditingControlShowing;
            CalibrationListView.DataSource             = new BindingSource(CalibrationList, null);

            // Superscript the "2" in "R2"
            RSquaredLabel.SelectionStart      = 1;
            RSquaredLabel.SelectionLength     = 1;
            RSquaredLabel.SelectionCharOffset = 5;
            RSquaredLabel.SelectionFont       = new Font("Microsoft Sans Serif", 6, FontStyle.Regular);
            RSquaredLabel.SelectionLength     = 0;

            Ascending = true;

            ClearBlank.Click  += ClearBlank_Click;
            ClearBlank.Enabled = false;
        }
示例#10
0
文件: LuiTab.cs 项目: ilopezpe/LUI
        public LuiTab(LuiConfig config)
        {
            Config    = config;
            Commander = new Commander();

            InitializeComponent();
            Init();

            Paused = new ManualResetEvent(true);
            CameraGain.ValueChanged += CameraGain_ValueChanged;
            Collect.Click           += Collect_Click;
            Abort.Click             += Abort_Click;
            Pause.Click             += Pause_Click;
            Clear.Click             += Clear_Click;
            OpenLaser.Click         += OpenLaser_Click;
            CloseLaser.Click        += CloseLaser_Click;
            OpenLamp.Click          += OpenLamp_Click;
            CloseLamp.Click         += CloseLamp_Click;
            Graph.MouseClick        += Graph_Click;

            Abort.Enabled = Pause.Enabled = false;
        }
示例#11
0
        public ResidualsControl(LuiConfig config) : base(config)
        {
            InitializeComponent();
            Graph.YLabelFormat = "g";

            SaveData.Click  += SaveData_Click;
            SaveData.Enabled = false;

            CollectLaser.CheckedChanged += CollectLaser_CheckedChanged;
            ImageMode.CheckedChanged    += ImageMode_CheckedChanged;
            FvbMode.CheckedChanged      += FvbMode_CheckedChanged;
            SoftFvbMode.CheckedChanged  += SoftFvbMode_CheckedChanged;

            GraphScroll.Scroll       += GraphScroll_Scroll;
            GraphScroll.ValueChanged += GraphScroll_ValueChanged;
            GraphScroll.Enabled       = false;
            GraphScroll.Minimum       = 0;
            GraphScroll.Maximum       = Commander.Camera.Height - 1;
            GraphScroll.LargeChange   = 1;
            SelectedRow = 0;

            CameraTemperature.Enabled = false;

            VBin.Minimum         = 1;
            VBin.Value           = 1;
            VBin.ValueChanged   += CameraImage_ValueChanged;
            VStart.Minimum       = 1;
            VStart.ValueChanged += CameraImage_ValueChanged;
            VEnd.Minimum         = 1;
            VEnd.ValueChanged   += CameraImage_ValueChanged;

            DdgConfigBox.Config    = Config;
            DdgConfigBox.Commander = Commander;
            DdgConfigBox.AllowZero = true;
            DdgConfigBox.Enabled   = false;
            DdgConfigBox.HandleParametersChanged(this, EventArgs.Empty);
        }
示例#12
0
 public override void CopyConfigState(LuiConfig config)
 {
     PersistentItems = config.GetParameters<P>();
 }
示例#13
0
        public ParentForm(LuiConfig config)
        {
            Config = config;

            SuspendLayout();

            // Dispose resources when the form is closed;
            FormClosed += (s, e) => Config.Dispose();

            AutoScaleMode = AutoScaleMode.Dpi;
            StartPosition = FormStartPosition.WindowsDefaultLocation;
            Margin        = new Padding(2, 2, 2, 2);
            Name          = "ParentForm";
            Text          = "LUI " + Assembly.GetExecutingAssembly().GetName().Version;

            #region Setup tabs

            Tabs = new TabControl();
            Tabs.SuspendLayout();
            Tabs.Location      = new Point(0, 0);
            Tabs.Margin        = new Padding(2, 2, 2, 2);
            Tabs.Name          = "Tabs";
            Tabs.SelectedIndex = 0;
            //Tabs.Anchor = (AnchorStyles)(AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right);
            Tabs.Dock     = DockStyle.Fill;
            Tabs.TabIndex = 0;

            HomePage         = new TabPage();
            AbsPage          = new TabPage();
            TAAlignPage      = new TabPage();
            TRODPage         = new TabPage();
            LDAlignPage      = new TabPage();
            LDExtinctionPage = new TabPage();
            TRLDPage         = new TabPage();
            ResidualsPage    = new TabPage();
            CalibrationPage  = new TabPage();
            OptionsPage      = new TabPage();

            #region page properties
            HomePage.BackColor = SystemColors.Control;
            HomePage.Margin    = new Padding(2, 2, 2, 2);
            HomePage.Name      = "HomePage";
            HomePage.TabIndex  = 2;
            HomePage.Text      = "Home";

            AbsPage.BackColor = SystemColors.Control;
            AbsPage.Margin    = new Padding(2, 2, 2, 2);
            AbsPage.Name      = "AbsPage";
            AbsPage.TabIndex  = 3;
            AbsPage.Text      = "Absorbance";

            TAAlignPage.BackColor = SystemColors.Control;
            TAAlignPage.Margin    = new Padding(2, 2, 2, 2);
            TAAlignPage.Name      = "TAAlignPage";
            TAAlignPage.TabIndex  = 5;
            TAAlignPage.Text      = "TA Align";

            TRODPage.BackColor = SystemColors.Control;
            TRODPage.Margin    = new Padding(2, 2, 2, 2);
            TRODPage.Name      = "TRODPage";
            TRODPage.Padding   = new Padding(2, 2, 2, 2);
            TRODPage.TabIndex  = 0;
            TRODPage.Text      = "TROD";

            LDAlignPage.BackColor = SystemColors.Control;
            LDAlignPage.Margin    = new Padding(2, 2, 2, 2);
            LDAlignPage.Name      = "LDAlignPage";
            LDAlignPage.Padding   = new Padding(2, 2, 2, 2);
            LDAlignPage.TabIndex  = 0;
            LDAlignPage.Text      = "LD Align";

            TRLDPage.BackColor = SystemColors.Control;
            TRLDPage.Margin    = new Padding(2, 2, 2, 2);
            TRLDPage.Name      = "TRLDPage";
            TRLDPage.Padding   = new Padding(2, 2, 2, 2);
            TRLDPage.TabIndex  = 0;
            TRLDPage.Text      = "TRLD";

            LDExtinctionPage.BackColor = SystemColors.Control;
            LDExtinctionPage.Margin    = new Padding(2, 2, 2, 2);
            LDExtinctionPage.Name      = "LDExtinctionPage";
            LDExtinctionPage.Padding   = new Padding(2, 2, 2, 2);
            LDExtinctionPage.TabIndex  = 0;
            LDExtinctionPage.Text      = "Extinction";

            ResidualsPage.BackColor = SystemColors.Control;
            ResidualsPage.Margin    = new Padding(2, 2, 2, 2);
            ResidualsPage.Name      = "ResidualsPage";
            ResidualsPage.TabIndex  = 4;
            ResidualsPage.Text      = "Residuals";

            CalibrationPage.BackColor = SystemColors.Control;
            CalibrationPage.Margin    = new Padding(2, 2, 2, 2);
            CalibrationPage.Name      = "CalibrationPage";
            CalibrationPage.Padding   = new Padding(2, 2, 2, 2);
            CalibrationPage.TabIndex  = 1;
            CalibrationPage.Text      = "WL Cal";

            OptionsPage.BackColor = SystemColors.Control;
            OptionsPage.Margin    = new Padding(2, 2, 2, 2);
            OptionsPage.Name      = "OptionsPage";
            OptionsPage.TabIndex  = 7;
            OptionsPage.Text      = "Options";

            Tabs.TabPages.Add(HomePage);
            Tabs.TabPages.Add(AbsPage);
            Tabs.TabPages.Add(TAAlignPage);
            Tabs.TabPages.Add(TRODPage);
            Tabs.TabPages.Add(LDAlignPage);
            Tabs.TabPages.Add(TRLDPage);
            Tabs.TabPages.Add(LDExtinctionPage);
            Tabs.TabPages.Add(ResidualsPage);
            Tabs.TabPages.Add(CalibrationPage);
            Tabs.TabPages.Add(OptionsPage);
            #endregion

            Controls.Add(Tabs);

            Tabs.DrawMode   = TabDrawMode.OwnerDrawFixed;
            Tabs.DrawItem  += HandleTabDrawItem;
            Tabs.Selecting += HandleTabSelecting;
            Tabs.Selected  += HandleTabSelected;

            #endregion Setup tabs

            OptionsControl = new OptionsControl(Config)
            {
                Dock = DockStyle.Fill
            };

            #region add controls
            HomePage.Controls.Add(new Panel()); // Just a placeholder.

            AbsControl = new AbsorbanceControl(Config);
            AbsPage.Controls.Add(AbsControl);

            TAAlignControl = new TaalignControl(Config);
            TAAlignPage.Controls.Add(TAAlignControl);

            TRODControl = new TrodControl(Config);
            TRODPage.Controls.Add(TRODControl);

            LDAlignControl = new LdalignControl(Config);
            LDAlignPage.Controls.Add(LDAlignControl);

            TRLDControl = new TrldControl(Config);
            TRLDPage.Controls.Add(TRLDControl);

            LDExtinctionControl = new LdextinctionControl(Config);
            LDExtinctionPage.Controls.Add(LDExtinctionControl);

            CalibrateControl = new CalibrateControl(Config);
            CalibrationPage.Controls.Add(CalibrateControl);

            ResidualsControl = new ResidualsControl(Config);
            ResidualsPage.Controls.Add(ResidualsControl);

            OptionsPage.Controls.Add(OptionsControl);
            OptionsControl.OptionsApplied += HandleOptionsApplied;
            #endregion

            foreach (TabPage page in Tabs.TabPages)
            {
                if (page != HomePage && page != OptionsPage)
                {
                    page.Enabled = false;
                }
                if (page.Controls[0] is LuiTab luiTab)
                {
                    luiTab.Load         += (se, ev) => CalibrateControl.CalibrationChanged += luiTab.HandleCalibrationChanged;
                    FormClosing         += luiTab.HandleExit;
                    luiTab.TaskStarted  += HandleTaskStarted;
                    luiTab.TaskFinished += HandleTaskFinished;
                }
            }

            Tabs.SelectedTab = HomePage;

            Resize += HandleResize;

            Tabs.ResumeLayout();
            ResumeLayout();
        }
示例#14
0
        public void TestXmlSerialization()
        {
            //var serializer = new XmlSerializer(Config.GetType());
            //using (var writer = new StreamWriter(Config.ConfigFile))
            //{
            //    serializer.Serialize(writer, Config);
            //}
            Config.Save();

            //LuiConfig testConfig = null;
            //using (var reader = new StreamReader(ConfigFile))
            //{
            //    testConfig = (LuiConfig)serializer.Deserialize(reader);
            //}
            LuiConfig testConfig = LuiConfig.FromFile(ConfigFile);

            Assert.AreEqual(testConfig.ConfigFile, Config.ConfigFile);
            Assert.AreEqual(testConfig.LogFile, Config.LogFile);
            Assert.AreEqual(testConfig.LogLevel, Config.LogLevel);
            foreach (KeyValuePair <Type, Dictionary <LuiObjectParameters, ILuiObject> > kvp in Config.LuiObjectTableIndex)
            {
                IList <LuiObjectParameters> list = (IList <LuiObjectParameters>)kvp.Value.Keys.ToList();
                for (int i = 0; i < list.Count; i++)
                {
                    Assert.AreEqual(list[i], ((IList <LuiObjectParameters>)testConfig.LuiObjectTableIndex[kvp.Key].Keys.ToList())[i]);
                }
            }

            GpibProviderParameters dependency     = null;
            GpibProviderParameters testParameters = null;

            foreach (var kvp in testConfig.LuiObjectTableIndex[ddgParameters.GetType()])
            {
                if (kvp.Key.Name == ddgParameters.Name)
                {
                    dependency = ((DelayGeneratorParameters)kvp.Key).GpibProvider;
                }
            }

            foreach (var kvp in testConfig.LuiObjectTableIndex[gpibParameters1.GetType()])
            {
                if (kvp.Key.Name == gpibParameters1.Name)
                {
                    testParameters = (GpibProviderParameters)kvp.Key;
                }
            }

            Assert.AreEqual(dependency, testParameters);
            Assert.IsTrue(
                testConfig.LuiObjectTableIndex[dependency.GetType()][dependency] ==
                testConfig.LuiObjectTableIndex[testParameters.GetType()][testParameters]
                );
            Assert.IsTrue(Object.ReferenceEquals(
                              testConfig.LuiObjectTableIndex[dependency.GetType()][dependency],
                              testConfig.LuiObjectTableIndex[testParameters.GetType()][testParameters]
                              ));

            var dummy = new DummyGpibProvider();

            testConfig.LuiObjectTableIndex[dependency.GetType()][dependency] = dummy;

            Assert.IsTrue(Object.ReferenceEquals(testConfig.LuiObjectTableIndex[testParameters.GetType()][testParameters], dummy));
        }
示例#15
0
文件: Program.cs 项目: ilopezpe/LUI
        static void Main(string[] args)
        {
            #region Parse command line options

            var configfile = Constants.DefaultConfigFileLocation;
            var show_help  = false;
            var p          = new OptionSet
            {
                {
                    "f|file", "Configuration file",
                    v => configfile = v
                },
                {
                    "h|help", "Show this help text and exit",
                    v => show_help = true
                }
            };

            List <string> extra;
            try
            {
                extra = p.Parse(args);
            }
            catch (OptionException e)
            {
                Console.WriteLine("Invalid arguments: " + e.Message);
                return;
            }

            if (show_help)
            {
                ShowHelp(p);
                return;
            }

            #endregion Parse command line options

            #region Deserialize XML and setup LuiConfig

            LuiConfig Config;

            try
            {
                var serializer = new XmlSerializer(typeof(LuiConfig));
                using (var reader = new StreamReader(configfile))
                {
                    Config = (LuiConfig)serializer.Deserialize(reader);
                }
            }
            catch (Exception ex)
            {
                if (ex is FileNotFoundException)
                {
                    Config = LuiConfig.DummyConfig();
                }
                else if (ex is InvalidOperationException)
                {
                    Config = LuiConfig.DummyConfig();
                }
                else
                {
                    throw;
                }
            }

            Config.ConfigFile = configfile;
            Config.ConfigureLogging();

            #endregion Deserialize XML and setup LuiConfig

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new ParentForm(Config));
        }
示例#16
0
 public TaalignControl(LuiConfig Config) : base(Config)
 {
     InitializeComponent();
 }
示例#17
0
 public override void CopyConfigState(LuiConfig config)
 {
     LogLevel.Control.SelectedItem = config.LogLevel;
 }
示例#18
0
        public OptionsControl(LuiConfig config)
        {
            SuspendLayout();

            AutoScaleDimensions = new SizeF(6F, 13F);
            AutoScaleMode       = AutoScaleMode.Inherit;
            Name = "OptionsControl";

            #region Panels and list of options dialogs

            // Container for options dialogs.
            var OptionsPanel = new Panel
            {
                Dock = DockStyle.Fill
            };
            Controls.Add(OptionsPanel); // Must add the DockStyle.Fill control first.

            var ListPanel = new Panel
            {
                Dock = DockStyle.Left // Panel will dock to the left.
            };
            Controls.Add(ListPanel);

            OptionsListView = new OptionsListView
            {
                Dock          = DockStyle.Fill,
                HideSelection = false, // Maintain highlighting if user changes control focus.
                MultiSelect   = false, // Only select one item at a time.
                HeaderStyle   = ColumnHeaderStyle.None,
                View          = View.Details,
                ShowGroups    = true
            };
            OptionsListView.Columns.Add(new ColumnHeader());
            OptionsListView.SelectedIndexChanged += HandleSelectedOptionsDialogChanged;
            ListPanel.Controls.Add(OptionsListView);

            #endregion Panels and list of options dialogs

            #region Options dialogs

            var General = new ListViewGroup("General", HorizontalAlignment.Left);
            OptionsListView.Groups.Add(General);
            var Instruments = new ListViewGroup("Instruments", HorizontalAlignment.Left);
            OptionsListView.Groups.Add(Instruments);

            // Logging Options
            var LoggingOptionsDialog = new LoggingOptionsDialog(OptionsPanel.Size)
            {
                Dock = DockStyle.Fill
            };
            var LoggingOptionsItem = new ListViewItem("Logging", General)
            {
                Tag = LoggingOptionsDialog
            };
            OptionsListView.Items.Add(LoggingOptionsItem);
            OptionsPanel.Controls.Add(LoggingOptionsDialog);

            // Beam Flag Options Dialog
            var BeamFlagOptionsDialog = new LuiOptionsListDialog <AbstractBeamFlags, BeamFlagsParameters>(OptionsPanel.Size);
            BeamFlagOptionsDialog.AddConfigPanel(new BeamFlagsConfigPanel());
            BeamFlagOptionsDialog.AddConfigPanel(new DummyBeamFlagsConfigPanel());
            BeamFlagOptionsDialog.SetDefaultSelectedItems();
            BeamFlagOptionsDialog.Dock = DockStyle.Fill;
            var BeamFlagOptionsItem = new ListViewItem("Beam Flags", Instruments)
            {
                Tag = BeamFlagOptionsDialog
            };
            OptionsListView.Items.Add(BeamFlagOptionsItem);
            OptionsPanel.Controls.Add(BeamFlagOptionsDialog);

            // CCD Camera Dialog
            var CameraOptionsDialog =
                new LuiOptionsListDialog <ICamera, CameraParameters>(OptionsPanel.Size);
            CameraOptionsDialog.AddConfigPanel(new AndorCameraConfigPanel());
            CameraOptionsDialog.AddConfigPanel(new CameraTempControlledConfigPanel());
            CameraOptionsDialog.AddConfigPanel(new DummyAndorCameraConfigPanel());
            CameraOptionsDialog.AddConfigPanel(new DummyCameraConfigPanel());
            CameraOptionsDialog.SetDefaultSelectedItems();
            CameraOptionsDialog.Dock = DockStyle.Fill;
            var CameraOptionsItem = new ListViewItem("Camera", Instruments)
            {
                Tag = CameraOptionsDialog
            };
            OptionsListView.Items.Add(CameraOptionsItem);
            OptionsPanel.Controls.Add(CameraOptionsDialog);

            // GPIB Options Dialog
            var GPIBOptionsDialog = new LuiOptionsListDialog <IGpibProvider, GpibProviderParameters>(OptionsPanel.Size);
            GPIBOptionsDialog.AddConfigPanel(new NIConfigPanel());
            GPIBOptionsDialog.AddConfigPanel(new PrologixConfigPanel());
            GPIBOptionsDialog.AddConfigPanel(new DummyGpibProviderConfigPanel());
            GPIBOptionsDialog.SetDefaultSelectedItems();
            GPIBOptionsDialog.Dock = DockStyle.Fill;
            var GPIBOptionsItem = new ListViewItem("GPIB Controllers", Instruments)
            {
                Tag = GPIBOptionsDialog
            };
            OptionsListView.Items.Add(GPIBOptionsItem);
            OptionsPanel.Controls.Add(GPIBOptionsDialog);


            // DDG Options Dialog
            var DDGOptionsDialog =
                new LuiOptionsListDialog <IDigitalDelayGenerator, DelayGeneratorParameters>(OptionsPanel.Size);
            DDGOptionsDialog.AddConfigPanel(new DG535ConfigPanel(GPIBOptionsDialog));
            DDGOptionsDialog.AddConfigPanel(new DummyDigitalDelayGeneratorConfigPanel());
            DDGOptionsDialog.SetDefaultSelectedItems();
            DDGOptionsDialog.Dock = DockStyle.Fill;
            var DDGOptionsItem = new ListViewItem("Digital Delay Generators", Instruments)
            {
                Tag = DDGOptionsDialog
            };
            OptionsListView.Items.Add(DDGOptionsItem);
            OptionsPanel.Controls.Add(DDGOptionsDialog);

            // Syringe Pump Dialog
            var SyringePumpOptionsDialog = new LuiOptionsListDialog <ISyringePump, SyringePumpParameters>(OptionsPanel.Size);
            SyringePumpOptionsDialog.AddConfigPanel(new HarvardSyringePumpConfigPanel());
            SyringePumpOptionsDialog.AddConfigPanel(new DummySyringePumpConfigPanel());
            SyringePumpOptionsDialog.SetDefaultSelectedItems();
            SyringePumpOptionsDialog.Dock = DockStyle.Fill;
            var SyringePumpOptionsItem = new ListViewItem("Syringe Pump", Instruments)
            {
                Tag = SyringePumpOptionsDialog
            };
            OptionsListView.Items.Add(SyringePumpOptionsItem);
            OptionsPanel.Controls.Add(SyringePumpOptionsDialog);

            // Polarizer Dialog
            var PolarizerOptionsDialog = new LuiOptionsListDialog <IPolarizer, PolarizerParameters>(OptionsPanel.Size);
            PolarizerOptionsDialog.AddConfigPanel(new PolarizerConfigPanel());
            PolarizerOptionsDialog.AddConfigPanel(new DummyPolarizerConfigPanel());
            PolarizerOptionsDialog.SetDefaultSelectedItems();
            PolarizerOptionsDialog.Dock = DockStyle.Fill;
            var PolarizerOptionsItem = new ListViewItem("Polarizer", Instruments)
            {
                Tag = PolarizerOptionsDialog
            };
            OptionsListView.Items.Add(PolarizerOptionsItem);
            OptionsPanel.Controls.Add(PolarizerOptionsDialog);


            #endregion Options dialogs

            OptionsListView.Columns[0].Width = -1; // Sets width to that of widest item.

            // Note OptionsChanged and ConfigChanged handlers are not yet bound.
            Config = config;        // Refers to the global config object.
            SetChildConfig(Config); // Sets options dialogs to reference & match this config.

            #region Buttons

            var ButtonPanel = new FlowLayoutPanel
            {
                FlowDirection = FlowDirection.RightToLeft,
                Anchor        = AnchorStyles.Bottom | AnchorStyles.Right,
                AutoSize      = true, // Fit to the buttons.
                AutoSizeMode  = AutoSizeMode.GrowAndShrink
            };                        // Container for the buttons.

            ApplyConfig = new Button
            {
                Text    = "Apply",
                Size    = new Size(91, 34),
                Enabled = false
            };
            ApplyConfig.Click += ApplyConfig_Click;

            SaveConfig = new Button
            {
                Text    = "Save",
                Size    = new Size(91, 34),
                Enabled = false
            };
            SaveConfig.Click += SaveConfig_Click;

            LoadConfig = new Button
            {
                Text = "Load",
                Size = new Size(91, 34)
            };
            LoadConfig.Click += LoadConfig_Click;

            ButtonPanel.Controls.Add(LoadConfig);
            ButtonPanel.Controls.Add(SaveConfig);
            ButtonPanel.Controls.Add(ApplyConfig);

            OptionsPanel.Controls.Add(ButtonPanel);

            ButtonPanel.BringToFront(); // Display on top of any overlapping controls (OptionsPanel).

            #endregion Buttons

            ResumeLayout(false);
        }