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 9d4f8f4bc0bc0eebcf390e4be161b9e5fcb2c815..8e3ae707bda271160d382269ab84cd8dd542c486 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 a474aa0afc31f7e92eaa752720f083b3794ccae0..ca6d126cc97b38b37768ad6b2250b107b61f7311 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 18bd87938e297123ca48dbc50860f252588dd81c..27d5e6a22f23038ee820720b2afa0e41615794b8 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); + } }