diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java index 6269f31fa01656813135332865c050bfcbbb497f..d568588f12a7eca76102a3cf015febb16fed02bc 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java @@ -16,9 +16,6 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application; -import com.extjs.gxt.ui.client.Events; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.TabPanelEvent; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.form.TextField; @@ -188,9 +185,7 @@ final class SearchWidget extends LayoutContainer private static ITabItemFactory createTabFactory( final MatchingEntitiesPanel matchingEntitiesPanel, String title) { - final DefaultTabItem tab = - new DefaultTabItem(title, matchingEntitiesPanel, false, - createTabPanelEventListener(matchingEntitiesPanel)); + final DefaultTabItem tab = new DefaultTabItem(title, matchingEntitiesPanel, false); // this tab cannot be opened for the second time, so we can create it outside of the // factory return new ITabItemFactory() @@ -239,20 +234,4 @@ final class SearchWidget extends LayoutContainer }; return button; } - - private static Listener<TabPanelEvent> createTabPanelEventListener( - final MatchingEntitiesPanel matchingEntitiesPanel) - { - return new Listener<TabPanelEvent>() - { - public void handleEvent(TabPanelEvent be) - { - if (be.type == Events.Close) - { - matchingEntitiesPanel.disposeCache(); - } - } - }; - } - } 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 b598d6b36a9825f2f309c052e3b39af465dbc938..2d8503a9b4cc30d77f27bdbba547d62df0bfc984 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 @@ -23,15 +23,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict; import ch.systemsx.cisd.openbis.generic.client.web.client.application.GroupsView; import ch.systemsx.cisd.openbis.generic.client.web.client.application.PersonsView; import ch.systemsx.cisd.openbis.generic.client.web.client.application.RolesView; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowser; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowserGrid; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentRegistrationPanel; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.project.ProjectBrowser; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeAssignmentBrowser; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeAssignmentForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeBrowser; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeRegistrationForm; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBatchRegistrationPanel; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowser; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationPanel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyBrowser; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyRegistrationForm; @@ -65,14 +66,13 @@ final class ComponentProvider { public ITabItem create() { - SampleBrowser sampleBrowser = new SampleBrowser(viewContext); - return new DefaultTabItem(getMessage(Dict.SAMPLE_BROWSER), sampleBrowser, - false, sampleBrowser); + DisposableComponent browser = SampleBrowserGrid.create(viewContext); + return DefaultTabItem.create(getMessage(Dict.SAMPLE_BROWSER), browser, false); } public String getId() { - return SampleBrowser.ID; + return SampleBrowserGrid.BROWSER_ID; } }; } @@ -253,14 +253,14 @@ final class ComponentProvider { public ITabItem create() { - ExperimentBrowser experimentBrowser = new ExperimentBrowser(viewContext); - return new DefaultTabItem(getMessage(Dict.EXPERIMENT_BROWSER), - experimentBrowser, false, experimentBrowser); + DisposableComponent browser = ExperimentBrowserGrid.create(viewContext); + return DefaultTabItem.create(getMessage(Dict.EXPERIMENT_BROWSER), browser, + false); } public String getId() { - return ExperimentBrowser.ID; + return ExperimentBrowserGrid.BROWSER_ID; } }; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java index 9aae5c6acebc8062911668a156bbd59528cb280c..b696f7779229716ee017f9284ece8efe0b72010e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java @@ -16,11 +16,12 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework; +import com.extjs.gxt.ui.client.Events; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.TabPanelEvent; import com.extjs.gxt.ui.client.widget.Component; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent; /** * A default {@link ITabItem} implementation. @@ -43,14 +44,34 @@ public class DefaultTabItem implements ITabItem this(title, component, isCloseConfirmationNeeded, null); } - public DefaultTabItem(final String title, final Component component, + public static DefaultTabItem create(final String title, final DisposableComponent component, + boolean isCloseConfirmationNeeded) + { + Listener<TabPanelEvent> eventListener = createCloseEventListener(component); + return new DefaultTabItem(title, component.getComponent(), isCloseConfirmationNeeded, + eventListener); + } + + private static Listener<TabPanelEvent> createCloseEventListener( + final DisposableComponent component) + { + return new Listener<TabPanelEvent>() + { + public final void handleEvent(final TabPanelEvent be) + { + if (be.type == Events.Close) + { + component.dispose(); + } + } + }; + } + + private DefaultTabItem(final String title, final Component component, boolean isCloseConfirmationNeeded, final Listener<TabPanelEvent> tabPanelEventListener) { assert title != null : "Unspecified title."; assert component != null : "Unspecified component."; - // Note that if not set, is then automatically generated. So this is why we test for - // 'ID_PREFIX'. We want the user to set an unique id. - assert component.getId().startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id."; this.title = title; this.component = component; this.isCloseConfirmationNeeded = isCloseConfirmationNeeded; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java index 043500d600aba2b2714a26b225777b0c841e31ab..ef2ec126613f1db2cdce901f833548766df61f6a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java @@ -28,7 +28,8 @@ public interface ITabItemFactory ITabItem create(); /** - * Returns the unique identifier of this tab item. + * Returns the unique identifier of this tab item. Note that the id should be unique among all + * tabs, not widgets. * <p> * The framework ensures that no two components with the same id will be displayed. Instead the * one already created will get the focus. diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java index f2f4fab39d492833e178f5251b62001ca75e28dc..13c097a84b0983821996af513a01bda60cfd47ed 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java @@ -104,6 +104,9 @@ public class MainTabPanel extends TabPanel } else { String tabId = tabItemFactory.getId(); + // Note that if not set, is then automatically generated. So this is why we test for + // 'ID_PREFIX'. We want the user to set an unique id. + assert tabId.startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id."; final MainTabItem newTab = new MainTabItem(tabItemFactory.create(), tabId); add(newTab); openTabs.put(tabId, newTab); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java deleted file mode 100644 index d847adfade52ba8c36b8611b52837377e0c9b9d3..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2008 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment; - -import com.extjs.gxt.ui.client.Events; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.TabPanelEvent; -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; - -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; - -/** - * Main view component of experiment browser. - * - * @author Izabela Adamczyk - */ -public final class ExperimentBrowser extends LayoutContainer implements Listener<TabPanelEvent> -{ - private static final String PREFIX = "experiment-browser"; - - public static final String ID = GenericConstants.ID_PREFIX + PREFIX; - - private final ExperimentBrowserGrid experimentBrowserGrid; - - public ExperimentBrowser(final IViewContext<ICommonClientServiceAsync> viewContext) - { - setId(ID); - setLayout(new RowLayout()); - - final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext); - experimentBrowserGrid = new ExperimentBrowserGrid(viewContext, toolbar); - - add(toolbar); - add(experimentBrowserGrid, new RowData(1, 1)); - } - - public final void handleEvent(final TabPanelEvent be) - { - if (be.type == Events.Close) - { - experimentBrowserGrid.disposeCache(); - } - } -} \ No newline at end of file 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 398c26920b3d681c206bdef7dfe9a2d2245c7c68..32f466d2c464f21b2408cea47002ec2a3d62b2e2 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 @@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework. import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExperimentModel; 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.DisposableComponent; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.ColumnDefsAndConfigs; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.EntityKind; @@ -54,8 +55,16 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, private final ExperimentBrowserToolbar topToolbar; private ListExperimentsCriteria criteria; - - ExperimentBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, + + public static DisposableComponent create( + final IViewContext<ICommonClientServiceAsync> viewContext) + { + final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext); + final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar); + return browserGrid.createWithToolbar(toolbar); + } + + private ExperimentBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, ExperimentBrowserToolbar topToolbar) { super(viewContext, GRID_ID); @@ -131,7 +140,7 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, } @Override - public final void refresh() + protected final void refresh() { ListExperimentsCriteria newCriteria = topToolbar.tryGetCriteria(); if (newCriteria == null) 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 ff06c184eeb998ddb5e45d308c3381400a219179..08681af39307427e5baeb7aa37f6843374f18a21 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 @@ -35,6 +35,7 @@ import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.store.ListStore; +import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.button.Button; @@ -42,6 +43,8 @@ import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.layout.FitLayout; +import com.extjs.gxt.ui.client.widget.layout.RowData; +import com.extjs.gxt.ui.client.widget.layout.RowLayout; import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem; import com.extjs.gxt.ui.client.widget.toolbar.ToolBar; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -163,6 +166,28 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex add(contentPanel); } + /** @return this grid as a disposable component with a specified toolbar at the top. */ + protected final DisposableComponent createWithToolbar(final Component toolbar) + { + final LayoutContainer container = new LayoutContainer(); + container.setLayout(new RowLayout()); + container.add(toolbar); + container.add(this, new RowData(1, 1)); + + return new DisposableComponent() + { + public void dispose() + { + disposeCache(); + } + + public Component getComponent() + { + return container; + } + }; + } + private PagingLoader<PagingLoadConfig> createPagingLoader() { final RpcProxy<PagingLoadConfig, PagingLoadResult<M>> proxy = createDataLoaderProxy(); @@ -463,7 +488,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex } } - public final void disposeCache() + private void disposeCache() { if (resultSetKey != null) { diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..9dd4eb88e4959e9714ebf582d6b5ec41f172a67e --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java @@ -0,0 +1,32 @@ +/* + * Copyright 2009 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid; + +import com.extjs.gxt.ui.client.widget.Component; + +/** + * Component which should be disposed at the end of the life cycle + * + * @author Tomasz Pylak + */ +public interface DisposableComponent +{ + Component getComponent(); + + /** cleans resources, should be called at the end of the component's life cycle */ + void dispose(); +} diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java deleted file mode 100644 index 113b38d466c03ebba78b91061c612ff6233aa3ea..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2008 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample; - -import com.extjs.gxt.ui.client.Events; -import com.extjs.gxt.ui.client.event.Listener; -import com.extjs.gxt.ui.client.event.TabPanelEvent; -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; - -import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext; - -/** - * Main view component of Sample Browser. - * - * @author Izabela Adamczyk - */ -public final class SampleBrowser extends LayoutContainer implements Listener<TabPanelEvent> -{ - private static final String PREFIX = "sample-browser"; - - public static final String ID = GenericConstants.ID_PREFIX + PREFIX; - - private SampleBrowserGrid sampleBrowserGrid; - - public SampleBrowser(final IViewContext<ICommonClientServiceAsync> viewContext) - { - setId(ID); - setLayout(new RowLayout()); - - final SampleBrowserToolbar toolbar = new SampleBrowserToolbar(viewContext); - sampleBrowserGrid = new SampleBrowserGrid(viewContext, toolbar); - - add(toolbar); - add(sampleBrowserGrid, new RowData(1, 1)); - } - - // - // Listener - // - - public final void handleEvent(final TabPanelEvent be) - { - if (be.type == Events.Close) - { - sampleBrowserGrid.disposeCache(); - } - } -} \ 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 a2affec84f8c29a6fb8870c2f022530614b7dd3b..6e4abc0f5a5dc7cbaaa471160eab6b41880bcf32 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 @@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory; 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.DisposableComponent; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.ColumnDefsAndConfigs; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleModel; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; @@ -46,18 +47,27 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri */ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleModel> { - private static final String PREFIX = "sample-browser-grid_"; + private static final String PREFIX = GenericConstants.ID_PREFIX + "sample-browser-grid_"; - public static final String BROWSER_ID = GenericConstants.ID_PREFIX + PREFIX + "sample_browser"; + // browser consists of the grid and the toolbar + public static final String BROWSER_ID = PREFIX + "sample_browser"; - public static final String GRID_ID = GenericConstants.ID_PREFIX + PREFIX + "grid"; + public static final String GRID_ID = PREFIX + "grid"; private final SampleBrowserToolbar topToolbar; // criteria used in the previous refresh operation or null if it has not occurred yet private ListSampleCriteria criteria; - SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, + public static DisposableComponent create( + final IViewContext<ICommonClientServiceAsync> viewContext) + { + final SampleBrowserToolbar toolbar = new SampleBrowserToolbar(viewContext); + final SampleBrowserGrid browserGrid = new SampleBrowserGrid(viewContext, toolbar); + return browserGrid.createWithToolbar(toolbar); + } + + private SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext, SampleBrowserToolbar topToolbar) { super(viewContext, GRID_ID); @@ -138,7 +148,7 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM * </p> */ @Override - public final void refresh() + protected final void refresh() { ListSampleCriteria newCriteria = topToolbar.tryGetCriteria(); if (newCriteria == null)