/* dIntProg Browser. A webbrowser written in Java.
 * Copyright (C) 2001 Martin Geisler <gimpster@gimpster.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
 * 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.

import java.awt.*;
import javax.swing.*;

/** Specifies a box. A box has two characteristic properties: it's
 *  <code>width</code> and <code>height</code> which is accessed with
 *  {@link #getWidth()} and {@link #getHeight()}.
 *  <p>A box should also be able to draw itself, see {@link
 *  #drawAt(int, int, DocumentView)}, but after it has been given a
 *  chance to calculate it's layout with a call to {@link
 *  #doLayout(Graphics, JComponent, int)}. */
public interface Box {

    /** Returns the width of this box.
     *  @return the width of the box. */
    public int getWidth();

    /** Returns the minimum width of this box.
     *  @return the minimum width of this box. */
    public int getMinimumWidth();

    /** Returns the preferred width of this box. This can be used to
     *  get an indication of the amount of space this box would like
     *  to researve for itself.
     *  @return the preferred width for this box. */
    public int getPreferredWidth();

    /** Returns the height of this box.
     *  @return the height of the box. */
    public int getHeight();

    /** Makes the box update it's own width and height, and layout
     *  it's child-boxes.
     *  @param g the graphics context. Some boxes, like TextFragments,
     *  need a graphics context before they can determine their width
     *  and height.
     *  @param c the component into which the box will be drawn. An
     *  ImageBox needs to know the component to calculate the width
     *  and height.
     *  @param w the width available for to the Box. */
    public void doLayout(Graphics g, JComponent c, int w);

    /** Draws the box with it's upper-left corner at (<code>x</code>,
     *  <code>y</code>).
     *  @param v the {@link DocumentView} that does the actual
     *  drawing.
     *  @param x the x-coordinate of the upper-left corner.
     *  @param x the y-coordinate of the upper-left corner. */
    public void drawAt(int x, int y, DocumentView v);

    /** Gives you information about the box.
     *  @return information about the box - usefull for debugging. */
    public String toString();