/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.script.gui;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
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.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import de.rcenvironment.components.script.common.ScriptComponentConstants;
import de.rcenvironment.core.component.api.ComponentConstants;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescriptionsManager;
import de.rcenvironment.core.datamodel.api.EndpointType;
import de.rcenvironment.core.gui.workflow.editor.properties.DefaultEndpointPropertySection;
import de.rcenvironment.core.gui.workflow.editor.properties.EndpointSelectionPane;
import de.rcenvironment.core.gui.workflow.editor.properties.Messages;
/**
* "Properties" view tab for endpoints.
*
* @author Doreen Seider
*/
public class ScriptEndpointSection extends DefaultEndpointPropertySection {
private EndpointSelectionPane inputPane;
private Button orGroupCheckbox;
public ScriptEndpointSection() {
inputPane = new EndpointSelectionPane(Messages.inputs,
EndpointType.INPUT, ScriptComponentConstants.GROUP_NAME_AND, new String[] { ScriptComponentConstants.GROUP_NAME_OR },
new String[] {}, this);
EndpointSelectionPane outputPane = new EndpointSelectionPane(Messages.outputs,
EndpointType.OUTPUT, "default", new String[] {}, new String[] {}, this);
setColumns(2);
setPanes(inputPane, outputPane);
}
@Override
public void createCompositeContent(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createCompositeContent(parent, aTabbedPropertySheetPage);
TabbedPropertySheetWidgetFactory toolkit = aTabbedPropertySheetPage.getWidgetFactory();
Composite noteComposite = toolkit.createComposite(endpointsComposite);
GridData gridData = new GridData();
gridData.horizontalSpan = 2;
noteComposite.setLayoutData(gridData);
noteComposite.setLayout(new GridLayout(1, false));
orGroupCheckbox = new Button(noteComposite, SWT.CHECK);
orGroupCheckbox.setText("Execute on each new input value");
orGroupCheckbox.setData(CONTROL_PROPERTY_KEY, ScriptComponentConstants.PROP_KEY_XOR);
orGroupCheckbox.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
Label noteLabel = new Label(noteComposite, SWT.READ_ONLY);
noteLabel.setText("(ie inputs have an 'xor' relation instead of an 'and' relation)");
}
@Override
public void aboutToBeShown() {
super.aboutToBeShown();
inputPane.refresh();
}
@Override
protected Synchronizer createSynchronizer() {
return new ScriptWidgetsSynchronizer();
}
@Override
protected Updater createUpdater() {
return new ScriptWidgetsUpdater();
}
/**
* Script-specific implementation of {@link Synchronizer}.
*
* @author Doreen Seider
*/
private class ScriptWidgetsSynchronizer extends DefaultSynchronizer {
@Override
protected void handlePropertyChange(Control control, String key, String newValue, String oldValue) {
if (key.equals(ScriptComponentConstants.PROP_KEY_XOR)) {
switchDynamicInputIds(Boolean.parseBoolean(newValue));
}
super.handlePropertyChange(control, key, newValue, oldValue);
}
}
/**
* Script-specific implementation of {@link Updater}.
*
* @author Doreen Seider
*/
private class ScriptWidgetsUpdater extends DefaultUpdater {
@Override
public void updateControl(Control control, String propertyName, String newValue, String oldValue) {
if (propertyName.equals(ScriptComponentConstants.PROP_KEY_XOR) && Boolean.parseBoolean(newValue)) {
inputPane.updateDynamicEndpointIdToManage(ScriptComponentConstants.GROUP_NAME_OR);
}
super.updateControl(control, propertyName, newValue, oldValue);
}
}
private void switchDynamicInputIds(boolean xor) {
if (xor) {
switchDynamicInputsId(ScriptComponentConstants.GROUP_NAME_OR);
} else {
switchDynamicInputsId(ScriptComponentConstants.GROUP_NAME_AND);
}
}
private void switchDynamicInputsId(String toDynamicInputId) {
inputPane.updateDynamicEndpointIdToManage(toDynamicInputId);
EndpointDescriptionsManager inputDescriptionsManager = getConfiguration().getInputDescriptionsManager();
for (EndpointDescription ep : inputDescriptionsManager.getEndpointDescriptions()) {
inputDescriptionsManager.removeDynamicEndpointDescriptionQuietely(ep.getName());
ep.getMetaData().remove(ComponentConstants.INPUT_METADATA_KEY_INPUT_EXECUTION_CONSTRAINT);
inputDescriptionsManager.addDynamicEndpointDescription(toDynamicInputId,
ep.getName(), ep.getDataType(), ep.getMetaData(), ep.getIdentifier());
if (!ep.getConnectedDataTypes().isEmpty()) {
// inputs can only be connected to one ouput
inputDescriptionsManager.addConnectedDataType(ep.getName(), ep.getConnectedDataTypes().get(0));
}
}
}
}