| /***************************************************************************** |
| * Copyright (c) 2019 CEA LIST. |
| * |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Xavier Le Pallec (for CEA LIST) xlepallec@lilo.org - Bug 558456 |
| * |
| *****************************************************************************/ |
| |
| package org.eclipse.papyrus.uml.diagram.clazz.lf.associationlabellayout.locators.source; |
| |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.papyrus.uml.diagram.clazz.lf.associationlabellayout.locators.AbstractAssociatedSegment; |
| |
| /** |
| * This class specializes the abstract label for the source multiplicity label. |
| * Main specialization: the relocate method. |
| * |
| */ |
| public class MultiplicitySourceLabelLocator extends AbstractSourceLabelLocator { |
| |
| protected MultiplicitySourceLabelLocator(IFigure parent, Point offSet, int alignment, SourceLocatorFactory geoUtils) { |
| super(parent, offSet, alignment, geoUtils); |
| } |
| |
| /** |
| * Calculates the x and y of the source multiplicity label. |
| */ |
| @Override |
| public void relocate(IFigure target) { |
| |
| AbstractAssociatedSegment associatedSegment = getAssociatedSegment(target); |
| Point distantPoint = associatedSegment.getThePointDistantOf(getDistanceBetweenClassAndLabels()); |
| |
| Rectangle bothLabels = getRectangleForBothLabels(distantPoint); |
| |
| distantPoint.setX(getBasicXMultiplicity(bothLabels)); |
| distantPoint.setY(getBasicYPosition(bothLabels)); |
| |
| Rectangle classBounds = getAssociatedElementBounds(associatedSegment); |
| if (areLabelsAtTheSameHeightThanAssociatedClass(bothLabels, classBounds)) { |
| |
| if (doLabelsIntersectAssociatedClassOnTheLeft(bothLabels, classBounds)) { |
| distantPoint.setX(getXMultiplicityForIntersectOntheLeft(classBounds)); |
| } else if (doLabelsIntersectAssociatedClassOnTheRight(bothLabels, classBounds)) { |
| distantPoint.setX(getXMultiplicityForIntersectOntheRight(classBounds)); |
| } |
| } |
| |
| target.setLocation(distantPoint); |
| |
| } |
| |
| } |