From 85fb2535cd1ca208b367849f0520a9533f12850a Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 4 Apr 2011 08:07:13 +0000
Subject: [PATCH] [LMS-2142] refactored & implemented complete dispose

SVN: 20628
---
 .../ui/data/DataSetSearchHitGrid.java         | 130 ++++++++++++++----
 .../ui/grid/AbstractBrowserGrid.java          |  10 +-
 2 files changed, 106 insertions(+), 34 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
index b10121132a9..73c4dda8e2f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
@@ -18,8 +18,10 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
 import java.util.List;
+import java.util.Set;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.layout.RowData;
 import com.extjs.gxt.ui.client.widget.layout.RowLayout;
@@ -42,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.IDetailedSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -62,8 +65,6 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     public static final String GRID_ID = BROWSER_ID + "-grid";
 
-    private static IDisposableComponent disposableComponentOrNull = null;
-
     public static IDisposableComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
@@ -93,9 +94,11 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
             searchWindow.setInitialSearchCriteria(searchCriteriaOrNull);
         }
 
-        final LayoutContainer container = createContainer();
+        final IDisposableComponent metadataComponent = grid.asDisposableWithoutToolbar();
+        final LayoutContainerWithDisposableComponent containerHolder =
+                createContainerHolder(metadataComponent);
         final IOnReportComponentGeneratedAction reportGeneratedAction =
-                createReportGeneratedAction(container, grid);
+                createReportGeneratedAction(containerHolder, grid);
         final ReportingPluginSelectionWidget reportSelectionWidget =
                 new ReportingPluginSelectionWidget(viewContext, null);
 
@@ -110,41 +113,44 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
                         reportSelectionWidget, searchCriteriaOrNull != null);
         searchWindow.setUpdateListener(toolbar);
 
-        return grid.asDisposableWithToolbar(container, toolbar);
+        return grid.asDisposableWithToolbar(containerHolder, toolbar);
     }
 
-    private static LayoutContainer createContainer()
+    private static LayoutContainerWithDisposableComponent createContainerHolder(
+            IDisposableComponent metadataComponent)
     {
         final LayoutContainer container = new LayoutContainer();
         container.setLayout(new RowLayout());
-        return container;
+        return new LayoutContainerWithDisposableComponent(container, metadataComponent);
     }
 
     private static IOnReportComponentGeneratedAction createReportGeneratedAction(
-            final LayoutContainer container, final DataSetSearchHitGrid grid)
+            final LayoutContainerWithDisposableComponent containerHolder,
+            final DataSetSearchHitGrid metadataGrid)
     {
         return new IOnReportComponentGeneratedAction()
             {
-                public void execute(IDisposableComponent gridComponent)
+                public void execute(IDisposableComponent newGridComponent)
                 {
-                    if (gridComponent != null)
+                    final LayoutContainer container = containerHolder.getContainer();
+                    final IDisposableComponent disposableComponent =
+                            containerHolder.getDisposableComponent();
+
+                    // remove second widget (first is the toolbar)
+                    Widget widget = container.getWidget(1);
+                    container.remove(widget);
+
+                    // dispose if it wasn't the main grid component
+                    if (disposableComponent != null
+                            && disposableComponent.getComponent().equals(metadataGrid) == false)
                     {
-                        // remove second widget (first is the toolbar)
-                        Widget widget = container.getWidget(1);
-                        container.remove(widget);
-
-                        // dispose if it wasn't the main grid component
-                        if (disposableComponentOrNull != null
-                                && disposableComponentOrNull.getComponent().equals(grid) == false)
-                        {
-                            disposableComponentOrNull.dispose();
-                        }
-
-                        // update new component
-                        disposableComponentOrNull = gridComponent;
-                        container.add(gridComponent.getComponent(), new RowData(1, 1));
-                        container.layout();
+                        disposableComponent.dispose();
                     }
+
+                    // update new component
+                    containerHolder.setDisposableComponent(newGridComponent);
+                    container.add(newGridComponent.getComponent(), new RowData(1, 1));
+                    container.layout();
                 }
             };
     }
@@ -154,7 +160,6 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     private DataSetSearchHitGrid(final IViewContext<ICommonClientServiceAsync> viewContext)
     {
         super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.DATA_SET_SEARCH_RESULT_GRID);
-
     }
 
     @Override
@@ -195,13 +200,80 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     /** @return this grid as a disposable component with a specified toolbar at the top. */
     private DisposableEntityChooser<ExternalData> asDisposableWithToolbar(
-            final LayoutContainer container, final IDisposableComponent toolbar)
+            final LayoutContainerWithDisposableComponent containerHolder,
+            final IDisposableComponent toolbar)
     {
+        final LayoutContainer container = containerHolder.getContainer();
         container.add(toolbar.getComponent());
         container.add(this, new RowData(1, 1));
+        IDisposableComponent dynamicComponentProvider =
+                createDynamicComponentProvider(containerHolder);
+        return asDisposableEntityChooser(container, toolbar, dynamicComponentProvider);
+    }
+
+    private IDisposableComponent createDynamicComponentProvider(
+            final LayoutContainerWithDisposableComponent containerHolder)
+    {
+        // dynamically delegates to the disposable component currently stored in containerHolder
+        return new IDisposableComponent()
+            {
+
+                private IDisposableComponent getDisposableComponent()
+                {
+                    return containerHolder.getDisposableComponent();
+                }
+
+                public void update(Set<DatabaseModificationKind> observedModifications)
+                {
+                    getDisposableComponent().update(observedModifications);
+                }
+
+                public DatabaseModificationKind[] getRelevantModifications()
+                {
+                    return getDisposableComponent().getRelevantModifications();
+                }
+
+                public Component getComponent()
+                {
+                    return getDisposableComponent().getComponent();
+                }
+
+                public void dispose()
+                {
+                    getDisposableComponent().dispose();
+                }
+            };
+    }
+
+    /** Holder of a {@link LayoutContainer} and a {@link IDisposableComponent} of a grid inside it. */
+    private static class LayoutContainerWithDisposableComponent
+    {
+        private final LayoutContainer container;
+
+        private IDisposableComponent disposableComponent;
+
+        public LayoutContainerWithDisposableComponent(LayoutContainer container,
+                IDisposableComponent component)
+        {
+            this.container = container;
+            this.disposableComponent = component;
+        }
+
+        public IDisposableComponent getDisposableComponent()
+        {
+            return disposableComponent;
+        }
+
+        public void setDisposableComponent(IDisposableComponent disposableComponent)
+        {
+            this.disposableComponent = disposableComponent;
+        }
+
+        public LayoutContainer getContainer()
+        {
+            return container;
+        }
 
-        // TODO 2011-03-10, Piotr Buczek: dispose report
-        return asDisposableEntityChooser(container, toolbar);
     }
 
 }
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 a7393b4f2dd..5d86f7e9e66 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
@@ -475,7 +475,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
     /** @return this grid as a disposable component */
     protected final DisposableEntityChooser<T> asDisposableWithoutToolbar()
     {
-        return asDisposableEntityChooser(this, null);
+        return asDisposableEntityChooser(this);
     }
 
     /**
@@ -513,8 +513,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         }
     }
 
-    protected DisposableEntityChooser<T> asDisposableEntityChooser(final Component mainComponent,
-            final IDisposableComponent disposableComponentOrNull)
+    protected final DisposableEntityChooser<T> asDisposableEntityChooser(
+            final Component mainComponent, final IDisposableComponent... disposableComponents)
     {
         final AbstractBrowserGrid<T, M> self = this;
         return new DisposableEntityChooser<T>()
@@ -535,9 +535,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                 {
                     debug("dispose a browser");
                     self.disposeCache();
-                    if (disposableComponentOrNull != null)
+                    for (IDisposableComponent disposableComponent : disposableComponents)
                     {
-                        disposableComponentOrNull.dispose();
+                        disposableComponent.dispose();
                     }
                 }
 
-- 
GitLab