Add tab infrastructure for displaying BPMNPlanes of selected activities.
diff --git a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
index cdaa1e3..c043056 100644
--- a/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
+++ b/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/utils/ModelUtil.java
@@ -522,6 +522,20 @@
 		return Bpmn2DiagramType.NONE;
 	}
 	
+	public static String getDiagramTypeName(BPMNDiagram object) {
+		Bpmn2DiagramType type = getDiagramType((BPMNDiagram)object); 
+		if (type == Bpmn2DiagramType.CHOREOGRAPHY) {
+			return "Choreography Diagram";
+		}
+		else if (type == Bpmn2DiagramType.COLLABORATION) {
+			return "Collaboration Diagram";
+		}
+		else if (type == Bpmn2DiagramType.PROCESS) {
+			return "Process Diagram";
+		}
+		return "Unknown Diagram Type";
+	}
+	
 	public static List<EStructuralFeature> getAnyAttributes(EObject object) {
 		List<EStructuralFeature> list = new ArrayList<EStructuralFeature>();
 		EStructuralFeature anyAttribute = ((EObject)object).eClass().getEStructuralFeature("anyAttribute");
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
index e68986c..fbbebb6 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/BPMN2MultiPageEditor.java
@@ -17,8 +17,10 @@
 import java.util.List;
 
 import org.eclipse.bpmn2.di.BPMNDiagram;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.bpmn2.modeler.ui.wizards.Bpmn2DiagramEditorInput;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabFolder2Listener;
 import org.eclipse.swt.custom.CTabFolderEvent;
@@ -125,6 +127,8 @@
 			public void run() {
 				setActivePage(0);
 				tabFolder.setLayoutDeferred(false);
+				tabFolder.setTabPosition(SWT.TOP);
+				updateTabs();
 			}
 		});
 	}
@@ -139,7 +143,7 @@
 					--pageIndex;
 				addPage(pageIndex, designEditor, BPMN2MultiPageEditor.this.getEditorInput());
 				defaultTabHeight = tabFolder.getTabHeight();
-				setPageText(pageIndex,"Design");
+				setPageText(pageIndex,ModelUtil.getDiagramTypeName( designEditor.getBpmnDiagram() ));
 
 				defaultTabHeight = tabFolder.getTabHeight();
 
@@ -318,6 +322,10 @@
 		tabFolder.layout();
 	}
 	
+	public CTabFolder getTabFolder() {
+		return tabFolder;
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
 	 */
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
index e7298bc..bb36124 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/editor/DesignEditor.java
@@ -9,6 +9,8 @@
 import org.eclipse.bpmn2.di.BPMNDiagram;
 import org.eclipse.bpmn2.di.BPMNPlane;
 import org.eclipse.bpmn2.modeler.core.di.DIUtils;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.URI;
@@ -29,13 +31,30 @@
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
 
 public class DesignEditor extends BPMN2Editor {
 	
 	protected ResourceSetListener resourceSetListener = null;
 	private BPMNDiagram bpmnDiagramDeleted = null;
 	protected boolean debug;
+	protected CTabFolder tabFolder;
+	private int defaultTabHeight;
 
 	public DesignEditor(BPMN2MultiPageEditor bpmn2MultiPageEditor, BPMN2MultiPageEditor mpe) {
 		super(mpe);
@@ -74,7 +93,95 @@
 		}
 		super.setPartName(partName);
     }
-    
+	
+	@Override
+	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+		super.selectionChanged(part, selection);
+		EObject bo = BusinessObjectUtil.getBusinessObjectForSelection(selection);
+		if (bo != null) {
+			tabFolder.setSelection(0);
+	
+			tabFolder.setLayoutDeferred(true);
+			for (int i=tabFolder.getItemCount()-1; i>0; --i) {
+				tabFolder.getItem(i).setControl(null);
+				tabFolder.getItem(i).dispose();
+			}
+	
+			if (!(bo instanceof BPMNDiagram)) {
+				if (tabFolder.getItemCount()==1) {
+					CTabFolder tf = tabFolder;
+			
+					Composite subPlanePage = new Composite(tf, SWT.NONE);
+					subPlanePage.setLayout(new FillLayout());
+					Label label = new Label(subPlanePage, SWT.BORDER);
+					CTabItem item = new CTabItem(tf, SWT.NONE);
+					item.setControl(subPlanePage);
+					item.setText(ModelUtil.getDisplayName(bo)+" Plane");
+					item.setData(label);
+				}
+	
+				CTabItem item = tabFolder.getItem(1);
+				Label label = (Label)item.getData();
+				label.setText("Selected object: "
+						+ModelUtil.getDisplayName(bo)+"\n"
+						+"If the object contained BPMNPlanes, the activities in each Plane would be displayed as a new tab at the bottom of the page.");
+			}
+			
+			tabFolder.setLayoutDeferred(false);
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					updateTabs();
+				}
+			});
+		}					
+	}
+	
+	public void createPartControl(Composite parent) {
+		if (getGraphicalViewer()==null) {
+			tabFolder = new CTabFolder(parent, SWT.BOTTOM);
+			tabFolder.addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					int newPageIndex = tabFolder.indexOf((CTabItem) e.item);
+					CTabItem item = tabFolder.getItem(1);
+				}
+			});
+			tabFolder.addTraverseListener(new TraverseListener() { 
+				// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=199499 : Switching tabs by Ctrl+PageUp/PageDown must not be caught on the inner tab set
+				public void keyTraversed(TraverseEvent e) {
+					switch (e.detail) {
+						case SWT.TRAVERSE_PAGE_NEXT:
+						case SWT.TRAVERSE_PAGE_PREVIOUS:
+							int detail = e.detail;
+							e.doit = true;
+							e.detail = SWT.TRAVERSE_NONE;
+							Control control = tabFolder.getParent();
+							control.traverse(detail, new Event());
+					}
+				}
+			});
+			defaultTabHeight = 3 * tabFolder.getTabHeight() / 4;
+
+			Composite topPlanePage = new Composite(tabFolder, SWT.NONE);
+			topPlanePage.setLayout(new FillLayout());
+			CTabItem item = new CTabItem(tabFolder, SWT.NONE, 0);
+			item.setText("Diagram Plane");
+			item.setControl(topPlanePage);
+
+			super.createPartControl(topPlanePage);
+		}
+	}
+	
+	public void updateTabs() {
+		if (!tabFolder.isLayoutDeferred()) {
+			if (tabFolder.getItemCount()==1) {
+				tabFolder.setTabHeight(0);
+			}
+			else
+				tabFolder.setTabHeight(defaultTabHeight);
+		}
+		tabFolder.layout();
+	}
+	
 	@Override
 	protected void createActions() {
 		super.createActions();