/*
Violet - A program for editing UML diagrams.
Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.horstmann.violet.framework;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.Serializable;
import java.util.List;
/**
A node in a graph.
*/
public interface Node extends Serializable, Cloneable
{
/**
Draw the node.
@param g2 the graphics context
*/
void draw(Graphics2D g2);
/**
Translates the node by a given amount
@param dx the amount to translate in the x-direction
@param dy the amount to translate in the y-direction
*/
void translate(double dx, double dy);
/**
Tests whether the node contains a point.
@param aPoint the point to test
@return true if this node contains aPoint
*/
boolean contains(Point2D aPoint);
/**
Get the best connection point to connect this node
with another node. This should be a point on the boundary
of the shape of this node.
@param d the direction from the center
of the bounding rectangle towards the boundary
@return the recommended connection point
*/
Point2D getConnectionPoint(Direction d);
/**
Get the bounding rectangle of the shape of this node
@return the bounding rectangle
*/
Rectangle2D getBounds();
/**
Adds an edge that originates at this node.
@param p the point that the user selected as
the starting point. This may be used as a hint if
edges are ordered.
@param e the edge to add
@return true if the edge was added
*/
boolean addEdge(Edge e, Point2D p1, Point2D p2);
/**
Adds a node as a child node to this node.
@param n the child node
@param p the point at which the node is being added
@return true if this node accepts the given node as a child
*/
boolean addNode(Node n, Point2D p);
/**
Notifies this node that an edge is being removed.
@param g the ambient graph
@param e the edge to be removed
*/
void removeEdge(Graph g, Edge e);
/**
Notifies this node that a node is being removed.
@param g the ambient graph
@param n the node to be removed
*/
void removeNode(Graph g, Node n);
/**
Lays out the node and its children.
@param g the ambient graph
@param g2 the graphics context
@param grid the grid to snap to
*/
void layout(Graph g, Graphics2D g2, Grid grid);
/**
Gets the parent of this node.
@return the parent node, or null if the node
has no parent
*/
Node getParent();
/**
Sets the parent of this node.
@param node the parent node, or null if the node
has no parent
*/
void setParent(Node node);
/**
Gets the children of this node.
@return an unmodifiable list of the children
*/
List getChildren();
/**
Adds a child node.
@param index the position at which to add the child
@param node the child node to add
*/
void addChild(int index, Node node);
/**
Removes a child node.
@param node the child to remove.
*/
void removeChild(Node node);
Object clone();
}