001/* BorderUIResource.java
002   Copyright (C) 2002, 2003, 2004  Free Software Foundation, Inc.
003
004This file is part of GNU Classpath.
005
006GNU Classpath is free software; you can redistribute it and/or modify
007it under the terms of the GNU General Public License as published by
008the Free Software Foundation; either version 2, or (at your option)
009any later version.
010 
011GNU Classpath is distributed in the hope that it will be useful, but
012WITHOUT ANY WARRANTY; without even the implied warranty of
013MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014General Public License for more details.
015
016You should have received a copy of the GNU General Public License
017along with GNU Classpath; see the file COPYING.  If not, write to the
018Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
01902110-1301 USA.
020
021Linking this library statically or dynamically with other modules is
022making a combined work based on this library.  Thus, the terms and
023conditions of the GNU General Public License cover the whole
024combination.
025
026As a special exception, the copyright holders of this library give you
027permission to link this library with independent modules to produce an
028executable, regardless of the license terms of these independent
029modules, and to copy and distribute the resulting executable under
030terms of your choice, provided that you also meet, for each linked
031independent module, the terms and conditions of the license of that
032module.  An independent module is a module which is not derived from
033or based on this library.  If you modify this library, you may extend
034this exception to your version of the library, but you are not
035obligated to do so.  If you do not wish to do so, delete this
036exception statement from your version. */
037
038
039package javax.swing.plaf;
040
041import java.awt.Color;
042import java.awt.Component;
043import java.awt.Font;
044import java.awt.Graphics;
045import java.awt.Insets;
046import java.io.Serializable;
047
048import javax.swing.Icon;
049import javax.swing.border.BevelBorder;
050import javax.swing.border.Border;
051import javax.swing.border.CompoundBorder;
052import javax.swing.border.EmptyBorder;
053import javax.swing.border.EtchedBorder;
054import javax.swing.border.LineBorder;
055import javax.swing.border.MatteBorder;
056import javax.swing.border.TitledBorder;
057
058/**
059 * A wrapper for {@link javax.swing.border.Border} that also
060 * implements the {@link UIResource} marker interface.  This is useful
061 * for implementing pluggable look-and-feels: When switching the
062 * current LookAndFeel, only those borders are replaced that are
063 * marked as {@link UIResource}.  For this reason, a look-and-feel
064 * should always install borders that implement
065 * <code>UIResource</code>, such as the borders provided by this
066 * class.
067 *
068 * @serial
069 * @serialField delegate Border the <code>Border</code> wrapped
070 *
071 * @author Brian Jones (cbj@gnu.org)
072 * @author Sascha Brawer (brawer@dandelis.ch)
073 */
074public class BorderUIResource implements Border, UIResource, Serializable
075{
076  /**
077   * Verified using the <code>serialver</code> tool
078   * of Apple/Sun JDK 1.3.1 on MacOS X 10.1.5.
079   */
080  static final long serialVersionUID = -3440553684010079691L;
081
082
083  /**
084   * A shared instance of an {@link EtchedBorderUIResource}, or
085   * <code>null</code> if the {@link #getEtchedBorderUIResource()}
086   * method has not yet been called.
087   */
088  private static Border etchedBorderUIResource;
089
090
091  /**
092   * A shared instance of a {@link BevelBorderUIResource} whose
093   * <code>bevelType</code> is {@link
094   * javax.swing.border.BevelBorder#LOWERED}, or <code>null</code> if
095   * the {@link #getLoweredBevelBorderUIResource()} has not yet been
096   * called.
097   */
098  private static Border loweredBevelBorderUIResource;
099  
100  
101  /**
102   * A shared instance of a {@link BevelBorderUIResource} whose
103   * <code>bevelType</code> is {@link
104   * javax.swing.border.BevelBorder#RAISED}, or <code>null</code> if
105   * the {@link #getRaisedBevelBorderUIResource()} has not yet been
106   * called.
107   */
108  private static Border raisedBevelBorderUIResource;
109  
110  
111  /**
112   * A shared instance of a {@link LineBorderUIResource} for
113   * a one-pixel thick black line, or <code>null</code> if
114   * the {@link #getBlackLineBorderUIResource()} has not yet been
115   * called.
116   */
117  private static Border blackLineBorderUIResource;
118
119
120  /**
121   * Returns a shared instance of an etched border which also
122   * is marked as an {@link UIResource}.
123   *
124   * @see javax.swing.border.EtchedBorder
125   */
126  public static Border getEtchedBorderUIResource()
127  {
128    /* Swing is not designed to be thread-safe, so there is no
129     * need to synchronize the access to the global variable.
130     */
131    if (etchedBorderUIResource == null)
132      etchedBorderUIResource = new EtchedBorderUIResource();
133    return etchedBorderUIResource;
134  }
135  
136
137  /**
138   * Returns a shared instance of {@link BevelBorderUIResource} whose
139   * <code>bevelType</code> is {@link
140   * javax.swing.border.BevelBorder#LOWERED}.
141   *
142   * @see javax.swing.border.BevelBorder
143   */
144  public static Border getLoweredBevelBorderUIResource()
145  {
146    /* Swing is not designed to be thread-safe, so there is no
147     * need to synchronize the access to the global variable.
148     */
149    if (loweredBevelBorderUIResource == null)
150      loweredBevelBorderUIResource = new BevelBorderUIResource(
151        BevelBorder.LOWERED);
152    return loweredBevelBorderUIResource;
153  }
154
155
156  /**
157   * Returns a shared instance of {@link BevelBorderUIResource} whose
158   * <code>bevelType</code> is {@link
159   * javax.swing.border.BevelBorder#RAISED}.
160   *
161   * @see javax.swing.border.BevelBorder
162   */
163  public static Border getRaisedBevelBorderUIResource()
164  {
165    /* Swing is not designed to be thread-safe, so there is no
166     * need to synchronize the access to the global variable.
167     */
168    if (raisedBevelBorderUIResource == null)
169      raisedBevelBorderUIResource = new BevelBorderUIResource(
170        BevelBorder.RAISED);
171    return raisedBevelBorderUIResource;
172  }
173  
174  
175  /**
176   * Returns a shared instance of {@link LineBorderUIResource} for
177   * a black, one-pixel width border.
178   *
179   * @see javax.swing.border.LineBorder
180   */
181  public static Border getBlackLineBorderUIResource()
182  {
183    /* Swing is not designed to be thread-safe, so there is no
184     * need to synchronize the access to the global variable.
185     */
186    if (blackLineBorderUIResource == null)
187      blackLineBorderUIResource = new LineBorderUIResource(Color.black);
188    return blackLineBorderUIResource;
189  }
190
191
192  /**
193   * The wrapped border.
194   */
195  private Border delegate;
196  
197  
198  /**
199   * Constructs a <code>BorderUIResource</code> for wrapping
200   * a <code>Border</code> object.
201   * 
202   * @param delegate the border to be wrapped.
203   */
204  public BorderUIResource(Border delegate)
205  {
206    if (delegate == null)
207      throw new IllegalArgumentException();
208    
209    this.delegate = delegate;
210  }
211
212  
213  /**
214   * Paints the border around an enclosed component by calling
215   * the <code>paintBorder</code> method of the wrapped delegate.
216   *
217   * @param c the component whose border is to be painted.
218   * @param g the graphics for painting.
219   * @param x the horizontal position for painting the border.
220   * @param y the vertical position for painting the border.
221   * @param width the width of the available area for painting the border.
222   * @param height the height of the available area for painting the border.
223   */
224  public void paintBorder(Component c, Graphics g,
225                          int x, int y, int width, int height)
226  {
227    delegate.paintBorder(c, g, x, y, width, height);
228  }
229  
230  
231  /**
232   * Measures the width of this border by calling the
233   * <code>getBorderInsets</code> method of the wrapped
234   * delegate.
235   *
236   * @param c the component whose border is to be measured.
237   *
238   * @return an Insets object whose <code>left</code>, <code>right</code>,
239   *         <code>top</code> and <code>bottom</code> fields indicate the
240   *         width of the border at the respective edge.
241   */
242  public Insets getBorderInsets(Component c)
243  { 
244    return delegate.getBorderInsets(c);
245  }
246  
247  
248  /**
249   * Determines whether this border fills every pixel in its area
250   * when painting by calling the <code>isBorderOpaque</code>
251   * method of the wrapped delegate.
252   *
253   * @return <code>true</code> if the border is fully opaque, or
254   *         <code>false</code> if some pixels of the background
255   *         can shine through the border.
256   */
257  public boolean isBorderOpaque()
258  { 
259    return delegate.isBorderOpaque();
260  }
261
262
263  /**
264   * A {@link javax.swing.border.BevelBorder} that also implements the
265   * {@link UIResource} marker interface.  This is useful for
266   * implementing pluggable look-and-feels: When switching the current
267   * LookAndFeel, only those borders are replaced that are marked as
268   * {@link UIResource}.  For this reason, a look-and-feel should
269   * always install borders that implement <code>UIResource</code>,
270   * such as the borders provided by this class.
271   *
272   * @author Brian Jones (cbj@gnu.org)
273   * @author Sascha Brawer (brawer@dandelis.ch)
274   */
275  public static class BevelBorderUIResource 
276    extends BevelBorder
277    implements UIResource, Serializable
278  {
279    private static final long serialVersionUID = -1275542891108351642L;
280    
281    /**
282     * Constructs a BevelBorderUIResource whose colors will be derived
283     * from the background of the enclosed component. The background
284     * color is retrieved each time the border is painted, so a border
285     * constructed by this method will automatically reflect a change
286     * to the component&#x2019;s background color.
287     *
288     * <p><img src="../border/doc-files/BevelBorder-1.png"
289     * width="500" height="150"
290     * alt="[An illustration showing raised and lowered BevelBorders]" /></p>
291     *
292     * @param bevelType the desired appearance of the border. The value
293     *        must be either {@link javax.swing.border.BevelBorder#RAISED}
294     *        or {@link javax.swing.border.BevelBorder#LOWERED}.
295     *
296     * @throws IllegalArgumentException if <code>bevelType</code> has
297     *         an unsupported value.
298     */
299    public BevelBorderUIResource(int bevelType) 
300    { 
301      super(bevelType);
302    }
303    
304    
305    /**
306     * Constructs a BevelBorderUIResource given its appearance type
307     * and two colors for its highlight and shadow.
308     *
309     * <p><img src="../border/doc-files/BevelBorder-2.png" width="500"
310     * height="150" alt="[An illustration showing BevelBorders that were
311     * constructed with this method]" /></p>
312     *
313     * @param bevelType the desired appearance of the border. The value
314     *        must be either {@link javax.swing.border.BevelBorder#RAISED}
315     *        or {@link javax.swing.border.BevelBorder#LOWERED}.
316     *
317     * @param highlight the color that will be used for the inner side
318     *        of the highlighted edges (top and left if if
319     *        <code>bevelType</code> is {@link
320     *        javax.swing.border.BevelBorder#RAISED}; bottom and right
321     *        otherwise). The color for the outer side is a brightened
322     *        version of this color.
323     *
324     * @param shadow the color that will be used for the outer side of
325     *        the shadowed edges (bottom and right if
326     *        <code>bevelType</code> is {@link
327     *        javax.swing.border.BevelBorder#RAISED}; top and left
328     *        otherwise). The color for the inner side is a brightened
329     *        version of this color.
330     *
331     * @throws IllegalArgumentException if <code>bevelType</code> has
332     *         an unsupported value.
333     *
334     * @throws NullPointerException if <code>highlight</code> or
335     *         <code>shadow</code> is <code>null</code>.
336     */
337    public BevelBorderUIResource(int bevelType, 
338                                 Color highlight, 
339                                 Color shadow) 
340    {
341      super(bevelType, highlight, shadow);
342    }
343
344
345    /**
346     * Constructs a BevelBorderUIResource given its appearance type
347     * and all its colors.
348     *
349     * <p><img src="../border/doc-files/BevelBorder-3.png" width="500"
350     * height="150" alt="[An illustration showing BevelBorders that
351     * were constructed with this method]" /></p>
352     *
353     * @param bevelType the desired appearance of the border. The value
354     *        must be either {@link javax.swing.border.BevelBorder#RAISED}
355     *        or {@link javax.swing.border.BevelBorder#LOWERED}.
356     *
357     * @param highlightOuter the color that will be used for the outer
358     *        side of the highlighted edges (top and left if
359     *        <code>bevelType</code> is {@link
360     *        javax.swing.border.BevelBorder#RAISED}; bottom and right
361     *        otherwise).
362     *
363     * @param highlightInner the color that will be used for the inner
364     *        side of the highlighted edges.
365     *
366     * @param shadowOuter the color that will be used for the outer
367     *        side of the shadowed edges (bottom and right if
368     *        <code>bevelType</code> is {@link
369     *        javax.swing.border.BevelBorder#RAISED}; top and left
370     *        otherwise).
371     *
372     * @param shadowInner the color that will be used for the inner
373     *        side of the shadowed edges.
374     *
375     * @throws IllegalArgumentException if <code>bevelType</code> has
376     *         an unsupported value.
377     *
378     * @throws NullPointerException if one of the passed colors
379     *         is <code>null</code>.
380     */
381    public BevelBorderUIResource(int bevelType,
382                                 Color highlightOuter,
383                                 Color highlightInner,
384                                 Color shadowOuter,
385                                 Color shadowInner) 
386    {
387      super(bevelType,
388            highlightOuter, highlightInner,
389            shadowOuter, shadowInner);
390    }
391  }
392  
393  
394  /**
395   * A {@link javax.swing.border.CompoundBorder} that also implements the
396   * {@link UIResource} marker interface.  This is useful for
397   * implementing pluggable look-and-feels: When switching the current
398   * LookAndFeel, only those borders are replaced that are marked as
399   * {@link UIResource}.  For this reason, a look-and-feel should
400   * always install borders that implement <code>UIResource</code>,
401   * such as the borders provided by this class.
402   *
403   * @author Brian Jones (cbj@gnu.org)
404   * @author Sascha Brawer (brawer@dandelis.ch)
405   */
406  public static class CompoundBorderUIResource
407    extends CompoundBorder
408    implements UIResource, Serializable
409  {
410    private static final long serialVersionUID = 7550017084975167341L;
411    
412    /**
413     * Constructs a CompoundBorderUIResource with the specified inside
414     * and outside borders.
415     *
416     * @param outsideBorder the outside border, which is painted to the
417     *        outside of both <code>insideBorder</code> and the enclosed
418     *        component. It is acceptable to pass <code>null</code>, in
419     *        which case no outside border is painted.
420     *
421     * @param insideBorder the inside border, which is painted to
422     *        between <code>outsideBorder</code> and the enclosed
423     *        component. It is acceptable to pass <code>null</code>, in
424     *        which case no inside border is painted.
425     */
426    public CompoundBorderUIResource(Border outsideBorder,
427                                    Border insideBorder)
428    {
429      super(outsideBorder, insideBorder);
430    }
431  }
432  
433  
434  /**
435   * An {@link javax.swing.border.EmptyBorder} that also implements the
436   * {@link UIResource} marker interface.  This is useful for
437   * implementing pluggable look-and-feels: When switching the current
438   * LookAndFeel, only those borders are replaced that are marked as
439   * {@link UIResource}.  For this reason, a look-and-feel should
440   * always install borders that implement <code>UIResource</code>,
441   * such as the borders provided by this class.
442   *
443   * <p><img src="../border/doc-files/EmptyBorder-1.png"
444   * width="290" height="200"
445   * alt="[An illustration of EmptyBorder]" /></p>
446   *
447   * @author Brian Jones (cbj@gnu.org)
448   * @author Sascha Brawer (brawer@dandelis.ch)
449   */
450  public static class EmptyBorderUIResource 
451    extends EmptyBorder
452    implements UIResource, Serializable
453  {
454    private static final long serialVersionUID = -4914187529340071708L;
455    
456    /**
457     * Constructs an empty border given the number of pixels required
458     * on each side.
459     *
460     * @param top the number of pixels that the border will need
461     *        for its top edge.
462     *
463     * @param left the number of pixels that the border will need
464     *        for its left edge.
465     *
466     * @param bottom the number of pixels that the border will need
467     *        for its bottom edge.
468     *
469     * @param right the number of pixels that the border will need
470     *        for its right edge.
471     */
472    public EmptyBorderUIResource(int top, int left, int bottom, int right)
473    {
474      super(top, left, bottom, right);
475    }
476    
477    
478    /**
479     * Constructs an empty border given the number of pixels required
480     * on each side, passed in an Insets object.
481     *
482     * @param insets the Insets for the new border.
483     */
484    public EmptyBorderUIResource(Insets insets)
485    {
486      super(insets);
487    }
488  }
489  
490  
491  /**
492   * An {@link javax.swing.border.EtchedBorder} that also implements the
493   * {@link UIResource} marker interface.  This is useful for
494   * implementing pluggable look-and-feels: When switching the current
495   * LookAndFeel, only those borders are replaced that are marked as
496   * {@link UIResource}.  For this reason, a look-and-feel should
497   * always install borders that implement <code>UIResource</code>,
498   * such as the borders provided by this class.
499   *
500   * <p><img src="../border/doc-files/EtchedBorder-1.png" width="500"
501   * height="200" alt="[An illustration of the two EtchedBorder
502   * variants]" /></p>
503   *
504   * @author Brian Jones (cbj@gnu.org)
505   * @author Sascha Brawer (brawer@dandelis.ch)
506   */
507  public static class EtchedBorderUIResource
508    extends EtchedBorder
509    implements UIResource, Serializable
510  {
511    private static final long serialVersionUID = -8186391754165296656L;
512    
513    /**
514     * Constructs an EtchedBorderUIResource that appears lowered into
515     * the surface. The colors will be derived from the background
516     * color of the enclosed Component when the border gets painted.
517     */
518    public EtchedBorderUIResource()
519    {
520      super();
521    }
522    
523    
524    /**
525     * Constructs an EtchedBorderUIResource with the specified
526     * appearance. The colors will be derived from the background
527     * color of the enclosed Component when the border gets painted.
528     *
529     * <p><img src="../border/doc-files/EtchedBorder-1.png"
530     * width="500" height="200" alt="[An illustration of the two
531     * EtchedBorder variants]" /></p>
532     *
533     * @param etchType the desired appearance of the border. The value
534     *        must be either {@link javax.swing.border.EtchedBorder#RAISED}
535     *        or {@link javax.swing.border.EtchedBorder#LOWERED}.
536     *
537     * @throws IllegalArgumentException if <code>etchType</code> has
538     *         an unsupported value.
539     */
540    public EtchedBorderUIResource(int etchType) 
541    {
542      super(etchType);
543    }
544    
545    
546    /**
547     * Constructs a lowered EtchedBorderUIResource, explicitly
548     * selecting the colors that will be used for highlight and
549     * shadow.
550     *
551     * @param highlight the color that will be used for painting
552     *        the highlight part of the border.
553     *
554     * @param shadow the color that will be used for painting
555     *        the shadow part of the border.
556     *
557     * @see EtchedBorderUIResource#EtchedBorderUIResource(int, Color, Color)
558     */
559    public EtchedBorderUIResource(Color highlight, Color shadow)
560    {
561      super(highlight, shadow);
562    }
563    
564    
565    /**
566     * Constructs an EtchedBorderUIResource with the specified
567     * appearance, explicitly selecting the colors that will be used
568     * for highlight and shadow.
569     *
570     * <p><img src="../border/doc-files/EtchedBorder-2.png" width="500"
571     * height="200" alt="[An illustration that shows which pixels get
572     * painted in what color]" /></p>
573     *
574     * @param etchType the desired appearance of the border. The value
575     *        must be either {@link javax.swing.border.EtchedBorder#RAISED}
576     *        or {@link javax.swing.border.EtchedBorder#LOWERED}.
577     *
578     * @param highlight the color that will be used for painting
579     *        the highlight part of the border.
580     *
581     * @param shadow the color that will be used for painting
582     *        the shadow part of the border.
583     *
584     * @throws IllegalArgumentException if <code>etchType</code> has
585     *         an unsupported value.
586     */
587    public EtchedBorderUIResource(int etchType,
588                                  Color highlight, Color shadow)
589    {
590      super(etchType, highlight, shadow);
591    }
592  }
593  
594  
595  /**
596   * A {@link javax.swing.border.LineBorder} that also implements the
597   * {@link UIResource} marker interface.  This is useful for
598   * implementing pluggable look-and-feels: When switching the current
599   * LookAndFeel, only those borders are replaced that are marked as
600   * {@link UIResource}.  For this reason, a look-and-feel should
601   * always install borders that implement <code>UIResource</code>,
602   * such as the borders provided by this class.
603   *
604   * <p><img src="../border/doc-files/LineBorder-1.png" width="500"
605   * height="200" alt="[An illustration of two LineBorders]" /></p>
606   *
607   * @author Brian Jones (cbj@gnu.org)
608   * @author Sascha Brawer (brawer@dandelis.ch)
609   */
610  public static class LineBorderUIResource
611    extends LineBorder
612    implements UIResource, Serializable
613  {
614    private static final long serialVersionUID = -6171232338180172310L;
615    
616    /**
617     * Constructs a LineBorderUIResource given its color.  The border
618     * will be one pixel thick and have plain corners.
619     *
620     * @param color the color for drawing the border.
621     */
622    public LineBorderUIResource(Color color)
623    {
624      super(color); 
625    }
626    
627    
628    /**
629     * Constructs a LineBorder given its color and thickness.  The
630     * border will have plain corners.
631     *
632     * @param color the color for drawing the border.
633     * @param thickness the width of the line in pixels.
634     */
635    public LineBorderUIResource(Color color, int thickness)
636    {
637      super(color, thickness);
638    }
639    
640    
641    /* Note: Since JDK1.3, javax.swing.border.LineBorder also has a
642     * constructor which accepts a value for the roundedCorners
643     * property. However, as of JDK1.4.1, the LineBorderUIResource
644     * subclass does not have a corresponding constructor.
645     * 
646     * A request for enhancing the Swing API has been filed with Sun:
647     * http://developer.java.sun.com/developer/bugParade/bugs/4879999.html
648     */
649  }
650
651
652  /**
653   * A {@link javax.swing.border.MatteBorder} that also implements the
654   * {@link UIResource} marker interface.  This is useful for
655   * implementing pluggable look-and-feels: When switching the current
656   * LookAndFeel, only those borders are replaced that are marked as
657   * {@link UIResource}.  For this reason, a look-and-feel should
658   * always install borders that implement <code>UIResource</code>,
659   * such as the borders provided by this class.
660   *
661   * <p><img src="../border/doc-files/MatteBorder-1.png" width="500"
662   * height="150" alt="[An illustration of two MatteBorders]" /></p>
663   *
664   * @author Brian Jones (cbj@gnu.org)
665   * @author Sascha Brawer (brawer@dandelis.ch)
666   */
667  public static class MatteBorderUIResource
668    extends MatteBorder
669    implements UIResource, Serializable
670  {
671    private static final long serialVersionUID = -8107923147541851122L;
672    
673    /**
674     * Constructs a MatteBorderUIResource given the width on each side
675     * and a fill color.
676     *
677     * <p><img src="../border/doc-files/MatteBorder-2.png" width="500"
678     * height="150" alt="[A picture of a MatteBorder made by this
679     * constructor]" /></p>
680     *
681     * @param top the width of the border at its top edge.
682     * @param left the width of the border at its left edge.
683     * @param bottom the width of the border at its bottom edge.
684     * @param right the width of the border at its right edge.
685     * @param color the color for filling the border.
686     */
687    public MatteBorderUIResource(int top, int left,
688                                 int bottom, int right,
689                                 Color color)
690    {
691      super(top, left, bottom, right, color);
692    }
693    
694    
695    /**
696     * Constructs a MatteBorderUIResource given the width on each side
697     * and an icon for tiling the border area.
698     *
699     * <p><img src="../border/doc-files/MatteBorder-4.png" width="500"
700     * height="150" alt="[A picture of a MatteBorder made by this
701     * constructor]" /></p>
702     *
703     * @param top the width of the border at its top edge.
704     * @param left the width of the border at its left edge.
705     * @param bottom the width of the border at its bottom edge.
706     * @param right the width of the border at its right edge.
707     * @param tileIcon an icon for tiling the border area.
708     */
709    public MatteBorderUIResource(int top, int left,
710                                 int bottom, int right,
711                                 Icon tileIcon)
712    {
713      super(top, left, bottom, right, tileIcon);
714    }
715    
716    
717    /**
718     * Constructs a MatteBorderUIResource given an icon for tiling the
719     * border area. The icon width is used for the border insets at
720     * the left and right edge, the icon height for the top and bottom
721     * edge.
722     *
723     * <p><img src="../border/doc-files/MatteBorder-6.png" width="500"
724     * height="150" alt="[A picture of a MatteBorder made by this
725     * constructor]" /></p>
726     *
727     * @param tileIcon an icon for tiling the border area. 
728     */
729    public MatteBorderUIResource(Icon tileIcon)
730    {
731      super(tileIcon);
732    }
733  }
734  
735  
736  /**
737   * A {@link javax.swing.border.TitledBorder} that also implements the
738   * {@link UIResource} marker interface.  This is useful for
739   * implementing pluggable look-and-feels: When switching the current
740   * LookAndFeel, only those borders are replaced that are marked as
741   * {@link UIResource}.  For this reason, a look-and-feel should
742   * always install borders that implement <code>UIResource</code>,
743   * such as the borders provided by this class.
744   *
745   * @author Brian Jones (cbj@gnu.org)
746   * @author Sascha Brawer (brawer@dandelis.ch)
747   */
748  public static class TitledBorderUIResource
749    extends TitledBorder
750    implements UIResource, Serializable
751  {
752    private static final long serialVersionUID = 7667113547406407427L;
753    
754    /**
755     * Constructs a TitledBorderUIResource given the text of its title.
756     *
757     * @param title the title text, or <code>null</code> to use no
758     *        title text.
759     */
760    public TitledBorderUIResource(String title)
761    {
762      super(title);
763    }
764    
765    
766    /**
767     * Constructs an initially untitled TitledBorderUIResource
768     * given another border.
769     *
770     * @param border the border underneath the title, or
771     *        <code>null</code> to use a default from
772     *        the current look and feel.
773     */
774    public TitledBorderUIResource(Border border)
775    {
776      super(border);
777    }
778    
779    
780    /**
781     * Constructs a TitledBorder given its border and title text.
782     *
783     * @param border the border underneath the title, or
784     *        <code>null</code> to use a default from
785     *        the current look and feel.
786     *
787     * @param title the title text, or <code>null</code>
788     *        to use no title text.
789     */
790    public TitledBorderUIResource(Border border, String title)
791    {
792      super(border, title);
793    }
794
795
796    /**
797     * Constructs a TitledBorderUIResource given its border, title
798     * text, horizontal alignment, and vertical position.
799     *
800     * @param border the border underneath the title, or
801     *        <code>null</code> to use a default
802     *        from the current look and feel.
803     *
804     * @param title the title text, or <code>null</code>
805     *        to use no title text.
806     *
807     * @param titleJustification the horizontal alignment of the title
808     *        text in relation to the border. The value must be one of
809     *        {@link javax.swing.border.TitledBorder#LEFT},
810     *        {@link javax.swing.border.TitledBorder#CENTER},
811     *        {@link javax.swing.border.TitledBorder#RIGHT},
812     *        {@link javax.swing.border.TitledBorder#LEADING},
813     *        {@link javax.swing.border.TitledBorder#TRAILING}, or
814     *        {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
815     *
816     * @param titlePosition the vertical position of the title text
817     *        in relation to the border. The value must be one of
818     *        {@link javax.swing.border.TitledBorder#ABOVE_TOP},
819     *        {@link javax.swing.border.TitledBorder#TOP},
820     *        {@link javax.swing.border.TitledBorder#BELOW_TOP},
821     *        {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
822     *        {@link javax.swing.border.TitledBorder#BOTTOM},
823     *        {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
824     *        or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
825     *
826     * @throws IllegalArgumentException if <code>titleJustification</code>
827     *         or <code>titlePosition</code> have an unsupported value.
828     */
829    public TitledBorderUIResource(Border border, String title,
830                                  int titleJustification,
831                                  int titlePosition)
832    {
833      super(border, title, titleJustification, titlePosition);
834    }
835
836
837    /**
838     * Constructs a TitledBorder given its border, title text,
839     * horizontal alignment, vertical position, and font.
840     *
841     * @param border the border underneath the title, or
842     *        <code>null</code> to use a default
843     *        from the current look and feel.
844     *
845     * @param title the title text, or <code>null</code>
846     *        to use no title text.
847     *
848     * @param titleJustification the horizontal alignment of the title
849     *        text in relation to the border. The value must be one of
850     *        {@link javax.swing.border.TitledBorder#LEFT},
851     *        {@link javax.swing.border.TitledBorder#CENTER},
852     *        {@link javax.swing.border.TitledBorder#RIGHT},
853     *        {@link javax.swing.border.TitledBorder#LEADING},
854     *        {@link javax.swing.border.TitledBorder#TRAILING}, or
855     *        {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
856     *
857     * @param titlePosition the vertical position of the title text
858     *        in relation to the border. The value must be one of
859     *        {@link javax.swing.border.TitledBorder#ABOVE_TOP},
860     *        {@link javax.swing.border.TitledBorder#TOP},
861     *        {@link javax.swing.border.TitledBorder#BELOW_TOP},
862     *        {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
863     *        {@link javax.swing.border.TitledBorder#BOTTOM},
864     *        {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
865     *        or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
866     *
867     * @param titleFont the font for the title text, or <code>null</code>
868     *        to use a default from the current look and feel.
869     *
870     * @throws IllegalArgumentException if <code>titleJustification</code>
871     *         or <code>titlePosition</code> have an unsupported value.
872     */
873    public TitledBorderUIResource(Border border, String title,
874                                  int titleJustification,
875                                  int titlePosition,
876                                  Font titleFont)
877    {
878      super(border, title, titleJustification, titlePosition,
879            titleFont);
880    }
881    
882    
883    /**
884     * Constructs a TitledBorder given its border, title text,
885     * horizontal alignment, vertical position, font, and color.
886     *
887     * @param border the border underneath the title, or
888     *        <code>null</code> to use a default
889     *        from the current look and feel.
890     *
891     * @param title the title text, or <code>null</code>
892     *        to use no title text.
893     *
894     * @param titleJustification the horizontal alignment of the title
895     *        text in relation to the border. The value must be one of
896     *        {@link javax.swing.border.TitledBorder#LEFT},
897     *        {@link javax.swing.border.TitledBorder#CENTER},
898     *        {@link javax.swing.border.TitledBorder#RIGHT},
899     *        {@link javax.swing.border.TitledBorder#LEADING},
900     *        {@link javax.swing.border.TitledBorder#TRAILING}, or
901     *        {@link javax.swing.border.TitledBorder#DEFAULT_JUSTIFICATION}.
902     *
903     * @param titlePosition the vertical position of the title text
904     *        in relation to the border. The value must be one of
905     *        {@link javax.swing.border.TitledBorder#ABOVE_TOP},
906     *        {@link javax.swing.border.TitledBorder#TOP},
907     *        {@link javax.swing.border.TitledBorder#BELOW_TOP},
908     *        {@link javax.swing.border.TitledBorder#ABOVE_BOTTOM},
909     *        {@link javax.swing.border.TitledBorder#BOTTOM},
910     *        {@link javax.swing.border.TitledBorder#BELOW_BOTTOM},
911     *        or {@link javax.swing.border.TitledBorder#DEFAULT_POSITION}.
912     *
913     * @param titleFont the font for the title text, or <code>null</code>
914     *        to use a default from the current look and feel.
915     *
916     * @param titleColor the color for the title text, or <code>null</code>
917     *        to use a default from the current look and feel.
918     *
919     * @throws IllegalArgumentException if <code>titleJustification</code>
920     *         or <code>titlePosition</code> have an unsupported value.
921     */
922    public TitledBorderUIResource(Border border, String title,
923                                  int titleJustification, int titlePosition,
924                                  Font titleFont, Color titleColor)
925    {
926      super(border, title, titleJustification, titlePosition,
927            titleFont, titleColor);
928    }
929  }
930}
931