1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <xlstyle.hxx>
21 #include <com/sun/star/awt/FontFamily.hpp>
22 #include <com/sun/star/awt/FontSlant.hpp>
23 #include <com/sun/star/awt/FontStrikeout.hpp>
24 #include <com/sun/star/awt/FontUnderline.hpp>
25 #include <com/sun/star/i18n/ScriptType.hpp>
26 #include <vcl/svapp.hxx>
27 #include <vcl/settings.hxx>
28 #include <vcl/font.hxx>
29 #include <sal/macros.h>
30 #include <sal/log.hxx>
31 #include <rtl/tencinfo.h>
32 #include <svtools/colorcfg.hxx>
33 #include <vcl/unohelp.hxx>
34 #include <editeng/svxfont.hxx>
37 #include <xltools.hxx>
38 // Color data =================================================================
40 /** Standard EGA colors, bright. */
41 #define EXC_PALETTE_EGA_COLORS_LIGHT \
42 Color(0x000000), Color(0xFFFFFF), Color(0xFF0000), Color(0x00FF00), Color(0x0000FF), Color(0xFFFF00), Color(0xFF00FF), Color(0x00FFFF)
43 /** Standard EGA colors, dark. */
44 #define EXC_PALETTE_EGA_COLORS_DARK \
45 Color(0x800000), Color(0x008000), Color(0x000080), Color(0x808000), Color(0x800080), Color(0x008080), Color(0xC0C0C0), Color(0x808080)
47 /** Default color table for BIFF2. */
48 static const Color spnDefColorTable2
[] =
50 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
53 /** Default color table for BIFF3/BIFF4. */
54 static const Color spnDefColorTable3
[] =
56 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
57 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
58 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
61 /** Default color table for BIFF5/BIFF7. */
62 static const Color spnDefColorTable5
[] =
64 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
65 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
66 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
,
67 /* 24 */ Color(0x8080FF), Color(0x802060), Color(0xFFFFC0), Color(0xA0E0E0), Color(0x600080), Color(0xFF8080), Color(0x0080C0), Color(0xC0C0FF),
68 /* 32 */ Color(0x000080), Color(0xFF00FF), Color(0xFFFF00), Color(0x00FFFF), Color(0x800080), Color(0x800000), Color(0x008080), Color(0x0000FF),
69 /* 40 */ Color(0x00CFFF), Color(0x69FFFF), Color(0xE0FFE0), Color(0xFFFF80), Color(0xA6CAF0), Color(0xDD9CB3), Color(0xB38FEE), Color(0xE3E3E3),
70 /* 48 */ Color(0x2A6FF9), Color(0x3FB8CD), Color(0x488436), Color(0x958C41), Color(0x8E5E42), Color(0xA0627A), Color(0x624FAC), Color(0x969696),
71 /* 56 */ Color(0x1D2FBE), Color(0x286676), Color(0x004500), Color(0x453E01), Color(0x6A2813), Color(0x85396A), Color(0x4A3285), Color(0x424242)
74 /** Default color table for BIFF8. */
75 static const Color spnDefColorTable8
[] =
77 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
78 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
79 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
,
80 /* 24 */ Color(0x9999FF), Color(0x993366), Color(0xFFFFCC), Color(0xCCFFFF), Color(0x660066), Color(0xFF8080), Color(0x0066CC), Color(0xCCCCFF),
81 /* 32 */ Color(0x000080), Color(0xFF00FF), Color(0xFFFF00), Color(0x00FFFF), Color(0x800080), Color(0x800000), Color(0x008080), Color(0x0000FF),
82 /* 40 */ Color(0x00CCFF), Color(0xCCFFFF), Color(0xCCFFCC), Color(0xFFFF99), Color(0x99CCFF), Color(0xFF99CC), Color(0xCC99FF), Color(0xFFCC99),
83 /* 48 */ Color(0x3366FF), Color(0x33CCCC), Color(0x99CC00), Color(0xFFCC00), Color(0xFF9900), Color(0xFF6600), Color(0x666699), Color(0x969696),
84 /* 56 */ Color(0x003366), Color(0x339966), Color(0x003300), Color(0x333300), Color(0x993300), Color(0x993366), Color(0x333399), Color(0x333333)
87 #undef EXC_PALETTE_EGA_COLORS_LIGHT
88 #undef EXC_PALETTE_EGA_COLORS_DARK
90 XclDefaultPalette::XclDefaultPalette( const XclRoot
& rRoot
) :
91 mpnColorTable( nullptr ),
94 const StyleSettings
& rSett
= Application::GetSettings().GetStyleSettings();
95 mnWindowText
= rSett
.GetWindowTextColor();
96 mnWindowBack
= rSett
.GetWindowColor();
97 mnFaceColor
= rSett
.GetFaceColor();
98 // Don't use the system HelpBack and HelpText colours as it causes problems
99 // with modern gnome. This is because mnNoteText and mnNoteBack are used
100 // when colour indices ( instead of real colours ) are specified.
101 // Note: That this it is not an unusual scenario that we get the Note
102 // background specified as a real colour and the text specified as a
103 // colour index. That means the text colour would be picked from
104 // the system where the note background would be picked from a real colour.
105 // Previously the note text colour was picked from the system tooltip
106 // text colour, on modern gnome(e.g. 3) that tends to be 'white' with the
108 // Using the Libreoffice defaults ( instead of system specific colours
109 // ) lessens the chance of the one colour being an unsuitable combination
110 // because by default the note text is black and the note background is
111 // a light yellow colour ( very similar to Excel's normal defaults )
112 mnNoteText
= svtools::ColorConfig::GetDefaultColor( svtools::FONTCOLOR
);
113 mnNoteBack
= svtools::ColorConfig::GetDefaultColor( svtools::CALCNOTESBACKGROUND
);
116 switch( rRoot
.GetBiff() )
119 mpnColorTable
= spnDefColorTable2
;
120 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable2
);
124 mpnColorTable
= spnDefColorTable3
;
125 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable3
);
128 mpnColorTable
= spnDefColorTable5
;
129 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable5
);
132 mpnColorTable
= spnDefColorTable8
;
133 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable8
);
140 Color
XclDefaultPalette::GetDefColor( sal_uInt16 nXclIndex
) const
143 if( nXclIndex
< mnTableSize
)
144 nColor
= mpnColorTable
[ nXclIndex
];
145 else switch( nXclIndex
)
147 case EXC_COLOR_WINDOWTEXT3
:
148 case EXC_COLOR_WINDOWTEXT
:
149 case EXC_COLOR_CHWINDOWTEXT
: nColor
= mnWindowText
; break;
150 case EXC_COLOR_WINDOWBACK3
:
151 case EXC_COLOR_WINDOWBACK
:
152 case EXC_COLOR_CHWINDOWBACK
: nColor
= mnWindowBack
; break;
153 case EXC_COLOR_BUTTONBACK
: nColor
= mnFaceColor
; break;
154 case EXC_COLOR_CHBORDERAUTO
: nColor
= COL_BLACK
; break; // TODO: really always black?
155 case EXC_COLOR_NOTEBACK
: nColor
= mnNoteBack
; break;
156 case EXC_COLOR_NOTETEXT
: nColor
= mnNoteText
; break;
157 case EXC_COLOR_FONTAUTO
: nColor
= COL_AUTO
; break;
159 SAL_WARN("sc", "XclDefaultPalette::GetDefColor - unknown default color index: " << nXclIndex
);
165 // Font Data ==================================================================
167 namespace Awt
= ::com::sun::star::awt
;
168 namespace AwtFontFamily
= Awt::FontFamily
;
169 namespace AwtFontLineStyle
= Awt::FontUnderline
;
170 namespace AwtFontStrikeout
= Awt::FontStrikeout
;
172 XclFontData::XclFontData()
177 XclFontData::XclFontData( const vcl::Font
& rFont
)
180 FillFromVclFont( rFont
);
183 XclFontData::XclFontData( const SvxFont
& rFont
)
185 FillFromSvxFont( rFont
);
188 void XclFontData::Clear()
194 mnWeight
= EXC_FONTWGHT_DONTKNOW
;
195 mnEscapem
= EXC_FONTESC_NONE
;
196 mnFamily
= EXC_FONTFAM_SYSTEM
;
197 mnCharSet
= EXC_FONTCSET_ANSI_LATIN
;
198 mnUnderline
= EXC_FONTUNDERL_NONE
;
199 mbItalic
= mbStrikeout
= mbOutline
= mbShadow
= false;
202 void XclFontData::FillFromVclFont( const vcl::Font
& rFont
)
204 maName
= XclTools::GetXclFontName( rFont
.GetFamilyName() ); // substitute with MS fonts
206 maColor
= rFont
.GetColor();
207 SetScUnderline( rFont
.GetUnderline() );
208 mnEscapem
= EXC_FONTESC_NONE
;
209 SetScHeight( rFont
.GetFontSize().Height() );
210 SetScWeight( rFont
.GetWeight() );
211 SetScFamily( rFont
.GetFamilyType() );
212 SetFontEncoding( rFont
.GetCharSet() );
213 SetScPosture( rFont
.GetItalic() );
214 SetScStrikeout( rFont
.GetStrikeout() );
215 mbOutline
= rFont
.IsOutline();
216 mbShadow
= rFont
.IsShadow();
219 void XclFontData::FillFromSvxFont( const SvxFont
& rFont
)
221 FillFromVclFont( rFont
);
222 SetScEscapement( rFont
.GetEscapement() );
225 // *** conversion of VCL/SVX constants *** ------------------------------------
227 FontFamily
XclFontData::GetScFamily( rtl_TextEncoding eDefTextEnc
) const
229 FontFamily eScFamily
;
230 // ! format differs from Windows documentation: family is in lower nibble, pitch unknown
231 switch( mnFamily
& 0x0F )
233 case EXC_FONTFAM_ROMAN
: eScFamily
= FAMILY_ROMAN
; break;
234 case EXC_FONTFAM_SWISS
: eScFamily
= FAMILY_SWISS
; break;
235 case EXC_FONTFAM_MODERN
: eScFamily
= FAMILY_MODERN
; break;
236 case EXC_FONTFAM_SCRIPT
: eScFamily
= FAMILY_SCRIPT
; break;
237 case EXC_FONTFAM_DECORATIVE
: eScFamily
= FAMILY_DECORATIVE
; break;
240 ((eDefTextEnc
== RTL_TEXTENCODING_APPLE_ROMAN
) &&
241 (maName
.equalsIgnoreAsciiCase( "Geneva" ) || maName
.equalsIgnoreAsciiCase( "Chicago" ))) ?
242 FAMILY_SWISS
: FAMILY_DONTKNOW
;
247 rtl_TextEncoding
XclFontData::GetFontEncoding() const
249 // convert Windows character set to text encoding identifier
250 return rtl_getTextEncodingFromWindowsCharset( mnCharSet
);
253 FontItalic
XclFontData::GetScPosture() const
255 return mbItalic
? ITALIC_NORMAL
: ITALIC_NONE
;
258 FontWeight
XclFontData::GetScWeight() const
260 FontWeight eScWeight
;
262 if( !mnWeight
) eScWeight
= WEIGHT_DONTKNOW
;
263 else if( mnWeight
< 150 ) eScWeight
= WEIGHT_THIN
;
264 else if( mnWeight
< 250 ) eScWeight
= WEIGHT_ULTRALIGHT
;
265 else if( mnWeight
< 325 ) eScWeight
= WEIGHT_LIGHT
;
266 else if( mnWeight
< 375 ) eScWeight
= WEIGHT_SEMILIGHT
;
267 else if( mnWeight
< 450 ) eScWeight
= WEIGHT_NORMAL
;
268 else if( mnWeight
< 550 ) eScWeight
= WEIGHT_MEDIUM
;
269 else if( mnWeight
< 650 ) eScWeight
= WEIGHT_SEMIBOLD
;
270 else if( mnWeight
< 750 ) eScWeight
= WEIGHT_BOLD
;
271 else if( mnWeight
< 850 ) eScWeight
= WEIGHT_ULTRABOLD
;
272 else eScWeight
= WEIGHT_BLACK
;
277 FontLineStyle
XclFontData::GetScUnderline() const
279 FontLineStyle eScUnderl
= LINESTYLE_NONE
;
280 switch( mnUnderline
)
282 case EXC_FONTUNDERL_SINGLE
:
283 case EXC_FONTUNDERL_SINGLE_ACC
: eScUnderl
= LINESTYLE_SINGLE
; break;
284 case EXC_FONTUNDERL_DOUBLE
:
285 case EXC_FONTUNDERL_DOUBLE_ACC
: eScUnderl
= LINESTYLE_DOUBLE
; break;
290 SvxEscapement
XclFontData::GetScEscapement() const
292 SvxEscapement eScEscapem
= SvxEscapement::Off
;
295 case EXC_FONTESC_SUPER
: eScEscapem
= SvxEscapement::Superscript
; break;
296 case EXC_FONTESC_SUB
: eScEscapem
= SvxEscapement::Subscript
; break;
301 FontStrikeout
XclFontData::GetScStrikeout() const
303 return mbStrikeout
? STRIKEOUT_SINGLE
: STRIKEOUT_NONE
;
306 void XclFontData::SetScHeight( sal_Int32 nTwips
)
308 mnHeight
= static_cast< sal_uInt16
>( ::std::min( nTwips
, static_cast<sal_Int32
>(0x7FFFL
) ) );
311 void XclFontData::SetScFamily( FontFamily eScFamily
)
315 case FAMILY_DONTKNOW
: mnFamily
= EXC_FONTFAM_DONTKNOW
; break;
316 case FAMILY_DECORATIVE
: mnFamily
= EXC_FONTFAM_DECORATIVE
; break;
317 case FAMILY_MODERN
: mnFamily
= EXC_FONTFAM_MODERN
; break;
318 case FAMILY_ROMAN
: mnFamily
= EXC_FONTFAM_ROMAN
; break;
319 case FAMILY_SCRIPT
: mnFamily
= EXC_FONTFAM_SCRIPT
; break;
320 case FAMILY_SWISS
: mnFamily
= EXC_FONTFAM_SWISS
; break;
321 case FAMILY_SYSTEM
: mnFamily
= EXC_FONTFAM_SYSTEM
; break;
323 OSL_FAIL( "XclFontData::SetScFamily - unknown font family" );
324 mnFamily
= EXC_FONTFAM_DONTKNOW
;
328 void XclFontData::SetFontEncoding( rtl_TextEncoding eFontEnc
)
330 // convert text encoding identifier to Windows character set
331 mnCharSet
= rtl_getBestWindowsCharsetFromTextEncoding( eFontEnc
);
334 void XclFontData::SetScPosture( FontItalic eScPosture
)
336 mbItalic
= (eScPosture
== ITALIC_OBLIQUE
) || (eScPosture
== ITALIC_NORMAL
);
339 void XclFontData::SetScWeight( FontWeight eScWeight
)
343 case WEIGHT_DONTKNOW
: mnWeight
= EXC_FONTWGHT_DONTKNOW
; break;
344 case WEIGHT_THIN
: mnWeight
= EXC_FONTWGHT_THIN
; break;
345 case WEIGHT_ULTRALIGHT
: mnWeight
= EXC_FONTWGHT_ULTRALIGHT
; break;
346 case WEIGHT_LIGHT
: mnWeight
= EXC_FONTWGHT_LIGHT
; break;
347 case WEIGHT_SEMILIGHT
: mnWeight
= EXC_FONTWGHT_SEMILIGHT
; break;
348 case WEIGHT_NORMAL
: mnWeight
= EXC_FONTWGHT_NORMAL
; break;
349 case WEIGHT_MEDIUM
: mnWeight
= EXC_FONTWGHT_MEDIUM
; break;
350 case WEIGHT_SEMIBOLD
: mnWeight
= EXC_FONTWGHT_SEMIBOLD
; break;
351 case WEIGHT_BOLD
: mnWeight
= EXC_FONTWGHT_BOLD
; break;
352 case WEIGHT_ULTRABOLD
: mnWeight
= EXC_FONTWGHT_ULTRABOLD
; break;
353 case WEIGHT_BLACK
: mnWeight
= EXC_FONTWGHT_BLACK
; break;
354 default: mnWeight
= EXC_FONTWGHT_NORMAL
;
358 void XclFontData::SetScUnderline( FontLineStyle eScUnderl
)
363 case LINESTYLE_DONTKNOW
: mnUnderline
= EXC_FONTUNDERL_NONE
; break;
364 case LINESTYLE_DOUBLE
:
365 case LINESTYLE_DOUBLEWAVE
: mnUnderline
= EXC_FONTUNDERL_DOUBLE
; break;
366 default: mnUnderline
= EXC_FONTUNDERL_SINGLE
;
370 void XclFontData::SetScEscapement( short nScEscapem
)
373 mnEscapem
= EXC_FONTESC_SUPER
;
374 else if( nScEscapem
< 0 )
375 mnEscapem
= EXC_FONTESC_SUB
;
377 mnEscapem
= EXC_FONTESC_NONE
;
380 void XclFontData::SetScStrikeout( FontStrikeout eScStrikeout
)
383 (eScStrikeout
== STRIKEOUT_SINGLE
) || (eScStrikeout
== STRIKEOUT_DOUBLE
) ||
384 (eScStrikeout
== STRIKEOUT_BOLD
) || (eScStrikeout
== STRIKEOUT_SLASH
) ||
385 (eScStrikeout
== STRIKEOUT_X
);
388 // *** conversion of API constants *** ----------------------------------------
390 float XclFontData::GetApiHeight() const
392 return static_cast< float >( mnHeight
/ TWIPS_PER_POINT
);
395 sal_Int16
XclFontData::GetApiFamily() const
397 sal_Int16 nApiFamily
= AwtFontFamily::DONTKNOW
;
400 case FAMILY_DECORATIVE
: nApiFamily
= AwtFontFamily::DECORATIVE
; break;
401 case FAMILY_MODERN
: nApiFamily
= AwtFontFamily::MODERN
; break;
402 case FAMILY_ROMAN
: nApiFamily
= AwtFontFamily::ROMAN
; break;
403 case FAMILY_SCRIPT
: nApiFamily
= AwtFontFamily::SCRIPT
; break;
404 case FAMILY_SWISS
: nApiFamily
= AwtFontFamily::SWISS
; break;
405 case FAMILY_SYSTEM
: nApiFamily
= AwtFontFamily::SYSTEM
; break;
410 sal_Int16
XclFontData::GetApiFontEncoding() const
412 // API constants are equal to rtl_TextEncoding constants
413 return static_cast< sal_Int16
>( GetFontEncoding() );
416 Awt::FontSlant
XclFontData::GetApiPosture() const
418 return mbItalic
? Awt::FontSlant_ITALIC
: Awt::FontSlant_NONE
;
421 float XclFontData::GetApiWeight() const
423 return vcl::unohelper::ConvertFontWeight( GetScWeight() );
426 sal_Int16
XclFontData::GetApiUnderline() const
428 sal_Int16 nApiUnderl
= AwtFontLineStyle::NONE
;
429 switch( mnUnderline
)
431 case EXC_FONTUNDERL_SINGLE
:
432 case EXC_FONTUNDERL_SINGLE_ACC
: nApiUnderl
= AwtFontLineStyle::SINGLE
; break;
433 case EXC_FONTUNDERL_DOUBLE
:
434 case EXC_FONTUNDERL_DOUBLE_ACC
: nApiUnderl
= AwtFontLineStyle::DOUBLE
; break;
439 sal_Int16
XclFontData::GetApiEscapement() const
441 sal_Int16 nApiEscapem
= 0;
444 case EXC_FONTESC_SUPER
: nApiEscapem
= 33; break;
445 case EXC_FONTESC_SUB
: nApiEscapem
= -33; break;
450 sal_Int16
XclFontData::GetApiStrikeout() const
452 return mbStrikeout
? AwtFontStrikeout::SINGLE
: AwtFontStrikeout::NONE
;
455 void XclFontData::SetApiHeight( float fPoint
)
457 mnHeight
= static_cast< sal_uInt16
>( ::std::min( fPoint
* TWIPS_PER_POINT
+ 0.5, 32767.0 ) );
460 void XclFontData::SetApiFamily( sal_Int16 nApiFamily
)
464 case AwtFontFamily::DECORATIVE
: mnFamily
= FAMILY_DECORATIVE
; break;
465 case AwtFontFamily::MODERN
: mnFamily
= FAMILY_MODERN
; break;
466 case AwtFontFamily::ROMAN
: mnFamily
= FAMILY_ROMAN
; break;
467 case AwtFontFamily::SCRIPT
: mnFamily
= FAMILY_SCRIPT
; break;
468 case AwtFontFamily::SWISS
: mnFamily
= FAMILY_SWISS
; break;
469 case AwtFontFamily::SYSTEM
: mnFamily
= FAMILY_SYSTEM
; break;
470 default: mnFamily
= FAMILY_DONTKNOW
;
474 void XclFontData::SetApiPosture( Awt::FontSlant eApiPosture
)
477 (eApiPosture
== Awt::FontSlant_OBLIQUE
) ||
478 (eApiPosture
== Awt::FontSlant_ITALIC
) ||
479 (eApiPosture
== Awt::FontSlant_REVERSE_OBLIQUE
) ||
480 (eApiPosture
== Awt::FontSlant_REVERSE_ITALIC
);
483 void XclFontData::SetApiWeight( float fApiWeight
)
485 SetScWeight( vcl::unohelper::ConvertFontWeight( fApiWeight
) );
488 void XclFontData::SetApiUnderline( sal_Int16 nApiUnderl
)
492 case AwtFontLineStyle::NONE
:
493 case AwtFontLineStyle::DONTKNOW
: mnUnderline
= EXC_FONTUNDERL_NONE
; break;
494 case AwtFontLineStyle::DOUBLE
:
495 case AwtFontLineStyle::DOUBLEWAVE
: mnUnderline
= EXC_FONTUNDERL_DOUBLE
; break;
496 default: mnUnderline
= EXC_FONTUNDERL_SINGLE
;
500 void XclFontData::SetApiEscapement( sal_Int16 nApiEscapem
)
502 if( nApiEscapem
> 0 )
503 mnEscapem
= EXC_FONTESC_SUPER
;
504 else if( nApiEscapem
< 0 )
505 mnEscapem
= EXC_FONTESC_SUB
;
507 mnEscapem
= EXC_FONTESC_NONE
;
510 void XclFontData::SetApiStrikeout( sal_Int16 nApiStrikeout
)
513 (nApiStrikeout
!= AwtFontStrikeout::NONE
) &&
514 (nApiStrikeout
!= AwtFontStrikeout::DONTKNOW
);
517 bool operator==( const XclFontData
& rLeft
, const XclFontData
& rRight
)
520 (rLeft
.mnHeight
== rRight
.mnHeight
) &&
521 (rLeft
.mnWeight
== rRight
.mnWeight
) &&
522 (rLeft
.mnUnderline
== rRight
.mnUnderline
) &&
523 (rLeft
.maColor
== rRight
.maColor
) &&
524 (rLeft
.mnEscapem
== rRight
.mnEscapem
) &&
525 (rLeft
.mnFamily
== rRight
.mnFamily
) &&
526 (rLeft
.mnCharSet
== rRight
.mnCharSet
) &&
527 (rLeft
.mbItalic
== rRight
.mbItalic
) &&
528 (rLeft
.mbStrikeout
== rRight
.mbStrikeout
) &&
529 (rLeft
.mbOutline
== rRight
.mbOutline
) &&
530 (rLeft
.mbShadow
== rRight
.mbShadow
) &&
531 (rLeft
.maName
== rRight
.maName
);
536 /** Property names for common font settings. */
537 const sal_Char
*const sppcPropNamesChCommon
[] =
539 "CharUnderline", "CharStrikeout", "CharColor", "CharContoured", "CharShadowed", nullptr
541 /** Property names for Western font settings. */
542 const sal_Char
*const sppcPropNamesChWstrn
[] =
544 "CharFontName", "CharHeight", "CharPosture", "CharWeight", nullptr
546 /** Property names for Asian font settings. */
547 const sal_Char
*const sppcPropNamesChAsian
[] =
549 "CharFontNameAsian", "CharHeightAsian", "CharPostureAsian", "CharWeightAsian", nullptr
551 /** Property names for Complex font settings. */
552 const sal_Char
*const sppcPropNamesChCmplx
[] =
554 "CharFontNameComplex", "CharHeightComplex", "CharPostureComplex", "CharWeightComplex", nullptr
556 /** Property names for escapement. */
557 const sal_Char
*const sppcPropNamesChEscapement
[] =
559 "CharEscapement", "CharEscapementHeight", nullptr
561 const sal_Int8 EXC_API_ESC_HEIGHT
= 58; /// Default escapement font height.
563 /** Property names for Western font settings without font name. */
564 const sal_Char
*const *const sppcPropNamesChWstrnNoName
= sppcPropNamesChWstrn
+ 1;
565 /** Property names for Asian font settings without font name. */
566 const sal_Char
*const *const sppcPropNamesChAsianNoName
= sppcPropNamesChAsian
+ 1;
567 /** Property names for Complex font settings without font name. */
568 const sal_Char
*const *const sppcPropNamesChCmplxNoName
= sppcPropNamesChCmplx
+ 1;
570 /** Property names for font settings in form controls. */
571 const sal_Char
*const sppcPropNamesControl
[] =
573 "FontName", "FontFamily", "FontCharset", "FontHeight", "FontSlant",
574 "FontWeight", "FontLineStyle", "FontStrikeout", "TextColor", nullptr
577 /** Inserts all passed API font settings into the font data object. */
578 void lclSetApiFontSettings( XclFontData
& rFontData
,
579 const OUString
& rApiFontName
, float fApiHeight
, float fApiWeight
,
580 Awt::FontSlant eApiPosture
, sal_Int16 nApiUnderl
, sal_Int16 nApiStrikeout
)
582 rFontData
.maName
= XclTools::GetXclFontName( rApiFontName
);
583 rFontData
.SetApiHeight( fApiHeight
);
584 rFontData
.SetApiWeight( fApiWeight
);
585 rFontData
.SetApiPosture( eApiPosture
);
586 rFontData
.SetApiUnderline( nApiUnderl
);
587 rFontData
.SetApiStrikeout( nApiStrikeout
);
590 /** Writes script dependent properties to a font property set helper. */
591 void lclWriteChartFont( ScfPropertySet
& rPropSet
,
592 ScfPropSetHelper
& rHlpName
, ScfPropSetHelper
& rHlpNoName
,
593 const XclFontData
& rFontData
, bool bHasFontName
)
595 // select the font helper
596 ScfPropSetHelper
& rPropSetHlp
= bHasFontName
? rHlpName
: rHlpNoName
;
597 // initialize the font helper (must be called before writing any properties)
598 rPropSetHlp
.InitializeWrite();
601 rPropSetHlp
<< rFontData
.maName
;
602 // write remaining properties
603 rPropSetHlp
<< rFontData
.GetApiHeight() << rFontData
.GetApiPosture() << rFontData
.GetApiWeight();
604 // write properties to property set
605 rPropSetHlp
.WriteToPropertySet( rPropSet
);
610 XclFontPropSetHelper::XclFontPropSetHelper() :
611 maHlpChCommon( sppcPropNamesChCommon
),
612 maHlpChWstrn( sppcPropNamesChWstrn
),
613 maHlpChAsian( sppcPropNamesChAsian
),
614 maHlpChCmplx( sppcPropNamesChCmplx
),
615 maHlpChWstrnNoName( sppcPropNamesChWstrnNoName
),
616 maHlpChAsianNoName( sppcPropNamesChAsianNoName
),
617 maHlpChCmplxNoName( sppcPropNamesChCmplxNoName
),
618 maHlpChEscapement( sppcPropNamesChEscapement
),
619 maHlpControl( sppcPropNamesControl
)
623 void XclFontPropSetHelper::ReadFontProperties( XclFontData
& rFontData
,
624 const ScfPropertySet
& rPropSet
, XclFontPropSetType eType
, sal_Int16 nScript
)
628 case EXC_FONTPROPSET_CHART
:
630 OUString aApiFontName
;
631 float fApiHeight
, fApiWeight
;
632 sal_Int16 nApiUnderl
= 0, nApiStrikeout
= 0;
633 Awt::FontSlant eApiPosture
;
635 // read script type dependent properties
636 ScfPropSetHelper
& rPropSetHlp
= GetChartHelper( nScript
);
637 rPropSetHlp
.ReadFromPropertySet( rPropSet
);
638 rPropSetHlp
>> aApiFontName
>> fApiHeight
>> eApiPosture
>> fApiWeight
;
639 // read common properties
640 maHlpChCommon
.ReadFromPropertySet( rPropSet
);
641 maHlpChCommon
>> nApiUnderl
644 >> rFontData
.mbOutline
645 >> rFontData
.mbShadow
;
647 // convert API property values to Excel settings
648 lclSetApiFontSettings( rFontData
, aApiFontName
,
649 fApiHeight
, fApiWeight
, eApiPosture
, nApiUnderl
, nApiStrikeout
);
652 sal_Int16 nApiEscapement
= 0;
653 sal_Int8 nApiEscHeight
= 0;
654 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
655 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
656 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
657 maHlpChEscapement
>> nApiEscapement
>> nApiEscHeight
;
658 rFontData
.SetApiEscapement( nApiEscapement
);
662 case EXC_FONTPROPSET_CONTROL
:
664 OUString aApiFontName
;
665 float fApiHeight(0.0), fApiWeight(0.0);
666 sal_Int16
nApiFamily(0), nApiCharSet(0), nApiPosture(0), nApiUnderl(0), nApiStrikeout(0);
668 // read font properties
669 maHlpControl
.ReadFromPropertySet( rPropSet
);
670 maHlpControl
>> aApiFontName
678 >> rFontData
.maColor
;
680 // convert API property values to Excel settings
681 Awt::FontSlant eApiPosture
= static_cast< Awt::FontSlant
>( nApiPosture
);
682 lclSetApiFontSettings( rFontData
, aApiFontName
,
683 fApiHeight
, fApiWeight
, eApiPosture
, nApiUnderl
, nApiStrikeout
);
684 rFontData
.SetApiFamily( nApiFamily
);
685 rFontData
.SetFontEncoding( nApiCharSet
);
691 void XclFontPropSetHelper::WriteFontProperties(
692 ScfPropertySet
& rPropSet
, XclFontPropSetType eType
,
693 const XclFontData
& rFontData
, bool bHasWstrn
, bool bHasAsian
, bool bHasCmplx
,
694 const Color
* pFontColor
)
698 case EXC_FONTPROPSET_CHART
:
700 // write common properties
701 maHlpChCommon
.InitializeWrite();
702 const Color
& rColor
= pFontColor
? *pFontColor
: rFontData
.maColor
;
703 maHlpChCommon
<< rFontData
.GetApiUnderline()
704 << rFontData
.GetApiStrikeout()
706 << rFontData
.mbOutline
707 << rFontData
.mbShadow
;
708 maHlpChCommon
.WriteToPropertySet( rPropSet
);
710 // write script type dependent properties
711 lclWriteChartFont( rPropSet
, maHlpChWstrn
, maHlpChWstrnNoName
, rFontData
, bHasWstrn
);
712 lclWriteChartFont( rPropSet
, maHlpChAsian
, maHlpChAsianNoName
, rFontData
, bHasAsian
);
713 lclWriteChartFont( rPropSet
, maHlpChCmplx
, maHlpChCmplxNoName
, rFontData
, bHasCmplx
);
716 if( rFontData
.GetScEscapement() != SvxEscapement::Off
)
718 maHlpChEscapement
.InitializeWrite();
719 maHlpChEscapement
<< rFontData
.GetApiEscapement() << EXC_API_ESC_HEIGHT
;
720 maHlpChEscapement
.WriteToPropertySet( rPropSet
);
725 case EXC_FONTPROPSET_CONTROL
:
727 maHlpControl
.InitializeWrite();
728 maHlpControl
<< rFontData
.maName
729 << rFontData
.GetApiFamily()
730 << rFontData
.GetApiFontEncoding()
731 << static_cast< sal_Int16
>( rFontData
.GetApiHeight() + 0.5 )
732 << rFontData
.GetApiPosture()
733 << rFontData
.GetApiWeight()
734 << rFontData
.GetApiUnderline()
735 << rFontData
.GetApiStrikeout()
736 << rFontData
.maColor
;
737 maHlpControl
.WriteToPropertySet( rPropSet
);
743 ScfPropSetHelper
& XclFontPropSetHelper::GetChartHelper( sal_Int16 nScript
)
745 namespace ApiScriptType
= ::com::sun::star::i18n::ScriptType
;
748 case ApiScriptType::LATIN
: return maHlpChWstrn
;
749 case ApiScriptType::ASIAN
: return maHlpChAsian
;
750 case ApiScriptType::COMPLEX
: return maHlpChCmplx
;
751 default: OSL_FAIL( "XclFontPropSetHelper::GetChartHelper - unknown script type" );
756 // Number formats =============================================================
760 /** Special number format index describing a reused format. */
761 const NfIndexTableOffset PRV_NF_INDEX_REUSE
= NF_INDEX_TABLE_ENTRIES
;
763 /** German primary language not defined, LANGUAGE_GERMAN belongs to Germany. */
764 constexpr LanguageType PRV_LANGUAGE_GERMAN_PRIM
= primary(LANGUAGE_GERMAN
);
765 /** French primary language not defined, LANGUAGE_FRENCH belongs to France. */
766 constexpr LanguageType PRV_LANGUAGE_FRENCH_PRIM
= primary(LANGUAGE_FRENCH
);
767 /** Parent language identifier for Asian languages. */
768 constexpr LanguageType PRV_LANGUAGE_ASIAN_PRIM
= primary(LANGUAGE_CHINESE
);
770 /** Stores the number format used in Calc for an Excel built-in number format. */
771 struct XclBuiltInFormat
773 sal_uInt16 mnXclNumFmt
; /// Excel built-in index.
774 const sal_Char
* mpFormat
; /// Format string, may be 0 (meOffset used then).
775 NfIndexTableOffset
const meOffset
; /// SvNumberFormatter format index, if mpFormat==0.
776 sal_uInt16
const mnXclReuseFmt
; /// Use this Excel format, if meOffset==PRV_NF_INDEX_REUSE.
779 /** Defines a literal Excel built-in number format. */
780 #define EXC_NUMFMT_STRING( nXclNumFmt, pcUtf8 ) \
781 { nXclNumFmt, pcUtf8, NF_NUMBER_STANDARD, 0 }
783 /** Defines an Excel built-in number format that maps to an own built-in format. */
784 #define EXC_NUMFMT_OFFSET( nXclNumFmt, eOffset ) \
785 { nXclNumFmt, nullptr, eOffset, 0 }
787 /** Defines an Excel built-in number format that is the same as the specified. */
788 #define EXC_NUMFMT_REUSE( nXclNumFmt, nXclReuse ) \
789 { nXclNumFmt, nullptr, PRV_NF_INDEX_REUSE, nXclReuse }
791 /** Terminates an Excel built-in number format table. */
792 #define EXC_NUMFMT_ENDTABLE() \
793 { EXC_FORMAT_NOTFOUND, nullptr, NF_NUMBER_STANDARD, 0 }
795 // Currency unit characters
796 #define UTF8_BAHT "\340\270\277"
797 #define UTF8_EURO "\342\202\254"
798 #define UTF8_POUND_UK "\302\243"
799 #define UTF8_SHEQEL "\342\202\252"
800 #define UTF8_WON "\357\277\246"
801 #define UTF8_YEN_CS "\357\277\245"
802 #define UTF8_YEN_JP "\302\245"
804 // Japanese/Chinese date/time characters
805 #define UTF8_CJ_YEAR "\345\271\264"
806 #define UTF8_CJ_MON "\346\234\210"
807 #define UTF8_CJ_DAY "\346\227\245"
808 #define UTF8_CJ_HOUR "\346\231\202"
809 #define UTF8_CJ_MIN "\345\210\206"
810 #define UTF8_CJ_SEC "\347\247\222"
812 // Chinese Simplified date/time characters
813 #define UTF8_CS_HOUR "\346\227\266"
815 // Korean date/time characters
816 #define UTF8_KO_YEAR "\353\205\204"
817 #define UTF8_KO_MON "\354\233\224"
818 #define UTF8_KO_DAY "\354\235\274"
819 #define UTF8_KO_HOUR "\354\213\234"
820 #define UTF8_KO_MIN "\353\266\204"
821 #define UTF8_KO_SEC "\354\264\210"
823 /** Default number format table. Last parent of all other tables, used for unknown languages. */
824 static const XclBuiltInFormat spBuiltInFormats_DONTKNOW
[] =
826 EXC_NUMFMT_OFFSET( 0, NF_NUMBER_STANDARD
), // General
827 EXC_NUMFMT_OFFSET( 1, NF_NUMBER_INT
), // 0
828 EXC_NUMFMT_OFFSET( 2, NF_NUMBER_DEC2
), // 0.00
829 EXC_NUMFMT_OFFSET( 3, NF_NUMBER_1000INT
), // #,##0
830 EXC_NUMFMT_OFFSET( 4, NF_NUMBER_1000DEC2
), // #,##0.00
831 // 5...8 contained in file
832 EXC_NUMFMT_OFFSET( 9, NF_PERCENT_INT
), // 0%
833 EXC_NUMFMT_OFFSET( 10, NF_PERCENT_DEC2
), // 0.00%
834 EXC_NUMFMT_OFFSET( 11, NF_SCIENTIFIC_000E00
), // 0.00E+00
835 EXC_NUMFMT_OFFSET( 12, NF_FRACTION_1D
), // # ?/?
836 EXC_NUMFMT_OFFSET( 13, NF_FRACTION_2D
), // # ??/??
838 // 14...22 date and time formats
839 EXC_NUMFMT_OFFSET( 14, NF_DATE_SYS_DDMMYYYY
),
840 EXC_NUMFMT_OFFSET( 15, NF_DATE_SYS_DMMMYY
),
841 EXC_NUMFMT_OFFSET( 16, NF_DATE_SYS_DDMMM
),
842 EXC_NUMFMT_OFFSET( 17, NF_DATE_SYS_MMYY
),
843 EXC_NUMFMT_OFFSET( 18, NF_TIME_HHMMAMPM
),
844 EXC_NUMFMT_OFFSET( 19, NF_TIME_HHMMSSAMPM
),
845 EXC_NUMFMT_OFFSET( 20, NF_TIME_HHMM
),
846 EXC_NUMFMT_OFFSET( 21, NF_TIME_HHMMSS
),
847 EXC_NUMFMT_OFFSET( 22, NF_DATETIME_SYSTEM_SHORT_HHMM
),
849 // 23...36 international formats
850 EXC_NUMFMT_REUSE( 23, 0 ),
851 EXC_NUMFMT_REUSE( 24, 0 ),
852 EXC_NUMFMT_REUSE( 25, 0 ),
853 EXC_NUMFMT_REUSE( 26, 0 ),
854 EXC_NUMFMT_REUSE( 27, 14 ),
855 EXC_NUMFMT_REUSE( 28, 14 ),
856 EXC_NUMFMT_REUSE( 29, 14 ),
857 EXC_NUMFMT_REUSE( 30, 14 ),
858 EXC_NUMFMT_REUSE( 31, 14 ),
859 EXC_NUMFMT_REUSE( 32, 21 ),
860 EXC_NUMFMT_REUSE( 33, 21 ),
861 EXC_NUMFMT_REUSE( 34, 21 ),
862 EXC_NUMFMT_REUSE( 35, 21 ),
863 EXC_NUMFMT_REUSE( 36, 14 ),
865 // 37...44 accounting formats
866 // 41...44 contained in file
867 EXC_NUMFMT_STRING( 37, "#,##0;-#,##0" ),
868 EXC_NUMFMT_STRING( 38, "#,##0;[RED]-#,##0" ),
869 EXC_NUMFMT_STRING( 39, "#,##0.00;-#,##0.00" ),
870 EXC_NUMFMT_STRING( 40, "#,##0.00;[RED]-#,##0.00" ),
872 // 45...49 more special formats
873 EXC_NUMFMT_STRING( 45, "mm:ss" ),
874 EXC_NUMFMT_STRING( 46, "[h]:mm:ss" ),
875 EXC_NUMFMT_STRING( 47, "mm:ss.0" ),
876 EXC_NUMFMT_STRING( 48, "##0.0E+0" ),
877 EXC_NUMFMT_OFFSET( 49, NF_TEXT
),
879 // 50...81 international formats
880 EXC_NUMFMT_REUSE( 50, 14 ),
881 EXC_NUMFMT_REUSE( 51, 14 ),
882 EXC_NUMFMT_REUSE( 52, 14 ),
883 EXC_NUMFMT_REUSE( 53, 14 ),
884 EXC_NUMFMT_REUSE( 54, 14 ),
885 EXC_NUMFMT_REUSE( 55, 14 ),
886 EXC_NUMFMT_REUSE( 56, 14 ),
887 EXC_NUMFMT_REUSE( 57, 14 ),
888 EXC_NUMFMT_REUSE( 58, 14 ),
889 EXC_NUMFMT_REUSE( 59, 1 ),
890 EXC_NUMFMT_REUSE( 60, 2 ),
891 EXC_NUMFMT_REUSE( 61, 3 ),
892 EXC_NUMFMT_REUSE( 62, 4 ),
893 EXC_NUMFMT_REUSE( 67, 9 ),
894 EXC_NUMFMT_REUSE( 68, 10 ),
895 EXC_NUMFMT_REUSE( 69, 12 ),
896 EXC_NUMFMT_REUSE( 70, 13 ),
897 EXC_NUMFMT_REUSE( 71, 14 ),
898 EXC_NUMFMT_REUSE( 72, 14 ),
899 EXC_NUMFMT_REUSE( 73, 15 ),
900 EXC_NUMFMT_REUSE( 74, 16 ),
901 EXC_NUMFMT_REUSE( 75, 17 ),
902 EXC_NUMFMT_REUSE( 76, 20 ),
903 EXC_NUMFMT_REUSE( 77, 21 ),
904 EXC_NUMFMT_REUSE( 78, 22 ),
905 EXC_NUMFMT_REUSE( 79, 45 ),
906 EXC_NUMFMT_REUSE( 80, 46 ),
907 EXC_NUMFMT_REUSE( 81, 47 ),
909 // 82...163 not used, must not occur in a file (Excel may crash)
911 EXC_NUMFMT_ENDTABLE()
914 // ENGLISH --------------------------------------------------------------------
916 /** Base table for English locales. */
917 static const XclBuiltInFormat spBuiltInFormats_ENGLISH
[] =
919 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
920 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
921 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
922 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
923 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
924 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY hh:mm" ),
925 EXC_NUMFMT_ENDTABLE()
928 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_UK
[] =
930 EXC_NUMFMT_STRING( 63, UTF8_POUND_UK
"#,##0;-" UTF8_POUND_UK
"#,##0" ),
931 EXC_NUMFMT_STRING( 64, UTF8_POUND_UK
"#,##0;[RED]-" UTF8_POUND_UK
"#,##0" ),
932 EXC_NUMFMT_STRING( 65, UTF8_POUND_UK
"#,##0.00;-" UTF8_POUND_UK
"#,##0.00" ),
933 EXC_NUMFMT_STRING( 66, UTF8_POUND_UK
"#,##0.00;[RED]-" UTF8_POUND_UK
"#,##0.00" ),
934 EXC_NUMFMT_ENDTABLE()
937 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_EIRE
[] =
939 EXC_NUMFMT_STRING( 63, UTF8_EURO
"#,##0;-" UTF8_EURO
"#,##0" ),
940 EXC_NUMFMT_STRING( 64, UTF8_EURO
"#,##0;[RED]-" UTF8_EURO
"#,##0" ),
941 EXC_NUMFMT_STRING( 65, UTF8_EURO
"#,##0.00;-" UTF8_EURO
"#,##0.00" ),
942 EXC_NUMFMT_STRING( 66, UTF8_EURO
"#,##0.00;[RED]-" UTF8_EURO
"#,##0.00" ),
943 EXC_NUMFMT_ENDTABLE()
946 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_US
[] =
948 EXC_NUMFMT_STRING( 14, "M/D/YYYY" ),
949 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
950 EXC_NUMFMT_STRING( 16, "D-MMM" ),
951 EXC_NUMFMT_STRING( 20, "h:mm" ),
952 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
953 EXC_NUMFMT_STRING( 22, "M/D/YYYY h:mm" ),
954 EXC_NUMFMT_STRING( 37, "#,##0_);(#,##0)" ),
955 EXC_NUMFMT_STRING( 38, "#,##0_);[RED](#,##0)" ),
956 EXC_NUMFMT_STRING( 39, "#,##0.00_);(#,##0.00)" ),
957 EXC_NUMFMT_STRING( 40, "#,##0.00_);[RED](#,##0.00)" ),
958 EXC_NUMFMT_STRING( 63, "$#,##0_);($#,##0)" ),
959 EXC_NUMFMT_STRING( 64, "$#,##0_);[RED]($#,##0)" ),
960 EXC_NUMFMT_STRING( 65, "$#,##0.00_);($#,##0.00)" ),
961 EXC_NUMFMT_STRING( 66, "$#,##0.00_);[RED]($#,##0.00)" ),
962 EXC_NUMFMT_ENDTABLE()
965 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_CAN
[] =
967 EXC_NUMFMT_STRING( 20, "h:mm" ),
968 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
969 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY h:mm" ),
970 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
971 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
972 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
973 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
974 EXC_NUMFMT_ENDTABLE()
977 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_AUS
[] =
979 EXC_NUMFMT_STRING( 14, "D/MM/YYYY" ),
980 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
981 EXC_NUMFMT_STRING( 16, "D-MMM" ),
982 EXC_NUMFMT_STRING( 20, "h:mm" ),
983 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
984 EXC_NUMFMT_STRING( 22, "D/MM/YYYY h:mm" ),
985 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
986 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
987 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
988 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
989 EXC_NUMFMT_ENDTABLE()
992 static const XclBuiltInFormat spBuiltInFormats_ENGLISH_SAFRICA
[] =
994 EXC_NUMFMT_STRING( 14, "YYYY/MM/DD" ),
995 EXC_NUMFMT_OFFSET( 18, NF_TIME_HHMMAMPM
),
996 EXC_NUMFMT_OFFSET( 19, NF_TIME_HHMMSSAMPM
),
997 EXC_NUMFMT_STRING( 22, "YYYY/MM/DD hh:mm" ),
998 EXC_NUMFMT_STRING( 63, "\\R #,##0;\\R -#,##0" ),
999 EXC_NUMFMT_STRING( 64, "\\R #,##0;[RED]\\R -#,##0" ),
1000 EXC_NUMFMT_STRING( 65, "\\R #,##0.00;\\R -#,##0.00" ),
1001 EXC_NUMFMT_STRING( 66, "\\R #,##0.00;[RED]\\R -#,##0.00" ),
1002 EXC_NUMFMT_ENDTABLE()
1005 // FRENCH ---------------------------------------------------------------------
1007 /** Base table for French locales. */
1008 static const XclBuiltInFormat spBuiltInFormats_FRENCH
[] =
1010 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1011 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1012 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1013 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1014 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1015 EXC_NUMFMT_ENDTABLE()
1018 static const XclBuiltInFormat spBuiltInFormats_FRENCH_FRANCE
[] =
1020 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY hh:mm" ),
1021 EXC_NUMFMT_STRING( 37, "#,##0\\ _" UTF8_EURO
";-#,##0\\ _" UTF8_EURO
),
1022 EXC_NUMFMT_STRING( 38, "#,##0\\ _" UTF8_EURO
";[RED]-#,##0\\ _" UTF8_EURO
),
1023 EXC_NUMFMT_STRING( 39, "#,##0.00\\ _" UTF8_EURO
";-#,##0.00\\ _" UTF8_EURO
),
1024 EXC_NUMFMT_STRING( 40, "#,##0.00\\ _" UTF8_EURO
";[RED]-#,##0.00\\ _" UTF8_EURO
),
1025 EXC_NUMFMT_STRING( 63, "#,##0\\ " UTF8_EURO
";-#,##0\\ " UTF8_EURO
),
1026 EXC_NUMFMT_STRING( 64, "#,##0\\ " UTF8_EURO
";[RED]-#,##0\\ " UTF8_EURO
),
1027 EXC_NUMFMT_STRING( 65, "#,##0.00\\ " UTF8_EURO
";-#,##0.00\\ " UTF8_EURO
),
1028 EXC_NUMFMT_STRING( 66, "#,##0.00\\ " UTF8_EURO
";[RED]-#,##0.00\\ " UTF8_EURO
),
1029 EXC_NUMFMT_ENDTABLE()
1032 static const XclBuiltInFormat spBuiltInFormats_FRENCH_CANADIAN
[] =
1034 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD hh:mm" ),
1035 EXC_NUMFMT_STRING( 37, "#,##0\\ _$_-;#,##0\\ _$-" ),
1036 EXC_NUMFMT_STRING( 38, "#,##0\\ _$_-;[RED]#,##0\\ _$-" ),
1037 EXC_NUMFMT_STRING( 39, "#,##0.00\\ _$_-;#,##0.00\\ _$-" ),
1038 EXC_NUMFMT_STRING( 40, "#,##0.00\\ _$_-;[RED]#,##0.00\\ _$-" ),
1039 EXC_NUMFMT_STRING( 63, "#,##0\\ $_-;#,##0\\ $-" ),
1040 EXC_NUMFMT_STRING( 64, "#,##0\\ $_-;[RED]#,##0\\ $-" ),
1041 EXC_NUMFMT_STRING( 65, "#,##0.00\\ $_-;#,##0.00\\ $-" ),
1042 EXC_NUMFMT_STRING( 66, "#,##0.00\\ $_-;[RED]#,##0.00\\ $-" ),
1043 EXC_NUMFMT_ENDTABLE()
1046 static const XclBuiltInFormat spBuiltInFormats_FRENCH_SWISS
[] =
1048 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1049 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1050 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1051 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1052 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1053 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1054 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1055 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1056 EXC_NUMFMT_ENDTABLE()
1059 static const XclBuiltInFormat spBuiltInFormats_FRENCH_BELGIAN
[] =
1061 EXC_NUMFMT_STRING( 14, "D/MM/YYYY" ),
1062 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1063 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1064 EXC_NUMFMT_STRING( 20, "h:mm" ),
1065 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1066 EXC_NUMFMT_STRING( 22, "D/MM/YYYY h:mm" ),
1067 EXC_NUMFMT_ENDTABLE()
1070 // GERMAN ---------------------------------------------------------------------
1072 /** Base table for German locales. */
1073 static const XclBuiltInFormat spBuiltInFormats_GERMAN
[] =
1075 EXC_NUMFMT_STRING( 15, "DD. MMM YY" ),
1076 EXC_NUMFMT_STRING( 16, "DD. MMM" ),
1077 EXC_NUMFMT_STRING( 17, "MMM YY" ),
1078 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1079 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1080 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1081 EXC_NUMFMT_ENDTABLE()
1084 static const XclBuiltInFormat spBuiltInFormats_GERMAN_GERMANY
[] =
1086 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1087 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1088 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1089 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1090 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1091 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1092 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1093 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1094 EXC_NUMFMT_ENDTABLE()
1097 static const XclBuiltInFormat spBuiltInFormats_GERMAN_AUSTRIAN
[] =
1099 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1100 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1101 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1102 EXC_NUMFMT_STRING( 63, UTF8_EURO
" #,##0;-" UTF8_EURO
" #,##0" ),
1103 EXC_NUMFMT_STRING( 64, UTF8_EURO
" #,##0;[RED]-" UTF8_EURO
" #,##0" ),
1104 EXC_NUMFMT_STRING( 65, UTF8_EURO
" #,##0.00;-" UTF8_EURO
" #,##0.00" ),
1105 EXC_NUMFMT_STRING( 66, UTF8_EURO
" #,##0.00;[RED]-" UTF8_EURO
" #,##0.00" ),
1106 EXC_NUMFMT_ENDTABLE()
1109 static const XclBuiltInFormat spBuiltInFormats_GERMAN_SWISS
[] =
1111 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1112 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1113 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1114 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1115 EXC_NUMFMT_ENDTABLE()
1118 static const XclBuiltInFormat spBuiltInFormats_GERMAN_LUXEMBOURG
[] =
1120 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1121 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1122 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1123 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1124 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1125 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1126 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1127 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1128 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1129 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1130 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1131 EXC_NUMFMT_ENDTABLE()
1134 static const XclBuiltInFormat spBuiltInFormats_GERMAN_LIECHTENSTEIN
[] =
1136 EXC_NUMFMT_STRING( 63, "\"CHF \"#,##0;\"CHF \"-#,##0" ),
1137 EXC_NUMFMT_STRING( 64, "\"CHF \"#,##0;[RED]\"CHF \"-#,##0" ),
1138 EXC_NUMFMT_STRING( 65, "\"CHF \"#,##0.00;\"CHF \"-#,##0.00" ),
1139 EXC_NUMFMT_STRING( 66, "\"CHF \"#,##0.00;[RED]\"CHF \"-#,##0.00" ),
1140 EXC_NUMFMT_ENDTABLE()
1143 // ITALIAN --------------------------------------------------------------------
1145 static const XclBuiltInFormat spBuiltInFormats_ITALIAN_ITALY
[] =
1147 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1148 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1149 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1150 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1151 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1152 EXC_NUMFMT_STRING( 20, "h:mm" ),
1153 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1154 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY h:mm" ),
1155 EXC_NUMFMT_STRING( 63, UTF8_EURO
" #,##0;-" UTF8_EURO
" #,##0" ),
1156 EXC_NUMFMT_STRING( 64, UTF8_EURO
" #,##0;[RED]-" UTF8_EURO
" #,##0" ),
1157 EXC_NUMFMT_STRING( 65, UTF8_EURO
" #,##0.00;-" UTF8_EURO
" #,##0.00" ),
1158 EXC_NUMFMT_STRING( 66, UTF8_EURO
" #,##0.00;[RED]-" UTF8_EURO
" #,##0.00" ),
1159 EXC_NUMFMT_ENDTABLE()
1162 static const XclBuiltInFormat spBuiltInFormats_ITALIAN_SWISS
[] =
1164 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1165 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1166 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1167 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1168 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1169 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1170 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1171 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1172 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1173 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1174 EXC_NUMFMT_ENDTABLE()
1177 // SWEDISH --------------------------------------------------------------------
1179 static const XclBuiltInFormat spBuiltInFormats_SWEDISH_SWEDEN
[] =
1181 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1182 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1183 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1184 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1185 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1186 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD hh:mm" ),
1187 EXC_NUMFMT_STRING( 37, "#,##0 _k_r;-#,##0 _k_r" ),
1188 EXC_NUMFMT_STRING( 38, "#,##0 _k_r;[RED]-#,##0 _k_r" ),
1189 EXC_NUMFMT_STRING( 39, "#,##0.00 _k_r;-#,##0.00 _k_r" ),
1190 EXC_NUMFMT_STRING( 40, "#,##0.00 _k_r;[RED]-#,##0.00 _k_r" ),
1191 EXC_NUMFMT_STRING( 63, "#,##0 \"kr\";-#,##0 \"kr\"" ),
1192 EXC_NUMFMT_STRING( 64, "#,##0 \"kr\";[RED]-#,##0 \"kr\"" ),
1193 EXC_NUMFMT_STRING( 65, "#,##0.00 \"kr\";-#,##0.00 \"kr\"" ),
1194 EXC_NUMFMT_STRING( 66, "#,##0.00 \"kr\";[RED]-#,##0.00 \"kr\"" ),
1195 EXC_NUMFMT_ENDTABLE()
1198 static const XclBuiltInFormat spBuiltInFormats_SWEDISH_FINLAND
[] =
1200 EXC_NUMFMT_STRING( 9, "0 %" ),
1201 EXC_NUMFMT_STRING( 10, "0.00 %" ),
1202 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1203 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1204 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1205 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1206 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1207 EXC_NUMFMT_STRING( 22, "D.M.YYYY hh:mm" ),
1208 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1209 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1210 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1211 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1212 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1213 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1214 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1215 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1216 EXC_NUMFMT_ENDTABLE()
1219 // ASIAN ----------------------------------------------------------------------
1221 /** Base table for Asian locales. */
1222 static const XclBuiltInFormat spBuiltInFormats_ASIAN
[] =
1224 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1225 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1226 EXC_NUMFMT_STRING( 20, "h:mm" ),
1227 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1228 EXC_NUMFMT_STRING( 23, "$#,##0_);($#,##0)" ),
1229 EXC_NUMFMT_STRING( 24, "$#,##0_);[RED]($#,##0)" ),
1230 EXC_NUMFMT_STRING( 25, "$#,##0.00_);($#,##0.00)" ),
1231 EXC_NUMFMT_STRING( 26, "$#,##0.00_);[RED]($#,##0.00)" ),
1232 EXC_NUMFMT_REUSE( 29, 28 ),
1233 EXC_NUMFMT_REUSE( 36, 27 ),
1234 EXC_NUMFMT_REUSE( 50, 27 ),
1235 EXC_NUMFMT_REUSE( 51, 28 ),
1236 EXC_NUMFMT_REUSE( 52, 34 ),
1237 EXC_NUMFMT_REUSE( 53, 35 ),
1238 EXC_NUMFMT_REUSE( 54, 28 ),
1239 EXC_NUMFMT_REUSE( 55, 34 ),
1240 EXC_NUMFMT_REUSE( 56, 35 ),
1241 EXC_NUMFMT_REUSE( 57, 27 ),
1242 EXC_NUMFMT_REUSE( 58, 28 ),
1243 EXC_NUMFMT_ENDTABLE()
1246 static const XclBuiltInFormat spBuiltInFormats_JAPANESE
[] =
1248 EXC_NUMFMT_STRING( 14, "YYYY/M/D" ),
1249 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1250 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1251 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1252 EXC_NUMFMT_STRING( 22, "YYYY/M/D h:mm" ),
1253 EXC_NUMFMT_STRING( 27, "[$-0411]GE.M.D" ),
1254 EXC_NUMFMT_STRING( 28, "[$-0411]GGGE" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1255 EXC_NUMFMT_STRING( 30, "[$-0411]M/D/YY" ),
1256 EXC_NUMFMT_STRING( 31, "[$-0411]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1257 EXC_NUMFMT_STRING( 32, "[$-0411]h" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1258 EXC_NUMFMT_STRING( 33, "[$-0411]h" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1259 EXC_NUMFMT_STRING( 34, "[$-0411]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
),
1260 EXC_NUMFMT_STRING( 35, "[$-0411]M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1261 EXC_NUMFMT_STRING( 63, UTF8_YEN_JP
"#,##0;-" UTF8_YEN_JP
"#,##0" ),
1262 EXC_NUMFMT_STRING( 64, UTF8_YEN_JP
"#,##0;[RED]-" UTF8_YEN_JP
"#,##0" ),
1263 EXC_NUMFMT_STRING( 65, UTF8_YEN_JP
"#,##0.00;-" UTF8_YEN_JP
"#,##0.00" ),
1264 EXC_NUMFMT_STRING( 66, UTF8_YEN_JP
"#,##0.00;[RED]-" UTF8_YEN_JP
"#,##0.00" ),
1265 EXC_NUMFMT_ENDTABLE()
1268 static const XclBuiltInFormat spBuiltInFormats_KOREAN
[] =
1270 EXC_NUMFMT_STRING( 14, "YYYY-MM-DD" ),
1271 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1272 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1273 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1274 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD h:mm" ),
1275 EXC_NUMFMT_STRING( 27, "[$-0412]YYYY" UTF8_CJ_YEAR
" MM" UTF8_CJ_MON
" DD" UTF8_CJ_DAY
),
1276 EXC_NUMFMT_STRING( 28, "[$-0412]MM-DD" ),
1277 EXC_NUMFMT_STRING( 30, "[$-0412]MM-DD-YY" ),
1278 EXC_NUMFMT_STRING( 31, "[$-0412]YYYY" UTF8_KO_YEAR
" MM" UTF8_KO_MON
" DD" UTF8_KO_DAY
),
1279 EXC_NUMFMT_STRING( 32, "[$-0412]h" UTF8_KO_HOUR
" mm" UTF8_KO_MIN
),
1280 EXC_NUMFMT_STRING( 33, "[$-0412]h" UTF8_KO_HOUR
" mm" UTF8_KO_MIN
" ss" UTF8_KO_SEC
),
1281 EXC_NUMFMT_STRING( 34, "[$-0412]YYYY\"/\"MM\"/\"DD" ),
1282 EXC_NUMFMT_STRING( 35, "[$-0412]YYYY-MM-DD" ),
1283 EXC_NUMFMT_STRING( 63, UTF8_WON
"#,##0;-" UTF8_WON
"#,##0" ),
1284 EXC_NUMFMT_STRING( 64, UTF8_WON
"#,##0;[RED]-" UTF8_WON
"#,##0" ),
1285 EXC_NUMFMT_STRING( 65, UTF8_WON
"#,##0.00;-" UTF8_WON
"#,##0.00" ),
1286 EXC_NUMFMT_STRING( 66, UTF8_WON
"#,##0.00;[RED]-" UTF8_WON
"#,##0.00" ),
1287 EXC_NUMFMT_ENDTABLE()
1290 static const XclBuiltInFormat spBuiltInFormats_CHINESE_SIMPLIFIED
[] =
1292 EXC_NUMFMT_STRING( 14, "YYYY-M-D" ),
1293 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1294 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1295 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1296 EXC_NUMFMT_STRING( 22, "YYYY-M-D h:mm" ),
1297 EXC_NUMFMT_STRING( 27, "[$-0804]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
),
1298 EXC_NUMFMT_STRING( 28, "[$-0804]M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1299 EXC_NUMFMT_STRING( 30, "[$-0804]M-D-YY" ),
1300 EXC_NUMFMT_STRING( 31, "[$-0804]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1301 EXC_NUMFMT_STRING( 32, "[$-0804]h" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
),
1302 EXC_NUMFMT_STRING( 33, "[$-0804]h" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1303 EXC_NUMFMT_STRING( 34, "[$-0804]AM/PMh" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
),
1304 EXC_NUMFMT_STRING( 35, "[$-0804]AM/PMh" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1305 EXC_NUMFMT_REUSE( 52, 27 ),
1306 EXC_NUMFMT_REUSE( 53, 28 ),
1307 EXC_NUMFMT_STRING( 63, UTF8_YEN_CS
"#,##0;-" UTF8_YEN_CS
"#,##0" ),
1308 EXC_NUMFMT_STRING( 64, UTF8_YEN_CS
"#,##0;[RED]-" UTF8_YEN_CS
"#,##0" ),
1309 EXC_NUMFMT_STRING( 65, UTF8_YEN_CS
"#,##0.00;-" UTF8_YEN_CS
"#,##0.00" ),
1310 EXC_NUMFMT_STRING( 66, UTF8_YEN_CS
"#,##0.00;[RED]-" UTF8_YEN_CS
"#,##0.00" ),
1311 EXC_NUMFMT_ENDTABLE()
1314 static const XclBuiltInFormat spBuiltInFormats_CHINESE_TRADITIONAL
[] =
1316 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1317 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1318 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1319 EXC_NUMFMT_STRING( 18, "hh:mm AM/PM" ),
1320 EXC_NUMFMT_STRING( 19, "hh:mm:ss AM/PM" ),
1321 EXC_NUMFMT_OFFSET( 20, NF_TIME_HHMM
),
1322 EXC_NUMFMT_OFFSET( 21, NF_TIME_HHMMSS
),
1323 EXC_NUMFMT_STRING( 22, "YYYY/M/D hh:mm" ),
1324 EXC_NUMFMT_STRING( 23, "US$#,##0_);(US$#,##0)" ),
1325 EXC_NUMFMT_STRING( 24, "US$#,##0_);[RED](US$#,##0)" ),
1326 EXC_NUMFMT_STRING( 25, "US$#,##0.00_);(US$#,##0.00)" ),
1327 EXC_NUMFMT_STRING( 26, "US$#,##0.00_);[RED](US$#,##0.00)" ),
1328 EXC_NUMFMT_STRING( 27, "[$-0404]E/M/D" ),
1329 EXC_NUMFMT_STRING( 28, "[$-0404]E" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1330 EXC_NUMFMT_STRING( 30, "[$-0404]M/D/YY" ),
1331 EXC_NUMFMT_STRING( 31, "[$-0404]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1332 EXC_NUMFMT_STRING( 32, "[$-0404]hh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1333 EXC_NUMFMT_STRING( 33, "[$-0404]hh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1334 EXC_NUMFMT_STRING( 34, "[$-0404]AM/PMhh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1335 EXC_NUMFMT_STRING( 35, "[$-0404]AM/PMhh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1336 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
1337 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
1338 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
1339 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
1340 EXC_NUMFMT_ENDTABLE()
1343 // OTHER ----------------------------------------------------------------------
1345 static const XclBuiltInFormat spBuiltInFormats_HEBREW
[] =
1347 EXC_NUMFMT_STRING( 15, "DD-MMMM-YY" ),
1348 EXC_NUMFMT_STRING( 16, "DD-MMMM" ),
1349 EXC_NUMFMT_STRING( 17, "MMMM-YY" ),
1350 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1351 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1352 EXC_NUMFMT_STRING( 63, UTF8_SHEQEL
" #,##0;" UTF8_SHEQEL
" -#,##0" ),
1353 EXC_NUMFMT_STRING( 64, UTF8_SHEQEL
" #,##0;[RED]" UTF8_SHEQEL
" -#,##0" ),
1354 EXC_NUMFMT_STRING( 65, UTF8_SHEQEL
" #,##0.00;" UTF8_SHEQEL
" -#,##0.00" ),
1355 EXC_NUMFMT_STRING( 66, UTF8_SHEQEL
" #,##0.00;[RED]" UTF8_SHEQEL
" -#,##0.00" ),
1356 EXC_NUMFMT_ENDTABLE()
1359 static const XclBuiltInFormat spBuiltInFormats_THAI
[] =
1361 EXC_NUMFMT_STRING( 14, "D/M/YYYY" ),
1362 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1363 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1364 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1365 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1366 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1367 EXC_NUMFMT_STRING( 22, "D/M/YYYY h:mm" ),
1368 EXC_NUMFMT_STRING( 59, "t0" ),
1369 EXC_NUMFMT_STRING( 60, "t0.00" ),
1370 EXC_NUMFMT_STRING( 61, "t#,##0" ),
1371 EXC_NUMFMT_STRING( 62, "t#,##0.00" ),
1372 EXC_NUMFMT_STRING( 63, "t" UTF8_BAHT
"#,##0_);t(" UTF8_BAHT
"#,##0)" ),
1373 EXC_NUMFMT_STRING( 64, "t" UTF8_BAHT
"#,##0_);[RED]t(" UTF8_BAHT
"#,##0)" ),
1374 EXC_NUMFMT_STRING( 65, "t" UTF8_BAHT
"#,##0.00_);t(" UTF8_BAHT
"#,##0.00)" ),
1375 EXC_NUMFMT_STRING( 66, "t" UTF8_BAHT
"#,##0.00_);[RED]t(" UTF8_BAHT
"#,##0.00)" ),
1376 EXC_NUMFMT_STRING( 67, "t0%" ),
1377 EXC_NUMFMT_STRING( 68, "t0.00%" ),
1378 EXC_NUMFMT_STRING( 69, "t# ?/?" ),
1379 EXC_NUMFMT_STRING( 70, "t# ?\?/?\?" ),
1380 EXC_NUMFMT_STRING( 71, "tD/M/EE" ),
1381 EXC_NUMFMT_STRING( 72, "tD-MMM-E" ),
1382 EXC_NUMFMT_STRING( 73, "tD-MMM" ),
1383 EXC_NUMFMT_STRING( 74, "tMMM-E" ),
1384 EXC_NUMFMT_STRING( 75, "th:mm" ),
1385 EXC_NUMFMT_STRING( 76, "th:mm:ss" ),
1386 EXC_NUMFMT_STRING( 77, "tD/M/EE h:mm" ),
1387 EXC_NUMFMT_STRING( 78, "tmm:ss" ),
1388 EXC_NUMFMT_STRING( 79, "t[h]:mm:ss" ),
1389 EXC_NUMFMT_STRING( 80, "tmm:ss.0" ),
1390 EXC_NUMFMT_STRING( 81, "D/M/E" ),
1391 EXC_NUMFMT_ENDTABLE()
1394 #undef EXC_NUMFMT_ENDTABLE
1395 #undef EXC_NUMFMT_REUSE
1396 #undef EXC_NUMFMT_OFFSET
1397 #undef EXC_NUMFMT_STRING
1399 /** Specifies a number format table for a specific language. */
1400 struct XclBuiltInFormatTable
1402 LanguageType meLanguage
; /// The language of this table.
1403 LanguageType
const meParentLang
; /// The language of the parent table.
1404 const XclBuiltInFormat
* mpFormats
; /// The number format table.
1407 static const XclBuiltInFormatTable spBuiltInFormatTables
[] =
1408 { // language parent language format table
1409 { LANGUAGE_DONTKNOW
, LANGUAGE_NONE
, spBuiltInFormats_DONTKNOW
},
1411 { LANGUAGE_ENGLISH
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ENGLISH
},
1412 { LANGUAGE_ENGLISH_UK
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_UK
},
1413 { LANGUAGE_ENGLISH_EIRE
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_EIRE
},
1414 { LANGUAGE_ENGLISH_US
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_US
},
1415 { LANGUAGE_ENGLISH_CAN
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_CAN
},
1416 { LANGUAGE_ENGLISH_AUS
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_AUS
},
1417 { LANGUAGE_ENGLISH_SAFRICA
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_SAFRICA
},
1418 { LANGUAGE_ENGLISH_NZ
, LANGUAGE_ENGLISH_AUS
, nullptr },
1420 { PRV_LANGUAGE_FRENCH_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_FRENCH
},
1421 { LANGUAGE_FRENCH
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_FRANCE
},
1422 { LANGUAGE_FRENCH_CANADIAN
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_CANADIAN
},
1423 { LANGUAGE_FRENCH_SWISS
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_SWISS
},
1424 { LANGUAGE_FRENCH_BELGIAN
, LANGUAGE_FRENCH
, spBuiltInFormats_FRENCH_BELGIAN
},
1425 { LANGUAGE_FRENCH_LUXEMBOURG
, LANGUAGE_FRENCH
, nullptr },
1426 { LANGUAGE_FRENCH_MONACO
, LANGUAGE_FRENCH
, nullptr },
1428 { PRV_LANGUAGE_GERMAN_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_GERMAN
},
1429 { LANGUAGE_GERMAN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_GERMANY
},
1430 { LANGUAGE_GERMAN_AUSTRIAN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_AUSTRIAN
},
1431 { LANGUAGE_GERMAN_SWISS
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_SWISS
},
1432 { LANGUAGE_GERMAN_LUXEMBOURG
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_LUXEMBOURG
},
1433 { LANGUAGE_GERMAN_LIECHTENSTEIN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_LIECHTENSTEIN
},
1435 { LANGUAGE_ITALIAN
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ITALIAN_ITALY
},
1436 { LANGUAGE_ITALIAN_SWISS
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ITALIAN_SWISS
},
1438 { LANGUAGE_SWEDISH
, LANGUAGE_DONTKNOW
, spBuiltInFormats_SWEDISH_SWEDEN
},
1439 { LANGUAGE_SWEDISH_FINLAND
, LANGUAGE_DONTKNOW
, spBuiltInFormats_SWEDISH_FINLAND
},
1441 { PRV_LANGUAGE_ASIAN_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ASIAN
},
1442 { LANGUAGE_JAPANESE
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_JAPANESE
},
1443 { LANGUAGE_KOREAN
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_KOREAN
},
1444 { LANGUAGE_CHINESE_SIMPLIFIED
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_CHINESE_SIMPLIFIED
},
1445 { LANGUAGE_CHINESE_TRADITIONAL
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_CHINESE_TRADITIONAL
},
1447 { LANGUAGE_HEBREW
, LANGUAGE_DONTKNOW
, spBuiltInFormats_HEBREW
},
1448 { LANGUAGE_THAI
, LANGUAGE_DONTKNOW
, spBuiltInFormats_THAI
}
1453 XclNumFmtBuffer::XclNumFmtBuffer( const XclRoot
& rRoot
) :
1454 meSysLang( rRoot
.GetSysLanguage() ),
1455 mnStdScNumFmt( rRoot
.GetFormatter().GetStandardIndex( ScGlobal::eLnge
) )
1457 // *** insert default formats (BIFF5+ only)***
1459 if( rRoot
.GetBiff() >= EXC_BIFF5
)
1460 InsertBuiltinFormats();
1463 void XclNumFmtBuffer::InitializeImport()
1468 void XclNumFmtBuffer::InsertFormat( sal_uInt16 nXclNumFmt
, const OUString
& rFormat
)
1470 XclNumFmt
& rNumFmt
= maFmtMap
[ nXclNumFmt
];
1471 rNumFmt
.maFormat
= rFormat
;
1472 // #i62053# rFormat may be an empty string, meOffset must be initialized
1473 rNumFmt
.meOffset
= NF_NUMBER_STANDARD
;
1474 rNumFmt
.meLanguage
= LANGUAGE_SYSTEM
;
1477 void XclNumFmtBuffer::InsertBuiltinFormats()
1479 // build a map containing tables for all languages
1480 typedef ::std::map
< LanguageType
, const XclBuiltInFormatTable
* > XclBuiltInMap
;
1481 XclBuiltInMap aBuiltInMap
;
1482 for(const auto &rTable
: spBuiltInFormatTables
)
1483 aBuiltInMap
[ rTable
.meLanguage
] = &rTable
;
1485 // build a list of table pointers for the current language, with all parent tables
1486 typedef ::std::vector
< const XclBuiltInFormatTable
* > XclBuiltInVec
;
1487 XclBuiltInVec aBuiltInVec
;
1488 for( XclBuiltInMap::const_iterator aMIt
= aBuiltInMap
.find( meSysLang
), aMEnd
= aBuiltInMap
.end();
1489 aMIt
!= aMEnd
; aMIt
= aBuiltInMap
.find( aMIt
->second
->meParentLang
) )
1490 aBuiltInVec
.push_back( aMIt
->second
);
1491 // language not supported
1492 if( aBuiltInVec
.empty() )
1494 SAL_WARN("sc", "XclNumFmtBuffer::InsertBuiltinFormats - language not supported (#i29949#) 0x" << std::hex
<< meSysLang
);
1495 XclBuiltInMap::const_iterator aMIt
= aBuiltInMap
.find( LANGUAGE_DONTKNOW
);
1496 OSL_ENSURE( aMIt
!= aBuiltInMap
.end(), "XclNumFmtBuffer::InsertBuiltinFormats - default map not found" );
1497 if( aMIt
!= aBuiltInMap
.end() )
1498 aBuiltInVec
.push_back( aMIt
->second
);
1501 // insert the default formats in the format map, from root parent to system language
1502 typedef ::std::map
< sal_uInt16
, sal_uInt16
> XclReuseMap
;
1503 XclReuseMap aReuseMap
;
1504 for( XclBuiltInVec::reverse_iterator aVIt
= aBuiltInVec
.rbegin(), aVEnd
= aBuiltInVec
.rend(); aVIt
!= aVEnd
; ++aVIt
)
1506 // put LANGUAGE_SYSTEM for all entries in default table
1507 LanguageType eLang
= ((*aVIt
)->meLanguage
== LANGUAGE_DONTKNOW
) ? LANGUAGE_SYSTEM
: meSysLang
;
1508 for( const XclBuiltInFormat
* pBuiltIn
= (*aVIt
)->mpFormats
; pBuiltIn
&& (pBuiltIn
->mnXclNumFmt
!= EXC_FORMAT_NOTFOUND
); ++pBuiltIn
)
1510 XclNumFmt
& rNumFmt
= maFmtMap
[ pBuiltIn
->mnXclNumFmt
];
1512 rNumFmt
.meOffset
= pBuiltIn
->meOffset
;
1513 rNumFmt
.meLanguage
= eLang
;
1515 if( pBuiltIn
->mpFormat
)
1516 rNumFmt
.maFormat
= OUString( pBuiltIn
->mpFormat
, strlen(pBuiltIn
->mpFormat
), RTL_TEXTENCODING_UTF8
);
1518 rNumFmt
.maFormat
= EMPTY_OUSTRING
;
1520 if( pBuiltIn
->meOffset
== PRV_NF_INDEX_REUSE
)
1521 aReuseMap
[ pBuiltIn
->mnXclNumFmt
] = pBuiltIn
->mnXclReuseFmt
;
1523 aReuseMap
.erase( pBuiltIn
->mnXclNumFmt
);
1527 // copy reused number formats
1528 for( const auto& [rXclNumFmt
, rXclReuseFmt
] : aReuseMap
)
1529 maFmtMap
[ rXclNumFmt
] = maFmtMap
[ rXclReuseFmt
];
1532 // Cell formatting data (XF) ==================================================
1534 XclCellProt::XclCellProt() :
1535 mbLocked( true ), // default in Excel and Calc
1540 bool operator==( const XclCellProt
& rLeft
, const XclCellProt
& rRight
)
1542 return (rLeft
.mbLocked
== rRight
.mbLocked
) && (rLeft
.mbHidden
== rRight
.mbHidden
);
1545 XclCellAlign::XclCellAlign() :
1546 mnHorAlign( EXC_XF_HOR_GENERAL
),
1547 mnVerAlign( EXC_XF_VER_BOTTOM
),
1548 mnOrient( EXC_ORIENT_NONE
),
1549 mnTextDir( EXC_XF_TEXTDIR_CONTEXT
),
1550 mnRotation( EXC_ROT_NONE
),
1552 mbLineBreak( false ),
1557 SvxCellHorJustify
XclCellAlign::GetScHorAlign() const
1559 SvxCellHorJustify eHorJust
= SvxCellHorJustify::Standard
;
1560 switch( mnHorAlign
)
1562 case EXC_XF_HOR_GENERAL
: eHorJust
= SvxCellHorJustify::Standard
; break;
1563 case EXC_XF_HOR_LEFT
: eHorJust
= SvxCellHorJustify::Left
; break;
1564 case EXC_XF_HOR_CENTER_AS
:
1565 case EXC_XF_HOR_CENTER
: eHorJust
= SvxCellHorJustify::Center
; break;
1566 case EXC_XF_HOR_RIGHT
: eHorJust
= SvxCellHorJustify::Right
; break;
1567 case EXC_XF_HOR_FILL
: eHorJust
= SvxCellHorJustify::Repeat
; break;
1568 case EXC_XF_HOR_JUSTIFY
:
1569 case EXC_XF_HOR_DISTRIB
: eHorJust
= SvxCellHorJustify::Block
; break;
1570 default: OSL_FAIL( "XclCellAlign::GetScHorAlign - unknown horizontal alignment" );
1575 SvxCellJustifyMethod
XclCellAlign::GetScHorJustifyMethod() const
1577 return (mnHorAlign
== EXC_XF_HOR_DISTRIB
) ? SvxCellJustifyMethod::Distribute
: SvxCellJustifyMethod::Auto
;
1580 SvxCellVerJustify
XclCellAlign::GetScVerAlign() const
1582 SvxCellVerJustify eVerJust
= SvxCellVerJustify::Standard
;
1583 switch( mnVerAlign
)
1585 case EXC_XF_VER_TOP
: eVerJust
= SvxCellVerJustify::Top
; break;
1586 case EXC_XF_VER_CENTER
: eVerJust
= SvxCellVerJustify::Center
; break;
1587 case EXC_XF_VER_BOTTOM
: eVerJust
= SvxCellVerJustify::Standard
; break;
1588 case EXC_XF_VER_JUSTIFY
:
1589 case EXC_XF_VER_DISTRIB
: eVerJust
= SvxCellVerJustify::Block
; break;
1590 default: OSL_FAIL( "XclCellAlign::GetScVerAlign - unknown vertical alignment" );
1595 SvxCellJustifyMethod
XclCellAlign::GetScVerJustifyMethod() const
1597 return (mnVerAlign
== EXC_XF_VER_DISTRIB
) ? SvxCellJustifyMethod::Distribute
: SvxCellJustifyMethod::Auto
;
1600 SvxFrameDirection
XclCellAlign::GetScFrameDir() const
1602 SvxFrameDirection eFrameDir
= SvxFrameDirection::Environment
;
1605 case EXC_XF_TEXTDIR_CONTEXT
: eFrameDir
= SvxFrameDirection::Environment
; break;
1606 case EXC_XF_TEXTDIR_LTR
: eFrameDir
= SvxFrameDirection::Horizontal_LR_TB
; break;
1607 case EXC_XF_TEXTDIR_RTL
: eFrameDir
= SvxFrameDirection::Horizontal_RL_TB
; break;
1608 default: OSL_FAIL( "XclCellAlign::GetScFrameDir - unknown CTL text direction" );
1613 void XclCellAlign::SetScHorAlign( SvxCellHorJustify eHorJust
)
1617 case SvxCellHorJustify::Standard
: mnHorAlign
= EXC_XF_HOR_GENERAL
; break;
1618 case SvxCellHorJustify::Left
: mnHorAlign
= EXC_XF_HOR_LEFT
; break;
1619 case SvxCellHorJustify::Center
: mnHorAlign
= EXC_XF_HOR_CENTER
; break;
1620 case SvxCellHorJustify::Right
: mnHorAlign
= EXC_XF_HOR_RIGHT
; break;
1621 case SvxCellHorJustify::Block
: mnHorAlign
= EXC_XF_HOR_JUSTIFY
; break;
1622 case SvxCellHorJustify::Repeat
: mnHorAlign
= EXC_XF_HOR_FILL
; break;
1623 default: mnHorAlign
= EXC_XF_HOR_GENERAL
;
1624 OSL_FAIL( "XclCellAlign::SetScHorAlign - unknown horizontal alignment" );
1628 void XclCellAlign::SetScVerAlign( SvxCellVerJustify eVerJust
)
1632 case SvxCellVerJustify::Standard
: mnVerAlign
= EXC_XF_VER_BOTTOM
; break;
1633 case SvxCellVerJustify::Top
: mnVerAlign
= EXC_XF_VER_TOP
; break;
1634 case SvxCellVerJustify::Center
: mnVerAlign
= EXC_XF_VER_CENTER
; break;
1635 case SvxCellVerJustify::Bottom
: mnVerAlign
= EXC_XF_VER_BOTTOM
; break;
1636 default: mnVerAlign
= EXC_XF_VER_BOTTOM
;
1637 OSL_FAIL( "XclCellAlign::SetScVerAlign - unknown vertical alignment" );
1641 void XclCellAlign::SetScFrameDir( SvxFrameDirection eFrameDir
)
1645 case SvxFrameDirection::Environment
: mnTextDir
= EXC_XF_TEXTDIR_CONTEXT
; break;
1646 case SvxFrameDirection::Horizontal_LR_TB
: mnTextDir
= EXC_XF_TEXTDIR_LTR
; break;
1647 case SvxFrameDirection::Horizontal_RL_TB
: mnTextDir
= EXC_XF_TEXTDIR_RTL
; break;
1648 default: mnTextDir
= EXC_XF_TEXTDIR_CONTEXT
;
1649 OSL_FAIL( "XclCellAlign::SetScFrameDir - unknown CTL text direction" );
1653 bool operator==( const XclCellAlign
& rLeft
, const XclCellAlign
& rRight
)
1656 (rLeft
.mnHorAlign
== rRight
.mnHorAlign
) && (rLeft
.mnVerAlign
== rRight
.mnVerAlign
) &&
1657 (rLeft
.mnTextDir
== rRight
.mnTextDir
) && (rLeft
.mnOrient
== rRight
.mnOrient
) &&
1658 (rLeft
.mnRotation
== rRight
.mnRotation
) && (rLeft
.mnIndent
== rRight
.mnIndent
) &&
1659 (rLeft
.mbLineBreak
== rRight
.mbLineBreak
) && (rLeft
.mbShrink
== rRight
.mbShrink
);
1662 XclCellBorder::XclCellBorder() :
1668 mnLeftLine( EXC_LINE_NONE
),
1669 mnRightLine( EXC_LINE_NONE
),
1670 mnTopLine( EXC_LINE_NONE
),
1671 mnBottomLine( EXC_LINE_NONE
),
1672 mnDiagLine( EXC_LINE_NONE
),
1673 mbDiagTLtoBR( false ),
1674 mbDiagBLtoTR( false )
1678 bool operator==( const XclCellBorder
& rLeft
, const XclCellBorder
& rRight
)
1681 (rLeft
.mnLeftColor
== rRight
.mnLeftColor
) && (rLeft
.mnRightColor
== rRight
.mnRightColor
) &&
1682 (rLeft
.mnTopColor
== rRight
.mnTopColor
) && (rLeft
.mnBottomColor
== rRight
.mnBottomColor
) &&
1683 (rLeft
.mnLeftLine
== rRight
.mnLeftLine
) && (rLeft
.mnRightLine
== rRight
.mnRightLine
) &&
1684 (rLeft
.mnTopLine
== rRight
.mnTopLine
) && (rLeft
.mnBottomLine
== rRight
.mnBottomLine
) &&
1685 (rLeft
.mnDiagColor
== rRight
.mnDiagColor
) && (rLeft
.mnDiagLine
== rRight
.mnDiagLine
) &&
1686 (rLeft
.mbDiagTLtoBR
== rRight
.mbDiagTLtoBR
) && (rLeft
.mbDiagBLtoTR
== rRight
.mbDiagBLtoTR
);
1689 XclCellArea::XclCellArea() :
1690 mnForeColor( EXC_COLOR_WINDOWTEXT
),
1691 mnBackColor( EXC_COLOR_WINDOWBACK
),
1692 mnPattern( EXC_PATT_NONE
)
1696 bool XclCellArea::IsTransparent() const
1698 return (mnPattern
== EXC_PATT_NONE
) && (mnBackColor
== EXC_COLOR_WINDOWBACK
);
1701 bool operator==( const XclCellArea
& rLeft
, const XclCellArea
& rRight
)
1704 (rLeft
.mnForeColor
== rRight
.mnForeColor
) && (rLeft
.mnBackColor
== rRight
.mnBackColor
) &&
1705 (rLeft
.mnPattern
== rRight
.mnPattern
);
1708 XclXFBase::XclXFBase( bool bCellXF
) :
1709 mnParent( bCellXF
? EXC_XF_DEFAULTSTYLE
: EXC_XF_STYLEPARENT
),
1712 SetAllUsedFlags( false );
1715 XclXFBase::~XclXFBase()
1719 void XclXFBase::SetAllUsedFlags( bool bUsed
)
1721 mbProtUsed
= mbFontUsed
= mbFmtUsed
= mbAlignUsed
= mbBorderUsed
= mbAreaUsed
= bUsed
;
1724 bool XclXFBase::HasUsedFlags() const
1726 return mbProtUsed
|| mbFontUsed
|| mbFmtUsed
|| mbAlignUsed
|| mbBorderUsed
|| mbAreaUsed
;
1729 bool XclXFBase::Equals( const XclXFBase
& rCmp
) const
1732 (mbCellXF
== rCmp
.mbCellXF
) && (mnParent
== rCmp
.mnParent
) &&
1733 (mbProtUsed
== rCmp
.mbProtUsed
) && (mbFontUsed
== rCmp
.mbFontUsed
) &&
1734 (mbFmtUsed
== rCmp
.mbFmtUsed
) && (mbAlignUsed
== rCmp
.mbAlignUsed
) &&
1735 (mbBorderUsed
== rCmp
.mbBorderUsed
) && (mbAreaUsed
== rCmp
.mbAreaUsed
);
1738 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */