/* BorderFactory.java --
   Copyright (C) 2002, 2004  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath 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, or (at your option)
any later version.

GNU Classpath 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 GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.swing;

import java.awt.Color;
import java.awt.Font;

import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;
import javax.swing.border.TitledBorder;

public class BorderFactory
{
  private BorderFactory()
  {
    // Do nothing.
  }
  
  /**
   * Creates a line border withe the specified color.
   *
   * @param color A color to use for the line.
   *
   * @return The Border object
   */ 
  public static Border createLineBorder(Color color)
  {
    return null;
  }

  /**
   * Creates a line border withe the specified color and width. The width
   * applies to all 4 sides of the border. To specify widths individually for
   * the top, bottom, left, and right, use
   * createMatteBorder(int,int,int,int,Color).
   *
   * @param color A color to use for the line.
   * @param thickness An int specifying the width in pixels.
   *
   * @return The Border object
   */ 
  public static Border createLineBorder (Color color, int thickness)
  {
    return new LineBorder (color, thickness);
  }

  /**
   * Created a border with a raised beveled edge, using brighter shades of
   * the component's current background color for highlighting, and darker
   * shading for shadows. (In a raised border, highlights are on top and
   * shadows are underneath.)
   *
   * @return The Border object
   */ 
  public static Border createRaisedBevelBorder ()
  {
    return new BevelBorder (BevelBorder.RAISED);
  }

  /**
   * Created a border with a lowered beveled edge, using brighter shades of
   * the component's current background color for highlighting, and darker
   * shading for shadows. (In a lowered border, shadows are on top and
   * highlights are underneath.)
   *
   * @return The Border object
   */ 
  public static Border createLoweredBevelBorder ()
  {
    return new BevelBorder (BevelBorder.LOWERED);
  }

  /**
   * Create a beveled border of the specified type, using brighter shades of
   * the component's current background color for highlighting, and darker
   * shading for shadows. (In a lowered border, shadows are on top and
   * highlights are underneath.).
   *
   * @param type An int specifying either BevelBorder.LOWERED or
   * BevelBorder.RAISED
   *
   * @Return The Border object
   */ 
  public static Border createBevelBorder (int type)
  {
    return new BevelBorder (type);
  }

  /**
   * Create a beveled border of the specified type, using the specified
   * highlighting and shadowing. The outer edge of the highlighted area uses
   * a brighter shade of the highlight color. The inner edge of the shadow
   * area uses a brighter shade of the shadaw color.
   *
   * @param type An int specifying either BevelBorder.LOWERED or
   * BevelBorder.RAISED
   * @param highlight A Color object for highlights
   * @param shadow A Color object for shadows
   *
   * @return The Border object
  */ 
  public static Border createBevelBorder (int type, Color highlight,
                                          Color shadow)
  {
    return new BevelBorder (type, highlight, shadow);
  }

  /**
   * Create a beveled border of the specified type, using the specified colors
   * for the inner and outer highlight and shadow areas.
   *
   * @param type An int specifying either BevelBorder.LOWERED or
   * BevelBorder.RAISED
   * @param highlightOuter A Color object for the outer edge of the
   * highlight area
   * @param highlightInner A Color object for the inner edge of the
   * highlight area
   * @param shadowOuter A Color object for the outer edge of the shadow area
   * @param shadowInner A Color object for the inner edge of the shadow area
   *
   * @return The Border object
   */ 
  public static Border createBevelBorder (int type, Color highlightOuter,
                                          Color highlightInner,
                                          Color shadowOuter, Color shadowInner)
  {
    return new BevelBorder (type, highlightOuter, highlightInner, shadowOuter,
			    shadowInner);
  }

  /**
   * Create a border with an "etched" look using the component's current
   * background color for highlighting and shading.
   *
   * @return The Border object
   */ 
  public static Border createEtchedBorder ()
  {
    return new EtchedBorder ();
  }

  /**
   * Create a border with an "etched" look using the component's current
   * background color for highlighting and shading.
   *
   * @return The Border object
   */ 
  public static Border createEtchedBorder (int etchType)
  {
    return new EtchedBorder (etchType);
  }

  /**
   * Create a border with an "etched" look using the specified highlighting and
   * shading colors.
   *
   * @param highlight A Color object for the border highlights
   * @param shadow A Color object for the border shadows
   *
   * @return The Border object
   */ 
  public static Border createEtchedBorder (Color highlight, Color shadow)
  {
    return new EtchedBorder (highlight, shadow);
  }

  /**
   * Create a border with an "etched" look using the specified highlighting and
   * shading colors.
   *
   * @param highlight A Color object for the border highlights
   * @param shadow A Color object for the border shadows
   *
   * @return The Border object
   */ 
  public static Border createEtchedBorder (int etchType, Color highlight,
					   Color shadow)
  {
    return new EtchedBorder (etchType, highlight, shadow);
  }

  /**
   * Create a new title border specifying the text of the title, using the
   * default border (etched), using the default text position (sitting on the
   * top line) and default justification (left) and using the default font and
   * text color determined by the current look and feel.
   *
   * @param title A String containing the text of the title
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (String title)
  {
    return new TitledBorder (title);
  }

  /**
   * Create a new title border with an empty title specifying the border
   * object, using the default text position (sitting on the top line) and
   * default justification (left) and using the default font, text color,
   * and border determined by the current look and feel. (The Motif and Windows
   * look and feels use an etched border; The Java look and feel use a
   * gray border.)
   *
   * @param border The Border object to add the title to
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (Border border)
  {
    return new TitledBorder (border);
  }

  /**
   * Add a title to an existing border, specifying the text of the title, using
   * the default positioning (sitting on the top line) and default
   * justification (left) and using the default font and text color determined
   * by the current look and feel.
   *
   * @param order The Border object to add the title to
   * @param title A String containing the text of the title
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (Border border, String title)
  {
    return new TitledBorder (border, title);
  }

  /**
   * Add a title to an existing border, specifying the text of the title along
   * with its positioning, using the default font and text color determined by
   * the current look and feel.
   *
   * @param border The Border object to add the title to
   * @param title A String containing the text of the title
   * @param titleJustification An int specifying the left/right position of
   * the title -- one of TitledBorder.LEFT, TitledBorder.CENTER, or
   * TitledBorder.RIGHT, TitledBorder.DEFAULT_JUSTIFICATION (left).
   * @param titlePosition An int specifying the vertical position of the text
   * in relation to the border -- one of: TitledBorder.ABOVE_TOP,
   * TitledBorder.TOP (sitting on the top line), TitledBorder.BELOW_TOP,
   * TitledBorder.ABOVE_BOTTOM, TitledBorder.BOTTOM (sitting on the bottom
   * line), TitledBorder.BELOW_BOTTOM, or TitledBorder.DEFAULT_POSITION (top).
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (Border border, String title,
                                                int titleJustification,
                                                int titlePosition)
  {
    return new TitledBorder (border, title, titleJustification, titlePosition);
  }

  /**
   * Add a title to an existing border, specifying the text of the title along
   * with its positioning and font, using the default text color determined by
   * the current look and feel.
   *
   * @param border - the Border object to add the title to
   * @param title - a String containing the text of the title
   * @param titleJustification - an int specifying the left/right position of
   * the title -- one of TitledBorder.LEFT, TitledBorder.CENTER, or
   * TitledBorder.RIGHT, TitledBorder.DEFAULT_JUSTIFICATION (left).
   * @param titlePosition - an int specifying the vertical position of the
   * text in relation to the border -- one of: TitledBorder.ABOVE_TOP,
   * TitledBorder.TOP (sitting on the top line), TitledBorder.BELOW_TOP,
   * TitledBorder.ABOVE_BOTTOM, TitledBorder.BOTTOM (sitting on the bottom
   * line), TitledBorder.BELOW_BOTTOM, or TitledBorder.DEFAULT_POSITION (top).
   * @param titleFont - a Font object specifying the title font
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (Border border, String title,
                                                 int titleJustification,
                                                 int titlePosition,
                                                 Font titleFont)
  {
    return new TitledBorder (border, title, titleJustification, titlePosition,
			     titleFont);
  }

  /**
   * Add a title to an existing border, specifying the text of the title along
   * with its positioning, font, and color.
   *
   * @param border - the Border object to add the title to
   * @param title - a String containing the text of the title
   * @param titleJustification - an int specifying the left/right position of
   * the title -- one of TitledBorder.LEFT, TitledBorder.CENTER, or
   * TitledBorder.RIGHT, TitledBorder.DEFAULT_JUSTIFICATION (left).
   * @param titlePosition - an int specifying the vertical position of the text
   * in relation to the border -- one of: TitledBorder.ABOVE_TOP,
   * TitledBorder.TOP (sitting on the top line), TitledBorder.BELOW_TOP,
   * TitledBorder.ABOVE_BOTTOM, TitledBorder.BOTTOM (sitting on the bottom
   * line), TitledBorder.BELOW_BOTTOM, or TitledBorder.DEFAULT_POSITION (top).
   * @param titleFont - a Font object specifying the title font
   * @param titleColor - a Color object specifying the title color
   *
   * @return The TitledBorder object
   */ 
  public static TitledBorder createTitledBorder (Border border,
                                                 String title,
                                                 int titleJustification,
                                                 int titlePosition,
                                                 Font titleFont,
                                                 Color titleColor)
  {
    return new TitledBorder (border, title, titleJustification, titlePosition,
			     titleFont, titleColor);
  }

  /**
   * Creates an empty border that takes up no space. (The width of the top,
   * bottom, left, and right sides are all zero.)
   *
   * @return The Border object
   */ 
  public static Border createEmptyBorder ()
  {
    return new EmptyBorder (0, 0, 0, 0);
  }

  /**
   * Creates an empty border that takes up no space but which does no drawing,
   * specifying the width of the top, left, bottom, and right sides.
   *
   * @param top An int specifying the width of the top in pixels
   * @param left An int specifying the width of the left side in pixels
   * @param bottom An int specifying the width of the right side in pixels
   * @param right An int specifying the width of the bottom in pixels
   *
   * @return The Border object
   */ 
  public static Border createEmptyBorder (int top, int left, int bottom,
					  int right)
  {
    return new EmptyBorder (top, left, bottom, right);
  }

  /**
   * Create a compound border with a null inside edge and a null outside edge.
   *
   * @return The CompoundBorder object
   */ 
  public static CompoundBorder createCompoundBorder ()
  {
    return new CompoundBorder ();
  }

  /**
   * Create a compound border specifying the border objects to use for the
   * outside and inside edges.
   *
   * @param outsideBorder A Border object for the outer edge of the
   * compound border
   * @param insideBorder A Border object for the inner edge of the
   * compound border
   *
   * @return The CompoundBorder object
   */ 
  public static CompoundBorder createCompoundBorder (Border outsideBorder,
						     Border insideBorder)
  {
    return new CompoundBorder (outsideBorder, insideBorder);
  }

  /**
   * Create a matte-look border using a solid color. (The difference between
   * this border and a line border is that you can specify the individual
   * border dimensions.)
   *
   * @param top An int specifying the width of the top in pixels
   * @param left An int specifying the width of the left side in pixels
   * @param bottom An int specifying the width of the right side in pixels
   * @param right An int specifying the width of the bottom in pixels
   * @param color A Color to use for the border
   *
   * @return The MatteBorder object
   */ 
  public static MatteBorder createMatteBorder (int top, int left, int bottom,
					       int right, Color color)
  {
    return new MatteBorder (top, left, bottom, right, color);
  }

  /**
   * Create a matte-look border that consists of multiple tiles of a specified
   * icon. Multiple copies of the icon are placed side-by-side to fill up the
   * border area.
   *
   * Note:
   * If the icon doesn't load, the border area is painted gray.
   *
   * @param top An int specifying the width of the top in pixels
   * @param left An int specifying the width of the left side in pixels
   * @param bottom An int specifying the width of the right side in pixels
   * @param right An int specifying the width of the bottom in pixels
   * @param tileIcon The Icon object used for the border tiles
   *
   * @return The MatteBorder object
   */ 
  public static MatteBorder createMatteBorder (int top, int left, int bottom,
					       int right, Icon tileIcon)
  {
    return new MatteBorder (top, left, bottom, right, tileIcon);
  }
}
