From 815d49e770485ed5dd851f434b95ce82d74c74d3 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Mon, 3 Sep 2007 13:03:45 +0000 Subject: [PATCH] Filter select changes & client side implementation svn changeset:2171/svn branch:trunk --- src/com/itmill/toolkit/demo/FilterSelect.java | 26 +- .../gwt/client/DefaultWidgetFactory.java | 396 +++++++++--------- .../public/component-themes/collection.css | 1 + src/com/itmill/toolkit/ui/Select.java | 286 +++---------- .../toolkit/ui/select/ContainsFilter.java | 9 +- .../toolkit/ui/select/OptionFilter.java | 16 +- .../toolkit/ui/select/StartsWithFilter.java | 72 ++-- 7 files changed, 357 insertions(+), 449 deletions(-) diff --git a/src/com/itmill/toolkit/demo/FilterSelect.java b/src/com/itmill/toolkit/demo/FilterSelect.java index a28782cfc8..ce599ae65f 100644 --- a/src/com/itmill/toolkit/demo/FilterSelect.java +++ b/src/com/itmill/toolkit/demo/FilterSelect.java @@ -2,9 +2,13 @@ package com.itmill.toolkit.demo; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import com.itmill.toolkit.data.Item; -import com.itmill.toolkit.ui.*; +import com.itmill.toolkit.ui.OrderedLayout; +import com.itmill.toolkit.ui.Panel; +import com.itmill.toolkit.ui.Select; +import com.itmill.toolkit.ui.Window; import com.itmill.toolkit.ui.select.ContainsFilter; import com.itmill.toolkit.ui.select.OptionFilter; @@ -48,12 +52,13 @@ public class FilterSelect extends com.itmill.toolkit.Application { // default filter Select s1 = new Select(); - for (int i = 0; i < 500; i++) + for (int i = 0; i < 105; i++) s1 .addItem(firstnames[(int) (Math.random() * (firstnames.length - 1))] + " " + lastnames[(int) (Math.random() * (lastnames.length - 1))]); s1.setLazyLoading(true); + s1.setImmediate(true); // contains filter Select s2 = new Select(); @@ -84,12 +89,12 @@ public class FilterSelect extends com.itmill.toolkit.Application { Panel panel3 = new Panel("Select with custom 'EndsWith' filter"); panel1.addComponent(s1); - panel2.addComponent(s2); - panel3.addComponent(s3); +// panel2.addComponent(s2); +// panel3.addComponent(s3); orderedLayout.addComponent(panel1); - orderedLayout.addComponent(panel2); - orderedLayout.addComponent(panel3); +// orderedLayout.addComponent(panel2); +// orderedLayout.addComponent(panel3); main.addComponent(orderedLayout); } @@ -109,9 +114,9 @@ public class FilterSelect extends com.itmill.toolkit.Application { this.s = s; } - public ArrayList filter(String filterstring) { + public List filter(String filterstring, int pagelength, int page) { // prefix MUST be in lowercase - if ("".equals(filterstring)) { + if (filterstring == null || "".equals(filterstring)) { this.filteredItemsBuffer = new ArrayList(s.getItemIds()); return this.filteredItemsBuffer; @@ -138,6 +143,11 @@ public class FilterSelect extends com.itmill.toolkit.Application { } return this.filteredItemsBuffer; } + + public int getMatchCount() { + // TODO Auto-generated method stub + return 0; + } } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index 3b0143e411..70e543199b 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -9,6 +9,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout; import com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar; import com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded; import com.itmill.toolkit.terminal.gwt.client.ui.ICalendar; +import com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect; import com.itmill.toolkit.terminal.gwt.client.ui.IForm; import com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout; import com.itmill.toolkit.terminal.gwt.client.ui.ILabel; @@ -39,209 +40,214 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IWindow; public class DefaultWidgetFactory implements WidgetFactory { - public Widget createWidget(UIDL uidl) { + public Widget createWidget(UIDL uidl) { - String className = resolveWidgetTypeName(uidl); + String className = resolveWidgetTypeName(uidl); - if ("com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox" - .equals(className)) { - return new ICheckBox(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IButton" - .equals(className)) { - return new IButton(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IView" - .equals(className)) { - // TODO remove IView? - return new IView(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IWindow" - .equals(className)) { - return new IWindow(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical" - .equals(className)) { - return new IOrderedLayoutVertical(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal" - .equals(className)) { - return new IOrderedLayoutHorizontal(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILabel" - .equals(className)) { - return new ILabel(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILink" - .equals(className)) { - return new ILink(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout" - .equals(className)) { - return new IGridLayout(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITree" - .equals(className)) { - return new ITree(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup" - .equals(className)) { - return new IOptionGroup(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect" - .equals(className)) { - return new ITwinColSelect(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISelect" - .equals(className)) { - return new ISelect(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPanel" - .equals(className)) { - return new IPanel(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IComponent" - .equals(className)) { - return new IComponent(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet" - .equals(className)) { - return new ITabsheet(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded" - .equals(className)) { - return new IEmbedded(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout" - .equals(className)) { - return new ICustomLayout(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextArea" - .equals(className)) { - return new ITextArea(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField" - .equals(className)) { - return new IPasswordField(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextField" - .equals(className)) { - return new ITextField(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging" - .equals(className)) { - return new ITablePaging(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable" - .equals(className)) { - return new IScrollTable(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar" - .equals(className)) { - return new IDateFieldCalendar(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendar" - .equals(className)) { - return new ICalendar(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate" - .equals(className)) { - return new ITextualDate(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar" - .equals(className)) { - return new IPopupCalendar(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISlider" - .equals(className)) { - return new ISlider(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IForm" - .equals(className)) { - return new IForm(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IUpload" - .equals(className)) { - return new IUpload(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal" - .equals(className)) { - return new ISplitPanelHorizontal(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical" - .equals(className)) { - return new ISplitPanelVertical(); - } - return new IUnknownComponent(); + if ("com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox" + .equals(className)) { + return new ICheckBox(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IButton" + .equals(className)) { + return new IButton(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IView" + .equals(className)) { + // TODO remove IView? + return new IView(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IWindow" + .equals(className)) { + return new IWindow(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical" + .equals(className)) { + return new IOrderedLayoutVertical(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal" + .equals(className)) { + return new IOrderedLayoutHorizontal(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILabel" + .equals(className)) { + return new ILabel(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ILink" + .equals(className)) { + return new ILink(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout" + .equals(className)) { + return new IGridLayout(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITree" + .equals(className)) { + return new ITree(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup" + .equals(className)) { + return new IOptionGroup(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect" + .equals(className)) { + return new ITwinColSelect(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISelect" + .equals(className)) { + return new ISelect(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPanel" + .equals(className)) { + return new IPanel(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IComponent" + .equals(className)) { + return new IComponent(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet" + .equals(className)) { + return new ITabsheet(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded" + .equals(className)) { + return new IEmbedded(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout" + .equals(className)) { + return new ICustomLayout(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextArea" + .equals(className)) { + return new ITextArea(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField" + .equals(className)) { + return new IPasswordField(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextField" + .equals(className)) { + return new ITextField(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging" + .equals(className)) { + return new ITablePaging(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable" + .equals(className)) { + return new IScrollTable(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar" + .equals(className)) { + return new IDateFieldCalendar(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendar" + .equals(className)) { + return new ICalendar(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate" + .equals(className)) { + return new ITextualDate(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar" + .equals(className)) { + return new IPopupCalendar(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISlider" + .equals(className)) { + return new ISlider(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IForm" + .equals(className)) { + return new IForm(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IUpload" + .equals(className)) { + return new IUpload(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal" + .equals(className)) { + return new ISplitPanelHorizontal(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical" + .equals(className)) { + return new ISplitPanelVertical(); + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect" + .equals(className)) { + return new IFilterSelect(); + } + return new IUnknownComponent(); - /* - * TODO: Class based impl, use when GWT supports return - * (Widget)GWT.create(resolveWidgetClass(uidl)); - */ - } + /* + * TODO: Class based impl, use when GWT supports return + * (Widget)GWT.create(resolveWidgetClass(uidl)); + */ + } - private String resolveWidgetTypeName(UIDL uidl) { + private String resolveWidgetTypeName(UIDL uidl) { - String tag = uidl.getTag(); - if ("button".equals(tag)) { - if ("switch".equals(uidl.getStringAttribute("type"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox"; - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.IButton"; - } - } else if ("window".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IWindow"; - } else if ("orderedlayout".equals(tag)) { - if ("horizontal".equals(uidl.getStringAttribute("orientation"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal"; - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical"; - } - } else if ("label".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ILabel"; - } else if ("link".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ILink"; - } else if ("gridlayout".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout"; - } else if ("tree".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITree"; - } else if ("select".equals(tag)) { - if ("optiongroup".equals(uidl.getStringAttribute("style"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup"; - } else if ("twincol".equals(uidl.getStringAttribute("style"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect"; - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.ISelect"; - } - } else if ("panel".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IPanel"; - } else if ("component".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IComponent"; - } else if ("tabsheet".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet"; - } else if ("embedded".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded"; - } else if ("customlayout".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout"; - } else if ("textfield".equals(tag)) { - if (uidl.hasAttribute("multiline")) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITextArea"; - } else if (uidl.getBooleanAttribute("secret")) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField"; - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITextField"; - } - } else if ("table".equals(tag)) { - if (uidl.hasAttribute("style")) { - if ("paging".equals(uidl.getStringAttribute("style"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging"; - } - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable"; - } - } else if ("datefield".equals(tag)) { - if (uidl.hasAttribute("style")) { - if ("calendar".equals(uidl.getStringAttribute("style"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"; - } else if ("text".equals(uidl.getStringAttribute("style"))) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate"; + String tag = uidl.getTag(); + if ("button".equals(tag)) { + if ("switch".equals(uidl.getStringAttribute("type"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IButton"; + } + } else if ("window".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IWindow"; + } else if ("orderedlayout".equals(tag)) { + if ("horizontal".equals(uidl.getStringAttribute("orientation"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutHorizontal"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IOrderedLayoutVertical"; + } + } else if ("label".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ILabel"; + } else if ("link".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ILink"; + } else if ("gridlayout".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout"; + } else if ("tree".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITree"; + } else if ("select".equals(tag)) { + if ("optiongroup".equals(uidl.getStringAttribute("style"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup"; + } else if ("twincol".equals(uidl.getStringAttribute("style"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITwinColSelect"; + } else if (uidl.hasVariable("page")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISelect"; + } + } else if ("panel".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IPanel"; + } else if ("component".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IComponent"; + } else if ("tabsheet".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet"; + } else if ("embedded".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded"; + } else if ("customlayout".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout"; + } else if ("textfield".equals(tag)) { + if (uidl.hasAttribute("multiline")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITextArea"; + } else if (uidl.getBooleanAttribute("secret")) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField"; + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITextField"; + } + } else if ("table".equals(tag)) { + if (uidl.hasAttribute("style")) { + if ("paging".equals(uidl.getStringAttribute("style"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging"; + } + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable"; + } + } else if ("datefield".equals(tag)) { + if (uidl.hasAttribute("style")) { + if ("calendar".equals(uidl.getStringAttribute("style"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"; + } else if ("text".equals(uidl.getStringAttribute("style"))) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate"; + } + } else { + return "com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar"; + } + } else if ("calendarfield".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"; + } else if ("slider".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISlider"; + } else if ("form".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IForm"; + } else if ("upload".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.IUpload"; + } else if ("hsplitpanel".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal"; + } else if ("vsplitpanel".equals(tag)) { + return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical"; } - } else { - return "com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar"; - } - } else if ("calendarfield".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"; - } else if ("slider".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ISlider"; - } else if ("form".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IForm"; - } else if ("upload".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IUpload"; - } else if ("hsplitpanel".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal"; - } else if ("vsplitpanel".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical"; - } - return "com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent"; + return "com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent"; - /* - * TODO: use class based impl when GWT supports it - */ - } + /* + * TODO: use class based impl when GWT supports it + */ + } - public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl) { - return GWT.getTypeName(currentWidget).equals( - resolveWidgetTypeName(uidl)); - } + public boolean isCorrectImplementation(Widget currentWidget, UIDL uidl) { + return GWT.getTypeName(currentWidget).equals( + resolveWidgetTypeName(uidl)); + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css index db140e966f..f3145a8b7d 100644 --- a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css +++ b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css @@ -10,4 +10,5 @@ @import "caption/css/caption.css"; @import "tree/css/tree.css"; @import "splitpanel/css/splitpanel.css"; +@import "filterselect/css/filterselect.css"; diff --git a/src/com/itmill/toolkit/ui/Select.java b/src/com/itmill/toolkit/ui/Select.java index d53a3e3480..e49002e8a0 100644 --- a/src/com/itmill/toolkit/ui/Select.java +++ b/src/com/itmill/toolkit/ui/Select.java @@ -198,7 +198,7 @@ public class Select extends AbstractField implements Container, * enabled with setOptionsLoadingLazy(true). * */ - private OptionsStream optionsStream = null; +// private OptionsStream optionsStream = null; /** * Number of options to stream per request ('page size') when lazyLoading @@ -206,6 +206,14 @@ public class Select extends AbstractField implements Container, */ private int lazyLoadingPageLength = 20; + private OptionFilter optionFilter; + + private boolean isLazyLoading; + + private int page; + + private String filterstring; + /* Constructors ********************************************************* */ /** @@ -270,7 +278,7 @@ public class Select extends AbstractField implements Container, // Paints field properties super.paintContent(target); - + // Paints select attributes if (isMultiSelect()) target.addAttribute("selectmode", "multi"); @@ -289,9 +297,9 @@ public class Select extends AbstractField implements Container, target.startTag("options"); // TODO Also use conventional rendering if lazy loading is not supported // by terminal - if (!isLazyLoading()) { - int keyIndex = 0; + int keyIndex = 0; + if (!isLazyLoading()) { // Support for external null selection item id Collection ids = getItemIds(); if (getNullSelectionItemId() != null @@ -316,46 +324,38 @@ public class Select extends AbstractField implements Container, } target.endTag("so"); } - - // Paints the available selection options from data source - for (Iterator i = getItemIds().iterator(); i.hasNext();) { - - // Gets the option attribute values - Object id = i.next(); - String key = itemIdMapper.key(id); - String caption = getItemCaption(id); - Resource icon = getItemIcon(id); - - // Paints the option - target.startTag("so"); - if (icon != null) - target.addAttribute("icon", icon); - target.addAttribute("caption", caption); - if (id != null && id.equals(getNullSelectionItemId())) - target.addAttribute("nullselection", true); - target.addAttribute("key", key); - if (isSelected(id) && keyIndex < selectedKeys.length) { - target.addAttribute("selected", true); - selectedKeys[keyIndex++] = key; - } - target.endTag("so"); - } + } + + Iterator i; + if(isLazyLoading()) { + i = optionFilter.filter(filterstring, lazyLoadingPageLength, page).iterator(); + target.addAttribute("totalMatches", optionFilter.getMatchCount()); } else { + i = getItemIds().iterator(); + } - // Lazy options loading - if (getApplication() != null) { - target.addAttribute("loadfrom", getApplication().getURL() - .toString() - + optionsStream.uri); - target.addAttribute("total", - (getItemIds() != null) ? getItemIds().size() : 0); - target - .addAttribute("initial", optionsStream.getJSON(this.lazyLoadingPageLength, 0, - "")); - String caption = getItemCaption(getValue()); - target.addAttribute("selectedValue", caption == null ? "" - : caption); + // Paints the available selection options from data source + while (i.hasNext()) { + + // Gets the option attribute values + Object id = i.next(); + String key = itemIdMapper.key(id); + String caption = getItemCaption(id); + Resource icon = getItemIcon(id); + + // Paints the option + target.startTag("so"); + if (icon != null) + target.addAttribute("icon", icon); + target.addAttribute("caption", caption); + if (id != null && id.equals(getNullSelectionItemId())) + target.addAttribute("nullselection", true); + target.addAttribute("key", key); + if (isSelected(id) && keyIndex < selectedKeys.length) { + target.addAttribute("selected", true); + selectedKeys[keyIndex++] = key; } + target.endTag("so"); } target.endTag("options"); @@ -363,6 +363,10 @@ public class Select extends AbstractField implements Container, target.addVariable(this, "selected", selectedKeys); if (isNewItemsAllowed()) target.addVariable(this, "newitem", ""); + if(isLazyLoading()) { + target.addVariable(this, "filter", filterstring); + target.addVariable(this, "page", page); + } } /** @@ -372,6 +376,14 @@ public class Select extends AbstractField implements Container, * java.util.Map) */ public void changeVariables(Object source, Map variables) { + String newFilter; + if( (newFilter = (String) variables.get("filter")) != null) { + // this is a filter request + page = ((Integer) variables.get("page")).intValue(); + filterstring = newFilter; + requestRepaint(); + return; + } // Try to set the property value @@ -1442,24 +1454,16 @@ public class Select extends AbstractField implements Container, // TODO javadoc public boolean isLazyLoading() { - return optionsStream != null; + return isLazyLoading; } // TODO javadoc // TODO What to do when terminal does not support lazy loading? public void setLazyLoading(boolean useLazyLoading) { - if (useLazyLoading != isLazyLoading()) { - if (useLazyLoading) { - optionsStream = new OptionsStream(this); - Application app = getApplication(); - if (app != null) - app.getMainWindow().addURIHandler(optionsStream); - } else { - if (getApplication() != null) - getWindow().removeURIHandler(optionsStream); - optionsStream = null; - } - + if (useLazyLoading != isLazyLoading) { + isLazyLoading = useLazyLoading; + if(getOptionFilter() == null) + setOptionFilter(new StartsWithFilter(this)); requestRepaint(); } } @@ -1471,8 +1475,6 @@ public class Select extends AbstractField implements Container, */ public void attach() { super.attach(); - if (optionsStream != null) - getApplication().getMainWindow().addURIHandler(optionsStream); } /** @@ -1481,177 +1483,25 @@ public class Select extends AbstractField implements Container, * @see com.itmill.toolkit.ui.AbstractComponent#detach() */ public void detach() { - if (optionsStream != null) - getWindow().removeURIHandler(optionsStream); super.detach(); } + /** + * Sets OptionFilter which will do filtering base on query string + * if Select is in lazy loading mode. + * + * @param of + * OptionFilter to be used in filtering + */ public void setOptionFilter(OptionFilter of) { - if (this.optionsStream != null) { - this.optionsStream.setOptionFilter(of); - } + optionFilter = of; } /** - * @return + * @return reference to option filter */ public OptionFilter getOptionFilter() { - if (this.optionsStream != null) { - return this.optionsStream.getOptionFilter(); - } - return null; + return optionFilter; } - - 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 select) { - of = new StartsWithFilter(select); - } - - 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) - */ - public DownloadStream handleURI(URL context, String relativeUri) { - - if (!"".equals(uri)) { - DownloadStream ds = null; - - if (relativeUri.indexOf(uri + "/feedMoreItems/") != -1) { // this - // feed visible items - int i = 0; - String index = relativeUri.substring(relativeUri - .lastIndexOf("/") + 1); - try { - i = Integer.parseInt(index); - } catch (NumberFormatException e) { - // ignore - } - // TODO Req size from client? - ds = createDownloadStream(lazyLoadingPageLength, i, ""); - return ds; - - } else if (relativeUri.indexOf(uri) != -1) { - - // TODO support '/' character in prefix. - // read prefix - String prefix = relativeUri.substring(relativeUri - .lastIndexOf("/") + 1); - // TODO Req size from client? - ds = createDownloadStream(lazyLoadingPageLength, 0, prefix.trim()); - return ds; - } - } - return null; - } - - /** - * Creates the DownloadStream for response. - * - * @param size - * the Items to be return. - * @param first - * @param filter - * @return the new DownloadStream. - */ - public DownloadStream createDownloadStream(int size, int first, - String filter) { - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - OutputStreamWriter osw = new OutputStreamWriter(os, Charset - .forName("utf-8")); - - // JSONObject json = createJSONObject(visibleitems); - String json = getJSON(size, first, filter); - try { - osw.write(json); - osw.flush(); - os.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - DownloadStream ds = new DownloadStream(new ByteArrayInputStream(os - .toByteArray()), "text/plain;charset=utf-8", "options.js"); - return ds; - } - - /** - * Updates the visible items by given key. - * - * @param key - * the key given to OptionFilter - * @return All item ids filtered by given key. - */ - public ArrayList filterContent(String key) { - return this.of.filter(key); - } - - private void addToJSONArray(StringBuffer json, ArrayList values) { - for (int i = 0; i < values.size(); i++) - json.append((i > 0 ? "," : "") + '"' + values.get(i).toString() - + '"'); - } - - private String getJSON(int size, int first, String filter) { - - // Refilter options, if needed - if ("".equals(filter) || !currentFilter.equals(filter) || filteredItemsBuffer == null) { - filteredItemsBuffer = filterContent(filter); - currentFilter = filter; - } - - // Creates list of shown options - ArrayList keys = new ArrayList(); - ArrayList values = new ArrayList(); - - for (int i = first; i < first + size - && i < filteredItemsBuffer.size(); i++) { - Object id = filteredItemsBuffer.get(i); - Item item = getItem(id); - keys.add(Select.this.itemIdMapper.key(id)); - if (getItemCaptionMode() == ITEM_CAPTION_MODE_PROPERTY) - try { - values.add(URLEncoder.encode(item.getItemProperty( - getItemCaptionPropertyId()).getValue() - .toString(), "ISO-8859-1")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - else - values.add(String.valueOf(id)); - } - - // Constructs JSON format for response - StringBuffer json = new StringBuffer(); - json.append("{\"keys\":["); - addToJSONArray(json, keys); - json.append("],\"total\":" + this.filteredItemsBuffer.size()); - json.append(",\"values\":["); - addToJSONArray(json, values); - json.append("]}"); - - return json.toString(); - } - } - } diff --git a/src/com/itmill/toolkit/ui/select/ContainsFilter.java b/src/com/itmill/toolkit/ui/select/ContainsFilter.java index 86130d46cb..a73c361479 100644 --- a/src/com/itmill/toolkit/ui/select/ContainsFilter.java +++ b/src/com/itmill/toolkit/ui/select/ContainsFilter.java @@ -2,6 +2,7 @@ package com.itmill.toolkit.ui.select; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import com.itmill.toolkit.data.Item; import com.itmill.toolkit.ui.Select; @@ -15,9 +16,9 @@ public class ContainsFilter implements OptionFilter { this.s = s; } - public ArrayList filter(String filterstring) { + public List filter(String filterstring, int pageLength, int page) { // prefix MUST be in lowercase - if ("".equals(filterstring)) { + if (filterstring == null || "".equals(filterstring)) { this.filteredItemsBuffer = new ArrayList(s.getItemIds()); return this.filteredItemsBuffer; @@ -43,4 +44,8 @@ public class ContainsFilter implements OptionFilter { } return this.filteredItemsBuffer; } + + public int getMatchCount() { + return filteredItemsBuffer.size(); + } } diff --git a/src/com/itmill/toolkit/ui/select/OptionFilter.java b/src/com/itmill/toolkit/ui/select/OptionFilter.java index f9146b90f8..7f953829f9 100644 --- a/src/com/itmill/toolkit/ui/select/OptionFilter.java +++ b/src/com/itmill/toolkit/ui/select/OptionFilter.java @@ -1,7 +1,19 @@ package com.itmill.toolkit.ui.select; -import java.util.ArrayList; +import java.util.List; public interface OptionFilter { - public abstract ArrayList filter(String filterstring); + /** + * + * @param filterstring string to use in filtering + * @return List of filtered item id's + */ + public List filter(String filterstring, int pageLength, int page); + + /** + * Returns total matches in last filtering process + * + * @return + */ + public int getMatchCount(); } diff --git a/src/com/itmill/toolkit/ui/select/StartsWithFilter.java b/src/com/itmill/toolkit/ui/select/StartsWithFilter.java index 753b85ecb5..1ceba53559 100644 --- a/src/com/itmill/toolkit/ui/select/StartsWithFilter.java +++ b/src/com/itmill/toolkit/ui/select/StartsWithFilter.java @@ -2,6 +2,7 @@ package com.itmill.toolkit.ui.select; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import com.itmill.toolkit.data.Item; import com.itmill.toolkit.ui.Select; @@ -15,32 +16,55 @@ public class StartsWithFilter implements OptionFilter { 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); + private String prevFilter; + + public List filter(String filterstring, int pageLength, int page) { + if(filterstring == null) { + filterstring = ""; + } + if(this.prevFilter != filterstring || filteredItemsBuffer == null) { + if ("".equals(filterstring)) { + this.filteredItemsBuffer = new ArrayList(s.getItemIds()); + } else if (s.getContainerDataSource() != null) { + // prefix MUST be in lowercase + filterstring = filterstring.toLowerCase(); + + // 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; + + prevFilter = filterstring; + + if(filteredItemsBuffer.size() > pageLength) { + int first = page*pageLength; + int last = first + pageLength; + if(filteredItemsBuffer.size() < last) { + last = filteredItemsBuffer.size(); + } + return filteredItemsBuffer.subList(first, last); + } else { + return filteredItemsBuffer; + } + } + + public int getMatchCount() { + return filteredItemsBuffer.size(); } } -- 2.39.5