### 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; + } + +}