Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxime Porhel2015-09-07 08:45:26 +0000
committerMaxime Porhel2015-09-09 14:18:12 +0000
commite85adf6457e45c6c2f2a759c78bba4903ff19f49 (patch)
tree207029461846a5a029dfbffc92a211e806b0b338
parent72679befcaa59c8135ab45198e53be6100efd344 (diff)
downloadorg.eclipse.sirius-e85adf6457e45c6c2f2a759c78bba4903ff19f49.tar.gz
org.eclipse.sirius-e85adf6457e45c6c2f2a759c78bba4903ff19f49.tar.xz
org.eclipse.sirius-e85adf6457e45c6c2f2a759c78bba4903ff19f49.zip
[470859] Do not display a border when borderSize=0
- Also change the border kind when borderSize changes from/to 0. - Update the one line position during border refresh - Homogenize isFirst/LastRegion methods - Reduce duplication in method looking for the parent stack direction Bug 465211 enabled the compartment and list without border but it did not handle the Region case. Bug: 470859 Change-Id: I2bd1c955a667c369bc8e265f8094110629b9e22b Signed-off-by: Maxime Porhel <maxime.porhel@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/api/part/AbstractDiagramElementContainerEditPart.java38
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/edit/internal/part/DiagramContainerEditPartOperation.java138
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/RegionResizableEditPolicy.java13
-rw-r--r--plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/refresh/GMFHelper.java8
4 files changed, 108 insertions, 89 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 97cfae6b10..4cffa47282 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
@@ -16,8 +16,6 @@ import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.geometry.Dimension;
@@ -72,7 +70,6 @@ import org.eclipse.sirius.diagram.ui.edit.internal.part.DiagramContainerEditPart
import org.eclipse.sirius.diagram.ui.edit.internal.part.DiagramElementEditPartOperation;
import org.eclipse.sirius.diagram.ui.edit.internal.validators.ResizeValidator;
import org.eclipse.sirius.diagram.ui.graphical.edit.policies.SiriusGraphicalNodeEditPolicy;
-import org.eclipse.sirius.diagram.ui.internal.edit.parts.AbstractDNodeContainerCompartmentEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.AbstractDiagramElementContainerNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNode4EditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.policies.NonResizableAndNonDuplicableEditPolicy;
@@ -85,18 +82,15 @@ 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;
import org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerRectangleFigureDesc;
-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.RegionRoundedGradientRectangle;
-import org.eclipse.sirius.diagram.ui.tools.internal.figure.RoundedCornerMarginBorder;
import org.eclipse.sirius.diagram.ui.tools.internal.util.NotificationQuery;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.ext.base.Options;
import org.eclipse.sirius.viewpoint.DStylizable;
import org.eclipse.sirius.viewpoint.description.style.LabelBorderStyleDescription;
-import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
/**
@@ -338,28 +332,7 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo
* the figure which needs a border.
*/
protected void configureBorder(IFigure shapeFigure) {
- if (isRegion() && shapeFigure != null) {
- if (isFirstRegionPart()) {
- shapeFigure.setBorder(new MarginBorder(IContainerLabelOffsets.LABEL_OFFSET, 0, 0, 0));
- } else {
- 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);
- }
- }
- }
- }
-
- private boolean isFirstRegionPart() {
- EditPart parent = getParent();
- if (parent instanceof AbstractDNodeContainerCompartmentEditPart) {
- Iterable<AbstractDiagramElementContainerEditPart> regionParts = Iterables.filter(parent.getChildren(), AbstractDiagramElementContainerEditPart.class);
- return !Iterables.isEmpty(regionParts) && regionParts.iterator().next() == this;
- }
- return false;
+ DiagramContainerEditPartOperation.configureBorder(this, shapeFigure);
}
/**
@@ -400,15 +373,6 @@ public abstract class AbstractDiagramElementContainerEditPart extends AbstractBo
@Override
protected void refreshVisuals() {
- if (primaryShape != null) {
- if (isRegion()) {
- final boolean firstRegion = isFirstRegionPart();
- if (firstRegion && primaryShape.getBorder() instanceof LineBorder || !firstRegion && primaryShape.getBorder() instanceof MarginBorder) {
- configureBorder(primaryShape);
- }
- }
- }
-
super.refreshVisuals();
DiagramContainerEditPartOperation.refreshVisuals(this);
}
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 5c2bb8ece3..ac4fb25784 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
@@ -13,6 +13,7 @@ package org.eclipse.sirius.diagram.ui.edit.internal.part;
import java.util.BitSet;
import java.util.Collection;
+import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.draw2d.MarginBorder;
@@ -292,44 +293,59 @@ public final class DiagramContainerEditPartOperation {
DiagramElementEditPartOperation.setLineStyle(nodeFigure, borderLineStyle);
}
- // Do not add the container label offset margin if there is no
- // visible label.
- int labelOffset = IContainerLabelOffsets.LABEL_OFFSET;
- if (primaryShape.getLabelFigure() == null || !primaryShape.getLabelFigure().isVisible()) {
- labelOffset = 0;
- }
+ if (primaryShape != null) {
+ // We might need to reinit the kind of border : LineBorder will
+ // always display a 1 pix line even if we configure it with a 0 line
+ // width.
+ configureBorder(self, primaryShape, borderSize != 0);
+
+ // Do not add the container label offset margin if there is no
+ // visible label.
+ int labelOffset = IContainerLabelOffsets.LABEL_OFFSET;
+ if (primaryShape.getLabelFigure() == null || !primaryShape.getLabelFigure().isVisible()) {
+ labelOffset = 0;
+ }
+
+ // Handle border line style, corner dimension and/or margin
+ if (primaryShape.getBorder() instanceof LineBorder) {
+ LineBorder lineBorder = (LineBorder) primaryShape.getBorder();
+ lineBorder.setWidth(borderSize);
+ DiagramElementEditPartOperation.setLineStyle(lineBorder, borderLineStyle);
+ if (lineBorder instanceof OneLineMarginBorder) {
+ OneLineMarginBorder oneLineBorder = (OneLineMarginBorder) lineBorder;
+ oneLineBorder.setMargin(labelOffset, 0, 0, 0);
+
+ if (parentStackDirection == PositionConstants.NORTH_SOUTH) {
+ oneLineBorder.setPosition(PositionConstants.TOP);
+ } else if (parentStackDirection == PositionConstants.NORTH_SOUTH) {
+ oneLineBorder.setPosition(PositionConstants.LEFT);
+ }
- // Handle border line style, corner dimension and/or margin
- if (primaryShape != null && primaryShape.getBorder() instanceof LineBorder) {
- LineBorder lineBorder = (LineBorder) primaryShape.getBorder();
- lineBorder.setWidth(borderSize);
- DiagramElementEditPartOperation.setLineStyle(lineBorder, borderLineStyle);
- if (lineBorder instanceof OneLineMarginBorder) {
- ((OneLineMarginBorder) lineBorder).setMargin(labelOffset, 0, 0, 0);
- if (self.isRegion() && lineBorder instanceof RoundedCornerMarginBorder) {
- ((RoundedCornerMarginBorder) lineBorder).setCornerDimensions(getCornerDimension(self));
+ if (self.isRegion() && lineBorder instanceof RoundedCornerMarginBorder) {
+ ((RoundedCornerMarginBorder) lineBorder).setCornerDimensions(getCornerDimension(self));
+ }
}
+ } else if (primaryShape.getBorder() instanceof MarginBorder) {
+ MarginBorder margin = null;
+ int borderMagin = borderSize;
+ switch (parentStackDirection) {
+ case PositionConstants.NORTH_SOUTH:
+ borderMagin = isFirstRegionPart(self) ? 0 : Math.max(0, borderSize - 1);
+ margin = new MarginBorder(borderMagin + labelOffset, 0, 0, 0);
+ break;
+ case PositionConstants.EAST_WEST:
+ borderMagin = isFirstRegionPart(self) ? 0 : borderSize;
+ margin = new MarginBorder(labelOffset, borderMagin, 0, 0);
+ break;
+ case PositionConstants.NONE:
+ default:
+ // Keep the old behavior : min margin size= 4
+ // The current container is not a region, the figure has
+ // been added to the content pane.
+ margin = new MarginBorder(borderMagin + labelOffset - 1, borderMagin, borderMagin, borderMagin);
+ }
+ primaryShape.setBorder(margin);
}
- } else if (primaryShape != null && primaryShape.getBorder() instanceof MarginBorder) {
- MarginBorder margin = null;
- int borderMagin = borderSize;
- switch (parentStackDirection) {
- case PositionConstants.NORTH_SOUTH:
- borderMagin = isFirstRegionPart(self) ? 0 : Math.max(0, borderSize - 1);
- margin = new MarginBorder(borderMagin + labelOffset, 0, 0, 0);
- break;
- case PositionConstants.EAST_WEST:
- borderMagin = isFirstRegionPart(self) ? 0 : borderSize;
- margin = new MarginBorder(labelOffset, borderMagin, 0, 0);
- break;
- case PositionConstants.NONE:
- default:
- // Keep the old behavior : min margin size= 4
- // The current container is not a region, the figure has
- // been added to the content pane.
- margin = new MarginBorder(borderMagin + labelOffset - 1, borderMagin, borderMagin, borderMagin);
- }
- primaryShape.setBorder(margin);
}
return primaryShape;
}
@@ -455,4 +471,56 @@ public final class DiagramContainerEditPartOperation {
}
return bgStyle;
}
+
+ /**
+ * Configure the border : set or replace the border when it needs to be
+ * changed. This can occurs for Regions when the region position changes or
+ * when the border size changes from 0 or to 0.
+ *
+ * The refreshBorder method will then update all the border features during
+ * refreshVisual().
+ *
+ * @param self
+ * the current part
+ * @param shapeFigure
+ * the shape to configure
+ */
+ public static void configureBorder(AbstractDiagramElementContainerEditPart self, IFigure shapeFigure) {
+ boolean border = true;
+ final DDiagramElement diagElement = self.resolveDiagramElement();
+ if (diagElement instanceof DDiagramElementContainer) {
+ final DDiagramElementContainer ddec = (DDiagramElementContainer) diagElement;
+ final ContainerStyle style = ddec.getOwnedStyle();
+ if (style != null && style.getBorderSize() != null) {
+ border = style.getBorderSize().intValue() != 0;
+ }
+ }
+ configureBorder(self, shapeFigure, border);
+ }
+
+ private static void configureBorder(AbstractDiagramElementContainerEditPart self, IFigure shapeFigure, boolean border) {
+ if (self.isRegion() && shapeFigure != null) {
+ Border newBorder = null;
+ if (isFirstRegionPart(self) || !border) {
+ if (!(shapeFigure.getBorder() instanceof MarginBorder)) {
+ newBorder = new MarginBorder(IContainerLabelOffsets.LABEL_OFFSET, 0, 0, 0);
+ }
+ } else if (!(shapeFigure.getBorder() instanceof RoundedCornerMarginBorder)) {
+ int position = PositionConstants.TOP;
+ if (self.getParentStackDirection() == PositionConstants.EAST_WEST) {
+ position = PositionConstants.LEFT;
+ }
+
+ RoundedCornerMarginBorder oneLineBorder = new RoundedCornerMarginBorder(position);
+ oneLineBorder.setCornerDimensions(getCornerDimension(self));
+ oneLineBorder.setMargin(IContainerLabelOffsets.LABEL_OFFSET, 0, 0, 0);
+
+ newBorder = oneLineBorder;
+ }
+
+ if (newBorder != null) {
+ shapeFigure.setBorder(newBorder);
+ }
+ }
+ }
}
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 58ac59ce5a..2e374577df 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
@@ -29,9 +29,7 @@ import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.DDiagramElementContainer;
-import org.eclipse.sirius.diagram.DNodeContainer;
import org.eclipse.sirius.diagram.business.internal.query.DDiagramElementContainerExperimentalQuery;
-import org.eclipse.sirius.diagram.business.internal.query.DNodeContainerExperimentalQuery;
import org.eclipse.sirius.diagram.ui.business.internal.query.RequestQuery;
import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramElementContainerEditPart;
import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramElementEditPart;
@@ -467,16 +465,7 @@ public class RegionResizableEditPolicy extends AirResizableEditPolicy {
int direction = PositionConstants.NONE;
EditPart hostPart = getHost();
if (hostPart instanceof AbstractDiagramElementContainerEditPart) {
- IDiagramElementEditPart ideep = (IDiagramElementEditPart) hostPart;
- DDiagramElement dde = ideep.resolveDiagramElement();
- if (dde != null && dde.eContainer() instanceof DNodeContainer) {
- DNodeContainerExperimentalQuery query = new DNodeContainerExperimentalQuery((DNodeContainer) dde.eContainer());
- if (query.isVerticalStackContainer()) {
- direction = PositionConstants.NORTH_SOUTH;
- } else if (query.isHorizontaltackContainer()) {
- direction = PositionConstants.EAST_WEST;
- }
- }
+ direction = ((AbstractDiagramElementContainerEditPart) hostPart).getParentStackDirection();
}
return direction;
}
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/refresh/GMFHelper.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/refresh/GMFHelper.java
index 358b72ad17..b5e6b0f4c3 100644
--- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/refresh/GMFHelper.java
+++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/refresh/GMFHelper.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2012 THALES GLOBAL SERVICES.
+ * Copyright (c) 2011, 2015 THALES GLOBAL SERVICES.
* 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
@@ -19,7 +19,6 @@ 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.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
@@ -37,7 +36,6 @@ import org.eclipse.gmf.runtime.notation.datatype.RelativeBendpoint;
import org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil;
import org.eclipse.sirius.diagram.AbstractDNode;
import org.eclipse.sirius.diagram.ContainerStyle;
-import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.DDiagramElementContainer;
import org.eclipse.sirius.diagram.DNode;
import org.eclipse.sirius.diagram.DNodeContainer;
@@ -199,8 +197,8 @@ public final class GMFHelper {
private static boolean isFirstRegion(DDiagramElementContainer ddec) {
EObject potentialRegionContainer = ddec.eContainer();
if (potentialRegionContainer instanceof DNodeContainer) {
- EList<DDiagramElement> regions = ((DNodeContainer) potentialRegionContainer).getOwnedDiagramElements();
- return !regions.isEmpty() && ddec == regions.get(0);
+ Iterable<DDiagramElementContainer> regions = Iterables.filter(((DNodeContainer) potentialRegionContainer).getOwnedDiagramElements(), DDiagramElementContainer.class);
+ return !Iterables.isEmpty(regions) && ddec == Iterables.getFirst(regions, null);
}
return false;
}

Back to the top