### 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 16 Aug 2006 15:09:53 -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; @@ -116,6 +118,7 @@ import org.eclipse.jface.util.Assert; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; import org.eclipse.swt.events.DisposeEvent; @@ -164,9 +167,48 @@ */ protected PreferenceStore workspaceViewerPreferenceStore = null; + class GMFTreeViewer extends TreeViewer + { + + /** + * A work-around to convert selected tree edit parts into graphical edit + * parts right before firing selection changed event to the listeners. This + * is done to ensure that Properties View stays in sync with the selection + * made from the tree viewer + * + * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#getSelection() + */ + public ISelection getSelection() { + ISelection selected = super.getSelection(); + if (getDiagramGraphicalViewer() == null || !(selected instanceof IStructuredSelection)) + return selected; + + ArrayList selectedItems = new ArrayList(); + Iterator iter = ((IStructuredSelection) selected).iterator(); + while (iter.hasNext()) { + Object o = iter.next(); + EditPart ep = null; + if (o instanceof EditPart) { + try { + ep = (EditPart) getDiagramGraphicalViewer() + .getEditPartRegistry().get( + ((EditPart) o).getModel()); + } catch (Exception e) { + } + } + + if (ep != null) + selectedItems.add(ep); + else + selectedItems.add(o); + } + return new StructuredSelection(selectedItems); + } + } + /** - * A diagram outline page - */ + * A diagram outline page + */ class DiagramOutlinePage extends ContentOutlinePage implements IAdaptable { @@ -184,7 +226,7 @@ private Thumbnail thumbnail; private DisposeListener disposeListener; - + /** * @param viewer */ @@ -223,7 +265,11 @@ public EditPart createEditPart(EditPart context, Object model) { if (model instanceof Diagram) { return new TreeDiagramEditPart(model); - } else { + } + else if (model instanceof Node) { + return new TreeNodeEditPart(model); + } + else { return new TreeEditPart(model); } } @@ -612,7 +658,7 @@ */ public Object getAdapter(Class type) { if (type == IContentOutlinePage.class) { - TreeViewer viewer = new TreeViewer(); + GMFTreeViewer viewer = new GMFTreeViewer(); viewer.setRootEditPart(new DiagramRootTreeEditPart()); return new DiagramOutlinePage(viewer); } @@ -1493,4 +1539,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.5 diff -u -r1.11.2.5 TreeEditPart.java --- src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java 2 Aug 2006 13:38:48 -0000 1.11.2.5 +++ src/org/eclipse/gmf/runtime/diagram/ui/internal/editparts/TreeEditPart.java 16 Aug 2006 15:09:52 -0000 @@ -168,7 +168,7 @@ * @param event */ protected void handleNotificationEvent( Notification notification ) { - if (NotationPackage.Literals.VIEW__ELEMENT==notification.getFeature()) { + if (notification.getNotifier() == getModel() && NotationPackage.Literals.VIEW__ELEMENT==notification.getFeature()) { reactivateSemanticElement(); } else{ refreshVisuals(); @@ -225,7 +225,7 @@ * * @return the diagram event broker */ - private DiagramEventBroker getDiagramEventBroker() { + protected DiagramEventBroker getDiagramEventBroker() { EditingDomain theEditingDomain = getEditingDomain(); if (theEditingDomain instanceof TransactionalEditingDomain) { return DiagramEventBroker 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,145 @@ +/****************************************************************************** + * 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.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 { + + 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(); + + // add listeners to catch compartments notification events + ListIterator iter = getCompartmentChildren().listIterator(); + while(iter.hasNext()) + { + View view = (View)iter.next(); + getDiagramEventBroker().addNotificationListener(view, this); + } + } + + /* (non-Javadoc) + * @see org.eclipse.gmf.runtime.diagram.ui.internal.editparts.TreeEditPart#deactivate() + */ + public void deactivate() { + super.deactivate(); + + // remove listeners catching compartments notification events + ListIterator iter = getCompartmentChildren().listIterator(); + while(iter.hasNext()) + { + View view = (View)iter.next(); + getDiagramEventBroker().removeNotificationListener(view, this); + } + } + + /** + * Collects all compartment children of the node including comaprtments within compartments + * @return List 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; + } + +}