private AbstractField createField(Object property, Class<?> type) {
   AbstractField component = null;
   if (owner.getFilterGenerator() != null) {
     component = owner.getFilterGenerator().getCustomFilterComponent(property);
   }
   if (component != null) {
     customFields.put(component, property);
   } else if (type == null) {
     component = new TextField();
     component.setWidth("100%");
     return component;
   } else if (type == boolean.class || type == Boolean.class) {
     component = createBooleanField(property);
   } else if (type == Integer.class
       || type == Long.class
       || type == Float.class
       || type == Double.class
       || type == int.class
       || type == long.class
       || type == float.class
       || type == double.class) {
     component = createNumericField(type, property);
   } else if (type.isEnum()) {
     component = createEnumField(type, property);
   } else if (type == Date.class || type == Timestamp.class || type == java.sql.Date.class) {
     component = createDateField(property);
   } else {
     component = createTextField(property);
   }
   component.setWidth("100%");
   component.setImmediate(true);
   component.addListener(listener);
   return component;
 }
 void initializeFilterFields() {
   /* Create new filters only if Filterable */
   if (owner.getFilterable() != null) {
     for (Object property : owner.getVisibleColumns()) {
       if (owner.getContainerPropertyIds().contains(property)) {
         AbstractField filter =
             createField(property, owner.getContainerDataSource().getType(property));
         addFilterColumn(property, filter);
       } else {
         addFilterColumn(property, createField(null, null));
       }
     }
   }
 }
 void clearFilterData() {
   /* Remove all filters from container */
   for (Object propertyId : filters.keySet()) {
     owner.getFilterable().removeContainerFilter(filters.get(propertyId));
     if (owner.getFilterGenerator() != null) {
       owner.getFilterGenerator().filterRemoved(propertyId);
     }
   }
   /* Clear the data related to filters */
   customFields.clear();
   filters.clear();
   texts.clear();
   enums.clear();
   booleans.clear();
   dates.clear();
 }
 private AbstractField createBooleanField(Object propertyId) {
   ComboBox booleanSelect = new ComboBox();
   booleanSelect.addItem(true);
   booleanSelect.addItem(false);
   if (owner.getFilterDecorator() != null) {
     /* Add possible 'view all' item */
     if (owner.getFilterDecorator().getAllItemsVisibleString() != null) {
       Object nullItem = booleanSelect.addItem();
       booleanSelect.setNullSelectionItemId(nullItem);
       booleanSelect.setItemCaption(
           nullItem, owner.getFilterDecorator().getAllItemsVisibleString());
     }
     String caption = owner.getFilterDecorator().getBooleanFilterDisplayName(propertyId, true);
     booleanSelect.setItemCaption(true, caption == null ? "true" : caption);
     Resource icon = owner.getFilterDecorator().getBooleanFilterIcon(propertyId, true);
     if (icon != null) {
       booleanSelect.setItemIcon(true, icon);
     }
     caption = owner.getFilterDecorator().getBooleanFilterDisplayName(propertyId, false);
     booleanSelect.setItemCaption(false, caption == null ? "false" : caption);
     icon = owner.getFilterDecorator().getBooleanFilterIcon(propertyId, false);
     if (icon != null) {
       booleanSelect.setItemIcon(false, icon);
     }
   } else {
     booleanSelect.setItemCaption(true, "true");
     booleanSelect.setItemCaption(false, "false");
   }
   booleans.put(booleanSelect, propertyId);
   return booleanSelect;
 }
  private AbstractField createTextField(Object propertyId) {
    final TextField textField = new TextField();
    if (owner.getFilterDecorator() != null) {
      if (owner.getFilterDecorator().isTextFilterImmediate(propertyId)) {
        textField.addListener(
            new TextChangeListener() {

              public void textChange(TextChangeEvent event) {
                textField.setValue(event.getText());
              }
            });
        textField.setTextChangeTimeout(owner.getFilterDecorator().getTextChangeTimeout(propertyId));
      }
      if (owner.getFilterDecorator().getAllItemsVisibleString() != null) {
        textField.setInputPrompt(owner.getFilterDecorator().getAllItemsVisibleString());
      }
    }
    texts.put(textField, propertyId);
    return textField;
  }
 @SuppressWarnings({"rawtypes", "unchecked"})
 private AbstractField createEnumField(Class<?> type, Object propertyId) {
   ComboBox enumSelect = new ComboBox();
   /* Add possible 'view all' item */
   if (owner.getFilterDecorator() != null
       && owner.getFilterDecorator().getAllItemsVisibleString() != null) {
     Object nullItem = enumSelect.addItem();
     enumSelect.setNullSelectionItemId(nullItem);
     enumSelect.setItemCaption(nullItem, owner.getFilterDecorator().getAllItemsVisibleString());
   }
   /* Add items from enumeration */
   for (Object o : EnumSet.allOf((Class<Enum>) type)) {
     enumSelect.addItem(o);
     if (owner.getFilterDecorator() != null) {
       String caption = owner.getFilterDecorator().getEnumFilterDisplayName(propertyId, o);
       enumSelect.setItemCaption(o, caption == null ? o.toString() : caption);
       Resource icon = owner.getFilterDecorator().getEnumFilterIcon(propertyId, o);
       if (icon != null) {
         enumSelect.setItemIcon(o, icon);
       }
     } else {
       enumSelect.setItemCaption(o, o.toString());
     }
   }
   enums.put(enumSelect, propertyId);
   return enumSelect;
 }
  private Filter generateFilter(Property field, Object propertyId, Object value) {
    if (field instanceof DateFilterPopup) {
      /* Handle date filtering */
      DateInterval interval = ((DateFilterPopup) field).getDateValue();
      if (interval == null) {
        /* Date interval is empty -> no filter */
        return null;
      }
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, interval);
        if (newFilter != null) {
          return newFilter;
        }
      }
      Date from = interval.getFrom();
      Date to = interval.getTo();
      if (from != null && to != null) {
        return new Between(propertyId, from, to);
      } else if (from != null) {
        return new Compare.GreaterOrEqual(propertyId, from);
      } else {
        return new Compare.LessOrEqual(propertyId, to);
      }
    } else if (field instanceof NumberFilterPopup) {
      /* Handle number filtering */
      NumberInterval interval = ((NumberFilterPopup) field).getInterval();
      if (interval == null) {
        /* Number interval is empty -> no filter */
        return null;
      }
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, interval);
        if (newFilter != null) {
          return newFilter;
        }
      }
      String ltValue = interval.getLessThanValue();
      String gtValue = interval.getGreaterThanValue();
      String eqValue = interval.getEqualsValue();
      Class<?> clazz = owner.getContainerDataSource().getType(propertyId);
      Method valueOf;

      // We use reflection to get the vaueOf method of the container
      // datatype
      try {
        valueOf = clazz.getMethod("valueOf", String.class);
        if (eqValue != null) {
          return new Compare.Equal(propertyId, valueOf.invoke(clazz, eqValue));
        } else if (ltValue != null && gtValue != null) {
          return new And(
              new Compare.Less(propertyId, valueOf.invoke(clazz, ltValue)),
              new Compare.Greater(propertyId, valueOf.invoke(clazz, gtValue)));
        } else if (ltValue != null) {
          return new Compare.Less(propertyId, valueOf.invoke(clazz, ltValue));
        } else if (gtValue != null) {
          return new Compare.Greater(propertyId, valueOf.invoke(clazz, gtValue));
        } else {
          return null;
        }
      } catch (Exception e) {
        throw new RuntimeException("Creating number filter has failed.", e);
      }
    } else if (value != null && !value.equals("")) {
      /* Handle filtering for other data */
      if (owner.getFilterGenerator() != null) {
        Filter newFilter = owner.getFilterGenerator().generateFilter(propertyId, value);
        if (newFilter != null) {
          return newFilter;
        }
      }
      return new SimpleStringFilter(propertyId, String.valueOf(value), true, false);
    }
    /* Value is null or empty -> no filter */
    return null;
  }
 private AbstractField createNumericField(Class<?> type, Object propertyId) {
   NumberFilterPopup numberFilterPopup = new NumberFilterPopup(owner.getFilterDecorator(), null);
   numbers.put(numberFilterPopup, propertyId);
   return numberFilterPopup;
 }
 private AbstractField createDateField(Object propertyId) {
   DateFilterPopup dateFilterPopup = new DateFilterPopup(owner.getFilterDecorator(), propertyId);
   dates.put(dateFilterPopup, propertyId);
   return dateFilterPopup;
 }
 private void setFilter(Filter filter, Object propertyId) {
   owner.getFilterable().addContainerFilter(filter);
   filters.put(propertyId, filter);
 }
 private void removeFilter(Object propertyId) {
   if (filters.get(propertyId) != null) {
     owner.getFilterable().removeContainerFilter(filters.get(propertyId));
     filters.remove(propertyId);
   }
 }
 private void addFilterColumn(Object propertyId, Component filter) {
   owner.getColumnIdToFilterMap().put(propertyId, filter);
   filter.setParent(owner);
   owner.requestRepaint();
 }