data-miner-manager/src/main/java/org/gcube/portlets/user/dataminermanager/client/experimentArea/WorkflowOperatorPanel.java

253 lines
8.1 KiB
Java

/**
*
*/
package org.gcube.portlets.user.dataminermanager.client.experimentArea;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gcube.portlets.user.dataminermanager.client.DataMinerManager;
import org.gcube.portlets.user.dataminermanager.client.bean.Operator;
import org.gcube.portlets.user.dataminermanager.client.bean.parameters.ColumnListParameter;
import org.gcube.portlets.user.dataminermanager.client.bean.parameters.ColumnParameter;
import org.gcube.portlets.user.dataminermanager.client.bean.parameters.Parameter;
import org.gcube.portlets.user.dataminermanager.client.form.AbstractFld;
import org.gcube.portlets.user.dataminermanager.client.form.OperatorFieldWidget;
import org.gcube.portlets.user.dataminermanager.client.form.TabularFld;
import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync;
import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Image;
import com.sencha.gxt.widget.core.client.button.TextButton;
import com.sencha.gxt.widget.core.client.container.HorizontalLayoutContainer;
import com.sencha.gxt.widget.core.client.container.SimpleContainer;
import com.sencha.gxt.widget.core.client.container.VerticalLayoutContainer;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.event.SelectEvent.SelectHandler;
import com.sencha.gxt.widget.core.client.form.FieldLabel;
import com.sencha.gxt.widget.core.client.form.FieldSet;
import com.sencha.gxt.widget.core.client.form.FormPanel;
import com.sencha.gxt.widget.core.client.form.TextField;
/**
* @author ceras
*
*/
public class WorkflowOperatorPanel extends SimpleContainer {
/**
* @author ceras
*
*/
public interface WorkflowOperatorPanelHandler {
public void startComputation(String computationTitle, String computationDescription);
}
private static final String START_BUTTON_TOOLTIP = "Start Computation";
private static final ImageResource PRELOAD_IMAGE = DataMinerManager.resources.loaderBig();
private VerticalLayoutContainer v;
private Operator operator;
private FormPanel parametersPanel;
private FieldSet parametersFieldSet;
private Map<String, OperatorFieldWidget> fieldWidgetsMap = new HashMap<String, OperatorFieldWidget>();
//private Map<Parameter, String> parameterValues = new HashMap<Parameter, String>();
private WorkflowOperatorPanelHandler handler=null;
private TextField titleField;
private String defaultComputationTitle;
public WorkflowOperatorPanel(DataMinerPortletServiceAsync service, Operator operator, WorkflowOperatorPanelHandler handler) {
this(operator);
this.setHandler(handler);
}
/**
*
*/
public WorkflowOperatorPanel(Operator operator) {
super();
v=new VerticalLayoutContainer();
add(v);
this.operator = operator;
this.defaultComputationTitle = getDefaultComputationTitle();
//lc.setLayout(new FitLayout());
addStyleName("workflow");
Image img = new Image(GWT.getModuleBaseURL()+"../images/operators/"+(operator.hasImage() ? operator.getId() : "DEFAULT_IMAGE")+".png");
img.addStyleName("workflow-icon");
v.add(img);
HTML title = new HTML(operator.getName());
title.addStyleName("workflow-title");
v.add(title);
String descr = operator.getDescription();
descr = (descr==null || descr.contentEquals("")) ? "no-description" : operator.getDescription();
HTML description = new HTML(descr);
description.addStyleName("workflow-description");
v.add(description);
addTitleField();
parametersPanel = new FormPanel(){
@Override
public boolean isValid(boolean preventMark) {
boolean flag = super.isValid(preventMark);
if (flag) {
for (Map.Entry<String, OperatorFieldWidget> entry : fieldWidgetsMap.entrySet()) {
OperatorFieldWidget fieldWidget = entry.getValue();
flag = flag && fieldWidget.isValid();
}
}
return flag;
}
};
parametersPanel.setBorders(false);
//parametersPanel.getElement().getStyle().setMargin(20, px);
parametersFieldSet = new FieldSet();
parametersFieldSet.setHeadingText("Parameters");
parametersPanel.add(parametersFieldSet);
v.add(parametersPanel);
loadOperatorParameters();
}
/**
*
*/
private void addTitleField() {
HorizontalLayoutContainer hp = new HorizontalLayoutContainer();
hp.add(new HTML("<div style='margin-left:30px; margin-right:10px; margin-top:5px'>Computation Title: </div>"));
titleField = new TextField();
titleField.setWidth(250);
titleField.setValue(this.defaultComputationTitle);
FieldLabel titleLabel=new FieldLabel(titleField,"Computation Title");
hp.add(titleLabel);
v.add(hp);
}
/**
* @param parametersPanel
*/
private void loadOperatorParameters() {
DataMinerManager.getService().getParameters(operator, new AsyncCallback<List<Parameter>>() {
@Override
public void onSuccess(List<Parameter> result) {
operator.setOperatorParameters(result);
parametersFieldSet.clear();
showForm();
}
@Override
public void onFailure(Throwable caught) {
UtilsGXT3.alert("Error ", "Impossible to retrieve parameters.");
}
});
Image img = new Image(PRELOAD_IMAGE);
img.setStyleName("workflow-parameters-preload");
parametersFieldSet.add(img);
}
/**
*
*/
protected void showForm() {
// field widgets creation
for (Parameter p : operator.getOperatorParameters()) {
OperatorFieldWidget fieldWidget = new OperatorFieldWidget(p);
fieldWidgetsMap.put(p.getName(), fieldWidget);
parametersFieldSet.add(fieldWidget);
}
for (Parameter p: operator.getOperatorParameters()) {
if (p.isColumn() || p.isColumnList()) {
// search for the table parameter which it depends
String tabParamName = (p.isColumn()
? ((ColumnParameter)p).getReferredTabularParameterName()
: ((ColumnListParameter)p).getReferredTabularParameterName());
try {
// get the column field and the tabular field referred
TabularFld tabularField = (TabularFld)fieldWidgetsMap.get(tabParamName).getField();
AbstractFld field = fieldWidgetsMap.get(p.getName()).getField();
tabularField.addChangeListener(field);
} catch (Exception e) {
e.printStackTrace();
UtilsGXT3.alert("Error", "Column parameter \""+p.getName()+" refers to a tabular parameter that doesn't exists ("+tabParamName+")\"", null);
}
}
}
final TextButton submit = new TextButton("Start Computation");
submit.setToolTip(START_BUTTON_TOOLTIP);
submit.setIcon(DataMinerManager.resources.startComputation());
submit.getElement().getStyle().setMarginLeft(20,Unit.PX);
submit.getElement().getStyle().setMarginBottom(20, Unit.PX);
submit.addSelectHandler(new SelectHandler() {
@Override
public void onSelect(SelectEvent event) {
if (handler!=null && parametersPanel.isValid()) {
String value = titleField.getValue();
String title = (value==null || value.contentEquals("")) ? defaultComputationTitle : value;
handler.startComputation(title, title); // TODO insert description
}
}
});
v.add(submit);
forceLayout();
parametersPanel.forceLayout();
}
public void updateOperatorParametersValues() {
for (Map.Entry<String, OperatorFieldWidget> entry : fieldWidgetsMap.entrySet()) {
OperatorFieldWidget fieldWidget = entry.getValue();
fieldWidget.updateOperatorParameterValue();
}
}
/**
* @return the operator
*/
public Operator getOperator() {
return operator;
}
public void setHandler(WorkflowOperatorPanelHandler handler) {
this.handler = handler;
}
public String getDefaultComputationTitle() {
String name = this.operator.getName();
//String date = DateTimeFormat.getShortDateTimeFormat().format(new Date());
String date = DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_SHORT).format(new Date());
return name+"-"+date;
}
}