package org.jbpm.gd.jpdl.properties; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashMap; import java.util.Iterator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import org.jbpm.gd.common.model.SemanticElement; import org.jbpm.gd.common.notation.AbstractNotationElement; import org.jbpm.gd.common.part.NotationElementGraphicalEditPart; import org.jbpm.gd.common.part.OutlineEditPart; import org.jbpm.gd.common.properties.AbstractPropertySection; import org.jbpm.gd.common.util.SharedImages; import org.jbpm.gd.jpdl.model.Action; import org.jbpm.gd.jpdl.model.ActionElement; import org.jbpm.gd.jpdl.model.ExceptionHandler; import org.jbpm.gd.jpdl.model.ExceptionHandlerContainer; import org.jbpm.gd.jpdl.model.Script; public class ExceptionHandlerContainerSection extends AbstractPropertySection implements PropertyChangeListener { private TabbedPropertySheetPage tabbedPropertySheetPage; private Tree exceptionHandlerTree; private ExceptionHandlerContainer exceptionHandlerContainer; private ExceptionHandlerContainerSectionActionBarContributor actionBarContributor; private ExceptionHandlerConfigurationComposite exceptionHandlerConfigurationComposite; private ActionConfigurationComposite actionConfigurationComposite; private ScriptConfigurationComposite scriptConfigurationComposite; private ExceptionHandler selectedExceptionHandler; private ActionElement selectedActionElement; private HashMap detailsPages = new HashMap(); public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { super.createControls(parent, aTabbedPropertySheetPage); actionBarContributor = new ExceptionHandlerContainerSectionActionBarContributor(this); tabbedPropertySheetPage = aTabbedPropertySheetPage; final Composite composite = getWidgetFactory().createFlatFormComposite(parent); createMasterArea(composite); createDetailsArea(composite); } private void createMasterArea(Composite composite) { exceptionHandlerTree = getWidgetFactory().createTree( composite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); exceptionHandlerTree.setLayoutData(createExceptionHandlerTreeLayoutData()); exceptionHandlerTree.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleEventTreeSelection(); } }); actionBarContributor.createPopupMenu(exceptionHandlerTree); } private void handleEventTreeSelection() { TreeItem[] selectedItems = exceptionHandlerTree.getSelection(); if (selectedItems.length == 0) { unSelectAll(); } else { SemanticElement element = (SemanticElement)selectedItems[0].getData(); if (element instanceof ExceptionHandler) { selectExceptionHandler((ExceptionHandler)element); } else if (element instanceof ActionElement) { selectActionElement((ActionElement)element); } } updateActionBarContributor(); updateDetailsArea(); } private void updateActionBarContributor() { boolean enabled = getSelectedExceptionHandler() != null; actionBarContributor.setAddActionElementEnabled(enabled); actionBarContributor.setRemoveEnabled(enabled); } private boolean somethingSelected() { return getSelectedExceptionHandler() != null || getSelectedActionElement() != null; } private void updateDetailsArea() { String key = getSelectedKey(); Iterator iter = detailsPages.keySet().iterator(); while (iter.hasNext()) { String candidate = (String)iter.next(); ((Composite)detailsPages.get(candidate)).setVisible(candidate.equals(key)); } } private String getSelectedKey() { String result = null; if (getSelectedActionElement() != null) { result = getSelectedActionElement().getElementId(); } else if (getSelectedExceptionHandler() != null) { result = getSelectedExceptionHandler().getElementId(); } return result; } private void unSelectAll() { if (somethingSelected()) { selectActionElement(null); selectExceptionHandler(null); } } private void selectExceptionHandler(ExceptionHandler exceptionHandler) { if (exceptionHandler == getSelectedExceptionHandler() && selectedActionElement == null) return; actionBarContributor.setAddActionElementEnabled(exceptionHandler != null); actionBarContributor.setRemoveEnabled(exceptionHandler != null); if (selectedActionElement != null) { selectedActionElement.removePropertyChangeListener(this); } if (selectedExceptionHandler != null) { selectedExceptionHandler.removePropertyChangeListener(this); } selectedActionElement = null; selectedExceptionHandler = exceptionHandler; exceptionHandlerConfigurationComposite.setExceptionHandler(exceptionHandler); if (selectedExceptionHandler != null) { selectedExceptionHandler.addPropertyChangeListener(this); } } private void selectActionElement(ActionElement actionElement) { if (actionElement == getSelectedActionElement()) return; ExceptionHandler exceptionHandler = null; if (actionElement != null) { exceptionHandler = (ExceptionHandler)exceptionHandlerTree.getSelection()[0].getParentItem().getData(); } selectExceptionHandler(exceptionHandler); selectedActionElement = actionElement; updateActionElementDetails(); if (selectedActionElement != null) { selectedActionElement.addPropertyChangeListener(this); } } private void updateActionElementDetails() { if (selectedActionElement instanceof Action) { actionConfigurationComposite.setAction((Action)selectedActionElement); } else if (selectedActionElement instanceof Script) { scriptConfigurationComposite.setScript((Script)selectedActionElement); } } private FormData createExceptionHandlerTreeLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(0, 0); data.right = new FormAttachment(20, 0); data.top = new FormAttachment(0, 0); data.bottom = new FormAttachment(100, 0); return data; } private void createDetailsArea(Composite composite) { createExceptionHandlerPage(composite); createActionPage(composite); createScriptPage(composite); } private void createActionPage(Composite composite) { Composite actionPage = getWidgetFactory().createComposite(composite); actionPage.setLayout(new FormLayout()); actionPage.setLayoutData(createDetailsPageLayoutData()); detailsPages.put("org.jbpm.gd.jpdl.action", actionPage); actionConfigurationComposite = ActionConfigurationComposite.create(getWidgetFactory(), actionPage); } private void createExceptionHandlerPage(Composite composite) { Composite exceptionHandlerPage = getWidgetFactory().createFlatFormComposite(composite); exceptionHandlerPage.setLayoutData(createDetailsPageLayoutData()); detailsPages.put("org.jbpm.gd.jpdl.exceptionHandler", exceptionHandlerPage); exceptionHandlerConfigurationComposite = ExceptionHandlerConfigurationComposite.create(getWidgetFactory(), exceptionHandlerPage); } private void createScriptPage(Composite composite) { Composite scriptPage = getWidgetFactory().createComposite(composite); scriptPage.setLayout(new FormLayout()); scriptPage.setLayoutData(createDetailsPageLayoutData()); detailsPages.put("org.jbpm.gd.jpdl.script", scriptPage); scriptConfigurationComposite = ScriptConfigurationComposite.create(getWidgetFactory(), scriptPage); } private FormData createDetailsPageLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(exceptionHandlerTree, 0); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(100, 0); data.bottom = new FormAttachment(100, 0); return data; } public void setInput(IWorkbenchPart part, ISelection selection) { super.setInput(part, selection); if (!(selection instanceof IStructuredSelection)) return; Object input = ((IStructuredSelection)selection).getFirstElement(); if (input instanceof NotationElementGraphicalEditPart) { AbstractNotationElement notationElement = ((NotationElementGraphicalEditPart)input).getNotationElement(); setExceptionHandlerContainer((ExceptionHandlerContainer)notationElement.getSemanticElement()); } else if (input instanceof OutlineEditPart) { setExceptionHandlerContainer((ExceptionHandlerContainer)((OutlineEditPart)input).getModel()); } } private void clearControls() { exceptionHandlerTree.removeAll(); Iterator iter = detailsPages.values().iterator(); while (iter.hasNext()) { ((Composite)iter.next()).setVisible(false); } } private void setExceptionHandlerContainer(ExceptionHandlerContainer newExceptionHandlerContainer) { if (exceptionHandlerContainer == newExceptionHandlerContainer) return; if (exceptionHandlerContainer != null) { exceptionHandlerContainer.removePropertyChangeListener(this); } clearControls(); exceptionHandlerContainer = newExceptionHandlerContainer; if (exceptionHandlerContainer != null) { updateExceptionHandlerTree(); exceptionHandlerContainer.addPropertyChangeListener(this); } } private void updateExceptionHandlerTree() { ExceptionHandler[] exceptionHandlers = exceptionHandlerContainer.getExceptionHandlers(); for (int i = 0; i < exceptionHandlers.length; i++) { TreeItem exceptionHandlerItem = new TreeItem(exceptionHandlerTree, SWT.NULL); exceptionHandlerItem.setText(getLabel(exceptionHandlers[i])); exceptionHandlerItem.setData(exceptionHandlers[i]); exceptionHandlerItem.setImage(SharedImages.INSTANCE.getImage(exceptionHandlers[i].getIconDescriptor())); exceptionHandlerItem.setExpanded(true); ActionElement[] actionElements = exceptionHandlers[i].getActionElements(); for (int j = 0; j < actionElements.length; j++) { TreeItem actionElementItem = new TreeItem(exceptionHandlerItem, SWT.NULL); actionElementItem.setText(getLabel(actionElements[j])); actionElementItem.setData(actionElements[j]); actionElementItem.setImage(SharedImages.INSTANCE.getImage(actionElements[j].getIconDescriptor())); } } } private String getLabel(ActionElement actionElement) { String result = actionElement.getName(); if (result != null && !"".equals(result)) return result; if (actionElement instanceof Action) { String refName = ((Action)actionElement).getRefName(); if (refName != null && !"".equals(refName)) { return refName; } } result = actionElement.getLabel(); return result != null ? result.toLowerCase() : actionElement.getElementId(); } public TabbedPropertySheetPage getTabbedPropertySheetPage() { return tabbedPropertySheetPage; } public void propertyChange(PropertyChangeEvent evt) { if (exceptionHandlerTree.isDisposed()) return; if ("exceptionHandlerAdd".equals(evt.getPropertyName())) { TreeItem treeItem = new TreeItem(exceptionHandlerTree, SWT.NULL); ExceptionHandler exceptionHandler = (ExceptionHandler)evt.getNewValue(); treeItem.setText(getLabel(exceptionHandler)); treeItem.setData(exceptionHandler); treeItem.setImage(SharedImages.INSTANCE.getImage(exceptionHandler.getIconDescriptor())); exceptionHandlerTree.setSelection(treeItem); exceptionHandlerTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event()); } else if ("actionElementAdd".equals(evt.getPropertyName())) { TreeItem selection = exceptionHandlerTree.getSelection()[0]; if (selection.getData() instanceof ActionElement) { selection = selection.getParentItem(); } TreeItem treeItem = new TreeItem(selection, SWT.NULL); ActionElement actionElement = (ActionElement)evt.getNewValue(); treeItem.setText(getLabel(actionElement)); treeItem.setData(actionElement); treeItem.setImage(SharedImages.INSTANCE.getImage(actionElement.getIconDescriptor())); exceptionHandlerTree.setSelection(treeItem); exceptionHandlerTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event()); } else if ("exceptionHandlerRemove".equals(evt.getPropertyName()) || "actionElementRemove".equals(evt.getPropertyName())) { exceptionHandlerTree.getSelection()[0].dispose(); exceptionHandlerTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event()); } else if ("exceptionClass".equals(evt.getPropertyName())) { String newValue = (String)evt.getNewValue(); if (exceptionHandlerTree.getSelectionCount() != 1) return; if (newValue == null || "".equals(newValue)) { newValue = "exception-handler"; } TreeItem treeItem = exceptionHandlerTree.getSelection()[0]; if (treeItem.getData() == evt.getSource()) { treeItem.setText(newValue); } } else if ("name".equals(evt.getPropertyName()) || "refName".equals(evt.getPropertyName())) { String newValue = (String)evt.getNewValue(); if (exceptionHandlerTree.getSelectionCount() != 1) return; if (newValue == null || "".equals(newValue)) { newValue = "action"; } TreeItem treeItem = exceptionHandlerTree.getSelection()[0]; if (treeItem.getData() == evt.getSource()) { treeItem.setText(newValue); } } } private String getLabel(ExceptionHandler exceptionHandler) { String label = exceptionHandler.getExceptionClass(); return label == null || "".equals(label) ? "exception" : label; } public boolean shouldUseExtraSpace() { return true; } public ExceptionHandlerContainer getExceptionHandlerContainer() { return exceptionHandlerContainer; } public ExceptionHandler getSelectedExceptionHandler() { return selectedExceptionHandler; } public ActionElement getSelectedActionElement() { return selectedActionElement; } public void aboutToBeShown() { actionBarContributor.activateContributions(); } public void aboutToBeHidden() { actionBarContributor.deactivateContributions(); } }