package org.jbpm.gd.jpdl.properties; import java.util.HashMap; import java.util.Iterator; 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.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.jbpm.gd.jpdl.dialog.ChooseDelegationClassDialog; import org.jbpm.gd.jpdl.model.Controller; import org.jbpm.gd.jpdl.model.Task; public class ControllerConfigurationComposite implements SelectionListener, FocusListener { public static ControllerConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { ControllerConfigurationComposite result = new ControllerConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Task task; private CCombo controllerTypeCombo; private HashMap pagesMap = new HashMap(); private DelegationConfigurationComposite delegationConfigurationComposite; private VariableContainerConfigurationComposite variableContainerConfigurationComposite; private ControllerConfigurationComposite() {} public void setTask(Task task) { if (this.task == task) return; unhookListeners(); this.task = task; clearControls(); if (task != null) { updateControls(); hookListeners(); } } private void hookListeners() { controllerTypeCombo.setEnabled(true); controllerTypeCombo.addSelectionListener(this); } private void unhookListeners() { controllerTypeCombo.setEnabled(false); controllerTypeCombo.removeSelectionListener(this); } private void clearControls() { controllerTypeCombo.setText(""); Iterator iter = pagesMap.keySet().iterator(); while (iter.hasNext()) { ((Composite)pagesMap.get(iter.next())).setVisible(false); } variableContainerConfigurationComposite.setVariableContainer(null); delegationConfigurationComposite.setDelegation(null); } private void updateControls() { Controller controller = task.getController(); if (controller != null) { String className = controller.getClassName(); if (className == null) { controllerTypeCombo.setText("Default"); variableContainerConfigurationComposite.setVariableContainer(controller); } else { controllerTypeCombo.setText("Custom"); delegationConfigurationComposite.setDelegation(controller); } } else { controllerTypeCombo.setText("<Choose>"); } Iterator iter = pagesMap.keySet().iterator(); while (iter.hasNext()) { String str = (String)iter.next(); ((Composite)pagesMap.get(str)).setVisible(str.equals(controllerTypeCombo.getText())); } } private void create() { controllerTypeCombo = widgetFactory.createCCombo(parent); controllerTypeCombo.setItems(new String[] {"<Choose>", "Default", "Custom"}); controllerTypeCombo.setLayoutData(createControllerTypeComboLayoutData()); createDefaultPage(); createCustomPage(); } private void createDefaultPage() { Composite defaultPage = widgetFactory.createFlatFormComposite(parent); pagesMap.put("Default", defaultPage); defaultPage.setLayoutData(createGroupLayoutData()); variableContainerConfigurationComposite = VariableContainerConfigurationComposite.create(widgetFactory, defaultPage); } private void createCustomPage() { Composite customPage = widgetFactory.createFlatFormComposite(parent); pagesMap.put("Custom", customPage); customPage.setLayoutData(createGroupLayoutData()); delegationConfigurationComposite = DelegationConfigurationComposite.create(widgetFactory, customPage, createChooseControllerClassDialog()); } private ChooseDelegationClassDialog createChooseControllerClassDialog() { return new ChooseDelegationClassDialog( parent.getShell(), "org.jbpm.taskmgmt.def.TaskControllerHandler", "Choose Controller Handler", "Choose a task controller handler from the list"); } private FormData createGroupLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, 0); result.left = new FormAttachment(controllerTypeCombo, 0); result.right = new FormAttachment(100, 0); result.bottom = new FormAttachment(100, 0); return result; } private FormData createControllerTypeComboLayoutData() { FormData result = new FormData(); result.left = new FormAttachment(0, 0); result.top = new FormAttachment(0, 0); return result; } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { if (e.widget == controllerTypeCombo) { handleControllerTypeComboSelected(); } } public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) { } private void handleControllerTypeComboSelected() { String type = controllerTypeCombo.getText(); if ("".equals(type)) { task.setController(null); } else if ("Default".equals(type)){ Controller controller = (Controller)variableContainerConfigurationComposite.getVariableContainer(); if (controller == null) { controller = createController(); variableContainerConfigurationComposite.setVariableContainer(controller); } task.setController(controller); } else if ("Custom".equals(type)) { Controller controller = (Controller)delegationConfigurationComposite.getDelegation(); if (controller == null) { controller = createController(); controller.setClassName(""); delegationConfigurationComposite.setDelegation(controller); } task.setController(controller); } Iterator iter = pagesMap.keySet().iterator(); while (iter.hasNext()) { String str = (String)iter.next(); ((Composite)pagesMap.get(str)).setVisible(type.equals(str)); } } private Controller createController() { return (Controller)task.getFactory().createById("org.jbpm.gd.jpdl.controller"); } }