/* * @(#)ConnectionFigure.java * * Copyright (c) 1996-2010 The authors and contributors of JHotDraw. * You may not use, copy or modify this file, except in compliance with the * accompanying license terms. */ package org.jhotdraw.draw; import org.jhotdraw.geom.BezierPath; import javax.annotation.Nullable; import org.jhotdraw.draw.liner.Liner; import org.jhotdraw.draw.connector.Connector; import java.awt.geom.*; /** * A <em>connection figure</em> connects two figures with a * {@link org.jhotdraw.geom.BezierPath}. * <p> * The location of the start and end points of the bezier path is defined by * {@link Connector} objects, which are supplied by the connected figures. * <p> * If a connected figure is removed, the connection figure needs to be * removed as well. To achieve this, {@code ConnectionFigure} listens to * {@code figureRemoved} events sent by the two figures that it connects, and * then fires a {@code requestRemove} event to get removed as well. * <p> * The bezier path of the connection figure can be laid out using a {@link Liner}. * * <hr> * <b>Design Patterns</b> * * <p><em>Framework</em><br> * Two figures can be connected using a connection figure. The location of * the start or end point of the connection is handled by a connector object * at each connected figure.<br> * Contract: {@link org.jhotdraw.draw.Figure}, * {@link org.jhotdraw.draw.ConnectionFigure}, * {@link org.jhotdraw.draw.connector.Connector}, * {@link org.jhotdraw.draw.tool.ConnectionTool}. * * <p><em>Strategy</em><br> * The control points of the bezier path of a connection figure can be laid out * using different layout algorithms which are implemented by a liner object.<br> * Context: {@link ConnectionFigure}; Strategy: {@link Liner}. * * <p><em>Strategy</em><br> * The location of the start and end points of a connection figure are determined * by {@code Connector}s which are owned by the connected figures.<br> * Context: {@link Figure}, {@link ConnectionFigure}; Strategy: {@link Connector}. * <hr> * * @author Werner Randelshofer * @version $Id$ */ public interface ConnectionFigure extends Figure { // DRAWING // SHAPE AND BOUNDS // ATTRIBUTES // EDITING // CONNECTING /** * Sets the start {@code Connector} of the connection. * Set this to null to disconnect the start connection. * @param start the start Connector of the connection */ public void setStartConnector(@Nullable Connector start); /** * Gets the start {@code Connector}. * Returns null, if there is no start connection. */ @Nullable public Connector getStartConnector(); /** * Sets the end Connector of the connection. * Set this to null to disconnect the end connection. * @param end the end Connector of the connection */ public void setEndConnector(@Nullable Connector end); /** * Gets the end Connector. * Returns null, if there is no end connection. */ @Nullable public Connector getEndConnector(); /** * Updates the start and end point of the figure and fires figureChanged * events. */ public void updateConnection(); /** * Returns true, if this ConnectionFigure can connect the specified * {@code Connector}s. * Implement this method to constrain the allowed connections between figures. */ public boolean canConnect(Connector start, Connector end); /** * Checks if this {@code ConnectionFigure} can be connect to the specified * {@code Connector}. * This is used to provide an early feedback to the user, when he/she * creates a new connection. */ public boolean canConnect(Connector start); /** * Sets the start point. */ public void setStartPoint(Point2D.Double p); /** * Sets the end point. */ public void setEndPoint(Point2D.Double p); /** * Sets the specified point. */ public void setPoint(int index, Point2D.Double p); /** * Gets the node count. */ public int getNodeCount(); /** * Returns the specified point. */ public Point2D.Double getPoint(int index); /** * Returns the specified node. */ public BezierPath.Node getNode(int index); /** * Sets the specified node. */ public void setNode(int index, BezierPath.Node node); /** * Gets the start point. */ @Override public Point2D.Double getStartPoint(); /** * Gets the end point. */ @Override public Point2D.Double getEndPoint(); /** * Gets the start figure of the connection. * This is a convenience method for doing getStartConnector().getOwner() * and handling null cases. */ @Nullable public Figure getStartFigure(); /** * Gets the end figure of the connection. * This is a convenience method for doing getEndConnector().getOwner() * and handling null cases. */ @Nullable public Figure getEndFigure(); // COMPOSITE FIGURES /** * Get a Liner object which encapsulated a lineout * algorithm for this figure. Typically, a Liner * accesses the child components of this figure and arranges * their graphical presentation. * * @return lineout strategy used by this figure */ @Nullable public Liner getLiner(); /** * Set a Liner object which encapsulated a lineout * algorithm for this figure. Typically, a Liner * accesses the child components of this figure and arranges * their graphical presentation. * * @param newValue encapsulation of a lineout algorithm. */ public void setLiner(@Nullable Liner newValue); /** * A "lineout" algorithm is used to define how the child components * should be laid out in relation to each other. The task for * layouting the child components for presentation is delegated * to a Liner which can be plugged in at runtime. */ public void lineout(); // CLONING // EVENT HANDLING }