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