/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.inputprovider.gui;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.FormToolkit;
import de.rcenvironment.components.inputprovider.common.InputProviderComponentConstants;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
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.workflow.editor.properties.EndpointSelectionPane;
import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand;
import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand.Executor;
/**
* An adapted EndpointSelectionPane for the InputProvider Component.
*
* @author Mark Geiger
*/
public class InputProviderEndpointSelectionPane extends EndpointSelectionPane {
private Composite noteComposite;
public InputProviderEndpointSelectionPane(String title, EndpointType direction, String dynEndpointIdToManage, Executor executor) {
super(title, direction, dynEndpointIdToManage, new String[] {}, new String[] {}, executor);
}
@Override
public Control createControl(Composite parent, String title, FormToolkit toolkit) {
Control control = super.createControl(parent, title, toolkit);
// empty label to get desired layout - feel free to improve
new Label(client, SWT.READ_ONLY);
noteComposite = toolkit.createComposite(client);
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
noteComposite.setLayoutData(gridData);
noteComposite.setLayout(new GridLayout(2, false));
// TODO wrap text of the noteLabel - SWT.WRAP does not work (see Mantis issue 12257). - stam_mr, June 2015.
CLabel noteLabel = new CLabel(noteComposite, SWT.NONE);
noteLabel.setImage(ImageManager.getInstance().getSharedImage(StandardImages.WARNING_16));
noteLabel.setText(Messages.note);
section.setClient(client);
toolkit.paintBordersFor(client);
section.setExpanded(true);
return control;
}
@Override
public void setConfiguration(ComponentInstanceProperties configuration) {
if (configuration != null) {
super.setConfiguration(configuration);
setNoteVisible(areFilesOrDirectoriesDefined());
}
}
private void setNoteVisible(boolean visible) {
if (!noteComposite.isDisposed()) {
noteComposite.setVisible(visible);
}
}
@Override
protected void onAddClicked() {
Map<String, String> metaData = new HashMap<String, String>();
InputProviderEndpointEditDialog dialog =
new InputProviderEndpointEditDialog(Display.getDefault().getActiveShell(),
EndpointActionType.ADD, configuration, endpointType, dynEndpointIdToManage, false,
icon, endpointManager.getDynamicEndpointDefinition(dynEndpointIdToManage)
.getMetaDataDefinition(), metaData);
if (dialog.open() == Dialog.OK) {
String name = dialog.getChosenName();
DataType type = dialog.getChosenDataType();
metaData = dialog.getMetadataValues();
if (metaData.containsKey(InputProviderComponentConstants.META_FILESOURCETYPE)
&& metaData.get(InputProviderComponentConstants.META_FILESOURCETYPE).equals(
InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) {
metaData.put(InputProviderComponentConstants.META_VALUE, "${" + name + "}");
}
executeAddCommand(name, type, metaData);
setNoteVisible(areFilesOrDirectoriesDefined());
}
}
private boolean areFilesOrDirectoriesDefined() {
for (EndpointDescription desc : configuration.getOutputDescriptionsManager().getDynamicEndpointDescriptions()) {
if (desc.getDataType() == DataType.FileReference || desc.getDataType() == DataType.DirectoryReference) {
return true;
}
}
return false;
}
@Override
protected void onEditClicked() {
final String name = (String) table.getSelection()[0].getData();
EndpointDescription endpoint = endpointManager.getEndpointDescription(name);
Map<String, String> newMetaData = cloneMetaData(endpoint.getMetaData());
InputProviderEndpointEditDialog dialog =
new InputProviderEndpointEditDialog(Display.getDefault().getActiveShell(),
EndpointActionType.EDIT, configuration, endpointType,
dynEndpointIdToManage, false, icon, endpoint.getEndpointDefinition()
.getMetaDataDefinition(), newMetaData);
onEditClicked(name, dialog, newMetaData);
setNoteVisible(areFilesOrDirectoriesDefined());
}
@Override
protected void executeAddCommand(String name, DataType type, Map<String, String> metaData) {
if (metaData.containsKey(InputProviderComponentConstants.META_FILESOURCETYPE)
&& metaData.get(InputProviderComponentConstants.META_FILESOURCETYPE).equals(
InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) {
WorkflowNodeCommand command = new InputProviderAddDynamicEndpointCommand(endpointType, dynEndpointIdToManage, name,
type, metaData, this); // null = this
execute(command);
} else {
super.executeAddCommand(name, type, metaData);
}
}
@Override
protected void executeEditCommand(EndpointDescription oldDescription, EndpointDescription newDescription) {
if (oldDescription.getMetaData().containsKey(InputProviderComponentConstants.META_FILESOURCETYPE)
&& oldDescription.getMetaData().get(InputProviderComponentConstants.META_FILESOURCETYPE)
.equals(InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)
|| newDescription.getMetaData().containsKey(InputProviderComponentConstants.META_FILESOURCETYPE)
&& newDescription.getMetaData().get(InputProviderComponentConstants.META_FILESOURCETYPE)
.equals(InputProviderComponentConstants.META_FILESOURCETYPE_ATWORKFLOWSTART)) {
WorkflowNodeCommand command = new InputProviderEditDynamicEndpointCommand(endpointType, oldDescription, newDescription, this);
execute(command);
} else {
super.executeEditCommand(oldDescription, newDescription);
}
}
@Override
protected void executeRemoveCommand(List<String> names) {
WorkflowNodeCommand command = new InputProviderRemoveDynamicEndpointCommand(endpointType,
dynEndpointIdToManage, names, null, this); // null = this
execute(command);
setNoteVisible(areFilesOrDirectoriesDefined());
}
}