diff options
Diffstat (limited to 'plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java')
-rw-r--r-- | plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java | 72 |
1 files changed, 61 insertions, 11 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java index 108152866b..d1e4af8d49 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2020 THALES GLOBAL SERVICES and others. + * Copyright (c) 2007, 2022 THALES GLOBAL SERVICES and others. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -38,6 +38,7 @@ import org.eclipse.gef.editpolicies.LayoutEditPolicy; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gef.requests.CreateRequest; import org.eclipse.gef.requests.DropRequest; +import org.eclipse.gef.requests.SelectionRequest; import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; import org.eclipse.gmf.runtime.diagram.ui.commands.SetBoundsCommand; import org.eclipse.gmf.runtime.diagram.ui.editparts.AbstractBorderItemEditPart; @@ -66,7 +67,7 @@ import org.eclipse.sirius.diagram.ResizeKind; import org.eclipse.sirius.diagram.ShapeContainerStyle; import org.eclipse.sirius.diagram.WorkspaceImage; import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery; -import org.eclipse.sirius.diagram.business.internal.query.DDiagramElementContainerExperimentalQuery; +import org.eclipse.sirius.diagram.model.business.internal.query.DDiagramElementContainerExperimentalQuery; import org.eclipse.sirius.diagram.ui.business.internal.query.DNodeContainerQuery; import org.eclipse.sirius.diagram.ui.business.internal.view.ShowingViewUtil; import org.eclipse.sirius.diagram.ui.edit.internal.part.AbstractDiagramNodeEditPartOperation; @@ -88,8 +89,10 @@ import org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle; import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerParallelogram; import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerRectangleFigureDesc; import org.eclipse.sirius.diagram.ui.tools.api.layout.LayoutUtils; +import org.eclipse.sirius.diagram.ui.tools.internal.figure.ContainerBorderedNodeFigure; import org.eclipse.sirius.diagram.ui.tools.internal.figure.ContainerWithTitleBlockFigure; import org.eclipse.sirius.diagram.ui.tools.internal.figure.RegionRoundedGradientRectangle; +import org.eclipse.sirius.diagram.ui.tools.internal.layout.LayoutUtil; import org.eclipse.sirius.diagram.ui.tools.internal.util.EditPartQuery; import org.eclipse.sirius.diagram.ui.tools.internal.util.NotificationQuery; import org.eclipse.sirius.ext.base.Option; @@ -453,6 +456,42 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo * @return the default figure dimension of this edit part */ public Dimension getDefaultDimension() { + if (LayoutUtil.isArrangeAtOpeningChangesDisabled()) { + return oldGetDefaultDimension(); + } else { + DDiagramElement dde = resolveDiagramElement(); + Dimension defaultSize = LayoutUtils.NEW_DEFAULT_CONTAINER_DIMENSION; + if (dde instanceof DNodeContainer) { + defaultSize = new DNodeContainerQuery((DNodeContainer) dde).getDefaultDimension(); + } + + if (new EditPartQuery(this).isCollapsed() && getParentStackDirection() == PositionConstants.NORTH_SOUTH) { + defaultSize = defaultSize.getCopy().setHeight(LayoutUtils.COLLAPSED_VERTICAL_REGION_HEIGHT); + } else if (isRegion()) { + // For region with a defined size in the VSM, the defined size is considered instead of the default one. + // I'm not sure that this rule should be the same for all kind of containers... I let this comment as a + // clue if an analysis, about a bug concerning "standard container", brings you here. + Integer width = ((DDiagramElementContainer) dde).getWidth(); + if (width != null && width > 0) { + defaultSize = defaultSize.getCopy().setWidth(width * LayoutUtils.SCALE); + } + + Integer height = ((DDiagramElementContainer) dde).getHeight(); + if (height != null && height > 0) { + defaultSize = defaultSize.getCopy().setHeight(height * LayoutUtils.SCALE); + } + } + return defaultSize; + } + } + + /** + * Get the default figure dimension of this edit part. + * + * @return the default figure dimension of this edit part + * @deprecated Only here as security if user activates {@link LayoutUtil#isArrangeAtOpeningChangesDisabled()}. + */ + public Dimension oldGetDefaultDimension() { DDiagramElement dde = resolveDiagramElement(); Dimension defaultSize = LayoutUtils.NEW_DEFAULT_CONTAINER_DIMENSION; if (dde instanceof DNodeContainer) { @@ -536,7 +575,7 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo */ @Override protected NodeFigure createNodeFigure() { - BorderedNodeFigure nodeFigure = new BorderedNodeFigure(createMainFigure()) { + BorderedNodeFigure nodeFigure = new ContainerBorderedNodeFigure(createMainFigure()) { @Override public void paint(Graphics graphics) { ShowingViewUtil.initGraphicsForVisibleAndInvisibleElements(this, graphics, (View) getModel()); @@ -825,23 +864,23 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo final Point position = new Point(); if (graphicalEditPart.getNotationView() instanceof Node && ((Node) graphicalEditPart.getNotationView()).getLayoutConstraint() instanceof Size) { final Size size = (Size) ((Node) graphicalEditPart.getNotationView()).getLayoutConstraint(); - dimension.width = size.getWidth(); - dimension.height = size.getHeight(); + dimension.setWidth(size.getWidth()); + dimension.setHeight(size.getHeight()); } if (graphicalEditPart.getNotationView() instanceof Node && ((Node) graphicalEditPart.getNotationView()).getLayoutConstraint() instanceof Location) { final Location location = (Location) ((Node) graphicalEditPart.getNotationView()).getLayoutConstraint(); - position.x = location.getX(); - position.y = location.getY(); + position.setX(location.getX()); + position.setY(location.getY()); } final DNode viewNode = (DNode) semantic; boolean collapsed = new DDiagramElementQuery(viewNode).isIndirectlyCollapsed(); if (!collapsed && (viewNode.getResizeKind() == ResizeKind.NSEW_LITERAL || viewNode.getResizeKind() == ResizeKind.NORTH_SOUTH_LITERAL)) { - dimension.height += request.getSizeDelta().height / getZoomManager().getZoom(); + dimension.setHeight(dimension.height + (int) (request.getSizeDelta().height / getZoomManager().getZoom())); switch (request.getResizeDirection()) { case PositionConstants.NORTH: case PositionConstants.NORTH_WEST: case PositionConstants.NORTH_EAST: - position.y -= request.getSizeDelta().height / getZoomManager().getZoom(); + position.setY(position.y - (int) (request.getSizeDelta().height / getZoomManager().getZoom())); break; default: break; @@ -849,12 +888,12 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo } if (!collapsed && (viewNode.getResizeKind() == ResizeKind.NSEW_LITERAL || viewNode.getResizeKind() == ResizeKind.EAST_WEST_LITERAL)) { - dimension.width += request.getSizeDelta().width / getZoomManager().getZoom(); + dimension.setWidth(dimension.width + (int) (request.getSizeDelta().width / getZoomManager().getZoom())); switch (request.getResizeDirection()) { case PositionConstants.WEST: case PositionConstants.NORTH_WEST: case PositionConstants.SOUTH_WEST: - position.x -= request.getSizeDelta().width / getZoomManager().getZoom(); + position.setX(position.x - (int) (request.getSizeDelta().width / getZoomManager().getZoom())); break; default: break; @@ -957,4 +996,15 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo this.useOverlayLabel = useOverlayLabel; } + /** + * Return true if the current container is a region and if the CTRL shortcut key is pressed, false otherwise.<BR/> + * This mechanism allows to select and move the regions container more easily. + * + * @param request + * The request "in progress" + * @return true if the current container is a region and if the CTRL shortcut key is pressed, false otherwise. + */ + public boolean shouldUseRegionsContainerDragTracker(Request request) { + return request instanceof SelectionRequest && ((SelectionRequest) request).isControlKeyPressed() && isRegion() && getParent() != null; + } } |