diff options
| author | Maxime Porhel | 2015-09-07 08:45:26 +0000 |
|---|---|---|
| committer | Maxime Porhel | 2015-09-09 14:18:12 +0000 |
| commit | e85adf6457e45c6c2f2a759c78bba4903ff19f49 (patch) | |
| tree | 207029461846a5a029dfbffc92a211e806b0b338 | |
| parent | 72679befcaa59c8135ab45198e53be6100efd344 (diff) | |
| download | org.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>
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; } |
