View | Details | Raw Unified | Return to bug 45917
Collapse All | Expand All

(-)src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java (-54 / +214 lines)
Lines 32-37 Link Here
32
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STUnderlineValues;
32
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STUnderlineValues;
33
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignRun;
33
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignRun;
34
34
35
/**
36
 * Represents a Font used in a workbook. 
37
 * 
38
 * @author gisella bronzetti
39
 */
40
35
public class XSSFFont implements Font {
41
public class XSSFFont implements Font {
36
42
37
    public static final String DEFAULT_FONT_NAME="Calibri";
43
    public static final String DEFAULT_FONT_NAME="Calibri";
Lines 40-71 Link Here
40
46
41
     private CTFont ctFont;
47
     private CTFont ctFont;
42
48
49
     /**
50
      * Create a new XSSFFont 
51
      * @param font the underlying XMLBeans font
52
      */
43
    public XSSFFont(CTFont font) {
53
    public XSSFFont(CTFont font) {
44
         this.ctFont=font;
54
         this.ctFont=font;
45
    }
55
    }
46
56
    
57
    /**
58
     * Create a new XSSFont. This method is protected to be used only by XSSFWorkbook
59
     */
47
     protected XSSFFont() {
60
     protected XSSFFont() {
48
         this.ctFont = CTFont.Factory.newInstance();
61
         this.ctFont = CTFont.Factory.newInstance();
49
    }
62
    }
50
63
51
64
    /**
65
     * get the underlying XMLBeans font
66
     */ 
52
    public CTFont getCTFont(){
67
    public CTFont getCTFont(){
53
         return ctFont;
68
         return ctFont;
54
    }
69
    }
55
70
56
     
71
    /**
72
     * get a boolean value for the boldness to use.
73
     * @return boolean - bold
74
     */
57
     public boolean getBold() {
75
     public boolean getBold() {
58
         CTBooleanProperty bold=ctFont.sizeOfBArray() == 0 ? null : ctFont.getBArray(0);
76
         CTBooleanProperty bold = ctFont.sizeOfBArray() == 0 ? null : ctFont.getBArray(0);
59
         return (bold!=null && bold.getVal());
77
         return (bold!=null && bold.getVal());
60
    }
78
    }
61
79
80
     /**
81
      * get character-set to use.
82
      * @return byte - character-set
83
      * @see FontCharset
84
      */
62
    public byte getCharSet() {
85
    public byte getCharSet() {
63
         CTIntProperty charset= ctFont.sizeOfCharsetArray() == 0?null:ctFont.getCharsetArray(0);
86
         CTIntProperty charset = ctFont.sizeOfCharsetArray() == 0 ? null : ctFont.getCharsetArray(0);
64
         return charset == null ? FontCharset.ANSI.getValue() : FontCharset.valueOf(charset.getVal()).getValue(); 
87
         return charset == null ? FontCharset.ANSI.getValue() : FontCharset.valueOf(charset.getVal()).getValue(); 
65
    }
88
    }
66
89
90
91
    /**
92
     * get the indexed color value for the font
93
     * References a color definited in IndexedColors.
94
     * @return short - indexed color to use
95
     * @see IndexedColors
96
     */
67
    public short getColor() {
97
    public short getColor() {
68
        CTColor color=ctFont.sizeOfColorArray()==0?null: ctFont.getColorArray(0);
98
        CTColor color = ctFont.sizeOfColorArray() == 0 ? null : ctFont.getColorArray(0);
69
        if(color == null) return IndexedColors.BLACK.getIndex();
99
        if(color == null) return IndexedColors.BLACK.getIndex();
70
        
100
        
71
        long index=color.getIndexed();
101
        long index=color.getIndexed();
Lines 81-101 Link Here
81
    }
111
    }
82
112
83
113
114
    /**
115
     * get the color value for the font
116
     * References a color definited as  Standard Alpha Red Green Blue color value (ARGB).
117
     * @return XSSFColor - rgb color to use
118
     */
84
     public XSSFColor getRgbColor() {
119
     public XSSFColor getRgbColor() {
85
         CTColor ctColor=ctFont.sizeOfColorArray()==0?null: ctFont.getColorArray(0);
120
         CTColor ctColor = ctFont.sizeOfColorArray() == 0 ? null : ctFont.getColorArray(0);
86
         XSSFColor color=new XSSFColor(ctColor);
121
         XSSFColor color=new XSSFColor(ctColor);
87
         return color;
122
         return color;
88
     }
123
     }
89
124
125
126
     /**
127
      * get the color value for the font
128
      * References a color definited in theme.
129
      * @return short - theme color to use
130
      */
90
     public short getThemeColor() {
131
     public short getThemeColor() {
91
         CTColor color=ctFont.sizeOfColorArray()==0?null: ctFont.getColorArray(0);
132
         CTColor color = ctFont.sizeOfColorArray() == 0 ? null : ctFont.getColorArray(0);
92
         long index=color.getTheme();
133
         long index=color.getTheme();
93
         return (short)index;
134
         return (short)index;
94
     }
135
     }
95
136
96
137
     /**
138
      * get the font height in point.
139
      * @return short - height in point
140
      */
97
    public short getFontHeight() {
141
    public short getFontHeight() {
98
         CTFontSize size=ctFont.sizeOfSzArray()==0?null: ctFont.getSzArray(0);
142
         CTFontSize size = ctFont.sizeOfSzArray() == 0 ? null : ctFont.getSzArray(0);
99
         if(size!=null){
143
         if(size!=null){
100
             double fontHeight= size.getVal();
144
             double fontHeight= size.getVal();
101
            return (short)fontHeight;
145
            return (short)fontHeight;
Lines 104-112 Link Here
104
            return DEFAULT_FONT_SIZE;
148
            return DEFAULT_FONT_SIZE;
105
    }
149
    }
106
150
107
151
    /** 
152
     * @see #getFontHeight()
153
     */
108
    public short getFontHeightInPoints() {
154
    public short getFontHeightInPoints() {
109
         CTFontSize size=ctFont.sizeOfSzArray()==0?null: ctFont.getSzArray(0);
155
         CTFontSize size = ctFont.sizeOfSzArray() == 0 ? null : ctFont.getSzArray(0);
110
         if(size!=null){
156
         if(size!=null){
111
             double fontHeight= size.getVal();
157
             double fontHeight= size.getVal();
112
             return (short)fontHeight;
158
             return (short)fontHeight;
Lines 115-139 Link Here
115
            return DEFAULT_FONT_SIZE;
161
            return DEFAULT_FONT_SIZE;
116
    }
162
    }
117
163
118
164
    /**
165
     * get the name of the font (i.e. Arial)
166
     * @return String - a string representing the name of the font to use
167
     */
119
    public String getFontName() {
168
    public String getFontName() {
120
	CTFontName name = ctFont.sizeOfNameArray() == 0 ? null : ctFont.getNameArray(0);
169
	CTFontName name = ctFont.sizeOfNameArray() == 0 ? null : ctFont.getNameArray(0);
121
	return name == null ? null : name.getVal();
170
	return name == null ? null : name.getVal();
122
    }
171
    }
123
172
124
173
    /**
174
     * get a boolean value that specify whether to use italics or not
175
     * @return boolean - value for italic
176
     */
125
      public boolean getItalic() {
177
      public boolean getItalic() {
126
         CTBooleanProperty italic=ctFont.sizeOfIArray()==0?null:ctFont.getIArray(0);
178
         CTBooleanProperty italic = ctFont.sizeOfIArray() == 0 ? null : ctFont.getIArray(0);
127
         return italic!=null && italic.getVal();
179
         return italic!=null && italic.getVal();
128
      }
180
      }
129
181
      
182
      /**
183
       * get a boolean value that specify whether to use a strikeout horizontal line through the text or not
184
       * @return boolean - value for strikeout
185
       */
130
      public boolean getStrikeout() {
186
      public boolean getStrikeout() {
131
         CTBooleanProperty strike=ctFont.sizeOfStrikeArray()==0?null:ctFont.getStrikeArray(0);
187
         CTBooleanProperty strike = ctFont.sizeOfStrikeArray() == 0 ? null : ctFont.getStrikeArray(0);
132
         return strike!=null && strike.getVal();
188
         return strike!=null && strike.getVal();
133
      }
189
      }
134
190
191
      /**
192
       * get normal,super or subscript.
193
       * @return short - offset type to use (none,super,sub)
194
       * @see Font#SS_NONE
195
       * @see Font#SS_SUPER
196
       * @see Font#SS_SUB
197
       */
135
    public short getTypeOffset() {
198
    public short getTypeOffset() {
136
        CTVerticalAlignFontProperty vAlign=ctFont.sizeOfVertAlignArray()==0?null:ctFont.getVertAlignArray(0);
199
        CTVerticalAlignFontProperty vAlign = ctFont.sizeOfVertAlignArray() == 0 ? null : ctFont.getVertAlignArray(0);
137
        if(vAlign!=null){
200
        if(vAlign!=null){
138
            int val=vAlign.getVal().intValue();
201
            int val=vAlign.getVal().intValue();
139
            switch (val) {
202
            switch (val) {
Lines 150-161 Link Here
150
            return Font.SS_NONE;
213
            return Font.SS_NONE;
151
    }
214
    }
152
215
216
    /**
217
     * get type of text underlining to use
218
     * @return byte - underlining type
219
     * @see FontUnderline
220
     */
153
     public byte getUnderline() {
221
     public byte getUnderline() {
154
	 /*
222
	    CTUnderlineProperty underline = ctFont.sizeOfUArray() == 0 ? null : ctFont.getUArray(0);
155
         CTUnderlineProperty underline = ctFont.sizeOfUArray() == 0 ? null : ctFont.getUArray(0);
156
         return underline == null ? (byte)FontUnderline.NONE.getValue().intValue() : (byte)FontUnderline.valueOf(underline.getVal()).getValue().intValue();
157
         */
158
	    CTUnderlineProperty underline=ctFont.sizeOfUArray()==0?null:ctFont.getUArray(0);
159
	        if(underline!=null){
223
	        if(underline!=null){
160
		    FontUnderline fontUnderline=FontUnderline.valueOf(underline.getVal());
224
		    FontUnderline fontUnderline=FontUnderline.valueOf(underline.getVal());
161
	             switch (fontUnderline.getValue().intValue()) {
225
	             switch (fontUnderline.getValue().intValue()) {
Lines 179-195 Link Here
179
    }
243
    }
180
244
181
     /**
245
     /**
182
      * Set characters in bold face font style.
246
      * set a boolean value for the boldness to use. If omitted, the default value is true.
183
      * If omitted, the default value is true.
247
      * @param boolean - boldness to use
184
      */
248
      */
185
     public void setBold(boolean bold) {
249
     public void setBold(boolean bold) {
186
         CTBooleanProperty ctBold=ctFont.sizeOfBArray()==0?ctFont.addNewB():ctFont.getBArray(0);
250
         CTBooleanProperty ctBold = ctFont.sizeOfBArray() == 0 ? ctFont.addNewB() : ctFont.getBArray(0);
187
         ctBold.setVal(true);
251
         ctBold.setVal(true);
188
      }
252
      }
189
253
190
     
254
     /**
255
      * set character-set to use.
256
      * @param byte - charset
257
      * @see FontCharset
258
      */
191
    public void setCharSet(byte charset) {
259
    public void setCharSet(byte charset) {
192
         CTIntProperty charsetProperty=ctFont.sizeOfCharsetArray()==0?ctFont.addNewCharset():ctFont.getCharsetArray(0);
260
         CTIntProperty charsetProperty = ctFont.sizeOfCharsetArray() == 0 ? ctFont.addNewCharset() : ctFont.getCharsetArray(0);
193
        switch (charset) {
261
        switch (charset) {
194
        case Font.ANSI_CHARSET:
262
        case Font.ANSI_CHARSET:
195
            charsetProperty.setVal(FontCharset.ANSI.getValue());
263
            charsetProperty.setVal(FontCharset.ANSI.getValue());
Lines 205-218 Link Here
205
        }
273
        }
206
    }
274
    }
207
275
208
  
276
    /**
277
     * set character-set to use.
278
     * @param FontCharset 
279
     */
209
    public void setCharSet(FontCharset charSet) {
280
    public void setCharSet(FontCharset charSet) {
210
		setCharSet(charSet.getValue());
281
	setCharSet(charSet.getValue());
211
    }
282
    }
212
283
284
    /**
285
     * set the indexed color for the font
286
     * @param short - color to use
287
     * @see #DEFAULT_FONT_COLOR - Note: default font color
288
     * @see IndexedColors
289
     */
213
    public void setColor(short color) {
290
    public void setColor(short color) {
214
         CTColor ctColor=ctFont.sizeOfColorArray()==0?ctFont.addNewColor():ctFont.getColorArray(0);
291
	CTColor ctColor = ctFont.sizeOfColorArray() == 0 ? ctFont.addNewColor() : ctFont.getColorArray(0);
215
216
        switch (color) {
292
        switch (color) {
217
        case Font.COLOR_NORMAL:{
293
        case Font.COLOR_NORMAL:{
218
            ctColor.setIndexed(XSSFFont.DEFAULT_FONT_COLOR);
294
            ctColor.setIndexed(XSSFFont.DEFAULT_FONT_COLOR);
Lines 227-274 Link Here
227
        }
303
        }
228
    }
304
    }
229
305
230
306
    /**
307
     * set the font height in points. 
308
     * @param short - height in points
309
     */
231
    public void setFontHeight(short height) {
310
    public void setFontHeight(short height) {
232
	setFontHeight((double)height);
311
	setFontHeight((double)height);
233
    }
312
    }
234
313
314
    /**
315
     * set the font height in points. 
316
     * @param double - height in points
317
     */
235
    public void setFontHeight(double height) {
318
    public void setFontHeight(double height) {
236
        CTFontSize fontSize=ctFont.sizeOfSzArray()==0?ctFont.addNewSz():ctFont.getSzArray(0);
319
        CTFontSize fontSize=ctFont.sizeOfSzArray()==0?ctFont.addNewSz():ctFont.getSzArray(0);
237
        fontSize.setVal(height);
320
        fontSize.setVal(height);
238
    }
321
    }
239
322
323
    /**
324
     * @link #setFontHeight
325
     */
240
    public void setFontHeightInPoints(short height) {
326
    public void setFontHeightInPoints(short height) {
241
          setFontHeight((double)height);
327
          setFontHeight(height);
242
    }
328
    }
243
329
244
330
    /**
331
     * set the color for the font in Standard Alpha Red Green Blue color value
332
     * @param XSSFColor - color to use
333
     */
245
    public void setRgbColor(XSSFColor color) {
334
    public void setRgbColor(XSSFColor color) {
246
	CTColor ctColor=ctFont.sizeOfColorArray()==0?ctFont.addNewColor():ctFont.getColorArray(0);
335
	CTColor ctColor = ctFont.sizeOfColorArray() == 0 ? ctFont.addNewColor() : ctFont.getColorArray(0);
247
	ctColor.setRgb(color.getRgb());
336
	ctColor.setRgb(color.getRgb());
248
    }
337
    }
249
338
339
    /**
340
     * set the theme color for the font to use
341
     * @param short - theme color to use
342
     */
250
     public void setThemeColor(short theme) {
343
     public void setThemeColor(short theme) {
251
         CTColor ctColor=ctFont.sizeOfColorArray()==0?ctFont.addNewColor():ctFont.getColorArray(0);
344
         CTColor ctColor = ctFont.sizeOfColorArray() == 0 ? ctFont.addNewColor() : ctFont.getColorArray(0);
252
         ctColor.setTheme(theme);
345
         ctColor.setTheme(theme);
253
     }
346
     }
254
347
348
     /**
349
      * set the name for the font (i.e. Arial). 
350
      * If the font doesn't exist (because it isn't installed on the system), 
351
      * or the charset is invalid for that font, then another font should
352
      * be substituted.
353
      * The string length for this attribute shall be 0 to 31 characters.
354
      * Default font name is Calibri.
355
      * 
356
      * @param String  - value representing the name of the font to use
357
      * @see #DEFAULT_FONT_NAME
358
      */
255
    public void setFontName(String name) {
359
    public void setFontName(String name) {
256
	CTFontName fontName=ctFont.sizeOfNameArray()==0?ctFont.addNewName():ctFont.getNameArray(0);
360
	CTFontName fontName = ctFont.sizeOfNameArray() == 0 ? ctFont.addNewName() : ctFont.getNameArray(0);
257
	fontName.setVal(name);
361
	fontName.setVal(name);
258
    }
362
    }
259
363
364
365
    /**
366
     * set a boolean value for the property specifying whether to use italics or not
367
     * If omitted, the default value is true.
368
     * @param boolean - value for italics or not
369
     */
260
    public void setItalic(boolean italic) {
370
    public void setItalic(boolean italic) {
261
         CTBooleanProperty bool=ctFont.sizeOfIArray()==0?ctFont.addNewI():ctFont.getIArray(0);
371
         CTBooleanProperty bool = ctFont.sizeOfIArray() == 0 ? ctFont.addNewI() : ctFont.getIArray(0);
262
          bool.setVal(italic);
372
          bool.setVal(italic);
263
    }
373
    }
374
     
264
375
376
    /**
377
     * set a boolean value for the property specifying whether to use a strikeout horizontal line through the text or not
378
     * If omitted, the default value is true.
379
     * @param boolean - value for strikeout or not
380
     */
265
    public void setStrikeout(boolean strikeout) {
381
    public void setStrikeout(boolean strikeout) {
266
         CTBooleanProperty strike=ctFont.sizeOfStrikeArray()==0?ctFont.addNewStrike():ctFont.getStrikeArray(0);
382
         CTBooleanProperty strike = ctFont.sizeOfStrikeArray() == 0 ? ctFont.addNewStrike() : ctFont.getStrikeArray(0);
267
          strike.setVal(strikeout);
383
          strike.setVal(strikeout);
268
    }
384
    }
269
385
386
    /**
387
     * set normal,super or subscript, that representing the vertical-alignment setting.
388
     * Setting this to either subscript or superscript shall make the font size smaller if a
389
     * smaller font size is available.
390
     * @param short - offset type to use (none,super,sub)
391
     * @see #SS_NONE
392
     * @see #SS_SUPER
393
     * @see #SS_SUB
394
     */
270
    public void setTypeOffset(short offset) {
395
    public void setTypeOffset(short offset) {
271
        CTVerticalAlignFontProperty offsetProperty=ctFont.sizeOfVertAlignArray()==0?ctFont.addNewVertAlign(): ctFont.getVertAlignArray(0);
396
        CTVerticalAlignFontProperty offsetProperty = ctFont.sizeOfVertAlignArray() == 0 ? ctFont.addNewVertAlign() : ctFont.getVertAlignArray(0);
272
        switch (offset) {
397
        switch (offset) {
273
        case Font.SS_NONE:
398
        case Font.SS_NONE:
274
            offsetProperty.setVal(STVerticalAlignRun.BASELINE);
399
            offsetProperty.setVal(STVerticalAlignRun.BASELINE);
Lines 282-289 Link Here
282
        }
407
        }
283
    }
408
    }
284
409
410
    /**
411
     *  set the style of underlining that is used.
412
     *  The none style is equivalent to not using underlining at all.
413
     *  @param byte - underline type to use  
414
     *  @see FontUnderline 
415
     */
285
    public void setUnderline(byte underline) {
416
    public void setUnderline(byte underline) {
286
         CTUnderlineProperty ctUnderline=ctFont.sizeOfUArray()==0?ctFont.addNewU():ctFont.getUArray(0);
417
         CTUnderlineProperty ctUnderline = ctFont.sizeOfUArray() == 0 ? ctFont.addNewU() : ctFont.getUArray(0);
287
        switch (underline) {
418
        switch (underline) {
288
        case Font.U_DOUBLE:
419
        case Font.U_DOUBLE:
289
            ctUnderline.setVal(FontUnderline.DOUBLE.getValue());
420
            ctUnderline.setVal(FontUnderline.DOUBLE.getValue());
Lines 304-311 Link Here
304
        }
435
        }
305
    }
436
    }
306
    
437
    
438
    /**
439
     * set an enumeration representing the style of underlining that is used.
440
     * The none style is equivalent to not using underlining at all.
441
     * The possible values for this attribute are defined by the FontUnderline
442
     * @param FontUnderline - FontUnderline enum value
443
     */
307
    public void setUnderline(FontUnderline underline) {
444
    public void setUnderline(FontUnderline underline) {
308
        CTUnderlineProperty ctUnderline=ctFont.sizeOfUArray()==0?ctFont.addNewU():ctFont.getUArray(0);
445
        CTUnderlineProperty ctUnderline = ctFont.sizeOfUArray() == 0 ? ctFont.addNewU() : ctFont.getUArray(0);
309
        ctUnderline.setVal(underline.getValue());
446
        ctUnderline.setVal(underline.getValue());
310
    }
447
    }
311
    
448
    
Lines 331-363 Link Here
331
        return fonts.size() - 1;
468
        return fonts.size() - 1;
332
    }
469
    }
333
470
334
/*
471
     /**
335
  this methds are used only for XSSFFont and aren't in Font interface
472
      * get the font scheme property.
336
  are used in method SthlesTable.createDefaultfont
473
      * is used only in StylesTable to create the default instance of font
337
 */
474
      * @return FontScheme
338
475
      * @see org.apache.poi.xssf.model.StylesTable#createDefaultFont()
476
      */
339
    public FontScheme getScheme(){
477
    public FontScheme getScheme(){
340
        CTFontScheme scheme=ctFont.sizeOfSchemeArray()==0?null:ctFont.getSchemeArray(0);
478
        CTFontScheme scheme = ctFont.sizeOfSchemeArray() == 0 ? null : ctFont.getSchemeArray(0);
341
        return scheme == null ? FontScheme.NONE : FontScheme.valueOf(scheme.getVal());
479
        return scheme == null ? FontScheme.NONE : FontScheme.valueOf(scheme.getVal());
342
    }
480
    }
343
481
482
    /**
483
     * set font scheme property 
484
     * @param scheme - FontScheme enum value
485
     * @see FontScheme
486
     */
344
    public void setScheme(FontScheme scheme){
487
    public void setScheme(FontScheme scheme){
345
         CTFontScheme ctFontScheme=ctFont.sizeOfSchemeArray()==0?ctFont.addNewScheme():ctFont.getSchemeArray(0);
488
         CTFontScheme ctFontScheme = ctFont.sizeOfSchemeArray() == 0 ? ctFont.addNewScheme() : ctFont.getSchemeArray(0);
346
         ctFontScheme.setVal(scheme.getValue());
489
         ctFontScheme.setVal(scheme.getValue());
347
    }
490
    }
348
491
349
492
    /**
493
     * get the font family to use. 
494
     * @param int - family value
495
     * @see FontFamily
496
     */
350
      public int getFamily(){
497
      public int getFamily(){
351
         CTIntProperty family = ctFont.sizeOfFamilyArray() == 0 ? ctFont.addNewFamily() : ctFont.getFamilyArray(0);
498
         CTIntProperty family = ctFont.sizeOfFamilyArray() == 0 ? ctFont.addNewFamily() : ctFont.getFamilyArray(0);
352
         return family == null ? FontFamily.NOT_APPLICABLE.getValue() : FontFamily.valueOf(family.getVal()).getValue();
499
         return family == null ? FontFamily.NOT_APPLICABLE.getValue() : FontFamily.valueOf(family.getVal()).getValue();
353
      }
500
      }
354
501
355
      
502
      /**
503
       * Set the font family this font belongs to. 
504
       * A font family is a set of fonts having common stroke width and serif characteristics.
505
       * The font name overrides when there are conflicting values.
506
       * 
507
       * @param int - family value
508
       * @see FontFamily
509
       */
356
     public void setFamily(int value){
510
     public void setFamily(int value){
357
         CTIntProperty family = ctFont.sizeOfFamilyArray() == 0 ? ctFont.addNewFamily() : ctFont.getFamilyArray(0);
511
         CTIntProperty family = ctFont.sizeOfFamilyArray() == 0 ? ctFont.addNewFamily() : ctFont.getFamilyArray(0);
358
          family.setVal(value);
512
         family.setVal(value);
359
     }
513
     }
360
      
514
515
     /**
516
      * set an enumeration representing the font family this font belongs to.
517
      * A font family is a set of fonts having common stroke width and serif characteristics.
518
      * @param font family
519
      * @link #setFamily(int value)
520
      */
361
     public void setFamily(FontFamily family){
521
     public void setFamily(FontFamily family){
362
	 setFamily(family.getValue());
522
	 setFamily(family.getValue());
363
     }
523
     }

Return to bug 45917