package org.jbpm.gd.jpdl.properties; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; 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.jpdl.dialog.ChooseDelegationClassDialog; import org.jbpm.gd.jpdl.model.Decision; import org.jbpm.gd.jpdl.model.Handler; public class DecisionConfigurationComposite implements SelectionListener, FocusListener { public static DecisionConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { DecisionConfigurationComposite result = new DecisionConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Decision decision; private Label decisionConfigurationTypeLabel; private CCombo decisionConfigurationTypeCombo; private Composite delegationComposite; private DelegationConfigurationComposite delegationConfigurationComposite; private Composite expressionComposite; private Label expressionLabel; private Text expressionText; private String selectedDecisionType; public void setDecision(Decision decision) { if (this.decision == decision) return; unhookListeners(); clearControls(); this.decision = decision; if (decision != null) { updateControls(); hookListeners(); } } private void hookListeners() { decisionConfigurationTypeCombo.addSelectionListener(this); expressionText.addFocusListener(this); } private void unhookListeners() { decisionConfigurationTypeCombo.removeSelectionListener(this); expressionText.removeFocusListener(this); } private void clearControls() { decisionConfigurationTypeCombo.setText(""); delegationConfigurationComposite.setDelegation(null); expressionText.setText(""); } private void updateControls() { if (decision.getHandler() != null) { decisionConfigurationTypeCombo.setText("delegation"); delegationConfigurationComposite.setDelegation(decision.getHandler()); delegationComposite.setVisible(true); } else if (decision.getExpression() != null) { decisionConfigurationTypeCombo.setText("expression"); expressionText.setText(decision.getExpression()); expressionComposite.setVisible(true); } else { decisionConfigurationTypeCombo.setText(""); expressionComposite.setVisible(false); delegationComposite.setVisible(false); } } private void create() { createMain(); createExpression(); createDelegation(); initializeLayouts(); } private void createMain() { decisionConfigurationTypeLabel = widgetFactory.createLabel(parent, "Choose Type"); decisionConfigurationTypeCombo = widgetFactory.createCCombo(parent); decisionConfigurationTypeCombo.setItems(new String[] {"", "expression", "delegation"}); decisionConfigurationTypeCombo.setEditable(false); } private void createDelegation() { delegationComposite = widgetFactory.createFlatFormComposite(parent); delegationComposite.setVisible(false); delegationConfigurationComposite = DelegationConfigurationComposite.create(widgetFactory, delegationComposite, createChooseDecisionHandlerDialog()); } private ChooseDelegationClassDialog createChooseDecisionHandlerDialog() { return new ChooseDelegationClassDialog( parent.getShell(), "org.jbpm.graph.node.DecisionHandler", "Choose Decision Handler", "Choose a decision handler from the list"); } private void createExpression() { expressionComposite = widgetFactory.createFlatFormComposite(parent); expressionComposite.setVisible(false); expressionLabel = widgetFactory.createLabel(expressionComposite, "Expression"); expressionText = widgetFactory.createText(expressionComposite, ""); } private void initializeLayouts() { decisionConfigurationTypeLabel.setLayoutData(createConfigurationTypeLabelLayoutData()); decisionConfigurationTypeCombo.setLayoutData(createConfigurationTypeComboLayoutData()); delegationComposite.setLayoutData(createDelegationCompositeLayoutData()); expressionComposite.setLayoutData(createExpressionCompositeLayoutData()); expressionLabel.setLayoutData(createExpressionLabelLayoutData()); expressionText.setLayoutData(createExpressionTextLayoutData()); } private FormData createExpressionLabelLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, 0); 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, 0); return result; } private FormData createConfigurationTypeLabelLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, 2); result.left = new FormAttachment(0, 0); return result; } private FormData createConfigurationTypeComboLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(decisionConfigurationTypeLabel, 0); result.left = new FormAttachment(0, 0); return result; } private FormData createDelegationCompositeLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, -2); result.left = new FormAttachment(decisionConfigurationTypeCombo, -2); result.right = new FormAttachment(100, 0); return result; } private FormData createExpressionCompositeLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, -2); result.left = new FormAttachment(decisionConfigurationTypeCombo, -2); result.right = new FormAttachment(100, 0); return result; } private void updateExpressionText() { decision.setExpression(expressionText.getText()); } private void updateControlVisibility() { delegationComposite.setVisible("delegation".equals(decisionConfigurationTypeCombo.getText())); expressionComposite.setVisible("expression".equals(decisionConfigurationTypeCombo.getText())); } private void handleConfigurationTypeComboSelected() { String selection = decisionConfigurationTypeCombo.getText(); if (selection.equals(selectedDecisionType)) return; selectedDecisionType = selection; updateControlVisibility(); if (decision != null) { removeExpressionAndHandlerInfo(); updateExpressionAndHandlerInfo(); } } private void updateExpressionAndHandlerInfo() { if ("expression".equals(selectedDecisionType)) { decision.setExpression(expressionText.getText()); } else if ("delegation".equals(selectedDecisionType)) { Handler handler = (Handler)decision.getFactory().createById("org.jbpm.gd.jpdl.handler"); decision.setHandler(handler); delegationConfigurationComposite.setDelegation(handler); } } private void removeExpressionAndHandlerInfo() { decision.setExpression(null); decision.setHandler(null); } 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 == decisionConfigurationTypeCombo) { handleConfigurationTypeComboSelected(); } } }