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