using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Inet.Viewer.Data;
using Inet.Viewer.Resources;
namespace Inet.Viewer.WinForms.Prompt
{
///
/// panel for a range prompt field for which default values can be chosen
///
public partial class RangePromptFieldWithDefaultValues : PromptControl
{
private bool changing, temporaryRangeDefaultInserted;
private List defaultValuesRange = new List();
///
/// simple constructor with the necessary dependencies
///
/// prompt this panel is based on
public RangePromptFieldWithDefaultValues(PromptData prompt)
{
this.changing = true;
this.PromptData = prompt;
InitializeComponent();
RangePromptValue selectedValue = prompt.Values as RangePromptValue;
PromptValue fromValueToSelect = null;
PromptValue toValueToSelect = null;
PromptValue rangeValueToSelect = null;
List defaultValues = new List();
List defaultValuesTo = new List();
if (selectedValue != null)
{
this.chkIncludeFrom.Checked = ((RangePromptValue)selectedValue).IncludeLow;
this.chkIncludeTo.Checked = ((RangePromptValue)selectedValue).IncludeHigh;
}
else
{
this.chkIncludeFrom.Checked = true;
this.chkIncludeTo.Checked = true;
}
ArrayList values = prompt.DefaultValues;
string selectedRepr = selectedValue == null ? null : selectedValue.StringRepresentation;
string selectedStartRepr = selectedValue == null ? null : selectedValue.StartValue.StringRepresentation;
string selectedEndRepr = selectedValue == null ? null : selectedValue.EndValue.StringRepresentation;
foreach (PromptValue v in values)
{
if (v is SinglePromptValue)
{
defaultValues.Add(v);
defaultValuesTo.Add(v);
}
else if (v is RangePromptValue)
{
defaultValuesRange.Add(v);
}
if (selectedValue == null)
{
continue;
}
string stringRepr = v.StringRepresentation;
if (selectedStartRepr == stringRepr)
{
fromValueToSelect = v;
}
if (selectedEndRepr == stringRepr)
{
toValueToSelect = v;
}
if (selectedRepr == stringRepr)
{
rangeValueToSelect = v;
}
}
if (defaultValues.Count == 0)
{
cmbDefaultValues.DropDownStyle = ComboBoxStyle.Simple;
}
else
{
this.cmbDefaultValues.DataSource = defaultValues;
this.cmbDefaultValues.DisplayMember = "DisplayString";
this.cmbDefaultValues.ValueMember = "Value";
AutoSizeComboBox(cmbDefaultValues);
}
if (defaultValuesTo.Count == 0)
{
cmbDefaultValuesTo.DropDownStyle = ComboBoxStyle.Simple;
}
else
{
this.cmbDefaultValuesTo.DataSource = defaultValuesTo;
this.cmbDefaultValuesTo.DisplayMember = "DisplayString";
this.cmbDefaultValuesTo.ValueMember = "Value";
AutoSizeComboBox(cmbDefaultValuesTo);
}
if (defaultValuesRange.Count == 0)
{
cmbRangeDefaults.Visible = false;
}
else
{
this.cmbRangeDefaults.Items.AddRange(defaultValuesRange.ToArray());
this.cmbRangeDefaults.DisplayMember = "DisplayString";
this.cmbRangeDefaults.ValueMember = "Value";
}
if (selectedValue != null)
{
this.chkIncludeFrom.Checked = selectedValue.IncludeLow;
this.chkIncludeTo.Checked = selectedValue.IncludeHigh;
}
if (selectedValue == null && this.cmbRangeDefaults.Items.Count > 0)
{
selectedValue = this.cmbRangeDefaults.Items[0] as RangePromptValue;
}
if (fromValueToSelect != null)
{
this.cmbDefaultValues.SelectedItem = fromValueToSelect;
}
else if (selectedValue != null)
{
this.cmbDefaultValues.SelectedItem = null;
this.cmbDefaultValues.Text = selectedValue.StartValue.ValueString;
}
if (toValueToSelect != null)
{
this.cmbDefaultValuesTo.SelectedItem = toValueToSelect;
}
else if (selectedValue != null)
{
this.cmbDefaultValuesTo.SelectedItem = null;
this.cmbDefaultValuesTo.Text = selectedValue.EndValue.ValueString;
}
if (cmbRangeDefaults.Visible)
{
if (rangeValueToSelect != null)
{
this.cmbRangeDefaults.SelectedItem = rangeValueToSelect;
}
else if (selectedValue != null)
{
UpdateRangeFromSingle();
}
}
if (!this.PromptData.Changeable)
{
this.cmbDefaultValues.DropDownStyle = ComboBoxStyle.DropDownList;
this.cmbDefaultValuesTo.DropDownStyle = ComboBoxStyle.DropDownList;
this.cmbRangeDefaults.DropDownStyle = ComboBoxStyle.DropDownList;
}
changing = false;
ControlForErrors = chkIncludeTo;
ErrorProvider = errorProvider;
}
///
///
///
internal override PromptValue Value
{
get
{
try
{
object fromItem = this.cmbDefaultValues.SelectedItem;
SinglePromptValue start;
if (fromItem is SinglePromptValue)
{
start = fromItem as SinglePromptValue;
}
else
{
start = new SinglePromptValue(PromptData.Type, this.cmbDefaultValues.Text);
}
SinglePromptValue end;
object toItem = this.cmbDefaultValuesTo.SelectedItem;
if (toItem is SinglePromptValue)
{
end = toItem as SinglePromptValue;
}
else
{
end = new SinglePromptValue(PromptData.Type, this.cmbDefaultValuesTo.Text);
}
return new RangePromptValue(start, end, chkIncludeFrom.Checked, chkIncludeTo.Checked, PromptData.Type);
}
catch (Exception)
{
return null;
}
}
}
///
/// notifies that the selected value has changed
///
/// object responsible for the event
/// eventargs of the action
private void cmbDefaultValues_SelectedValueChanged(object sender, EventArgs e)
{
if (changing)
{
return;
}
changing = true;
try
{
if (sender == this.cmbRangeDefaults)
{
RangePromptValue range = this.cmbRangeDefaults.SelectedItem as RangePromptValue;
this.cmbDefaultValues.SelectedItem = null;
this.cmbDefaultValuesTo.SelectedItem = null;
if (range != null)
{
this.cmbDefaultValues.Text = range.StartValue.DisplayString;
this.cmbDefaultValuesTo.Text = range.EndValue.DisplayString;
this.chkIncludeFrom.Checked = range.IncludeLow;
this.chkIncludeTo.Checked = range.IncludeHigh;
}
if (temporaryRangeDefaultInserted && cmbRangeDefaults.SelectedIndex > 0)
{
cmbRangeDefaults.Items.RemoveAt(0);
temporaryRangeDefaultInserted = false;
}
}
else
{
UpdateRangeFromSingle();
}
ValidatePrompt();
OnValueChanged();
}
finally
{
changing = false;
}
}
///
/// Updates the range value from the single values. A temporary entry
/// will be added to combobox when the entered range does not exist
/// as default range.
///
private void UpdateRangeFromSingle()
{
RangePromptValue range = this.Value as RangePromptValue;
if (range != null)
{
PromptValue defaultValue = null;
string rangeStrRep = range.StringRepresentation;
foreach(PromptValue value in defaultValuesRange) {
if (value.StringRepresentation == rangeStrRep) {
defaultValue = value;
}
}
if (defaultValue != null) {
if (temporaryRangeDefaultInserted)
{
cmbRangeDefaults.Items.RemoveAt(0);
temporaryRangeDefaultInserted = false;
}
cmbRangeDefaults.SelectedItem = defaultValue;
} else {
if (temporaryRangeDefaultInserted)
{
cmbRangeDefaults.Items[0] = range;
}
else
{
cmbRangeDefaults.Items.Insert(0, range);
temporaryRangeDefaultInserted = true;
}
cmbRangeDefaults.SelectedIndex = 0;
}
}
}
///
/// notifies a change in the "null" checkbox state
///
/// object responsible for the event
/// eventargs of the action
private void chk_CheckedChanged(object sender, EventArgs e)
{
if (changing)
{
return;
}
changing = true;
UpdateRangeFromSingle();
changing = false;
}
///
internal override bool ValidatePrompt()
{
bool r = true;
errorProvider.Clear();
try
{
r &= cmbDefaultValues.SelectedItem != null || ValidatePrompt(new SinglePromptValue(PromptData.Type, cmbDefaultValues.Text), chkIncludeFrom);
}
catch (Exception e)
{
errorProvider.SetError(chkIncludeFrom, e.Message);
ErrorMessage = e.Message;
r = false;
}
try
{
if (cmbDefaultValuesTo.SelectedItem == null && !ValidatePrompt(new SinglePromptValue(PromptData.Type, cmbDefaultValuesTo.Text), chkIncludeTo))
{
r = false;
}
}
catch (Exception e)
{
errorProvider.SetError(chkIncludeTo, e.Message);
ErrorMessage = e.Message;
r = false;
}
return r && ValidatePrompt(Value, ControlForErrors);
}
}
}