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 b10121132a9468e2be392323e3b8ff37845d481f..73c4dda8e2fe2b1e85efea220778ff627c670b8a 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 a7393b4f2dda91883b2e92498e91b164b139aa70..5d86f7e9e66e5492c02eb6fec8ff0afae8831099 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(); } }