/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.parametricstudy.gui.properties; import java.util.Collections; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import de.rcenvironment.components.parametricstudy.common.ParametricStudyComponentConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription; import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataConstants.Visibility; import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataDefinition; import de.rcenvironment.core.component.workflow.model.spi.ComponentInstanceProperties; import de.rcenvironment.core.datamodel.api.DataType; import de.rcenvironment.core.datamodel.api.EndpointActionType; import de.rcenvironment.core.datamodel.api.EndpointType; import de.rcenvironment.core.gui.utils.incubator.NumericalTextConstraintListener; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.AddDynamicInputCommand; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.EditDynamicEndpointCommand; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.ProcessEndpointsGroupCommand; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.RemoveDynamicInputCommand; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointEditDialog; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointSelectionPane; import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand.Executor; /** * * Endpoint Selection Pane. Changes behavior of editing the Design Variable and introduces a special {@link EndpointEditDialog} implementing * the needs of the parametric study. * * @author Jascha Riedel */ public class ParametricStudyEndpointSelectionPane extends EndpointSelectionPane { private EndpointSelectionPane inputPane; private final Executor executor; public ParametricStudyEndpointSelectionPane(String title, EndpointType direction, Executor executor, EndpointSelectionPane inputPane) { super(title, direction, null, new String[] {}, new String[] { ParametricStudyComponentConstants.OUTPUT_NAME_DV }, executor, false, true); this.inputPane = inputPane; this.executor = executor; } @Override protected void onEditClicked() { final String name = (String) table.getSelection()[0].getData(); boolean isStaticEndpoint = endpointManager.getEndpointDescription(name).getEndpointDefinition().isStatic(); EndpointDescription endpoint = endpointManager.getEndpointDescription(name); Map<String, String> newMetaData = cloneMetaData(endpoint.getMetaData()); EndpointEditDialog dialog = new DesignVariableEndpointDialog(Display.getDefault().getActiveShell(), EndpointActionType.EDIT, configuration, endpointType, dynEndpointIdToManage, isStaticEndpoint, endpoint.getEndpointDefinition() .getMetaDataDefinition(), newMetaData); onEditClicked(name, dialog, newMetaData); } @Override protected void executeEditCommand(EndpointDescription oldDescription, EndpointDescription newDescription) { ProcessEndpointsGroupCommand groupCommand = new ProcessEndpointsGroupCommand(executor, this); groupCommand.add(new EditDynamicEndpointCommand(super.endpointType, oldDescription, newDescription, this)); createParameterCommand(groupCommand, oldDescription, newDescription, ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_FROM_VALUE); createParameterCommand(groupCommand, oldDescription, newDescription, ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_TO_VALUE); createParameterCommand(groupCommand, oldDescription, newDescription, ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_STEPSIZE_VALUE); execute(groupCommand); } private void createParameterCommand(ProcessEndpointsGroupCommand groupCommand, EndpointDescription oldDescription, EndpointDescription newDescription, String metaDataOutput) { boolean oldUseInputAsFromValue = oldDescription.getMetaData() .get(metaDataOutput) != null && Boolean.parseBoolean(oldDescription.getMetaData() .get(metaDataOutput)); boolean newUseInputAsFromValue = newDescription.getMetaData() .get(metaDataOutput) != null && Boolean.parseBoolean(newDescription.getMetaData() .get(metaDataOutput)); String inputName; switch (metaDataOutput) { case ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_FROM_VALUE: inputName = ParametricStudyComponentConstants.INPUT_NAME_FROM_VALUE; break; case ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_TO_VALUE: inputName = ParametricStudyComponentConstants.INPUT_NAME_TO_VALUE; break; case ParametricStudyComponentConstants.OUTPUT_METADATA_USE_INPUT_AS_STEPSIZE_VALUE: inputName = ParametricStudyComponentConstants.INPUT_NAME_STEPSIZE_VALUE; break; default: return; } if (newUseInputAsFromValue && !oldUseInputAsFromValue) { groupCommand.add(new AddDynamicInputCommand( ParametricStudyComponentConstants.DYNAMIC_INPUT_STUDY_PARAMETERS, inputName, DataType.Float, Collections.<String, String> emptyMap(), ParametricStudyComponentConstants.DYNAMIC_INPUT_STUDY_PARAMETERS, this, inputPane)); } else if (!newUseInputAsFromValue && oldUseInputAsFromValue) { groupCommand.add(new RemoveDynamicInputCommand(ParametricStudyComponentConstants.DYNAMIC_INPUT_STUDY_PARAMETERS, inputName, this, inputPane)); } } /** * * Special EndpointEditDialog for the Design variable. * * @author Jascha Riedel */ private final class DesignVariableEndpointDialog extends EndpointEditDialog { DesignVariableEndpointDialog(Shell parentShell, EndpointActionType actionType, ComponentInstanceProperties configuration, EndpointType direction, String id, boolean isStatic, EndpointMetaDataDefinition metaData, Map<String, String> metadataValues) { super(parentShell, actionType, configuration, direction, id, isStatic, metaData, metadataValues); } @Override protected void createSettings(Map<Integer, String> sortedKeyMap, Composite container) { if (sortedKeyMap.values().size() > 1) { Label useInput = new Label(container, SWT.NONE); useInput.setText("Use Input"); GridData useInputGridData = new GridData(SWT.RIGHT, SWT.FILL, true, false); useInputGridData.horizontalSpan = 2; useInput.setLayoutData(useInputGridData); } for (String key : sortedKeyMap.values()) { if (!metaData.getVisibility(key).equals(Visibility.developerConfigurable) && metadataIsActive(key, metaData.getActivationFilter(key))) { String value = metadataValues.get(key); if (value == null || value.equals("")) { value = metaData.getDefaultValue(key); metadataValues.put(key, value); } if (metaData.getDataType(key).equals(EndpointMetaDataConstants.TYPE_BOOL)) { Label horizontalLine = new Label(container, SWT.HORIZONTAL | SWT.SEPARATOR); GridData horizontalLineGD = new GridData(SWT.FILL, SWT.FILL, true, false); horizontalLineGD.horizontalSpan = 2; horizontalLine.setLayoutData(horizontalLineGD); Button newCheckbox = createLabelAndCheckbox(container, metaData.getGuiName(key) + COLON, value); newCheckbox.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); widgetToKeyMap.put(newCheckbox, key); newCheckbox.addSelectionListener(new SelectionChangedListener()); } else if ((metaData.getPossibleValues(key) == null || metaData.getPossibleValues(key).contains("*"))) { Text newTextfield = createLabelTextFieldAndCheckBox(container, metaData.getGuiName(key) + COLON, metaData.getDataType(key), value, key); widgetToKeyMap.put(newTextfield, key); newTextfield.addModifyListener(new MethodPropertiesModifyListener()); } } } } private Text createLabelTextFieldAndCheckBox(Composite container, String label, String dataType, String value, String key) { new Label(container, SWT.NONE).setText(label); Composite container2 = new Composite(container, SWT.FILL); container2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); GridLayout textCheckBoxLayout = new GridLayout(2, false); textCheckBoxLayout.marginWidth = 0; textCheckBoxLayout.marginHeight = 0; container2.setLayout(textCheckBoxLayout); Text result = new Text(container2, SWT.SINGLE | SWT.BORDER); result.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); result.setText(value); if (dataType.equals(EndpointMetaDataConstants.TYPE_INT)) { result.addVerifyListener(new NumericalTextConstraintListener(result, NumericalTextConstraintListener.ONLY_INTEGER)); if (value.equals(MINUS)) { result.setText(""); } } if (dataType.equals(EndpointMetaDataConstants.TYPE_FLOAT)) { result.addVerifyListener(new NumericalTextConstraintListener(result, NumericalTextConstraintListener.ONLY_FLOAT)); if (value.equals(MINUS)) { result.setText(""); } } if (dataType.equals(EndpointMetaDataConstants.TYPE_FLOAT_GREATER_ZERO)) { result.addVerifyListener(new NumericalTextConstraintListener(result, NumericalTextConstraintListener.ONLY_FLOAT | NumericalTextConstraintListener.GREATER_OR_EQUAL_ZERO)); // TODO "GREATER_OR_EQUAL_ZERO" is a quickfix to prohibit the user from entering a "-" sign, // since "GREATER_ZERO" did not work as expected. Should be changed when the underlying issue #14301 is fixed. if (value.equals(MINUS)) { result.setText(""); } } Button newButton = new Button(container2, SWT.CHECK | SWT.RIGHT); widgetToKeyMap.put(newButton, metaData.getGuiActivationFilter(key).keySet().iterator().next()); newButton.addSelectionListener(new SelectionChangedListener()); newButton.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false)); if (metadataValues.get(metaData.getGuiActivationFilter(key).keySet().iterator().next()).equals("true")) { newButton.setSelection(true); } else { newButton.setSelection(false); } return result; } } }