it's not a huge feature, but maybe somebody need it too.
This approach understands '%' as any character, and '?' as one character,
and by default renders an '%' to the filter input.
(I can't send as an issue, because 'quota exceed' encounters at attachments.)
Usage:
Code: Select all
<p:column filterBy="#{car.model}" filterMatchMode="wildcard">
Code: Select all
Index: primefaces/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java
===================================================================
--- primefaces.orig/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java 2011-06-16 19:54:35.145039860 +0200
+++ primefaces/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java 2011-06-16 20:38:02.278863715 +0200
@@ -21,6 +21,7 @@
private final static String ENDS_WITH_MATCH_MODE = "endsWith";
private final static String CONTAINS_MATCH_MODE = "contains";
private final static String EXACT_MATCH_MODE = "exact";
+ private final static String WILDCARD_MATCH_MODE = "wildcard";
public FilterConstraint getFilterConstraint() {
String filterMatchMode = getFilterMatchMode();
@@ -34,8 +35,14 @@
filterConstraint = new ContainsFilterConstraint();
} else if(filterMatchMode.equals(EXACT_MATCH_MODE)) {
filterConstraint = new ExactFilterConstraint();
+ } else if(filterMatchMode.equals(WILDCARD_MATCH_MODE)) {
+ filterConstraint = new WildcardFilterConstraint();
}
}
return filterConstraint;
+ }
+
+ public String getEmptyFilterValue() {
+ return WILDCARD_MATCH_MODE.equals(getFilterMatchMode()) ? WildcardFilterConstraint.ANY : "";
}
\ No newline at end of file
Index: primefaces/src/main/java/org/primefaces/model/filter/WildcardFilterConstraint.java
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ primefaces/src/main/java/org/primefaces/model/filter/WildcardFilterConstraint.java 2011-06-16 20:51:32.220051641 +0200
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 Prime Technology.
+ *
+ * Licensed 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.primefaces.model.filter;
+
+import java.util.regex.Pattern;
+
+public class WildcardFilterConstraint implements FilterConstraint {
+ public final static String ANY = "%";
+
+ public boolean applies(String value, String filter) {
+ if (filter.equals(ANY)) return true;
+ String regex = wildcardToRegex(filter.toLowerCase());
+ return Pattern.matches(regex, value.toLowerCase());
+ }
+
+ //stolen from here: http://www.rgagnon.com/javadetails/java-0515.html
+ private String wildcardToRegex(String wildcard){
+ StringBuilder s = new StringBuilder(wildcard.length());
+ s.append('^');
+ for (int i = 0, is = wildcard.length(); i < is; i++) {
+ char c = wildcard.charAt(i);
+ switch(c) {
+ case '%':
+ s.append(".*");
+ break;
+ case '?':
+ s.append(".");
+ break;
+ // escape special regexp-characters
+ case '(': case ')': case '[': case ']': case '$':
+ case '^': case '.': case '{': case '}': case '|': case '*':
+ case '\\':
+ s.append("\\");
+ s.append(c);
+ break;
+ default:
+ s.append(c);
+ break;
+ }
+ }
+ s.append("$");
+ return(s.toString());
+ }
+}
\ No newline at end of file
Index: primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java
===================================================================
--- primefaces.orig/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java 2011-06-16 20:30:41.218216819 +0200
+++ primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java 2011-06-16 20:31:23.678279086 +0200
@@ -325,7 +325,7 @@
if(column.getValueExpression("filterOptions") == null) {
String filterEvent = "on" + column.getFilterEvent();
- String filterValue = params.containsKey(filterId) ? params.get(filterId) : "";
+ String filterValue = params.containsKey(filterId) ? params.get(filterId) : column.getEmptyFilterValue();
writer.startElement("input", null);
writer.writeAttribute("id", filterId, null);