Search in sources :

Example 1 with IRoundedRectangleFigure

use of com.archimatetool.editor.diagram.figures.IRoundedRectangleFigure in project archi by archimatetool.

the class RoundedRectangleAnchor method getLocation.

/**
 * Calculates the position with ChopboxAnchor#getLocation() and if the
 * anchor is not at the rounded corners, the result is returned. If the
 * anchor point should be at a corner, the rectangle for the ellipse is
 * determined and ellipseAnchorGetLocation returns the two intersection
 * points between the line from calculated anchor point and the center of
 * the rounded rectangle.
 *
 * @return The anchor location
 */
@Override
public Point getLocation(final Point ref) {
    Dimension corner = new Dimension(0, 0);
    if (getOwner() instanceof IRoundedRectangleFigure) {
        corner = ((IRoundedRectangleFigure) getOwner()).getArc();
    } else if (getOwner() instanceof RoundedRectangle) {
        corner = ((RoundedRectangle) getOwner()).getCornerDimensions();
    } else if (getOwner() instanceof AbstractDiagramModelObjectFigure) {
        IFigureDelegate figureDelegate = ((AbstractDiagramModelObjectFigure) getOwner()).getFigureDelegate();
        if (figureDelegate instanceof IRoundedRectangleFigure) {
            corner = ((IRoundedRectangleFigure) figureDelegate).getArc();
        }
    }
    corner = corner.scale(FigureUtils.getFigureScale(getOwner()));
    final Point location = super.getLocation(ref);
    final Rectangle r = Rectangle.SINGLETON;
    r.setBounds(getOwner().getBounds());
    r.translate(-1, -1);
    r.resize(1, 1);
    getOwner().translateToAbsolute(r);
    final int yTop = r.y + corner.height / 2;
    final int yBottom = r.y + r.height - corner.height / 2;
    final int xLeft = r.x + corner.width / 2;
    final int xRight = r.x + r.width - corner.width / 2;
    int pos = 0;
    if (location.x < xLeft) {
        pos = LEFT;
    } else if (location.x > xRight) {
        pos = RIGHT;
    } else {
        pos = MIDDLE;
    }
    if (location.y < yTop) {
        pos |= TOP;
    } else if (location.y > yBottom) {
        pos |= BOTTOM;
    } else {
        pos += CENTER;
    }
    switch(pos) {
        case TOP | MIDDLE:
        case CENTER | LEFT:
        case CENTER | RIGHT:
        case BOTTOM | MIDDLE:
            return new Point(location.x, location.y);
        case TOP | LEFT:
            return ellipseAnchorGetLocation(location, new Rectangle(r.x, r.y, corner.width, corner.height), // getOwner().getBounds().getCenter() // Jaiguru fix
            r.getCenter())[0];
        case TOP | RIGHT:
            return ellipseAnchorGetLocation(location, new Rectangle(r.x + r.width - corner.width, r.y, corner.width, corner.height), // getOwner().getBounds().getCenter() // Jaiguru fix
            r.getCenter())[1];
        case CENTER | MIDDLE:
            // default for reference inside Figure
            return new Point(r.x, r.y + r.height / 2);
        case BOTTOM | LEFT:
            return ellipseAnchorGetLocation(location, new Rectangle(r.x, r.y + r.height - corner.height, corner.width, corner.height), // getOwner().getBounds().getCenter() // Jaiguru fix
            r.getCenter())[0];
        case BOTTOM | RIGHT:
            return ellipseAnchorGetLocation(location, new Rectangle(r.x + r.width - corner.width, r.y + r.height - corner.height, corner.width, corner.height), // getOwner().getBounds().getCenter() // Jaiguru fix
            r.getCenter())[1];
        default:
            throw new IllegalStateException(// $NON-NLS-1$
            "Calculation of RoundedRectangleAnchor missed. Rect: " + r + " Point: " + // $NON-NLS-1$
            location);
    }
}
Also used : AbstractDiagramModelObjectFigure(com.archimatetool.editor.diagram.figures.AbstractDiagramModelObjectFigure) IFigureDelegate(com.archimatetool.editor.diagram.figures.IFigureDelegate) IRoundedRectangleFigure(com.archimatetool.editor.diagram.figures.IRoundedRectangleFigure) Rectangle(org.eclipse.draw2d.geometry.Rectangle) RoundedRectangle(org.eclipse.draw2d.RoundedRectangle) Dimension(org.eclipse.draw2d.geometry.Dimension) Point(org.eclipse.draw2d.geometry.Point) PrecisionPoint(org.eclipse.draw2d.geometry.PrecisionPoint) Point(org.eclipse.draw2d.geometry.Point) PrecisionPoint(org.eclipse.draw2d.geometry.PrecisionPoint) RoundedRectangle(org.eclipse.draw2d.RoundedRectangle)

Aggregations

AbstractDiagramModelObjectFigure (com.archimatetool.editor.diagram.figures.AbstractDiagramModelObjectFigure)1 IFigureDelegate (com.archimatetool.editor.diagram.figures.IFigureDelegate)1 IRoundedRectangleFigure (com.archimatetool.editor.diagram.figures.IRoundedRectangleFigure)1 RoundedRectangle (org.eclipse.draw2d.RoundedRectangle)1 Dimension (org.eclipse.draw2d.geometry.Dimension)1 Point (org.eclipse.draw2d.geometry.Point)1 PrecisionPoint (org.eclipse.draw2d.geometry.PrecisionPoint)1 Rectangle (org.eclipse.draw2d.geometry.Rectangle)1