diff options
| author | Maxime Porhel | 2015-06-23 15:07:40 +0000 |
|---|---|---|
| committer | Maxime Porhel | 2015-08-07 09:31:06 +0000 |
| commit | e3b64dff58c55dc03ad23824a6dca603b474825c (patch) | |
| tree | a289bc2d5b552c0f3ba8aca5cae6f7e513bedd3f | |
| parent | d5d1e8629473df6f99be9e7b3a20880353e4879a (diff) | |
| download | org.eclipse.sirius-e3b64dff58c55dc03ad23824a6dca603b474825c.tar.gz org.eclipse.sirius-e3b64dff58c55dc03ad23824a6dca603b474825c.tar.xz org.eclipse.sirius-e3b64dff58c55dc03ad23824a6dca603b474825c.zip | |
[470770] Rounded OneLineMarginBorder
Bug: 470770
Change-Id: I08f8bc9c0c0512ca17f24ee60b21c2c1f0362c7f
4 files changed, 131 insertions, 6 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 8f6f8ffe24..1305a83e40 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 @@ -83,7 +83,6 @@ import org.eclipse.sirius.diagram.ui.tools.api.figure.AlphaDropShadowBorder; import org.eclipse.sirius.diagram.ui.tools.api.figure.FoldingToggleAwareClippingStrategy; import org.eclipse.sirius.diagram.ui.tools.api.figure.FoldingToggleImageFigure; import org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle; -import org.eclipse.sirius.diagram.ui.tools.api.figure.OneLineMarginBorder; import org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabel; import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerFigureDesc; import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerParallelogram; @@ -91,6 +90,7 @@ import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerRectangle import org.eclipse.sirius.diagram.ui.tools.api.graphical.edit.styles.IContainerLabelOffsets; import org.eclipse.sirius.diagram.ui.tools.api.layout.LayoutUtils; import org.eclipse.sirius.diagram.ui.tools.internal.figure.ContainerWithTitleBlockFigure; +import org.eclipse.sirius.diagram.ui.tools.internal.figure.RoundedCornerMarginBorder; import org.eclipse.sirius.ext.base.Option; import org.eclipse.sirius.ext.base.Options; import org.eclipse.sirius.viewpoint.DStylizable; @@ -335,10 +335,10 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo if (isFirstRegionPart()) { shapeFigure.setBorder(new MarginBorder(IContainerLabelOffsets.LABEL_OFFSET, 0, 0, 0)); } else { - OneLineMarginBorder oneLineBorder = new OneLineMarginBorder(PositionConstants.TOP); + RoundedCornerMarginBorder oneLineBorder = new RoundedCornerMarginBorder(PositionConstants.TOP); shapeFigure.setBorder(oneLineBorder); + oneLineBorder.setCornerDimensions(DiagramContainerEditPartOperation.getCornerDimension(this)); oneLineBorder.setMargin(IContainerLabelOffsets.LABEL_OFFSET, 0, 0, 0); - if (getParentStackDirection() == PositionConstants.EAST_WEST) { oneLineBorder.setPosition(PositionConstants.LEFT); } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/internal/part/DiagramContainerEditPartOperation.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/internal/part/DiagramContainerEditPartOperation.java index 9e0823a895..06210a28d1 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/internal/part/DiagramContainerEditPartOperation.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/internal/part/DiagramContainerEditPartOperation.java @@ -48,6 +48,7 @@ import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerParallelo import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerRectangleFigureDesc; import org.eclipse.sirius.diagram.ui.tools.api.figure.WorkspaceImageFigure; import org.eclipse.sirius.diagram.ui.tools.api.graphical.edit.styles.IContainerLabelOffsets; +import org.eclipse.sirius.diagram.ui.tools.internal.figure.RoundedCornerMarginBorder; import org.eclipse.sirius.ui.tools.api.color.VisualBindingManager; import org.eclipse.sirius.viewpoint.DStylizable; import org.eclipse.sirius.viewpoint.LabelAlignment; @@ -246,7 +247,11 @@ public final class DiagramContainerEditPartOperation { if (primaryShape != null && primaryShape.getBorder() instanceof LineBorder) { ((LineBorder) primaryShape.getBorder()).setWidth(borderSize); if (primaryShape.getBorder() instanceof OneLineMarginBorder) { - ((OneLineMarginBorder) primaryShape.getBorder()).setMargin(labelOffset, 0, 0, 0); + OneLineMarginBorder border = (OneLineMarginBorder) primaryShape.getBorder(); + border.setMargin(labelOffset, 0, 0, 0); + if (self.isRegion() && border instanceof RoundedCornerMarginBorder) { + ((RoundedCornerMarginBorder) border).setCornerDimensions(getCornerDimension(self)); + } } } else if (primaryShape != null && primaryShape.getBorder() instanceof MarginBorder) { MarginBorder margin = null; diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/OneLineMarginBorder.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/OneLineMarginBorder.java index dd4a904eb2..562c4468a3 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/OneLineMarginBorder.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/api/figure/OneLineMarginBorder.java @@ -63,13 +63,13 @@ public class OneLineMarginBorder extends OneLineBorder { switch (getPosition()) { case PositionConstants.MIDDLE: - //See PositionConstants.TOP_MIDDLE_BOTTOM = TOP | MIDDLE | BOTTOM; + // See PositionConstants.TOP_MIDDLE_BOTTOM = TOP | MIDDLE | BOTTOM; tempRect.y += halfWidthInLP; tempRect.height -= getWidth(); graphics.drawLine(tempRect.getLeft(), tempRect.getRight()); break; case PositionConstants.CENTER: - //See PositionConstants.LEFT_CENTER_RIGHT = LEFT | CENTER | RIGHT; + // See PositionConstants.LEFT_CENTER_RIGHT = LEFT | CENTER | RIGHT; tempRect.x += halfWidthInLP; tempRect.width -= getWidth(); graphics.drawLine(tempRect.getTop(), tempRect.getBottom()); diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/RoundedCornerMarginBorder.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/RoundedCornerMarginBorder.java new file mode 100644 index 0000000000..de14d08435 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/tools/internal/figure/RoundedCornerMarginBorder.java @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2015 Obeo. + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.ui.tools.internal.figure; + +import org.eclipse.draw2d.Graphics; +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.PositionConstants; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Insets; +import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil; +import org.eclipse.sirius.diagram.ui.tools.api.figure.OneLineMarginBorder; + +/** + * Specific {@link OneLineMarginBorder} with rounded corner capabilities. + * + * @author mporhel + */ +public class RoundedCornerMarginBorder extends OneLineMarginBorder { + + private final Dimension corner = new Dimension(0, 0); + + /** + * Constructor. + * + * @param position + * The position to set. + */ + public RoundedCornerMarginBorder(int position) { + super(position); + } + + /** + * Paints the border based on the inputs given. + * + * @param figure + * <code>IFigure</code> for which this is the border. + * @param graphics + * <code>Graphics</code> handle for drawing the border. + * @param insets + * Space to be taken up by this border. + */ + @Override + public void paint(IFigure figure, Graphics graphics, Insets insets) { + int hRadius = corner.width / 2; + int vRadius = corner.height / 2; + Insets cornerAwareInsets = insets; + switch (getPosition()) { + case PositionConstants.TOP: + case PositionConstants.BOTTOM: + cornerAwareInsets = insets.getAdded(new Insets(0, hRadius, 0, hRadius)); + break; + case PositionConstants.LEFT: + case PositionConstants.RIGHT: + cornerAwareInsets = insets.getAdded(new Insets(vRadius, 0, vRadius, 0)); + break; + default: + break; + } + super.paint(figure, graphics, cornerAwareInsets); + + int one = MapModeUtil.getMapMode(figure).DPtoLP(1); + int widthInDP = getWidth() / one; + int halfWidthInLP = MapModeUtil.getMapMode(figure).DPtoLP(widthInDP / 2); + + if (!corner.isEmpty()) { + switch (getPosition()) { + case PositionConstants.TOP: + tempRect.x += halfWidthInLP; + tempRect.width -= getWidth(); + graphics.drawArc(tempRect.getTopRight().x - hRadius, tempRect.getTopRight().y, corner.width, corner.height, 5, 85); + graphics.drawArc(tempRect.getTopLeft().x - hRadius, tempRect.getTopLeft().y, corner.width, corner.height, 90, 85); + break; + case PositionConstants.BOTTOM: + tempRect.x += halfWidthInLP; + tempRect.width -= getWidth(); + graphics.drawArc(tempRect.getBottomLeft().x - hRadius, tempRect.getBottomLeft().y - corner.height, corner.width, corner.height, 185, 85); + graphics.drawArc(tempRect.getBottomRight().x - hRadius, tempRect.getBottomRight().y - corner.height, corner.width, corner.height, 270, 85); + break; + case PositionConstants.LEFT: + tempRect.y += halfWidthInLP; + tempRect.height -= getWidth(); + graphics.drawArc(tempRect.getTopLeft().x, tempRect.getTopLeft().y - vRadius, corner.width, corner.height, 95, 85); + graphics.drawArc(tempRect.getBottomLeft().x, tempRect.getBottomLeft().y - vRadius, corner.width, corner.height, 180, 85); + break; + case PositionConstants.RIGHT: + tempRect.y += halfWidthInLP; + tempRect.height -= getWidth(); + graphics.drawArc(tempRect.getTopRight().x - corner.width, tempRect.getTopRight().y - vRadius, corner.width, corner.height, 0, 85); + graphics.drawArc(tempRect.getBottomRight().x - corner.width, tempRect.getBottomRight().y - vRadius, corner.width, corner.height, 270, 85); + break; + default: + break; + } + } + } + + /** + * Sets the dimensions of each corner. This will form the radii of the arcs + * which form the corners. + * + * @param d + * the dimensions of the corner + */ + public void setCornerDimensions(Dimension d) { + if (d == null) { + corner.width = 0; + corner.height = 0; + } + corner.width = d.width; + corner.height = d.height; + } +} |
