From: Matti Tahvonen Date: Mon, 16 Apr 2007 12:49:41 +0000 (+0000) Subject: fixes #533 and makes possible to change selects (LazyLoading) filtering logic X-Git-Tag: 6.7.0.beta1~6439 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=82294a20e4e625077742da9af6ea647a15c89379;p=vaadin-framework.git fixes #533 and makes possible to change selects (LazyLoading) filtering logic svn changeset:1241/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/ui/Select.java b/src/com/itmill/toolkit/ui/Select.java index 5c66e1463a..7f0e14f17b 100644 --- a/src/com/itmill/toolkit/ui/Select.java +++ b/src/com/itmill/toolkit/ui/Select.java @@ -56,6 +56,8 @@ import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; import com.itmill.toolkit.terminal.Resource; import com.itmill.toolkit.terminal.URIHandler; +import com.itmill.toolkit.ui.select.OptionFilter; +import com.itmill.toolkit.ui.select.StartsWithFilter; /** *

@@ -332,12 +334,14 @@ public class Select extends AbstractField implements Container, } else { // Lazy options loading - target.addAttribute("loadfrom", getApplication().getURL().toString() - + optionsStream.uri); - target.addAttribute("total", (getItemIds() != null) ? getItemIds() - .size() : 0); - target.addAttribute("initial", optionsStream.getJSON(20,0,"")); - target.addAttribute("selectedValue", toString() == null ? "" : toString()); + if(getApplication() != null) { + target.addAttribute("loadfrom", getApplication().getURL().toString() + + optionsStream.uri); + target.addAttribute("total", (getItemIds() != null) ? getItemIds() + .size() : 0); + target.addAttribute("initial", optionsStream.getJSON(20,0,"")); + target.addAttribute("selectedValue", toString() == null ? "" : toString()); + } } target.endTag("options"); @@ -1386,7 +1390,7 @@ public class Select extends AbstractField implements Container, public void setLazyLoading(boolean useLazyLoading) { if (useLazyLoading != isLazyLoading()) { if (useLazyLoading) { - optionsStream = new OptionsStream(); + optionsStream = new OptionsStream(this); if (getApplication() != null) getWindow().addURIHandler(optionsStream); } else { @@ -1418,16 +1422,46 @@ public class Select extends AbstractField implements Container, getWindow().removeURIHandler(optionsStream); super.detach(); } + + public void setOptionFilter(OptionFilter of) { + if(this.optionsStream != null) { + this.optionsStream.setOptionFilter(of); + } + } + + /** + * @return + */ + public OptionFilter getOptionFilter() { + if(this.optionsStream != null) { + return this.optionsStream.getOptionFilter(); + } + return null; + } private class OptionsStream implements URIHandler { private String currentFilter = ""; private ArrayList filteredItemsBuffer = null; + + private OptionFilter of = null; private String uri = "selectOptionsStream" + (long) (Math.random() * 1000000000000000000L); + + OptionsStream(Select s) { + of = new StartsWithFilter(s); + } + public OptionFilter getOptionFilter() { + return of; + } + + public void setOptionFilter(OptionFilter of2) { + of = of2; + } + /** * Handles the given relative URI. * @see com.itmill.toolkit.terminal.URIHandler#handleURI(java.net.URL, java.lang.String) @@ -1495,42 +1529,14 @@ public class Select extends AbstractField implements Container, } /** - * Updates the visible items by given prefix. + * Updates the visible items by given key. * - * @param prefix - * the Filter prefix - * @return All item ids filtered by given prefix. + * @param key + * the key given to OptionFilter + * @return All item ids filtered by given key. */ - public ArrayList filterContent(String prefix) { - // prefix MUST be in lowercase - if ("".equals(prefix)) { - this.filteredItemsBuffer = new ArrayList(getItemIds()); - return this.filteredItemsBuffer; - - } else if (items != null) { - // all items will be iterated and tested. - // SLOW when there are lot of items. - // TODO Should we add - this.filteredItemsBuffer = new ArrayList(); - for (Iterator iter = items.getItemIds().iterator(); iter - .hasNext();) { - Object id = iter.next(); - - Item item = getItem(id); - String test = ""; - if (getItemCaptionMode() == ITEM_CAPTION_MODE_PROPERTY) - test = item.getItemProperty(getItemCaptionPropertyId()) - .getValue().toString().trim(); - else - test = String.valueOf(id); - - if (test.toLowerCase().startsWith(prefix)) { - this.filteredItemsBuffer.add(id); - } - } - } - - return this.filteredItemsBuffer; + public ArrayList filterContent(String key) { + return this.of.filter(key); } private void addToJSONArray(StringBuffer json, ArrayList values) { @@ -1579,4 +1585,5 @@ public class Select extends AbstractField implements Container, return json.toString(); } } + } diff --git a/src/com/itmill/toolkit/ui/select/ContainsFilter.java b/src/com/itmill/toolkit/ui/select/ContainsFilter.java new file mode 100644 index 0000000000..c03542de67 --- /dev/null +++ b/src/com/itmill/toolkit/ui/select/ContainsFilter.java @@ -0,0 +1,48 @@ +package com.itmill.toolkit.ui.select; + +import java.util.ArrayList; +import java.util.Iterator; + +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.ui.Select; + +public class ContainsFilter implements OptionFilter { + private Select s; + + private ArrayList filteredItemsBuffer; + + public ContainsFilter(Select s) { + this.s = s; + } + + + public ArrayList filter(String filterstring) { + // prefix MUST be in lowercase + if ("".equals(filterstring)) { + this.filteredItemsBuffer = new ArrayList(s.getItemIds()); + return this.filteredItemsBuffer; + + } else if (s.getContainerDataSource() != null) { + // all items will be iterated and tested. + // SLOW when there are lot of items. + this.filteredItemsBuffer = new ArrayList(); + for (Iterator iter = s.getItemIds().iterator(); iter + .hasNext();) { + Object id = iter.next(); + + Item item = s.getItem(id); + String test = ""; + if (s.getItemCaptionMode() == Select.ITEM_CAPTION_MODE_PROPERTY) + test = item.getItemProperty(s.getItemCaptionPropertyId()) + .getValue().toString().trim(); + else + test = String.valueOf(id); + + if (test.toLowerCase().contains(filterstring)) { + this.filteredItemsBuffer.add(id); + } + } + } + return this.filteredItemsBuffer; + } +} diff --git a/src/com/itmill/toolkit/ui/select/OptionFilter.java b/src/com/itmill/toolkit/ui/select/OptionFilter.java new file mode 100644 index 0000000000..f9146b90f8 --- /dev/null +++ b/src/com/itmill/toolkit/ui/select/OptionFilter.java @@ -0,0 +1,7 @@ +package com.itmill.toolkit.ui.select; + +import java.util.ArrayList; + +public interface OptionFilter { + public abstract ArrayList filter(String filterstring); +} diff --git a/src/com/itmill/toolkit/ui/select/StartsWithFilter.java b/src/com/itmill/toolkit/ui/select/StartsWithFilter.java new file mode 100644 index 0000000000..62b0ad0e28 --- /dev/null +++ b/src/com/itmill/toolkit/ui/select/StartsWithFilter.java @@ -0,0 +1,47 @@ +package com.itmill.toolkit.ui.select; + +import java.util.ArrayList; +import java.util.Iterator; + +import com.itmill.toolkit.data.Item; +import com.itmill.toolkit.ui.Select; + +public class StartsWithFilter implements OptionFilter { + private Select s; + + public StartsWithFilter(Select s) { + this.s = s; + } + + ArrayList filteredItemsBuffer; + + public ArrayList filter(String filterstring) { + // prefix MUST be in lowercase + if ("".equals(filterstring)) { + this.filteredItemsBuffer = new ArrayList(s.getItemIds()); + return this.filteredItemsBuffer; + + } else if (s.getContainerDataSource() != null) { + // all items will be iterated and tested. + // SLOW when there are lot of items. + this.filteredItemsBuffer = new ArrayList(); + for (Iterator iter = s.getItemIds().iterator(); iter + .hasNext();) { + Object id = iter.next(); + + Item item = s.getItem(id); + String test = ""; + if (s.getItemCaptionMode() == Select.ITEM_CAPTION_MODE_PROPERTY) + test = item.getItemProperty(s.getItemCaptionPropertyId()) + .getValue().toString().trim(); + else + test = String.valueOf(id); + + if (test.toLowerCase().startsWith(filterstring)) { + this.filteredItemsBuffer.add(id); + } + } + } + return this.filteredItemsBuffer; + } +}