243 lines
6.4 KiB
C#
243 lines
6.4 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using DevComponents.Editors.Primitives;
|
|
using System.ComponentModel;
|
|
|
|
namespace DevComponents.Editors
|
|
{
|
|
public class VisualStringListInput : VisualListInput
|
|
{
|
|
#region Private Variables
|
|
private List<string> _Items = new List<string>();
|
|
private string _Text = "";
|
|
private string _LastValidatedInputStack = "", _LastMatch = "";
|
|
private bool _LastMatchComplete = false;
|
|
#endregion
|
|
|
|
#region Events
|
|
/// <summary>
|
|
/// Occurs when SelectedIndex property has changed.
|
|
/// </summary>
|
|
public event EventHandler SelectedIndexChanged;
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public VisualStringListInput()
|
|
{
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
public List<String> Items
|
|
{
|
|
get
|
|
{
|
|
return _Items;
|
|
}
|
|
}
|
|
|
|
protected virtual List<String> GetItems()
|
|
{
|
|
return _Items;
|
|
}
|
|
|
|
protected override bool ValidateNewInputStack(string s)
|
|
{
|
|
_LastValidatedInputStack = "";
|
|
_LastMatch = "";
|
|
_LastMatchComplete = false;
|
|
|
|
if (s.Length > 0)
|
|
{
|
|
List<String> items = GetItems();
|
|
StartsWithPredicate p = new StartsWithPredicate(s.ToLower(), 2);
|
|
List<string> match = items.FindAll(p.MatchTop);
|
|
if (match == null || match.Count == 0)
|
|
return false;
|
|
|
|
_LastMatch = match[0];
|
|
_LastValidatedInputStack = s;
|
|
_LastMatchComplete = match.Count == 1;
|
|
return true;
|
|
}
|
|
|
|
return base.ValidateNewInputStack(s);
|
|
}
|
|
|
|
protected string LastValidatedInputStack
|
|
{
|
|
get
|
|
{
|
|
return _LastValidatedInputStack;
|
|
}
|
|
set
|
|
{
|
|
_LastValidatedInputStack = value;
|
|
}
|
|
}
|
|
|
|
protected string LastMatch
|
|
{
|
|
get
|
|
{
|
|
return _LastMatch;
|
|
}
|
|
set
|
|
{
|
|
_LastMatch = value;
|
|
}
|
|
}
|
|
|
|
protected bool LastMatchComplete
|
|
{
|
|
get
|
|
{
|
|
return _LastMatchComplete;
|
|
}
|
|
set
|
|
{
|
|
_LastMatchComplete = value;
|
|
}
|
|
}
|
|
|
|
protected override void OnInputStackChanged()
|
|
{
|
|
bool changed = false;
|
|
if (_LastValidatedInputStack.Length > 0 && this.InputStack == _LastValidatedInputStack)
|
|
{
|
|
changed = _Text != _LastMatch;
|
|
_Text = _LastMatch;
|
|
}
|
|
else if (this.InputStack.Length == 0)
|
|
{
|
|
changed = _Text != "";
|
|
_Text = "";
|
|
}
|
|
|
|
InvalidateArrange();
|
|
|
|
if (changed)
|
|
OnSelectedIndexChanged(new EventArgs());
|
|
|
|
base.OnInputStackChanged();
|
|
}
|
|
|
|
protected override void OnInputKeyAccepted()
|
|
{
|
|
if (_LastMatchComplete)
|
|
{
|
|
InputComplete(true);
|
|
_LastMatchComplete = false;
|
|
}
|
|
base.OnInputKeyAccepted();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the text that is selected by the control.
|
|
/// </summary>
|
|
[DefaultValue("")]
|
|
public string Text
|
|
{
|
|
get
|
|
{
|
|
return GetInputStringValue();
|
|
}
|
|
set
|
|
{
|
|
if (_Text != value)
|
|
{
|
|
List<String> items = GetItems();
|
|
if (value == "" && !AllowEmptyState && items.Count > 0)
|
|
value = items[0];
|
|
else if (value != null && value.Length > 0)
|
|
{
|
|
if (!items.Contains(value))
|
|
{
|
|
if (!AllowEmptyState && items.Count > 0)
|
|
value = items[0];
|
|
else
|
|
value = "";
|
|
}
|
|
}
|
|
|
|
_Text = value;
|
|
ResetInputStack();
|
|
OnInputChanged();
|
|
OnSelectedIndexChanged(new EventArgs());
|
|
|
|
InvalidateArrange();
|
|
if (this.IsEmpty) this.IsEmpty = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Raises SelectedIndexChanged event
|
|
/// </summary>
|
|
protected virtual void OnSelectedIndexChanged(EventArgs e)
|
|
{
|
|
if (SelectedIndexChanged != null)
|
|
SelectedIndexChanged(this, e);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the currently selected index. -1 is returned if nothing is selected.
|
|
/// </summary>
|
|
[DefaultValue(-1), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public int SelectedIndex
|
|
{
|
|
get
|
|
{
|
|
if (this.IsEmpty || _Text == "") return -1;
|
|
List<string> items = GetItems();
|
|
return items.IndexOf(this.Text);
|
|
}
|
|
set
|
|
{
|
|
if (value >= 0)
|
|
{
|
|
List<string> items = GetItems();
|
|
this.Text = items[value];
|
|
}
|
|
else
|
|
this.Text = "";
|
|
}
|
|
}
|
|
|
|
protected override string GetInputStringValue()
|
|
{
|
|
if (_Text == null) return "";
|
|
return _Text;
|
|
}
|
|
|
|
public override void SelectNext()
|
|
{
|
|
int index = this.SelectedIndex + 1;
|
|
List<string> items = GetItems();
|
|
if (index >= items.Count)
|
|
index = 0;
|
|
this.SelectedIndex = index;
|
|
base.SelectNext();
|
|
}
|
|
|
|
public override void SelectPrevious()
|
|
{
|
|
int index = this.SelectedIndex - 1;
|
|
if (index < 0)
|
|
{
|
|
List<string> items = GetItems();
|
|
index = items.Count - 1;
|
|
}
|
|
this.SelectedIndex = index;
|
|
base.SelectPrevious();
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|
|
#endif
|
|
|