| /******************************************************************************* |
| * Copyright (c) 2008 ILOG and others. |
| * 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: |
| * ILOG - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.draw2d.test; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.draw2d.AbstractConnectionAnchor; |
| import org.eclipse.draw2d.BendpointConnectionRouter; |
| import org.eclipse.draw2d.ColorConstants; |
| import org.eclipse.draw2d.FreeformLayeredPane; |
| import org.eclipse.draw2d.FreeformLayout; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.LightweightSystem; |
| import org.eclipse.draw2d.PolylineConnection; |
| import org.eclipse.draw2d.RectangleFigure; |
| import org.eclipse.draw2d.RelativeBendpoint; |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.PrecisionPoint; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.swt.widgets.Shell; |
| |
| /** |
| * @author Romain Raugi |
| */ |
| public class RelativeBendpointTest extends AbstractFixtureTestCase { |
| |
| private static class DiagramFigure extends FreeformLayeredPane { |
| public DiagramFigure() { |
| super(); |
| setLayoutManager(new FreeformLayout()); |
| setBackgroundColor(ColorConstants.white()); |
| setOpaque(true); |
| } |
| } |
| |
| private static class NodeFigure extends RectangleFigure { |
| public NodeFigure() { |
| super(); |
| setFill(true); |
| setBackgroundColor(ColorConstants.darkGray()); |
| } |
| } |
| |
| private static class FixedAnchor extends AbstractConnectionAnchor { |
| PrecisionPoint place; |
| |
| public FixedAnchor(IFigure owner) { |
| super(owner); |
| } |
| |
| public Point getLocation(Point loc) { |
| Rectangle r = getOwner().getBounds(); |
| double x = r.x + place.preciseX() * r.width; |
| double y = r.y + place.preciseY() * r.height; |
| Point p = new PrecisionPoint(x, y); |
| getOwner().translateToAbsolute(p); |
| return p; |
| } |
| |
| public Point getReferencePoint() { |
| return getLocation(null); |
| } |
| } |
| |
| private static class ConnectionFigure extends PolylineConnection { |
| public ConnectionFigure() { |
| setConnectionRouter(new BendpointConnectionRouter()); |
| } |
| } |
| |
| private Shell shell; |
| |
| private DiagramFigure diagram; |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| shell = new Shell(display); |
| shell.setSize(300, 350); |
| shell.open(); |
| shell.setText("RelativeBendpoint Test 4 Bug 237802"); |
| // the diagram |
| LightweightSystem lws = new LightweightSystem(shell); |
| diagram = new DiagramFigure(); |
| lws.setContents(diagram); |
| } |
| |
| protected void tearDown() throws Exception { |
| shell.close(); |
| super.tearDown(); |
| } |
| |
| public void test237802() { |
| // first node |
| NodeFigure source = new NodeFigure(); |
| source.setBounds(new Rectangle(50, 50, 50, 50)); |
| diagram.add(source); |
| // second node |
| NodeFigure target = new NodeFigure(); |
| target.setBounds(new Rectangle(150, 200, 50, 50)); |
| diagram.add(target); |
| // anchors |
| FixedAnchor sourceAnchor, targetAnchor; |
| sourceAnchor = new FixedAnchor(source); |
| sourceAnchor.place = new PrecisionPoint(.5, 1.); |
| targetAnchor = new FixedAnchor(target); |
| targetAnchor.place = new PrecisionPoint(.5, 0.); |
| // first connection |
| ConnectionFigure connection = new ConnectionFigure(); |
| connection.setSourceAnchor(sourceAnchor); |
| connection.setTargetAnchor(targetAnchor); |
| diagram.add(connection); |
| // bendpoints |
| RelativeBendpoint bendpoint1 = new RelativeBendpoint(connection); |
| RelativeBendpoint bendpoint2 = new RelativeBendpoint(connection); |
| bendpoint1.setRelativeDimensions(new Dimension(0, 50), new Dimension( |
| -100, -50)); |
| bendpoint1.setWeight(1f / 3f); |
| bendpoint2.setRelativeDimensions(new Dimension(100, 50), new Dimension( |
| 0, -50)); |
| bendpoint2.setWeight(2f / 3f); |
| List bendpoints = new ArrayList(2); |
| bendpoints.add(bendpoint1); |
| bendpoints.add(bendpoint2); |
| connection.setRoutingConstraint(bendpoints); |
| // expected the bendpoints to be at certain locations |
| Point p1 = bendpoint1.getLocation(); |
| Point p2 = bendpoint2.getLocation(); |
| assertEquals(p1.x, 75); |
| assertEquals(p1.y, 150); |
| assertEquals(p2.x, 175); |
| assertEquals(p2.y, 150); |
| } |
| |
| } |