| <div id="midcolumn"> | |
| <h3>Sorting</h3> | |
| <div id="doccontent"> | |
| <div class="chapter"> | |
| <h5>Sorting with GlazedLists</h5> | |
| <div class="content"> | |
| <p>In this section we will walk through the <span class="code">SortableGridExample</span> to demonstrate sorting in NatTable. | |
| Further on, we will see how to plugin custom comparators.</p> | |
| <p>NatTable uses the <span class="code">SortedList</span> from the GlazedLists project to do the actual sorting. | |
| Hence, as a first step, you will have to wrap your List data structure with a <span class="code">SortedList</span> instance. | |
| The <span class="code">IDataProvider</span> now uses the sorted list as its data source.</p> | |
| <div class="codeBlock">SortedList sortedList | |
| = new SortedList(eventList, null); | |
| IColumnPropertyAccessor columnPropertyAccessor | |
| = new ReflectiveColumnPropertyAccessor(propertyNames); | |
| bodyDataProvider | |
| = new ListDataProvider(sortedList, columnPropertyAccessor);</div> | |
| <p class="subline">Snippet from GlazedListsGridLayer of SortableGridExample</p> | |
| <p>The sorting functionality is added by the <span class="code">SortHeaderLayer</span>. | |
| This implies that this layer has to be added to the stack to enable sorting. | |
| Since sorting is triggered by the column header this layer will be added to the column header layer stack.</p> | |
| <div class="codeBlock">columnHeaderLayer | |
| = new ColumnHeaderLayer( | |
| dataLayer, bodyLayerStack, bodyLayerStack.getSelectionLayer()); | |
| SortHeaderLayer sortHeaderLayer = new SortHeaderLayer( | |
| columnHeaderLayer, | |
| new GlazedListsSortModel( | |
| sortedList, | |
| columnPropertyAccessor, | |
| configRegistry, | |
| dataLayer), | |
| false);</div> | |
| <p class="subline">Snippet from GlazedListsColumnHeaderLayerStack of SortableGridExample</p> | |
| <p>In the above snippet, the <span class="code">SortHeaderLayer</span> takes in a <span class="code">ISortModel</span> | |
| (second parameter). This is the GlazedLists specific code to which we delegate the sorting. If you wish to use your | |
| custom implementation of a sort algorithm, you can plug in your own <span class="code">ISortModel</span> here.</p> | |
| <p>Also note that we set 'autoconfigure' (last parameter) to false. This instructs the layer not to use any default | |
| setup. We do this in order to enable us to modify the default sort configuration. More on that in a bit. You can set | |
| this to <span class="code">true</span> if you are happy with the default settings.</p> | |
| </div> | |
| </div> | |
| <div class="chapter"> | |
| <h5>Using custom comparators</h5> | |
| <div class="content"> | |
| <p>The default comparator treats the objects in the column being sorted as <span class="code">Comparable</span>.</p> | |
| <p>Custom comparators can be plugged in by registering your comparator as a <span class="code">SortConfigAttributes.SORT_COMPARATOR</span> | |
| attribute in the config registry.<br> | |
| This is a two step process: | |
| <ol> | |
| <li>Apply labels to the column header cells</li> | |
| <li>Register your comparator against those labels</li> | |
| </ol> | |
| </p> | |
| <div class="codeBlock">// Add label accumulator | |
| ColumnOverrideLabelAccumulator labelAccumulator | |
| = new ColumnOverrideLabelAccumulator(columnHeaderDataLayer); | |
| columnHeaderDataLayer.setConfigLabelAccumulator(labelAccumulator); | |
| // Register labels | |
| labelAccumulator.registerColumnOverrides( | |
| RowDataListFixture.getColumnIndexOfProperty(RowDataListFixture.RATING_PROP_NAME), | |
| CUSTOM_COMPARATOR_LABEL); | |
| // Register custom comparator | |
| configRegistry.registerConfigAttribute(SortConfigAttributes.SORT_COMPARATOR, | |
| getCustomComparator(), | |
| DisplayMode.NORMAL, | |
| CUSTOM_COMPARATOR_LABEL);</div> | |
| </div> | |
| </div> | |
| <div class="chapter"> | |
| <h5>Disable sorting on selected columns</h5> | |
| <div class="content"> | |
| <p>Disabling sorting is very similar to applying custom comparator to a column. The only difference is that you | |
| register a <span class="code">NullComparator</span> as your custom comparator. | |
| The <span class="code">SortableGridExample</span> demonstrates this.</p> | |
| </div> | |
| </div> | |
| <div class="chapter"> | |
| <h5>Customize sort configuration</h5> | |
| <div class="content"> | |
| <p>The <span class="code">DefaultSortConfiguration</span> object sets up the: | |
| <ol> | |
| <li>default sort comparators (uses Comparable.compareTo())</li> | |
| <li>default sort header cell painters (Arrows of varying shapes)</li> | |
| <li>default mouse bindings for triggering sorting (Alt + left click, Alt + Shift + left click for additive sort)</li> | |
| </ol> | |
| <p>By overriding the <span class="code">DefaultSortConfiguration</span> you can customize the settings mentioned above. | |
| An example of this is the <span class="code">SingleClickSortConfiguration</span>.</p> | |
| <p>This overrides the default sort configuration and changes the mouse bindings to sort on a single click. | |
| Remember to register your new configuration as follows: | |
| <div class="codeBlock">sortHeaderLayer.addConfiguration(new SingleClickSortConfiguration());</div> | |
| </div> | |
| </div> | |
| <div class="chapter"> | |
| <h5>Sorting without GlazedLists</h5> | |
| <div class="content"> | |
| <p>It is recommended to use GlazedLists to get full performance benefits on using the NatTable with huge datasets. | |
| Nevertheless it is possible to enable sorting without using GlazedLists. To do this you have to implement your | |
| own <span class="code">ISortModel</span> and use it for instantiating the <span class="code">SortHeaderLayer</span> | |
| instead of using the <span class="code">GlazedListsSortModel</span>. | |
| </div> | |
| </div> | |
| </div> | |
| </div> |