2 using System.ComponentModel;
\r
3 using System.Windows.Forms;
\r
4 using System.Drawing;
\r
6 namespace AppliStation.Util
\r
8 public class ToolStripWeb2LikeTextBox : ToolStripTextBox
\r
10 public ToolStripWeb2LikeTextBox() : base()
\r
12 this.Text = string.Empty;
\r
15 [Category("Action")]
\r
16 public event EventHandler TextChangedTriggerFired;
\r
18 private int textChangedTriggerInterval = 500;
\r
21 /// Interval time for TextChangedTriggerFired.
\r
23 [Category("Behavior")]
\r
25 public virtual int TextChangedTriggerInterval {
\r
26 get { return textChangedTriggerInterval; }
\r
27 set { textChangedTriggerInterval = value; }
\r
31 private string oldText = null;
\r
32 public void FireTextChangedTrigger(EventArgs e)
\r
34 textChangeTriggerTimerStop();
\r
36 if (oldText != this.Text) {
\r
37 if (TextChangedTriggerFired != null) {
\r
38 TextChangedTriggerFired(this, e);
\r
40 oldText = this.Text;
\r
43 public void FireTextChangedTrigger()
\r
45 FireTextChangedTrigger(EventArgs.Empty);
\r
48 #region TextChange Timers
\r
51 /// Timer for TextChangedTriggerFired.
\r
53 protected Timer textChangeTriggerTimer = null;
\r
55 private void onTextUpdate(bool force)
\r
57 textChangeTriggerTimerStop();
\r
59 textChangeTriggerTimer = new Timer();
\r
60 textChangeTriggerTimer.Tick += textChangeTriggerTimerTick;
\r
61 textChangeTriggerTimer.Interval = TextChangedTriggerInterval;
\r
62 textChangeTriggerTimer.Start();
\r
65 private void textChangeTriggerTimerTick(object sender, EventArgs e)
\r
67 FireTextChangedTrigger(e);
\r
70 private void textChangeTriggerTimerStop()
\r
72 if (textChangeTriggerTimer != null) {
\r
73 textChangeTriggerTimer.Stop();
\r
74 textChangeTriggerTimer = null;
\r
78 protected override void OnTextChanged(EventArgs e)
\r
80 base.OnTextChanged(e);
\r
83 onTextUpdate(false);
\r
89 protected bool textIsEmpty = true;
\r
91 public override string Text {
\r
92 get { return textIsEmpty? string.Empty : base.Text; }
\r
94 bool changed = false;
\r
95 if (string.IsNullOrEmpty(value)) {
\r
96 if (! textIsEmpty) {
\r
100 base.Text = EmptyText;
\r
102 } else if (this.Text != value) {
\r
105 textIsEmpty = false;
\r
110 FireTextChangedTrigger(EventArgs.Empty);
\r
111 base.OnTextChanged(EventArgs.Empty);
\r
113 updateForeColorInternal();
\r
118 private string emptyText = "(none)";
\r
121 /// Gray text when textbox is empty and has not focus
\r
123 [Category("Appearance")]
\r
124 public virtual string EmptyText {
\r
125 get { return emptyText; }
\r
130 base.Text = emptyText;
\r
135 private Color emptyForeColor = SystemColors.GrayText;
\r
138 /// Gray text color when textbox is empty and has not focus
\r
140 [Category("Appearance")]
\r
141 [DefaultValue(typeof(Color), "GrayText")]
\r
142 public virtual Color EmptyForeColor {
\r
143 get { return emptyForeColor; }
\r
145 emptyForeColor = value;
\r
146 updateForeColorInternal();
\r
150 private Color foreColor = SystemColors.WindowText;
\r
152 public override Color ForeColor {
\r
153 get { return foreColor; }
\r
156 updateForeColorInternal();
\r
160 protected override void OnEnter(EventArgs e)
\r
163 base.Text = string.Empty;
\r
164 textIsEmpty = false;
\r
165 updateForeColorInternal();
\r
171 protected override void OnLeave(EventArgs e)
\r
173 if (string.IsNullOrEmpty(base.Text)) {
\r
174 base.Text = EmptyText;
\r
175 textIsEmpty = true;
\r
176 updateForeColorInternal();
\r
182 private void updateForeColorInternal()
\r
184 base.ForeColor = textIsEmpty? EmptyForeColor : ForeColor;
\r