From a0b0979d068f9db46615def52c7c240bbbbd2646 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Fri, 14 Mar 2008 13:48:04 +0000 Subject: [PATCH] fixed lots of ComboBox bugs + cleaned the code svn changeset:4054/svn branch:trunk --- .../terminal/gwt/client/ui/IFilterSelect.java | 76 +++++++------------ src/com/itmill/toolkit/ui/Select.java | 70 +++++++++-------- 2 files changed, 68 insertions(+), 78 deletions(-) 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 4d30cb11e5..7cafd76e64 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IFilterSelect.java @@ -146,8 +146,9 @@ public class IFilterSelect extends Composite implements Paintable, // nullsel not counted, as requested by user DOM.setInnerText(status, (totalSuggestions == 0 ? 0 : first) + "-" - + (nullSelectionAllowed && currentPage == 0 ? last - 1 - : last) + "/" + matches); + + ("".equals(lastFilter) && nullSelectionAllowed + && currentPage == 0 ? last - 1 : last) + "/" + + matches); } else { DOM.setInnerText(status, ""); } @@ -200,8 +201,8 @@ public class IFilterSelect extends Composite implements Paintable, .getText().length() - lastFilter.length()); - } else if (!clientSideFiltering && hasNextPage()) { - filterOptions(currentPage + 1); + } else if (hasNextPage()) { + filterOptions(currentPage + 1, lastFilter); } } @@ -218,7 +219,7 @@ public class IFilterSelect extends Composite implements Paintable, - lastFilter.length()); } else if (index == -1) { if (currentPage > 0) { - filterOptions(currentPage - 1); + filterOptions(currentPage - 1, lastFilter); } } else { final MenuItem newSelectedItem = (MenuItem) menu.getItems() @@ -450,9 +451,6 @@ public class IFilterSelect extends Composite implements Paintable, private FilterSelectSuggestion currentSuggestion; - private boolean clientSideFiltering; - - private ArrayList allSuggestions; private int totalMatches; private boolean allowNewItem; private boolean nullSelectionAllowed; @@ -499,29 +497,19 @@ public class IFilterSelect extends Composite implements Paintable, } if (!filter.equals(lastFilter)) { // we are on subsequent page and text has changed -> reset page - page = 0; - } - if (clientSideFiltering) { - currentSuggestions.clear(); - for (final Iterator it = allSuggestions.iterator(); it.hasNext();) { - final FilterSelectSuggestion s = (FilterSelectSuggestion) it - .next(); - final String string = s.getDisplayString().toLowerCase(); - if (string.startsWith(filter.toLowerCase())) { - currentSuggestions.add(s); - } + if ("".equals(filter)) { + // let server decide + page = -1; + } else { + page = 0; } - 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; } + + 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) { @@ -544,18 +532,14 @@ public class IFilterSelect extends Composite implements Paintable, nullSelectionAllowed = uidl.hasAttribute("nullselect"); + currentPage = uidl.getIntVariable("page"); + if (uidl.hasAttribute(ATTR_EMPTYTEXT)) { // "emptytext" changed from server emptyText = uidl.getStringAttribute(ATTR_EMPTYTEXT); } - if (true) { - suggestionPopup.setPagingEnabled(true); - clientSideFiltering = false; - } else { - suggestionPopup.setPagingEnabled(false); - clientSideFiltering = true; - } + suggestionPopup.setPagingEnabled(true); allowNewItem = uidl.hasAttribute("allownewitem"); @@ -564,20 +548,16 @@ public class IFilterSelect extends Composite implements Paintable, totalMatches = uidl.getIntAttribute("totalMatches"); String captions = emptyText; - if (clientSideFiltering) { - allSuggestions = new ArrayList(); - } for (final Iterator i = options.getChildIterator(); i.hasNext();) { final UIDL optionUidl = (UIDL) i.next(); final FilterSelectSuggestion suggestion = new FilterSelectSuggestion( optionUidl); currentSuggestions.add(suggestion); - if (clientSideFiltering) { - allSuggestions.add(suggestion); - } - if (!filtering && optionUidl.hasAttribute("selected")) { - tb.setText(suggestion.getReplacementString()); + if (optionUidl.hasAttribute("selected")) { + if (!filtering) { + tb.setText(suggestion.getReplacementString()); + } currentSuggestion = suggestion; } @@ -632,7 +612,7 @@ public class IFilterSelect extends Composite implements Paintable, selectedOptionKey = newKey; client.updateVariable(paintableId, "selected", new String[] { selectedOptionKey }, immediate); - lastFilter = tb.getText(); + // currentPage = -1; // forget the page } suggestionPopup.hide(); } @@ -694,7 +674,8 @@ public class IFilterSelect extends Composite implements Paintable, break; } else { // open popup as from gadget - filterOptions(0, ""); + filterOptions(-1, ""); + lastFilter = ""; tb.selectAll(); break; } @@ -714,7 +695,8 @@ public class IFilterSelect extends Composite implements Paintable, // Popup's // auto close feature if (!suggestionPopup.isJustClosed()) { - filterOptions(0, ""); + filterOptions(-1, ""); + lastFilter = ""; } DOM.eventPreventDefault(DOM.eventGetCurrentEvent()); tb.setFocus(true); diff --git a/src/com/itmill/toolkit/ui/Select.java b/src/com/itmill/toolkit/ui/Select.java index 41b203f4b5..09e91104b8 100644 --- a/src/com/itmill/toolkit/ui/Select.java +++ b/src/com/itmill/toolkit/ui/Select.java @@ -45,7 +45,7 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { private int columns = 0; // Current page when the user is 'paging' trough options - private int currentPage; + private int currentPage = -1; private int filteringMode = FILTERINGMODE_STARTSWITH; @@ -144,6 +144,15 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { target.startTag("options"); + if (currentPage < 0) { + optionRequest = false; + currentPage = 0; + filterstring = ""; + } + + List options = getFilteredOptions(); + options = sanitetizeList(options, needNullSelectOption); + final boolean paintNullSelection = needNullSelectOption && (currentPage == 0 && (filterstring == null || filterstring .equals(""))); @@ -155,8 +164,6 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { target.endTag("so"); } - List options = getFilteredOptions(); - options = sanitetizeList(options, needNullSelectOption); final Iterator i = options.iterator(); // Paints the available selection options from data source @@ -203,6 +210,8 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { target.addVariable(this, "filter", filterstring); target.addVariable(this, "page", currentPage); + currentPage = -1; // current page is always set by client + optionRequest = true; } @@ -312,35 +321,12 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { * java.util.Map) */ public void changeVariables(Object source, Map variables) { - String newFilter; - if ((newFilter = (String) variables.get("filter")) != null) { - // this is a filter request - currentPage = ((Integer) variables.get("page")).intValue(); - filterstring = newFilter; - if (filterstring != null) { - filterstring = filterstring.toLowerCase(); - } - optionRepaint(); - return; - } - - // Try to set the property value - - // New option entered (and it is allowed) - final String newitem = (String) variables.get("newitem"); - if (newitem != null && newitem.length() > 0) { - getNewItemHandler().addNewItem(newitem); - // rebuild list - filterstring = null; - prevfilterstring = null; - } - // Selection change if (variables.containsKey("selected")) { final String[] ka = (String[]) variables.get("selected"); - // Multiselect mode if (isMultiSelect()) { + // Multiselect mode // TODO Optimize by adding repaintNotNeeded whan applicaple @@ -367,10 +353,8 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { newsel.addAll(s); setValue(newsel, true); } - } - - // Single select mode - else { + } else { + // Single select mode if (ka.length == 0) { // Allows deselection only if the deselected item is visible @@ -389,6 +373,30 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering { } } } + + String newFilter; + if ((newFilter = (String) variables.get("filter")) != null) { + // this is a filter request + currentPage = ((Integer) variables.get("page")).intValue(); + filterstring = newFilter; + if (filterstring != null) { + filterstring = filterstring.toLowerCase(); + } + optionRepaint(); + return; + } + + // Try to set the property value + + // New option entered (and it is allowed) + final String newitem = (String) variables.get("newitem"); + if (newitem != null && newitem.length() > 0) { + getNewItemHandler().addNewItem(newitem); + // rebuild list + filterstring = null; + prevfilterstring = null; + } + } public void requestRepaint() { -- 2.39.5