001    /* TextAttribute.java --
002       Copyright (C) 2003, 2004, 2005  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 java.awt.font;
040    
041    import java.io.InvalidObjectException;
042    import java.text.AttributedCharacterIterator;
043    
044    /**
045     * Attributes (and associated values) that can be used to define an
046     * {@link java.text.AttributedString}.
047     */
048    public final class TextAttribute extends AttributedCharacterIterator.Attribute
049    {
050      private static final long serialVersionUID = 7744112784117861702L;
051      
052      /** A key for the background paint attribute. */
053      public static final TextAttribute BACKGROUND =
054        new TextAttribute("background");
055      
056      /** A key for the BIDI_EMBEDDING attribute. */
057      public static final TextAttribute BIDI_EMBEDDING =
058        new TextAttribute("bidi_embedding");
059      
060      /** A key for the CHAR_REPLACEMENT attribute. */
061      public static final TextAttribute CHAR_REPLACEMENT =
062        new TextAttribute("char_replacement");
063      
064      /** A key for the FAMILY attribute. */
065      public static final TextAttribute FAMILY = new TextAttribute("family");
066      
067      /** A key for the font attribute. */
068      public static final TextAttribute FONT = new TextAttribute("font");
069      
070      /** A key for the foreground paint attribute. */
071      public static final TextAttribute FOREGROUND = 
072        new TextAttribute("foreground");
073      
074      /** A key for the INPUT_METHOD_HIGHLIGHT attribute. */
075      public static final TextAttribute INPUT_METHOD_HIGHLIGHT =
076        new TextAttribute("input method highlight");
077      
078      /** A key for the INPUT_METHOD_UNDERLINE attribute. */
079      public static final TextAttribute INPUT_METHOD_UNDERLINE =
080        new TextAttribute("input method underline");
081      
082      /** A key for the text justification attribute. */
083      public static final TextAttribute JUSTIFICATION =
084        new TextAttribute("justification");
085      
086      /** 
087       * A value that can be used with the {@link #JUSTIFICATION} attribute to
088       * indicate full justification of the text. 
089       */
090      public static final Float JUSTIFICATION_FULL = new Float(1.0);
091      
092      /** 
093       * A value that can be used with the {@link #JUSTIFICATION} attribute to
094       * indicate no justification of the text. 
095       */
096      public static final Float JUSTIFICATION_NONE = new Float(0.0);
097      
098      /** A key for the NUMERIC_SHAPING attribute. */
099      public static final TextAttribute NUMERIC_SHAPING =
100        new TextAttribute("numeric_shaping");
101      
102      /** A key for the POSTURE attribute. */
103      public static final TextAttribute POSTURE = new TextAttribute("posture");
104      
105      /** A value that can be used with the {@link #POSTURE} attribute. */
106      public static final Float POSTURE_OBLIQUE = new Float(0.2);
107      
108      /** A value that can be used with the {@link #POSTURE} attribute. */
109      public static final Float POSTURE_REGULAR = new Float(0.0);
110      
111      /** A key for the RUN_DIRECTION attribute. */
112      public static final TextAttribute RUN_DIRECTION =
113        new TextAttribute("run_direction");
114      
115      /** A value that can be used with the {@link #RUN_DIRECTION} attribute. */
116      public static final Boolean RUN_DIRECTION_LTR = Boolean.FALSE;
117      
118      /** A value that can be used with the {@link #RUN_DIRECTION} attribute. */
119      public static final Boolean RUN_DIRECTION_RTL = Boolean.TRUE;
120      
121      /** A key for the text size attribute. */
122      public static final TextAttribute SIZE = new TextAttribute("size");
123      
124      /** A key for the STRIKETHROUGH attribute. */
125      public static final TextAttribute STRIKETHROUGH =
126        new TextAttribute("strikethrough");
127      
128      /** A value that can be used with the {@link #STRIKETHROUGH} attribute. */
129      public static final Boolean STRIKETHROUGH_ON = Boolean.TRUE;
130      
131      /** A key for the SUPERSCRIPT attribute. */
132      public static final TextAttribute SUPERSCRIPT =
133        new TextAttribute("superscript");
134      
135      /** A value that can be used with the {@link #SUPERSCRIPT} attribute. */
136      public static final Integer SUPERSCRIPT_SUB = new Integer(-1);
137      
138      /** A value that can be used with the {@link #SUPERSCRIPT} attribute. */
139      public static final Integer SUPERSCRIPT_SUPER = new Integer(1);
140      
141      /** A key for the SWAP_COLORS attribute. */
142      public static final TextAttribute SWAP_COLORS =
143        new TextAttribute("swap_colors");
144      
145      /** A value that can be used with the {@link #SWAP_COLORS} attribute. */
146      public static final Boolean SWAP_COLORS_ON = Boolean.TRUE;
147      
148      /** A key for the TRANFORM attribute. */
149      public static final TextAttribute TRANSFORM = new TextAttribute("transform");
150      
151      /** A key for the UNDERLINE attribute. */
152      public static final TextAttribute UNDERLINE = new TextAttribute("underline");
153      
154      /** A value that can be used with the {@link #UNDERLINE} attribute. */
155      public static final Integer UNDERLINE_LOW_DASHED = new Integer(5);
156      
157      /** A value that can be used with the {@link #UNDERLINE} attribute. */
158      public static final Integer UNDERLINE_LOW_DOTTED = new Integer(3);
159      
160      /** A value that can be used with the {@link #UNDERLINE} attribute. */
161      public static final Integer UNDERLINE_LOW_GRAY = new Integer(4);
162      
163      /** A value that can be used with the {@link #UNDERLINE} attribute. */
164      public static final Integer UNDERLINE_LOW_ONE_PIXEL = new Integer(1);
165      
166      /** A value that can be used with the {@link #UNDERLINE} attribute. */
167      public static final Integer UNDERLINE_LOW_TWO_PIXEL = new Integer(2);
168      
169      /** A value that can be used with the {@link #UNDERLINE} attribute. */
170      public static final Integer UNDERLINE_ON = new Integer(0);
171      
172      /** A key for the WEIGHT attribute. */
173      public static final TextAttribute WEIGHT = new TextAttribute("weight");
174      
175      /** A value that can be used with the {@link #WEIGHT} attribute. */
176      public static final Float WEIGHT_BOLD = new Float(2.0);
177      
178      /** A value that can be used with the {@link #WEIGHT} attribute. */
179      public static final Float WEIGHT_DEMIBOLD = new Float(1.75);
180      
181      /** A value that can be used with the {@link #WEIGHT} attribute. */
182      public static final Float WEIGHT_DEMILIGHT = new Float(0.875);
183      
184      /** A value that can be used with the {@link #WEIGHT} attribute. */
185      public static final Float WEIGHT_EXTRA_LIGHT = new Float(0.5);
186      
187      /** A value that can be used with the {@link #WEIGHT} attribute. */
188      public static final Float WEIGHT_EXTRABOLD = new Float(2.5);
189      
190      /** A value that can be used with the {@link #WEIGHT} attribute. */
191      public static final Float WEIGHT_HEAVY = new Float(2.25);
192      
193      /** A value that can be used with the {@link #WEIGHT} attribute. */
194      public static final Float WEIGHT_LIGHT = new Float(0.75);
195      
196      /** A value that can be used with the {@link #WEIGHT} attribute. */
197      public static final Float WEIGHT_MEDIUM = new Float(1.5);
198      
199      /** A value that can be used with the {@link #WEIGHT} attribute. */
200      public static final Float WEIGHT_REGULAR = new Float(1.0);
201      
202      /** A value that can be used with the {@link #WEIGHT} attribute. */
203      public static final Float WEIGHT_SEMIBOLD = new Float(1.25);
204      
205      /** A value that can be used with the {@link #WEIGHT} attribute. */
206      public static final Float WEIGHT_ULTRABOLD = new Float(2.75);
207      
208      /** A key for the WIDTH attribute. */
209      public static final TextAttribute WIDTH = new TextAttribute("width");
210      
211      /** A value that can be used with the {@link #WIDTH} attribute. */
212      public static final Float WIDTH_CONDENSED = new Float(0.75);
213      
214      /** A value that can be used with the {@link #WIDTH} attribute. */
215      public static final Float WIDTH_EXTENDED = new Float(1.5);
216      
217      /** A value that can be used with the {@link #WIDTH} attribute. */
218      public static final Float WIDTH_REGULAR = new Float(1.0);
219      
220      /** A value that can be used with the {@link #WIDTH} attribute. */
221      public static final Float WIDTH_SEMI_CONDENSED = new Float(0.875);
222      
223      /** A value that can be used with the {@link #WIDTH} attribute. */
224      public static final Float WIDTH_SEMI_EXTENDED = new Float(1.25);
225              
226      /**
227       * Creates a new attribute.
228       * 
229       * @param name  the name.
230       */
231      protected TextAttribute(String name)
232      {
233        super(name);
234      }
235      
236      /**
237       * After deserialization, this method ensures that only one instance of
238       * each attribute is used.
239       * 
240       * @return The (single) attribute instance.
241       * 
242       * @throws InvalidObjectException if the attribute is not recognised.
243       */
244      protected Object readResolve()
245        throws InvalidObjectException
246      {
247        if (this.getName().equals("background"))
248          return BACKGROUND;
249    
250        if (this.getName().equals("bidi_embedding"))
251          return BIDI_EMBEDDING;
252    
253        if (this.getName().equals("char_replacement"))
254          return CHAR_REPLACEMENT;
255    
256        if (this.getName().equals("family"))
257          return FAMILY;
258    
259        if (this.getName().equals("font"))
260          return FONT;
261    
262        if (this.getName().equals("foreground"))
263          return FOREGROUND;
264    
265        if (this.getName().equals("input method highlight"))
266          return INPUT_METHOD_HIGHLIGHT;
267    
268        if (this.getName().equals("input method underline"))
269          return INPUT_METHOD_UNDERLINE;
270    
271        if (this.getName().equals("justification"))
272          return JUSTIFICATION;
273    
274        if (this.getName().equals("numeric_shaping"))
275          return NUMERIC_SHAPING;
276    
277        if (this.getName().equals("posture"))
278          return POSTURE;
279    
280        if (this.getName().equals("run_direction"))
281          return RUN_DIRECTION;
282    
283        if (this.getName().equals("size"))
284          return SIZE;
285    
286        if (this.getName().equals("strikethrough"))
287          return STRIKETHROUGH;
288    
289        if (this.getName().equals("superscript"))
290          return SUPERSCRIPT;
291    
292        if (this.getName().equals("swap_colors"))
293          return SWAP_COLORS;
294    
295        if (this.getName().equals("transform"))
296          return TRANSFORM;
297    
298        if (this.getName().equals("underline"))
299          return UNDERLINE;
300    
301        if (this.getName().equals("weight"))
302          return WEIGHT;
303    
304        if (this.getName().equals("width"))
305          return WIDTH;
306    
307        throw new InvalidObjectException("Can't resolve Attribute: " + getName());
308      }
309    }