blob: 9eb41b8c559d1de1dc485045b8df2e051f6e7613 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.properties;
import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
import org.eclipse.bpel.common.ui.flatui.FlatFormData;
import org.eclipse.bpel.ui.expressions.IExpressionEditor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
/**
* An abstract ExpressionDetails which supports the selection of one or more
* radio buttons, and passes the IDs of the selected buttons to the expression
* editor as context info.
*/
public abstract class RadioChoiceExpressionSection extends ExpressionSection {
protected Composite radioComposite;
protected Button[] radioButtons;
protected int fButtonCount ;
protected int fCurrentButtonIndex;
@Override
protected String getExpressionType() {
return getButtonExprType(fCurrentButtonIndex);
}
protected abstract String[] getButtonLabels();
protected abstract String getButtonExprType(int buttonIndex);
protected abstract int getButtonIndexFromModel();
/**
* Change the input.
*
*/
@Override
protected void basicSetInput(EObject newInput) {
super.basicSetInput(newInput);
fCurrentButtonIndex = getButtonIndexFromModel();
updateWidgets();
}
// TODO: call this at the proper time
protected void calculateEnablement() {
IExpressionEditor exEditor = getExpressionEditor();
if (exEditor == null) {
throw new IllegalStateException();
}
for (int i = 0; i < radioButtons.length; i++) {
String btnType = getButtonExprType(i);
boolean enabled = fEditor.supportsExpressionType(btnType);
radioButtons[i].setEnabled(enabled);
}
}
/**
* Update the Radio button widgets according to the state of the model.
*
*/
protected void updateRadioButtonWidgets() {
if (hasEditor() == false) {
radioComposite.setVisible(false);
} else {
radioComposite.setVisible(true);
FlatFormData data = (FlatFormData) fEditorArea.getLayoutData();
data.top = new FlatFormAttachment(radioComposite, IDetailsAreaConstants.VSPACE);
calculateEnablement();
fCurrentButtonIndex = getButtonIndexFromModel();
if (fCurrentButtonIndex >= 0) radioButtons[fCurrentButtonIndex].setSelection(true);
for (int i = 0; i<radioButtons.length; i++) {
if (i != fCurrentButtonIndex) {
radioButtons[i].setSelection(false);
}
}
}
fParentComposite.layout(true);
}
@Override
protected void updateWidgets() {
super.updateWidgets();
updateRadioButtonWidgets();
}
/**
* Creates the radio button widgets.
* <p>
* NB: There is a dependency on the parent class here that is not obvious. Super classes will
* defined getButtonLabels(), this information is used to create the radio buttons, but prior to
* do that create
* @param parent
*/
protected void createRadioButtonWidgets(Composite parent) {
String[] labels = getButtonLabels();
fButtonCount = labels.length;
FlatFormData data;
radioComposite = createFlatFormComposite(parent);
radioButtons = new Button[ fButtonCount ];
FlatFormAttachment lastLeft = new FlatFormAttachment(0, BPELPropertySection.STANDARD_LABEL_WIDTH_LRG);
for (int i = 0; i < fButtonCount; i++) {
radioButtons[i] = fWidgetFactory.createButton(radioComposite, labels[i], SWT.RADIO);
data = new FlatFormData();
data.left = lastLeft;
data.top = new FlatFormAttachment(0, 0);
radioButtons[i].setLayoutData(data);
lastLeft = new FlatFormAttachment(radioButtons[i], IDetailsAreaConstants.HSPACE);
final int index = i;
radioButtons[i].addSelectionListener(new SelectionListener() {
public void widgetSelected (SelectionEvent e) {
radioButtonSelected(index,radioButtons[index]);
}
public void widgetDefaultSelected(SelectionEvent e) { }
});
}
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(expressionLanguageViewer.getControl(), IDetailsAreaConstants.VSPACE + 2);
radioComposite.setLayoutData(data);
}
protected abstract void radioButtonSelected (int index, Button button) ;
@Override
protected void createClient(Composite parent) {
super.createClient(parent);
createRadioButtonWidgets(fParentComposite);
}
protected boolean showRadioButtons() {
return hasEditor();
}
/**
* Allow the editor in the combo if *any* of the radio buttons would be supported
* by that editor. (calculateEnabled() will decide which radio buttons to actually
* enable for the selected editor).
*/
@Override
protected boolean isEditorSupported(IExpressionEditor exEditor) {
for (int i = 0; i< fButtonCount; i++) {
String btnType = getButtonExprType(i);
if (exEditor.supportsExpressionType(btnType)) {
return true;
}
}
return false;
}
}