From bc36ff3b00984707a74a32ec3c0c9b5ceebbdecb Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Wed, 10 Feb 2010 08:37:25 +0000 Subject: [PATCH] LMS-1318 Improved keyboard support in the detailed searches. SVN: 14672 --- .../search/DetailedSearchCriteriaWidget.java | 26 ++++++++- .../search/DetailedSearchCriterionWidget.java | 29 ++++++++++ .../ui/search/DetailedSearchWindow.java | 53 +++++++++++++++---- 3 files changed, 98 insertions(+), 10 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java index 9d4f8f4bc0b..8e3ae707bda 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriteriaWidget.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search import java.util.ArrayList; import java.util.List; +import com.extjs.gxt.ui.client.event.KeyboardEvents; import com.extjs.gxt.ui.client.widget.VerticalPanel; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; @@ -38,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; */ public class DetailedSearchCriteriaWidget extends VerticalPanel { - public static final String FIRST_ID_SUFFIX = "_first"; private final List<DetailedSearchCriterionWidget> criteriaWidgets; @@ -78,6 +78,7 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel add(criterion); enableRemovalIfOneExists(false); layout(); + criterion.focus(); } /** @@ -92,12 +93,30 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel criteriaWidgets.remove(w); remove(w); enableRemovalIfOneExists(false); + + focusLastWidget(); } else { w.reset(); } } + /** + * Set focus on the last widget + */ + private void focusLastWidget() + { + DetailedSearchCriterionWidget lastWidget = criteriaWidgets.get(criteriaWidgets.size() - 1); + lastWidget.focus(); + } + + @Override + public void focus() + { + super.focus(); + focusLastWidget(); + } + public List<PropertyType> getAvailablePropertyTypes() { return criteriaWidgets.get(0).getAvailablePropertyTypes(); @@ -184,4 +203,9 @@ public class DetailedSearchCriteriaWidget extends VerticalPanel widget.setSearchCriterion(initialField, initialSearchString); } + void onEnterKey() + { + fireEvent(KeyboardEvents.Enter); + } + } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java index a474aa0afc3..ca6d126cc97 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchCriterionWidget.java @@ -21,11 +21,14 @@ import java.util.List; import com.extjs.gxt.ui.client.Style.HorizontalAlignment; import com.extjs.gxt.ui.client.Style.VerticalAlignment; import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.KeyListener; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.widget.HorizontalPanel; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.TextField; import com.extjs.gxt.ui.client.widget.layout.TableData; +import com.google.gwt.event.dom.client.KeyCodes; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; @@ -84,6 +87,7 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel this.nameField = nameField; this.valueField = new TextField<String>(); valueField.setId(VALUE_FIELD_ID_PREFIX + idSuffix); + addEnterListener(); final TableData tableData = new TableData(HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM); @@ -96,6 +100,24 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel add(removeButton = createRemoveButton(idSuffix), tableData); } + /** + * Adds a keyboard listener to the input field. Only call this during initialization. + */ + private void addEnterListener() + { + valueField.addKeyListener(new KeyListener() + { + @Override + public final void componentKeyUp(final ComponentEvent event) + { + if (event.getKeyCode() == KeyCodes.KEY_ENTER) + { + parent.onEnterKey(); + } + } + }); + } + /** * Allows to enable/disable "remove" button. */ @@ -165,6 +187,13 @@ public class DetailedSearchCriterionWidget extends HorizontalPanel nameField.reset(); } + @Override + public void focus() + { + super.focus(); + valueField.focus(); + } + /** * Returns {@link DetailedSearchCriterion} for selected <em>name</em> and <em>value</em>. If * either <em>name</em> or <em>value</em> is not specified, returns null. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java index 18bd87938e2..27d5e6a22f2 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedSearchWindow.java @@ -4,12 +4,17 @@ import java.util.List; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.event.ButtonEvent; +import com.extjs.gxt.ui.client.event.ComponentEvent; +import com.extjs.gxt.ui.client.event.EventType; +import com.extjs.gxt.ui.client.event.KeyboardEvents; +import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.button.ButtonBar; import com.extjs.gxt.ui.client.widget.layout.FitData; import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.google.gwt.event.dom.client.KeyCodes; import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; @@ -52,6 +57,7 @@ public class DetailedSearchWindow extends Dialog setResizable(false); add(criteriaWidget = new DetailedSearchCriteriaWidget(viewContext, entityKind), new FitData(MARGIN)); + addEnterListener(); final ButtonBar bar = getButtonBar(); bar.removeAll(); bar.add(new Button(viewContext.getMessage(Dict.BUTTON_CANCEL), @@ -79,15 +85,7 @@ public class DetailedSearchWindow extends Dialog @Override public void componentSelected(ButtonEvent ce) { - List<PropertyType> availablePropertyTypes = - criteriaWidget.getAvailablePropertyTypes(); - DetailedSearchCriteria criteria = - criteriaWidget.tryGetCriteria(); - String criteriaDescription = - criteriaWidget.getCriteriaDescription(); - updateListener.updateSearchResults(criteria, - criteriaDescription, availablePropertyTypes); - hide(); + onSearch(); } }); @@ -98,6 +96,34 @@ public class DetailedSearchWindow extends Dialog createHelpPageIdentifier(entityKind)); } + private void addEnterListener() + { + criteriaWidget.addListener(KeyboardEvents.Enter, new Listener<ComponentEvent>() + { + public void handleEvent(ComponentEvent ce) + { + EventType type = ce.getType(); + switch (type.getEventCode()) + { + case KeyCodes.KEY_ENTER: + onSearch(); + break; + default: + break; + } + + } + + }); + } + + @Override + protected void afterShow() + { + super.afterShow(); + criteriaWidget.focus(); + } + public DetailedSearchCriteria tryGetCriteria() { return criteriaWidget.tryGetCriteria(); @@ -139,4 +165,13 @@ public class DetailedSearchWindow extends Dialog // Set the widget criteriaWidget.setInitialSearchCriterion(initialField, searchString); } + + private void onSearch() + { + hide(); + List<PropertyType> availablePropertyTypes = criteriaWidget.getAvailablePropertyTypes(); + DetailedSearchCriteria criteria = criteriaWidget.tryGetCriteria(); + String criteriaDescription = criteriaWidget.getCriteriaDescription(); + updateListener.updateSearchResults(criteria, criteriaDescription, availablePropertyTypes); + } } -- GitLab