You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ad...@apache.org on 2014/05/13 19:53:19 UTC
git commit: [WICKET-5573] Changed FilterToolbar to accept three
different generic types, and added an example for such component.
Repository: wicket
Updated Branches:
refs/heads/master abffeb040 -> 65385880a
[WICKET-5573] Changed FilterToolbar to accept three different generic
types, and added an example for such component.
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/65385880
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/65385880
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/65385880
Branch: refs/heads/master
Commit: 65385880a24503323ee2a0f6af6ac9c8163563f8
Parents: abffeb0
Author: bitstorm <an...@gmail.com>
Authored: Tue May 13 19:51:22 2014 +0200
Committer: bitstorm <an...@gmail.com>
Committed: Tue May 13 19:51:22 2014 +0200
----------------------------------------------------------------------
.../wicket/examples/repeater/Contact.java | 24 ++++-
.../wicket/examples/repeater/ContactFilter.java | 43 +++++++++
.../examples/repeater/ContactGenerator.java | 20 ++++
.../examples/repeater/ContactsDatabase.java | 2 +-
.../repeater/DataTableFilterToolbarPage.html | 29 ++++++
.../repeater/DataTableFilterToolbarPage.java | 97 ++++++++++++++++++++
.../wicket/examples/repeater/DataTablePage.html | 4 +-
.../wicket/examples/repeater/DataTablePage.java | 16 +++-
.../apache/wicket/examples/repeater/Index.html | 1 +
.../repeater/SortableContactDataProvider.java | 55 ++++++++++-
.../data/table/filter/FilterToolbar.java | 6 +-
11 files changed, 280 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Contact.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Contact.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Contact.java
index 7751654..0a53924 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Contact.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Contact.java
@@ -16,6 +16,8 @@
*/
package org.apache.wicket.examples.repeater;
+import java.util.Date;
+
import org.apache.wicket.util.io.IClusterable;
/**
@@ -35,7 +37,9 @@ public class Contact implements IClusterable
private String homePhone;
private String cellPhone;
-
+
+ private Date bornDate;
+
/**
* Constructor
*/
@@ -176,4 +180,22 @@ public class Contact implements IClusterable
this.lastName = lastName;
}
+ /**
+ *
+ * @return bornDate
+ */
+ public Date getBornDate()
+ {
+ return bornDate;
+ }
+
+ /**
+ *
+ * @param bornDate
+ */
+ public void setBornDate(Date bornDate)
+ {
+ this.bornDate = bornDate;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactFilter.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactFilter.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactFilter.java
new file mode 100644
index 0000000..532321f
--- /dev/null
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactFilter.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.examples.repeater;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class ContactFilter implements Serializable
+{
+ private Date dateFrom;
+ private Date dateTo;
+
+ public Date getDateFrom()
+ {
+ return dateFrom;
+ }
+ public void setDateFrom(Date dateFrom)
+ {
+ this.dateFrom = dateFrom;
+ }
+ public Date getDateTo()
+ {
+ return dateTo;
+ }
+ public void setDateTo(Date dateTo)
+ {
+ this.dateTo = dateTo;
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactGenerator.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactGenerator.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactGenerator.java
index ec47ad9..cb7f5ab 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactGenerator.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactGenerator.java
@@ -16,7 +16,10 @@
*/
package org.apache.wicket.examples.repeater;
+import java.util.Calendar;
import java.util.Collection;
+import java.util.Date;
+import java.util.GregorianCalendar;
/**
* generates random contacts
@@ -70,6 +73,8 @@ public class ContactGenerator
contact.setId(generateId());
contact.setHomePhone(generatePhoneNumber());
contact.setCellPhone(generatePhoneNumber());
+ contact.setBornDate(generateDate());
+
return contact;
}
@@ -111,5 +116,20 @@ public class ContactGenerator
return choices[rint(0, choices.length)];
}
+ private Date generateDate()
+ {
+ GregorianCalendar gc = new GregorianCalendar();
+
+ int year = rint(1950, 1985);
+
+ gc.set(Calendar.YEAR, year);
+ int dayOfYear = rint(1, gc.getActualMaximum(Calendar.DAY_OF_YEAR));
+
+ gc.set(Calendar.DAY_OF_YEAR, dayOfYear);
+
+ return gc.getTime();
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactsDatabase.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactsDatabase.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactsDatabase.java
index f295066..d057f7c 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactsDatabase.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/ContactsDatabase.java
@@ -92,7 +92,7 @@ public class ContactsDatabase
return getIndex(sort).subList((int)first, (int)(first + count));
}
- protected List<Contact> getIndex(SortParam sort)
+ public List<Contact> getIndex(SortParam sort)
{
if (sort == null)
{
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.html
new file mode 100644
index 0000000..545d5cc
--- /dev/null
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.html
@@ -0,0 +1,29 @@
+<html xmlns:wicket="http://wicket.apache.org">
+<wicket:head>
+ <style type="text/css">
+ th.last-name *, td.last-name {
+ font-weight: bold;
+ color: #AA0000;
+ }
+ th.numeric, td.numeric {
+ text-align: right !important;
+ }
+ </style>
+</wicket:head>
+<wicket:extend>
+
+
+This table has a toolbar filter. We can specify a valid range for contact's born date.<br/>
+ <br/>
+
+ <form wicket:id="filterForm">
+ <fieldset style="display: inline-block;">
+ <legend>Born date</legend>
+ <span style="float: right;">from: <input wicket:id="dateFrom"/></span> <br/>
+ <span style="float: right;">to: <input wicket:id="dateTo"/></span>
+ </fieldset>
+ <table class="dataview" wicket:id="tableWithFilterForm">[table]</table>
+ </form>
+
+</wicket:extend>
+</html>
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.java
new file mode 100644
index 0000000..031e120
--- /dev/null
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTableFilterToolbarPage.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.examples.repeater;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.NavigationToolbar;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterForm;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.FilterToolbar;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+
+
+/**
+ * demo page for the datatable component
+ *
+ * @see org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable
+ * @author igor
+ *
+ */
+public class DataTableFilterToolbarPage extends ExamplePage
+{
+ /**
+ * constructor
+ */
+ public DataTableFilterToolbarPage()
+ {
+ List<IColumn<Contact, String>> columns = new ArrayList<>();
+
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("ID"), "id")
+ {
+ @Override
+ public String getCssClass()
+ {
+ return "numeric";
+ }
+ });
+
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("First Name"), "firstName", "firstName"));
+
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("Last Name"), "lastName", "lastName")
+ {
+ @Override
+ public String getCssClass()
+ {
+ return "last-name";
+ }
+ });
+
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("Home Phone"), "homePhone"));
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("Cell Phone"), "cellPhone"));
+
+
+ SortableContactDataProvider dataProvider = new SortableContactDataProvider();
+ columns = new ArrayList<>(columns);
+ columns.add(new PropertyColumn<Contact, String>(new Model<>("Born Date"), "bornDate"));
+
+ DataTable<Contact, String> tableWithFilterForm = new DataTable<>("tableWithFilterForm", columns,
+ dataProvider, 8);
+
+ tableWithFilterForm.setOutputMarkupId(true);
+
+ FilterForm<ContactFilter> filterForm = new FilterForm<>("filterForm", dataProvider);
+
+ filterForm.add(new TextField<>("dateFrom", PropertyModel.of(dataProvider, "filterState.dateFrom")));
+ filterForm.add(new TextField<>("dateTo", PropertyModel.of(dataProvider, "filterState.dateTo")));
+
+ add(filterForm);
+
+ FilterToolbar filterToolbar = new FilterToolbar(tableWithFilterForm, filterForm);
+
+ tableWithFilterForm.addTopToolbar(filterToolbar);
+ tableWithFilterForm.addTopToolbar(new NavigationToolbar(tableWithFilterForm));
+ tableWithFilterForm.addTopToolbar(new HeadersToolbar<>(tableWithFilterForm, dataProvider));
+ filterForm.add(tableWithFilterForm);
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.html
index 842cecb..006079f 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.html
@@ -31,8 +31,8 @@ This is a demo of the DataTable (DataView wrapper). Provided features:<br/>
<hr/>
<br/>
- <span style="font-size: 16px">This is a table that uses <em>org.apache.wicket.extensions.markup.html.repeater.data.table.ColGroup</em>
+ <span>This is a table that uses <em>org.apache.wicket.extensions.markup.html.repeater.data.table.ColGroup</em>
to style the columns</span>:
- <table wicket:id="tableWithColGroup">[table]</table>
+ <table class="dataview" wicket:id="tableWithColGroup">[table]</table>
</wicket:extend>
</html>
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.java
index 46b067d..e0a75a0 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/DataTablePage.java
@@ -25,6 +25,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColu
import org.apache.wicket.extensions.markup.html.repeater.data.table.ColGroup;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.CSVDataExporter;
@@ -83,16 +84,20 @@ public class DataTablePage extends BasePage
columns.add(new PropertyColumn<Contact, String>(new Model<>("Home Phone"), "homePhone"));
columns.add(new PropertyColumn<Contact, String>(new Model<>("Cell Phone"), "cellPhone"));
- DataTable dataTable = new DefaultDataTable<>("table", columns,
- new SortableContactDataProvider(), 8);
+ SortableContactDataProvider dataProvider = new SortableContactDataProvider();
+ DataTable<Contact, String> dataTable = new DefaultDataTable<>("table", columns,
+ dataProvider, 8);
+
dataTable.addBottomToolbar(new ExportToolbar(dataTable).addDataExporter(new CSVDataExporter()));
add(dataTable);
- DataTable tableWithColGroup = new DataTable<>("tableWithColGroup", columns,
- new SortableContactDataProvider(), 8);
+ DataTable<Contact, String> tableWithColGroup = new DataTable<>("tableWithColGroup", columns,
+ dataProvider, 8);
+ tableWithColGroup.addTopToolbar(new HeadersToolbar<>(tableWithColGroup, dataProvider));
add(tableWithColGroup);
-
+
+ //This is a table that uses ColGroup to style the columns:
ColGroup colgroup = tableWithColGroup.getColGroup();
colgroup.add(AttributeModifier.append("style", "border: solid 1px green;"));
colgroup.addCol(colgroup.new Col(AttributeModifier.append("style", "background-color: lightblue;")));
@@ -101,5 +106,6 @@ public class DataTablePage extends BasePage
colgroup.addCol(colgroup.new Col(AttributeModifier.append("style", "background-color: yellow")));
colgroup.addCol(colgroup.new Col(AttributeModifier.append("span", "2"),
AttributeModifier.append("style", "background-color: #CC6633")));
+
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Index.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Index.html b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Index.html
index 693bd8b..0158e67 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Index.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/Index.html
@@ -13,6 +13,7 @@ Repeaters are components that can render their body markup multiple times. These
<a href="OIRPage.html">DataView and optimized item removal - demonstrates a dataview with a different IItemReuseStrategy implementation</a><br/>
<a href="DataGridPage.html">DataGridView Example - a view that generates grids where rows are representing by items of the data provider and columns are represented by an array of ICellPopulators objects</a><br/>
<a href="DataTablePage.html">DataTable Example - demonstrates data table component that wraps dataview to offer easy paging and sorting</a><br/>
+<a href="DataTableFilterToolbarPage.html">DataTable Example - demonstrates data table component with a FilterToolbar on its data set</a><br/>
<a href="GridViewPage.html">GridView Example - demonstrates a grid view</a><br/>
<a href="AjaxDataTablePage.html">AjaxFallbackDataTable Example - demonstrates an AJAX enabled datatable component</a><br/><br/>
</wicket:link>
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/SortableContactDataProvider.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/SortableContactDataProvider.java b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/SortableContactDataProvider.java
index a5ad7ac..c98948e 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/SortableContactDataProvider.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/repeater/SortableContactDataProvider.java
@@ -16,9 +16,13 @@
*/
package org.apache.wicket.examples.repeater;
+import java.util.ArrayList;
+import java.util.Date;
import java.util.Iterator;
+import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.IModel;
@@ -29,8 +33,10 @@ import org.apache.wicket.model.IModel;
* @author igor
*
*/
-public class SortableContactDataProvider extends SortableDataProvider<Contact, String>
+public class SortableContactDataProvider extends SortableDataProvider<Contact, String> implements IFilterStateLocator<ContactFilter>
{
+ private ContactFilter contactFilter = new ContactFilter();
+
/**
* constructor
*/
@@ -48,7 +54,37 @@ public class SortableContactDataProvider extends SortableDataProvider<Contact, S
@Override
public Iterator<Contact> iterator(long first, long count)
{
- return getContactsDB().find(first, count, getSort()).iterator();
+ List<Contact> contactsFound = getContactsDB().getIndex(getSort());
+
+ return filterContacts(contactsFound).
+ subList((int)first, (int)(first + count)).
+ iterator();
+ }
+
+ private List<Contact> filterContacts(List<Contact> contactsFound)
+ {
+ ArrayList<Contact> result = new ArrayList<>();
+ Date dateFrom = contactFilter.getDateFrom();
+ Date dateTo = contactFilter.getDateTo();
+
+ for (Contact contact : contactsFound)
+ {
+ Date bornDate = contact.getBornDate();
+
+ if(dateFrom != null && bornDate.before(dateFrom))
+ {
+ continue;
+ }
+
+ if(dateTo != null && bornDate.after(dateTo))
+ {
+ continue;
+ }
+
+ result.add(contact);
+ }
+
+ return result;
}
/**
@@ -57,7 +93,7 @@ public class SortableContactDataProvider extends SortableDataProvider<Contact, S
@Override
public long size()
{
- return getContactsDB().getCount();
+ return filterContacts(getContactsDB().getIndex(getSort())).size();
}
/**
@@ -69,4 +105,17 @@ public class SortableContactDataProvider extends SortableDataProvider<Contact, S
return new DetachableContactModel(object);
}
+ @Override
+ public ContactFilter getFilterState()
+ {
+ return contactFilter;
+ }
+
+ @Override
+ public void setFilterState(ContactFilter state)
+ {
+ contactFilter = state;
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/65385880/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/FilterToolbar.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/FilterToolbar.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/FilterToolbar.java
index c27b6fd..62fe752 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/FilterToolbar.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/FilterToolbar.java
@@ -52,19 +52,15 @@ public class FilterToolbar extends AbstractToolbar
* data table this toolbar will be added to
* @param form
* the filter form
- * @param stateLocator
- * locator responsible for finding object used to store filter's state
* @param <T>
* type of filter state object
*
*/
- public <T, S> FilterToolbar(final DataTable<T, S> table, final FilterForm<T> form,
- final IFilterStateLocator<T> stateLocator)
+ public <T, S, F> FilterToolbar(final DataTable<T, S> table, final FilterForm<F> form)
{
super(table);
Args.notNull(table, "table");
- Args.notNull(stateLocator, "stateLocator");
IModel<List<IColumn<T, S>>> model = new AbstractReadOnlyModel<List<IColumn<T,S>>>() {
private static final long serialVersionUID = 1L;