### Eclipse Workspace Patch 1.0
#P org.eclipse.gmf.runtime.diagram.ui
Index: src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java
===================================================================
RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java,v
retrieving revision 1.9
diff -u -r1.9 ResizableCompartmentEditPolicy.java
--- src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java 6 Apr 2006 20:04:27 -0000 1.9
+++ src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java 31 Aug 2006 21:08:19 -0000
@@ -13,27 +13,30 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.draw2d.FigureListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartListener;
+import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.diagram.core.listener.DiagramEventBroker;
-import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ResizableCompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.TopGraphicEditPart;
import org.eclipse.gmf.runtime.diagram.ui.figures.BorderedNodeFigure;
import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure;
import org.eclipse.gmf.runtime.diagram.ui.handles.CompartmentCollapseHandle;
import org.eclipse.gmf.runtime.diagram.ui.internal.handles.CompartmentResizeHandle;
-import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.jface.util.Assert;
/**
* A resizable editpolicy for resizable compartments. The editpolicy could be
@@ -45,6 +48,32 @@
extends ResizableEditPolicyEx {
private boolean horizontal;
+
+ /**
+ * Listener to determine bounds changes of compartment figure and/or its container
+ * to display or hide collapse handles accordingly (Bugzilla #115905)
+ */
+ private FigureListener figureListener = new FigureListener() {
+ public void figureMoved(IFigure source) {
+ if (handles != null) {
+ ResizableCompartmentFigure compartment = getCompartmentFigure();
+ Dimension minClientDimension = compartment.getMinClientDimension();
+ if (source.equals(compartment))
+ {
+ Rectangle intersection = getGraphicalEditPart()
+ .getTopGraphicEditPart().getFigure().getBounds().getCopy()
+ .intersect(source.getBounds());
+
+ refreshCollapseHandles(intersection.height>minClientDimension.height && intersection.width>minClientDimension.width);
+ }
+ else if (source.equals(getGraphicalEditPart().getTopGraphicEditPart().getFigure()))
+ {
+ Rectangle intersection = source.getBounds().getCopy().intersect(compartment.getBounds());
+ refreshCollapseHandles(intersection.height>minClientDimension.height && intersection.width>minClientDimension.width);
+ }
+ }
+ }
+ };
/**
* Creates a new vertical ResizableCompartmentEditPolicy
@@ -79,10 +108,11 @@
IGraphicalEditPart part = (IGraphicalEditPart) getHost();
List collapseHandles = new ArrayList();
+
collapseHandles.add(new CompartmentCollapseHandle(part));
return collapseHandles;
}
-
+
/**
* @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#createSelectionHandles()
*/
@@ -93,7 +123,18 @@
int d2 = isHorizontal() ? PositionConstants.EAST
: PositionConstants.SOUTH;
List selectionHandles = new ArrayList();
- selectionHandles.addAll(createCollapseHandles());
+
+ TopGraphicEditPart wrapper = part.getTopGraphicEditPart();
+ Rectangle intersection = null;
+ ResizableCompartmentFigure compartment = getCompartmentFigure();
+ if (wrapper != null && compartment != null)
+ intersection = wrapper.getFigure().getBounds().getCopy().intersect(
+ compartment.getBounds());
+ if (intersection == null
+ || (intersection.width > compartment.getMinClientDimension().width && intersection.height > compartment
+ .getMinClientDimension().height))
+ selectionHandles.addAll(createCollapseHandles());
+
selectionHandles.add(new CompartmentResizeHandle(part, d1));
selectionHandles.add(new CompartmentResizeHandle(part, d2));
return selectionHandles;
@@ -133,9 +174,12 @@
*/
protected void showSelection() {
super.showSelection();
- if (getHost().getSelected() != EditPart.SELECTED_NONE) {
- ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
- if (compartmentFigure != null) {
+ ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
+ if (compartmentFigure != null) {
+ if (getGraphicalEditPart().getTopGraphicEditPart() != null)
+ getGraphicalEditPart().getTopGraphicEditPart().getFigure().addFigureListener(figureListener);
+ compartmentFigure.addFigureListener(figureListener);
+ if (getHost().getSelected() != EditPart.SELECTED_NONE) {
compartmentFigure.setSelected(true);
}
}
@@ -146,9 +190,12 @@
*/
protected void hideSelection() {
super.hideSelection();
- if (getHost().getSelected() == EditPart.SELECTED_NONE) {
- ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
- if (compartmentFigure != null) {
+ if (getGraphicalEditPart().getTopGraphicEditPart() != null)
+ getGraphicalEditPart().getTopGraphicEditPart().getFigure().removeFigureListener(figureListener);
+ ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
+ if (compartmentFigure != null) {
+ compartmentFigure.removeFigureListener(figureListener);
+ if (getHost().getSelected() == EditPart.SELECTED_NONE) {
compartmentFigure.setSelected(false);
}
}
@@ -158,8 +205,6 @@
private EditPartListener parentListener;
- private NotificationListener propertyListener;
-
/**
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#addSelectionListener()
*/
@@ -180,25 +225,29 @@
}
};
getParentGraphicEditPart().addEditPartListener(parentListener);
+
+ }
- propertyListener = new NotificationListener() {
-
- public void notifyChanged(Notification notification) {
- if (NotationPackage.eINSTANCE.getView_Visible().equals(
- notification.getFeature()))
- setSelectedState();
- }
- };
- getDiagramEventBroker().addNotificationListener(
- getGraphicalEditPart().getNotationView(), propertyListener);
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.SelectionEditPolicy#activate()
+ */
+ public void activate() {
+ super.activate();
+ setSelectedState();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.gef.editpolicies.NonResizableEditPolicy#deactivate()
+ */
+ public void deactivate() {
+ super.deactivate();
+ setSelectedState();
}
/**
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#removeSelectionListener()
*/
protected void removeSelectionListener() {
- getDiagramEventBroker().removeNotificationListener(
- getGraphicalEditPart().getNotationView(), propertyListener);
getHost().removeEditPartListener(hostListener);
getParentGraphicEditPart().removeEditPartListener(parentListener);
}
@@ -291,4 +340,75 @@
}
return null;
}
+
+ /**
+ * Refreshes collapse handles - displays them if they need to be displayed but not displaying
+ * and removes them if they shouldn't be displayed, but are displayed.
+ * Method assumes that handles are not null
, i.e. handles are being displayed
+ *
+ * @param shouldHaveHandles true
if collapse handles need to be displayed
+ */
+ private void refreshCollapseHandles(boolean shouldHaveHandles)
+ {
+ Assert.isTrue(handles!=null);
+
+ boolean hasHandles = dispalyingCollapseHandles();
+
+ if (shouldHaveHandles && !hasHandles)
+ addCollapseHandles();
+ else if (!shouldHaveHandles && hasHandles)
+ removeCollapseHandles();
+ }
+
+ /**
+ * Adds collapse handles to the list of handles and displays them
+ * Method assumes that handles are not null
, i.e. handles are being displayed
+ */
+ private void addCollapseHandles()
+ {
+ Assert.isTrue(handles!=null);
+ List collapseHandles = createCollapseHandles();
+ IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
+ handles.addAll(collapseHandles);
+ for (ListIterator handlesIterator = collapseHandles
+ .listIterator(); handlesIterator.hasNext();)
+ layer.add((IFigure) handlesIterator.next());
+ }
+
+ /**
+ * Tries to remove collapse handles if any displayed
+ * Method assumes that handles are not null
, i.e. handles are being displayed
+ *
+ */
+ private void removeCollapseHandles()
+ {
+ Assert.isTrue(handles!=null);
+ IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
+ for (ListIterator handlesIterator = handles.listIterator(); handlesIterator.hasNext();)
+ {
+ IFigure handle = (IFigure) handlesIterator.next();
+ if (handle instanceof CompartmentCollapseHandle) {
+ layer.remove(handle);
+ handlesIterator.remove();
+ }
+ }
+ }
+
+ /**
+ * Checks whether connection handles are being displayed.
+ * Method assumes that handles are not null
, i.e. handles are being displayed
+ *
+ * @return true
if collapse handles are being displayed
+ */
+ private boolean dispalyingCollapseHandles()
+ {
+ Assert.isTrue(handles!=null);
+ for (ListIterator handlesIterator = handles.listIterator(); handlesIterator.hasNext();)
+ {
+ if (handlesIterator.next() instanceof CompartmentCollapseHandle)
+ return true;
+ }
+ return false;
+ }
+
}