001    /* BorderUIResource.java
002       Copyright (C) 2002, 2003, 2004  Free Software Foundation, Inc.
003    
004    This file is part of GNU Classpath.
005    
006    GNU Classpath is free software; you can redistribute it and/or modify
007    it under the terms of the GNU General Public License as published by
008    the Free Software Foundation; either version 2, or (at your option)
009    any later version.
010     
011    GNU Classpath is distributed in the hope that it will be useful, but
012    WITHOUT ANY WARRANTY; without even the implied warranty of
013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014    General Public License for more details.
015    
016    You should have received a copy of the GNU General Public License
017    along with GNU Classpath; see the file COPYING.  If not, write to the
018    Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019    02110-1301 USA.
020    
021    Linking this library statically or dynamically with other modules is
022    making a combined work based on this library.  Thus, the terms and
023    conditions of the GNU General Public License cover the whole
024    combination.
025    
026    As a special exception, the copyright holders of this library give you
027    permission to link this library with independent modules to produce an
028    executable, regardless of the license terms of these independent
029    modules, and to copy and distribute the resulting executable under
030    terms of your choice, provided that you also meet, for each linked
031    independent module, the terms and conditions of the license of that
032    module.  An independent module is a module which is not derived from
033    or based on this library.  If you modify this library, you may extend
034    this exception to your version of the library, but you are not
035    obligated to do so.  If you do not wish to do so, delete this
036    exception statement from your version. */
037    
038    
039    package javax.swing.plaf;
040    
041    import java.awt.Color;
042    import java.awt.Component;
043    import java.awt.Font;
044    import java.awt.Graphics;
045    import java.awt.Insets;
046    import java.io.Serializable;
047    
048    import javax.swing.Icon;
049    import javax.swing.border.BevelBorder;
050    import javax.swing.border.Border;
051    import javax.swing.border.CompoundBorder;
052    import javax.swing.border.EmptyBorder;
053    import javax.swing.border.EtchedBorder;
054    import javax.swing.border.LineBorder;
055    import javax.swing.border.MatteBorder;
056    import 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     */
074    public 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