From: Matti Tahvonen Date: Tue, 11 Sep 2007 06:54:54 +0000 (+0000) Subject: filterselect now default select, uses browser side filtering if lazyloading not enabled X-Git-Tag: 6.7.0.beta1~6031 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ec49b8176aa3331b1bea1d0382e2e31058d88db6;p=vaadin-framework.git filterselect now default select, uses browser side filtering if lazyloading not enabled svn changeset:2268/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index 70e543199b..30a6a129da 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -3,12 +3,12 @@ package com.itmill.toolkit.terminal.gwt.client; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ui.IButton; +import com.itmill.toolkit.terminal.gwt.client.ui.ICalendar; import com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox; import com.itmill.toolkit.terminal.gwt.client.ui.IComponent; 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; @@ -23,7 +23,6 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar; import com.itmill.toolkit.terminal.gwt.client.ui.IScrollTable; import com.itmill.toolkit.terminal.gwt.client.ui.ISelect; import com.itmill.toolkit.terminal.gwt.client.ui.ISlider; -import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanel; import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelHorizontal; import com.itmill.toolkit.terminal.gwt.client.ui.ISplitPanelVertical; import com.itmill.toolkit.terminal.gwt.client.ui.ITablePaging; @@ -183,10 +182,8 @@ public class DefaultWidgetFactory implements WidgetFactory { 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"; + return "com.itmill.toolkit.terminal.gwt.client.ui.IFilterSelect"; } } else if ("panel".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.IPanel"; diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java index ee1b16f475..918eb5588a 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java @@ -14,7 +14,6 @@ import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.PopupPanel; -import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.client.ui.SuggestOracle.Suggestion; @@ -22,6 +21,10 @@ import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; +/** + * + * TODO needs major refactoring to be easily expandable + */ public class IFilterSelect extends Composite implements Paintable, KeyboardListener, ClickListener { public class FilterSelectSuggestion implements Suggestion, Command { @@ -58,6 +61,8 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe private Element down = DOM.createDiv(); private Element status = DOM.createDiv(); + private boolean isPagingEnabled = true; + SuggestionPopup() { super(true); this.menu = new SuggestionMenu(); @@ -143,9 +148,24 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe } tb.setFocus(true); } + + public void setPagingEnabled(boolean paging) { + if(isPagingEnabled == paging) + return; + if(paging) { + DOM.setStyleAttribute(this.down, "display", "block"); + DOM.setStyleAttribute(this.up, "display", "block"); + DOM.setStyleAttribute(this.status, "display", "block"); + } else { + DOM.setStyleAttribute(this.down, "display", "none"); + DOM.setStyleAttribute(this.up, "display", "none"); + DOM.setStyleAttribute(this.status, "display", "none"); + } + } } public class SuggestionMenu extends MenuBar { + SuggestionMenu() { super(true); setStyleName(CLASSNAME + "-suggestmenu"); @@ -171,11 +191,8 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe if(item != null) { doItemAction(item, true); } - else { - suggestionPopup.hide(); - } + suggestionPopup.hide(); } - } private static final String CLASSNAME = "i-filterselect"; @@ -209,6 +226,10 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe private int totalSuggestions; private FilterSelectSuggestion currentSuggestion; + + private boolean clientSideFiltering; + + private ArrayList allSuggestions; public IFilterSelect() { panel.add(tb); @@ -226,37 +247,70 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe public void filterOptions(int page, String filter) { if (filter.equals(lastFilter) && currentPage == page) { - suggestionPopup.showSuggestions(currentSuggestions, currentPage, totalSuggestions); + if(!suggestionPopup.isAttached()) + suggestionPopup.showSuggestions(currentSuggestions, currentPage, totalSuggestions); return; } if(!filter.equals(lastFilter)) { // we are on subsequant page and text has changed -> reset page page = 0; } - filtering = true; - client.updateVariable(paintableId, "filter", filter, false); - client.updateVariable(paintableId, "page", page, true); - lastFilter = filter; - currentPage = page; + if(clientSideFiltering) { + currentSuggestions.clear(); + for(Iterator it = allSuggestions.iterator();it.hasNext();) { + FilterSelectSuggestion s = (FilterSelectSuggestion) it.next(); + String string = s.getDisplayString().toLowerCase(); + if(string.startsWith(filter.toLowerCase())) { + currentSuggestions.add(s); + } + } + lastFilter = filter; + currentPage = page; + suggestionPopup.showSuggestions(currentSuggestions, page, currentSuggestions.size()); + } else { + filtering = true; + client.updateVariable(paintableId, "filter", filter, false); + client.updateVariable(paintableId, "page", page, true); + lastFilter = filter; + currentPage = page; + } } public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { this.paintableId = uidl.getId(); this.client = client; + if(client.updateComponent(this, uidl, true)) + return; + if(uidl.hasAttribute("immediate")) immediate = true; else immediate = false; + if(uidl.hasVariable("page")) { + this.suggestionPopup.setPagingEnabled(true); + clientSideFiltering = false; + } else { + this.suggestionPopup.setPagingEnabled(false); + clientSideFiltering = true; + } + currentSuggestions.clear(); UIDL options = uidl.getChildUIDL(0); totalSuggestions = options.getIntAttribute("totalMatches"); + if(clientSideFiltering) { + allSuggestions = new ArrayList(); + } for(Iterator i = options.getChildIterator(); i.hasNext();) { UIDL optionUidl = (UIDL) i.next(); FilterSelectSuggestion suggestion = new FilterSelectSuggestion(optionUidl); currentSuggestions.add(suggestion); + if(clientSideFiltering) { + allSuggestions.add(suggestion); + } } + if(filtering && lastFilter.equals(uidl.getStringVariable("filter"))) { suggestionPopup.showSuggestions( currentSuggestions, @@ -317,7 +371,27 @@ public class IFilterSelect extends Composite implements Paintable, KeyboardListe } public void onKeyUp(Widget sender, char keyCode, int modifiers) { - filterOptions(currentPage); + switch (keyCode) { + case KeyboardListener.KEY_ENTER: + case KeyboardListener.KEY_TAB: + ; //NOP + break; + case KeyboardListener.KEY_DOWN: + case KeyboardListener.KEY_UP: + case KeyboardListener.KEY_PAGEDOWN: + case KeyboardListener.KEY_PAGEUP: + if(suggestionPopup.isAttached()) { + break; + } else { + // open popup as from gadget + filterOptions(0, ""); + tb.selectAll(); + break; + } + default: + filterOptions(currentPage); + break; + } } /**