### Eclipse Workspace Patch 1.0
#P org.eclipse.gmf.runtime.diagram.ui
Index: src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java,v
retrieving revision 1.29.2.5
diff -u -r1.29.2.5 DiagramEditor.java
--- src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java 10 Aug 2006 18:39:12 -0000 1.29.2.5
+++ src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java 12 Sep 2006 21:09:21 -0000
@@ -91,6 +91,7 @@
import org.eclipse.gmf.runtime.diagram.ui.internal.editparts.DiagramRootTreeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeDiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeNodeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.l10n.DiagramUIPluginImages;
import org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.DefaultValues;
import org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageInfoHelper;
@@ -106,6 +107,7 @@
import org.eclipse.gmf.runtime.emf.commands.core.command.EditingDomainUndoContext;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.GuideStyle;
+import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.action.Action;
@@ -165,8 +167,8 @@
protected PreferenceStore workspaceViewerPreferenceStore = null;
/**
- * A diagram outline page
- */
+ * A diagram outline page
+ */
class DiagramOutlinePage
extends ContentOutlinePage
implements IAdaptable {
@@ -184,7 +186,7 @@
private Thumbnail thumbnail;
private DisposeListener disposeListener;
-
+
/**
* @param viewer
*/
@@ -223,6 +225,9 @@
public EditPart createEditPart(EditPart context, Object model) {
if (model instanceof Diagram) {
return new TreeDiagramEditPart(model);
+ }
+ else if (model instanceof Node) {
+ return new TreeNodeEditPart(model);
} else {
return new TreeEditPart(model);
}
@@ -612,7 +617,7 @@
*/
public Object getAdapter(Class type) {
if (type == IContentOutlinePage.class) {
- TreeViewer viewer = new TreeViewer();
+ TreeViewer viewer = new TreeViewer();
viewer.setRootEditPart(new DiagramRootTreeEditPart());
return new DiagramOutlinePage(viewer);
}
@@ -1493,4 +1498,4 @@
protected PreferencesHint getPreferencesHint() {
return new PreferencesHint(getEditorSite().getId());
};
-}
+}
\ No newline at end of file
Index: src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java,v
retrieving revision 1.11.2.8
diff -u -r1.11.2.8 TreeEditPart.java
--- src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java 8 Sep 2006 18:42:17 -0000 1.11.2.8
+++ src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java 12 Sep 2006 21:09:21 -0000
@@ -244,7 +244,7 @@
*
* @return the diagram event broker
*/
- private DiagramEventBroker getDiagramEventBroker() {
+ protected DiagramEventBroker getDiagramEventBroker() {
EditingDomain theEditingDomain = getEditingDomain();
if (theEditingDomain instanceof TransactionalEditingDomain) {
return DiagramEventBroker
@@ -252,4 +252,4 @@
}
return null;
}
-}
+}
\ No newline at end of file
Index: src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeNodeEditPart.java
===================================================================
RCS file: src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeNodeEditPart.java
diff -N src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeNodeEditPart.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeNodeEditPart.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,161 @@
+/******************************************************************************
+ * Copyright (c) 2006, 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ****************************************************************************/
+
+package org.eclipse.gmf.runtime.diagram.ui.internal.editparts;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.gmf.runtime.notation.DrawerStyle;
+import org.eclipse.gmf.runtime.notation.Node;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * Implementation of a tree edit part for node views
+ *
+ * @author aboyko
+ * @canBeSeenBy org.eclipse.gmf.runtime.diagram.ui.*
+ */
+public class TreeNodeEditPart extends TreeContainerEditPart {
+
+ /**
+ * Array to cach model objects (views) the edit part listens to - used
+ * to prevent memory leaks
+ */
+ private View[] compartmentObjects = null;
+
+ public TreeNodeEditPart(Object model) {
+ super(model);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeContainerEditPart#getModelChildren()
+ */
+ protected List getModelChildren() {
+ if (!(getModel() instanceof Node))
+ return super.getModelChildren();
+
+ return getNodeChildren((Node)getModel());
+ }
+
+ /**
+ * Checks whether the node passed in as an argument is compartment
+ * @param node - The node to check
+ * @return true
if node is a compartment, false
otherwise
+ */
+ private boolean isCompartment(Node node)
+ {
+ return node.getStyle(NotationPackage.eINSTANCE.getDrawerStyle())!=null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeContainerEditPart#handleNotificationEvent(org.eclipse.emf.common.notify.Notification)
+ */
+ protected void handleNotificationEvent(Notification event) {
+ Object feature = event.getFeature();
+ if (NotationPackage.eINSTANCE.getView_Visible()==feature
+ || NotationPackage.eINSTANCE.getDrawerStyle_Collapsed()==feature)
+ refreshChildren();
+ else
+ super.handleNotificationEvent(event);
+ }
+
+ /**
+ * Collect non-compartment children of the node. If one of the children is a compartment then children of
+ * this non-compartment children of this compartment child are appended to the list.
+ * @param node - the node from which children are collected
+ * @return List
of non-compartment children of the node passed in as an argument
+ */
+ private List getNodeChildren(Node node)
+ {
+ List children = new ArrayList(node.getVisibleChildren().size());
+ ListIterator iter = node.getVisibleChildren().listIterator();
+ while (iter.hasNext())
+ {
+ Object element = iter.next();
+ if (element instanceof Node)
+ {
+ Node child = (Node) element;
+ if (isCompartment(child))
+ {
+ children.addAll(getNodeChildren(child));
+ }
+ else if (isCompartment(node) &&
+ !((DrawerStyle) node.getStyle(NotationPackage.eINSTANCE.getDrawerStyle())).isCollapsed()
+ )
+ {
+ children.add(child);
+ }
+ }
+ }
+ return children;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeEditPart#activate()
+ */
+ public void activate() {
+ super.activate();
+
+ List compartmentViews = getCompartmentChildren();
+ if (compartmentViews!=null && !compartmentViews.isEmpty())
+ {
+ compartmentObjects = new View[compartmentViews.size()];
+
+ // add listeners to catch compartments notification events
+ int index = 0;
+ for (ListIterator iter = compartmentViews.listIterator(); iter.hasNext();)
+ {
+ View view = (View)iter.next();
+ getDiagramEventBroker().addNotificationListener(view, this);
+ compartmentObjects[index++] = view;
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeEditPart#deactivate()
+ */
+ public void deactivate() {
+ super.deactivate();
+
+ // remove listeners catching compartments notification events
+ if (compartmentObjects != null) {
+ for (int index=0; indexList of all compartments contained within this node
+ */
+ private List getCompartmentChildren()
+ {
+ ArrayList compartments = new ArrayList();
+ ListIterator iter = ((Node)getModel()).getChildren().listIterator();
+ while(iter.hasNext())
+ {
+ Object obj = iter.next();
+ if (obj instanceof Node && isCompartment((Node)obj))
+ compartments.add(obj);
+ }
+ return compartments;
+ }
+
+}