From a0f2730b4ee31bb362ac84d08766e8f029d1d417 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 5 Mar 2010 11:23:46 +0000
Subject: [PATCH] [LMS-1415] added support for optional experiment browser
 parameters (experiment type and project auto selection)

SVN: 15053
---
 .../framework/ComponentProvider.java          | 12 ++++-
 .../locator/BrowserLocatorResolver.java       | 22 +++++---
 .../ui/experiment/ExperimentBrowserGrid.java  | 20 +++++--
 .../experiment/ExperimentBrowserToolbar.java  | 12 ++++-
 .../ExperimentTypeSelectionWidget.java        | 53 +++++++++++++++++--
 .../ProjectSelectionTreeGridContainer.java    | 26 +++++++--
 .../application/ui/widget/DropDownList.java   |  5 ++
 .../module/QuerySelectionWidget.java          | 15 ++----
 8 files changed, 132 insertions(+), 33 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 59a00d6f92e..6bf0de22454 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -446,13 +446,16 @@ public final class ComponentProvider
             };
     }
 
-    public ITabItemFactory getExperimentBrowser()
+    public ITabItemFactory getExperimentBrowser(final String initialProjectOrNull,
+            final String initialExperimentTypeOrNull)
     {
         return new ITabItemFactory()
             {
                 public ITabItem create()
                 {
-                    IDisposableComponent browser = ExperimentBrowserGrid.create(viewContext);
+                    IDisposableComponent browser =
+                            ExperimentBrowserGrid.create(viewContext, initialProjectOrNull,
+                                    initialExperimentTypeOrNull);
                     return createTab(Dict.EXPERIMENT_BROWSER, browser);
                 }
 
@@ -468,6 +471,11 @@ public final class ComponentProvider
             };
     }
 
+    public ITabItemFactory getExperimentBrowser()
+    {
+        return getExperimentBrowser(null, null);
+    }
+
     public ITabItemFactory getPropertyTypeBrowser()
     {
         return new ITabItemFactory()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/BrowserLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/BrowserLocatorResolver.java
index 5bad8873df9..ccecc4c708f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/BrowserLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/BrowserLocatorResolver.java
@@ -19,6 +19,10 @@ public class BrowserLocatorResolver extends AbstractViewLocatorResolver
 
     public final static String BROWSE_ACTION = "BROWSE";
 
+    public final static String TYPE_PARAMETER_KEY = "type";
+
+    public final static String PROJECT_PARAMETER_KEY = "project";
+
     public BrowserLocatorResolver(IViewContext<ICommonClientServiceAsync> viewContext)
     {
         super(BROWSE_ACTION);
@@ -31,7 +35,9 @@ public class BrowserLocatorResolver extends AbstractViewLocatorResolver
         switch (entityKind)
         {
             case EXPERIMENT:
-                openExperimentBrowser();
+                final String projectOrNull = locator.getParameters().get(PROJECT_PARAMETER_KEY);
+                final String experimentTypeOrNull = locator.getParameters().get(TYPE_PARAMETER_KEY);
+                openExperimentBrowser(projectOrNull, experimentTypeOrNull);
                 break;
             case SAMPLE:
                 openSampleBrowser();
@@ -45,21 +51,23 @@ public class BrowserLocatorResolver extends AbstractViewLocatorResolver
         }
     }
 
-    private void openMaterialBrowser()
+    private void openExperimentBrowser(String initialProjectOrNull,
+            String initialExperimentTypeOrNull)
     {
-        // TODO select experiment type and project
-        DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getMaterialBrowser());
+        DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getExperimentBrowser(
+                initialProjectOrNull, initialExperimentTypeOrNull));
     }
 
     private void openSampleBrowser()
     {
+        // TODO select sample type and group
         DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getSampleBrowser());
     }
 
-    private void openExperimentBrowser()
+    private void openMaterialBrowser()
     {
-        DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext)
-                .getExperimentBrowser());
+        // TODO select material type
+        DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext).getMaterialBrowser());
     }
 
     private EntityKind getEntityKind(ViewLocator locator)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index 3c875348f43..ae9581b0d59 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -98,19 +98,31 @@ public class ExperimentBrowserGrid extends
         return browserGrid.asDisposableWithToolbarAndTree(toolbar, tree);
     }
 
-    /** Create a grid with the toolbar and a tree. */
+    /**
+     * Create a grid with the toolbar and a tree and optional initial selection of experiment type
+     * and project.
+     */
     public static DisposableEntityChooser<Experiment> create(
-            final IViewContext<ICommonClientServiceAsync> viewContext)
+            final IViewContext<ICommonClientServiceAsync> viewContext, String initialProjectOrNull,
+            String initialExperimentTypeOrNull)
     {
         final ProjectSelectionTreeGridContainer tree =
-                new ProjectSelectionTreeGridContainer(viewContext);
-        final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext, tree);
+                new ProjectSelectionTreeGridContainer(viewContext, initialProjectOrNull);
+        final ExperimentBrowserToolbar toolbar =
+                new ExperimentBrowserToolbar(viewContext, tree, initialExperimentTypeOrNull);
         final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar);
         browserGrid.addGridRefreshListener(toolbar);
         browserGrid.extendBottomToolbar();
         return browserGrid.asDisposableWithToolbarAndTree(toolbar, tree);
     }
 
+    /** Create a grid with the toolbar and a tree with no initial selection. */
+    public static DisposableEntityChooser<Experiment> create(
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        return create(viewContext, null, null);
+    }
+
     private final ICriteriaProvider<ListExperimentsCriteria> criteriaProvider;
 
     private ExperimentBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserToolbar.java
index d59d54fc878..553bff09262 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserToolbar.java
@@ -59,14 +59,22 @@ class ExperimentBrowserToolbar extends ToolBar implements
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
     public ExperimentBrowserToolbar(final IViewContext<ICommonClientServiceAsync> viewContext,
-            ProjectSelectionTreeGridContainer tree)
+            ProjectSelectionTreeGridContainer tree, String initialExperimentTypeOrNull)
     {
         this.viewContext = viewContext;
-        selectExperimentTypeCombo = new ExperimentTypeSelectionWidget(viewContext, ID, true);
+        selectExperimentTypeCombo =
+                new ExperimentTypeSelectionWidget(viewContext, ID, true,
+                        initialExperimentTypeOrNull);
         selectProjectTree = tree;
         display();
     }
 
+    public ExperimentBrowserToolbar(final IViewContext<ICommonClientServiceAsync> viewContext,
+            ProjectSelectionTreeGridContainer tree)
+    {
+        this(viewContext, tree, null);
+    }
+
     public void setCriteriaChangedListeners(final IDelegatedAction refreshAction)
     {
         selectExperimentTypeCombo
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeSelectionWidget.java
index 8ab25041d32..232dbb3d0c8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeSelectionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentTypeSelectionWidget.java
@@ -21,6 +21,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModifica
 
 import java.util.List;
 
+import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.extjs.gxt.ui.client.widget.form.ComboBox;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
@@ -49,14 +50,17 @@ public final class ExperimentTypeSelectionWidget extends
 
     private final boolean withAll;
 
+    private final String initialCodeOrNull;
+
     public ExperimentTypeSelectionWidget(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final String idSuffix, final boolean withAll)
+            final String idSuffix, final boolean withAll, final String initialCodeOrNull)
     {
         super(viewContext, SUFFIX + idSuffix, Dict.EXPERIMENT_TYPE, ModelDataPropertyNames.CODE,
                 "experiment type", "experiment types");
         this.viewContext = viewContext;
         this.withAll = withAll;
-        setAutoSelectFirst(withAll);
+        this.initialCodeOrNull = initialCodeOrNull;
+        setAutoSelectFirst(withAll && initialCodeOrNull == null);
         setTemplate(GWTUtils.getTooltipTemplate(ModelDataPropertyNames.CODE,
                 ModelDataPropertyNames.TOOLTIP));
     }
@@ -64,7 +68,7 @@ public final class ExperimentTypeSelectionWidget extends
     public ExperimentTypeSelectionWidget(final IViewContext<ICommonClientServiceAsync> viewContext,
             final String idSuffix)
     {
-        this(viewContext, idSuffix, false);
+        this(viewContext, idSuffix, false, null);
     }
 
     /**
@@ -86,7 +90,8 @@ public final class ExperimentTypeSelectionWidget extends
     @Override
     protected void loadData(AbstractAsyncCallback<List<ExperimentType>> callback)
     {
-        viewContext.getService().listExperimentTypes(callback);
+        viewContext.getService().listExperimentTypes(new ListExperimentTypesCallback(viewContext));
+        callback.ignore();
     }
 
     public DatabaseModificationKind[] getRelevantModifications()
@@ -97,4 +102,44 @@ public final class ExperimentTypeSelectionWidget extends
                     edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT) };
     }
 
+    // 
+    // initial value support
+    //
+
+    private void selectInitialValue()
+    {
+        if (initialCodeOrNull != null)
+        {
+            trySelectByCode(initialCodeOrNull);
+            updateOriginalValue();
+        }
+    }
+
+    private void trySelectByCode(String code)
+    {
+        try
+        {
+            GWTUtils.setSelectedItem(this, ModelDataPropertyNames.CODE, code);
+        } catch (IllegalArgumentException ex)
+        {
+            MessageBox.alert("Error", "Experiment Type '" + code + "' doesn't exist.", null);
+        }
+    }
+
+    private class ListExperimentTypesCallback extends
+            ExperimentTypeSelectionWidget.ListItemsCallback
+    {
+
+        protected ListExperimentTypesCallback(IViewContext<?> viewContext)
+        {
+            super(viewContext);
+        }
+
+        @Override
+        public void process(List<ExperimentType> result)
+        {
+            super.process(result);
+            selectInitialValue();
+        }
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
index a06fc42f3a1..f7bbad78fdd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java
@@ -63,8 +63,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 
 /**
@@ -81,6 +81,8 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
 
     private final IViewContext<?> viewContext;
 
+    private final String initialIdentifierOrNull;
+
     private Project selectedProjectOrNull;
 
     private SelectionChangedListener<?> selectionChangedListener;
@@ -91,10 +93,12 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
 
     private final Map<Project, Widget> projectLinks = new HashMap<Project, Widget>();
 
-    public ProjectSelectionTreeGridContainer(final IViewContext<?> viewContext)
+    public ProjectSelectionTreeGridContainer(final IViewContext<?> viewContext,
+            String initialIdentifierOrNull)
     {
         super(new FitLayout());
         this.viewContext = viewContext;
+        this.initialIdentifierOrNull = initialIdentifierOrNull;
 
         ColumnConfig codeColumn = createCodeColumn();
         ColumnModel columnModel = new ColumnModel(Arrays.asList(codeColumn));
@@ -110,6 +114,11 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
         refreshTree();
     }
 
+    public ProjectSelectionTreeGridContainer(final IViewContext<?> viewContext)
+    {
+        this(viewContext, null);
+    }
+
     /** @return tree grid with empty store and specified column model */
     private TreeGrid<ModelData> createTreeGrid(ColumnModel columnModel)
     {
@@ -134,6 +143,7 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
                         @Override
                         public void selectionChanged(SelectionChangedEvent<ModelData> se)
                         {
+
                             if (selectedProjectOrNull != null)
                             {
                                 selectedProjectLinkOrNull.setVisible(false);
@@ -411,11 +421,19 @@ public final class ProjectSelectionTreeGridContainer extends LayoutContainer imp
             List<Project> projects = result.getList().extractOriginalObjects();
             rebuildTree(projects);
 
-            if (selectedProjectOrNull != null)
+            String identifierOrNull = tryGetProjectIdentifierToSelect();
+            if (identifierOrNull != null)
             {
-                selectByIdentifierIfPossible(selectedProjectOrNull.getIdentifier());
+                selectByIdentifierIfPossible(identifierOrNull);
             }
         }
+
+        private String tryGetProjectIdentifierToSelect()
+        {
+            return selectedProjectOrNull != null ? selectedProjectOrNull.getIdentifier()
+                    : initialIdentifierOrNull;
+        }
+
     }
 
     private static class BaseModelDataWithCode extends NonHierarchicalBaseModelData
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
index d0c9c284aaf..2625a9c3553 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
@@ -468,4 +468,9 @@ abstract public class DropDownList<M extends ModelData, E> extends ComboBox<M> i
         dataRefreshCallbacks.add(callback);
     }
 
+    protected void updateOriginalValue()
+    {
+        setOriginalValue(getValue());
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QuerySelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QuerySelectionWidget.java
index e1fd20fc479..720d734d791 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QuerySelectionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QuerySelectionWidget.java
@@ -72,7 +72,7 @@ public final class QuerySelectionWidget extends DropDownList<QueryModel, QueryEx
     @Override
     protected void loadData(AbstractAsyncCallback<List<QueryExpression>> callback)
     {
-        viewContext.getService().listQueries(new ListTermsCallback(viewContext));
+        viewContext.getService().listQueries(new ListQueriesCallback(viewContext));
         callback.ignore();
     }
 
@@ -85,7 +85,7 @@ public final class QuerySelectionWidget extends DropDownList<QueryModel, QueryEx
     // initial value support
     //
 
-    public void selectInitialValue()
+    private void selectInitialValue()
     {
         if (initialQueryNameOrNull != null)
         {
@@ -94,7 +94,7 @@ public final class QuerySelectionWidget extends DropDownList<QueryModel, QueryEx
         }
     }
 
-    public void trySelectByName(String queryName)
+    private void trySelectByName(String queryName)
     {
         try
         {
@@ -105,15 +105,10 @@ public final class QuerySelectionWidget extends DropDownList<QueryModel, QueryEx
         }
     }
 
-    public void updateOriginalValue()
-    {
-        setOriginalValue(getValue());
-    }
-
-    private class ListTermsCallback extends QuerySelectionWidget.ListItemsCallback
+    private class ListQueriesCallback extends QuerySelectionWidget.ListItemsCallback
     {
 
-        protected ListTermsCallback(IViewContext<?> viewContext)
+        protected ListQueriesCallback(IViewContext<?> viewContext)
         {
             super(viewContext);
         }
-- 
GitLab