/** * */ package org.gcube.portlets.user.dataminermanager.client.experiments; 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.parametersfield.AbstractFld; import org.gcube.portlets.user.dataminermanager.client.parametersfield.ColumnFld; import org.gcube.portlets.user.dataminermanager.client.parametersfield.ColumnListFld; import org.gcube.portlets.user.dataminermanager.client.parametersfield.OperatorFieldWidget; import org.gcube.portlets.user.dataminermanager.client.parametersfield.TabularFld; import org.gcube.portlets.user.dataminermanager.client.rpc.DataMinerPortletServiceAsync; import org.gcube.portlets.user.dataminermanager.client.util.UtilsGXT3; import com.allen_sauer.gwt.log.client.Log; 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.Image; import com.sencha.gxt.core.client.util.Margins; import com.sencha.gxt.widget.core.client.button.TextButton; import com.sencha.gxt.widget.core.client.container.HtmlLayoutContainer; import com.sencha.gxt.widget.core.client.container.MarginData; 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.container.VerticalLayoutContainer.VerticalLayoutData; 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.FieldSet; import com.sencha.gxt.widget.core.client.form.FormPanel; import com.sencha.gxt.widget.core.client.form.TextField; /** * * @author Giancarlo Panichi email: g.panichi@isti.cnr.it * */ public class ComputationParametersPanel extends SimpleContainer { public interface ComputationParametersPanelHandler { 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 VerticalLayoutContainer vParameters; private Map fieldWidgetsMap; private ComputationParametersPanelHandler handler = null; private TextField titleField; private String defaultComputationTitle; private TextButton submit; public ComputationParametersPanel(Operator operator) { super(); this.operator = operator; fieldWidgetsMap = new HashMap<>(); try { setDefaultComputationTitle(); init(); create(); } catch (Throwable e) { e.printStackTrace(); } } private void init() { setStylePrimaryName("workflow"); setResize(true); } private void create() { v = new VerticalLayoutContainer(); add(v); Image img = new Image(GWT.getModuleBaseURL() + "../images/operators/" + (operator.hasImage() ? operator.getId() : "DEFAULT_IMAGE") + ".png"); img.setStylePrimaryName("workflow-icon");//-15 v.add(img, new VerticalLayoutData(-1, -1, new Margins(-15, 0, 0, 5))); HtmlLayoutContainer title = new HtmlLayoutContainer("" + operator.getName() + ""); title.addStyleName("workflow-title"); v.add(title, new VerticalLayoutData(-1, -1, new Margins(20, 0, 0, -25))); String descr = operator.getDescription(); descr = (descr == null || descr.contentEquals("")) ? "no-description" : operator.getDescription();//display:block;clear:both;' HtmlLayoutContainer description = new HtmlLayoutContainer("" + descr + ""); description.addStyleName("workflow-description"); v.add(description, new VerticalLayoutData(-1, -1, new Margins(0))); //addTitleField(); parametersPanel = new FormPanel() { @Override public boolean isValid(boolean preventMark) { boolean flag = super.isValid(preventMark); if (flag) { for (Map.Entry entry : fieldWidgetsMap .entrySet()) { OperatorFieldWidget fieldWidget = entry.getValue(); flag = flag && fieldWidget.isValid(); } } return flag; } }; //parametersPanel = new FramedPanel(); parametersPanel.setBorders(false); parametersPanel.getElement().getStyle().setPaddingBottom(20, Unit.PX); parametersFieldSet = new FieldSet(); parametersFieldSet.setHeadingText("Parameters"); vParameters = new VerticalLayoutContainer(); Image imgLoading = new Image(PRELOAD_IMAGE); vParameters.add(imgLoading, new VerticalLayoutData(1, -1, new Margins(0))); parametersFieldSet.add(vParameters, new MarginData(new Margins(0))); parametersFieldSet.setCollapsible(false); parametersPanel.add(parametersFieldSet); v.add(parametersPanel, new VerticalLayoutData(1, -1, new Margins(5))); 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); //, new VerticalLayoutData(-1, -1, new Margins(0, 0, 20, 20))); submit.setVisible(false); forceLayout(); loadOperatorParameters(); } /* private void addTitleField() { titleField = new TextField(); titleField.setWidth(250); titleField.setValue(defaultComputationTitle); FieldLabel titleLabel = new FieldLabel(titleField, "Computation Title"); titleLabel.addStyleName("workflow-computation-title"); v.add(titleLabel, new VerticalLayoutData(-1, -1, new Margins(0))); }*/ /** * @param parametersPanel */ private void loadOperatorParameters() { DataMinerPortletServiceAsync.INSTANCE.getParameters(operator, new AsyncCallback>() { @Override public void onSuccess(List result) { Log.debug("Retrieved Parameters!"); operator.setOperatorParameters(result); vParameters.clear(); showForm(); } @Override public void onFailure(Throwable caught) { UtilsGXT3.alert("Error ", "Impossible to retrieve parameters."); } }); } /** * */ protected void showForm() { try { // field widgets creation for (Parameter p : operator.getOperatorParameters()) { OperatorFieldWidget fieldWidget = new OperatorFieldWidget(p); fieldWidgetsMap.put(p.getName(), fieldWidget); vParameters.add(fieldWidget.getParameterLabel(), new VerticalLayoutData(1, -1, new Margins())); } 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(); if (tabularField != null) { AbstractFld field = fieldWidgetsMap .get(p.getName()).getField(); if (field instanceof ColumnFld) { ColumnFld columnField = (ColumnFld) field; tabularField .addTabularFldChangeEventHandler(columnField); } else { if (field instanceof ColumnListFld) { ColumnListFld columnListField = (ColumnListFld) field; tabularField .addTabularFldChangeEventHandler(columnListField); } else { } } } } catch (Exception e) { e.printStackTrace(); UtilsGXT3 .alert("Error", "Column parameter \"" + p.getName() + " refers to a tabular parameter that doesn't exists (" + tabParamName + ")\"", null); } } } parametersPanel.getElement().getStyle().setPaddingBottom(0, Unit.PX); submit.setVisible(true); forceLayout(); } catch (Throwable e) { Log.error("Error in show form:" + e.getLocalizedMessage()); e.printStackTrace(); } } public void updateOperatorParametersValues() { for (Map.Entry entry : fieldWidgetsMap .entrySet()) { OperatorFieldWidget fieldWidget = entry.getValue(); fieldWidget.updateOperatorParameterValue(); } } /** * @return the operator */ public Operator getOperator() { return operator; } public void setHandler(ComputationParametersPanelHandler handler) { this.handler = handler; } public void setDefaultComputationTitle() { String name = this.operator.getName(); String date = DateTimeFormat .getFormat(PredefinedFormat.DATE_TIME_SHORT).format(new Date()); defaultComputationTitle = name + "-" + date; } }