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.CancelTimer;
import org.jbpm.gd.jpdl.model.CreateTimer;
import org.jbpm.gd.jpdl.model.EsbElement;
import org.jbpm.gd.jpdl.model.EsbNotifier;
import org.jbpm.gd.jpdl.model.Event;
import org.jbpm.gd.jpdl.model.EventContainer;
import org.jbpm.gd.jpdl.model.MailAction;
import org.jbpm.gd.jpdl.model.Script;
public class EventContainerSection extends AbstractPropertySection implements PropertyChangeListener {
private TabbedPropertySheetPage tabbedPropertySheetPage;
private Tree eventTree;
private EventContainer eventContainer;
private EventContainerSectionActionBarContributor actionBarContributor;
private HashMap pagesMap = new HashMap();
private EventConfigurationComposite eventConfigurationComposite;
private ActionConfigurationComposite actionConfigurationComposite;
private ScriptConfigurationComposite scriptConfigurationComposite;
private TimerConfigurationComposite createTimerConfigurationComposite;
private CancelTimerConfigurationComposite cancelTimerConfigurationComposite;
private MailActionConfigurationComposite mailConfigurationComposite;
private EsbConfigurationComposite esbConfigurationComposite;
private Event selectedEvent;
private ActionElement selectedActionElement;
public void createControls(Composite parent,
TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createControls(parent, aTabbedPropertySheetPage);
actionBarContributor = new EventContainerSectionActionBarContributor(this);
tabbedPropertySheetPage = aTabbedPropertySheetPage;
final Composite composite = getWidgetFactory().createFlatFormComposite(parent);
createMasterArea(composite);
createDetailsArea(composite);
}
private void createMasterArea(Composite composite) {
eventTree = getWidgetFactory().createTree(
composite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
eventTree.setLayoutData(createEventTreeLayoutData());
eventTree.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleEventTreeSelection();
}
});
actionBarContributor.createPopupMenu(eventTree);
}
private void handleEventTreeSelection() {
TreeItem[] selectedItems = eventTree.getSelection();
if (selectedItems.length == 0) {
unSelectAll();
} else {
SemanticElement element = (SemanticElement)selectedItems[0].getData();
if (element instanceof Event) {
selectEvent((Event)element);
} else if (element instanceof ActionElement) {
selectActionElement((ActionElement)element);
}
}
updateDetailsArea();
}
private boolean somethingSelected() {
return getSelectedEvent() != null || getSelectedActionElement() != null;
}
private void updateDetailsArea() {
String id = null;
if (getSelectedActionElement() != null) {
id = getSelectedActionElement().getElementId();
} else if (getSelectedEvent() != null) {
id = getSelectedEvent().getElementId();
}
Iterator iter = pagesMap.keySet().iterator();
while (iter.hasNext()) {
String key = (String)iter.next();
((Composite)pagesMap.get(key)).setVisible(key.equals(id));
}
}
private void unSelectAll() {
if (somethingSelected()) {
selectActionElement(null);
}
}
private void selectEvent(Event event) {
if (event == getSelectedEvent() && selectedActionElement == null) return;
actionBarContributor.setAddActionElementEnabled(event != null);
actionBarContributor.setRemoveEnabled(event != null);
if (selectedActionElement != null) {
selectedActionElement.removePropertyChangeListener(this);
}
if (selectedEvent != null) {
selectedEvent.removePropertyChangeListener(this);
}
selectedActionElement = null;
selectedEvent = event;
eventConfigurationComposite.setEvent(event);
if (selectedEvent != null) {
selectedEvent.addPropertyChangeListener(this);
}
}
private void selectActionElement(ActionElement actionElement) {
if (actionElement == getSelectedActionElement()) return;
Event event = null;
if (actionElement != null) {
event = (Event)eventTree.getSelection()[0].getParentItem().getData();
}
selectEvent(event);
selectedActionElement = actionElement;
updateActionElementDetails();
if (selectedActionElement != null) {
selectedActionElement.addPropertyChangeListener(this);
}
}
private void updateActionElementDetails() {
if (selectedActionElement instanceof EsbNotifier) {
esbConfigurationComposite.setEsbElement((EsbElement)selectedActionElement);
} else if (selectedActionElement instanceof Action) {
actionConfigurationComposite.setAction((Action)selectedActionElement);
} else if (selectedActionElement instanceof Script) {
scriptConfigurationComposite.setScript((Script)selectedActionElement);
} else if (selectedActionElement instanceof CreateTimer) {
createTimerConfigurationComposite.setTimer((CreateTimer)selectedActionElement);
} else if (selectedActionElement instanceof CancelTimer) {
cancelTimerConfigurationComposite.setCancelTimer((CancelTimer)selectedActionElement);
} else if (selectedActionElement instanceof MailAction) {
mailConfigurationComposite.setMailAction((MailAction)selectedActionElement);
}
}
private FormData createEventTreeLayoutData() {
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) {
createEventPage(composite);
createActionPage(composite);
createScriptPage(composite);
createCreateTimerPage(composite);
createCancelTimerPage(composite);
createMailPage(composite);
createEsbPage(composite);
}
private void createActionPage(Composite composite) {
Composite actionPage = getWidgetFactory().createComposite(composite);
actionPage.setLayout(new FormLayout());
actionPage.setVisible(false);
actionPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.action", actionPage);
actionConfigurationComposite = ActionConfigurationComposite.create(getWidgetFactory(), actionPage);
}
private void createEventPage(Composite composite) {
Composite eventPage = getWidgetFactory().createFlatFormComposite(composite);
eventPage.setVisible(false);
eventPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.event", eventPage);
eventConfigurationComposite = EventConfigurationComposite.create(getWidgetFactory(), eventPage);
}
private void createScriptPage(Composite composite) {
Composite scriptPage = getWidgetFactory().createComposite(composite);
scriptPage.setLayout(new FormLayout());
scriptPage.setVisible(false);
scriptPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.script", scriptPage);
scriptConfigurationComposite = ScriptConfigurationComposite.create(getWidgetFactory(), scriptPage);
}
private void createCreateTimerPage(Composite composite) {
Composite createTimerPage = getWidgetFactory().createComposite(composite);
createTimerPage.setLayout(new FormLayout());
createTimerPage.setVisible(false);
createTimerPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.createTimer", createTimerPage);
createTimerConfigurationComposite = TimerConfigurationComposite.create(getWidgetFactory(), createTimerPage);
}
private void createCancelTimerPage(Composite composite) {
Composite cancelTimerPage = getWidgetFactory().createComposite(composite);
cancelTimerPage.setLayout(new FormLayout());
cancelTimerPage.setVisible(false);
cancelTimerPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.cancelTimer", cancelTimerPage);
cancelTimerConfigurationComposite = CancelTimerConfigurationComposite.create(getWidgetFactory(), cancelTimerPage);
}
private void createMailPage(Composite composite) {
Composite mailPage = getWidgetFactory().createComposite(composite);
mailPage.setLayout(new FormLayout());
mailPage.setVisible(false);
mailPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.mail", mailPage);
mailConfigurationComposite = MailActionConfigurationComposite.create(getWidgetFactory(), mailPage);
}
private void createEsbPage(Composite composite) {
Composite esbPage = getWidgetFactory().createComposite(composite);
esbPage.setLayout(new FormLayout());
esbPage.setVisible(false);
esbPage.setLayoutData(createDetailsAreaLayoutData());
pagesMap.put("org.jbpm.gd.jpdl.esbNotifier", esbPage);
esbConfigurationComposite = EsbConfigurationComposite.create(getWidgetFactory(), esbPage);
}
private FormData createDetailsAreaLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(eventTree, 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();
setEventContainer((EventContainer)notationElement.getSemanticElement());
} else if (input instanceof OutlineEditPart) {
setEventContainer((EventContainer)((OutlineEditPart)input).getModel());
}
}
private void clearControls() {
eventTree.removeAll();
Iterator iter = pagesMap.keySet().iterator();
while (iter.hasNext()) {
((Composite)pagesMap.get(iter.next())).setVisible(false);
}
}
private void setEventContainer(EventContainer newEventContainer) {
if (eventContainer == newEventContainer) return;
if (eventContainer != null) {
eventContainer.removePropertyChangeListener(this);
}
clearControls();
eventContainer = newEventContainer;
if (eventContainer != null) {
updateEventTree();
eventContainer.addPropertyChangeListener(this);
}
}
private void updateEventTree() {
Event[] events = eventContainer.getEvents();
for (int i = 0; i < events.length; i++) {
TreeItem eventItem = new TreeItem(eventTree, SWT.NULL);
eventItem.setText(getLabel(events[i]));
eventItem.setData(events[i]);
eventItem.setImage(SharedImages.INSTANCE.getImage(events[i].getIconDescriptor()));
eventItem.setExpanded(true);
ActionElement[] actionElements = events[i].getActionElements();
for (int j = 0; j < actionElements.length; j++) {
TreeItem actionElementItem = new TreeItem(eventItem, 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 (eventTree.isDisposed()) return;
if ("eventAdd".equals(evt.getPropertyName())) {
TreeItem treeItem = new TreeItem(eventTree, SWT.NULL);
Event event = (Event)evt.getNewValue();
treeItem.setText(getLabel(event));
treeItem.setData(event);
treeItem.setImage(SharedImages.INSTANCE.getImage(event.getIconDescriptor()));
eventTree.setSelection(treeItem);
eventTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event());
} else if ("actionElementAdd".equals(evt.getPropertyName())) {
TreeItem selection = eventTree.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()));
eventTree.setSelection(treeItem);
eventTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event());
} else if ("eventRemove".equals(evt.getPropertyName()) ||
"actionElementRemove".equals(evt.getPropertyName())) {
if (eventTree.getSelectionCount() != 1) return;
eventTree.getSelection()[0].dispose();
eventTree.notifyListeners(SWT.Selection, new org.eclipse.swt.widgets.Event());
} else if ("type".equals(evt.getPropertyName())) {
if (eventTree.getSelectionCount() != 1) return;
String newValue = (String)evt.getNewValue();
if (newValue == null || "".equals(newValue)) {
newValue = "event";
}
TreeItem treeItem = eventTree.getSelection()[0];
if (treeItem.getData() == evt.getSource()) {
treeItem.setText(newValue);
}
} else if ("name".equals(evt.getPropertyName()) || "refName".equals(evt.getPropertyName())) {
if (eventTree.getSelectionCount() != 1) return;
String newValue = (String)evt.getNewValue();
if (newValue == null || "".equals(newValue)) {
newValue = "action";
}
TreeItem treeItem = eventTree.getSelection()[0];
if (treeItem.getData() == evt.getSource()) {
treeItem.setText(newValue);
}
}
}
private String getLabel(Event event) {
String label = event.getType();
return label == null || "".equals(label) ? "event" : label;
}
public boolean shouldUseExtraSpace() {
return true;
}
public EventContainer getEventContainer() {
return eventContainer;
}
public Event getSelectedEvent() {
return selectedEvent;
}
public ActionElement getSelectedActionElement() {
return selectedActionElement;
}
public void aboutToBeShown() {
actionBarContributor.activateContributions();
}
public void aboutToBeHidden() {
actionBarContributor.deactivateContributions();
}
}