package com.sksamuel.jqm4gwt.form.elements; import com.google.gwt.dom.client.Element; import com.google.gwt.event.logical.shared.HasAttachHandlers; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; import com.sksamuel.jqm4gwt.JQMCommon; public class JQMFilterableEvent extends GwtEvent<JQMFilterableEvent.Handler> { public interface Handler extends EventHandler { void onBeforeFilter(JQMFilterableEvent event); /** * @return - must return <b>true</b> if the element is to be <b>filtered out</b>. * <br> - must return <b>false</b> if the element is to be <b>shown</b>. * <br> - null means default filtering should be used. * <br> JQMCommon.getTextForFiltering(elt) can be used to get filtering element's text */ Boolean onFiltering(JQMFilterableEvent event); } public static class DefaultHandler implements Handler { @Override public void onBeforeFilter(JQMFilterableEvent event) { } @Override public Boolean onFiltering(JQMFilterableEvent event) { return null; } } /** * @param splitTextForFiltering - regex for splitting item's text (optional, could be null). * @return - false: show, true: filter out. */ public Boolean filterStartWithIgnoreCase(String splitTextForFiltering) { String search = getFilterText(); if (search == null || search.isEmpty()) return null; String s = JQMCommon.getTextForFiltering(getFilteringElt()); if (s == null || s.isEmpty()) return null; if (splitTextForFiltering == null || splitTextForFiltering.isEmpty()) { return !(s.startsWith(search) || s.toLowerCase().startsWith(search.toLowerCase())); } else { String[] arr = s.split(splitTextForFiltering); for (String i : arr) { i = i.trim(); boolean match = i.startsWith(search) || i.toLowerCase().startsWith(search.toLowerCase()); if (match) return false; } return true; } } /** * @return - false: show, true: filter out. */ public Boolean filterStartWithIgnoreCase() { return filterStartWithIgnoreCase(null/*splitTextForFiltering*/); } static Type<JQMFilterableEvent.Handler> TYPE; /** * Fires an {@link JQMFilterableEvent} on all registered handlers in the handler source. * * @param <S> The handler source type * @param source - the source of the handlers */ public static <S extends HasAttachHandlers> void fire(S source, FilterableState filterableState, String filterText) { if (TYPE != null) { JQMFilterableEvent event = new JQMFilterableEvent(filterableState, filterText); source.fireEvent(event); } } public static <S extends HasAttachHandlers> Boolean fire(S source, FilterableState filterableState, String filterText, Element filteringElt, Integer filteringEltIdx) { if (TYPE != null) { JQMFilterableEvent event = new JQMFilterableEvent(filterableState, filterText, filteringElt, filteringEltIdx); source.fireEvent(event); return event.filteringResult; } return null; } public static Type<JQMFilterableEvent.Handler> getType() { if (TYPE == null) { TYPE = new Type<JQMFilterableEvent.Handler>(); } return TYPE; } public enum FilterableState { BEFORE_FILTER, FILTERING } private final FilterableState filterableState; private final String filterText; private final Element filteringElt; private final Integer filteringEltIdx; private Boolean filteringResult; protected JQMFilterableEvent(FilterableState filterableState, String filterText, Element filteringElt, Integer filteringEltIdx) { this.filterableState = filterableState; this.filterText = filterText; this.filteringElt = filteringElt; this.filteringEltIdx = filteringEltIdx; } protected JQMFilterableEvent(FilterableState filterableState, String filterText) { this(filterableState, filterText, null, null); } public FilterableState getFilterableState() { return filterableState; } public String getFilterText() { return filterText; } public Element getFilteringElt() { return filteringElt; } public Integer getFilteringEltIdx() { return filteringEltIdx; } @Override public final Type<JQMFilterableEvent.Handler> getAssociatedType() { return TYPE; } @Override public String toDebugString() { assertLive(); String s = super.toDebugString() + " filterableState = " + filterableState + "; filterText = " + filterText; if (filteringElt != null) { s += "; filteringElt = " + filteringElt.toString() + "; filteringEltIdx = " + filteringEltIdx; } return s; } @Override protected void dispatch(JQMFilterableEvent.Handler handler) { switch (filterableState) { case BEFORE_FILTER: handler.onBeforeFilter(this); break; case FILTERING: filteringResult = handler.onFiltering(this); break; } } }