/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.inputprovider.gui; import java.io.File; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; import org.eclipse.core.resources.IResource; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Dialog; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Widget; import de.rcenvironment.components.inputprovider.common.InputProviderComponentConstants; import de.rcenvironment.core.component.api.ComponentConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointMetaDataConstants; 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.common.components.PropertyTabGuiHelper; import de.rcenvironment.core.gui.utils.incubator.NumericalTextConstraintListener; import de.rcenvironment.core.gui.utils.incubator.WidgetGroupFactory; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointEditDialog; /** * Manages endpoint descriptions of the Input Provider component. * * @author Mark Geiger * @author Doreen Seider */ public class InputProviderEndpointEditDialog extends EndpointEditDialog implements SelectionListener { private Label label; private Text textField; private Combo combo; private Button selectFromFileSystemButton; private Composite confContainer; private NumericalTextConstraintListener floatListener; private NumericalTextConstraintListener integerListener; private Button selectFromProjectButton; private Button selectAtStartCheckbox; public InputProviderEndpointEditDialog(Shell parentShell, EndpointActionType actionType, ComponentInstanceProperties configuration, EndpointType direction, String id, boolean isStatic, Image icon, EndpointMetaDataDefinition metaData, Map<String, String> metadataValues) { super(parentShell, actionType, configuration, direction, id, isStatic, metaData, metadataValues); } @Override protected void createEndpointSettings(Composite parent) { super.createEndpointSettings(parent); comboDataType.addSelectionListener(this); } @Override public void widgetDefaultSelected(SelectionEvent event) {} @Override public void widgetSelected(SelectionEvent event) { removeListeners(); initialize(); } @Override protected Text createLabelAndTextfield(Composite container, String text, String dataType, String value) { confContainer = container; createValueArea(); createFileSelectionArea(); createListeners(); initialize(); initializeWithValue(value); return textField; } private void initializeWithValue(String value) { if (metadataValues.containsKey(InputProviderComponentConstants.META_FILESOURCETYPE) && metadataValues.get(InputProviderComponentConstants.META_FILESOURCETYPE) .equals(InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) { selectAtStartCheckbox.setSelection(true); setSelectedAtStart(); } else { textField.setText(value); } if (combo != null) { combo.select(combo.indexOf(value)); } } @Override protected void initializeBounds() { super.initializeBounds(); if (combo != null) { combo.setBounds(textField.getBounds()); } } private void initialize() { if (!selectAtStartCheckbox.getSelection()) { textField.setText(""); textField.setEnabled(true); } String dataType = comboDataType.getText(); setTextFieldOrComboVisible(true); // enabled to enter value at workflow start for all data types setDataTypeSelected(true); if (dataType.equals(DataType.Integer.getDisplayName())) { textField.addVerifyListener(integerListener); } else if (dataType.equals(DataType.Float.getDisplayName())) { textField.addVerifyListener(floatListener); } else if (dataType.equals(DataType.FileReference.getDisplayName()) || dataType.equals(DataType.DirectoryReference.getDisplayName())) { if (!selectAtStartCheckbox.getSelection()) { setFileOrDirectorySelected(true); } } else if (dataType.equals(DataType.Boolean.getDisplayName())) { if (combo == null) { createBooleanCombo(); } setTextFieldOrComboVisible(false); if (!selectAtStartCheckbox.getSelection()) { textField.setText(combo.getText()); } combo.setEnabled(!selectAtStartCheckbox.getSelection()); } } private void setTextFieldOrComboVisible(boolean textFieldVisible) { textField.setVisible(textFieldVisible); if (combo != null) { combo.setVisible(!textFieldVisible); } } private void createValueArea() { label = new Label(confContainer, SWT.NONE); label.setText(Messages.value); textField = new Text(confContainer, SWT.BORDER); textField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); textField.setVisible(false); } private void createFileSelectionArea() { Composite fileSelectionComposite = new Composite(confContainer, SWT.NONE); fileSelectionComposite.setLayout(new GridLayout(2, true)); GridData g = new GridData(GridData.FILL, GridData.FILL, true, true); g.horizontalSpan = 2; fileSelectionComposite.setLayoutData(g); Composite atStartComposite = new Composite(fileSelectionComposite, SWT.NONE); atStartComposite.setLayout(new GridLayout(2, false)); g = new GridData(); g.horizontalSpan = 2; g.grabExcessHorizontalSpace = true; atStartComposite.setLayoutData(g); selectAtStartCheckbox = new Button(atStartComposite, SWT.CHECK); selectAtStartCheckbox.setText(Messages.chooseAtWorkflowStart); selectAtStartCheckbox.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { setSelectedAtStart(); validateInput(); } @Override public void widgetDefaultSelected(SelectionEvent event) {} }); selectFromProjectButton = new Button(fileSelectionComposite, SWT.PUSH); selectFromProjectButton.setText(Messages.selectFromProject); g = new GridData(GridData.CENTER, GridData.CENTER, false, false); selectFromProjectButton.setLayoutData(g); selectFromProjectButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { IResource resource; if (comboDataType.getText().equals(DataType.DirectoryReference.getDisplayName())) { resource = PropertyTabGuiHelper.selectDirectoryFromActiveProject(confContainer.getShell(), Messages.selectDirectory, Messages.selectDirectoryFromProject); } else { resource = PropertyTabGuiHelper.selectFileFromActiveProject(confContainer.getShell(), Messages.selectFile, Messages.selectFileFromProject); } if (resource != null) { textField.setText(resource.getFullPath().makeRelative().toPortableString()); } } @Override public void widgetDefaultSelected(SelectionEvent event) {} }); selectFromFileSystemButton = new Button(fileSelectionComposite, SWT.PUSH); selectFromFileSystemButton.setText(Messages.selectFromFileSystem); selectFromFileSystemButton.setLayoutData(g); selectFromFileSystemButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { String path; if (comboDataType.getText().equals(DataType.DirectoryReference.getDisplayName())) { DirectoryDialog dialog = new DirectoryDialog(confContainer.getShell(), SWT.OPEN); dialog.setText(Messages.selectDirectory); dialog.setMessage(Messages.selectDirectoryFromFileSystem); checkIfPathExists(dialog, textField.getText()); path = dialog.open(); } else { FileDialog dialog = new FileDialog(confContainer.getShell(), SWT.OPEN); dialog.setText(Messages.selectFile); checkIfPathExists(dialog, textField.getText()); path = dialog.open(); } if (path != null) { textField.setText(path); } } private void checkIfPathExists(Dialog dialog, String text) { Path isThisPathExisting = Paths.get(text); if (Files.exists(isThisPathExisting, LinkOption.NOFOLLOW_LINKS)) { if (dialog instanceof DirectoryDialog) { ((DirectoryDialog) dialog).setFilterPath(isThisPathExisting.toString()); } else { // Type FileDialog if (isThisPathExisting.getParent() != null) { ((FileDialog) dialog).setFilterPath(isThisPathExisting.getParent().toString()); } else { // The path value is empty. This would open the last opened FileDialog if we not set the root path. File[] paths = File.listRoots(); if (paths[0].getPath() != null) { ((FileDialog) dialog).setFilterPath(paths[0].getPath()); } else { return; } } } return; } if (isThisPathExisting.getParent() != null) { checkIfPathExists(dialog, isThisPathExisting.getParent().toString()); } else { return; } } @Override public void widgetDefaultSelected(SelectionEvent event) {} }); setFileOrDirectorySelected(false); } private void setSelectedAtStart() { boolean selectAtStart = selectAtStartCheckbox.getSelection(); textField.setEnabled(!selectAtStart); if (selectAtStart) { textField.setText("-"); } else { textField.setText(""); } String dataType = comboDataType.getText(); if (dataType.equals(DataType.FileReference.toString()) || dataType.equals(DataType.DirectoryReference.toString())) { selectFromProjectButton.setEnabled(!selectAtStart); selectFromFileSystemButton.setEnabled(!selectAtStart); } if (dataType.equals(DataType.Boolean.toString())) { combo.setEnabled(!selectAtStart); if (!selectAtStart) { textField.setText(combo.getText()); } } if (selectAtStart) { metadataValues.put(InputProviderComponentConstants.META_FILESOURCETYPE, InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART); } else { metadataValues.remove(InputProviderComponentConstants.META_FILESOURCETYPE); } } private void setDataTypeSelected(boolean selected) { selectAtStartCheckbox.setEnabled(selected); selectFromProjectButton.setEnabled(false); selectFromFileSystemButton.setEnabled(false); } private void setFileOrDirectorySelected(boolean selected) { selectAtStartCheckbox.setEnabled(selected); selectFromProjectButton.setEnabled(selected); selectFromFileSystemButton.setEnabled(selected); } private void createBooleanCombo() { combo = new Combo(confContainer, SWT.READ_ONLY); combo.add(Boolean.TRUE.toString().toLowerCase()); combo.add(Boolean.FALSE.toString().toLowerCase()); combo.setText(Boolean.TRUE.toString().toLowerCase()); combo.setBounds(textField.getBounds()); combo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { textField.setText(combo.getText()); } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } }); combo.setVisible(false); } private void createListeners() { floatListener = new NumericalTextConstraintListener(textField, WidgetGroupFactory.ONLY_FLOAT); integerListener = new NumericalTextConstraintListener(textField, WidgetGroupFactory.ONLY_INTEGER); } private void removeListeners() { textField.removeVerifyListener(integerListener); textField.removeVerifyListener(floatListener); } @Override protected boolean validateMetaDataInputs() { boolean isValid = true; for (Widget widget : widgetToKeyMap.keySet()) { String key = ""; if (metaData.getMetaDataKeys().contains(widgetToKeyMap.get(widget))) { key = widgetToKeyMap.get(widget); } String dataType = metaData.getDataType(key); String validation = metaData.getValidation(key); if (!dataType.equals(EndpointMetaDataConstants.TYPE_BOOL) && (metaData.getPossibleValues(key) == null || metaData.getPossibleValues(key).contains("*"))) { if (((Text) widget).getText().equals("") && (validation != null && (validation.contains(ComponentConstants.INPUT_USAGE_TYPE_REQUIRED))) && !(comboDataType.getText().equalsIgnoreCase(DataType.ShortText.getDisplayName()))) { isValid = false; } else if (!((Text) widget).getText().equals("")) { if (dataType.equalsIgnoreCase(EndpointMetaDataConstants.TYPE_INT)) { int value = Integer.MAX_VALUE; try { value = Integer.parseInt(((Text) widget).getText()); isValid &= checkValidation(value, validation); } catch (NumberFormatException e) { value = Integer.MAX_VALUE; isValid &= false; } } if (dataType.equalsIgnoreCase(EndpointMetaDataConstants.TYPE_BOOL)) { double value = Double.MAX_VALUE; try { value = Double.parseDouble(((Text) widget).getText()); isValid &= checkValidation(value, validation); } catch (NumberFormatException e) { value = Double.MAX_VALUE; isValid &= false; } } } } } if (!isValid && (comboDataType.getText().equalsIgnoreCase(DataType.FileReference.getDisplayName()) || comboDataType.getText().equalsIgnoreCase(DataType.DirectoryReference.getDisplayName())) && selectAtStartCheckbox.getSelection()) { isValid = true; } return isValid; } }