### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.runtime.diagram.ui 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 9 Aug 2006 20:42:38 -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/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.4 diff -u -r1.29.2.4 DiagramEditor.java --- src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java 2 Aug 2006 17:11:40 -0000 1.29.2.4 +++ src/org/eclipse/gmf/runtime/diagram/ui/parts/DiagramEditor.java 9 Aug 2006 20:42:38 -0000 @@ -90,6 +90,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; @@ -105,6 +106,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; @@ -115,6 +117,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; @@ -163,9 +166,49 @@ */ 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() + */ + @Override + 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 { @@ -183,7 +226,7 @@ private Thumbnail thumbnail; private DisposeListener disposeListener; - + /** * @param viewer */ @@ -222,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); } } @@ -611,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); } @@ -1487,4 +1534,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/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,113 @@ +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; + +public class TreeNodeEditPart extends TreeContainerEditPart { + + public TreeNodeEditPart(Object model) { + super(model); + } + + /** + * Returns the children of this from the model, + * as this is capable enough of holding EditParts. + * + * @return List of children. + */ + protected List getModelChildren() { + if (!(getModel() instanceof Node)) + return super.getModelChildren(); + + return getNodeChildren((Node)getModel()); + } + + private boolean isCompartment(Node node) + { + return node.getStyle(NotationPackage.eINSTANCE.getDrawerStyle())!=null; + } + + @Override + 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); + } + + private List getNodeChildren(Node node) + { + List children = new ArrayList(node.getChildren().size()); + ListIterator iter = node.getChildren().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; + } + + @Override + public void activate() { + super.activate(); + ListIterator iter = getCompartmentChildren().listIterator(); + while(iter.hasNext()) + { + View view = (View)iter.next(); + getDiagramEventBroker().addNotificationListener(view, NotationPackage.eINSTANCE.getView_PersistedChildren(), this); + getDiagramEventBroker().addNotificationListener(view, NotationPackage.eINSTANCE.getView_TransientChildren(), this); + getDiagramEventBroker().addNotificationListener(view, NotationPackage.eINSTANCE.getView_Visible(), this); + getDiagramEventBroker().addNotificationListener(view, NotationPackage.eINSTANCE.getDrawerStyle_Collapsed(), this); + } + } + + @Override + public void deactivate() { + super.deactivate(); + ListIterator iter = getCompartmentChildren().listIterator(); + while(iter.hasNext()) + { + View view = (View)iter.next(); + getDiagramEventBroker().removeNotificationListener(view, NotationPackage.eINSTANCE.getView_PersistedChildren(), this); + getDiagramEventBroker().removeNotificationListener(view, NotationPackage.eINSTANCE.getView_TransientChildren(), this); + getDiagramEventBroker().removeNotificationListener(view, NotationPackage.eINSTANCE.getView_Visible(), this); + getDiagramEventBroker().removeNotificationListener(view, NotationPackage.eINSTANCE.getDrawerStyle().getEIDAttribute(), this); + } + } + + 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; + } + +}