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 2d71bda02dd723358f12b5dec0d25ec8781f670c..ad757ce820991040a79bc178700f7de39fe9c6e4 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 @@ -31,7 +31,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs 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.SingleSectionPanel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper; import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator; @@ -88,8 +87,8 @@ public class ExperimentBrowserGrid extends public static DisposableEntityChooser<Experiment> createChooser( final IViewContext<ICommonClientServiceAsync> viewContext) { - final ProjectSelectionTreeWidget tree = new ProjectSelectionTreeWidget(viewContext); - final SingleSectionPanel treeSection = new ProjectSelectionSection(tree); + final ProjectSelectionTreeGridContainer tree = + new ProjectSelectionTreeGridContainer(viewContext); final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext, tree); final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar) { @@ -100,20 +99,20 @@ public class ExperimentBrowserGrid extends } }; browserGrid.addGridRefreshListener(toolbar); - return browserGrid.asDisposableWithToolbarAndTree(toolbar, treeSection); + return browserGrid.asDisposableWithToolbarAndTree(toolbar, tree); } /** Create a grid with the toolbar and a tree. */ public static DisposableEntityChooser<Experiment> create( final IViewContext<ICommonClientServiceAsync> viewContext) { - final ProjectSelectionTreeWidget tree = new ProjectSelectionTreeWidget(viewContext); - final SingleSectionPanel treeSection = new ProjectSelectionSection(tree); + final ProjectSelectionTreeGridContainer tree = + new ProjectSelectionTreeGridContainer(viewContext); final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext, tree); final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar); browserGrid.addGridRefreshListener(toolbar); browserGrid.extendBottomToolbar(); - return browserGrid.asDisposableWithToolbarAndTree(toolbar, treeSection); + return browserGrid.asDisposableWithToolbarAndTree(toolbar, tree); } private final ICriteriaProvider<ListExperimentsCriteria> criteriaProvider; 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 d1c7e6962be89d3a25eadef235ae4cb4128f2503..b1507c19c5be0a193013dc3b4d12e9f147ba7e71 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 @@ -54,12 +54,12 @@ class ExperimentBrowserToolbar extends ToolBar implements private final ExperimentTypeSelectionWidget selectExperimentTypeCombo; - private final ProjectSelectionTreeWidget selectProjectTree; + private final ProjectSelectionTreeGridContainer selectProjectTree; private final IViewContext<ICommonClientServiceAsync> viewContext; public ExperimentBrowserToolbar(final IViewContext<ICommonClientServiceAsync> viewContext, - ProjectSelectionTreeWidget tree) + ProjectSelectionTreeGridContainer tree) { this.viewContext = viewContext; selectExperimentTypeCombo = new ExperimentTypeSelectionWidget(viewContext, ID, true); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionSection.java deleted file mode 100644 index a10331306bf2979e5a12bf79c8c0d97e7e020038..0000000000000000000000000000000000000000 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionSection.java +++ /dev/null @@ -1,37 +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.Style.Scroll; - -import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel; - -/** - * {@link SingleSectionPanel} containing {@link ProjectSelectionTreeWidget}. - * - * @author Piotr Buczek - */ -public class ProjectSelectionSection extends SingleSectionPanel -{ - public ProjectSelectionSection(final ProjectSelectionTreeWidget tree) - { - super("Project Selection"); - setScrollMode(Scroll.AUTOY); - setCollapsible(false); - add(tree); - } -} 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 new file mode 100644 index 0000000000000000000000000000000000000000..ea34d8f7119609191435b533e4fa08a96dedc30f --- /dev/null +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionTreeGridContainer.java @@ -0,0 +1,442 @@ +/* + * 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 java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import com.extjs.gxt.ui.client.Style.SelectionMode; +import com.extjs.gxt.ui.client.data.ModelData; +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.store.TreeStore; +import com.extjs.gxt.ui.client.widget.ContentPanel; +import com.extjs.gxt.ui.client.widget.LayoutContainer; +import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; +import com.extjs.gxt.ui.client.widget.grid.ColumnData; +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.treegrid.TreeGrid; +import com.extjs.gxt.ui.client.widget.treegrid.WidgetTreeGridCellRenderer; +import com.google.gwt.dom.client.Element; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.DomEvent; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.InlineHTML; +import com.google.gwt.user.client.ui.Widget; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback; +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.ProjectViewer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem; +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.ITabItem; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.NonHierarchicalBaseModelData; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils; +import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; +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.TechId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Group; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind; + +/** + * {@link LayoutContainer} containing a {@link TreeGrid} with projects loaded from the server. Main + * items of the tree are project groups and projects are their children. + * + * @author Piotr Buczek + */ +public final class ProjectSelectionTreeGridContainer extends LayoutContainer implements + IDatabaseModificationObserver +{ + + public static final String ID = GenericConstants.ID_PREFIX + "select-project"; + + private final IViewContext<?> viewContext; + + private Project selectedProjectOrNull; + + private SelectionChangedListener<?> selectionChangedListener; + + private final TreeGrid<ModelData> tree; + + public ProjectSelectionTreeGridContainer(final IViewContext<?> viewContext) + { + super(new FitLayout()); + this.viewContext = viewContext; + + ColumnConfig codeColumn = createCodeColumn(); + ColumnModel columnModel = new ColumnModel(Arrays.asList(codeColumn)); + tree = createTreeGrid(columnModel); + + ContentPanel cp = new ContentPanel(); + cp.setBodyBorder(false); + cp.setHeading("Project Selection"); + cp.setLayout(new FitLayout()); + cp.add(tree); + add(cp); + + refreshTree(); + } + + /** @return tree grid with empty store and specified column model */ + private TreeGrid<ModelData> createTreeGrid(ColumnModel columnModel) + { + final TreeGrid<ModelData> treeGrid = + new TreeGrid<ModelData>(new TreeStore<ModelData>(), columnModel); + treeGrid.setId(ID); + treeGrid.setBorders(true); + treeGrid.setAutoExpandColumn(ModelDataPropertyNames.CODE); + treeGrid.getTreeView().setForceFit(true); + treeGrid.getTreeView().setSortingEnabled(false); + treeGrid.getTreeView().setRowHeight(32); + treeGrid + .setTitle("- Click on a row with project code to select it.\n" + + "- If Group/Project description is available it will show up in a tooltip when you mouse over their codes."); + // switchOffFolderIcons + treeGrid.getStyle().setNodeCloseIcon(null); + treeGrid.getStyle().setNodeOpenIcon(null); + + treeGrid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + treeGrid.getSelectionModel().addSelectionChangedListener( + new SelectionChangedListener<ModelData>() + { + @Override + public void selectionChanged(SelectionChangedEvent<ModelData> se) + { + ModelData selected = se.getSelectedItem(); + if (selected != null && tree.isLeaf(selected)) + { + selectedProjectOrNull = + (Project) selected.get(ModelDataPropertyNames.OBJECT); + getSelectionChangedListener().handleEvent(null); + } + } + }); + return treeGrid; + } + + private ColumnConfig createCodeColumn() + { + final ColumnConfig columnConfig = + new ColumnConfig(ModelDataPropertyNames.CODE, "Group/Project Code", 1); + columnConfig.setRenderer(new WidgetTreeGridCellRenderer<ModelData>() + { + @Override + public Widget getWidget(ModelData model, String property, ColumnData config, + int rowIndex, int colIndex, ListStore<ModelData> store, Grid<ModelData> grid) + { + if (model instanceof GroupItemModel) + { + return createGroupWidget((GroupItemModel) model); + } else if (model instanceof ProjectItemModel) + { + return createProjectWidget((ProjectItemModel) model); + } else + { + throw new UnsupportedOperationException("unsupported data model"); + } + } + + private Widget createGroupWidget(GroupItemModel model) + { + final Group group = (Group) model.get(ModelDataPropertyNames.OBJECT); + final Widget result = new InlineHTML(group.getCode()); + result.setTitle(group.getDescription()); + return result; + } + + private Widget createProjectWidget(ProjectItemModel model) + { + final Project project = (Project) model.get(ModelDataPropertyNames.OBJECT); + + final Widget detailsLink = + LinkRenderer.getLinkWidget("(details)", new ClickHandler() + { + + public void onClick(ClickEvent event) + { + showProjectDetailsView(project); + } + + }); + detailsLink.setTitle("Click on the link to show project details in a viewer."); + detailsLink.removeStyleName("inline"); + + final FlowPanel panel = new FlowPanelWithLinkAppearingOnMouseOver(detailsLink); + panel.setTitle(project.getDescription()); + panel.add(new InlineHTML(project.getCode() + " ")); + panel.add(detailsLink); + return panel; + } + + class FlowPanelWithLinkAppearingOnMouseOver extends FlowPanel + { + + private final Widget link; + + public FlowPanelWithLinkAppearingOnMouseOver(Widget link) + { + super(); + this.link = link; + sinkEvents(Event.ONMOUSEOVER | Event.ONMOUSEOUT); + link.setVisible(false); + } + + @Override + @SuppressWarnings("deprecation") + public void onBrowserEvent(Event event) + { + switch (DOM.eventGetType(event)) + { + case Event.ONMOUSEOVER: + // Only fire the mouse over event if it's coming from + // outside + // this widget. + case Event.ONMOUSEOUT: + // Only fire the mouse out event if it's leaving this + // widget. + Element related = event.getRelatedTarget(); + if (related != null && getElement().isOrHasChild(related)) + { + return; + } + // this is the only part different from FlowPanel + link.setVisible(DOM.eventGetType(event) == Event.ONMOUSEOVER); + // + break; + } + DomEvent.fireNativeEvent(event, this, this.getElement()); + } + } + + }); + return columnConfig; + } + + private void showProjectDetailsView(final Project project) + { + ITabItemFactory tabFactory; + final TechId projectId = TechId.create(project); + tabFactory = new ITabItemFactory() + { + public ITabItem create() + { + final DatabaseModificationAwareComponent viewer = + ProjectViewer.create(viewContext.getCommonViewContext(), projectId); + return DefaultTabItem.create(getViewerTitle(), viewer, viewContext, false); + } + + public String getId() + { + return ProjectViewer.createId(projectId); + } + + private String getViewerTitle() + { + return AbstractViewer.getTitle(viewContext, Dict.PROJECT, project); + } + }; + DispatcherHelper.dispatchNaviEvent(tabFactory); + } + + /** + * Returns the {@link Project} currently selected. + * + * @return <code>null</code> if no project is selected. + */ + public final Project tryGetSelectedProject() + { + return selectedProjectOrNull; + } + + private SelectionChangedListener<?> getSelectionChangedListener() + { + return selectionChangedListener; + } + + public void setSelectionChangedListener(SelectionChangedListener<?> listener) + { + selectionChangedListener = listener; + } + + private void clearTree() + { + tree.getStore().removeAll(); + } + + /** + * Rebuilds the tree from a list of projects. + */ + private void rebuildTree(List<Project> projects) + { + clearTree(); + addToStore(projects); + tree.expandAll(); + } + + /** adds items for given <var>projects</var> to the tree */ + private void addToStore(List<Project> projects) + { + for (Group group : getSortedGroups(projects)) + { + GroupItemModel groupModel = new GroupItemModel(group); + tree.getTreeStore().add(groupModel, true); + tree.setLeaf(groupModel, false); + for (Project project : projects) + { + if (project.getGroup().equals(group)) + { + ProjectItemModel projectModel = new ProjectItemModel(project); + tree.getTreeStore().add(groupModel, projectModel, false); + tree.setLeaf(projectModel, true); + } + } + } + } + + /** @return a sorted set of groups of given <var>projects</var> */ + private Set<Group> getSortedGroups(List<Project> projects) + { + Set<Group> groups = new TreeSet<Group>(); + for (final Project project : projects) + { + groups.add(project.getGroup()); + } + return groups; + } + + /** + * Refreshes the whole tree. If the previously selected project is no longer present in the db, + * nothing will be selected. Otherwise the previous selection will be preserved. + */ + public void refreshTree() + { + loadData(); + } + + private void loadData() + { + DefaultResultSetConfig<String, Project> config = DefaultResultSetConfig.createFetchAll(); + viewContext.getCommonService().listProjects(config, new ListProjectsCallback(viewContext)); + } + + private void selectByIdentifierIfPossible(String projectIdentifier) + { + GWTUtils + .setSelectedItem(tree, ModelDataPropertyNames.PROJECT_IDENTIFIER, projectIdentifier); + } + + public DatabaseModificationKind[] getRelevantModifications() + { + return DatabaseModificationKind.any(ObjectKind.PROJECT); + } + + public void update(Set<DatabaseModificationKind> observedModifications) + { + refreshTree(); + } + + // + // Helper classes + // + private final class ListProjectsCallback extends AbstractAsyncCallback<ResultSet<Project>> + { + ListProjectsCallback(final IViewContext<?> viewContext) + { + super(viewContext); + } + + @Override + protected void process(final ResultSet<Project> result) + { + List<Project> projects = result.getList().extractOriginalObjects(); + rebuildTree(projects); + + if (selectedProjectOrNull != null) + { + selectByIdentifierIfPossible(selectedProjectOrNull.getIdentifier()); + } + } + } + + private static class BaseModelDataWithCode extends NonHierarchicalBaseModelData + { + private static final long serialVersionUID = 1L; + + public BaseModelDataWithCode(ICodeProvider codeProvider) + { + set(ModelDataPropertyNames.CODE, codeProvider.getCode()); + set(ModelDataPropertyNames.OBJECT, codeProvider); + } + + @Override + public String toString() + { + return get(ModelDataPropertyNames.CODE); + } + } + + public static final String PROJECT_WITH_GROUP_CODE = "projectWithGroupCode"; + + private static class ProjectItemModel extends BaseModelDataWithCode + { + + private static final long serialVersionUID = 1L; + + public ProjectItemModel(Project project) + { + super(project); + set(ModelDataPropertyNames.PROJECT_IDENTIFIER, project.getIdentifier()); + set(PROJECT_WITH_GROUP_CODE, getProjectWithGroupCode(project)); + } + + private static String getProjectWithGroupCode(Project project) + { + return project.getCode() + " (" + project.getGroup().getCode() + ")"; + } + + } + + private static class GroupItemModel extends BaseModelDataWithCode + { + private static final long serialVersionUID = 1L; + + public GroupItemModel(Group group) + { + super(group); + } + } + +} \ No newline at end of file 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 8ab6abf1ac0d73e27eae0195f2c94b39113c991d..269ffa29914c0e32a7eb40b1655a3e444701601a 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 @@ -390,7 +390,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod final LayoutContainer subContainer = new LayoutContainer(); subContainer.setLayout(new RowLayout(Orientation.HORIZONTAL)); - subContainer.add(tree, new RowData(250, 1)); + subContainer.add(tree, new RowData(300, 1)); subContainer.add(this, new RowData(1, 1)); container.add(subContainer, new RowData(1, 1)); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GWTUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GWTUtils.java index 45ef327a700f4268602563d4e990f7d2fa5a85d4..5f65c49342058799ef46875336b5faa1f5fbe907 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GWTUtils.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GWTUtils.java @@ -21,9 +21,9 @@ import java.util.List; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.store.ListStore; -import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.widget.form.ComboBox; import com.extjs.gxt.ui.client.widget.form.Field; +import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.ui.ListBox; @@ -122,28 +122,41 @@ public final class GWTUtils comboBox.setValue(null); } + /** + * Selects given <var>value</var> of given <var>tree</var>. + */ + public final static void setSelectedItem(final TreeGrid<ModelData> tree, final String property, + final String value) + { + ModelData model = tryFindModel(tree.getTreeStore().getAllItems(), property, value); + if (model != null) + { + tree.getSelectionModel().select(model, false); + } + } + /** * Selects given <var>value</var> of given <var>tree</var>. */ public final static void setSelectedItem(final TreePanel<ModelData> tree, final String property, final String value) { - ModelData model = tryFindModel(tree, property, value); + ModelData model = tryFindModel(tree.getStore().getAllItems(), property, value); if (model != null) { tree.getSelectionModel().select(model, false); } } - /** @return specified item from the tree if it's found, null otherwise */ - public final static ModelData tryFindModel(final TreePanel<ModelData> tree, - final String property, final String value) + /** @return specified model from the list if it's found, null otherwise */ + public final static ModelData tryFindModel(final List<ModelData> models, final String property, + final String value) { - assert tree != null : "Unspecified tree."; + assert models != null : "Unspecified models."; assert property != null : "Unspecified model property."; assert value != null : "Unspecified model property value."; - TreeStore<ModelData> items = tree.getStore(); - for (ModelData model : items.getAllItems()) + + for (ModelData model : models) { if (model != null) { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ListExperiments.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ListExperiments.java index dbbac957708afd9607d204aecda2d3ee7ff7a369..16ef2c0ad1d0f3e4662dc5618a72adb527f1d551 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ListExperiments.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ListExperiments.java @@ -16,7 +16,9 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment; +import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.widget.form.ComboBox; +import com.extjs.gxt.ui.client.widget.treegrid.TreeGrid; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExperimentTypeModel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames; @@ -46,11 +48,12 @@ public class ListExperiments extends AbstractDefaultTestCommand // AbstractDefaultTestCommand // + @SuppressWarnings("unchecked") public void execute() { - final ProjectSelectionTreeWidget projectSelector = - (ProjectSelectionTreeWidget) GWTTestUtil - .getWidgetWithID(ProjectSelectionTreeWidget.ID); + final TreeGrid<ModelData> projectSelector = + (TreeGrid<ModelData>) GWTTestUtil + .getWidgetWithID(ProjectSelectionTreeGridContainer.ID); final ComboBox<ExperimentTypeModel> experimentTypeSelector = (ExperimentTypeSelectionWidget) GWTTestUtil @@ -62,7 +65,8 @@ public class ListExperiments extends AbstractDefaultTestCommand GWTUtils.unselect(experimentTypeSelector); GWTUtils.setSelectedItem(projectSelector, - ProjectSelectionTreeWidget.PROJECT_WITH_GROUP_CODE, projectCodeOrNull); + ProjectSelectionTreeGridContainer.PROJECT_WITH_GROUP_CODE, projectCodeOrNull); + GWTUtils.setSelectedItem(experimentTypeSelector, ModelDataPropertyNames.CODE, experimentTypeNameOrNull); }