diff options
Diffstat (limited to 'plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/query/RangeComparator.java')
-rw-r--r-- | plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/query/RangeComparator.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/query/RangeComparator.java b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/query/RangeComparator.java new file mode 100644 index 0000000000..c1efc1fb03 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.sequence/src/org/eclipse/sirius/diagram/sequence/business/internal/query/RangeComparator.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2011 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.diagram.sequence.business.internal.query; + +import java.io.Serializable; +import java.util.Comparator; +import java.util.List; + +import org.eclipse.sirius.diagram.sequence.business.internal.elements.ISequenceElement; +import org.eclipse.sirius.diagram.sequence.business.internal.elements.ISequenceEvent; +import org.eclipse.sirius.diagram.sequence.business.internal.elements.SequenceDiagram; +import org.eclipse.sirius.diagram.sequence.ordering.EventEnd; +import org.eclipse.sirius.diagram.sequence.util.Range; + +/** + * {@link Comparator} used to order Set of {@link ISequenceElement} according to + * their {@link Range#getLowerBound()}. + * + * @author <a href="mailto:esteban.dugueperoux@obeo.fr">Esteban Dugueperoux</a> + */ +public class RangeComparator implements Comparator<ISequenceElement>, Serializable { + + /** + * Generated SUID. + */ + private static final long serialVersionUID = -8968333614931292746L; + + /** + * Overridden to compare {@link ISequenceElement} order according to their + * {@link Range}. + * + * {@inheritDoc} + */ + public int compare(ISequenceElement sequenceElement1, ISequenceElement sequenceElement2) { + Range sequenceElement1Range = Range.verticalRange(sequenceElement1.getProperLogicalBounds()); + Range sequenceElement2Range = Range.verticalRange(sequenceElement2.getProperLogicalBounds()); + int comparison = sequenceElement1Range.getLowerBound() - sequenceElement2Range.getLowerBound(); + if (comparison == 0) { + if (sequenceElement1 instanceof ISequenceEvent && sequenceElement2 instanceof ISequenceEvent) { + ISequenceEvent sequenceEvent1 = (ISequenceEvent) sequenceElement1; + ISequenceEvent sequenceEvent2 = (ISequenceEvent) sequenceElement2; + + SequenceDiagram sequenceDiagram = sequenceElement1.getDiagram(); + + List<EventEnd> sequenceEvent1EventEnds = sequenceDiagram.findEnds(sequenceEvent1); + List<EventEnd> sequenceEvent2EventEnds = sequenceDiagram.findEnds(sequenceEvent2); + + if (!sequenceEvent1EventEnds.isEmpty() && !sequenceEvent2EventEnds.isEmpty()) { + EventEnd firstEventEndOfSequenceEvent1 = sequenceEvent1EventEnds.get(0); + EventEnd firstEventEndOfSequenceEvent2 = sequenceEvent2EventEnds.get(0); + List<EventEnd> eventEnds = sequenceDiagram.getSequenceDDiagram().getGraphicalOrdering().getEventEnds(); + comparison = eventEnds.indexOf(firstEventEndOfSequenceEvent1) - eventEnds.indexOf(firstEventEndOfSequenceEvent2); + } + } + + } + return comparison; + } + +} |