001    /* StyleConstants.java --
002       Copyright (C) 2004, 2005, 2006 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.text;
040    
041    import java.awt.Color;
042    import java.awt.Component;
043    import java.util.ArrayList;
044    
045    import javax.swing.Icon;
046    
047    /**
048     * Represents standard attribute keys.  This class also contains a set of 
049     * useful static utility methods for querying and populating an 
050     * {@link AttributeSet}.
051     * 
052     * @since 1.2
053     */
054    public class StyleConstants
055    {
056      /** 
057       * A value representing left alignment for the 
058       * {@link ParagraphConstants#Alignment} attribute. 
059       */
060      public static final int ALIGN_LEFT = 0;
061    
062      /** 
063       * A value representing center alignment for the 
064       * {@link ParagraphConstants#Alignment} attribute. 
065       */
066      public static final int ALIGN_CENTER = 1;
067    
068      /** 
069       * A value representing right alignment for the 
070       * {@link ParagraphConstants#Alignment} attribute. 
071       */
072      public static final int ALIGN_RIGHT = 2;
073    
074      /** 
075       * A value representing ful justification for the 
076       * {@link ParagraphConstants#Alignment} attribute. 
077       */
078      public static final int ALIGN_JUSTIFIED = 3;
079    
080      /** An alias for {@link CharacterConstants#Background}. */
081      public static final Object Background = CharacterConstants.Background;
082    
083      /** An alias for {@link CharacterConstants#BidiLevel}. */
084      public static final Object BidiLevel = CharacterConstants.BidiLevel;
085      
086      /** An alias for {@link CharacterConstants#Bold}. */
087      public static final Object Bold = CharacterConstants.Bold;
088      
089      /** An alias for {@link CharacterConstants#ComponentAttribute}. */
090      public static final Object ComponentAttribute 
091          = CharacterConstants.ComponentAttribute;
092      
093      /** An alias for {@link CharacterConstants#Family}. */
094      public static final Object Family = CharacterConstants.Family;
095      
096      /** An alias for {@link CharacterConstants#Family}. */
097      public static final Object FontFamily = CharacterConstants.Family;  
098      
099      /** An alias for {@link CharacterConstants#Size}. */
100      public static final Object FontSize = CharacterConstants.Size;
101      
102      /** An alias for {@link CharacterConstants#Foreground}. */
103      public static final Object Foreground = CharacterConstants.Foreground;
104      
105      /** An alias for {@link CharacterConstants#IconAttribute}. */
106      public static final Object IconAttribute = CharacterConstants.IconAttribute;
107      
108      /** An alias for {@link CharacterConstants#Italic}. */
109      public static final Object Italic = CharacterConstants.Italic;
110      
111      /** An alias for {@link CharacterConstants#Size}. */
112      public static final Object Size = CharacterConstants.Size;
113      
114      /** An alias for {@link CharacterConstants#StrikeThrough}. */
115      public static final Object StrikeThrough = CharacterConstants.StrikeThrough;
116      
117      /** An alias for {@link CharacterConstants#Subscript}. */
118      public static final Object Subscript = CharacterConstants.Subscript;
119      
120      /** An alias for {@link CharacterConstants#Superscript}. */
121      public static final Object Superscript = CharacterConstants.Superscript;
122      
123      /** An alias for {@link CharacterConstants#Underline}. */
124      public static final Object Underline = CharacterConstants.Underline;
125    
126      /** An alias for {@link ParagraphConstants#Alignment}. */
127      public static final Object Alignment = ParagraphConstants.Alignment;
128      
129      /** An alias for {@link ParagraphConstants#FirstLineIndent}. */
130      public static final Object FirstLineIndent 
131          = ParagraphConstants.FirstLineIndent;
132      
133      /** An alias for {@link ParagraphConstants#LeftIndent}. */
134      public static final Object LeftIndent = ParagraphConstants.LeftIndent;
135      
136      /** An alias for {@link ParagraphConstants#LineSpacing}. */
137      public static final Object LineSpacing = ParagraphConstants.LineSpacing;
138      
139      /** An alias for {@link ParagraphConstants#Orientation}. */
140      public static final Object Orientation = ParagraphConstants.Orientation;
141      
142      /** An alias for {@link ParagraphConstants#RightIndent}. */
143      public static final Object RightIndent = ParagraphConstants.RightIndent;
144      
145      /** An alias for {@link ParagraphConstants#SpaceAbove}. */
146      public static final Object SpaceAbove = ParagraphConstants.SpaceAbove;
147      
148      /** An alias for {@link ParagraphConstants#SpaceBelow}. */
149      public static final Object SpaceBelow = ParagraphConstants.SpaceBelow;
150      
151      /** An alias for {@link ParagraphConstants#TabSet}. */
152      public static final Object TabSet = ParagraphConstants.TabSet;
153    
154      public static final String ComponentElementName = "component";
155    
156      public static final String IconElementName = "icon";
157    
158      public static final Object ComposedTextAttribute 
159          = new StyleConstants("composed text");
160      
161      public static final Object ModelAttribute = new StyleConstants("model");
162      
163      public static final Object NameAttribute = new StyleConstants("name");
164      
165      public static final Object ResolveAttribute = new StyleConstants("resolver");
166    
167      /**
168       * All StyleConstants keys. This is used in StyleContext to register
169       * all known keys as static attribute keys for serialization.
170       */
171      static ArrayList keys;
172    
173      String keyname;
174    
175      // Package-private to avoid accessor constructor for use by
176      // subclasses.
177      StyleConstants(String k) 
178      {
179        keyname = k;
180        if (keys == null)
181          keys = new ArrayList();
182        keys.add(this);
183      }
184    
185      /**
186       * Returns a string representation of the attribute key.
187       * 
188       * @return A string representation of the attribute key.
189       */
190      public String toString()
191      {
192        return keyname;
193      }
194    
195      /**
196       * Returns the alignment specified in the given attributes, or 
197       * {@link #ALIGN_LEFT} if no alignment is specified.
198       * 
199       * @param a  the attribute set (<code>null</code> not permitted).
200       * 
201       * @return The alignment (typically one of {@link #ALIGN_LEFT}, 
202       *         {@link #ALIGN_RIGHT}, {@link #ALIGN_CENTER} or 
203       *         {@link #ALIGN_JUSTIFIED}).
204       *         
205       * @see #setAlignment(MutableAttributeSet, int)
206       */
207      public static int getAlignment(AttributeSet a)
208      {
209        Integer i = (Integer) a.getAttribute(Alignment);
210        if (i != null)
211          return i.intValue();
212        else
213          return ALIGN_LEFT;      
214      } 
215    
216      /**
217       * Returns the background color specified in the given attributes, or
218       * {@link Color#BLACK} if no background color is specified.
219       * 
220       * @param a  the attribute set (<code>null</code> not permitted).
221       * 
222       * @return The background color.
223       * 
224       * @see #setBackground(MutableAttributeSet, Color)
225       */
226      public static Color getBackground(AttributeSet a)
227      {
228        Color c = (Color) a.getAttribute(Background);
229        if (c != null) 
230          return c;
231        else
232          return Color.BLACK;
233      } 
234    
235      /**
236       * Returns the bidi level specified in the given attributes, or 
237       * <code>0</code> if no bidi level is specified.
238       * 
239       * @param a  the attribute set (<code>null</code> not permitted).
240       * 
241       * @return The bidi level.
242       * 
243       * @see #setBidiLevel(MutableAttributeSet, int)
244       */  
245      public static int getBidiLevel(AttributeSet a)
246      {
247        Integer i = (Integer) a.getAttribute(BidiLevel);
248        if (i != null)
249          return i.intValue();
250        else
251          return 0;
252      } 
253    
254      /**
255       * Returns the component specified in the given attributes, or 
256       * <code>null</code> if no component is specified.
257       * 
258       * @param a  the attribute set (<code>null</code> not permitted).
259       * 
260       * @return The component (possibly <code>null</code>).
261       * 
262       * @see #setComponent(MutableAttributeSet, Component)
263       */    
264      public static Component getComponent(AttributeSet a)
265      {
266        Component c = (Component) a.getAttribute(ComponentAttribute);
267        if (c != null)
268          return c;
269        else
270          return null;
271      } 
272    
273      /**
274       * Returns the indentation specified in the given attributes, or 
275       * <code>0.0f</code> if no indentation is specified.
276       * 
277       * @param a  the attribute set (<code>null</code> not permitted).
278       * 
279       * @return The indentation.
280       * 
281       * @see #setFirstLineIndent(MutableAttributeSet, float)
282       */    
283      public static float getFirstLineIndent(AttributeSet a)
284      {
285        Float f = (Float) a.getAttribute(FirstLineIndent);
286        if (f != null)
287          return f.floatValue();
288        else
289          return 0.0f;
290      } 
291    
292      /**
293       * Returns the font family specified in the given attributes, or 
294       * <code>Monospaced</code> if no font family is specified.
295       * 
296       * @param a  the attribute set (<code>null</code> not permitted).
297       * 
298       * @return The font family.
299       * 
300       * @see #setFontFamily(MutableAttributeSet, String)
301       */    
302      public static String getFontFamily(AttributeSet a)
303      {
304        String ff = (String) a.getAttribute(FontFamily);
305        if (ff != null)
306          return ff;
307        else
308          return "Monospaced";
309      } 
310    
311      /**
312       * Returns the font size specified in the given attributes, or 
313       * <code>12</code> if no font size is specified.
314       * 
315       * @param a  the attribute set (<code>null</code> not permitted).
316       * 
317       * @return The font size.
318       * 
319       * @see #setFontSize(MutableAttributeSet, int)
320       */  
321      public static int getFontSize(AttributeSet a)
322      {
323        Integer i = (Integer) a.getAttribute(FontSize);
324        if (i != null)
325          return i.intValue();
326        else
327          return 12;
328      } 
329    
330      /**
331       * Returns the foreground color specified in the given attributes, or
332       * {@link Color#BLACK} if no foreground color is specified.
333       * 
334       * @param a  the attribute set (<code>null</code> not permitted).
335       * 
336       * @return The foreground color.
337       * 
338       * @see #setForeground(MutableAttributeSet, Color)
339       */
340      public static Color getForeground(AttributeSet a)
341      {
342        Color c = (Color) a.getAttribute(Foreground);
343        if (c != null)
344          return c;
345        else
346          return Color.BLACK;
347      } 
348    
349      /**
350       * Returns the icon specified in the given attributes, or 
351       * <code>null</code> if no icon is specified.
352       * 
353       * @param a  the attribute set (<code>null</code> not permitted).
354       * 
355       * @return The icon (possibly <code>null</code>).
356       * 
357       * @see #setIcon(MutableAttributeSet, Icon)
358       */    
359      public static Icon getIcon(AttributeSet a)
360      {
361        return (Icon) a.getAttribute(IconAttribute);
362      } 
363    
364      /**
365       * Returns the left indentation specified in the given attributes, or 
366       * <code>0.0f</code> if no left indentation is specified.
367       * 
368       * @param a  the attribute set (<code>null</code> not permitted).
369       * 
370       * @return The left indentation.
371       * 
372       * @see #setLeftIndent(MutableAttributeSet, float)
373       */    
374      public static float getLeftIndent(AttributeSet a)
375      {
376        Float f = (Float) a.getAttribute(LeftIndent);
377        if (f != null)
378          return f.floatValue();
379        else
380          return 0.0f;
381      } 
382    
383      /**
384       * Returns the line spacing specified in the given attributes, or 
385       * <code>0.0f</code> if no line spacing is specified.
386       * 
387       * @param a  the attribute set (<code>null</code> not permitted).
388       * 
389       * @return The line spacing.
390       * 
391       * @see #setLineSpacing(MutableAttributeSet, float)
392       */    
393      public static float getLineSpacing(AttributeSet a)
394      {
395        Float f = (Float) a.getAttribute(LineSpacing);
396        if (f != null)
397          return f.floatValue();
398        else
399          return 0.0f;
400      } 
401    
402      /**
403       * Returns the right indentation specified in the given attributes, or 
404       * <code>0.0f</code> if no right indentation is specified.
405       * 
406       * @param a  the attribute set (<code>null</code> not permitted).
407       * 
408       * @return The right indentation.
409       * 
410       * @see #setRightIndent(MutableAttributeSet, float)
411       */    
412      public static float getRightIndent(AttributeSet a)
413      {
414        Float f = (Float) a.getAttribute(RightIndent);
415        if (f != null)
416          return f.floatValue();
417        else
418          return 0.0f;
419      } 
420    
421      /**
422       * Returns the 'space above' specified in the given attributes, or 
423       * <code>0.0f</code> if no 'space above' is specified.
424       * 
425       * @param a  the attribute set (<code>null</code> not permitted).
426       * 
427       * @return The 'space above'.
428       * 
429       * @see #setSpaceAbove(MutableAttributeSet, float)
430       */    
431      public static float getSpaceAbove(AttributeSet a)
432      {
433        Float f = (Float) a.getAttribute(SpaceAbove);
434        if (f != null)
435          return f.floatValue();
436        else 
437          return 0.0f;
438      } 
439    
440      /**
441       * Returns the 'space below' specified in the given attributes, or 
442       * <code>0.0f</code> if no 'space below' is specified.
443       * 
444       * @param a  the attribute set (<code>null</code> not permitted).
445       * 
446       * @return The 'space below'.
447       * 
448       * @see #setSpaceBelow(MutableAttributeSet, float)
449       */    
450      public static float getSpaceBelow(AttributeSet a)
451      {
452        Float f = (Float) a.getAttribute(SpaceBelow);
453        if (f != null)
454          return f.floatValue();
455        else
456          return 0.0f;
457      } 
458    
459      /**
460       * Returns the tab set specified in the given attributes, or 
461       * <code>null</code> if no tab set is specified.
462       * 
463       * @param a  the attribute set (<code>null</code> not permitted).
464       * 
465       * @return The tab set.
466       * 
467       * @see #setTabSet(MutableAttributeSet, javax.swing.text.TabSet)
468       */    
469      public static javax.swing.text.TabSet getTabSet(AttributeSet a)
470      {
471        // I'm guessing that the fully qualified class name is to differentiate
472        // between the TabSet class and the TabSet (attribute) instance on some
473        // compiler...
474        return (javax.swing.text.TabSet) a.getAttribute(StyleConstants.TabSet);
475      } 
476    
477      /**
478       * Returns the value of the bold flag in the given attributes, or 
479       * <code>false</code> if no bold flag is specified.
480       * 
481       * @param a  the attribute set (<code>null</code> not permitted).
482       * 
483       * @return The bold flag.
484       * 
485       * @see #setBold(MutableAttributeSet, boolean)
486       */
487      public static boolean isBold(AttributeSet a)
488      {
489        Boolean b = (Boolean) a.getAttribute(Bold);
490        if (b != null)
491          return b.booleanValue();
492        else
493          return false;
494      } 
495    
496      /**
497       * Returns the value of the italic flag in the given attributes, or 
498       * <code>false</code> if no italic flag is specified.
499       * 
500       * @param a  the attribute set (<code>null</code> not permitted).
501       * 
502       * @return The italic flag.
503       * 
504       * @see #setItalic(MutableAttributeSet, boolean)
505       */
506      public static boolean isItalic(AttributeSet a)
507      {
508        Boolean b = (Boolean) a.getAttribute(Italic);
509        if (b != null)
510          return b.booleanValue();
511        else
512          return false;
513      } 
514    
515      /**
516       * Returns the value of the strike-through flag in the given attributes, or 
517       * <code>false</code> if no strike-through flag is specified.
518       * 
519       * @param a  the attribute set (<code>null</code> not permitted).
520       * 
521       * @return The strike-through flag.
522       * 
523       * @see #setStrikeThrough(MutableAttributeSet, boolean)
524       */
525      public static boolean isStrikeThrough(AttributeSet a)
526      {
527        Boolean b = (Boolean) a.getAttribute(StrikeThrough);
528        if (b != null)
529          return b.booleanValue();
530        else
531          return false;
532      } 
533    
534      /**
535       * Returns the value of the subscript flag in the given attributes, or 
536       * <code>false</code> if no subscript flag is specified.
537       * 
538       * @param a  the attribute set (<code>null</code> not permitted).
539       * 
540       * @return The subscript flag.
541       * 
542       * @see #setSubscript(MutableAttributeSet, boolean)
543       */
544      public static boolean isSubscript(AttributeSet a)
545      {
546        Boolean b = (Boolean) a.getAttribute(Subscript);
547        if (b != null)
548          return b.booleanValue();
549        else
550          return false;
551      } 
552    
553      /**
554       * Returns the value of the superscript flag in the given attributes, or 
555       * <code>false</code> if no superscript flag is specified.
556       * 
557       * @param a  the attribute set (<code>null</code> not permitted).
558       * 
559       * @return The superscript flag.
560       * 
561       * @see #setSuperscript(MutableAttributeSet, boolean)
562       */
563      public static boolean isSuperscript(AttributeSet a)
564      {
565        Boolean b = (Boolean) a.getAttribute(Superscript);
566        if (b != null)
567          return b.booleanValue();
568        else 
569          return false;
570      } 
571    
572      /**
573       * Returns the value of the underline flag in the given attributes, or 
574       * <code>false</code> if no underline flag is specified.
575       * 
576       * @param a  the attribute set (<code>null</code> not permitted).
577       * 
578       * @return The underline flag.
579       * 
580       * @see #setUnderline(MutableAttributeSet, boolean)
581       */
582      public static boolean isUnderline(AttributeSet a)
583      {
584        Boolean b = (Boolean) a.getAttribute(Underline);
585        if (b != null)
586          return b.booleanValue();
587        else
588          return false;
589      } 
590    
591      /**
592       * Adds an alignment attribute to the specified set.
593       * 
594       * @param a  the attribute set (<code>null</code> not permitted).
595       * @param align  the alignment (typically one of 
596       *               {@link StyleConstants#ALIGN_LEFT}, 
597       *               {@link StyleConstants#ALIGN_RIGHT}, 
598       *               {@link StyleConstants#ALIGN_CENTER} or 
599       *               {@link StyleConstants#ALIGN_JUSTIFIED}).
600       * 
601       * @throws NullPointerException if <code>a</code> is <code>null</code>.
602       * 
603       * @see #getAlignment(AttributeSet)
604       */
605      public static void setAlignment(MutableAttributeSet a, int align)
606      {
607        a.addAttribute(Alignment, new Integer(align));
608      } 
609    
610      /**
611       * Adds a background attribute to the specified set.
612       * 
613       * @param a  the attribute set (<code>null</code> not permitted).
614       * @param bg  the background (<code>null</code> not permitted).
615       * 
616       * @throws NullPointerException if either argument is <code>null</code>.
617       * 
618       * @see #getBackground(AttributeSet)
619       */
620      public static void setBackground(MutableAttributeSet a, Color bg)
621      {
622        a.addAttribute(Background, bg);
623      } 
624    
625      /**
626       * Adds a bidi-level attribute to the specified set.
627       * 
628       * @param a  the attribute set (<code>null</code> not permitted).
629       * @param lev  the level.
630       * 
631       * @throws NullPointerException if <code>a</code> is <code>null</code>.
632       * 
633       * @see #getBidiLevel(AttributeSet)
634       */
635      public static void setBidiLevel(MutableAttributeSet a, int lev)
636      {
637        a.addAttribute(BidiLevel, new Integer(lev));
638      } 
639    
640      /**
641       * Adds a bold attribute to the specified set.
642       * 
643       * @param a  the attribute set (<code>null</code> not permitted).
644       * @param b  the new value of the bold attribute.
645       * 
646       * @throws NullPointerException if <code>a</code> is <code>null</code>.
647       * 
648       * @see #isBold(AttributeSet)
649       */
650      public static void setBold(MutableAttributeSet a, boolean b)
651      {
652        a.addAttribute(Bold, Boolean.valueOf(b));
653      } 
654      
655      /**
656       * Adds a component attribute to the specified set.
657       * 
658       * @param a  the attribute set (<code>null</code> not permitted).
659       * @param c  the component (<code>null</code> not permitted).
660       * 
661       * @throws NullPointerException if either argument is <code>null</code>.
662       * 
663       * @see #getComponent(AttributeSet)
664       */
665      public static void setComponent(MutableAttributeSet a, Component c)
666      {
667        a.addAttribute(ComponentAttribute, c);
668      } 
669    
670      /**
671       * Adds a first line indentation attribute to the specified set.
672       * 
673       * @param a  the attribute set (<code>null</code> not permitted).
674       * @param i  the indentation.
675       * 
676       * @throws NullPointerException if <code>a</code> is <code>null</code>.
677       * 
678       * @see #getFirstLineIndent(AttributeSet)
679       */
680      public static void setFirstLineIndent(MutableAttributeSet a, float i)
681      {
682        a.addAttribute(FirstLineIndent, new Float(i));
683      } 
684    
685      /**
686       * Adds a font family attribute to the specified set.
687       * 
688       * @param a  the attribute set (<code>null</code> not permitted).
689       * @param fam  the font family name (<code>null</code> not permitted).
690       * 
691       * @throws NullPointerException if either argument is <code>null</code>.
692       * 
693       * @see #getFontFamily(AttributeSet)
694       */
695      public static void setFontFamily(MutableAttributeSet a, String fam)
696      {
697        a.addAttribute(FontFamily, fam);
698      } 
699    
700      /**
701       * Adds a font size attribute to the specified set.
702       * 
703       * @param a  the attribute set (<code>null</code> not permitted).
704       * @param s  the font size (in points).
705       * 
706       * @throws NullPointerException if <code>a</code> is <code>null</code>.
707       * 
708       * @see #getFontSize(AttributeSet)
709       */
710      public static void setFontSize(MutableAttributeSet a, int s)
711      {
712        a.addAttribute(FontSize, new Integer(s));
713      } 
714    
715      /**
716       * Adds a foreground color attribute to the specified set.
717       * 
718       * @param a  the attribute set (<code>null</code> not permitted).
719       * @param fg  the foreground color (<code>null</code> not permitted).
720       * 
721       * @throws NullPointerException if either argument is <code>null</code>.
722       * 
723       * @see #getForeground(AttributeSet)
724       */
725      public static void setForeground(MutableAttributeSet a, Color fg)
726      {
727        a.addAttribute(Foreground, fg);
728      }
729    
730      /**
731       * Adds an icon attribute to the specified set.
732       * 
733       * @param a  the attribute set (<code>null</code> not permitted).
734       * @param c  the icon (<code>null</code> not permitted).
735       * 
736       * @throws NullPointerException if either argument is <code>null</code>.
737       * 
738       * @see #getIcon(AttributeSet)
739       */
740      public static void setIcon(MutableAttributeSet a, Icon c)
741      {
742        a.addAttribute(AbstractDocument.ElementNameAttribute, IconElementName);
743        a.addAttribute(IconAttribute, c);
744      }
745     
746      /**
747       * Adds an italic attribute to the specified set.
748       * 
749       * @param a  the attribute set (<code>null</code> not permitted).
750       * @param b  the new value of the italic attribute.
751       * 
752       * @throws NullPointerException if <code>a</code> is <code>null</code>.
753       * 
754       * @see #isItalic(AttributeSet)
755       */
756      public static void setItalic(MutableAttributeSet a, boolean b)
757      {
758        a.addAttribute(Italic, Boolean.valueOf(b));
759      }
760     
761      /**
762       * Adds a left indentation attribute to the specified set.
763       * 
764       * @param a  the attribute set (<code>null</code> not permitted).
765       * @param i  the indentation.
766       * 
767       * @throws NullPointerException if <code>a</code> is <code>null</code>.
768       * 
769       * @see #getLeftIndent(AttributeSet)
770       */
771      public static void setLeftIndent(MutableAttributeSet a, float i)
772      {
773        a.addAttribute(LeftIndent, new Float(i));
774      } 
775    
776      /**
777       * Adds a line spacing attribute to the specified set.
778       * 
779       * @param a  the attribute set (<code>null</code> not permitted).
780       * @param i  the line spacing.
781       * 
782       * @throws NullPointerException if <code>a</code> is <code>null</code>.
783       * 
784       * @see #getLineSpacing(AttributeSet)
785       */
786      public static void setLineSpacing(MutableAttributeSet a, float i)
787      {
788        a.addAttribute(LineSpacing, new Float(i));
789      } 
790    
791      /**
792       * Adds a right indentation attribute to the specified set.
793       * 
794       * @param a  the attribute set (<code>null</code> not permitted).
795       * @param i  the right indentation.
796       * 
797       * @throws NullPointerException if <code>a</code> is <code>null</code>.
798       * 
799       * @see #getRightIndent(AttributeSet)
800       */
801      public static void setRightIndent(MutableAttributeSet a, float i)
802      {
803        a.addAttribute(RightIndent, new Float(i));
804      } 
805    
806      /**
807       * Adds a 'space above' attribute to the specified set.
808       * 
809       * @param a  the attribute set (<code>null</code> not permitted).
810       * @param i  the space above attribute value.
811       * 
812       * @throws NullPointerException if <code>a</code> is <code>null</code>.
813       * 
814       * @see #getSpaceAbove(AttributeSet)
815       */
816      public static void setSpaceAbove(MutableAttributeSet a, float i)
817      {
818        a.addAttribute(SpaceAbove, new Float(i));
819      } 
820    
821      /**
822       * Adds a 'space below' attribute to the specified set.
823       * 
824       * @param a  the attribute set (<code>null</code> not permitted).
825       * @param i  the space below attribute value.
826       * 
827       * @throws NullPointerException if <code>a</code> is <code>null</code>.
828       * 
829       * @see #getSpaceBelow(AttributeSet)
830       */
831      public static void setSpaceBelow(MutableAttributeSet a, float i)
832      {
833        a.addAttribute(SpaceBelow, new Float(i));
834      } 
835    
836      /**
837       * Adds a strike-through attribue to the specified set.
838       * 
839       * @param a  the attribute set (<code>null</code> not permitted).
840       * @param b  the strike-through attribute value.
841       * 
842       * @throws NullPointerException if <code>a</code> is <code>null</code>.
843       * 
844       * @see #isStrikeThrough(AttributeSet)
845       */
846      public static void setStrikeThrough(MutableAttributeSet a, boolean b)
847      {
848        a.addAttribute(StrikeThrough, Boolean.valueOf(b));
849      } 
850    
851      /**
852       * Adds a subscript attribute to the specified set.
853       * 
854       * @param a  the attribute set (<code>null</code> not permitted).
855       * @param b  the subscript attribute value.
856       * 
857       * @throws NullPointerException if <code>a</code> is <code>null</code>.
858       * 
859       * @see #isSubscript(AttributeSet)
860       */
861      public static void setSubscript(MutableAttributeSet a, boolean b)
862      {
863        a.addAttribute(Subscript, Boolean.valueOf(b));
864      } 
865    
866      /**
867       * Adds a superscript attribute to the specified set.
868       * 
869       * @param a  the attribute set (<code>null</code> not permitted).
870       * @param b  the superscript attribute value.
871       * 
872       * @throws NullPointerException if <code>a</code> is <code>null</code>.
873       * 
874       * @see #isSuperscript(AttributeSet)
875       */
876      public static void setSuperscript(MutableAttributeSet a, boolean b)
877      {
878        a.addAttribute(Superscript, Boolean.valueOf(b));
879      } 
880    
881      /**
882       * Adds a {@link TabSet} attribute to the specified set.
883       * 
884       * @param a  the attribute set (<code>null</code> not permitted).
885       * @param tabs  the tab set (<code>null</code> not permitted).
886       * 
887       * @throws NullPointerException if either argument is <code>null</code>.
888       * 
889       * @see #getTabSet(AttributeSet)
890       */
891      public static void setTabSet(MutableAttributeSet a, 
892                                   javax.swing.text.TabSet tabs)
893      {
894        a.addAttribute(StyleConstants.TabSet, tabs);
895      } 
896    
897      /**
898       * Adds an underline attribute to the specified set.
899       * 
900       * @param a  the attribute set (<code>null</code> not permitted).
901       * @param b  the underline attribute value.
902       * 
903       * @throws NullPointerException if <code>a</code> is <code>null</code>.
904       * 
905       * @see #isUnderline(AttributeSet)
906       */
907      public static void setUnderline(MutableAttributeSet a, boolean b)
908      {
909        a.addAttribute(Underline, Boolean.valueOf(b));
910      } 
911    
912      // The remainder are so-called "typesafe enumerations" which 
913      // alias subsets of the above constants.
914    
915      /**
916       * A set of keys for attributes that apply to characters.
917       */
918      public static class CharacterConstants
919        extends StyleConstants
920        implements AttributeSet.CharacterAttribute
921      {
922        /**
923         * Private constructor prevents new instances being created.
924         * 
925         * @param k  the key name.
926         */
927        private CharacterConstants(String k) 
928        {
929          super(k);
930        }
931        
932        /** An alias for {@link ColorConstants#Background}. */
933        public static final Object Background = ColorConstants.Background;
934        
935        /** A key for the bidi level character attribute. */
936        public static final Object BidiLevel = new CharacterConstants("bidiLevel");
937        
938        /** An alias for {@link FontConstants#Bold}. */
939        public static final Object Bold = FontConstants.Bold;
940        
941        /** A key for the component character attribute. */
942        public static final Object ComponentAttribute 
943            = new CharacterConstants("component");
944        
945        /** An alias for {@link FontConstants#Family}. */
946        public static final Object Family = FontConstants.Family;
947        
948        /** An alias for {@link FontConstants#Size}. */
949        public static final Object Size = FontConstants.Size;
950        
951        /** An alias for {@link ColorConstants#Foreground}. */
952        public static final Object Foreground = ColorConstants.Foreground;
953        
954        /** A key for the icon character attribute. */
955        public static final Object IconAttribute = new CharacterConstants("icon");
956        
957        /** A key for the italic character attribute. */
958        public static final Object Italic = FontConstants.Italic;
959        
960        /** A key for the strike through character attribute. */
961        public static final Object StrikeThrough 
962            = new CharacterConstants("strikethrough");
963        
964        /** A key for the subscript character attribute. */
965        public static final Object Subscript = new CharacterConstants("subscript");
966        
967        /** A key for the superscript character attribute. */
968        public static final Object Superscript 
969            = new CharacterConstants("superscript");
970        
971        /** A key for the underline character attribute. */
972        public static final Object Underline = new CharacterConstants("underline");
973      
974      }
975    
976      /**
977       * A set of keys for attributes that relate to colors.
978       */
979      public static class ColorConstants
980        extends StyleConstants
981        implements AttributeSet.ColorAttribute, AttributeSet.CharacterAttribute
982      {
983        /**
984         * Private constructor prevents new instances being created.
985         * 
986         * @param k  the key name.
987         */
988        private ColorConstants(String k) 
989        {
990          super(k);
991        }
992        
993        /** A key for the foreground color attribute. */
994        public static final Object Foreground = new ColorConstants("foreground");
995    
996        /** A key for the background color attribute. */
997        public static final Object Background = new ColorConstants("background");
998      }
999    
1000      /**
1001       * A set of keys for attributes that apply to fonts.
1002       */
1003      public static class FontConstants
1004        extends StyleConstants
1005        implements AttributeSet.FontAttribute, AttributeSet.CharacterAttribute
1006      {
1007        /**
1008         * Private constructor prevents new instances being created.
1009         * 
1010         * @param k  the key name.
1011         */
1012        private FontConstants(String k) 
1013        {
1014          super(k);
1015        }
1016        
1017        /** A key for the bold font attribute. */
1018        public static final Object Bold = new FontConstants("bold");
1019    
1020        /** A key for the family font attribute. */
1021        public static final Object Family = new FontConstants("family");
1022        
1023        /** A key for the italic font attribute. */
1024        public static final Object Italic = new FontConstants("italic");
1025        
1026        /** A key for the size font attribute. */
1027        public static final Object Size = new FontConstants("size");
1028      }
1029    
1030      /**
1031       * A set of keys for attributes that apply to paragraphs.
1032       */
1033      public static class ParagraphConstants
1034        extends StyleConstants
1035        implements AttributeSet.ParagraphAttribute
1036      {
1037        /**
1038         * Private constructor prevents new instances being created.
1039         * 
1040         * @param k  the key name.
1041         */
1042        private ParagraphConstants(String k) 
1043        {
1044          super(k);
1045        }
1046        
1047        /** A key for the alignment paragraph attribute. */
1048        public static final Object Alignment = new ParagraphConstants("Alignment");
1049    
1050        /** A key for the first line indentation paragraph attribute. */
1051        public static final Object FirstLineIndent 
1052            = new ParagraphConstants("FirstLineIndent");
1053        
1054        /** A key for the left indentation paragraph attribute. */
1055        public static final Object LeftIndent 
1056            = new ParagraphConstants("LeftIndent");
1057        
1058        /** A key for the line spacing paragraph attribute. */
1059        public static final Object LineSpacing 
1060            = new ParagraphConstants("LineSpacing");
1061        
1062        /** A key for the orientation paragraph attribute. */
1063        public static final Object Orientation 
1064            = new ParagraphConstants("Orientation");
1065        
1066        /** A key for the right indentation paragraph attribute. */
1067        public static final Object RightIndent 
1068            = new ParagraphConstants("RightIndent");
1069        
1070        /** A key for the 'space above' paragraph attribute. */
1071        public static final Object SpaceAbove 
1072            = new ParagraphConstants("SpaceAbove");
1073        
1074        /** A key for the 'space below' paragraph attribute. */
1075        public static final Object SpaceBelow 
1076            = new ParagraphConstants("SpaceBelow");
1077        
1078        /** A key for the tabset paragraph attribute. */
1079        public static final Object TabSet = new ParagraphConstants("TabSet");
1080        
1081      }
1082    
1083    }