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 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 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;
  }