Skip to content
Snippets Groups Projects
Commit 5b9d8d01 authored by buczekp's avatar buczekp
Browse files

[LMS-2083] improved UI with DataSetProcessingMenu

SVN: 20186
parent c7ddad29
No related branches found
No related tags found
No related merge requests found
......@@ -20,30 +20,30 @@ import java.util.List;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.SelectedOrAllDataSetsRadioProvider.ISelectedDataSetsProvider;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
class ComputationData implements ISelectedDataSetsProvider
{
private final DataStoreServiceKind dssTaskKind;
private final DatastoreServiceDescription service;
private final IComputationAction computationAction;
private final SelectedAndDisplayedItems selectedAndDisplayedItems;
public ComputationData(DataStoreServiceKind dssTaskKind,
public ComputationData(DatastoreServiceDescription service,
IComputationAction computationAction,
SelectedAndDisplayedItems selectedAndDisplayedItems)
{
super();
this.dssTaskKind = dssTaskKind;
this.service = service;
this.computationAction = computationAction;
this.selectedAndDisplayedItems = selectedAndDisplayedItems;
}
public DataStoreServiceKind getDssTaskKind()
public DatastoreServiceDescription getService()
{
return dssTaskKind;
return service;
}
public IComputationAction getComputationAction()
......
......@@ -24,8 +24,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
/**
......@@ -36,27 +36,29 @@ public class DataSetComputeUtils
public static IDelegatedAction createComputeAction(
final IViewContext<ICommonClientServiceAsync> viewContext,
final SelectedAndDisplayedItems selectedAndDisplayedItems,
final DatastoreServiceDescription service, final DataStoreServiceKind dssTaskKind,
final IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedDataSetsGetter,
final DatastoreServiceDescription service,
final IOnReportComponentGeneratedAction reportGeneratedAction)
{
return new IDelegatedAction()
{
public void execute()
{
final SelectedAndDisplayedItems selectedAndDisplayedItems =
selectedDataSetsGetter.execute();
final IComputationAction computationAction =
createComputationAction(viewContext, selectedAndDisplayedItems,
dssTaskKind, reportGeneratedAction);
reportGeneratedAction);
final ComputationData data =
new ComputationData(dssTaskKind, computationAction,
new ComputationData(service, computationAction,
selectedAndDisplayedItems);
createPerformComputationDialog(data).show();
}
private Window createPerformComputationDialog(ComputationData data)
{
final String title = "Perform " + dssTaskKind.getDescription();
return new PerformComputationDialog(viewContext, data, title, service);
final String title = "Perform " + service.getLabel();
return new PerformComputationDialog(viewContext, data, title);
}
};
}
......@@ -64,7 +66,6 @@ public class DataSetComputeUtils
private static IComputationAction createComputationAction(
final IViewContext<ICommonClientServiceAsync> viewContext,
final SelectedAndDisplayedItems selectedAndDisplayedItems,
final DataStoreServiceKind dssTaskKind,
final IOnReportComponentGeneratedAction reportGeneratedAction)
{
return new IComputationAction()
......@@ -73,7 +74,7 @@ public class DataSetComputeUtils
{
DisplayedOrSelectedDatasetCriteria criteria =
selectedAndDisplayedItems.createCriteria(computeOnSelected);
switch (dssTaskKind)
switch (service.getServiceKind())
{
case QUERIES:
DataSetReportGenerator.generateAndInvoke(viewContext, service,
......
/*
* Copyright 2011 ETH Zuerich, CISD
* 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.
......@@ -18,96 +18,66 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
import java.util.List;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.Util;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.DropDownList;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.TextToolItem;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
/**
* 'Actions' menu for Data Sets.
*
* @author Piotr Buczek
*/
public class ProcessingPluginSelectionWidget extends
DropDownList<DatastoreServiceDescriptionModel, DatastoreServiceDescription>
public class DataSetProcessingMenu extends TextToolItem
{
private final IViewContext<?> viewContext;
private final IViewContext<ICommonClientServiceAsync> viewContext;
public ProcessingPluginSelectionWidget(final IViewContext<?> viewContext,
final IIdHolder ownerIdOrNull)
private final IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedDataSetsGetter;
public DataSetProcessingMenu(IViewContext<ICommonClientServiceAsync> viewContext,
IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedDataSetsGetter,
List<DatastoreServiceDescription> processingServices)
{
super(
viewContext,
(((ownerIdOrNull != null) ? ownerIdOrNull.getId().toString() : "") + "_data-set_processing-plugins"),
Dict.BUTTON_PROCESS, ModelDataPropertyNames.LABEL, "action", "actions");
super(viewContext.getMessage(Dict.MENU_PROCESSING));
this.viewContext = viewContext;
addPostRefreshCallback(createHideOnNoServicesAction());
this.selectedDataSetsGetter = selectedDataSetsGetter;
Menu submenu = new Menu();
for (DatastoreServiceDescription service : processingServices)
{
addMenuItem(submenu, service);
}
setMenu(submenu);
}
private IDataRefreshCallback createHideOnNoServicesAction()
private final void addMenuItem(Menu submenu, final DatastoreServiceDescription service)
{
return new IDataRefreshCallback()
final IDelegatedAction menuItemAction =
DataSetComputeUtils.createComputeAction(viewContext, selectedDataSetsGetter,
service, null);
final IActionMenuItem menuItemKind = new IActionMenuItem()
{
public void postRefresh(boolean wasSuccessful)
public String getMenuText(IMessageProvider messageProvider)
{
// hide combo box if there are no services
final ListStore<DatastoreServiceDescriptionModel> modelsStore = getStore();
if (modelsStore.getCount() > 0)
{
show();
} else
{
hide();
}
return service.getLabel();
}
};
}
@Override
protected List<DatastoreServiceDescriptionModel> convertItems(
List<DatastoreServiceDescription> result)
{
List<DatastoreServiceDescriptionModel> models =
DatastoreServiceDescriptionModel.convert(result, null);
return models;
}
@Override
protected void loadData(AbstractAsyncCallback<List<DatastoreServiceDescription>> callback)
{
viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING,
callback);
}
public DatabaseModificationKind[] getRelevantModifications()
{
return new DatabaseModificationKind[0]; // don't update
}
@Override
public void setValue(DatastoreServiceDescriptionModel value)
{
// fire SelectionChange event on each combo box selection, even if selected item
// did't change, to refresh viewer
DatastoreServiceDescriptionModel oldValue = getValue();
super.setValue(value);
if (Util.equalWithNull(oldValue, value))
{
SelectionChangedEvent<DatastoreServiceDescriptionModel> se =
new SelectionChangedEvent<DatastoreServiceDescriptionModel>(this,
getSelection());
fireEvent(Events.SelectionChange, se);
}
public String getMenuId()
{
return service.getKey();
}
};
submenu.add(new ActionMenu(menuItemKind, viewContext, menuItemAction));
}
}
......@@ -62,16 +62,16 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
private final SelectedOrAllDataSetsRadioProvider radioProvider;
private final DatastoreServiceDescription selectedPlugin;
private final DatastoreServiceDescription pluginTask;
private Html selectedDataSetTypesText;
protected PerformComputationDialog(IViewContext<ICommonClientServiceAsync> viewContext,
ComputationData data, String title, DatastoreServiceDescription selectedPlugin)
ComputationData data, String title)
{
super(viewContext, data, title);
this.viewContext = viewContext;
this.selectedPlugin = selectedPlugin;
this.pluginTask = data.getService();
this.radioProvider = new SelectedOrAllDataSetsRadioProvider(data);
this.dataStoreOrNull = tryGetSingleDatastore(data);
......@@ -107,7 +107,7 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
protected String createMessage()
{
int size = data.getSelectedDataSets().size();
String computationName = selectedPlugin.getLabel();
String computationName = pluginTask.getLabel();
if (size == 0)
{
final String msgIntroduction = viewContext.getMessage(Dict.NO_DATASETS_SELECTED);
......@@ -134,12 +134,11 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
@Override
protected boolean validate()
{
final DatastoreServiceDescription selectedPluginTask = getSelectedPluginTask();
final boolean computeOnSelected = getComputeOnSelected();
if (computeOnSelected)
{
// show error message if plugin does not support all types of selected data sets
Set<String> supportedDataSetTypes = getSupportedDataSetTypes(selectedPluginTask);
Set<String> supportedDataSetTypes = getSupportedDataSetTypes(pluginTask);
List<String> unsupportedDataSetTypes = new ArrayList<String>();
for (String selectedDataSetType : selectedDataSetTypeCodes)
{
......@@ -162,9 +161,8 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
protected void executeConfirmedAction()
{
final IComputationAction computationAction = data.getComputationAction();
final DatastoreServiceDescription selectedPluginTask = getSelectedPluginTask();
final boolean computeOnSelected = getComputeOnSelected();
computationAction.execute(selectedPluginTask, computeOnSelected);
computationAction.execute(pluginTask, computeOnSelected);
}
private Set<String> getSupportedDataSetTypes(DatastoreServiceDescription plugin)
......@@ -172,11 +170,6 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
return new HashSet<String>(Arrays.asList(plugin.getDatasetTypeCodes()));
}
private DatastoreServiceDescription getSelectedPluginTask()
{
return selectedPlugin;
}
@Override
protected void extendForm()
{
......
......@@ -16,24 +16,29 @@
package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
import java.util.List;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetComputeUtils;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetProcessingMenu;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetReportGenerator;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DatastoreServiceDescriptionModel;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ProcessingPluginSelectionWidget;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ReportingPluginSelectionWidget;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.DropDownList;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
/**
......@@ -41,9 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
*/
public abstract class AbstractDataSetsSection extends DisposableTabContent
{
protected final DropDownList<DatastoreServiceDescriptionModel, DatastoreServiceDescription> reportSelectionWidget;
protected final DropDownList<DatastoreServiceDescriptionModel, DatastoreServiceDescription> processingSelectionWidget;
protected final ReportingPluginSelectionWidget reportSelectionWidget;
protected final IOnReportComponentGeneratedAction reportGeneratedAction;
......@@ -54,8 +57,6 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
{
super(header, viewContext, ownerIdOrNull);
this.reportSelectionWidget = new ReportingPluginSelectionWidget(viewContext, ownerIdOrNull);
this.processingSelectionWidget =
new ProcessingPluginSelectionWidget(viewContext, ownerIdOrNull);
this.reportGeneratedAction = new IOnReportComponentGeneratedAction()
{
public void execute(IDisposableComponent gridComponent)
......@@ -68,23 +69,27 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
protected abstract IDisposableComponent createDatasetBrowserComponent();
protected void initWidgets()
protected void initWidgets(AbstractExternalDataGrid browser)
{
getHeader().addTool(reportSelectionWidget);
getHeader().addTool(processingSelectionWidget);
if (viewContext.isSimpleMode() == false)
{
// processing plugins should be hidden in simple view mode
viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING,
new LoadProcessingPluginsCallback(viewContext, browser));
}
}
@Override
protected final IDisposableComponent createDisposableContent()
{
initWidgets();
metadataComponent = createDatasetBrowserComponent();
initWidgets(extractBrowser(metadataComponent));
SelectionChangedListener<DatastoreServiceDescriptionModel> serviceChangedListener =
createServiceSelectionChangedListener(viewContext, metadataComponent,
SelectionChangedListener<DatastoreServiceDescriptionModel> reportChangedListener =
createReportSelectionChangedListener(viewContext, metadataComponent,
reportGeneratedAction);
reportSelectionWidget.addSelectionChangedListener(serviceChangedListener);
processingSelectionWidget.addSelectionChangedListener(serviceChangedListener);
reportSelectionWidget.addSelectionChangedListener(reportChangedListener);
return metadataComponent;
}
......@@ -112,12 +117,16 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
metadataComponent.dispose(); // NOTE: second dispose on a grid does nothing
}
private static SelectionChangedListener<DatastoreServiceDescriptionModel> createServiceSelectionChangedListener(
private static AbstractExternalDataGrid extractBrowser(IDisposableComponent metadataComponent)
{
return (AbstractExternalDataGrid) metadataComponent.getComponent();
}
private static SelectionChangedListener<DatastoreServiceDescriptionModel> createReportSelectionChangedListener(
final IViewContext<?> viewContext, final IDisposableComponent metadataComponent,
final IOnReportComponentGeneratedAction reportGeneratedAction)
{
final AbstractExternalDataGrid browser =
(AbstractExternalDataGrid) metadataComponent.getComponent();
final AbstractExternalDataGrid browser = extractBrowser(metadataComponent);
return new SelectionChangedListener<DatastoreServiceDescriptionModel>()
{
......@@ -135,54 +144,69 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
showMetadataView();
} else
{
switch (service.getServiceKind())
{
case PROCESSING:
process(service);
break;
case QUERIES:
showGeneratedReportComponentView(service);
break;
}
showGeneratedReport(service);
}
}
}
private void process(DatastoreServiceDescription service)
{
SelectedAndDisplayedItems items =
browser.getSelectedAndDisplayedItemsAction().execute();
DataSetComputeUtils.createComputeAction(viewContext.getCommonViewContext(),
items, service, service.getServiceKind(), reportGeneratedAction)
.execute();
}
private void showMetadataView()
{
reportGeneratedAction.execute(metadataComponent);
}
private void showGeneratedReportComponentView(DatastoreServiceDescription service)
private void showGeneratedReport(DatastoreServiceDescription service)
{
SelectedAndDisplayedItems items =
browser.getSelectedAndDisplayedItemsAction().execute();
assert service.getServiceKind() == DataStoreServiceKind.QUERIES;
IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction =
browser.getSelectedAndDisplayedItemsAction();
if (browser.getSelectedItems().isEmpty())
{
// when no data sets were selected perform query without asking
DisplayedOrSelectedDatasetCriteria criteria = items.createCriteria(false);
// when no data sets were selected perform query on all without asking
DisplayedOrSelectedDatasetCriteria criteria =
selectedAndDisplayedItemsAction.execute().createCriteria(false);
DataSetReportGenerator.generateAndInvoke(
viewContext.getCommonViewContext(), service, criteria,
reportGeneratedAction);
} else
{
DataSetComputeUtils.createComputeAction(viewContext.getCommonViewContext(),
items, service, service.getServiceKind(), reportGeneratedAction)
selectedAndDisplayedItemsAction, service, reportGeneratedAction)
.execute();
}
}
};
}
public final class LoadProcessingPluginsCallback extends
AbstractAsyncCallback<List<DatastoreServiceDescription>>
{
private final AbstractExternalDataGrid browser;
public LoadProcessingPluginsCallback(final IViewContext<?> viewContext,
AbstractExternalDataGrid browser)
{
super(viewContext);
this.browser = browser;
}
@Override
protected void process(List<DatastoreServiceDescription> result)
{
if (result.isEmpty() == false)
{
DataSetProcessingMenu menu =
new DataSetProcessingMenu(viewContext.getCommonViewContext(),
browser.getSelectedAndDisplayedItemsAction(), result);
getHeader().addTool(new SeparatorToolItem());
getHeader().addTool(menu);
}
}
}
}
......@@ -22,6 +22,7 @@ import com.extjs.gxt.ui.client.widget.form.CheckBox;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DatastoreServiceDescriptionModel;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ReportingPluginSelectionWidget;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
......@@ -52,7 +53,7 @@ public class SampleDataSetsSection extends AbstractDataSetsSection
}
@Override
protected void initWidgets()
protected void initWidgets(AbstractExternalDataGrid browser)
{
// first add check box
getHeader().addTool(showOnlyDirectlyConnectedCheckBox);
......@@ -80,7 +81,7 @@ public class SampleDataSetsSection extends AbstractDataSetsSection
}
}
});
super.initWidgets();
super.initWidgets(browser);
}
@Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment