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