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
 | |
| 
 |