package org.jbpm.gd.jpdl.properties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.jbpm.gd.common.model.GenericElement;
import org.jbpm.gd.jpdl.dialog.ChooseDelegationClassDialog;
import org.jbpm.gd.jpdl.model.Action;
public class ActionDetailsConfigurationComposite implements SelectionListener, FocusListener {
public static ActionDetailsConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) {
ActionDetailsConfigurationComposite result = new ActionDetailsConfigurationComposite();
result.widgetFactory = widgetFactory;
result.parent = parent;
result.create();
return result;
}
private TabbedPropertySheetWidgetFactory widgetFactory;
private Composite parent;
private CCombo actionTypeCombo;
private Composite handlerComposite;
private Composite expressionComposite;
private Label expressionLabel;
private Text expressionText;
private DelegationConfigurationComposite delegationConfigurationComposite;
private Action action;
private String selectedActionType = "<Choose>";
private ActionDetailsConfigurationComposite() {}
public void setAction(Action action) {
if (this.action == action) return;
unhookListeners();
clearControls();
this.action = action;
if (action != null) {
updateControls();
hookListeners();
}
}
public Action getAction() {
return action;
}
private void hookListeners() {
actionTypeCombo.addSelectionListener(this);
expressionText.addSelectionListener(this);
expressionText.addFocusListener(this);
}
private void unhookListeners() {
actionTypeCombo.removeSelectionListener(this);
expressionText.removeSelectionListener(this);
expressionText.removeFocusListener(this);
}
private void clearControls() {
actionTypeCombo.setText("<Choose>");
expressionText.setText("");
delegationConfigurationComposite.setDelegation(null);
handlerComposite.setVisible(false);
expressionComposite.setVisible(false);
}
private void updateControls() {
String expression = action.getExpression();
expressionText.setText(expression == null ? "" : expression);
delegationConfigurationComposite.setDelegation(action);
if (action.getClassName() != null) {
actionTypeCombo.setText("Handler");
} else if (expression != null) {
actionTypeCombo.setText("Expression");
} else {
actionTypeCombo.setText("<Choose>");
}
handlerComposite.setVisible("Handler".equals(actionTypeCombo.getText()));
expressionComposite.setVisible("Expression".equals(actionTypeCombo.getText()));
}
private void create() {
createTypeCombo();
createHandlerComposite();
createExpressionComposite();
initializeLayouts();
}
private void createTypeCombo() {
actionTypeCombo = widgetFactory.createCCombo(parent);
actionTypeCombo.setItems(new String[] {"<Choose>", "Expression", "Handler"});
actionTypeCombo.setEditable(false);
actionTypeCombo.setText("<Choose Type>");
actionTypeCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleActionTypeComboSelected();
}
});
}
private void createHandlerComposite() {
handlerComposite = widgetFactory.createFlatFormComposite(parent);
handlerComposite.setVisible(false);
delegationConfigurationComposite = DelegationConfigurationComposite.create(widgetFactory, handlerComposite, createChooseActionHandlerDialog());
}
private ChooseDelegationClassDialog createChooseActionHandlerDialog() {
return new ChooseDelegationClassDialog(
parent.getShell(),
"org.jbpm.graph.def.ActionHandler",
"Choose Action Handler",
"Choose an action handler from the list");
}
private void createExpressionComposite() {
expressionComposite = widgetFactory.createFlatFormComposite(parent);
expressionComposite.setVisible(false);
expressionLabel = widgetFactory.createLabel(expressionComposite, "Expression");
expressionText = widgetFactory.createText(expressionComposite, "", SWT.MULTI | SWT.V_SCROLL);
}
private void initializeLayouts() {
actionTypeCombo.setLayoutData(createActionTypeComboLayoutData());
handlerComposite.setLayoutData(createActionTypeCompositeLayoutData());
expressionComposite.setLayoutData(createActionTypeCompositeLayoutData());
expressionLabel.setLayoutData(createExpressionLabelLayoutData());
expressionText.setLayoutData(createExpressionTextLayoutData());
}
private FormData createExpressionLabelLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 2);
result.left = new FormAttachment(0, 0);
return result;
}
private FormData createExpressionTextLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 0);
result.left = new FormAttachment(expressionLabel, 0);
result.right = new FormAttachment(100, -5);
result.bottom = new FormAttachment(100, 0);
return result;
}
private FormData createActionTypeComboLayoutData() {
FormData result = new FormData();
result.left = new FormAttachment(0, 0);
result.top = new FormAttachment(0, 0);
return result;
}
private FormData createActionTypeCompositeLayoutData() {
FormData result = new FormData();
result.left = new FormAttachment(actionTypeCombo, 0);
result.top = new FormAttachment(0, 0);
result.bottom = new FormAttachment(100, 0);
result.right = new FormAttachment(100, 0);
result.height = 120;
return result;
}
private void updateExpressionText() {
action.setExpression(expressionText.getText());
}
private void updateControlVisibility() {
handlerComposite.setVisible("Handler".equals(actionTypeCombo.getText()));
expressionComposite.setVisible("Expression".equals(actionTypeCombo.getText()));
}
private void handleActionTypeComboSelected() {
String selection = actionTypeCombo.getText();
if (selection.equals(selectedActionType)) return;
selectedActionType = selection;
updateControlVisibility();
if (action != null) {
removeExpressionAndHandlerInfo();
updateExpressionAndHandlerInfo();
}
}
private void updateExpressionAndHandlerInfo() {
if ("Expression".equals(selectedActionType)) {
action.setExpression(expressionText.getText());
removeHandlerInfo();
} else if ("Handler".equals(selectedActionType)) {
delegationConfigurationComposite.setDelegation(action);
action.setClassName("");
action.setExpression(null);
} else {
removeHandlerInfo();
action.setExpression(null);
}
}
private void removeHandlerInfo() {
action.setClassName(null);
action.setConfigInfo(null);
action.setConfigType(null);
GenericElement[] configElements = action.getGenericElements();
for (int i = 0; i < configElements.length; i++) {
action.removeGenericElement(configElements[i]);
}
delegationConfigurationComposite.setDelegation(null);
}
private void removeExpressionAndHandlerInfo() {
action.setExpression(null);
action.setClassName(null);
action.setConfigInfo(null);
action.setConfigType(null);
GenericElement[] configElements = action.getGenericElements();
for (int i = 0; i < configElements.length; i++) {
action.removeGenericElement(configElements[i]);
}
}
public void focusLost(FocusEvent e) {
if (e.widget == expressionText) {
updateExpressionText();
}
}
public void focusGained(FocusEvent e) {
}
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
if (e.widget == actionTypeCombo) {
handleActionTypeComboSelected();
}
}
}