/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.properties;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource2;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import de.rcenvironment.core.component.model.configuration.api.ConfigurationDescription;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDescriptionsManager;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNodeUtil;
import de.rcenvironment.core.component.workflow.model.spi.ComponentInstanceProperties;
/**
* Class that maps configuration of a component onto the IPropertySource interface.
*
* @author Heinrich Wendel
* @author Christian Weiss
*/
public class ComponentPropertySource implements IPropertySource2, ComponentInstanceProperties {
/** The WorkflowNode to operate on, holding the ComponentDescription. */
private final WorkflowNode node;
/** List of all properties of the component. */
private final ConfigurationDescription configurationDesc;
private final CommandStack cs;
public ComponentPropertySource(CommandStack stack, WorkflowNode node) {
this.node = node;
configurationDesc = node.getComponentDescription().getConfigurationDescription();
cs = stack;
}
@Override
public Object getEditableValue() {
return this;
}
@Override
public IPropertyDescriptor[] getPropertyDescriptors() {
List<IPropertyDescriptor> descriptors = new ArrayList<IPropertyDescriptor>();
for (String key : configurationDesc.getConfiguration().keySet()) {
descriptors.add(new PropertyDescriptor(key, key));
}
return descriptors.toArray(new IPropertyDescriptor[] {});
}
@Override
public boolean isPropertyResettable(final Object key) {
return false;
}
@Override
public Object getPropertyValue(Object key) {
Object value = WorkflowNodeUtil.getConfigurationValue(node, (String) key);
if (value == null) {
return ""; //$NON-NLS-1$
}
return value.toString();
}
@Override
public boolean isPropertySet(Object key) {
return WorkflowNodeUtil.isConfigurationValueSet(node, (String) key);
}
@Override
public void resetPropertyValue(Object key) {
setConfiguration((String) key, configurationDesc.getComponentConfigurationDefinition().getDefaultValue((String) key));
}
@Override
public void setPropertyValue(Object key, Object value) {
if (value == null || ((String) value).isEmpty()) {
setConfiguration((String) key, (String) null);
return;
}
setConfiguration((String) key, (String) value);
}
private String getConfiguration(String key) {
return WorkflowNodeUtil.getConfigurationValue(node, key);
}
private void setConfiguration(String key, String value) {
if ((value == null && getConfiguration(key) != null)
|| (value != null && !value.equals(getConfiguration(key)))) {
SetValueCommand setCommand = new SetValueCommand(Messages.property, node, key, value);
cs.execute(setCommand);
}
}
/**
* Command to change a property value.
*
* @author Heinrich Wendel
*/
class SetValueCommand extends Command {
private final WorkflowNode target;
private final String propertyName;
private final String propertyValue;
private String undoValue;
private ConfigurationDescription config;
SetValueCommand(String label, WorkflowNode node, String id, String value) {
super(label);
target = node;
propertyName = id;
propertyValue = value;
config = target.getConfigurationDescription();
}
@Override
public void execute() {
undoValue = config.getConfigurationValue(propertyName);
config.setConfigurationValue(propertyName, propertyValue);
}
@Override
public void undo() {
config.setConfigurationValue(propertyName, undoValue);
}
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
node.addPropertyChangeListener(listener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
node.removePropertyChangeListener(listener);
}
@Override
public EndpointDescriptionsManager getInputDescriptionsManager() {
return node.getInputDescriptionsManager();
}
@Override
public EndpointDescriptionsManager getOutputDescriptionsManager() {
return node.getOutputDescriptionsManager();
}
@Override
public ConfigurationDescription getConfigurationDescription() {
node.getComponentDescription().getComponentInterface().getIdentifier();
return node.getConfigurationDescription();
}
@Override
public String getComponentIdentifierWithVersion() {
return node.getComponentDescription().getIdentifier();
}
}