@@ -78,6 +78,11 @@ public partial class FrmLogFilter : DockContent, ILogPresenter, ILogFilterProvid
7878 /// </summary>
7979 private readonly IList < LogFilter > mLogFilter = new List < LogFilter > ( ) ;
8080
81+ /// <summary>
82+ /// The <see cref="Image"/> to use for <see cref=LogFilter"/>s.
83+ /// </summary>
84+ private static readonly Image mFilterImage = Properties . Resources . filter_16xLG ;
85+
8186 #endregion
8287
8388 #region Public Properties
@@ -136,6 +141,46 @@ protected override void Dispose(bool disposing)
136141
137142 #region Private Methods
138143
144+ /// <summary>
145+ /// Update the <see cref="DataGridView"/> of <see cref=LogFilter"/>s.
146+ /// </summary>
147+ private void UpdateLogFilters ( )
148+ {
149+ if ( mLogFilter != null )
150+ {
151+ LogFilter selectedFilter = dgvFilter . SelectedRows . Count > 0
152+ ? dgvFilter . SelectedRows [ 0 ] . Tag as LogFilter
153+ : null ;
154+
155+ dgvFilter . SuspendDrawing ( ) ;
156+
157+ try
158+ {
159+ dgvFilter . Rows . Clear ( ) ;
160+
161+ foreach ( LogFilterColumn filter in mLogFilter )
162+ {
163+ int rowIndex = dgvFilter . Rows . Add (
164+ mFilterImage
165+ , filter . IsActive
166+ , mLogProvider . Columns [ filter . ColumnIndex - 1 ]
167+ , filter . ColumnMatchValueRegEx ) ;
168+
169+ dgvFilter . Rows [ rowIndex ] . Tag = filter ;
170+
171+ if ( Equals ( selectedFilter , filter ) )
172+ {
173+ dgvFilter . Rows [ rowIndex ] . Selected = true ;
174+ }
175+ }
176+ }
177+ finally
178+ {
179+ dgvFilter . ResumeDrawing ( ) ;
180+ }
181+ }
182+ }
183+
139184 /// <summary>
140185 /// Handles the Click event of the zoom in <see cref="ToolStripItem"/>.
141186 /// </summary>
@@ -167,7 +212,51 @@ private void TsbAddFilterClick(object sender, EventArgs e)
167212 {
168213 if ( addEditFilterDlg . ShowDialog ( this ) == DialogResult . OK )
169214 {
170- // TODO (CC): Add the new filter.
215+ LogFilterColumn newLogFilter = new LogFilterColumn (
216+ addEditFilterDlg . IsFilterActive
217+ , addEditFilterDlg . ColumnIndex
218+ , addEditFilterDlg . ExpressionRegex ) ;
219+
220+ mLogFilter . Add ( newLogFilter ) ;
221+
222+ // Update the data grid.
223+ UpdateLogFilters ( ) ;
224+
225+ // Inform the filter handler about the changed filters.
226+ mLogFilterHandler . FilterChanged ( ) ;
227+ }
228+ }
229+ }
230+
231+ /// <summary>
232+ /// Handles the Click event of the edit filter <see cref="ToolStripItem"/>.
233+ /// </summary>
234+ /// <param name="sender"></param>
235+ /// <param name="e"></param>
236+ private void TsbEditFilterClick ( object sender , EventArgs e )
237+ {
238+ if ( dgvFilter . SelectedRows . Count > 0 )
239+ {
240+ LogFilterColumn filterToEdit = dgvFilter . SelectedRows [ 0 ] . Tag as LogFilterColumn ;
241+
242+ if ( filterToEdit != null )
243+ {
244+ using ( FrmAddEditFilter addEditFilterDlg = new FrmAddEditFilter ( mLogProvider , filterToEdit ) )
245+ {
246+ if ( addEditFilterDlg . ShowDialog ( this ) == DialogResult . OK )
247+ {
248+ filterToEdit . Update (
249+ addEditFilterDlg . IsFilterActive
250+ , addEditFilterDlg . ColumnIndex
251+ , addEditFilterDlg . ExpressionRegex ) ;
252+
253+ // Update the data grid.
254+ UpdateLogFilters ( ) ;
255+
256+ // Inform the filter handler about the changed filters.
257+ mLogFilterHandler . FilterChanged ( ) ;
258+ }
259+ }
171260 }
172261 }
173262 }
@@ -177,26 +266,78 @@ private void TsbAddFilterClick(object sender, EventArgs e)
177266 /// </summary>
178267 private void TsbRemoveFilterClick ( object sender , EventArgs e )
179268 {
269+ if ( dgvFilter . SelectedRows . Count > 0 )
270+ {
271+ // Remove the filter from the collction.
272+ mLogFilter . Remove ( dgvFilter . SelectedRows [ 0 ] . Tag as LogFilter ) ;
273+
274+ // Update the data grid.
275+ UpdateLogFilters ( ) ;
180276
277+ // Inform the filter handler about the changed filters.
278+ mLogFilterHandler . FilterChanged ( ) ;
279+ }
181280 }
182281
183282 /// <summary>
184283 /// Handles the SelectionChanged event of the filter <see cref="DataGridView"/>.
185284 /// </summary>
186285 private void DgvFilterSelectionChanged ( object sender , EventArgs e )
187286 {
287+ bool atLeastOneItemSelected = dgvFilter . SelectedRows . Count > 0 ;
188288
289+ tsbRemoveFilter . Enabled = atLeastOneItemSelected ;
290+ tsbEditFilter . Enabled = atLeastOneItemSelected ;
189291 }
190292
191293 /// <summary>
192294 /// Handles the CellDoubleClick event of the filter <see cref="DataGridView"/>.
193295 /// </summary>
194296 private void DgvFilterCellCoubleClick ( object sender , DataGridViewCellEventArgs e )
195297 {
196- if ( e . RowIndex >= dgvFilter . RowCount || e . RowIndex < 0 )
298+ if ( e . RowIndex >= dgvFilter . RowCount || e . RowIndex < 0 || e . ColumnIndex == 1 )
197299 {
198300 return ;
199301 }
302+
303+ // Double click means editing!
304+ tsbEditFilter . PerformClick ( ) ;
305+ }
306+
307+ /// <summary>
308+ /// Handles the CellValueChanged event of the filter <see cref=DataGridView"/>.
309+ /// </summary>
310+ private void DgvFilterCellValueChanged ( object sender , DataGridViewCellEventArgs e )
311+ {
312+ if ( e . RowIndex >= 0 && e . ColumnIndex == 1 )
313+ {
314+ LogFilterColumn filterToEdit = dgvFilter . Rows [ e . RowIndex ] . Tag as LogFilterColumn ;
315+
316+ if ( filterToEdit != null )
317+ {
318+ filterToEdit . Update (
319+ ( bool ) dgvFilter . Rows [ e . RowIndex ] . Cells [ e . ColumnIndex ] . Value
320+ , filterToEdit . ColumnIndex
321+ , filterToEdit . ColumnMatchValueRegEx ) ;
322+
323+ // Update the data grid.
324+ UpdateLogFilters ( ) ;
325+
326+ // Inform the filter handler about the changed filters.
327+ mLogFilterHandler . FilterChanged ( ) ;
328+ }
329+ }
330+ }
331+
332+ /// <summary>
333+ /// Handles the CurrentCellDirtyStateChanged event of the filter <see cref=DataGridView"/>.
334+ /// </summary>
335+ private void DgvFilterCurrentCellDirtyStateChanged ( object sender , EventArgs e )
336+ {
337+ if ( dgvFilter . IsCurrentCellDirty )
338+ {
339+ dgvFilter . CommitEdit ( DataGridViewDataErrorContexts . Commit ) ;
340+ }
200341 }
201342
202343 #endregion
0 commit comments