Jakub Niedermertl has uploaded a new change for review. Change subject: userportal, webadmin: New typeahead searching for template comboboxs ......................................................................
userportal, webadmin: New typeahead searching for template comboboxs Typeahead serching for template comboboxes that matches suggestions containing all whitespace separated parts of query (~ user input). This change is necessary because second column of template suggestions newly contains important name of subversion (instead of previous, less important, description). Change-Id: Ib7cff48cfd25fe1a121d6710579aafc7b7cf72e2 Bug-Url: https://bugzilla.redhat.com/1165630 Signed-off-by: Jakub Niedermertl <jnied...@redhat.com> --- M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadChangeableListBox.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBox.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBoxEditor.java A frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/SuggestionMatcher.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java 5 files changed, 81 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/36586/1 diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadChangeableListBox.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadChangeableListBox.java index 18d9c26..f838a5b 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadChangeableListBox.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadChangeableListBox.java @@ -16,7 +16,7 @@ } public ListModelTypeAheadChangeableListBox(SuggestBoxRenderer<String> renderer, boolean autoAddToValidValues, String nullReplacementText) { - super(renderer, autoAddToValidValues); + super(renderer, autoAddToValidValues, new SuggestionMatcher.StartWithSuggestionMatcher()); if (nullReplacementText == null) { nullReplacementText = ""; //$NON-NLS-1$ } else { diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBox.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBox.java index afe91b0..6887d711 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBox.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBox.java @@ -85,12 +85,9 @@ ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } - public ListModelTypeAheadListBox(SuggestBoxRenderer<T> renderer) { - this(renderer, true); - } - - public ListModelTypeAheadListBox(SuggestBoxRenderer<T> renderer, boolean autoAddToValidValues) { - super(new RenderableSuggestOracle<T>(renderer)); + public ListModelTypeAheadListBox(SuggestBoxRenderer<T> renderer, boolean autoAddToValidValues, + SuggestionMatcher suggestionMatcher) { + super(new RenderableSuggestOracle<T>(renderer, suggestionMatcher)); this.renderer = renderer; this.autoAddToValidValues = autoAddToValidValues; @@ -390,26 +387,19 @@ public RenderableSuggestion(T row, SuggestBoxRenderer<T> renderer) { super(renderer.getReplacementString(row), renderer.getDisplayString(row)); } - - public boolean matches(String query) { - String replacementString = getReplacementString(); - if (replacementString == null || query == null) { - return false; - } - - return replacementString.toLowerCase().startsWith(query.toLowerCase()); - } } class RenderableSuggestOracle<T> extends MultiWordSuggestOracle { private SuggestBoxRenderer<T> renderer; + final private SuggestionMatcher matcher; // inited to avoid null checks private Collection<T> data = new ArrayList<T>(); - public RenderableSuggestOracle(SuggestBoxRenderer<T> renderer) { + public RenderableSuggestOracle(SuggestBoxRenderer<T> renderer, SuggestionMatcher matcher) { this.renderer = renderer; + this.matcher = matcher; } @Override @@ -419,7 +409,8 @@ String query = request.getQuery(); for (T row : data) { RenderableSuggestion<T> suggestionCandidate = new RenderableSuggestion<T>(row, renderer); - if (suggestionCandidate.matches(query)) { + if (this.matcher.match( + query, suggestionCandidate.getReplacementString(), suggestionCandidate.getDisplayString())) { suggestions.add(suggestionCandidate); } } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBoxEditor.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBoxEditor.java index fac9943..11466c5 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBoxEditor.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/ListModelTypeAheadListBoxEditor.java @@ -29,10 +29,22 @@ this(renderer, true, visibilityRenderer); } + public ListModelTypeAheadListBoxEditor(SuggestBoxRenderer<T> renderer, VisibilityRenderer visibilityRenderer, + SuggestionMatcher suggestionMatcher) { + this(renderer, true, visibilityRenderer, suggestionMatcher); + } + + public ListModelTypeAheadListBoxEditor(SuggestBoxRenderer<T> renderer, + boolean autoAddToValidValues, + VisibilityRenderer visibilityRenderer) { + this(renderer, autoAddToValidValues, visibilityRenderer, new SuggestionMatcher.StartWithSuggestionMatcher()); + } + public ListModelTypeAheadListBoxEditor(SuggestBoxRenderer<T> renderer, boolean autoAddToValidValues, - VisibilityRenderer visibilityRenderer) { - super(new ListModelTypeAheadListBox<T>(renderer, autoAddToValidValues), visibilityRenderer); + VisibilityRenderer visibilityRenderer, + SuggestionMatcher suggestionMatcher) { + super(new ListModelTypeAheadListBox<T>(renderer, autoAddToValidValues, suggestionMatcher), visibilityRenderer); this.editor = WidgetWithLabelEditor.of(getContentWidget().asEditor(), this); } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/SuggestionMatcher.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/SuggestionMatcher.java new file mode 100644 index 0000000..120dbd5 --- /dev/null +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/editor/SuggestionMatcher.java @@ -0,0 +1,55 @@ +package org.ovirt.engine.ui.common.widget.editor; + +/** + * A matcher used by {@link RenderableSuggestOracle} to recognize suggestions corresponding to user query string. + */ +public interface SuggestionMatcher { + + /** + * + * @param query text typed by user into combobox + * @param replacementString one line string representing suggestion in selected state + * @param displayString html string representing suggestion in suggestion list (eg. generated by {@link org.ovirt.engine.ui.common.widget.uicommon.popup.AbstractVmPopupWidget#typeAheadNameDescriptionTemplateNullSafe(java.lang.String, java.lang.String)}) + * @return is suggestion matching + */ + public boolean match(String query, String replacementString, String displayString); + + /** + * Case independent matcher. Suggestion matches if replacementString starts with query. + */ + public static class StartWithSuggestionMatcher implements SuggestionMatcher { + + @Override + public boolean match(String query, String replacementString, String displayString) { + if (replacementString == null || query == null) { + return false; + } + + return replacementString.toLowerCase().startsWith(query.toLowerCase()); + } + } + + /** + * Case independent matcher. Suggestion matches if all whitespace separated parts of query are contained in + * replacement string. + */ + public static class ContainsSuggestionMatcher implements SuggestionMatcher { + + @Override + public boolean match(String query, String replacementString, String displayString) { + if (replacementString == null || query == null) { + return false; + } + + final String lowerQuery = query.toLowerCase(); + final String lowerReplacement = replacementString.toLowerCase(); + final String[] querySegments = lowerQuery.split("\\s"); //$NON-NLS-1$ + for (String querySegment : querySegments) { + if (!lowerReplacement.contains(querySegment)) { + return false; + } + } + return true; + } + } +} diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java index c1bb51f..f70d253 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/widget/uicommon/popup/AbstractVmPopupWidget.java @@ -75,6 +75,7 @@ import org.ovirt.engine.ui.common.widget.editor.ListModelListBoxOnlyEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelTypeAheadChangeableListBoxEditor; import org.ovirt.engine.ui.common.widget.editor.ListModelTypeAheadListBoxEditor; +import org.ovirt.engine.ui.common.widget.editor.SuggestionMatcher; import org.ovirt.engine.ui.common.widget.editor.VncKeyMapRenderer; import org.ovirt.engine.ui.common.widget.editor.generic.DetachableLabel; import org.ovirt.engine.ui.common.widget.editor.generic.EntityModelCheckBoxEditor; @@ -1188,7 +1189,8 @@ + versionTemplate.getTemplateVersionNumber() + ")"; //$NON-NLS-1$ } }, - new ModeSwitchingVisibilityRenderer()); + new ModeSwitchingVisibilityRenderer(), + new SuggestionMatcher.ContainsSuggestionMatcher()); oSTypeEditor = new ListModelListBoxEditor<Integer>(new AbstractRenderer<Integer>() { @Override -- To view, visit http://gerrit.ovirt.org/36586 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib7cff48cfd25fe1a121d6710579aafc7b7cf72e2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Jakub Niedermertl <jnied...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches