<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Iwo Banaś - Flex Blog &#187; DataGrid</title>
	<atom:link href="http://www.iwobanas.com/category/reusable-components/datagrid/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iwobanas.com</link>
	<description>Adobe Flex and AIR thoughts, custom components, how-to’s...</description>
	<lastBuildDate>Tue, 02 Feb 2010 22:54:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating MDataGrid date filter</title>
		<link>http://www.iwobanas.com/2009/07/creating-mdatagrid-date-filter/</link>
		<comments>http://www.iwobanas.com/2009/07/creating-mdatagrid-date-filter/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 12:33:50 +0000</pubDate>
		<dc:creator>Iwo Banas</dc:creator>
				<category><![CDATA[DataGrid]]></category>
		<category><![CDATA[reusable components]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[MXML]]></category>

		<guid isPermaLink="false">http://www.iwobanas.com/?p=107</guid>
		<description><![CDATA[In this post I will describe how to create custom filter for MDataGrid (my extension of Flex 3 DataGrid described in one of the previous posts and hosted on http://code.google.com/p/reusable-fx/). I will guide you through creation of date filter as an example.
I consider extensibility one of the most important feature of well designed reusable component [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I will describe how to create custom filter for MDataGrid (my extension of Flex 3 DataGrid described in one of the previous posts and hosted on <a href="http://code.google.com/p/reusable-fx/" target="_blank">http://code.google.com/p/reusable-fx/</a>). I will guide you through creation of date filter as an example.</p>
<p>I consider extensibility one of the most important feature of well designed reusable component and that’s why I am trying to make process of creating new MDataGrid filters as straightforward as possible.</p>
<p><span id="more-107"></span></p>
<p>Following <em>&#8220;Favor object composition over class inheritance.&#8221;</em> rule I decided to split filtering functionality among a number of classes rather than write another thousand lines of DataGrid code. At the first glance the solution may look complicated but after understanding responsibilities of &#8220;filters&#8221; and &#8220;filter editors&#8221; it is really straightforward.</p>
<p><strong>Filter editors</strong> are the components displayed below column header after clicking filter button. Filter editor know nothing about business logic of filtering, their only responsibility is to present current state of the filter to the user and modify filter according to users actions. Filter editor may be any component implementing <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/IColumnFilterEditor.as.html" target="_blank">IColumnFilterEditor</a> interface. The default implementation of this interface is <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/FilterEditorBase.as.html" target="_blank">FilterEditorBase</a> class extending Box which is used as a base class for all standard MDataGrid filter editors. In the presented example we will create filter editor in MXML extending <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/FilterEditorBase.as.html" target="_blank">FilterEditorBase</a> class.</p>
<p><strong>Filter</strong> classes are where actual filtering takes place, they implement <code>filterFunction</code> which is used to eliminate items from MDataGrid data provider. Filters are also responsible for examining MDataGrid and presenting information about MDataGrid content to filter editors. In our example filter will present minimum and maximum dates found in given column. All filters extends <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filters/ColumnFilterBase.as.html" target="_blank">ColumnFilterBase</a> class.</p>
<p>To implement date filtering mechanism two classes have to be implemented: filter class (<a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filters/DateRangeFilter.as.html" target="_blank">DateRangeFilter</a>) and filter editor class (<a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/DateChooserFilterEditor.mxml.html" target="_blank">DateChooserFilterEditor</a>).</p>
<h3>DateRangeFilter</h3>
<p>DateRangeFilter extends ColumnFilterBase class and defines four fields: <code>dataMinimum</code>, <code>dataMaximum</code>, <code>minimum</code> and <code>maximum</code>.</p>
<p><code>dataMinimum</code> and <code>dataMaximum</code> represents a earliest and latest dates found in MDataGrid. These fields are updated by <code>updateOriginalDateRange()</code> function.</p>
<p><code>minimum</code> and <code>maximum</code> defines the range of dates which will be displayed in MDataGrid. By default <code>minimum</code> is set to <code>dataMinimum</code> and <code>maximum</code> is set to <code>dataMaximum</code> which means that all data are displayed (filter is inactive). It is important to call <code>commitFilterChange()</code> function inside <code>minimum/maximum</code> setter to inform MDataGrid that filter value have changed.</p>
<p>DateRangeFilter also overrides two functions defined in ColumnFilterBase:</p>
<p><code>isActive</code> getter checks if filter is active i.e. if it may eliminate any items form MDataGrid. In our case isActive getter simply checks if <code>minimum</code> and <code>maximum</code> differs from <code>dataMinimum</code> and <code>dataMaximum</code>.</p>
<pre>
override public function get isActive():Boolean
{
    return (minimum != dataMinimum || maximum != dataMaximum);
}
</pre>
<p><code>filterFunction</code> checks if item passed as an argument should be eliminated. First date displayed in column associated with this filter is extracted from given item and then it is compared against <code>minimum</code> and <code>maximum</code>. If the value is within the range <code>true</code> is returned (item is not eliminated) other ways <code>false</code> is returned (item is filtered out). If no date is fond for the given item <code>true</code> is returned. <code>filterFunction</code> is called many times for every MDataGrid item so it should not be computationally expensive.</p>
<pre>
override public function filterFunction(obj:Object):Boolean
{
    var value:Date = itemToDate(obj);

    if (value)
    {
        if (minimum &#038;&#038; value < minimum)
        {
            return false;
        }
        if (maximum &#038;&#038; value > maximum)
        {
            return false;
        }
    }
    return true;
}
</pre>
<p>You can find two additional functions in <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filters/DateRangeFilter.as.html" target="_blank">DateRangeFilter</a> code: <code>itemToDate()</code> is responsible for extracting date from data item and <code>originalCollectionChandeHandler()</code> refresh <code>dataMinimum</code> and <code>dataMaximum</code> when MDataGrid original collection (copy of data provider) changes.</p>
<h3>DateChooserFilterEditor</h3>
<p><strong>Good news:</strong> creating filter editors in MXML is much simpler than coding filter and the effect is instantly visible!</p>
<p>To make curly brackets binding simpler it is good idea to create strongly typed, bindable reference to filter instance edited by filter editor. The code below is the only code placed in <code>&lt;script&gt;</code> tag of our filter editor:</p>
<pre>
[Bindable]
protected var filter:DateRangeFilter;

override public function startEdit(column:MDataGridColumn):void
{
    super.startEdit(column);
    if (!column.filter || !column.filter is DateRangeFilter)
    {
        column.filter = new DateRangeFilter(column);
    }
    filter = column.filter as DateRangeFilter;
}
</pre>
<p>All you have to do now to create cool filter editor is placing MXML components with appropriate bindings and inline event handlers. Below you can see my proposals how date filter editor may look like.</p>
<p>The simple <a href="/wp-content/uploads/date_filter_01/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/DateChooserFilterEditor.mxml.html" target="_blank">DateChooserFilterEditor</a> consists of two DateChoosers and reset button.<br />
<a title="Sources" href="/wp-content/uploads/date_filter_01/srcview/index.html" target="_blank">View source</a> is enabled, you can download zipped sources from <a title="MDataGrid date filter sources" href="/wp-content/uploads/date_filter_01/srcview/DateFilterExample01.zip">here</a>.</p>
<p>For better experience <a href="/wp-content/uploads/date_filter_01/DateFilterExample.html" target="_blank">open example in separate window</a>.</p>
<p><iframe src="http://www.iwobanas.com/wp-content/uploads/date_filter_01/DateFilterExample.html" width="100%" height="560" frameborder="no"></iframe></p>
<p>To save some space I have replaced DataChoosers with DateField and created <a href="/wp-content/uploads/date_filter_02/srcview/source/com/iwobanas/controls/dataGridClasses/filterEditors/DateFieldFilterEditor.mxml.html" target="_blank">DateFieldFilterEditor</a>.<br />
<a title="Sources" href="/wp-content/uploads/date_filter_02/srcview/index.html" target="_blank">View source</a> is enabled, you can download zipped sources from <a title="MDataGrid date filter sources" href="/wp-content/uploads/date_filter_02/srcview/DateFilterExample02.zip">here</a>.</p>
<p>For better experience <a href="/wp-content/uploads/date_filter_02/DateFilterExample.html" target="_blank">open example in separate window</a>.</p>
<p><iframe src="http://www.iwobanas.com/wp-content/uploads/date_filter_02/DateFilterExample.html" width="100%" height="350" frameborder="no"></iframe></p>
<p>Of course dates may be filtered in many different ways. For example date filter editor may consist of two NumericSteppers to select years. I hope now you can create such filter editor by yourself.</p>
<p>If you have any questions or suggestions don&#8217;t hesitate to add a comment!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwobanas.com/2009/07/creating-mdatagrid-date-filter/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>DataGrid with client-side filtering and searching</title>
		<link>http://www.iwobanas.com/2009/06/datagrid-with-client-side-filtering-and-searching/</link>
		<comments>http://www.iwobanas.com/2009/06/datagrid-with-client-side-filtering-and-searching/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 22:47:03 +0000</pubDate>
		<dc:creator>Iwo Banas</dc:creator>
				<category><![CDATA[DataGrid]]></category>
		<category><![CDATA[reusable components]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.iwobanas.com/?p=83</guid>
		<description><![CDATA[I am working on reusable Flex 3 DataGrid extension allowing client-side filtering and searching, and probably many other features in the future. Although it is not finished yet I decided to publish the result of my work to get some feedback from you:-)
The project source repository is located at http://code.google.com/p/reusable-fx/
You can also view source of [...]]]></description>
			<content:encoded><![CDATA[<p>I am working on reusable Flex 3 DataGrid extension allowing client-side filtering and searching, and probably many other features in the future. Although it is not finished yet I decided to publish the result of my work to get some feedback from you:-)</p>
<p>The project source repository is located at <a href="http://code.google.com/p/reusable-fx/">http://code.google.com/p/reusable-fx/</a><br />
You can also <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_02/srcview/index.html" target="_blank">view source</a> of the example below.</p>
<p><span id="more-83"></span></p>
<p>I consider few things extremely important when creating new components:</p>
<h3>Reusability</h3>
<p>New DataGrid component should work not only for one cool demo but could be reused and reconfigured in many different applications. Every newly added element should support styling and/or skinning.</p>
<h3>Extensibility</h3>
<p>New DataGrid should allow further extension without need to rewrite too much code. During implementation of new features standard, well documented interfaces and patterns should be created to make further development easier. For example current version support filtering of text and numerical data but creation of filter for date ranges or images should be straightforward.</p>
<h3>Compatibility</h3>
<p>Compatibility with standard Flex DataGrid should be regarded very important and every incompatibilities should be well documented. For example one should be able to use filtering on one column when leaving other columns unchanged. Newly created interfaces should be similar to those known from standard Flex components.</p>
<p>I am trying to follow the rules above but of course it is not always possible. Especially if you are working on something for a long time it is difficult to tell what is intuitive for “ordinary user”. So if you play with example below and found something which in your opinion should work differently don’t hesitate to add a comment or create new issue on <a href="http://code.google.com/p/reusable-fx/issues/list">http://code.google.com/p/reusable-fx/issues/list</a> !</p>
<h3>Summary</h3>
<p>MDataGrid can be used just like standard DataGrid: you define a <code>dataProvider</code> and <code>columns</code> either in MXML or in ActionScript. If you want a column to allow filtering replace DataGridColumn with MDataGridColumn which by default has a text wildcard filtering enabled. If you prefer to filter column in a different way change <code>filterEditor</code> property of the column to point to some filter editor from <code>com.iwobanas.controls.dataGridClasses.filterEditors</code> package. You can find more information in the ASDoc in the source code. </p>
<h3>Example</h3>
<p>This example demonstrates live searching and filtering MDataGrid with about 400 rows.<br />
<a title="Sources" href="http://www.iwobanas.com/wp-content/uploads/data_grid_02/srcview/index.html" target="_blank">View source</a> is enabled, you can download zipped sources from <a title="MDataGrid sources" href="http://www.iwobanas.com/wp-content/uploads/data_grid_02/srcview/DataGrid02.zip">here</a>. </p>
<p>For better experience <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_02/DataGridExample.html" target="_blank">open example in separate window</a>.</p>
<p><iframe src="http://www.iwobanas.com/wp-content/uploads/data_grid_02/DataGridExample.html" width="100%" height="350" frameborder="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwobanas.com/2009/06/datagrid-with-client-side-filtering-and-searching/feed/</wfw:commentRss>
		<slash:comments>76</slash:comments>
		</item>
		<item>
		<title>Searchable DataGrid</title>
		<link>http://www.iwobanas.com/2009/06/searchable-datagrid/</link>
		<comments>http://www.iwobanas.com/2009/06/searchable-datagrid/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 14:49:24 +0000</pubDate>
		<dc:creator>Iwo Banas</dc:creator>
				<category><![CDATA[DataGrid]]></category>
		<category><![CDATA[reusable components]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex 3]]></category>
		<category><![CDATA[search]]></category>

		<guid isPermaLink="false">http://www.iwobanas.com/?p=51</guid>
		<description><![CDATA[Although standard Flex 3 DataGrid implements findString() function it is not really usable. Searching only the first column or the column with sorting enabled is definitely not intuitive and skipping to the next match on every keystroke is confusing. Furthermore calling to findString() changes selected index without highlighting matching text so in DataGrid with many [...]]]></description>
			<content:encoded><![CDATA[<p>Although standard Flex 3 DataGrid implements findString() function it is not really usable. Searching only the first column or the column with sorting enabled is definitely not intuitive and skipping to the next match on every keystroke is confusing. Furthermore calling to findString() changes selected index without highlighting matching text so in DataGrid with many columns it may be hard to figure out where the matching text is located.</p>
<p>Given above I decided to create new more flexible and reusable searching mechanism for DataGrid. As I was working on it I realized that other components (e.g. TextArea) may also support searching. That’s why I decided to create <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/source/com/iwobanas/core/ISearchable.as.html">ISearchable</a> interface to be implemented by every component supporting searching.</p>
<p>I also decided that searching should support standard wildcards like “*” or “?” so I created <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/source/com/iwobanas/utils/WildcardUtils.as.html">WlidcardUtils</a> class to convert wildcards to regular expressions which are internally used by my searching mechanism. I know that regular expressions aren’t very fast so maybe one day I will write my own mechanism for matching wildcards but for now RegExp’s are enough.</p>
<p><span id="more-51"></span></p>
<p>To support searched text to be highlighted I have implemented <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/source/com/iwobanas/controls/dataGridClasses/BoldSearchItemRenderer.as.html">BoldSearchItemRenderer</a> which can be used instead of standard DataGridItemRenderer.</p>
<p>Finally I have extended <a href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/source/com/iwobanas/controls/DataGrid.as.html">DataGrid</a> to implement ISearchable interface. I haven’t named it SearchableDataGrid since I am going to add many other features later and as AdvancedDataGrid name was in use too I decided to leave the name DataGrid changing only the package.</p>
<p>This example demonstrates live searching DataGrid with about 400 rows.<br />
<a title="Sources" href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/index.html" target="_blank">View source</a> is enabled, you can download zipped sources from <a title="Searchable DataGrid sources" href="http://www.iwobanas.com/wp-content/uploads/data_grid_01/srcview/DataGrid01.zip">here</a>.</p>
<p><iframe src="http://www.iwobanas.com/wp-content/uploads/data_grid_01/DataGridExample.html" width="100%" height="350" frameborder="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iwobanas.com/2009/06/searchable-datagrid/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
