001/* StyleConstants.java --
002   Copyright (C) 2004, 2005, 2006 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.text;
040
041import java.awt.Color;
042import java.awt.Component;
043import java.util.ArrayList;
044
045import 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 */
054public 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}