From da0c5174bc99119021fb08183de7b9278d4c92d9 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Wed, 1 Apr 2009 12:31:05 +0000
Subject: [PATCH] LMS-751 Automatic refresh: sample and material browser

SVN: 10522
---
 .../application/MatchingEntitiesPanel.java    |  6 ++
 .../LastModificationStateUpdater.java         |  7 --
 .../ui/experiment/ExperimentBrowserGrid.java  |  1 -
 .../ui/grid/AbstractBrowserGrid.java          |  8 ---
 .../ui/grid/AbstractSimpleBrowserGrid.java    |  8 +++
 .../ui/material/MaterialBrowserGrid.java      | 67 ++++++++++++++++---
 .../ui/material/MaterialBrowserToolbar.java   | 23 ++++++-
 .../ui/sample/SampleBrowserGrid.java          | 55 +++++++++++++--
 .../ui/sample/SampleBrowserToolbar.java       | 28 +++++++-
 9 files changed, 172 insertions(+), 31 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
index 4d75b1909c2..1231eb9606d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
@@ -20,6 +20,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModifica
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
 
 import java.util.List;
+import java.util.Set;
 
 import com.extjs.gxt.ui.client.XDOM;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
@@ -164,4 +165,9 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
                     createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT),
                     createOrDelete(ObjectKind.VOCABULARY_TERM) };
     }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        refreshGridSilently();
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/LastModificationStateUpdater.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/LastModificationStateUpdater.java
index d2024432c67..b231e678597 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/LastModificationStateUpdater.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/LastModificationStateUpdater.java
@@ -52,12 +52,6 @@ class LastModificationStateUpdater extends AbstractAsyncCallback<LastModificatio
         this.lastSeenModificationStateOrNull = null;
     }
 
-    private void debug(String msg)
-    {
-        // TODO 2009-03-26, Tomasz Pylak: add proper logging
-        System.out.println("LMS Updater: " + msg);
-    }
-
     public void update()
     {
         commonService.getLastModificationState(this);
@@ -84,7 +78,6 @@ class LastModificationStateUpdater extends AbstractAsyncCallback<LastModificatio
                         lastSeenModificationStateOrNull);
         if (unseenModifications.size() > 0)
         {
-            debug("new modifications detected: " + unseenModifications);
             modificationObserver.update(unseenModifications);
         }
     }
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 7ae930dbfb8..14040b8d2a9 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
@@ -281,7 +281,6 @@ public class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, Exper
         return result;
     }
 
-    @Override
     public void update(Set<DatabaseModificationKind> observedModifications)
     {
         topToolbar.update(observedModifications);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index b95c19434ce..e46c6e19d6e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -207,14 +207,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         add(contentPanel);
     }
 
-    // TODO 2009-03-26, Tomasz Pylak: delete this and implement in subclasses
-    // !!!!!!!!!!!!!!!!!!!!!!!!!
-    public void update(Set<DatabaseModificationKind> observedModifications)
-    {
-        System.out.println("generic grid refresh requested: " + observedModifications);
-        refreshGridSilently();
-    }
-
     /** Refreshes the grid without showing the loading progress bar */
     protected void refreshGridSilently()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
index bcbe14093c5..912dc80df6c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
@@ -16,10 +16,13 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid;
 
+import java.util.Set;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 
 /**
  * Grid displaying all the entities without any criteria (useful when there is no specific toolbar).
@@ -68,4 +71,9 @@ abstract public class AbstractSimpleBrowserGrid<T/* Entity */> extends
     {
         return new BaseEntityModel<T>(entity, getStaticColumnsDefinition());
     }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        refreshGridSilently();
+    }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserGrid.java
index ea491a5d04a..354364a5085 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserGrid.java
@@ -19,7 +19,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.materi
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
 
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
@@ -33,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.MaterialModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
@@ -43,6 +47,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.SetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListMaterialCriteria;
@@ -85,6 +90,8 @@ public class MaterialBrowserGrid extends AbstractBrowserGrid<Material, MaterialM
          *         set.
          */
         ListMaterialCriteria tryGetCriteria();
+
+        IDatabaseModificationObserver tryGetModificationObserver();
     }
 
     /**
@@ -107,10 +114,15 @@ public class MaterialBrowserGrid extends AbstractBrowserGrid<Material, MaterialM
                 {
                     return toolbar.tryGetCriteria();
                 }
+
+                public IDatabaseModificationObserver tryGetModificationObserver()
+                {
+                    return toolbar;
+                }
             };
         final MaterialBrowserGrid browserGrid =
                 createBrowserGrid(viewContext, criteriaProvider, detailsAvailable);
-        browserGrid.extendTopToolbar(toolbar);
+        browserGrid.extendTopToolbar(toolbar, detailsAvailable);
         return browserGrid.asDisposableWithToolbar(toolbar);
 
     }
@@ -142,6 +154,11 @@ public class MaterialBrowserGrid extends AbstractBrowserGrid<Material, MaterialM
                 {
                     return new ListMaterialCriteria(initValue);
                 }
+
+                public IDatabaseModificationObserver tryGetModificationObserver()
+                {
+                    return null;
+                }
             };
         boolean detailsAvailable = false;
         final MaterialBrowserGrid browserGrid =
@@ -178,16 +195,18 @@ public class MaterialBrowserGrid extends AbstractBrowserGrid<Material, MaterialM
         setId(BROWSER_ID);
     }
 
-    private void extendTopToolbar(MaterialBrowserToolbar toolbar)
+    private void extendTopToolbar(MaterialBrowserToolbar toolbar, boolean detailsAvailable)
     {
         SelectionChangedListener<?> refreshButtonListener = addRefreshButton(toolbar);
         toolbar.setCriteriaChangedListener(refreshButtonListener);
         toolbar.add(new FillToolItem());
 
-        String editTitle = viewContext.getMessage(Dict.BUTTON_EDIT);
-        Button editButton = createSelectedItemButton(editTitle, asShowEntityInvoker(true));
-        toolbar.add(new AdapterToolItem(editButton));
-
+        if (detailsAvailable)
+        {
+            String editTitle = viewContext.getMessage(Dict.BUTTON_EDIT);
+            Button editButton = createSelectedItemButton(editTitle, asShowEntityInvoker(true));
+            toolbar.add(new AdapterToolItem(editButton));
+        }
     }
 
     @Override
@@ -304,8 +323,38 @@ public class MaterialBrowserGrid extends AbstractBrowserGrid<Material, MaterialM
 
     public DatabaseModificationKind[] getRelevantModifications()
     {
-        return new DatabaseModificationKind[]
-            { createOrDelete(ObjectKind.MATERIAL_TYPE), createOrDelete(ObjectKind.MATERIAL),
-                    edit(ObjectKind.MATERIAL) };
+        List<DatabaseModificationKind> relevantModifications =
+                new ArrayList<DatabaseModificationKind>();
+        IDatabaseModificationObserver criteriaModificationObserver =
+                criteriaProvider.tryGetModificationObserver();
+        if (criteriaModificationObserver != null)
+        {
+            SetUtils.addAll(relevantModifications, criteriaModificationObserver
+                    .getRelevantModifications());
+        }
+        relevantModifications.addAll(getGridRelevantModifications());
+        return relevantModifications.toArray(DatabaseModificationKind.EMPTY_ARRAY);
+    }
+
+    private static Set<DatabaseModificationKind> getGridRelevantModifications()
+    {
+        Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>();
+        result.add(createOrDelete(ObjectKind.MATERIAL));
+        result.add(edit(ObjectKind.MATERIAL));
+        return result;
+    }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        IDatabaseModificationObserver criteriaModificationObserver =
+                criteriaProvider.tryGetModificationObserver();
+        if (criteriaModificationObserver != null)
+        {
+            criteriaModificationObserver.update(observedModifications);
+        }
+        if (SetUtils.containsAny(observedModifications, getGridRelevantModifications()))
+        {
+            refreshGridSilently();
+        }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserToolbar.java
index 0cb6f2d95be..67b632cb365 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialBrowserToolbar.java
@@ -16,6 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material;
 
+import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
+
+import java.util.Set;
+
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
@@ -26,15 +30,18 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListMaterialCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 
 /**
  * The toolbar of material browser.
  * 
  * @author Izabela Adamczyk
  */
-class MaterialBrowserToolbar extends ToolBar
+class MaterialBrowserToolbar extends ToolBar implements IDatabaseModificationObserver
 {
     public static final String ID = "material-browser-toolbar";
 
@@ -81,4 +88,18 @@ class MaterialBrowserToolbar extends ToolBar
         super.onRender(parent, pos);
     }
 
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        return new DatabaseModificationKind[]
+            { createOrDelete(ObjectKind.MATERIAL_TYPE) };
+    }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        if (observedModifications.contains(createOrDelete(ObjectKind.MATERIAL_TYPE)))
+        {
+            selectMaterialTypeCombo.update(observedModifications);
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 618945ccdbd..41838a324e1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -19,7 +19,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
 
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
@@ -34,6 +37,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SampleModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
@@ -43,9 +47,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.IEditab
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.SetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
@@ -89,6 +94,8 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
     private interface ICriteriaProvider
     {
         ListSampleCriteria tryGetCriteria();
+
+        IDatabaseModificationObserver tryGetModificationObserver();
     }
 
     public static IDisposableComponent create(
@@ -110,6 +117,11 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
                 {
                     return toolbar.tryGetCriteria();
                 }
+
+                public IDatabaseModificationObserver tryGetModificationObserver()
+                {
+                    return toolbar;
+                }
             };
     }
 
@@ -125,6 +137,11 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
                     criteria.setExperimentIdentifier(experimentIdentifier);
                     return criteria;
                 }
+
+                public IDatabaseModificationObserver tryGetModificationObserver()
+                {
+                    return null;
+                }
             };
 
         final SampleBrowserGrid browserGrid =
@@ -313,8 +330,38 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
 
     public DatabaseModificationKind[] getRelevantModifications()
     {
-        return new DatabaseModificationKind[]
-            { edit(ObjectKind.SAMPLE), createOrDelete(ObjectKind.SAMPLE),
-                    createOrDelete(ObjectKind.SAMPLE_TYPE), createOrDelete(ObjectKind.GROUP) };
+        List<DatabaseModificationKind> relevantModifications =
+                new ArrayList<DatabaseModificationKind>();
+        IDatabaseModificationObserver criteriaModificationObserver =
+                criteriaProvider.tryGetModificationObserver();
+        if (criteriaModificationObserver != null)
+        {
+            SetUtils.addAll(relevantModifications, criteriaModificationObserver
+                    .getRelevantModifications());
+        }
+        relevantModifications.addAll(getGridRelevantModifications());
+        return relevantModifications.toArray(DatabaseModificationKind.EMPTY_ARRAY);
+    }
+
+    private static Set<DatabaseModificationKind> getGridRelevantModifications()
+    {
+        Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>();
+        result.add(createOrDelete(ObjectKind.SAMPLE));
+        result.add(edit(ObjectKind.SAMPLE));
+        return result;
+    }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        IDatabaseModificationObserver criteriaModificationObserver =
+                criteriaProvider.tryGetModificationObserver();
+        if (criteriaModificationObserver != null)
+        {
+            criteriaModificationObserver.update(observedModifications);
+        }
+        if (SetUtils.containsAny(observedModifications, getGridRelevantModifications()))
+        {
+            refreshGridSilently();
+        }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserToolbar.java
index c481c3b3223..c02c04beb71 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserToolbar.java
@@ -16,6 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
 
+import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
+
+import java.util.Set;
+
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
@@ -26,10 +30,13 @@ import com.google.gwt.user.client.Element;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Group;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 
 /**
  * The toolbar of sample browser.
@@ -37,7 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
  * @author Izabela Adamczyk
  * @author Christian Ribeaud
  */
-final class SampleBrowserToolbar extends ToolBar
+final class SampleBrowserToolbar extends ToolBar implements IDatabaseModificationObserver
 {
     public static final String ID = "sample-browser-toolbar";
 
@@ -110,4 +117,23 @@ final class SampleBrowserToolbar extends ToolBar
         super.onRender(parent, pos);
     }
 
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        return new DatabaseModificationKind[]
+            { createOrDelete(ObjectKind.SAMPLE_TYPE), createOrDelete(ObjectKind.GROUP) };
+    }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        if (observedModifications.contains(createOrDelete(ObjectKind.SAMPLE_TYPE)))
+        {
+            selectSampleTypeCombo.refreshStore();
+        }
+        if (observedModifications.contains(createOrDelete(ObjectKind.GROUP)))
+        {
+            selectGroupCombo.refreshStore();
+        }
+
+    }
+
 }
\ No newline at end of file
-- 
GitLab