package org.jbpm.gd.jpdl.properties; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; 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.Event; 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.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.Task; import org.jbpm.gd.jpdl.model.TaskContainer; public class TaskContainerSection extends AbstractPropertySection implements PropertyChangeListener { private Composite detailsArea; private Tree taskTree; private TaskConfigurationComposite taskConfigurationComposite; private TaskContainer taskContainer; private Task task; private TabbedPropertySheetPage tabbedPropertySheetPage; private TaskContainerSectionActionBarContributor actionBarContributor; public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { super.createControls(parent, aTabbedPropertySheetPage); actionBarContributor = new TaskContainerSectionActionBarContributor(this); tabbedPropertySheetPage = aTabbedPropertySheetPage; final Composite composite = getWidgetFactory().createFlatFormComposite(parent); createMasterArea(composite); createDetailsArea(composite); } public TabbedPropertySheetPage getTabbedPropertySheetPage() { return tabbedPropertySheetPage; } private void createMasterArea(Composite composite) { taskTree = getWidgetFactory().createTree( composite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); taskTree.setLayoutData(createTaskTreeLayoutData()); taskTree.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleTaskTreeSelected(); } }); actionBarContributor.createPopupMenu(taskTree); } private void handleTaskTreeSelected() { if (taskContainer == null) return; if (taskTree.getSelectionCount() == 0) { setSelectedTask(null); } else { setSelectedTask((Task)taskTree.getSelection()[0].getData()); } } private FormData createTaskTreeLayoutData() { 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) { detailsArea = getWidgetFactory().createComposite(composite); detailsArea.setLayout(new FormLayout()); detailsArea.setLayoutData(createDetailsAreaLayoutData()); taskConfigurationComposite = TaskConfigurationComposite.create(getWidgetFactory(), detailsArea); } private FormData createDetailsAreaLayoutData() { FormData data = new FormData(); data.left = new FormAttachment(taskTree, 0); data.right = new FormAttachment(100, 0); data.top = new FormAttachment(0, 0); data.bottom = new FormAttachment(100, 0); return data; } public boolean shouldUseExtraSpace() { return true; } public void aboutToBeShown() { actionBarContributor.activateContributions(); } public void aboutToBeHidden() { actionBarContributor.deactivateContributions(); } 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(); setTaskContainer((TaskContainer)notationElement.getSemanticElement()); } else if (input instanceof OutlineEditPart) { setTaskContainer((TaskContainer)((OutlineEditPart)input).getModel()); } } public void clearControls() { setSelectedTask(null); taskTree.removeAll(); } public void setTaskContainer(TaskContainer newTaskContainer) { if (taskContainer == newTaskContainer) return; if (taskContainer != null) { taskContainer.removePropertyChangeListener(this); } clearControls(); taskContainer = newTaskContainer; if (taskContainer != null) { updateTaskTree(); taskContainer.addPropertyChangeListener(this); } } private void updateTaskTree() { Task[] tasks = taskContainer.getTasks(); for (int i = 0; i < tasks.length; i++) { TreeItem treeItem = new TreeItem(taskTree, SWT.NULL); treeItem.setText(getTaskLabel(tasks[i])); treeItem.setData(tasks[i]); treeItem.setImage(SharedImages.INSTANCE.getImage(tasks[i].getIconDescriptor())); } } private String getTaskLabel(Task task) { String name = task.getName(); return name == null || "".equals(name)? "task" : name; } private void setSelectedTask(Task newTask) { if (task != null) { task.removePropertyChangeListener(this); } task = newTask; taskConfigurationComposite.setTask(task); if (task != null) { task.addPropertyChangeListener(this); } actionBarContributor.setRemoveEnabled(task != null); detailsArea.setVisible(task != null); } public TaskContainer getTaskContainer() { return taskContainer; } public Task getSelectedTask() { return task; } public void propertyChange(PropertyChangeEvent evt) { if (taskTree.isDisposed()) return; if ("taskAdd".equals(evt.getPropertyName())) { TreeItem treeItem = new TreeItem(taskTree, SWT.NULL); Task task = (Task)evt.getNewValue(); treeItem.setText(getTaskLabel(task)); treeItem.setData(task); treeItem.setImage(SharedImages.INSTANCE.getImage(task.getIconDescriptor())); taskTree.setSelection(treeItem); taskTree.notifyListeners(SWT.Selection, new Event()); } else if ("taskRemove".equals(evt.getPropertyName())) { TreeItem treeItem = getItemToRemove(evt.getOldValue()); if (treeItem != null) { treeItem.dispose(); } taskTree.notifyListeners(SWT.Selection, new Event()); } else if ("name".equals(evt.getPropertyName())) { if (taskTree.getSelectionCount() != 1) return; TreeItem treeItem = taskTree.getSelection()[0]; if (treeItem.getData() == evt.getSource()) { treeItem.setText(getTaskLabel(task)); } } } private TreeItem getItemToRemove(Object object) { for (int i = 0; i < taskTree.getItemCount(); i++) { if (taskTree.getItem(i).getData() == object) return taskTree.getItem(i); } return null; } }