### 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 6 Sep 2006 15:12:14 -0000
@@ -13,27 +13,26 @@
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.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartListener;
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,7 +44,33 @@
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 +104,23 @@
IGraphicalEditPart part = (IGraphicalEditPart) getHost();
List collapseHandles = new ArrayList();
- collapseHandles.add(new CompartmentCollapseHandle(part));
+
+ CompartmentCollapseHandle collapseHandle = new CompartmentCollapseHandle(part);
+
+ TopGraphicEditPart wrapper = part.getTopGraphicEditPart();
+ Rectangle intersection = null;
+ ResizableCompartmentFigure compartment = getCompartmentFigure();
+ if (wrapper != null && compartment != null)
+ intersection = wrapper.getFigure().getBounds().getCopy().intersect(
+ compartment.getBounds());
+ collapseHandle.setVisible(intersection == null
+ || (intersection.width > compartment.getMinClientDimension().width && intersection.height > compartment
+ .getMinClientDimension().height));
+
+ collapseHandles.add(collapseHandle);
return collapseHandles;
}
-
+
/**
* @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#createSelectionHandles()
*/
@@ -93,6 +131,7 @@
int d2 = isHorizontal() ? PositionConstants.EAST
: PositionConstants.SOUTH;
List selectionHandles = new ArrayList();
+
selectionHandles.addAll(createCollapseHandles());
selectionHandles.add(new CompartmentResizeHandle(part, d1));
selectionHandles.add(new CompartmentResizeHandle(part, d2));
@@ -133,9 +172,16 @@
*/
protected void showSelection() {
super.showSelection();
- if (getHost().getSelected() != EditPart.SELECTED_NONE) {
- ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
- if (compartmentFigure != null) {
+ IGraphicalEditPart part = getGraphicalEditPart();
+ TopGraphicEditPart topPart = part.getTopGraphicEditPart();
+ ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
+ if (compartmentFigure != null) {
+ if (topPart != null)
+ {
+ topPart.getFigure().addFigureListener(figureListener);
+ compartmentFigure.addFigureListener(figureListener);
+ }
+ if (getHost().getSelected() != EditPart.SELECTED_NONE) {
compartmentFigure.setSelected(true);
}
}
@@ -146,9 +192,16 @@
*/
protected void hideSelection() {
super.hideSelection();
- if (getHost().getSelected() == EditPart.SELECTED_NONE) {
- ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
- if (compartmentFigure != null) {
+ IGraphicalEditPart part = getGraphicalEditPart();
+ TopGraphicEditPart topPart = part.getTopGraphicEditPart();
+ ResizableCompartmentFigure compartmentFigure = getCompartmentFigure();
+ if (compartmentFigure != null) {
+ if (topPart != null)
+ {
+ topPart.getFigure().removeFigureListener(figureListener);
+ compartmentFigure.removeFigureListener(figureListener);
+ }
+ if (getHost().getSelected() == EditPart.SELECTED_NONE) {
compartmentFigure.setSelected(false);
}
}
@@ -158,8 +211,6 @@
private EditPartListener parentListener;
- private NotificationListener propertyListener;
-
/**
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#addSelectionListener()
*/
@@ -180,25 +231,21 @@
}
};
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();
+ }
+
/**
* @see org.eclipse.gef.editpolicies.SelectionEditPolicy#removeSelectionListener()
*/
protected void removeSelectionListener() {
- getDiagramEventBroker().removeNotificationListener(
- getGraphicalEditPart().getNotationView(), propertyListener);
getHost().removeEditPartListener(hostListener);
getParentGraphicEditPart().removeEditPartListener(parentListener);
}
@@ -212,9 +259,9 @@
int hostState = getHost().getSelected();
int topState = EditPart.SELECTED_NONE;
- if (((GraphicalEditPart) getGraphicalEditPart())
+ if (getGraphicalEditPart()
.getTopGraphicEditPart() != null) {
- topState = ((GraphicalEditPart) getGraphicalEditPart())
+ topState = getGraphicalEditPart()
.getTopGraphicEditPart().getSelected();
}
@@ -227,8 +274,8 @@
setSelectedState(EditPart.SELECTED_NONE);
}
- private GraphicalEditPart getParentGraphicEditPart() {
- return (GraphicalEditPart) getGraphicalEditPart().getParent();
+ private IGraphicalEditPart getParentGraphicEditPart() {
+ return (IGraphicalEditPart) getGraphicalEditPart().getParent();
}
private IGraphicalEditPart getGraphicalEditPart() {
@@ -283,12 +330,23 @@
return req;
}
- private DiagramEventBroker getDiagramEventBroker() {
- TransactionalEditingDomain theEditingDomain = ((IGraphicalEditPart) getHost())
- .getEditingDomain();
- if (theEditingDomain != null) {
- return DiagramEventBroker.getInstance(theEditingDomain);
- }
- 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);
+
+ for (ListIterator handlesIterator = handles.listIterator(); handlesIterator.hasNext();)
+ {
+ Object handle = handlesIterator.next();
+ if (handle instanceof CompartmentCollapseHandle)
+ ((CompartmentCollapseHandle)handle).setVisible(shouldHaveHandles);
+ }
}
+
}