using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; namespace DevComponents.Charts.Design { [ToolboxItem(false)] public partial class SeriesPointValueDropDown : UserControl { #region Private variables private object _Value; private bool _EscapePressed; private IWindowsFormsEditorService _EditorService; private ITypeDescriptorContext _Context; private LabeledTextBoxX[] _TextBoxes; #endregion public SeriesPointValueDropDown() { InitializeComponent(); } public SeriesPointValueDropDown(object value, IWindowsFormsEditorService editorService, ITypeDescriptorContext context) { if (value == null) value = new object[0]; _Value = value; _EditorService = editorService; _Context = context; BackColor = SystemColors.Control; InitializeComponent(); LayoutMultipleEntry(); Disposed += SeriesPointValueDropDown_Disposed; } #region LayoutMultipleEntry private void LayoutMultipleEntry() { if (_Value is object[]) { object[] values = (object[])_Value; _TextBoxes = GetTextBoxArray(values); PositionBtns(); } } #region GetTextBoxArray private LabeledTextBoxX[] GetTextBoxArray(object[] values) { LabeledTextBoxX[] tba = new LabeledTextBoxX[Math.Max(values.Length + 1, 3)]; for (int i = 0; i < tba.Length; i++) { object value = (i < values.Length) ? values[i] : null; tba[i] = GetValueTextBox(value, i); } return (tba); } #endregion #endregion #region GetValueTextBox private LabeledTextBoxX GetValueTextBox(object value, int i) { LabeledTextBoxX ltb = new LabeledTextBoxX(); ltb.EscapeKeyPressed += ltb_EscapeKeyPressed; ltb.lbIndex.Text = i.ToString(); ltb.tbValue.Tag = (value is string) ? "\"" + value + "\"" : value; ltb.tbValue.Text = FormatToStringValue(value); ltb.Location = new Point(0, i * (ltb.Height + 2) + 2); ltb.Width = Width + 6; ltb.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; Controls.Add(ltb); return (ltb); } #region FormatToStringValue private string FormatToStringValue(object value) { if (value == null) return (""); if (value is string) return ("\"" + value + "\""); if (value is int) return (value.ToString()); if (value is DateTime) return (value.ToString()); return (String.Format("{0:0.0###############}", value)); } #endregion #region ltb_EscapeKeyPressed void ltb_EscapeKeyPressed(object sender, EventArgs e) { btnCancel.PerformClick(); } #endregion #endregion #region PositionBtns private void PositionBtns() { int y = 2; foreach (LabeledTextBoxX ltb in _TextBoxes) y += (ltb.Height + 2); Height = y + btnOk.Height; int x = Width - btnCancel.Width; btnCancel.Location = new Point(x - 3 , y); btnOk.Location = new Point(x - 3 - btnOk.Width, y); } #endregion #region Public properties #region Value public object Value { get { if (EscapePressed == true) return (_Value); return (GetTextBoxValues()); } } #region GetTextBoxValues private object[] GetTextBoxValues() { object[] values = new object[_TextBoxes.Length]; int n = 0; for (int i = 0; i < _TextBoxes.Length; i++) { values[i] = GetTextBoxValue(i); if (values[i] != null) n++; } if (n > 0) { object[] rvalues = new object[n]; n = 0; for (int i = 0; i < values.Length; i++) { if (values[i] != null) rvalues[n++] = values[i]; } return (rvalues); } return (null); } #endregion #region GetTextBoxValue private object GetTextBoxValue(int n) { LabeledTextBoxX ltb = _TextBoxes[n]; if (string.IsNullOrEmpty(ltb.tbValue.Text) == true) return (null); if (ltb.tbValue.Tag != null) { if (ltb.tbValue.Text.Equals(ltb.tbValue.Tag.ToString()) == true) return (ltb.tbValue.Tag); } return (GetConvertedValue(ltb.tbValue.Text)); } #endregion #region GetConvertedValue private object GetConvertedValue(string text) { string s = text.Trim(); if (s.StartsWith("\"") && s.EndsWith("\"")) return (s.Substring(1, s.Length - 2)); if (s.Contains(".") == false) { int iResult; if (int.TryParse(text, out iResult) == true) return (iResult); } double dblResult; if (double.TryParse(text, out dblResult) == true) return (dblResult); DateTime dtResult; if (DateTime.TryParse(text, out dtResult) == true) return (dtResult); return (text); } #endregion #endregion #region EditorService public IWindowsFormsEditorService EditorService { get { return (_EditorService); } set { _EditorService = value; } } #endregion #region EscapePressed public bool EscapePressed { get { return (_EscapePressed); } set { _EscapePressed = value; } } #endregion #endregion #region MyPreviewKeyDown private void MyPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Escape) _EscapePressed = true; } #endregion #region btnOk_Click private void btnOk_Click(object sender, EventArgs e) { _EditorService.CloseDropDown(); } #endregion #region btnCancel_Click private void btnCancel_Click(object sender, EventArgs e) { _EscapePressed = true; _EditorService.CloseDropDown(); } #endregion #region SeriesPointValueDropDown_Disposed void SeriesPointValueDropDown_Disposed(object sender, EventArgs e) { for (int i = 0; i < _TextBoxes.Length; i++) { LabeledTextBoxX ltb = _TextBoxes[i]; ltb.EscapeKeyPressed -= ltb_EscapeKeyPressed; ltb.Dispose(); _TextBoxes[i] = null; } } #endregion } }