diff options
| author | Maxime Porhel | 2015-08-21 13:24:14 +0000 |
|---|---|---|
| committer | Maxime Porhel | 2015-08-25 13:42:33 +0000 |
| commit | ef5371f3061d69b2ebf67e7b8b36ab1857ea59e8 (patch) | |
| tree | 3b770f4732eb70bfc3185b22d2f4185ce4690f8c | |
| parent | ae79199c97c51a5cecd2cfc2f29d22eafd1ffb88 (diff) | |
| download | org.eclipse.sirius-ef5371f3061d69b2ebf67e7b8b36ab1857ea59e8.tar.gz org.eclipse.sirius-ef5371f3061d69b2ebf67e7b8b36ab1857ea59e8.tar.xz org.eclipse.sirius-ef5371f3061d69b2ebf67e7b8b36ab1857ea59e8.zip | |
[472036] Allow the user to handle empty space when F3 is pressed
This allows to manually resize the last regions without resizing their
parent container and to resize a container without resizing its regions.
User can remove the empty space in recursive region
containers or when the specified RC size is bigger than the Region size.
Bug: 472036
Change-Id: Ic1f98270c3b8ec7760df83a0f305ac14a11fc397
Signed-off-by: Maxime Porhel <maxime.porhel@obeo.fr>
2 files changed, 75 insertions, 0 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionContainerResizableEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionContainerResizableEditPolicy.java index 4fd8be0488..f1233ef1b7 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionContainerResizableEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionContainerResizableEditPolicy.java @@ -14,9 +14,11 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +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.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; @@ -202,11 +204,25 @@ public class RegionContainerResizableEditPolicy extends AirResizableEditPolicy { ChangeBoundsRequest req = initConstrainedRequest(request); req.setEditParts(Lists.newArrayList(regionToResize)); req.setSizeDelta(new Dimension(sizeDelta.width, 0)); + if (query.isResizeFromRight()) { + // Handle F3 for regions in region to allow manual layout. + // Allow manual resize of the region container to reduce + // empty space due to VSM specified size or recursive + // regions. + req = handleEmptySpace(request, req); + } constrainedRequests.add(req); } else if (stackDirection == PositionConstants.EAST_WEST && (query.isResizeFromTop() || query.isResizeFromBottom()) && sizeDelta.height != 0) { ChangeBoundsRequest req = initConstrainedRequest(request); req.setEditParts(Lists.newArrayList(regionToResize)); req.setSizeDelta(new Dimension(0, sizeDelta.height)); + if (query.isResizeFromBottom()) { + // Handle F3 for regions in region to allow manual layout. + // Allow manual resize of the region container to reduce + // empty space due to VSM specified size or recursive + // regions. + req = handleEmptySpace(request, req); + } constrainedRequests.add(req); } } @@ -214,6 +230,31 @@ public class RegionContainerResizableEditPolicy extends AirResizableEditPolicy { return constrainedRequests; } + private ChangeBoundsRequest handleEmptySpace(ChangeBoundsRequest initialRequest, ChangeBoundsRequest constrainedRequest) { + ChangeBoundsRequest result = constrainedRequest; + Object object = initialRequest.getExtendedData().get(SiriusResizeTracker.CHILDREN_MOVE_MODE_KEY); + boolean keepSameAbsoluteLocation = (object == null && SiriusResizeTracker.DEFAULT_CHILDREN_MOVE_MODE) || (object != null && ((Boolean) object).booleanValue()); + if (!initialRequest.isConstrainedResize() && !keepSameAbsoluteLocation) { + result.setMoveDelta(new Point(0, 0)); + result.setSizeDelta(new Dimension(0, 0)); + + Rectangle rect = new Rectangle(); + IFigure parentFigure = getHostFigure(); + for (IGraphicalEditPart part : Iterables.filter(constrainedRequest.getEditParts(), IGraphicalEditPart.class)) { + IFigure figure = part.getFigure(); + rect = rect.getUnion(figure.getBounds()); + parentFigure = figure.getParent(); + } + + // Restrict the move to the parent bounds. + RequestQuery requestQuery = new RequestQuery(initialRequest); + if (rect.contains(requestQuery.getLogicalTransformedRectangle(parentFigure.getBounds()).getBottomRight())) { + result = null; + } + } + return result; + } + private ChangeBoundsRequest initConstrainedRequest(ChangeBoundsRequest request) { ChangeBoundsRequest req = new ChangeBoundsRequest(); req.setConstrainedResize(true); diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionResizableEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionResizableEditPolicy.java index 0d380b27b0..58ac59ce5a 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionResizableEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionResizableEditPolicy.java @@ -126,6 +126,9 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy { if (concernRegion()) { Option<ChangeBoundsRequest> siblingRequest = getConstrainedSiblingRequest(request); if (siblingRequest.some() && siblingRequest.get().getEditParts() != null && siblingRequest.get().getEditParts().size() == 1) { + if (siblingRequest.get().getTransformedRectangle(new Rectangle()).equals(new Rectangle())) { + return; + } EditPart siblingPart = (EditPart) siblingRequest.get().getEditParts().get(0); siblingPart.showSourceFeedback(siblingRequest.get()); } @@ -139,6 +142,9 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy { if (concernRegion()) { Option<ChangeBoundsRequest> siblingRequest = getConstrainedSiblingRequest(request); if (siblingRequest.some() && siblingRequest.get().getEditParts() != null && siblingRequest.get().getEditParts().size() == 1) { + if (siblingRequest.get().getTransformedRectangle(new Rectangle()).equals(new Rectangle())) { + return; + } EditPart siblingPart = (EditPart) siblingRequest.get().getEditParts().get(0); siblingPart.eraseSourceFeedback(siblingRequest.get()); } @@ -279,6 +285,11 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy { req.setResizeDirection(request.getResizeDirection()); req.setSizeDelta(new Dimension(0, sizeDelta.height)); constrainedRequest = req; + // Handle F3 for regions in region to allow manual layout. + // Allow manual resize of the region container to reduce + // empty space due to VSM specified size or recursive + // regions. + constrainedRequest = handleEmptySpaceInContainerOnLastRegionResize(request, constrainedRequest); } } else { Option<AbstractDiagramElementContainerEditPart> follo = getFollowingRegion(); @@ -315,6 +326,24 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy { return constrainedRequest; } + private ChangeBoundsRequest handleEmptySpaceInContainerOnLastRegionResize(ChangeBoundsRequest initialRequest, ChangeBoundsRequest constrainedRequest) { + ChangeBoundsRequest result = constrainedRequest; + Object object = initialRequest.getExtendedData().get(SiriusResizeTracker.CHILDREN_MOVE_MODE_KEY); + boolean keepSameAbsoluteLocation = (object == null && SiriusResizeTracker.DEFAULT_CHILDREN_MOVE_MODE) || (object != null && ((Boolean) object).booleanValue()); + if (!initialRequest.isConstrainedResize() && !keepSameAbsoluteLocation) { + result.setMoveDelta(new Point(0, 0)); + result.setSizeDelta(new Dimension(0, 0)); + + IFigure hostFigure = getHostFigure(); + IFigure parentFigure = hostFigure.getParent(); + // Restrict the move to the parent bounds. + if (!parentFigure.getBounds().contains(new RequestQuery(initialRequest).getLogicalTransformedRectangle(hostFigure.getBounds()).getBottomRight())) { + result = null; + } + } + return result; + } + private ChangeBoundsRequest getHStackConstrainedSiblingRequest(ChangeBoundsRequest request, RequestQuery query, Dimension sizeDelta) { ChangeBoundsRequest constrainedRequest = null; ChangeBoundsRequest req = initSiblingRequest(request); @@ -348,6 +377,11 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy { req.setResizeDirection(request.getResizeDirection()); req.setSizeDelta(new Dimension(sizeDelta.width, 0)); constrainedRequest = req; + // Handle F3 for regions in region to allow manual layout. + // Allow manual resize of the region container to reduce + // empty space due to VSM specified size or recursive + // regions. + constrainedRequest = handleEmptySpaceInContainerOnLastRegionResize(request, constrainedRequest); } } else { Option<AbstractDiagramElementContainerEditPart> follo = getFollowingRegion(); |
