### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.runtime.diagram.ui Index: src/org/eclipse/gmf/runtime/diagram/ui/handles/CompartmentCollapseHandle.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/handles/CompartmentCollapseHandle.java,v retrieving revision 1.8.2.1 diff -u -r1.8.2.1 CompartmentCollapseHandle.java --- src/org/eclipse/gmf/runtime/diagram/ui/handles/CompartmentCollapseHandle.java 13 Sep 2006 16:43:40 -0000 1.8.2.1 +++ src/org/eclipse/gmf/runtime/diagram/ui/handles/CompartmentCollapseHandle.java 19 Sep 2006 00:57:57 -0000 @@ -25,8 +25,8 @@ import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.DragTracker; import org.eclipse.gef.handles.AbstractHandle; -import org.eclipse.gmf.runtime.diagram.core.listener.NotificationListener; 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.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.IResizableCompartmentEditPart; import org.eclipse.gmf.runtime.diagram.ui.internal.figures.CollapseFigure; @@ -50,10 +50,10 @@ */ private class CollapseHandleLocator implements Locator { public void relocate(IFigure target) { - Rectangle theBounds = getOwnerFigure().getClientArea().getCopy(); + Rectangle theBounds = getOwnerFigure().getClientArea().getCopy(); getOwnerFigure().translateToAbsolute(theBounds); - target.translateToRelative(theBounds); - target.setLocation(theBounds.getLocation()); + target.translateToRelative(theBounds); + target.setLocation(theBounds.getLocation()); } } @@ -64,27 +64,36 @@ protected CollapseFigure collapseFigure = null; /** - * Creates a new Compartment Collapse Handle - * @param owner - */ - public CompartmentCollapseHandle(IGraphicalEditPart owner) { - setOwner(owner); - setLocator(new CollapseHandleLocator()); - setCursor(Cursors.ARROW); - - setSize(SIZE); - setLayoutManager(new StackLayout()); - add(collapseFigure = new CollapseFigure()); - View view = owner.getNotationView(); - if (view!=null){ - DrawerStyle style = (DrawerStyle) view.getStyle(NotationPackage.eINSTANCE.getDrawerStyle()); - if (style != null){ - collapseFigure.setCollapsed(style.isCollapsed()); - return; - } - } - collapseFigure.setCollapsed(false); - } + * Creates a new Compartment Collapse Handle + * + * @param owner + */ + public CompartmentCollapseHandle(IGraphicalEditPart owner) { + setOwner(owner); + setLocator(new CollapseHandleLocator()); + setCursor(Cursors.ARROW); + + setSize(SIZE); + setLayoutManager(new StackLayout()); + + if (owner != null && owner.getParent() != null + && owner.getParent() instanceof IGraphicalEditPart) + add(collapseFigure = new CollapseFigure(((IGraphicalEditPart) owner + .getParent()).getFigure())); + else + add(collapseFigure = new CollapseFigure()); + + View view = owner.getNotationView(); + if (view != null) { + DrawerStyle style = (DrawerStyle) view + .getStyle(NotationPackage.eINSTANCE.getDrawerStyle()); + if (style != null) { + collapseFigure.setCollapsed(style.isCollapsed()); + return; + } + } + collapseFigure.setCollapsed(false); + } /** * @see org.eclipse.draw2d.IFigure#findFigureAt(int, int, TreeSearch) Index: src/org/eclipse/gmf/runtime/diagram/ui/internal/figures/CollapseFigure.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/figures/CollapseFigure.java,v retrieving revision 1.4 diff -u -r1.4 CollapseFigure.java --- src/org/eclipse/gmf/runtime/diagram/ui/internal/figures/CollapseFigure.java 25 Nov 2005 19:38:14 -0000 1.4 +++ src/org/eclipse/gmf/runtime/diagram/ui/internal/figures/CollapseFigure.java 19 Sep 2006 00:57:57 -0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * Copyright (c) 2002, 2003 IBM Corporation and others. + * Copyright (c) 2002, 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 @@ -12,7 +12,9 @@ package org.eclipse.gmf.runtime.diagram.ui.internal.figures; import org.eclipse.draw2d.Graphics; +import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.RectangleFigure; +import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gmf.runtime.diagram.ui.internal.l10n.DiagramUIPluginImages; import org.eclipse.swt.graphics.Image; @@ -25,10 +27,32 @@ public class CollapseFigure extends RectangleFigure { private boolean collapsed = false; + private IFigure containerFigure = null; + + + /** + * Constrcuts an instance + */ + public CollapseFigure() { + super(); + } + + /** + * Constrcuts an instance + * + * @param containerFigure + * containers's figure + */ + public CollapseFigure(IFigure containerFigure) { + super(); + this.containerFigure = containerFigure; + } - /* (non-Javadoc) - * @see org.eclipse.draw2d.Shape#fillShape(org.eclipse.draw2d.Graphics) - */ + /* + * (non-Javadoc) + * + * @see org.eclipse.draw2d.Shape#fillShape(org.eclipse.draw2d.Graphics) + */ protected void fillShape(Graphics graphics) { Image img; @@ -71,4 +95,27 @@ repaint(); } + /* + * (non-Javadoc) + * + * @see org.eclipse.draw2d.Figure#isVisible() + */ + public boolean isVisible() { + boolean visibility = super.isVisible(); + if (visibility && containerFigure != null) { + /* + * Try to hide the handle if it's to be drawn outside of the + * container edit part figure + */ + Rectangle containerBounds = containerFigure.getClientArea() + .getCopy(); + containerFigure.translateToAbsolute(containerBounds); + translateToRelative(containerBounds); + return containerBounds.contains(getBounds()); + } + return visibility; + } + + + } 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.2.2 diff -u -r1.9.2.2 ResizableCompartmentEditPolicy.java --- src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java 13 Sep 2006 16:43:39 -0000 1.9.2.2 +++ src/org/eclipse/gmf/runtime/diagram/ui/editpolicies/ResizableCompartmentEditPolicy.java 19 Sep 2006 00:57:57 -0000 @@ -13,26 +13,21 @@ 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.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.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.jface.util.Assert; /** * A resizable editpolicy for resizable compartments. The editpolicy could be @@ -44,33 +39,7 @@ 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 */ @@ -104,23 +73,10 @@ IGraphicalEditPart part = (IGraphicalEditPart) getHost(); List collapseHandles = new ArrayList(); - - 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); + collapseHandles.add(new CompartmentCollapseHandle(part)); return collapseHandles; } - + /** * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#createSelectionHandles() */ @@ -131,7 +87,6 @@ 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)); @@ -172,16 +127,9 @@ */ protected void showSelection() { super.showSelection(); - 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) { + if (getHost().getSelected() != EditPart.SELECTED_NONE) { + ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); + if (compartmentFigure != null) { compartmentFigure.setSelected(true); } } @@ -192,22 +140,24 @@ */ protected void hideSelection() { super.hideSelection(); - 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) { + if (getHost().getSelected() == EditPart.SELECTED_NONE) { + ResizableCompartmentFigure compartmentFigure = getCompartmentFigure(); + if (compartmentFigure != null) { compartmentFigure.setSelected(false); } } } + + /* (non-Javadoc) + * @see org.eclipse.gef.editpolicies.SelectionEditPolicy#activate() + */ + public void activate() { + super.activate(); + if (getHost().getParent().getSelected() != EditPart.SELECTED_NONE) + setSelectedState(); + } - private EditPartListener hostListener; + private EditPartListener hostListener; private EditPartListener parentListener; @@ -231,17 +181,9 @@ } }; getParentGraphicEditPart().addEditPartListener(parentListener); - - } - /* (non-Javadoc) - * @see org.eclipse.gef.editpolicies.SelectionEditPolicy#activate() - */ - public void activate() { - super.activate(); - setSelectedState(); } - + /** * @see org.eclipse.gef.editpolicies.SelectionEditPolicy#removeSelectionListener() */ @@ -259,10 +201,8 @@ int hostState = getHost().getSelected(); int topState = EditPart.SELECTED_NONE; - if (getGraphicalEditPart() - .getTopGraphicEditPart() != null) { - topState = getGraphicalEditPart() - .getTopGraphicEditPart().getSelected(); + if (getGraphicalEditPart().getTopGraphicEditPart() != null) { + topState = getGraphicalEditPart().getTopGraphicEditPart().getSelected(); } boolean vis = getGraphicalEditPart().getNotationView().isVisible(); @@ -330,23 +270,4 @@ return req; } - /** - * 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); - } - } - }