/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.outputwriter.gui; import java.io.File; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; 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.components.outputwriter.common.OutputWriterComponentConstants; 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.resources.api.ImageManager; import de.rcenvironment.core.gui.resources.api.StandardImages; import de.rcenvironment.core.gui.utils.incubator.AlphanumericalTextContraintListener; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointEditDialog; /** * Special edit dialog for the output writer. * * @author Sascha Zur * @author Brigitte Boden */ public class OutputWriterEndpointEditDialog extends EndpointEditDialog { private static final String NO_DATA_STRING = "-"; private static final char[] FORBIDDEN_CHARS = new char[] { '/', '\\', ':', '*', '?', '\"', '>', '<', '|' }; private static final int MINUS_ONE = -1; private static final String COLON = ":"; private final Set<String> paths; private Text result; private CLabel hintLabel; public OutputWriterEndpointEditDialog(Shell parentShell, EndpointActionType actionType, ComponentInstanceProperties configuration, EndpointType direction, String id, boolean isStatic, EndpointMetaDataDefinition metaData, Map<String, String> metadataValues, Set<String> paths) { super(parentShell, actionType, configuration, direction, id, isStatic, metaData, metadataValues); this.paths = paths; } @Override protected Control createDialogArea(Composite parent) { Control superControl = super.createDialogArea(parent); hintLabel = new CLabel((Composite) superControl, SWT.NONE); hintLabel .setText( "You are adding a primitive data type input." + "Therefore, you also\nneed to add this input to a target file in the table below."); hintLabel.setImage(ImageManager.getInstance().getSharedImage(StandardImages.INFORMATION_16)); return superControl; } @Override protected void createSettings(Map<Integer, String> sortedKeyMap, Composite container) { String key = OutputWriterComponentConstants.CONFIG_KEY_FILENAME; String text = metaData.getGuiName(key); String value = metadataValues.get(key); final Label nameLabel = new Label(container, SWT.NONE); nameLabel.setText(text + " "); result = new Text(container, SWT.SINGLE | SWT.BORDER); result.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); if (value == null || value.equals(NO_DATA_STRING)) { value = ""; } result.setText(value); result.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS)); widgetToKeyMap.put(result, key); result.addModifyListener(new MethodPropertiesModifyListener()); new Label(container, SWT.NONE).setText(""); final Composite placeholderComp = new Composite(container, SWT.NONE); placeholderComp.setLayout(new GridLayout(2, false)); placeholderComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); final Combo placeholderCombo = OutputWriterGuiUtils.createPlaceholderCombo(placeholderComp, OutputWriterComponentConstants.WORDLIST); OutputWriterGuiUtils.createPlaceholderInsertButton(placeholderComp, placeholderCombo, result); new Label(container, SWT.NONE).setText(Messages.targetFolder + COLON); final Combo directoryCombo = new Combo(container, SWT.READ_ONLY); directoryCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); if (!paths.contains(OutputWriterComponentConstants.ROOT_DISPLAY_NAME)) { directoryCombo.add(OutputWriterComponentConstants.ROOT_DISPLAY_NAME); } for (String path : paths) { if (!path.equals(NO_DATA_STRING)) { directoryCombo.add(path); } } int index = MINUS_ONE; for (String item : directoryCombo.getItems()) { if (item.equals(metadataValues.get(OutputWriterComponentConstants.CONFIG_KEY_FOLDERFORSAVING))) { index = directoryCombo.indexOf(item); } } if (index >= 0) { directoryCombo.select(index); } else { directoryCombo.select(0); } metadataValues.put(OutputWriterComponentConstants.CONFIG_KEY_FOLDERFORSAVING, "" + directoryCombo.getText()); new Label(container, SWT.NONE).setText(Messages.subFolder + COLON); final Text additionalFolder = new Text(container, SWT.SINGLE | SWT.BORDER); additionalFolder.setMessage(Messages.optionalMessage); additionalFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); additionalFolder.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { metadataValues.put(OutputWriterComponentConstants.CONFIG_KEY_FOLDERFORSAVING, OutputWriterComponentConstants.ROOT_DISPLAY_NAME + File.separator + ((Text) arg0.getSource()).getText()); } }); new Label(container, SWT.NONE).setText(""); new Label(container, SWT.NONE).setText(Messages.onlyOneSubfolderMessage); new Label(container, SWT.NONE).setText(""); final Composite placeholderComp2 = new Composite(container, SWT.NONE); placeholderComp2.setLayout(new GridLayout(2, false)); placeholderComp2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL)); final Combo placeholderCombo2 = OutputWriterGuiUtils.createPlaceholderCombo(placeholderComp2, OutputWriterComponentConstants.WORDLIST_SUBFOLDER); final Button insertButton2 = OutputWriterGuiUtils.createPlaceholderInsertButton(placeholderComp2, placeholderCombo2, additionalFolder); if (directoryCombo.getSelectionIndex() > 0) { additionalFolder.setEnabled(false); placeholderCombo2.setEnabled(false); insertButton2.setEnabled(false); } directoryCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { metadataValues.put(OutputWriterComponentConstants.CONFIG_KEY_FOLDERFORSAVING, "" + ((Combo) arg0.getSource()).getText()); additionalFolder.setEnabled(((Combo) arg0.getSource()).getText().equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME)); placeholderCombo2.setEnabled(((Combo) arg0.getSource()).getText().equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME)); insertButton2.setEnabled(((Combo) arg0.getSource()).getText().equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME)); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); additionalFolder.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS)); } @Override public Map<String, String> getMetadataValues() { Map<String, String> metaData = super.getMetadataValues(); if (!currentDataType.equals(DataType.DirectoryReference) && !currentDataType.equals(DataType.FileReference)) { //If the input has a simple data type, remove values for target file and target folder metaData.put(OutputWriterComponentConstants.CONFIG_KEY_FILENAME, NO_DATA_STRING); metaData.put(OutputWriterComponentConstants.CONFIG_KEY_FOLDERFORSAVING, NO_DATA_STRING); } return metaData; } @Override protected boolean validateMetaDataInputs() { List<String> forbiddenFilenames = Arrays.asList(OutputWriterComponentConstants.PROBLEMATICFILENAMES_WIN); hintLabel.setVisible(!comboDataType.getText().equals(DataType.FileReference.getDisplayName()) && !comboDataType.getText().equals(DataType.DirectoryReference.getDisplayName())); return super.validateMetaDataInputs() && !forbiddenFilenames.contains(result.getText().toUpperCase()); } }