-
Notifications
You must be signed in to change notification settings - Fork 4
/
FilterControl.cs
127 lines (103 loc) · 4.08 KB
/
FilterControl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace HeapProfiler {
public partial class FilterControl : UserControl {
public event FilterChangingEventHandler FilterChanging;
public event EventHandler FilterChanged;
private string _Filter;
private bool? _FilterTextIsValid = null;
public FilterControl () {
InitializeComponent();
var height = Math.Max(FilterText.Height, FilterText.GetPreferredSize(new Size(999, 999)).Height);
MinimumSize = new Size(0, height);
MaximumSize = new Size(999999, height);
Height = height;
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public string Filter {
get {
return _Filter;
}
set {
if (value == _Filter)
return;
FilterText.Text = _Filter;
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false)]
public IEnumerable<string> AutoCompleteItems {
set {
if (value == null) {
FilterText.AutoCompleteMode = AutoCompleteMode.None;
FilterText.AutoCompleteSource = AutoCompleteSource.None;
FilterText.AutoCompleteCustomSource = null;
} else {
FilterText.AutoCompleteCustomSource = new AutoCompleteStringCollection();
FilterText.AutoCompleteCustomSource.AddRange(value.ToArray());
FilterText.AutoCompleteSource = AutoCompleteSource.CustomSource;
FilterText.AutoCompleteMode = AutoCompleteMode.Suggest;
}
}
}
private void FilterControl_SizeChanged (object sender, EventArgs e) {
FilterText.SetBounds(
FindIcon.Width, 0, ClientSize.Width - FindIcon.Width, ClientSize.Height
);
}
private void FilterText_TextChanged (object sender, EventArgs e) {
if (FilterText.Text != _Filter) {
if (FilterText.Text.Trim().Length == 0) {
if (SystemColors.Window != FilterText.BackColor)
FilterText.BackColor = SystemColors.Window;
_Filter = null;
if (FilterChanged != null)
FilterChanged(this, EventArgs.Empty);
return;
}
var ea = new FilterChangingEventArgs(FilterText.Text);
if (FilterChanging != null)
FilterChanging(this, ea);
else
ea.SetValid(true);
var newColor =
(ea.IsValid.HasValue) ?
((ea.IsValid.GetValueOrDefault(false)) ?
Color.LightGoldenrodYellow : Color.LightPink)
: SystemColors.Window;
if (newColor != FilterText.BackColor)
FilterText.BackColor = newColor;
if (ea.IsValid.GetValueOrDefault(false))
_Filter = FilterText.Text;
else
_Filter = null;
if (FilterChanged != null)
FilterChanged(this, EventArgs.Empty);
}
}
}
public class FilterChangingEventArgs : EventArgs {
public readonly string Filter;
private bool? FilterIsValid;
public FilterChangingEventArgs (string filter) {
Filter = filter;
FilterIsValid = null;
}
public void SetValid (bool isValid) {
FilterIsValid = isValid;
}
public bool? IsValid {
get {
return FilterIsValid;
}
}
}
public delegate void FilterChangingEventHandler (object sender, FilterChangingEventArgs args);
}