package org.jbpm.gd.jpdl.properties; import java.util.HashMap; import java.util.Iterator; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.swt.custom.CCombo; 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.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.jbpm.gd.jpdl.Logger; import org.jbpm.gd.jpdl.Plugin; import org.jbpm.gd.jpdl.model.Assignable; import org.jbpm.gd.jpdl.util.AssignmentTypeHelper; import org.jbpm.gd.jpdl.util.AssignmentTypeMatcher; public class AssignmentConfigurationComposite implements SelectionListener { public static AssignmentConfigurationComposite create(TabbedPropertySheetWidgetFactory widgetFactory, Composite parent) { AssignmentConfigurationComposite result = new AssignmentConfigurationComposite(); result.widgetFactory = widgetFactory; result.parent = parent; result.create(); return result; } private TabbedPropertySheetWidgetFactory widgetFactory; private Composite parent; private Assignable assignable; private Composite activePage; private CCombo assignmentTypeCombo; private HashMap pagesMap = new HashMap(); private HashMap configurationMap = new HashMap(); private HashMap matcherMap = new HashMap(); private HashMap labelMap; public void setAssignable(Assignable assignable) { if (this.assignable == assignable) return; unhookListeners(); this.assignable = assignable; clearControls(); if (assignable != null) { updateControls(); hookListeners(); } } private void hookListeners() { assignmentTypeCombo.addSelectionListener(this); } private void unhookListeners() { assignmentTypeCombo.removeSelectionListener(this); } private void clearControls() { labelMap = null; assignmentTypeCombo.removeAll(); if (activePage != null) { activePage.setVisible(false); activePage = null; } Iterator iter = pagesMap.keySet().iterator(); while (iter.hasNext()) { Composite page = (Composite)pagesMap.get(iter.next()); ((AssignmentTypeComposite)page.getData()).setAssignable(null); } } private void setPagesAssignable(Assignable assignable) { Iterator iter = pagesMap.keySet().iterator(); while (iter.hasNext()) { Composite page = (Composite)pagesMap.get(iter.next()); ((AssignmentTypeComposite)page.getData()).setAssignable(assignable); } } private void updateControls() { updateAssignmentTypeCombo(); setPagesAssignable(assignable); } private void updateAssignmentTypeCombo() { labelMap = new HashMap(); assignmentTypeCombo.add("<Choose>"); assignmentTypeCombo.setText("<Choose>"); IConfigurationElement[] configElements = AssignmentTypeHelper.getConfigurationElements(assignable); for (int i = 0; i < configElements.length; i++) { if (isAssignmentTypeDisabled(configElements[i])) continue; String id = configElements[i].getAttribute("id"); String label = configElements[i].getAttribute("label"); labelMap.put(label, configElements[i].getAttribute("id")); assignmentTypeCombo.add(label); Composite page = (Composite)pagesMap.get(id); ((AssignmentTypeComposite)page.getData()).setAssignable(assignable); AssignmentTypeMatcher matcher = (AssignmentTypeMatcher)matcherMap.get(id); if (matcher != null && matcher.matches(assignable)) { assignmentTypeCombo.setText(label); page.setVisible(true); activePage = page; } } } private void fillAssignmentTypes() { IConfigurationElement[] configElements = AssignmentTypeHelper.getConfigurationElements(); for (int i = 0; i < configElements.length; i++) { if (isAssignmentTypeDisabled(configElements[i])) continue; String id = configElements[i].getAttribute("id"); Composite page = widgetFactory.createComposite(parent); page.setVisible(false); page.setLayoutData(createPageLayoutData()); pagesMap.put(id, page); configurationMap.put(id, configElements[i]); page.setLayout(new FormLayout()); try { AssignmentTypeComposite composite = (AssignmentTypeComposite)configElements[i].createExecutableExtension("form"); page.setData(composite); matcherMap.put(id, configElements[i].createExecutableExtension("matcher")); composite.setWidgetFactory(widgetFactory); composite.setParent(page); composite.create(); } catch (CoreException e) { Logger.logError("Unable to create configuration form for " + configElements[i].getAttribute("form"), e); } } } private boolean isAssignmentTypeDisabled(IConfigurationElement element) { String key = "assignmentType(" + element.getAttribute("id") + ").disabled"; return Plugin.getDefault().getPreferenceStore().getBoolean(key); } private void create() { assignmentTypeCombo = widgetFactory.createCCombo(parent); fillAssignmentTypes(); assignmentTypeCombo.addSelectionListener(this); assignmentTypeCombo.setLayoutData(createAssignmentTypeCombo()); } private FormData createAssignmentTypeCombo() { FormData result = new FormData(); result.top = new FormAttachment(0, 0); result.left = new FormAttachment(0, 0); result.width = 120; return result; } private FormData createPageLayoutData() { FormData result = new FormData(); result.top = new FormAttachment(0, 0); result.left = new FormAttachment(assignmentTypeCombo, 0); result.right = new FormAttachment(100, 0); result.bottom = new FormAttachment(100, 0); return result; } public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { Composite newPage = null; Object id = labelMap.get(assignmentTypeCombo.getText()); if (id != null) { newPage = (Composite)pagesMap.get(id); } if (newPage != activePage) { if (activePage != null) { activePage.setVisible(false); ((AssignmentTypeComposite)activePage.getData()).setActive(false); } activePage = newPage; if (activePage != null) { activePage.setVisible(true); ((AssignmentTypeComposite)activePage.getData()).setActive(true); } } if (id == null) { assignable.setAssignment(null); } } }