package org.csstudio.sds.ui.internal.editor.newproperties;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.csstudio.sds.SdsPlugin;
import org.csstudio.sds.internal.eventhandling.BehaviorDescriptor;
import org.csstudio.sds.internal.eventhandling.IBehaviorDescription;
import org.csstudio.sds.internal.eventhandling.IBehaviorService;
import org.csstudio.sds.internal.model.BehaviorProperty;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* Section for {@link BehaviorProperty}.
*
* @author Sven Wende
*
*/
public class BehaviorSection extends AbstractBaseSection<BehaviorProperty> {
private ComboViewer optionViewer;
private ISelectionChangedListener changeListener;
public BehaviorSection(String propertyId) {
super(propertyId);
}
/**
* {@inheritDoc}
*/
@Override
protected void doCreateControls(Composite parent,
TabbedPropertySheetPage tabbedPropertySheetPage) {
parent.setLayout(new FormLayout());
// .. create a combo and the corresponding viewer
CCombo combo = getWidgetFactory().createCCombo(parent,
SWT.BORDER | SWT.READ_ONLY);
FormData fd = new FormData();
fd.left = new FormAttachment(0, 0);
fd.right = new FormAttachment(50, 0);
combo.setLayoutData(fd);
optionViewer = new ComboViewer(combo);
optionViewer.setLabelProvider(new BehaviorDescriptionLabelProvider());
optionViewer.setContentProvider(new ArrayContentProvider());
// .. listen to changes
changeListener = new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IBehaviorDescription behaviorDescription = (IBehaviorDescription) ((IStructuredSelection) optionViewer
.getSelection()).getFirstElement();
if (behaviorDescription != null) {
applyPropertyChange(behaviorDescription.getBehaviorId());
} else {
applyPropertyChange("");
}
}
};
optionViewer.addSelectionChangedListener(changeListener);
}
/**
* {@inheritDoc}
*/
@Override
protected void doRefreshControls(BehaviorProperty widgetProperty) {
// .. update the combobox
if (optionViewer.getContentProvider() != null) {
List<BehaviorDescriptor> behaviorDescriptors = getBehaviorDescriptors();
optionViewer.setInput(behaviorDescriptors);
// .. select the current behavior
BehaviorDescriptor selectedBehavior = behaviorDescriptors.get(0);
String currentBehaviorId = widgetProperty.getPropertyValue();
if (currentBehaviorId != null) {
for (BehaviorDescriptor d : behaviorDescriptors) {
if (currentBehaviorId.equals(d.getBehaviorId())) {
selectedBehavior = d;
break;
}
}
}
assert selectedBehavior != null;
optionViewer.removeSelectionChangedListener(changeListener);
optionViewer
.setSelection(new StructuredSelection(selectedBehavior));
optionViewer.addSelectionChangedListener(changeListener);
}
}
@SuppressWarnings("unchecked")
private List<BehaviorDescriptor> getBehaviorDescriptors() {
List<BehaviorDescriptor> result = new ArrayList<BehaviorDescriptor>();
// .. add empty
BehaviorDescriptor noneDescriptor = new BehaviorDescriptor("none", "*",
"None", Collections.EMPTY_SET, null);
result.add(noneDescriptor);
// .. add real behaviors
if (selectedWidget != null) {
IBehaviorService service = SdsPlugin.getDefault()
.getBehaviourService();
result.addAll(service.getBehaviors(selectedWidget.getTypeID()));
}
return result;
}
/**
* Label provider for {@link IBehaviorDescription}.
*
* @author Sven Wende
*
*/
private static final class BehaviorDescriptionLabelProvider extends
LabelProvider {
@Override
public String getText(Object element) {
BehaviorDescriptor d = (BehaviorDescriptor) element;
return d.getDescription();
}
}
}