aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatti Tahvonen <matti.tahvonen@itmill.com>2007-09-03 13:03:45 +0000
committerMatti Tahvonen <matti.tahvonen@itmill.com>2007-09-03 13:03:45 +0000
commit815d49e770485ed5dd851f434b95ce82d74c74d3 (patch)
tree8f0bf96a6b6bb13ea1381bfadbd3c32b9f0d1d60
parentaf824f783c571c28384b71e9807dc5beb428fbed (diff)
downloadvaadin-framework-815d49e770485ed5dd851f434b95ce82d74c74d3.tar.gz
vaadin-framework-815d49e770485ed5dd851f434b95ce82d74c74d3.zip
Filter select changes & client side implementation
svn changeset:2171/svn branch:trunk
-rw-r--r--src/com/itmill/toolkit/demo/FilterSelect.java26
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java396
-rw-r--r--src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css1
-rw-r--r--src/com/itmill/toolkit/ui/Select.java286
-rw-r--r--src/com/itmill/toolkit/ui/select/ContainsFilter.java9
-rw-r--r--src/com/itmill/toolkit/ui/select/OptionFilter.java16
-rw-r--r--src/com/itmill/toolkit/ui/select/StartsWithFilter.java72
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();
}
}