org.jhotdraw.draw
Class AbstractFigure

java.lang.Object
  extended by org.jhotdraw.beans.AbstractBean
      extended by org.jhotdraw.draw.AbstractFigure
All Implemented Interfaces:
java.io.Serializable, java.lang.Cloneable, Figure, DOMStorable
Direct Known Subclasses:
AbstractAttributedFigure, AbstractCompositeFigure

public abstract class AbstractFigure
extends AbstractBean
implements Figure

This abstract class can be extended to implement a Figure.

Version:
$Id: AbstractFigure.java 575 2009-10-18 11:26:50Z rawcoder $
Author:
Werner Randelshofer
See Also:
Serialized Form

Field Summary
protected  int changingDepth
          This variable is used to prevent endless change loops.
private  Drawing drawing
           
private  boolean isRemovable
           
private  boolean isSelectable
           
private  boolean isTransformable
           
private  boolean isVisible
           
protected  javax.swing.event.EventListenerList listenerList
           
 
Fields inherited from class org.jhotdraw.beans.AbstractBean
propertySupport
 
Constructor Summary
AbstractFigure()
          Creates a new instance.
 
Method Summary
 void addFigureListener(FigureListener l)
          Adds a listener for FigureEvent's.
 void addNotify(Drawing d)
          Informs a figure, that it has been added to a drawing.
 AbstractFigure basicClone(java.util.HashMap<Figure,Figure> oldToNew)
           
 boolean canConnect()
          Checks if this figure can be connected.
 void changed()
          Informs that a figure changed the area of its display box.
 AbstractFigure clone()
          Returns a clone of the figure, with clones of all aggregated figures, such as children and decorators.
 java.util.Collection<Handle> createHandles(int detailLevel)
          Creates handles used to manipulate the figure.
 Connector findCompatibleConnector(Connector c, boolean isStart)
          Gets a compatible connector.
 Connector findConnector(java.awt.geom.Point2D.Double p, ConnectionFigure prototype)
          Returns the Figures connector for the specified location.
 Figure findFigureInside(java.awt.geom.Point2D.Double p)
          Finds the innermost figure at the specified location.
 void fireAreaInvalidated()
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireAreaInvalidated(FigureEvent event)
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireAreaInvalidated(java.awt.geom.Rectangle2D.Double invalidatedArea)
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireAttributeChanged(AttributeKey attribute, java.lang.Object oldValue, java.lang.Object newValue)
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireFigureAdded()
          Notify all listenerList that have registered interest for notification on this event type.
 void fireFigureChanged()
           
protected  void fireFigureChanged(FigureEvent event)
           
protected  void fireFigureChanged(java.awt.geom.Rectangle2D.Double changedArea)
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireFigureHandlesChanged()
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireFigureRemoved()
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireFigureRequestRemove()
          Notify all listenerList that have registered interest for notification on this event type.
protected  void fireUndoableEditHappened(javax.swing.undo.UndoableEdit edit)
          Notify all UndoableEditListener of the Drawing, to which this Figure has been added to.
 java.util.Collection<javax.swing.Action> getActions(java.awt.geom.Point2D.Double p)
          Returns a collection of actions which are presented to the user in a popup menu.
protected  int getChangingDepth()
           
 java.util.Collection<Connector> getConnectors(ConnectionFigure prototype)
          Returns all connectors of this Figure for the specified prototype of a ConnectionFigure.
 java.awt.Cursor getCursor(java.awt.geom.Point2D.Double p)
          Returns a cursor for the specified location.
 java.util.Collection<Figure> getDecomposition()
          Returns a decompositon of a figure into its parts.
protected  Drawing getDrawing()
           
 java.awt.geom.Point2D.Double getEndPoint()
          Returns the untransformed logical end point of the bounds.
protected  java.awt.font.FontRenderContext getFontRenderContext()
           
 int getLayer()
          Gets the layer number of the figure.
protected  java.lang.Object getLock()
           
 Dimension2DDouble getPreferredSize()
          The preferred size is used by Layouter to determine the preferred size of a Figure.
 java.awt.geom.Point2D.Double getStartPoint()
          Returns the untransformed logical start point of the bounds.
 Tool getTool(java.awt.geom.Point2D.Double p)
          Returns a specialized tool for the given coordinate.
 java.lang.String getToolTipText(java.awt.geom.Point2D.Double p)
          Returns a tooltip for the specified location on the figure.
 boolean handleDrop(java.awt.geom.Point2D.Double p, java.util.Collection<Figure> droppedFigures, DrawingView view)
          Handles a drop.
 boolean handleMouseClick(java.awt.geom.Point2D.Double p, java.awt.event.MouseEvent evt, DrawingView view)
          Handles a mouse click.
 boolean includes(Figure figure)
          Checks whether the given figure is contained in this figure.
protected  void invalidate()
          Invalidates cached data of the Figure.
protected  boolean isChanging()
           
 boolean isRemovable()
          Returns true, if the user may remove this figure.
 boolean isSelectable()
          Returns true, if the user may select this figure.
 boolean isTransformable()
          Returns true, if the user may transform this figure.
 boolean isVisible()
          A Figure is only drawn by a CompositeFigure, if it is visible.
 void remap(java.util.Map<Figure,Figure> oldToNew, boolean disconnectIfNotInMap)
          After cloning a collection of figures, the ConnectionFigures contained in this collection still connect to the original figures instead of to the clones.
 void removeFigureListener(FigureListener l)
          Removes a listener for FigureEvent's.
 void removeNotify(Drawing d)
          Informs a figure, that it has been removed from a drawing.
 void requestRemove()
          Fires a FigureListener.figureRequestRemove event.
 void setBounds(java.awt.geom.Point2D.Double anchor, java.awt.geom.Point2D.Double lead)
          Sets the logical and untransformed bounds of the figure.
 void setBounds(java.awt.geom.Rectangle2D.Double bounds)
           
 void setRemovable(boolean newValue)
           
 void setSelectable(boolean newValue)
           
 void setTransformable(boolean newValue)
           
 void setVisible(boolean newValue)
           
 java.lang.String toString()
           
protected  void validate()
           
 void willChange()
          Informs that a figure is about to change something that affects the contents of its display box.
 
Methods inherited from class org.jhotdraw.beans.AbstractBean
addPropertyChangeListener, addPropertyChangeListener, firePropertyChange, firePropertyChange, firePropertyChange, getPropertyChangeListeners, removePropertyChangeListener, removePropertyChangeListener
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.jhotdraw.draw.Figure
contains, draw, get, getAttributes, getAttributesRestoreData, getBounds, getDrawingArea, getTransformRestoreData, restoreAttributesTo, restoreTransformTo, set, transform
 
Methods inherited from interface org.jhotdraw.xml.DOMStorable
read, write
 

Field Detail

listenerList

protected javax.swing.event.EventListenerList listenerList

drawing

private Drawing drawing

isSelectable

private boolean isSelectable

isRemovable

private boolean isRemovable

isVisible

private boolean isVisible

isTransformable

private boolean isTransformable

changingDepth

protected int changingDepth
This variable is used to prevent endless change loops. We increase its value on each invocation of willChange() and decrease it on each invocation of changed().

Constructor Detail

AbstractFigure

public AbstractFigure()
Creates a new instance.

Method Detail

addFigureListener

public void addFigureListener(FigureListener l)
Description copied from interface: Figure
Adds a listener for FigureEvent's.

Specified by:
addFigureListener in interface Figure

removeFigureListener

public void removeFigureListener(FigureListener l)
Description copied from interface: Figure
Removes a listener for FigureEvent's.

Specified by:
removeFigureListener in interface Figure

addNotify

public void addNotify(Drawing d)
Description copied from interface: Figure
Informs a figure, that it has been added to a drawing. The figure must inform all FigureListeners that it has been added.

Specified by:
addNotify in interface Figure

removeNotify

public void removeNotify(Drawing d)
Description copied from interface: Figure
Informs a figure, that it has been removed from a drawing. The figure must inform all FigureListeners that it has been removed.

Specified by:
removeNotify in interface Figure

getDrawing

protected Drawing getDrawing()

getLock

protected java.lang.Object getLock()

fireAreaInvalidated

public void fireAreaInvalidated()
Notify all listenerList that have registered interest for notification on this event type.


fireAreaInvalidated

protected void fireAreaInvalidated(java.awt.geom.Rectangle2D.Double invalidatedArea)
Notify all listenerList that have registered interest for notification on this event type.


fireAreaInvalidated

protected void fireAreaInvalidated(FigureEvent event)
Notify all listenerList that have registered interest for notification on this event type.


fireFigureRequestRemove

protected void fireFigureRequestRemove()
Notify all listenerList that have registered interest for notification on this event type.


fireFigureAdded

protected void fireFigureAdded()
Notify all listenerList that have registered interest for notification on this event type.


fireFigureRemoved

protected void fireFigureRemoved()
Notify all listenerList that have registered interest for notification on this event type.


fireFigureChanged

public void fireFigureChanged()

fireFigureChanged

protected void fireFigureChanged(java.awt.geom.Rectangle2D.Double changedArea)
Notify all listenerList that have registered interest for notification on this event type.


fireFigureChanged

protected void fireFigureChanged(FigureEvent event)

fireAttributeChanged

protected void fireAttributeChanged(AttributeKey attribute,
                                    java.lang.Object oldValue,
                                    java.lang.Object newValue)
Notify all listenerList that have registered interest for notification on this event type.


fireFigureHandlesChanged

protected void fireFigureHandlesChanged()
Notify all listenerList that have registered interest for notification on this event type.


fireUndoableEditHappened

protected void fireUndoableEditHappened(javax.swing.undo.UndoableEdit edit)
Notify all UndoableEditListener of the Drawing, to which this Figure has been added to. If this Figure is not part of a Drawing, the event is lost.


clone

public AbstractFigure clone()
Description copied from interface: Figure
Returns a clone of the figure, with clones of all aggregated figures, such as children and decorators. The cloned figure does not clone the list of FigureListeners from its original.

Specified by:
clone in interface Figure
Overrides:
clone in class AbstractBean

basicClone

public final AbstractFigure basicClone(java.util.HashMap<Figure,Figure> oldToNew)

remap

public void remap(java.util.Map<Figure,Figure> oldToNew,
                  boolean disconnectIfNotInMap)
Description copied from interface: Figure
After cloning a collection of figures, the ConnectionFigures contained in this collection still connect to the original figures instead of to the clones. Using This operation and providing a map, which maps from the original collection of figures to the new collection, connections can be remapped to the new figures.

Specified by:
remap in interface Figure

createHandles

public java.util.Collection<Handle> createHandles(int detailLevel)
Description copied from interface: Figure
Creates handles used to manipulate the figure.

Specified by:
createHandles in interface Figure
Parameters:
detailLevel - The detail level of the handles. Usually this is 0 for bounding box handles and 1 for point handles. The value -1 is used by the SelectAreaTracker and the HandleTracker to highlight figures, over which the mouse pointer is hovering.
Returns:
a Collection of handles
See Also:
Handle

getCursor

public java.awt.Cursor getCursor(java.awt.geom.Point2D.Double p)
Description copied from interface: Figure
Returns a cursor for the specified location.

Specified by:
getCursor in interface Figure

setBounds

public final void setBounds(java.awt.geom.Rectangle2D.Double bounds)

setBounds

public void setBounds(java.awt.geom.Point2D.Double anchor,
                      java.awt.geom.Point2D.Double lead)
Description copied from interface: Figure
Sets the logical and untransformed bounds of the figure.

This is used by Tool's which create a new Figure and by Tool's which connect a Figure to another Figure.

This is a basic operation which does not fire events. Use the following code sequence, if you need event firing:

 aFigure.willChange();
 aFigure.setBounds(...);
 aFigure.changed();
 

Specified by:
setBounds in interface Figure
Parameters:
anchor - the start point of the bounds
lead - the end point of the bounds
See Also:
Figure.getBounds()

canConnect

public boolean canConnect()
Checks if this figure can be connected. By default AbstractFigures can be connected.

Specified by:
canConnect in interface Figure

invalidate

protected void invalidate()
Invalidates cached data of the Figure. This method must execute fast, because it can be called very often.


isChanging

protected boolean isChanging()

getChangingDepth

protected int getChangingDepth()

willChange

public void willChange()
Informs that a figure is about to change something that affects the contents of its display box.

Specified by:
willChange in interface Figure
See Also:
Figure.changed()

validate

protected void validate()

changed

public void changed()
Informs that a figure changed the area of its display box.

Specified by:
changed in interface Figure
See Also:
Figure.willChange()

findConnector

public Connector findConnector(java.awt.geom.Point2D.Double p,
                               ConnectionFigure prototype)
Returns the Figures connector for the specified location. By default a ChopBoxConnector is returned.

Specified by:
findConnector in interface Figure
Parameters:
p - the location of the connector.
prototype - The prototype used to create a connection or null if unknown. This allows for specific connectors for different connection figures.
See Also:
ChopRectangleConnector

includes

public boolean includes(Figure figure)
Description copied from interface: Figure
Checks whether the given figure is contained in this figure. A figure includes itself.

Specified by:
includes in interface Figure

findFigureInside

public Figure findFigureInside(java.awt.geom.Point2D.Double p)
Description copied from interface: Figure
Finds the innermost figure at the specified location.

In case of a CompositeFigure, this method descends into its children and into its children's children until the innermost figure is found.

This functionality is implemented using the Chain of Responsibility design pattern. A figure which is not composed of other figures returns itself if the point is contained by the figure. Composed figures pass the method call down to their children.

Specified by:
findFigureInside in interface Figure
Parameters:
p - A location on the drawing.
Returns:
Returns the innermost figure at the location, or null if the location is not contained in a figure.

findCompatibleConnector

public Connector findCompatibleConnector(Connector c,
                                         boolean isStart)
Description copied from interface: Figure
Gets a compatible connector. If the provided connector is part of this figure, return the connector. If the provided connector is part of another figure, return a connector with the same semantics for this figure. Return null, if no compatible connector is available.

Specified by:
findCompatibleConnector in interface Figure

getActions

public java.util.Collection<javax.swing.Action> getActions(java.awt.geom.Point2D.Double p)
Returns a collection of actions which are presented to the user in a popup menu.

The collection may contain null entries. These entries are used interpreted as separators in the popup menu.

Specified by:
getActions in interface Figure

getTool

public Tool getTool(java.awt.geom.Point2D.Double p)
Returns a specialized tool for the given coordinate.

Returns null, if no specialized tool is available.

Specified by:
getTool in interface Figure

handleMouseClick

public boolean handleMouseClick(java.awt.geom.Point2D.Double p,
                                java.awt.event.MouseEvent evt,
                                DrawingView view)
Handles a mouse click.

Specified by:
handleMouseClick in interface Figure
Parameters:
p - The location of the mouse event.
evt - The mouse event.
view - The drawing view which is the source of the mouse event.
Returns:
Returns true, if the event was consumed.

handleDrop

public boolean handleDrop(java.awt.geom.Point2D.Double p,
                          java.util.Collection<Figure> droppedFigures,
                          DrawingView view)
Description copied from interface: Figure
Handles a drop.

Specified by:
handleDrop in interface Figure
Parameters:
p - The location of the mouse event.
droppedFigures - The dropped figures.
view - The drawing view which is the source of the mouse event.
Returns:
Returns true, if the figures should snap back to the location they were dragged from.

getEndPoint

public java.awt.geom.Point2D.Double getEndPoint()
Description copied from interface: Figure
Returns the untransformed logical end point of the bounds.

Specified by:
getEndPoint in interface Figure
See Also:
Figure.setBounds(java.awt.geom.Point2D.Double, java.awt.geom.Point2D.Double)

getStartPoint

public java.awt.geom.Point2D.Double getStartPoint()
Description copied from interface: Figure
Returns the untransformed logical start point of the bounds.

Specified by:
getStartPoint in interface Figure
See Also:
Figure.setBounds(java.awt.geom.Point2D.Double, java.awt.geom.Point2D.Double)

getPreferredSize

public Dimension2DDouble getPreferredSize()
Description copied from interface: Figure
The preferred size is used by Layouter to determine the preferred size of a Figure. For most Figure's this is the same as the dimensions returned by getBounds.

Specified by:
getPreferredSize in interface Figure

isSelectable

public boolean isSelectable()
Description copied from interface: Figure
Returns true, if the user may select this figure. If this operation returns false, Tool's should not select this figure on behalf of the user.

Please note, that even if this method returns false, the Figure may become part of a selection for other reasons. For example, if the Figure is part of a GroupFigure, then the Figure is indirectly part of the selection, when the user selects the GroupFigure.

Specified by:
isSelectable in interface Figure

setSelectable

public void setSelectable(boolean newValue)

isRemovable

public boolean isRemovable()
Description copied from interface: Figure
Returns true, if the user may remove this figure. If this operation returns false, Tool's should not remove this figure on behalf of the user.

Please note, that even if this method returns false, the Figure may be removed from the Drawing for other reasons. For example, if the Figure is used to display a warning message, the Figure can be removed from the Drawing, when the warning message is no longer relevant.

Specified by:
isRemovable in interface Figure

setRemovable

public void setRemovable(boolean newValue)

isTransformable

public boolean isTransformable()
Description copied from interface: Figure
Returns true, if the user may transform this figure. If this operation returns false, Tool's should not transform this figure on behalf of the user.

Please note, that even if this method returns false, the Figure may be transformed for other reasons. For example, if the Figure takes part in an animation.

Specified by:
isTransformable in interface Figure
See Also:
Figure.transform(java.awt.geom.AffineTransform)

setTransformable

public void setTransformable(boolean newValue)

isVisible

public boolean isVisible()
Description copied from interface: Figure
A Figure is only drawn by a CompositeFigure, if it is visible. Layouter's should ignore invisible figures too.

Specified by:
isVisible in interface Figure

setVisible

public void setVisible(boolean newValue)

getDecomposition

public java.util.Collection<Figure> getDecomposition()
Description copied from interface: Figure
Returns a decompositon of a figure into its parts. A figure is considered as a part of itself.

Specified by:
getDecomposition in interface Figure

getFontRenderContext

protected java.awt.font.FontRenderContext getFontRenderContext()

requestRemove

public void requestRemove()
Description copied from interface: Figure
Fires a FigureListener.figureRequestRemove event.

Specified by:
requestRemove in interface Figure

getLayer

public int getLayer()
Description copied from interface: Figure
Gets the layer number of the figure. The layer is used to determine the z-ordering of a figure inside of a drawing. Figures with a higher layer number are drawn after figures with a lower number. The z-order of figures within the same layer is determined by the sequence the figures were added to a drawing. Figures added later to a drawn after figures which have been added before. If a figure changes its layer, it must fire a FigureListener.figureChanged event to its figure listeners.

Specified by:
getLayer in interface Figure

getToolTipText

public java.lang.String getToolTipText(java.awt.geom.Point2D.Double p)
Description copied from interface: Figure
Returns a tooltip for the specified location on the figure.

Specified by:
getToolTipText in interface Figure

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

getConnectors

public java.util.Collection<Connector> getConnectors(ConnectionFigure prototype)
Description copied from interface: Figure
Returns all connectors of this Figure for the specified prototype of a ConnectionFigure.

This is used by connection tools and connection handles to visualize the connectors when the user is about to create a ConnectionFigure to this Figure.

Specified by:
getConnectors in interface Figure
Parameters:
prototype - The prototype used to create a connection or null if unknown. This allows for specific connectors for different connection figures.