/*
* 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.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
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.layout.RowLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import de.rcenvironment.components.outputwriter.common.OutputLocation;
import de.rcenvironment.components.outputwriter.common.OutputWriterComponentConstants;
import de.rcenvironment.components.outputwriter.common.OutputWriterComponentConstants.HandleExistingFile;
import de.rcenvironment.core.gui.utils.incubator.AlphanumericalTextContraintListener;
import de.rcenvironment.core.gui.workflow.executor.properties.WhitespaceShowListener;
/**
*
* Edit Dialog for an OutputLocation.
*
* @author Brigitte Boden
*/
public class OutputLocationEditDialog extends Dialog {
private static final int GROUPS_MIN_WIDTH = 550;
private static final int HEADER_HEIGHT = 30;
private static final int FORMAT_HEIGHT = 50;
private static final char[] FORBIDDEN_CHARS = new char[] { '/', '\\', ':',
'*', '?', '\"', '>', '<', '|' };
private static final int MINUS_ONE = -1;
private static final String COLON = ":";
private String chosenFilename;
private String chosenFolderForSaving;
private HandleExistingFile chosenHandle;
private List<String> chosenInputSet;
private String chosenHeader;
private String chosenFormatString;
private String title;
private final Set<String> paths;
private final List<String> possibleInputs;
private final List<String> inputsSelectedByOthers;
private final List<String> otherOutputLocationFileNamesWithPaths;
private Combo formatPlaceholderCombo;
private Combo headerPlaceholderCombo;
/**
* Dialog for creating or editing an endpoint.
*
* @param parentShell parent Shell
* @param title
* @param configuration the containing endpoint manager
*/
public OutputLocationEditDialog(Shell parentShell, String title,
Set<String> paths, List<String> possibleInputs, List<String> inputsSelectedByOthers,
List<String> otherOutputLocationFileNamesWithPaths) {
super(parentShell);
setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER | SWT.RESIZE | SWT.APPLICATION_MODAL);
this.title = title;
this.paths = paths;
this.possibleInputs = possibleInputs;
Collections.sort(this.possibleInputs);
this.inputsSelectedByOthers = inputsSelectedByOthers;
this.otherOutputLocationFileNamesWithPaths = otherOutputLocationFileNamesWithPaths;
chosenFilename = "";
chosenFolderForSaving = OutputWriterComponentConstants.ROOT_DISPLAY_NAME;
chosenHandle = OutputWriterComponentConstants.DEFAULT_HANDLE_EXISTING_FILE;
chosenInputSet = new ArrayList<String>();
chosenHeader = "";
chosenFormatString = "";
}
public String getChosenFilename() {
return chosenFilename;
}
public HandleExistingFile getChosenHandle() {
return chosenHandle;
}
public List<String> getChosenInputSet() {
return chosenInputSet;
}
public String getChosenHeader() {
return chosenHeader;
}
public String getChosenFormatString() {
return chosenFormatString;
}
public String getChosenFolderForSaving() {
return chosenFolderForSaving;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
GridData g = new GridData(GridData.FILL_HORIZONTAL);
g.grabExcessHorizontalSpace = true;
g.horizontalAlignment = GridData.CENTER;
container.setLayoutData(g);
createFileAndFolderSettings(container);
Group inputsGroup = new Group(container, SWT.LEFT);
GridData gr = new GridData(GridData.FILL_BOTH);
gr.widthHint = container.getSize().x;
inputsGroup.setLayoutData(gr);
gr.grabExcessVerticalSpace = true;
gr.minimumWidth = GROUPS_MIN_WIDTH;
inputsGroup.setText(Messages.groupTitleInputs);
RowLayout rowlayout = new RowLayout();
inputsGroup.setLayout(rowlayout);
boolean listEmpty = true;
for (final String input : possibleInputs) {
if (!inputsSelectedByOthers.contains(input)) {
listEmpty = false;
final Button item = new Button(inputsGroup, SWT.CHECK);
item.setText(input);
if (chosenInputSet.contains(input)) {
item.setSelection(true);
}
item.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
if (item.getSelection()) {
chosenInputSet.add(input);
} else {
chosenInputSet.remove(input);
}
validateInput();
refreshPlaceholders();
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
widgetSelected(arg0);
}
});
}
}
if (listEmpty) {
final Label dummyLabel = new Label(inputsGroup, SWT.NONE);
dummyLabel.setText("");
final Label infoLabel = new Label(inputsGroup, SWT.NONE);
infoLabel.setText(Messages.emptyInputTable);
}
createFormatSection(container);
return container;
}
protected void createFileAndFolderSettings(Composite container) {
Group configGroup = new Group(container, SWT.CENTER);
GridData g = new GridData(GridData.FILL_HORIZONTAL);
configGroup.setLayoutData(g);
g.grabExcessHorizontalSpace = true;
g.horizontalAlignment = GridData.FILL_HORIZONTAL;
g.minimumWidth = GROUPS_MIN_WIDTH;
configGroup.setText(Messages.groupTitleTargetFile);
configGroup.setLayout(new GridLayout(2, false));
final Label fileNameLabel = new Label(configGroup, SWT.NONE);
fileNameLabel.setText(Messages.outputLocFilename + COLON);
final Text fileName = new Text(configGroup, SWT.SINGLE | SWT.BORDER);
fileName.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
fileName.setText(chosenFilename);
fileName.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS));
fileName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
chosenFilename = fileName.getText();
validateInput();
}
});
new Label(configGroup, SWT.NONE).setText("");
final Composite placeholderComp = new Composite(configGroup, SWT.NONE);
placeholderComp.setLayout(new GridLayout(2, false));
placeholderComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
Combo placeholderCombo =
OutputWriterGuiUtils.createPlaceholderCombo(placeholderComp, OutputWriterComponentConstants.WORDLIST_OUTPUT);
OutputWriterGuiUtils.createPlaceholderInsertButton(placeholderComp, placeholderCombo, fileName);
new Label(configGroup, SWT.NONE).setText(Messages.targetFolder + COLON);
final Combo directoryCombo = new Combo(configGroup, 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) {
directoryCombo.add(path);
}
int index = MINUS_ONE;
for (String item : directoryCombo.getItems()) {
if (item.equals(chosenFolderForSaving)) {
index = directoryCombo.indexOf(item);
}
}
if (index >= 0) {
directoryCombo.select(index);
} else {
directoryCombo.select(0);
}
chosenFolderForSaving = directoryCombo.getText();
new Label(configGroup, SWT.NONE).setText(Messages.subFolder + COLON);
final Text additionalFolder = new Text(configGroup, 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) {
if (!((Text) arg0.getSource()).getText().isEmpty()) {
chosenFolderForSaving =
OutputWriterComponentConstants.ROOT_DISPLAY_NAME + File.separator + ((Text) arg0.getSource()).getText();
} else {
chosenFolderForSaving = OutputWriterComponentConstants.ROOT_DISPLAY_NAME;
}
validateInput();
}
});
new Label(configGroup, SWT.NONE).setText("");
new Label(configGroup, SWT.NONE).setText(Messages.onlyOneSubfolderMessage);
new Label(configGroup, SWT.NONE).setText("");
Composite dirPlaceholderComposite = new Composite(configGroup, SWT.NONE);
dirPlaceholderComposite.setLayout(new GridLayout(2, false));
dirPlaceholderComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
final Combo dirPlaceholderCombo =
OutputWriterGuiUtils.createPlaceholderCombo(dirPlaceholderComposite, OutputWriterComponentConstants.WORDLIST_OUTPUT);
final Button dirInsertButton =
OutputWriterGuiUtils.createPlaceholderInsertButton(dirPlaceholderComposite, dirPlaceholderCombo, additionalFolder);
if (directoryCombo.getSelectionIndex() > 0) {
additionalFolder.setEnabled(false);
dirPlaceholderCombo.setEnabled(false);
dirInsertButton.setEnabled(false);
}
directoryCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
chosenFolderForSaving = "" + ((Combo) arg0.getSource()).getText();
additionalFolder.setEnabled(((Combo) arg0.getSource()).getText().equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME));
dirPlaceholderCombo.setEnabled(((Combo) arg0.getSource()).getText()
.equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME));
dirInsertButton.setEnabled(((Combo) arg0.getSource()).getText().equals(OutputWriterComponentConstants.ROOT_DISPLAY_NAME));
validateInput();
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
widgetSelected(arg0);
validateInput();
}
});
additionalFolder.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS));
}
protected void createFormatSection(Composite container) {
Group configGroup = new Group(container, SWT.CENTER);
GridData g = new GridData(GridData.FILL_HORIZONTAL);
configGroup.setLayoutData(g);
g.grabExcessHorizontalSpace = true;
g.horizontalAlignment = GridData.BEGINNING;
g.minimumWidth = GROUPS_MIN_WIDTH;
configGroup.setText(Messages.groupTitleFormat);
configGroup.setLayout(new GridLayout(2, false));
final Label headerLabel = new Label(configGroup, SWT.NONE);
headerLabel.setText(Messages.header + COLON + "\n" + Messages.headerMessage);
final StyledText header = new StyledText(configGroup, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
GridData headerGridData = new GridData(GridData.FILL_BOTH);
headerGridData.heightHint = HEADER_HEIGHT;
header.setLayoutData(headerGridData);
header.setText(chosenHeader);
header.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
chosenHeader = header.getText();
validateInput();
}
});
WhitespaceShowListener headerWhitespaceListener = new WhitespaceShowListener();
headerWhitespaceListener.setScriptingText(header);
header.addPaintListener(headerWhitespaceListener);
headerWhitespaceListener.setOn(true);
headerWhitespaceListener.drawStyledText();
new Label(configGroup, SWT.NONE).setText("");
final Composite headerPlaceholderComp = new Composite(configGroup, SWT.NONE);
headerPlaceholderComp.setLayout(new GridLayout(2, false));
headerPlaceholderComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
headerPlaceholderCombo = OutputWriterGuiUtils.createPlaceholderCombo(headerPlaceholderComp, new String[0]);
OutputWriterGuiUtils.createPlaceholderInsertButton(headerPlaceholderComp, headerPlaceholderCombo, header);
final Label formatStringLabel = new Label(configGroup, SWT.NONE);
formatStringLabel.setText(Messages.format + COLON + "\n" + Messages.formatMessage);
final StyledText formatString = new StyledText(configGroup, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
GridData formatGridData = new GridData(GridData.FILL_BOTH);
formatGridData.heightHint = FORMAT_HEIGHT;
formatString.setLayoutData(formatGridData);
formatString.setText(chosenFormatString);
// formatString.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS));
formatString.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent arg0) {
chosenFormatString = formatString.getText();
validateInput();
}
});
WhitespaceShowListener formatWhitespaceListener = new WhitespaceShowListener();
formatWhitespaceListener.setScriptingText(formatString);
formatString.addPaintListener(formatWhitespaceListener);
formatWhitespaceListener.setOn(true);
formatWhitespaceListener.drawStyledText();
new Label(configGroup, SWT.NONE).setText("");
final Composite formatPlaceholderComp = new Composite(configGroup, SWT.NONE);
formatPlaceholderComp.setLayout(new GridLayout(2, false));
formatPlaceholderComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
formatPlaceholderCombo = OutputWriterGuiUtils.createPlaceholderCombo(formatPlaceholderComp, new String[0]);
OutputWriterGuiUtils.createPlaceholderInsertButton(formatPlaceholderComp, formatPlaceholderCombo, formatString);
refreshPlaceholders();
new Label(configGroup, SWT.NONE).setText(Messages.handleExisting + COLON);
final Combo existingFileCombo = new Combo(configGroup, SWT.READ_ONLY);
existingFileCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
String[] handlingOptions = { Messages.handleAppend, Messages.handleAutoRename, Messages.handleOverride };
existingFileCombo.setItems(handlingOptions);
// Select correct item
switch (chosenHandle) {
case APPEND:
existingFileCombo.select(existingFileCombo.indexOf(Messages.handleAppend));
break;
case OVERRIDE:
existingFileCombo.select(existingFileCombo.indexOf(Messages.handleOverride));
break;
case AUTORENAME:
existingFileCombo.select(existingFileCombo.indexOf(Messages.handleAutoRename));
break;
default:
existingFileCombo.select(existingFileCombo.indexOf(Messages.handleAppend));
LogFactory.getLog(getClass()).error("Handling existing files: Option can not be selected.");
}
existingFileCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent arg0) {
if (existingFileCombo.getText().equals(Messages.handleAppend)) {
chosenHandle = HandleExistingFile.APPEND;
} else if (existingFileCombo.getText().equals(Messages.handleAutoRename)) {
chosenHandle = HandleExistingFile.AUTORENAME;
} else if (existingFileCombo.getText().equals(Messages.handleOverride)) {
chosenHandle = HandleExistingFile.OVERRIDE;
} else {
chosenHandle = HandleExistingFile.APPEND;
LogFactory.getLog(getClass()).error("Handling existing files: Option does not exist.");
}
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
widgetSelected(arg0);
}
});
new Label(configGroup, SWT.NONE).setText("");
new Label(configGroup, SWT.NONE).setText(Messages.previousIterationMessage);
new Label(configGroup, SWT.NONE).setText("");
}
@Override
protected void okPressed() {
super.okPressed();
}
@Override
public void create() {
super.create();
// dialog title
getShell().setText(title);
validateInput();
}
protected void validateInput() {
// Check if input fields are empty
boolean isValid = !chosenFilename.isEmpty();
isValid = isValid && !otherOutputLocationFileNamesWithPaths.contains(chosenFolderForSaving + File.separator + chosenFilename);
List<String> forbiddenFilenames = Arrays.asList(OutputWriterComponentConstants.PROBLEMATICFILENAMES_WIN);
isValid = isValid && !forbiddenFilenames.contains(chosenFilename.toUpperCase());
// enable/disable "ok"
getButton(IDialogConstants.OK_ID).setEnabled(isValid);
}
/**
*
* Creates selectable placeholders for header and formatString.
*
*/
protected void refreshPlaceholders() {
List<String> placeholderList = new ArrayList<String>();
List<String> headerPlaceholderList = new ArrayList<String>();
headerPlaceholderList.add(OutputWriterComponentConstants.PH_LINEBREAK);
headerPlaceholderList.add(OutputWriterComponentConstants.PH_TIMESTAMP);
headerPlaceholderList.add(OutputWriterComponentConstants.PH_EXECUTION_COUNT);
Collections.sort(chosenInputSet);
for (String input : chosenInputSet) {
placeholderList.add(OutputWriterComponentConstants.PH_PREFIX + input + OutputWriterComponentConstants.PH_SUFFIX);
// Placeholder for input name is currently not needed
/*
* placeholderList.add(OutputWriterComponentConstants.PH_PREFIX + OutputWriterComponentConstants.INPUTNAME +
* OutputWriterComponentConstants.PH_DELIM + input + OutputWriterComponentConstants.PH_SUFFIX);
* headerPlaceholderList.add(OutputWriterComponentConstants.PH_PREFIX + OutputWriterComponentConstants.INPUTNAME +
* OutputWriterComponentConstants.PH_DELIM + input + OutputWriterComponentConstants.PH_SUFFIX);
*/
}
placeholderList.add(OutputWriterComponentConstants.PH_LINEBREAK);
placeholderList.add(OutputWriterComponentConstants.PH_TIMESTAMP);
placeholderList.add(OutputWriterComponentConstants.PH_EXECUTION_COUNT);
formatPlaceholderCombo.setItems((String[]) placeholderList.toArray(new String[placeholderList.size()]));
formatPlaceholderCombo.select(0);
headerPlaceholderCombo.setItems((String[]) headerPlaceholderList.toArray(new String[headerPlaceholderList.size()]));
headerPlaceholderCombo.select(0);
}
/**
* Initialize values in dialog fields for editing.
*
* @param out Output Location to edit
*/
public void initializeValues(OutputLocation out) {
chosenFilename = out.getFilename();
chosenFolderForSaving = out.getFolderForSaving();
chosenFormatString = out.getFormatString();
//Copy list to prevent side effects.
chosenInputSet = new ArrayList<String>(out.getInputs());
chosenHandle = out.getHandleExistingFile();
chosenHeader = out.getHeader();
}
}