8
8
using System . Windows ;
9
9
using System . Windows . Controls ;
10
10
using System . Windows . Input ;
11
+ using System . Windows . Threading ;
11
12
12
13
namespace SQLScriptsExplorer . Addin . Commands . ToolWindow
13
14
{
@@ -16,8 +17,13 @@ namespace SQLScriptsExplorer.Addin.Commands.ToolWindow
16
17
/// </summary>
17
18
public partial class MainToolWindowControl : UserControl
18
19
{
19
- ISettingsRepository settingsRepository = null ;
20
- ITreeNodeRepository treeNodeRepository = null ;
20
+ private ISettingsRepository settingsRepository = null ;
21
+ private ITreeNodeRepository treeNodeRepository = null ;
22
+
23
+ // DispatcherTimer to debounce the search
24
+ private DispatcherTimer searchTimer = null ;
25
+ // You can adjust how long to wait before performing the search (e.g., 500ms)
26
+ private readonly TimeSpan SearchDelay = TimeSpan . FromMilliseconds ( 300 ) ;
21
27
22
28
public bool IsSearchResultsView
23
29
{
@@ -34,6 +40,11 @@ public MainToolWindowControl()
34
40
settingsRepository = new SettingsRepository ( ) ;
35
41
treeNodeRepository = new TreeNodeRepository ( ) ;
36
42
43
+ // Initialize the search debounce timer
44
+ searchTimer = new DispatcherTimer ( ) ;
45
+ searchTimer . Interval = SearchDelay ;
46
+ searchTimer . Tick += SearchTimer_Tick ;
47
+
37
48
RefreshTreeView ( ) ;
38
49
}
39
50
@@ -55,7 +66,8 @@ private void btnRefresh_Click(object sender, RoutedEventArgs e)
55
66
56
67
if ( IsSearchResultsView )
57
68
{
58
- txtSearch_KeyUp ( sender , null ) ;
69
+ // If currently in Search view, re-run the search after refresh
70
+ PerformSearch ( ) ;
59
71
}
60
72
}
61
73
@@ -77,13 +89,11 @@ private void btnCollapseAll_Click(object sender, RoutedEventArgs e)
77
89
if ( IsSearchResultsView )
78
90
{
79
91
TreeViewHelper . CollapseTreeView ( treeNodeRepository . TreeSearchResult ) ;
80
-
81
92
FileExplorerSearchResults . RefreshTreeView ( ) ;
82
93
}
83
94
else
84
95
{
85
96
TreeViewHelper . CollapseTreeView ( treeNodeRepository . Tree ) ;
86
-
87
97
FileExplorerAll . RefreshTreeView ( ) ;
88
98
}
89
99
}
@@ -93,13 +103,11 @@ private void btnExpandAll_Click(object sender, RoutedEventArgs e)
93
103
if ( IsSearchResultsView )
94
104
{
95
105
TreeViewHelper . ExpandTreeView ( treeNodeRepository . TreeSearchResult ) ;
96
-
97
106
FileExplorerSearchResults . RefreshTreeView ( ) ;
98
107
}
99
108
else
100
109
{
101
110
TreeViewHelper . ExpandTreeView ( treeNodeRepository . Tree ) ;
102
-
103
111
FileExplorerAll . RefreshTreeView ( ) ;
104
112
}
105
113
}
@@ -129,7 +137,30 @@ public void RefreshTreeView()
129
137
FileExplorerAll . RefreshTreeView ( ) ;
130
138
}
131
139
140
+ /// <summary>
141
+ /// KeyUp event: we reset/restart the timer, so that we only search
142
+ /// after user stops typing for a brief moment.
143
+ /// </summary>
132
144
private void txtSearch_KeyUp ( object sender , KeyEventArgs e )
145
+ {
146
+ // Stop and restart the timer each time a key is pressed.
147
+ searchTimer . Stop ( ) ;
148
+ searchTimer . Start ( ) ;
149
+ }
150
+
151
+ /// <summary>
152
+ /// Called when the search timer elapses (no more key presses for the set interval).
153
+ /// </summary>
154
+ private void SearchTimer_Tick ( object sender , EventArgs e )
155
+ {
156
+ searchTimer . Stop ( ) ; // Prevent multiple triggers
157
+ PerformSearch ( ) ;
158
+ }
159
+
160
+ /// <summary>
161
+ /// Actually performs the search in the repository, updates the UI accordingly.
162
+ /// </summary>
163
+ private void PerformSearch ( )
133
164
{
134
165
if ( ! string . IsNullOrWhiteSpace ( txtSearch . Text ) )
135
166
{
@@ -151,6 +182,7 @@ private void txtSearch_KeyUp(object sender, KeyEventArgs e)
151
182
FileExplorerAll . Visibility = Visibility . Visible ;
152
183
}
153
184
185
+ // Update Filter property
154
186
FileExplorerSearchResults . Filter = txtSearch . Text ;
155
187
}
156
188
@@ -162,7 +194,10 @@ private void FileExplorerSearchResults_TreeNodeAdded(object sender, System.Event
162
194
var treeNode = treeNodeSearchResults . Clone ( treeNodeParent ) ;
163
195
164
196
treeNodeParent . Children . Add ( treeNode ) ;
165
- treeNodeParent . Children = treeNodeParent . Children . OrderBy ( p => p . Type ) . ThenBy ( p => p . FileName ) . ToList ( ) ;
197
+ treeNodeParent . Children = treeNodeParent . Children
198
+ . OrderBy ( p => p . Type )
199
+ . ThenBy ( p => p . FileName )
200
+ . ToList ( ) ;
166
201
167
202
FileExplorerAll . DataSourceDictionary . Add ( treeNode . Id , treeNode ) ;
168
203
@@ -175,7 +210,6 @@ private void FileExplorerSearchResults_TreeNodeDeleted(object sender, System.Eve
175
210
var treeNode = FileExplorerAll . DataSourceDictionary [ treeNodeSearchResults . Id ] ;
176
211
177
212
treeNode . Parent . Children . Remove ( treeNode ) ;
178
-
179
213
FileExplorerAll . DataSourceDictionary . Remove ( treeNode . Id ) ;
180
214
181
215
FileExplorerAll . RefreshTreeView ( ) ;
@@ -189,7 +223,10 @@ private void FileExplorerSearchResults_TreeNodeRenamed(object sender, System.Eve
189
223
treeNode . FileName = treeNodeSearchResults . FileName ;
190
224
treeNode . FileFullPath = treeNodeSearchResults . FileFullPath ;
191
225
192
- treeNode . Parent . Children = treeNode . Parent . Children . OrderBy ( p => p . Type ) . ThenBy ( p => p . FileName ) . ToList ( ) ;
226
+ treeNode . Parent . Children = treeNode . Parent . Children
227
+ . OrderBy ( p => p . Type )
228
+ . ThenBy ( p => p . FileName )
229
+ . ToList ( ) ;
193
230
194
231
FileExplorerAll . RefreshTreeView ( ) ;
195
232
}
@@ -215,4 +252,4 @@ private void ToolBar_Loaded(object sender, RoutedEventArgs e)
215
252
216
253
#endregion
217
254
}
218
- }
255
+ }
0 commit comments