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.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
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.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
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.ProcessDefinition;
import org.jbpm.gd.jpdl.model.Swimlane;
public class SwimlaneContainerSection
extends AbstractPropertySection implements PropertyChangeListener, SelectionListener, FocusListener {
private Composite detailsArea;
private Table swimlaneTable;
private ProcessDefinition processDefinition;
private Swimlane selectedSwimlane;
private SwimlaneConfigurationComposite swimlaneConfigurationComposite;
private TabbedPropertySheetPage tabbedPropertySheetPage;
private SwimlaneContainerSectionActionBarContributor actionBarContributor;
public void createControls(Composite parent,
TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createControls(parent, aTabbedPropertySheetPage);
actionBarContributor = new SwimlaneContainerSectionActionBarContributor(this);
tabbedPropertySheetPage = aTabbedPropertySheetPage;
final Composite composite = getWidgetFactory().createFlatFormComposite(parent);
createMasterArea(composite);
createDetailsArea(composite);
}
public TabbedPropertySheetPage getTabbedPropertySheetPage() {
return tabbedPropertySheetPage;
}
private void createMasterArea(Composite composite) {
swimlaneTable = getWidgetFactory().createTable(
composite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
swimlaneTable.setLayoutData(createSwimlaneListLayoutData());
swimlaneTable.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleSwimlaneListSelection();
}
});
actionBarContributor.createPopupMenu(swimlaneTable);
}
private void handleSwimlaneListSelection() {
if (processDefinition == null) return;
int i = swimlaneTable.getSelectionIndex();
if (i == -1) {
setSelectedSwimlane(null);
} else {
setSelectedSwimlane((Swimlane)swimlaneTable.getSelection()[0].getData());
}
}
private FormData createSwimlaneListLayoutData() {
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());
createSwimlaneConfigurationComposite();
}
private void createSwimlaneConfigurationComposite() {
swimlaneConfigurationComposite = SwimlaneConfigurationComposite.create(getWidgetFactory(), detailsArea);
}
private FormData createDetailsAreaLayoutData() {
FormData data = new FormData();
data.left = new FormAttachment(swimlaneTable, 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();
setProcessDefinition((ProcessDefinition)notationElement.getSemanticElement());
} else if (input instanceof OutlineEditPart) {
setProcessDefinition((ProcessDefinition)((OutlineEditPart)input).getModel());
}
}
public void clearControls() {
setSelectedSwimlane(null);
swimlaneTable.removeAll();
clearSwimlaneInfo();
}
private void clearSwimlaneInfo() {
detailsArea.setVisible(false);
}
public void setProcessDefinition(ProcessDefinition newProcessDefinition) {
if (processDefinition == newProcessDefinition) return;
if (processDefinition != null) {
processDefinition.removePropertyChangeListener(this);
}
clearControls();
processDefinition = newProcessDefinition;
if (processDefinition != null) {
updateControls();
processDefinition.addPropertyChangeListener(this);
}
}
private void updateControls() {
Swimlane[] swimlanes = processDefinition.getSwimlanes();
for (int i = 0; i < swimlanes.length; i++) {
TableItem tableItem = new TableItem(swimlaneTable, SWT.NULL);
tableItem.setText(swimlanes[i].getName());
tableItem.setData(swimlanes[i]);
tableItem.setImage(SharedImages.INSTANCE.getImage(swimlanes[i].getIconDescriptor()));
}
detailsArea.setVisible(selectedSwimlane != null);
}
public ProcessDefinition getProcessDefinition() {
return processDefinition;
}
private void hookListeners() {
}
private void unhookListeners() {
}
private void setSelectedSwimlane(Swimlane swimlane) {
unhookListeners();
if (selectedSwimlane != null) {
selectedSwimlane.removePropertyChangeListener(this);
}
selectedSwimlane = swimlane;
updateSwimlaneConfigurationComposite();
if (selectedSwimlane != null) {
selectedSwimlane.addPropertyChangeListener(this);
hookListeners();
}
actionBarContributor.setRemoveSwimlaneEnabled(selectedSwimlane != null);
detailsArea.setVisible(selectedSwimlane != null);
}
private void updateSwimlaneConfigurationComposite() {
swimlaneConfigurationComposite.setSwimlane(selectedSwimlane);
}
public Swimlane getSelectedSwimlane() {
return selectedSwimlane;
}
public void propertyChange(PropertyChangeEvent evt) {
if (swimlaneTable.isDisposed()) return;
if ("swimlaneAdd".equals(evt.getPropertyName())) {
TableItem tableItem = new TableItem(swimlaneTable, SWT.NULL);
Swimlane swimlane = (Swimlane)evt.getNewValue();
tableItem.setText(swimlane.getName());
tableItem.setData(swimlane);
tableItem.setImage(SharedImages.INSTANCE.getImage(swimlane.getIconDescriptor()));
swimlaneTable.setSelection(tableItem);
swimlaneTable.notifyListeners(SWT.Selection, new Event());
} else if ("swimlaneRemove".equals(evt.getPropertyName())) {
TableItem tableItem = getItemToRemove(evt.getOldValue());
if (tableItem != null) {
tableItem.dispose();
swimlaneTable.notifyListeners(SWT.Selection, new Event());
}
} else if ("name".equals(evt.getPropertyName())) {
if (swimlaneTable.getSelectionCount() != 1) return;
TableItem tableItem = swimlaneTable.getItem(swimlaneTable.getSelectionIndex());
if (tableItem.getData() == evt.getSource()) {
tableItem.setText((String)evt.getNewValue());
}
}
}
private TableItem getItemToRemove(Object object) {
for (int i = 0; i < swimlaneTable.getItemCount(); i++) {
if (swimlaneTable.getItem(i).getData() == object)
return swimlaneTable.getItem(i);
}
return null;
}
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
}
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
}
}