/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.wizards.toolintegration; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition; import de.rcenvironment.core.datamodel.api.DataType; import de.rcenvironment.core.gui.utils.common.configuration.VariableNameVerifyListener; import de.rcenvironment.core.utils.common.StringUtils; /** * A dialog for editing a single endpoint configuration. * * @author Sascha Zur */ public class WizardEndpointEditDialog extends Dialog { /** * Map for getting from the gui display name of a DataType back to the class name. */ public static Map<String, DataType> guiNameToDataType = new HashMap<String, DataType>(); private static final String NO_VALUE_STRING = ""; private static final String INPUT_FOLDER_STANDARD_NAME = "Input folder"; private static List<EndpointDefinition.InputDatumHandling> inputDatumHandlings; private static List<EndpointDefinition.InputExecutionContraint> inputExecutionConstraints; private Text nameText; private Combo dataTypeCombo; private Button[] inputDatumHandlingButtons = new Button[3]; private Combo defaultInputDatumHandlingCombo; private Button[] inputExecutionConstraintButtons = new Button[3]; private Combo defaultInputExecutionConstraintCombo; private Text filenameText; private final Map<String, String> config; private final String title; private final List<String> allEndpointNames; private final String oldName; private final String type; static { inputDatumHandlings = new ArrayList<>(); inputDatumHandlings.add(EndpointDefinition.InputDatumHandling.Constant); inputDatumHandlings.add(EndpointDefinition.InputDatumHandling.Single); inputDatumHandlings.add(EndpointDefinition.InputDatumHandling.Queue); inputExecutionConstraints = new ArrayList<>(); inputExecutionConstraints.add(EndpointDefinition.InputExecutionContraint.Required); inputExecutionConstraints.add(EndpointDefinition.InputExecutionContraint.RequiredIfConnected); inputExecutionConstraints.add(EndpointDefinition.InputExecutionContraint.NotRequired); } /** * Dialog for creating or editing an endpoint. * * @param parentShell parent Shell * @param title * @param list * @param configuration the containing endpoint manager */ public WizardEndpointEditDialog(Shell parentShell, String title, String type, List<String> allEndpointNames) { super(parentShell); config = new HashMap<String, String>(); this.title = title; this.type = type; this.allEndpointNames = allEndpointNames; oldName = null; } public WizardEndpointEditDialog(Shell parentShell, String title, String type, Map<String, String> config, List<String> allEndpointNames) { super(parentShell); this.config = config; oldName = config.get(InOutputConfigurationPage.NAME); this.title = title; this.type = type; this.allEndpointNames = allEndpointNames; } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(title); } @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new GridLayout(1, true)); GridData g = new GridData(GridData.FILL_BOTH); g.grabExcessHorizontalSpace = true; g.horizontalAlignment = GridData.CENTER; container.setLayoutData(g); createEndpointSettings(container); updateInitValues(); return container; } private void updateInitValues() { if (config.get(InOutputConfigurationPage.DATA_TYPE) != null) { dataTypeCombo.setText(DataType.valueOf(config.get(InOutputConfigurationPage.DATA_TYPE)).getDisplayName()); } if (config.get(InOutputConfigurationPage.NAME) != null) { nameText.setText(config.get(InOutputConfigurationPage.NAME)); } if (type.equals(InOutputConfigurationPage.INPUTS)) { if (config.containsKey(InOutputConfigurationPage.HANDLING)) { for (String handling : StringUtils.splitAndUnescape(config.get(InOutputConfigurationPage.HANDLING))) { inputDatumHandlingButtons[inputDatumHandlings.indexOf(EndpointDefinition.InputDatumHandling.valueOf(handling))] .setSelection(true); } } else if (config.containsKey(InOutputConfigurationPage.USAGE)) { if (config.get(InOutputConfigurationPage.USAGE).equals("initial")) { inputDatumHandlingButtons[inputDatumHandlings.indexOf(EndpointDefinition.InputDatumHandling.Constant)] .setSelection(true); } else { inputDatumHandlingButtons[inputDatumHandlings.indexOf(EndpointDefinition.InputDatumHandling.Single)].setSelection(true); } } fillInputHandlingComboForDefaultSelection(true); if (config.containsKey(InOutputConfigurationPage.CONSTRAINT)) { for (String constraint : StringUtils.splitAndUnescape(config.get(InOutputConfigurationPage.CONSTRAINT))) { inputExecutionConstraintButtons[inputExecutionConstraints.indexOf(EndpointDefinition.InputExecutionContraint .valueOf(constraint))].setSelection(true); } } else if (config.containsKey(InOutputConfigurationPage.USAGE)) { if (config.get(InOutputConfigurationPage.USAGE).equals("optional")) { inputExecutionConstraintButtons[inputExecutionConstraints .indexOf(EndpointDefinition.InputExecutionContraint.NotRequired)].setSelection(true); } else { inputExecutionConstraintButtons[inputExecutionConstraints.indexOf(EndpointDefinition.InputExecutionContraint.Required)] .setSelection(true); } } fillInputExecutionConstraintsComboForDefaultSelection(true); } if (config.get(InOutputConfigurationPage.FILENAME) != null && filenameText != null) { filenameText.setText(config.get(InOutputConfigurationPage.FILENAME)); } } protected void createEndpointSettings(Composite parent) { Composite container = new Composite(parent, SWT.NONE); container.setLayout(new GridLayout(1, true)); Composite propertyContainer = new Composite(container, SWT.None); propertyContainer.setLayout(new GridLayout(2, true)); Label nameLabel = new Label(propertyContainer, SWT.NONE); nameLabel.setText(Messages.nameRequired); nameText = new Text(propertyContainer, SWT.BORDER); GridData textGridData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); nameText.setLayoutData(textGridData); nameText.addListener(SWT.Verify, new VariableNameVerifyListener(true)); List<DataType> supportedDataTypes = new LinkedList<DataType>(); supportedDataTypes.add(DataType.ShortText); supportedDataTypes.add(DataType.Boolean); supportedDataTypes.add(DataType.Integer); supportedDataTypes.add(DataType.Float); supportedDataTypes.add(DataType.Vector); supportedDataTypes.add(DataType.Matrix); supportedDataTypes.add(DataType.FileReference); supportedDataTypes.add(DataType.DirectoryReference); new Label(propertyContainer, SWT.NONE).setText(Messages.dataTypeColon); dataTypeCombo = new Combo(propertyContainer, SWT.READ_ONLY); for (DataType t : DataType.values()) { if (supportedDataTypes.contains(t)) { dataTypeCombo.add(t.getDisplayName()); guiNameToDataType.put(t.getDisplayName(), t); } } dataTypeCombo.select(0); GridData dataTypeData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); dataTypeCombo.setLayoutData(dataTypeData); if (type.equals(InOutputConfigurationPage.INPUTS)) { new Label(propertyContainer, SWT.NONE).setText(Messages.inputHandlingColon); inputDatumHandlingButtons[0] = new Button(propertyContainer, SWT.CHECK); inputDatumHandlingButtons[0].setText(inputDatumHandlings.get(0).getDisplayName()); new Label(propertyContainer, SWT.NONE); inputDatumHandlingButtons[1] = new Button(propertyContainer, SWT.CHECK); inputDatumHandlingButtons[1].setText(inputDatumHandlings.get(1).getDisplayName()); new Label(propertyContainer, SWT.NONE); inputDatumHandlingButtons[2] = new Button(propertyContainer, SWT.CHECK); inputDatumHandlingButtons[2].setText(inputDatumHandlings.get(2).getDisplayName()); new Label(propertyContainer, SWT.NONE).setText(Messages.defaultInputHandlingColon); defaultInputDatumHandlingCombo = new Combo(propertyContainer, SWT.READ_ONLY); dataTypeData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); defaultInputDatumHandlingCombo.setLayoutData(dataTypeData); new Label(propertyContainer, SWT.NONE).setText(Messages.inputExecutionConstraintColon); inputExecutionConstraintButtons[0] = new Button(propertyContainer, SWT.CHECK); inputExecutionConstraintButtons[0].setText(inputExecutionConstraints.get(0).getDisplayName()); new Label(propertyContainer, SWT.NONE); inputExecutionConstraintButtons[1] = new Button(propertyContainer, SWT.CHECK); inputExecutionConstraintButtons[1].setText(inputExecutionConstraints.get(1).getDisplayName()); new Label(propertyContainer, SWT.NONE); inputExecutionConstraintButtons[2] = new Button(propertyContainer, SWT.CHECK); inputExecutionConstraintButtons[2].setText(inputExecutionConstraints.get(2).getDisplayName()); new Label(propertyContainer, SWT.NONE).setText(Messages.defaultInputExecutionConstraintColon); defaultInputExecutionConstraintCombo = new Combo(propertyContainer, SWT.READ_ONLY); dataTypeData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL); defaultInputExecutionConstraintCombo.setLayoutData(dataTypeData); filenameText = null; /** * Commented out because of bug with renaming file / dir */ // Label fileNameLabel = new Label(propertyContainer, SWT.NONE); // fileNameLabel.setText(Messages.filenameColon); // filenameText = new Text(propertyContainer, SWT.BORDER); // GridData fileNameData = new GridData(GridData.GRAB_HORIZONTAL | // GridData.FILL_HORIZONTAL); // filenameText.setLayoutData(fileNameData); // filenameText.setEnabled(false); // if (type.equals(InOutputConfigurationPage.INPUTS)) { // filenameText.setMessage(Messages.emptyFilename); // } } } private int getIndexFromSelectionIndexForInputHandling(int selectionIndex) { final int minusOne = -1; int count = minusOne; for (int i = 0; i < inputDatumHandlingButtons.length; i++) { if (inputDatumHandlingButtons[i].getSelection()) { count++; if (count == selectionIndex) { return i; } } } return minusOne; } private int getIndexFromSelectionIndexForExecutionConstraint(int selectionIndex) { final int minusOne = -1; int count = minusOne; for (int i = 0; i < inputExecutionConstraintButtons.length; i++) { if (inputExecutionConstraintButtons[i].getSelection()) { count++; if (count == selectionIndex) { return i; } } } return minusOne; } private void saveAllConfig() { config.put(InOutputConfigurationPage.NAME, nameText.getText()); if (type.equals(InOutputConfigurationPage.INPUTS)) { List<String> parts = new ArrayList<>(); int i = 0; for (Button b : inputDatumHandlingButtons) { if (b.getSelection()) { parts.add(inputDatumHandlings.get(i).name()); } i++; } config.put(InOutputConfigurationPage.HANDLING, StringUtils.escapeAndConcat(parts)); if (defaultInputDatumHandlingCombo.getSelectionIndex() >= 0) { config.put(InOutputConfigurationPage.DEFAULT_HANDLING, inputDatumHandlings.get( getIndexFromSelectionIndexForInputHandling(defaultInputDatumHandlingCombo.getSelectionIndex())).name()); } parts = new ArrayList<>(); i = 0; for (Button b : inputExecutionConstraintButtons) { if (b.getSelection()) { parts.add(inputExecutionConstraints.get(i).name()); } i++; } config.put(InOutputConfigurationPage.CONSTRAINT, StringUtils.escapeAndConcat(parts)); if (defaultInputExecutionConstraintCombo.getSelectionIndex() >= 0) { config.put(InOutputConfigurationPage.DEFAULT_CONSTRAINT, inputExecutionConstraints.get( getIndexFromSelectionIndexForExecutionConstraint(defaultInputExecutionConstraintCombo.getSelectionIndex())).name()); } } else { config.put(InOutputConfigurationPage.HANDLING, "-"); config.put(InOutputConfigurationPage.CONSTRAINT, "-"); } config.put(InOutputConfigurationPage.DATA_TYPE, guiNameToDataType.get(dataTypeCombo.getText()).name()); if (dataTypeCombo.getText().equals(DataType.FileReference.getDisplayName()) || dataTypeCombo.getText().equals(DataType.DirectoryReference.getDisplayName())) { if (filenameText != null) { config.put(InOutputConfigurationPage.FILENAME, filenameText.getText()); } if (type.equals(InOutputConfigurationPage.INPUTS)) { config.put(InOutputConfigurationPage.FOLDER, INPUT_FOLDER_STANDARD_NAME); } } else { config.put(InOutputConfigurationPage.FILENAME, NO_VALUE_STRING); config.put(InOutputConfigurationPage.FOLDER, NO_VALUE_STRING); } } @Override public void create() { super.create(); // dialog title getShell().setText(title); validateInput(); installModifyListeners(); } private void fillInputHandlingComboForDefaultSelection(boolean init) { String itemSelected = null; if (init && config.containsKey(InOutputConfigurationPage.DEFAULT_HANDLING)) { itemSelected = EndpointDefinition.InputDatumHandling.valueOf(config.get(InOutputConfigurationPage.DEFAULT_HANDLING)) .getDisplayName(); } else if (defaultInputDatumHandlingCombo.getItemCount() > 0) { itemSelected = defaultInputDatumHandlingCombo.getItem(defaultInputDatumHandlingCombo.getSelectionIndex()); } List<String> items = new ArrayList<>(); for (int i = 0; i < inputDatumHandlings.size(); i++) { if (inputDatumHandlingButtons[i].getSelection()) { items.add(inputDatumHandlings.get(i).getDisplayName()); } } defaultInputDatumHandlingCombo.setItems(items.toArray(new String[items.size()])); if (items.contains(itemSelected)) { defaultInputDatumHandlingCombo.select(items.indexOf(itemSelected)); } else { defaultInputDatumHandlingCombo.select(0); } } private void fillInputExecutionConstraintsComboForDefaultSelection(boolean init) { String itemSelected = null; if (init && config.containsKey(InOutputConfigurationPage.DEFAULT_CONSTRAINT)) { itemSelected = EndpointDefinition.InputExecutionContraint.valueOf(config.get(InOutputConfigurationPage.DEFAULT_CONSTRAINT)) .getDisplayName(); } else if (defaultInputExecutionConstraintCombo.getItemCount() > 0) { itemSelected = defaultInputExecutionConstraintCombo.getItem(defaultInputExecutionConstraintCombo.getSelectionIndex()); } List<String> items = new ArrayList<>(); for (int i = 0; i < inputExecutionConstraints.size(); i++) { if (inputExecutionConstraintButtons[i].getSelection()) { items.add(inputExecutionConstraints.get(i).getDisplayName()); } } defaultInputExecutionConstraintCombo.setItems(items.toArray(new String[items.size()])); if (items.contains(itemSelected)) { defaultInputExecutionConstraintCombo.select(items.indexOf(itemSelected)); } else { defaultInputExecutionConstraintCombo.select(0); } } private void installModifyListeners() { SelectionListener defaultSl = new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } @Override public void widgetSelected(SelectionEvent event) { saveAllConfig(); validateInput(); } }; dataTypeCombo.addSelectionListener(defaultSl); ModifyListener ml = new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { saveAllConfig(); validateInput(); } }; nameText.addModifyListener(ml); if (filenameText != null) { filenameText.addModifyListener(ml); } if (type.equals(InOutputConfigurationPage.INPUTS)) { SelectionListener buttonSl = new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } @Override public void widgetSelected(SelectionEvent event) { fillInputExecutionConstraintsComboForDefaultSelection(false); fillInputHandlingComboForDefaultSelection(false); saveAllConfig(); validateInput(); } }; defaultInputDatumHandlingCombo.addSelectionListener(defaultSl); defaultInputExecutionConstraintCombo.addSelectionListener(defaultSl); if (type.equals(InOutputConfigurationPage.INPUTS)) { for (Button b : inputDatumHandlingButtons) { b.addSelectionListener(buttonSl); } for (Button b : inputExecutionConstraintButtons) { b.addSelectionListener(buttonSl); } } } } protected void validateInput() { boolean isValid = true; if (dataTypeCombo.getText().equals(DataType.FileReference.getDisplayName()) || dataTypeCombo.getText().equals(DataType.DirectoryReference.getDisplayName())) { if (filenameText != null) { filenameText.setEnabled(true); } } else { if (filenameText != null) { filenameText.setEnabled(false); } } if (nameText.getText() == null || nameText.getText().isEmpty()) { isValid = false; } // filter if name is already in use (but remind that on edit it can have the same name) if (allEndpointNames != null && allEndpointNames.contains(nameText.getText())) { if (oldName == null || !oldName.equals(nameText.getText())) { isValid = false; } } if (type.equals(InOutputConfigurationPage.INPUTS) && isValid) { boolean inputHandlingSelected = false; for (Button b : inputDatumHandlingButtons) { if (b.getSelection()) { inputHandlingSelected = true; break; } } isValid = inputHandlingSelected; } if (type.equals(InOutputConfigurationPage.INPUTS) && isValid) { boolean executionConstraintSelected = false; for (Button b : inputExecutionConstraintButtons) { if (b.getSelection()) { executionConstraintSelected = true; break; } } isValid = executionConstraintSelected; } getButton(IDialogConstants.OK_ID).setEnabled(isValid); } public Map<String, String> getConfig() { return config; } }