Hi Teppo,
I’ve just started to use Vaadin and I find your FilteringTable very useful. Thanks!
But from some reason I can’t get a comboBox as a filter, although I followed your demo’s code.
Puting a breakpoint in generateFilter shows that this method is not accessed by the server at all.
Here’s example code of mine. I’ll be glad for your (or anybody else on the forum) assistance.
Thanks again,
package com.example.vaadintbl;
import javax.servlet.annotation.WebServlet;
import org.tepi.filtertable.FilterTable;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CustomTable.RowHeaderMode;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
@SuppressWarnings("serial")
@Theme("vaadintbl")
public class VaadintblUI extends UI {
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = VaadintblUI.class, widgetset = "com.example.vaadintbl.widgetset.VaadintblWidgetset")
public static class Servlet extends VaadinServlet {
}
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
layout.addComponent(new Label("blah"));
FilterTable filterTable = new FilterTable();
initTable(filterTable);
layout.addComponent(filterTable);
}
/**
* Initialize the FilterTable
* @param filterTable
*/
public void initTable(FilterTable filterTable) {
//filterTable.setfullsize();
filterTable.setWidth("700px");
filterTable.setSelectable(true);
filterTable.setImmediate(true);
filterTable.setMultiSelect(true);
filterTable.setRowHeaderMode(RowHeaderMode.INDEX);
filterTable.setColumnCollapsingAllowed(true);
filterTable.setColumnCollapsed("state", true);
filterTable.setColumnReorderingAllowed(true);
filterTable.addContainerProperty("First Name", String.class, null);
filterTable.addContainerProperty("Last Name", String.class, null);
filterTable.addContainerProperty("Year", Integer.class, null);
filterTable.addContainerProperty("Dead", Boolean.class, null);
/* Add a few items in the filterTable. */
filterTable.addItem(new Object[] {
"Nicolaus","Copernicus",new Integer(1473),new Boolean(true)}, new Integer(1));
filterTable.addItem(new Object[] {
"Tycho", "Brahe", new Integer(1546),new Boolean(false)}, new Integer(2));
filterTable.addItem(new Object[] {
"Giordano","Bruno", new Integer(1548),new Boolean(true)}, new Integer(3));
filterTable.addItem(new Object[] {
"Galileo", "Galilei", new Integer(1564),new Boolean(true)}, new Integer(4));
filterTable.addItem(new Object[] {
"Johannes","Kepler", new Integer(1571),new Boolean(false)}, new Integer(5));
filterTable.addItem(new Object[] {
"Isaac", "Newton", new Integer(1643),new Boolean(true)}, new Integer(6));
filterTable.addItem(new Object[] {
"Nicolaus","Copernicus",new Integer(1473),new Boolean(true)}, new Integer(7));
filterTable.addItem(new Object[] {
"Tycho", "Brahe", new Integer(1546),new Boolean(false)}, new Integer(8));
filterTable.addItem(new Object[] {
"Giordano","Bruno", new Integer(1548),new Boolean(false)}, new Integer(9));
filterTable.addItem(new Object[] {
"Galileo", "Galilei", new Integer(1564),new Boolean(false)}, new Integer(10));
filterTable.addItem(new Object[] {
"Johannes","Kepler", new Integer(1571),new Boolean(true)}, new Integer(11));
filterTable.addItem(new Object[] {
"Isaac", "Newton", new Integer(1643),new Boolean(false)}, new Integer(12));
System.out.println(filterTable.getContainerPropertyIds());
filterTable.setFilterDecorator(new MyFilterDecorator());
filterTable.setFilterGenerator(new MyFilterGenerator());
filterTable.setFilterBarVisible(true);
}
}package com.example.vaadintbl;
import java.io.Serializable;
import org.tepi.filtertable.FilterGenerator;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Or;
import com.vaadin.server.Page;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class MyFilterGenerator implements FilterGenerator, Serializable{
@Override
public Filter generateFilter(Object propertyId, Object value) {
if("Year".equals(propertyId)) {
if(value != null && value instanceof String) {
try {
return new Compare.Equal(propertyId, value);
} catch (Exception e){
e.printStackTrace();
}
}
}
else if ("Dead".equals(propertyId)) {
if(value != null && value instanceof Boolean) {
if (Boolean.TRUE.equals(value)) {
return new Compare.Equal(propertyId, value);
}
else {
return new Or(new Compare.Equal(propertyId, true),
new Compare.Equal(propertyId, false));
}
}
}
return null;
}
@Override
public Filter generateFilter(Object propertyId, Field<?> originatingField) {
// if ("Dead".equals(propertyId)) {
// if(originatingField.getValue() != null && (originatingField.getValue() instanceof Boolean)) {
// if (Boolean.TRUE.equals(originatingField.getValue())) {
// return new Compare.Equal(propertyId, originatingField.getValue());
// }
// else {
// return new Or(new Compare.Equal(propertyId, true),
// new Compare.Equal(propertyId, false));
// }
// }
// }
return null;
}
@Override
public AbstractField<?> getCustomFilterComponent(Object propertyId) {
if ("Dead".equals(propertyId)) {
CheckBox box = new CheckBox();
return box;
}
return null;
}
@Override
public void filterRemoved(Object propertyId) {
Notification n = new Notification("Filter removed from: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public void filterAdded(Object propertyId,
Class<? extends Filter> filterType, Object value) {
Notification n = new Notification("Filter added to: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public Filter filterGeneratorFailed(Exception reason, Object propertyId,
Object value) {
// TODO Auto-generated method stub
return null;
}
}package com.example.vaadintbl;
import java.io.Serializable;
import org.tepi.filtertable.FilterGenerator;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Or;
import com.vaadin.server.Page;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class MyFilterGenerator implements FilterGenerator, Serializable{
@Override
public Filter generateFilter(Object propertyId, Object value) {
if("Year".equals(propertyId)) {
if(value != null && value instanceof String) {
try {
return new Compare.Equal(propertyId, value);
} catch (Exception e){
e.printStackTrace();
}
}
}
else if ("Dead".equals(propertyId)) {
if(value != null && value instanceof Boolean) {
if (Boolean.TRUE.equals(value)) {
return new Compare.Equal(propertyId, value);
}
else {
return new Or(new Compare.Equal(propertyId, true),
new Compare.Equal(propertyId, false));
}
}
}
return null;
}
@Override
public Filter generateFilter(Object propertyId, Field<?> originatingField) {
// if ("Dead".equals(propertyId)) {
// if(originatingField.getValue() != null && (originatingField.getValue() instanceof Boolean)) {
// if (Boolean.TRUE.equals(originatingField.getValue())) {
// return new Compare.Equal(propertyId, originatingField.getValue());
// }
// else {
// return new Or(new Compare.Equal(propertyId, true),
// new Compare.Equal(propertyId, false));
// }
// }
// }
return null;
}
@Override
public AbstractField<?> getCustomFilterComponent(Object propertyId) {
if ("Dead".equals(propertyId)) {
CheckBox box = new CheckBox();
return box;
}
return null;
}
@Override
public void filterRemoved(Object propertyId) {
Notification n = new Notification("Filter removed from: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public void filterAdded(Object propertyId,
Class<? extends Filter> filterType, Object value) {
Notification n = new Notification("Filter added to: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public Filter filterGeneratorFailed(Exception reason, Object propertyId,
Object value) {
// TODO Auto-generated method stub
return null;
}
}package com.example.vaadintbl;
import java.io.Serializable;
import org.tepi.filtertable.FilterGenerator;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Or;
import com.vaadin.server.Page;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class MyFilterGenerator implements FilterGenerator, Serializable{
@Override
public Filter generateFilter(Object propertyId, Object value) {
if("Year".equals(propertyId)) {
if(value != null && value instanceof String) {
try {
return new Compare.Equal(propertyId, value);
} catch (Exception e){
e.printStackTrace();
}
}
}
else if ("Dead".equals(propertyId)) {
if(value != null && value instanceof Boolean) {
if (Boolean.TRUE.equals(value)) {
return new Compare.Equal(propertyId, value);
}
else {
return new Or(new Compare.Equal(propertyId, true),
new Compare.Equal(propertyId, false));
}
}
}
return null;
}
@Override
public Filter generateFilter(Object propertyId, Field<?> originatingField) {
// if ("Dead".equals(propertyId)) {
// if(originatingField.getValue() != null && (originatingField.getValue() instanceof Boolean)) {
// if (Boolean.TRUE.equals(originatingField.getValue())) {
// return new Compare.Equal(propertyId, originatingField.getValue());
// }
// else {
// return new Or(new Compare.Equal(propertyId, true),
// new Compare.Equal(propertyId, false));
// }
// }
// }
return null;
}
@Override
public AbstractField<?> getCustomFilterComponent(Object propertyId) {
if ("Dead".equals(propertyId)) {
CheckBox box = new CheckBox();
return box;
}
return null;
}
@Override
public void filterRemoved(Object propertyId) {
Notification n = new Notification("Filter removed from: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public void filterAdded(Object propertyId,
Class<? extends Filter> filterType, Object value) {
Notification n = new Notification("Filter added to: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public Filter filterGeneratorFailed(Exception reason, Object propertyId,
Object value) {
// TODO Auto-generated method stub
return null;
}
}package com.example.vaadintbl;
import java.io.Serializable;
import org.tepi.filtertable.FilterGenerator;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Or;
import com.vaadin.server.Page;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class MyFilterGenerator implements FilterGenerator, Serializable{
@Override
public Filter generateFilter(Object propertyId, Object value) {
if("Year".equals(propertyId)) {
if(value != null && value instanceof String) {
try {
return new Compare.Equal(propertyId, value);
} catch (Exception e){
e.printStackTrace();
}
}
}
else if ("Dead".equals(propertyId)) {
if(value != null && value instanceof Boolean) {
if (Boolean.TRUE.equals(value)) {
return new Compare.Equal(propertyId, value);
}
else {
return new Or(new Compare.Equal(propertyId, true),
new Compare.Equal(propertyId, false));
}
}
}
return null;
}
@Override
public Filter generateFilter(Object propertyId, Field<?> originatingField) {
// if ("Dead".equals(propertyId)) {
// if(originatingField.getValue() != null && (originatingField.getValue() instanceof Boolean)) {
// if (Boolean.TRUE.equals(originatingField.getValue())) {
// return new Compare.Equal(propertyId, originatingField.getValue());
// }
// else {
// return new Or(new Compare.Equal(propertyId, true),
// new Compare.Equal(propertyId, false));
// }
// }
// }
return null;
}
@Override
public AbstractField<?> getCustomFilterComponent(Object propertyId) {
if ("Dead".equals(propertyId)) {
CheckBox box = new CheckBox();
return box;
}
return null;
}
@Override
public void filterRemoved(Object propertyId) {
Notification n = new Notification("Filter removed from: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public void filterAdded(Object propertyId,
Class<? extends Filter> filterType, Object value) {
Notification n = new Notification("Filter added to: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public Filter filterGeneratorFailed(Exception reason, Object propertyId,
Object value) {
// TODO Auto-generated method stub
return null;
}
}
package com.example.vaadintbl;
import java.io.Serializable;
import org.tepi.filtertable.FilterGenerator;
import com.vaadin.data.Container.Filter;
import com.vaadin.data.util.filter.Compare;
import com.vaadin.data.util.filter.Or;
import com.vaadin.server.Page;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Field;
import com.vaadin.ui.Notification;
@SuppressWarnings("serial")
public class MyFilterGenerator implements FilterGenerator, Serializable{
@Override
public Filter generateFilter(Object propertyId, Object value) {
if("Year".equals(propertyId)) {
if(value != null && value instanceof String) {
try {
return new Compare.Equal(propertyId, value);
} catch (Exception e){
e.printStackTrace();
}
}
}
else if ("Dead".equals(propertyId)) {
if(value != null && value instanceof Boolean) {
if (Boolean.TRUE.equals(value)) {
return new Compare.Equal(propertyId, value);
}
else {
return new Or(new Compare.Equal(propertyId, true),
new Compare.Equal(propertyId, false));
}
}
}
return null;
}
@Override
public Filter generateFilter(Object propertyId, Field<?> originatingField) {
// if ("Dead".equals(propertyId)) {
// if(originatingField.getValue() != null && (originatingField.getValue() instanceof Boolean)) {
// if (Boolean.TRUE.equals(originatingField.getValue())) {
// return new Compare.Equal(propertyId, originatingField.getValue());
// }
// else {
// return new Or(new Compare.Equal(propertyId, true),
// new Compare.Equal(propertyId, false));
// }
// }
// }
return null;
}
@Override
public AbstractField<?> getCustomFilterComponent(Object propertyId) {
if ("Dead".equals(propertyId)) {
CheckBox box = new CheckBox();
return box;
}
return null;
}
@Override
public void filterRemoved(Object propertyId) {
Notification n = new Notification("Filter removed from: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public void filterAdded(Object propertyId,
Class<? extends Filter> filterType, Object value) {
Notification n = new Notification("Filter added to: " + propertyId,
Notification.Type.TRAY_NOTIFICATION);
n.setDelayMsec(800);
n.show(Page.getCurrent());
}
@Override
public Filter filterGeneratorFailed(Exception reason, Object propertyId,
Object value) {
// TODO Auto-generated method stub
return null;
}
}package com.example.vaadintbl;
import java.io.Serializable;
import java.util.Locale;
import org.tepi.filtertable.FilterDecorator;
import org.tepi.filtertable.numberfilter.NumberFilterPopupConfig;
import com.vaadin.server.Resource;
import com.vaadin.shared.ui.datefield.Resolution;
@SuppressWarnings("serial")
public class MyFilterDecorator implements FilterDecorator, Serializable{
@Override
public String getEnumFilterDisplayName(Object propertyId, Object value) {
// TODO Auto-generated method stub
return null;
}
@Override
public Resource getEnumFilterIcon(Object propertyId, Object value) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getBooleanFilterDisplayName(Object propertyId, boolean value) {
// if ("Dead".equals(propertyId)) {
// return value? "Yes" : "No";
// }
return null;
}
@Override
public Resource getBooleanFilterIcon(Object propertyId, boolean value) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isTextFilterImmediate(Object propertyId) {
// TODO Auto-generated method stub
return true;
}
@Override
public int getTextChangeTimeout(Object propertyId) {
// TODO Auto-generated method stub
return 500;
}
@Override
public String getFromCaption() {
return "From: ";
}
@Override
public String getToCaption() {
return "To: ";
}
@Override
public String getSetCaption() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getClearCaption() {
// TODO Auto-generated method stub
return null;
}
@Override
public Resolution getDateFieldResolution(Object propertyId) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDateFormatPattern(Object propertyId) {
// TODO Auto-generated method stub
return null;
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getAllItemsVisibleString() {
return "Show all items";
}
@Override
public NumberFilterPopupConfig getNumberFilterPopupConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean usePopupForNumericProperty(Object propertyId) {
// TODO Auto-generated method stub
return true;
}
}
package com.example.vaadintbl;
import java.io.Serializable;
import java.util.Locale;
import org.tepi.filtertable.FilterDecorator;
import org.tepi.filtertable.numberfilter.NumberFilterPopupConfig;
import com.vaadin.server.Resource;
import com.vaadin.shared.ui.datefield.Resolution;
@SuppressWarnings("serial")
public class MyFilterDecorator implements FilterDecorator, Serializable{
@Override
public String getEnumFilterDisplayName(Object propertyId, Object value) {
// TODO Auto-generated method stub
return null;
}
@Override
public Resource getEnumFilterIcon(Object propertyId, Object value) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getBooleanFilterDisplayName(Object propertyId, boolean value) {
// if ("Dead".equals(propertyId)) {
// return value? "Yes" : "No";
// }
return null;
}
@Override
public Resource getBooleanFilterIcon(Object propertyId, boolean value) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isTextFilterImmediate(Object propertyId) {
// TODO Auto-generated method stub
return true;
}
@Override
public int getTextChangeTimeout(Object propertyId) {
// TODO Auto-generated method stub
return 500;
}
@Override
public String getFromCaption() {
return "From: ";
}
@Override
public String getToCaption() {
return "To: ";
}
@Override
public String getSetCaption() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getClearCaption() {
// TODO Auto-generated method stub
return null;
}
@Override
public Resolution getDateFieldResolution(Object propertyId) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDateFormatPattern(Object propertyId) {
// TODO Auto-generated method stub
return null;
}
@Override
public Locale getLocale() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getAllItemsVisibleString() {
return "Show all items";
}
@Override
public NumberFilterPopupConfig getNumberFilterPopupConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean usePopupForNumericProperty(Object propertyId) {
// TODO Auto-generated method stub
return true;
}
}