/*******************************************************************************
* Copyright (c) 2006-2012
* Software Technology Group, Dresden University of Technology
* DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026
*
* 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:
* Software Technology Group - TU Dresden, Germany;
* DevBoost GmbH - Berlin, Germany
* - initial API and implementation
******************************************************************************/
/*
* @(#)CompositeFigure.java 2.0.1 2007-12-20
*
* Copyright (c) 1996-2007 by the original authors of JHotDraw
* and all its contributors.
* All rights reserved.
*
* The copyright of this software is owned by the authors and
* contributors of the JHotDraw project ("the copyright holders").
* You may not use, copy or modify this software, except in
* accordance with the license agreement you entered into with
* the copyright holders. For details see accompanying license terms.
*/
package org.jhotdraw.draw;
import org.jhotdraw.util.*;
import java.beans.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.undo.*;
import javax.swing.event.*;
import java.io.*;
import org.jhotdraw.geom.*;
/**
* A CompositeFigure is composed of several child Figures.
* A CompositeFigure can be laid out using a Layouter.
* <p>
* Design pattern:<br>
* Name: Composite.<br>
* Role: Composite.<br>
* Partners: {@link Figure} as Component.
* <p>
* Design pattern:<br>
* Name: Strategy.<br>
* Role: Context.<br>
* Partners: {@link Layouter} as Strategy.
*
* @author Werner Randelshofer
* @version 2.1 2007-12-20 Clarified purpose of basicAdd/basicRemove methods.
* Added method indexOf.
* <br>2.0 2007-07-17 Added support for CompositeFigureListener.
* CompositeFigure is now streamlined with the java.util.List<Figure>
* interface.
* <br>1.0 27. Januar 2006 Created.
*/
public interface CompositeFigure extends Figure {
/**
* The value of this attribute is a Insets2D.Double object.
*/
public final static AttributeKey<Insets2D.Double> LAYOUT_INSETS = new AttributeKey<Insets2D.Double>("layoutInsets", Insets2D.Double.class, new Insets2D.Double());
/**
* Adds a child to the figure.
* <p>
* This is a convenience method for {@code add(getChildCount(), child);}
* <p>
* This method calls {@code figureAdded} on all registered
* {@code CompositeFigureListener}s.
*
* @return {@code true} if this CompositeFigure changed as a result of the
* call
*/
public boolean add(Figure child);
/**
* Adds a child to the figure at the specified index.
* <p>
* This method calls {@code figureAdded} on all registered
* {@code CompositeFigureListener}s.
*/
public void add(int index, Figure child);
/**
* Adds a child to the figure without firing events.
* <p>
* This method can be used to reinsert a child figure which has been
* temporarily removed from this CompositeFigure (for example to reorder
* the sequence of the children) and to efficiently build a drawing from
* an {@link InputFormat}.
*
* This is a convenience method for calling
* {@code basicAdd(getChildCount(), child);}.
*/
public void basicAdd(Figure child);
/**
* Adds a child to the figure at the specified index without
* firing events.
* <p>
* This method can be used to reinsert a child figure which has been
* temporarily removed from this CompositeFigure (for example to reorder
* the sequence of the children) and to efficiently build a drawing from
* an {@link InputFormat}.
*/
public void basicAdd(int index, Figure child);
/**
* Removes the specified child.
* Returns true, if the Figure contained the removed child.
* <p>
* This is a convenience method for calling
* {@code removeChild(getChildren().indexOf(child));}
* <p>
* This method calls {@code figureRemoved} on all registered
* {@code CompositeFigureListener}'s.
*/
public boolean remove(Figure child);
/**
* Removes the child at the specified index.
* Returns the removed child figure.
* <p>
* Calls {@code figureRemoved} on all registered
* {@code CompositeFigureListener}'s.
*/
public Figure removeChild(int index);
/**
* Removes all children from the composite figure.
* <p>
* This is a convenience method for
* {@code while(getChildCount() > 0) removeChild(0); }
*/
public void removeAllChildren();
/**
* Removes the specified child without firing events.
* <p>
* This method can be used to temporarily remove a child from this
* CompositeFigure (for example to reorder the sequence of the children).
* <p>
* This is a convenience method for calling
* {@code basicRemove(indexOf(child));}.
* <p>
* Returns the index of the removed figure. Returns -1 if the
* figure was not a child of this CompositeFigure.
*/
public int basicRemove(Figure child);
/**
* Removes the child at the specified index without firing events.
* <p>
* This method can be used to temporarily remove a child from this
* CompositeFigure (for example to reorder the sequence of the children).
* <p>
* Returns the removed child figure.
*/
public Figure basicRemoveChild(int index);
/**
* Removes all children from the composite figure without firing events.
* <p>
* This method can be used to temporarily remove a child from this
* CompositeFigure (for example to reorder the sequence of the children).
* <p>
* This is a convenience method for
* {@code while(getChildCount() > 0) basicRemoveChild(0); }
*/
public void basicRemoveAllChildren();
/**
* Returns an unchangeable list view on the children.
*/
public java.util.List<Figure> getChildren();
/**
* Returns the number of children.
* <p>
* This is a convenience method for calling
* {@code getChildren().size();}.
*/
public int getChildCount();
/**
* Returns the child figure at the specified index.
* <p>
* This is a convenience method for calling
* {@code getChildren().get(index);}.
*/
public Figure getChild(int index);
/**
* Returns the index of the specified child.
* <p>
* This is a convenience method for calling
* {@code getChildren().indexOf(index);}.
*
* @return The index of the child, or -1 if the specified figure is not
* a child of this CompositeFigure.
*/
public int indexOf(Figure child);
/**
* Returns true if this composite figure contains the specified figure.
* <p>
* This is a convenience method for calling
* {@code getChildren().contains(f);}.
*/
public boolean contains(Figure f);
/**
* Get a Layouter object which encapsulated a layout
* algorithm for this figure. Typically, a Layouter
* accesses the child components of this figure and arranges
* their graphical presentation.
*
* @return layout strategy used by this figure
*/
public Layouter getLayouter();
/**
* A layout 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 Layouter which can be plugged in at runtime.
*/
public void layout();
/**
* Set a Layouter object which encapsulated a layout
* algorithm for this figure. Typically, a Layouter
* accesses the child components of this figure and arranges
* their graphical presentation. It is a good idea to set
* the Layouter in the protected initialize() method
* so it can be recreated if a GraphicalCompositeFigure is
* read and restored from a StorableInput stream.
*
*
* @param newValue encapsulation of a layout algorithm.
*/
public void setLayouter(Layouter newValue);
/**
* Adds a listener for this composite figure.
*/
public void addCompositeFigureListener(CompositeFigureListener listener);
/**
* Removes a listener from this composite figure.
*/
public void removeCompositeFigureListener(CompositeFigureListener listener);
}