Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Redor2017-08-24 08:29:37 +0000
committerLaurent Redor2017-08-31 08:46:16 +0000
commit53ac4e417ad148254376b2ff489a6a32d6946ae4 (patch)
treeb041142eb38d5c28d91c1a66229025d525991607
parentd8c7667824651c5776c402236724e68f1150a931 (diff)
downloadorg.eclipse.sirius-53ac4e417ad148254376b2ff489a6a32d6946ae4.tar.gz
org.eclipse.sirius-53ac4e417ad148254376b2ff489a6a32d6946ae4.tar.xz
org.eclipse.sirius-53ac4e417ad148254376b2ff489a6a32d6946ae4.zip
[521356] Fix bug when resizing an Execution to the parent limit bounds
The AbstractNodeEventResizeSelectionValidator did not consider the margins/constraints that were considered by the layout (SequenceVerticalLayout). So the resize was authorized but parent was then resized to respect the constraints. This commit uses the getValidSubEventsRange() of execution's parent instead of just getVerticalRange(). It also fixes: * the valid sub events range of a LifeLine. * the correct CombinedFragment location check in AbstractInteractionFrameValidator * an incomplete condition added for bug 518246 in commit c6ad066e [1]. [1] http://git.eclipse.org/c/sirius/org.eclipse.sirius.git/diff/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java?id=c6ad066eb1f59f2e802c968edcc36b83ef1a4e22 Bug: 521356 Change-Id: Iaf099503644ab1a5a15c827d8ad5d5d6db7c053a Signed-off-by: Laurent Redor <laurent.redor@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractInteractionFrameValidator.java7
-rw-r--r--plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java4
-rw-r--r--plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/elements/Lifeline.java4
-rw-r--r--plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/util/Range.java21
-rw-r--r--plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/util/RangeTests.java46
5 files changed, 71 insertions, 11 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractInteractionFrameValidator.java b/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractInteractionFrameValidator.java
index 4e7944d0ad..20ec5d74f4 100644
--- a/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractInteractionFrameValidator.java
+++ b/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractInteractionFrameValidator.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010 THALES GLOBAL SERVICES.
+ * Copyright (c) 2010, 2017 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
@@ -24,7 +24,6 @@ import org.eclipse.sirius.diagram.sequence.business.internal.elements.Interactio
import org.eclipse.sirius.diagram.sequence.business.internal.elements.Lifeline;
import org.eclipse.sirius.diagram.sequence.business.internal.elements.Operand;
import org.eclipse.sirius.diagram.sequence.business.internal.elements.State;
-import org.eclipse.sirius.diagram.sequence.business.internal.layout.LayoutConstants;
import org.eclipse.sirius.diagram.sequence.ui.tool.internal.util.RequestQuery;
import org.eclipse.sirius.diagram.sequence.util.Range;
@@ -232,7 +231,7 @@ public abstract class AbstractInteractionFrameValidator {
Iterator<ISequenceEvent> iterator = unMovedParents.iterator();
while (checked && iterator.hasNext()) {
ISequenceEvent parent = iterator.next();
- Range parentRange = parent.getVerticalRange();
+ Range parentRange = parent.getValidSubEventsRange();
if (expansionZone != null && !expansionZone.isEmpty()) {
parentRange = new Range(parentRange.getLowerBound(), parentRange.getUpperBound() + expansionZone.width());
@@ -241,7 +240,7 @@ public abstract class AbstractInteractionFrameValidator {
* We make two tests separately so that is is easier when debugging
* to determine which of the conditions went wrong, if any.
*/
- boolean interactionInRange = parentRange.includes(finalRange.grown(LayoutConstants.EXECUTION_CHILDREN_MARGIN));
+ boolean interactionInRange = parentRange.includes(finalRange);
checked = checked && interactionInRange;
}
diff --git a/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java b/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java
index 6f11199e89..6c0493a43f 100644
--- a/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java
+++ b/plugins/org.eclipse.sirius.diagram.sequence.ui/src/org/eclipse/sirius/diagram/sequence/ui/tool/internal/edit/validator/AbstractNodeEventResizeSelectionValidator.java
@@ -185,12 +185,12 @@ public class AbstractNodeEventResizeSelectionValidator {
* Expansion of the last operand is valid and triggers a zone expansion.
*/
if (requestQuery.isResize()) {
- if (parent instanceof Operand && ((Operand) parent).getCombinedFragment().getLastOperand().equals(parent)) {
+ if (parent instanceof Operand && requestQuery.isResizeFromBottom() && ((Operand) parent).getCombinedFragment().getLastOperand().equals(parent)) {
okForParent = parent.getVerticalRange().getLowerBound() < RangeHelper.verticalRange(newBounds).getLowerBound();
if (parent.getVerticalRange().getUpperBound() < RangeHelper.verticalRange(newBounds).getUpperBound()) {
expansionZone = new Range(parent.getVerticalRange().getUpperBound(), RangeHelper.verticalRange(newBounds).getUpperBound() + LayoutConstants.EXECUTION_CHILDREN_MARGIN);
}
- } else if (!parent.getVerticalRange().includes(RangeHelper.verticalRange(newBounds))) {
+ } else if (!parent.getValidSubEventsRange().includes(RangeHelper.verticalRange(newBounds))) {
okForParent = false;
}
}
diff --git a/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/elements/Lifeline.java b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/elements/Lifeline.java
index 0314d05ea9..d75c872d12 100644
--- a/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/elements/Lifeline.java
+++ b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/elements/Lifeline.java
@@ -187,8 +187,8 @@ public class Lifeline extends AbstractSequenceNode implements ISequenceEvent {
@Override
public Range getValidSubEventsRange() {
Range result = getVerticalRange();
- if (result.width() > 2 * LayoutConstants.EXECUTION_CHILDREN_MARGIN) {
- result = result.shrinked(LayoutConstants.EXECUTION_CHILDREN_MARGIN);
+ if (result.width() > LayoutConstants.TIME_START_MIN_OFFSET) {
+ result = result.shifted(LayoutConstants.TIME_START_MIN_OFFSET).reduced(LayoutConstants.TIME_START_MIN_OFFSET);
}
return result;
}
diff --git a/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/util/Range.java b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/util/Range.java
index bf30eaa0ef..5eacb8131a 100644
--- a/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/util/Range.java
+++ b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/util/Range.java
@@ -336,7 +336,7 @@ public class Range {
*
* @param distance
* the positive distance to shrink this range.
- * @return the new grown range.
+ * @return the new shrinked range.
*/
public Range shrinked(int distance) {
Preconditions.checkArgument(distance >= 0);
@@ -349,6 +349,25 @@ public class Range {
}
/**
+ * Returns a new range corresponding to this range reduced by the specified size (which must be positive). Reducing
+ * an empty range produces an empty range. Otherwise the resulting range has a smaller width than original (- size).
+ * The lower bound value of this range is kept constant.
+ *
+ * @param size
+ * the positive size to reduce this range.
+ * @return the new reduced range.
+ */
+ public Range reduced(int size) {
+ Preconditions.checkArgument(size >= 0);
+ if (isEmpty()) {
+ return Range.EMPTY_RANGE;
+ } else {
+ Preconditions.checkArgument(width() - size >= 0);
+ return new Range(lower, upper - size);
+ }
+ }
+
+ /**
* Returns a percentage of how much the given absolute number is inside this
* range.
*
diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/util/RangeTests.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/util/RangeTests.java
index 0683db7123..a3a5733c5b 100644
--- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/util/RangeTests.java
+++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/diagram/sequence/util/RangeTests.java
@@ -15,11 +15,11 @@ import java.util.Collections;
import java.util.List;
import java.util.Random;
-import junit.framework.TestCase;
-
import org.eclipse.sirius.diagram.sequence.business.internal.RangeHelper;
import org.eclipse.sirius.diagram.sequence.util.Range;
+import junit.framework.TestCase;
+
/**
* Tests for the {@link Range} utility class.
*
@@ -310,6 +310,48 @@ public class RangeTests extends TestCase {
assertEquals(new Range(0, 1), result);
}
+ public void testReduceEmptyRange() {
+ Range r = Range.emptyRange();
+ Range result = r.reduced(10);
+ assertNotNull(result);
+ assertTrue(result.isEmpty());
+ }
+
+ public void testReduceRangeByZero() {
+ Range r = new Range(1, 2);
+ Range result = r.reduced(0);
+ assertNotNull(result);
+ assertEquals(r, result);
+ }
+
+ public void testReduceRangeByPositivSize() {
+ Range r = new Range(1, 10);
+ Range result = r.reduced(1);
+ assertNotNull(result);
+ assertEquals(new Range(1, 9), result);
+ }
+
+ public void testReduceRangeByNegativeSize() {
+ Range r = new Range(1, 10);
+ try {
+ r.reduced(-1);
+ fail("An illegal argument exception is expected");
+ } catch (IllegalArgumentException e) {
+ // ok
+ }
+ }
+
+ public void testReduceRangeByIllegalDistance() {
+ Range r = new Range(1, 2);
+
+ try {
+ r.reduced(2);
+ fail("An illegal argument exception is expected");
+ } catch (IllegalArgumentException e) {
+ // ok
+ }
+ }
+
public void testRangeOrderingByLowerBound() {
Range r1 = new Range(1, 2);
Range r2 = new Range(2, 3);

Back to the top