public FixtureSettings(LightingFixtureSettings settings, Window parent)
            : base(settings.name, settings.name.IsNotEmpty(), parent)
        {
            fixtureName = settings.name;

            var t = new SettingsTextBox("Name");

            t.textBox.text              = fixtureName.IsNotEmpty() ? fixtureName : "Enter name";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }
                else if (Devices.Lighting.GadgetNameExists(args.text))
                {
                    MessageBox.Show("Heater name already exists");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            var c = new SettingsComboBox("Outlet");

            if (fixtureName.IsNotEmpty())
            {
                var ic = settings.channel;
                c.combo.comboList.Add(string.Format("Current: {0}.p{1}", ic.Group, ic.Individual));
                c.combo.activeIndex = 0;
            }
            c.combo.nonActiveMessage = "Select outlet";
            c.combo.comboList.AddRange(Driver.Power.GetAllAvaiableChannels());
            AddSetting(c);

            var s = new SettingsSelectorSwitch("Temp Lockout");

            if (fixtureName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.highTempLockout ? 0 : 1;
            }
            AddSetting(s);

            bool isDimming = settings.dimmingChannel.IsNotEmpty();

            s = new SettingsSelectorSwitch("Dimming Fixture", "Yes", "No");
            s.selectorSwitch.currentSelected = isDimming ? 0 : 1;
            showOptional = isDimming;
            s.selectorSwitch.SelectorChangedEvent += (sender, args) => {
                if (args.currentSelectedIndex == 0)
                {
                    showOptional = true;
                }
                else
                {
                    showOptional = false;
                }
            };
            AddSetting(s);

            c = new SettingsComboBox("Dimming Channel");
            if (fixtureName.IsNotEmpty() && isDimming)
            {
                var ic = settings.dimmingChannel;
                c.combo.comboList.Add(string.Format("Current: {0}.q{1}", ic.Group, ic.Individual));
                c.combo.activeIndex = 0;
            }
            c.combo.nonActiveMessage = "Select outlet";
            c.combo.comboList.AddRange(Driver.AnalogOutput.GetAllAvaiableChannels());
            AddOptionalSetting(c);

            DrawSettings();
        }
        public WaterGroupSettings(WaterLevelGroupSettings settings, Window parent)
            : base(settings.name + " Water", settings.name.IsNotEmpty(), parent)
        {
            groupName = settings.name;

            var t = new SettingsTextBox("Name");

            t.textBox.text              = groupName.IsNotEmpty() ? groupName : "Enter name";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }

                if (WaterLevel.WaterLevelGroupNameExists(args.text))
                {
                    MessageBox.Show("Water level group name already exists");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            var b = new SettingsBlank("blank1");

            AddSetting(b);

            var s = new SettingsSelectorSwitch("Enable High Alarm");

            s.selectorSwitch.currentSelected = 1;
            if (groupName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.enableHighAnalogAlarm ? 0 : 1;
            }
            AddSetting(s);

            t = new SettingsTextBox("High Alarm");
            t.textBox.text = groupName.IsNotEmpty() ?
                             settings.highAnalogAlarmSetpoint.ToString() :
                             "0";
            t.textBox.TextChangedEvent += (sender, args) => {
                try {
                    float highAlarmStpnt = Convert.ToSingle(args.text);

                    if (highAlarmStpnt < 0f)
                    {
                        MessageBox.Show("High alarm setpoint can't be negative");
                        args.keepText = false;
                        return;
                    }
                } catch {
                    MessageBox.Show("Improper high alarm setpoint format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            s = new SettingsSelectorSwitch("Enable Low Alarm");
            s.selectorSwitch.currentSelected = 1;
            if (groupName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.enableLowAnalogAlarm ? 0 : 1;
            }
            AddSetting(s);

            t = new SettingsTextBox("Low Alarm");
            t.textBox.text = groupName.IsNotEmpty() ?
                             settings.lowAnalogAlarmSetpoint.ToString() :
                             "0";
            t.textBox.TextChangedEvent += (sender, args) => {
                try {
                    float lowAlarmStpnt = Convert.ToSingle(args.text);

                    if (lowAlarmStpnt < 0f)
                    {
                        MessageBox.Show("Low alarm setpoint can't be negative");
                        args.keepText = false;
                        return;
                    }
                } catch {
                    MessageBox.Show("Improper low alarm setpoint format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            DrawSettings();
        }
        public AtoSettings(AutoTopOffGroupSettings settings, Window parent)
            : base(settings.name + " Auto Top Off", settings.name.IsNotEmpty(), parent)
        {
            groupName = settings.name;

            var t = new SettingsTextBox("Name");

            t.textBox.text              = groupName.IsNotEmpty() ? groupName : "Enter name";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }
                else if (!AutoTopOff.AtoGroupNameOk(args.text))
                {
                    MessageBox.Show("ATO group name already exists");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            var s = new SettingsSelectorSwitch("Enable");

            if (groupName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.enable ? 0 : 1;
            }
            AddSetting(s);

            var c = new SettingsComboBox("Water Group");

            c.combo.nonActiveMessage = "Select Water Level Group";
            var availableGroups = WaterLevel.GetAllWaterLevelGroupNames();

            c.combo.comboList.AddRange(availableGroups);
            if (groupName.IsNotEmpty())
            {
                var index = Array.IndexOf(availableGroups, settings.waterLevelGroupName);
                c.combo.activeIndex = index;
            }
            AddSetting(c);

            t = new SettingsTextBox("Request Bit Name");
            t.textBox.text              = groupName.IsNotEmpty() ? settings.requestBitName : "Enter name";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }
            };
            AddSetting(t);

            s = new SettingsSelectorSwitch("Use Analog");
            if (groupName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.useAnalogSensors ? 0 : 1;
            }
            AddSetting(s);

            t = new SettingsTextBox("Analog Off");
            t.textBox.text              = groupName.IsNotEmpty() ? settings.analogOffSetpoint.ToString() : "0";
            t.textBox.TextChangedEvent += (sender, args) => {
                try {
                    float offStpnt = Convert.ToSingle(args.text);

                    if (offStpnt < 0f)
                    {
                        MessageBox.Show("Analog on setpoint can't be negative");
                        args.keepText = false;
                        return;
                    }
                } catch {
                    MessageBox.Show("Improper analog off setpoint format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            t = new SettingsTextBox("Analog On");
            t.textBox.text              = groupName.IsNotEmpty() ? settings.analogOnSetpoint.ToString() : "0";
            t.textBox.TextChangedEvent += (sender, args) => {
                try {
                    float onStpnt = Convert.ToSingle(args.text);

                    if (onStpnt < 0f)
                    {
                        MessageBox.Show("Analog on setpoint can't be negative");
                        args.keepText = false;
                        return;
                    }
                } catch {
                    MessageBox.Show("Improper analog on setpoint format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            s = new SettingsSelectorSwitch("Use Float Switch");
            if (groupName.IsNotEmpty())
            {
                s.selectorSwitch.currentSelected = settings.useFloatSwitches ? 0 : 1;
            }
            AddSetting(s);

            t = new SettingsTextBox("Max Runtime");
            t.textBox.text = groupName.IsNotEmpty() ?
                             string.Format("{0} mins", settings.maximumRuntime) :
                             "1 min";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }

                var time = ParseTime(args.text);
                if (time >= 0)
                {
                    args.text = string.Format("{0} mins", time);
                }
                else
                {
                    MessageBox.Show("Improper format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            t = new SettingsTextBox("Cooldown");
            t.textBox.text = groupName.IsNotEmpty() ?
                             string.Format("{0} mins", settings.minimumCooldown) :
                             "10 min";
            t.textBox.TextChangedEvent += (sender, args) => {
                if (args.text.IsEmpty())
                {
                    args.keepText = false;
                }

                var time = ParseTime(args.text);
                if (time >= 0)
                {
                    args.text = string.Format("{0} mins", time);
                }
                else
                {
                    MessageBox.Show("Improper format");
                    args.keepText = false;
                }
            };
            AddSetting(t);

            DrawSettings();
        }