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 <svl/numformat.hxx>
33 #include <svtools/colorcfg.hxx>
34 #include <vcl/unohelp.hxx>
35 #include <editeng/svxfont.hxx>
36 #include <o3tl/unit_conversion.hxx>
39 #include <xltools.hxx>
40 // Color data =================================================================
42 /** Standard EGA colors, bright. */
43 #define EXC_PALETTE_EGA_COLORS_LIGHT \
44 Color(0x000000), Color(0xFFFFFF), Color(0xFF0000), Color(0x00FF00), Color(0x0000FF), Color(0xFFFF00), Color(0xFF00FF), Color(0x00FFFF)
45 /** Standard EGA colors, dark. */
46 #define EXC_PALETTE_EGA_COLORS_DARK \
47 Color(0x800000), Color(0x008000), Color(0x000080), Color(0x808000), Color(0x800080), Color(0x008080), Color(0xC0C0C0), Color(0x808080)
49 /** Default color table for BIFF2. */
50 const Color spnDefColorTable2
[] =
52 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
55 /** Default color table for BIFF3/BIFF4. */
56 const Color spnDefColorTable3
[] =
58 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
59 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
60 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
63 /** Default color table for BIFF5/BIFF7. */
64 const Color spnDefColorTable5
[] =
66 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
67 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
68 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
,
69 /* 24 */ Color(0x8080FF), Color(0x802060), Color(0xFFFFC0), Color(0xA0E0E0), Color(0x600080), Color(0xFF8080), Color(0x0080C0), Color(0xC0C0FF),
70 /* 32 */ Color(0x000080), Color(0xFF00FF), Color(0xFFFF00), Color(0x00FFFF), Color(0x800080), Color(0x800000), Color(0x008080), Color(0x0000FF),
71 /* 40 */ Color(0x00CFFF), Color(0x69FFFF), Color(0xE0FFE0), Color(0xFFFF80), Color(0xA6CAF0), Color(0xDD9CB3), Color(0xB38FEE), Color(0xE3E3E3),
72 /* 48 */ Color(0x2A6FF9), Color(0x3FB8CD), Color(0x488436), Color(0x958C41), Color(0x8E5E42), Color(0xA0627A), Color(0x624FAC), Color(0x969696),
73 /* 56 */ Color(0x1D2FBE), Color(0x286676), Color(0x004500), Color(0x453E01), Color(0x6A2813), Color(0x85396A), Color(0x4A3285), Color(0x424242)
76 /** Default color table for BIFF8. */
77 const Color spnDefColorTable8
[] =
79 /* 0 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
80 /* 8 */ EXC_PALETTE_EGA_COLORS_LIGHT
,
81 /* 16 */ EXC_PALETTE_EGA_COLORS_DARK
,
82 /* 24 */ Color(0x9999FF), Color(0x993366), Color(0xFFFFCC), Color(0xCCFFFF), Color(0x660066), Color(0xFF8080), Color(0x0066CC), Color(0xCCCCFF),
83 /* 32 */ Color(0x000080), Color(0xFF00FF), Color(0xFFFF00), Color(0x00FFFF), Color(0x800080), Color(0x800000), Color(0x008080), Color(0x0000FF),
84 /* 40 */ Color(0x00CCFF), Color(0xCCFFFF), Color(0xCCFFCC), Color(0xFFFF99), Color(0x99CCFF), Color(0xFF99CC), Color(0xCC99FF), Color(0xFFCC99),
85 /* 48 */ Color(0x3366FF), Color(0x33CCCC), Color(0x99CC00), Color(0xFFCC00), Color(0xFF9900), Color(0xFF6600), Color(0x666699), Color(0x969696),
86 /* 56 */ Color(0x003366), Color(0x339966), Color(0x003300), Color(0x333300), Color(0x993300), Color(0x993366), Color(0x333399), Color(0x333333)
89 #undef EXC_PALETTE_EGA_COLORS_LIGHT
90 #undef EXC_PALETTE_EGA_COLORS_DARK
92 XclDefaultPalette::XclDefaultPalette( const XclRoot
& rRoot
) :
93 mpnColorTable( nullptr ),
96 const StyleSettings
& rSett
= Application::GetSettings().GetStyleSettings();
97 mnWindowText
= rSett
.GetWindowTextColor();
98 mnWindowBack
= rSett
.GetWindowColor();
99 mnFaceColor
= rSett
.GetFaceColor();
100 // Don't use the system HelpBack and HelpText colours as it causes problems
101 // with modern gnome. This is because mnNoteText and mnNoteBack are used
102 // when colour indices ( instead of real colours ) are specified.
103 // Note: That this it is not an unusual scenario that we get the Note
104 // background specified as a real colour and the text specified as a
105 // colour index. That means the text colour would be picked from
106 // the system where the note background would be picked from a real colour.
107 // Previously the note text colour was picked from the system tooltip
108 // text colour, on modern gnome(e.g. 3) that tends to be 'white' with the
110 // Using the Libreoffice defaults ( instead of system specific colours
111 // ) lessens the chance of the one colour being an unsuitable combination
112 // because by default the note text is black and the note background is
113 // a light yellow colour ( very similar to Excel's normal defaults )
114 mnNoteText
= svtools::ColorConfig::GetDefaultColor( svtools::FONTCOLOR
);
115 mnNoteBack
= svtools::ColorConfig::GetDefaultColor( svtools::CALCNOTESBACKGROUND
);
118 switch( rRoot
.GetBiff() )
121 mpnColorTable
= spnDefColorTable2
;
122 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable2
);
126 mpnColorTable
= spnDefColorTable3
;
127 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable3
);
130 mpnColorTable
= spnDefColorTable5
;
131 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable5
);
134 mpnColorTable
= spnDefColorTable8
;
135 mnTableSize
= SAL_N_ELEMENTS( spnDefColorTable8
);
142 Color
XclDefaultPalette::GetDefColor( sal_uInt16 nXclIndex
) const
145 if( nXclIndex
< mnTableSize
)
146 nColor
= mpnColorTable
[ nXclIndex
];
147 else switch( nXclIndex
)
149 case EXC_COLOR_WINDOWTEXT3
:
150 case EXC_COLOR_WINDOWTEXT
:
151 case EXC_COLOR_CHWINDOWTEXT
: nColor
= mnWindowText
; break;
152 case EXC_COLOR_WINDOWBACK3
:
153 case EXC_COLOR_WINDOWBACK
:
154 case EXC_COLOR_CHWINDOWBACK
: nColor
= mnWindowBack
; break;
155 case EXC_COLOR_BUTTONBACK
: nColor
= mnFaceColor
; break;
156 case EXC_COLOR_CHBORDERAUTO
: nColor
= COL_BLACK
; break; // TODO: really always black?
157 case EXC_COLOR_NOTEBACK
: nColor
= mnNoteBack
; break;
158 case EXC_COLOR_NOTETEXT
: nColor
= mnNoteText
; break;
159 case EXC_COLOR_FONTAUTO
: nColor
= COL_AUTO
; break;
161 SAL_WARN("sc", "XclDefaultPalette::GetDefColor - unknown default color index: " << nXclIndex
);
167 // Font Data ==================================================================
169 namespace Awt
= ::com::sun::star::awt
;
170 namespace AwtFontFamily
= Awt::FontFamily
;
171 namespace AwtFontLineStyle
= Awt::FontUnderline
;
172 namespace AwtFontStrikeout
= Awt::FontStrikeout
;
174 XclFontData::XclFontData()
179 XclFontData::XclFontData( const vcl::Font
& rFont
)
182 FillFromVclFont( rFont
);
185 XclFontData::XclFontData( const SvxFont
& rFont
)
187 FillFromSvxFont( rFont
);
190 void XclFontData::Clear()
196 mnWeight
= EXC_FONTWGHT_DONTKNOW
;
197 mnEscapem
= EXC_FONTESC_NONE
;
198 mnFamily
= EXC_FONTFAM_SYSTEM
;
199 mnCharSet
= EXC_FONTCSET_ANSI_LATIN
;
200 mnUnderline
= EXC_FONTUNDERL_NONE
;
201 mbItalic
= mbStrikeout
= mbOutline
= mbShadow
= false;
204 void XclFontData::FillFromVclFont( const vcl::Font
& rFont
)
206 maName
= XclTools::GetXclFontName( rFont
.GetFamilyName() ); // substitute with MS fonts
208 maColor
= rFont
.GetColor();
209 SetScUnderline( rFont
.GetUnderline() );
210 mnEscapem
= EXC_FONTESC_NONE
;
211 SetScHeight( rFont
.GetFontSize().Height() );
212 SetScWeight( rFont
.GetWeight() );
213 SetScFamily( rFont
.GetFamilyType() );
214 SetFontEncoding( rFont
.GetCharSet() );
215 SetScPosture( rFont
.GetItalic() );
216 SetScStrikeout( rFont
.GetStrikeout() );
217 mbOutline
= rFont
.IsOutline();
218 mbShadow
= rFont
.IsShadow();
221 void XclFontData::FillFromSvxFont( const SvxFont
& rFont
)
223 FillFromVclFont( rFont
);
224 SetScEscapement( rFont
.GetEscapement() );
227 // *** conversion of VCL/SVX constants *** ------------------------------------
229 FontFamily
XclFontData::GetScFamily( rtl_TextEncoding eDefTextEnc
) const
231 FontFamily eScFamily
;
232 // ! format differs from Windows documentation: family is in lower nibble, pitch unknown
233 switch( mnFamily
& 0x0F )
235 case EXC_FONTFAM_ROMAN
: eScFamily
= FAMILY_ROMAN
; break;
236 case EXC_FONTFAM_SWISS
: eScFamily
= FAMILY_SWISS
; break;
237 case EXC_FONTFAM_MODERN
: eScFamily
= FAMILY_MODERN
; break;
238 case EXC_FONTFAM_SCRIPT
: eScFamily
= FAMILY_SCRIPT
; break;
239 case EXC_FONTFAM_DECORATIVE
: eScFamily
= FAMILY_DECORATIVE
; break;
242 ((eDefTextEnc
== RTL_TEXTENCODING_APPLE_ROMAN
) &&
243 (maName
.equalsIgnoreAsciiCase( "Geneva" ) || maName
.equalsIgnoreAsciiCase( "Chicago" ))) ?
244 FAMILY_SWISS
: FAMILY_DONTKNOW
;
249 rtl_TextEncoding
XclFontData::GetFontEncoding() const
251 // convert Windows character set to text encoding identifier
252 return rtl_getTextEncodingFromWindowsCharset( mnCharSet
);
255 FontItalic
XclFontData::GetScPosture() const
257 return mbItalic
? ITALIC_NORMAL
: ITALIC_NONE
;
260 FontWeight
XclFontData::GetScWeight() const
262 FontWeight eScWeight
;
264 if( !mnWeight
) eScWeight
= WEIGHT_DONTKNOW
;
265 else if( mnWeight
< 150 ) eScWeight
= WEIGHT_THIN
;
266 else if( mnWeight
< 250 ) eScWeight
= WEIGHT_ULTRALIGHT
;
267 else if( mnWeight
< 325 ) eScWeight
= WEIGHT_LIGHT
;
268 else if( mnWeight
< 375 ) eScWeight
= WEIGHT_SEMILIGHT
;
269 else if( mnWeight
< 450 ) eScWeight
= WEIGHT_NORMAL
;
270 else if( mnWeight
< 550 ) eScWeight
= WEIGHT_MEDIUM
;
271 else if( mnWeight
< 650 ) eScWeight
= WEIGHT_SEMIBOLD
;
272 else if( mnWeight
< 750 ) eScWeight
= WEIGHT_BOLD
;
273 else if( mnWeight
< 850 ) eScWeight
= WEIGHT_ULTRABOLD
;
274 else eScWeight
= WEIGHT_BLACK
;
279 FontLineStyle
XclFontData::GetScUnderline() const
281 FontLineStyle eScUnderl
= LINESTYLE_NONE
;
282 switch( mnUnderline
)
284 case EXC_FONTUNDERL_SINGLE
:
285 case EXC_FONTUNDERL_SINGLE_ACC
: eScUnderl
= LINESTYLE_SINGLE
; break;
286 case EXC_FONTUNDERL_DOUBLE
:
287 case EXC_FONTUNDERL_DOUBLE_ACC
: eScUnderl
= LINESTYLE_DOUBLE
; break;
292 SvxEscapement
XclFontData::GetScEscapement() const
294 SvxEscapement eScEscapem
= SvxEscapement::Off
;
297 case EXC_FONTESC_SUPER
: eScEscapem
= SvxEscapement::Superscript
; break;
298 case EXC_FONTESC_SUB
: eScEscapem
= SvxEscapement::Subscript
; break;
303 FontStrikeout
XclFontData::GetScStrikeout() const
305 return mbStrikeout
? STRIKEOUT_SINGLE
: STRIKEOUT_NONE
;
308 void XclFontData::SetScHeight( sal_Int32 nTwips
)
310 mnHeight
= static_cast< sal_uInt16
>( ::std::min( nTwips
, static_cast<sal_Int32
>(0x7FFFL
) ) );
313 void XclFontData::SetScFamily( FontFamily eScFamily
)
317 case FAMILY_DONTKNOW
: mnFamily
= EXC_FONTFAM_DONTKNOW
; break;
318 case FAMILY_DECORATIVE
: mnFamily
= EXC_FONTFAM_DECORATIVE
; break;
319 case FAMILY_MODERN
: mnFamily
= EXC_FONTFAM_MODERN
; break;
320 case FAMILY_ROMAN
: mnFamily
= EXC_FONTFAM_ROMAN
; break;
321 case FAMILY_SCRIPT
: mnFamily
= EXC_FONTFAM_SCRIPT
; break;
322 case FAMILY_SWISS
: mnFamily
= EXC_FONTFAM_SWISS
; break;
323 case FAMILY_SYSTEM
: mnFamily
= EXC_FONTFAM_SYSTEM
; break;
325 OSL_FAIL( "XclFontData::SetScFamily - unknown font family" );
326 mnFamily
= EXC_FONTFAM_DONTKNOW
;
330 void XclFontData::SetFontEncoding( rtl_TextEncoding eFontEnc
)
332 // convert text encoding identifier to Windows character set
333 mnCharSet
= rtl_getBestWindowsCharsetFromTextEncoding( eFontEnc
);
336 void XclFontData::SetScPosture( FontItalic eScPosture
)
338 mbItalic
= (eScPosture
== ITALIC_OBLIQUE
) || (eScPosture
== ITALIC_NORMAL
);
341 void XclFontData::SetScWeight( FontWeight eScWeight
)
345 case WEIGHT_DONTKNOW
: mnWeight
= EXC_FONTWGHT_DONTKNOW
; break;
346 case WEIGHT_THIN
: mnWeight
= EXC_FONTWGHT_THIN
; break;
347 case WEIGHT_ULTRALIGHT
: mnWeight
= EXC_FONTWGHT_ULTRALIGHT
; break;
348 case WEIGHT_LIGHT
: mnWeight
= EXC_FONTWGHT_LIGHT
; break;
349 case WEIGHT_SEMILIGHT
: mnWeight
= EXC_FONTWGHT_SEMILIGHT
; break;
350 case WEIGHT_NORMAL
: mnWeight
= EXC_FONTWGHT_NORMAL
; break;
351 case WEIGHT_MEDIUM
: mnWeight
= EXC_FONTWGHT_MEDIUM
; break;
352 case WEIGHT_SEMIBOLD
: mnWeight
= EXC_FONTWGHT_SEMIBOLD
; break;
353 case WEIGHT_BOLD
: mnWeight
= EXC_FONTWGHT_BOLD
; break;
354 case WEIGHT_ULTRABOLD
: mnWeight
= EXC_FONTWGHT_ULTRABOLD
; break;
355 case WEIGHT_BLACK
: mnWeight
= EXC_FONTWGHT_BLACK
; break;
356 default: mnWeight
= EXC_FONTWGHT_NORMAL
;
360 void XclFontData::SetScUnderline( FontLineStyle eScUnderl
)
365 case LINESTYLE_DONTKNOW
: mnUnderline
= EXC_FONTUNDERL_NONE
; break;
366 case LINESTYLE_DOUBLE
:
367 case LINESTYLE_DOUBLEWAVE
: mnUnderline
= EXC_FONTUNDERL_DOUBLE
; break;
368 default: mnUnderline
= EXC_FONTUNDERL_SINGLE
;
372 void XclFontData::SetScEscapement( short nScEscapem
)
375 mnEscapem
= EXC_FONTESC_SUPER
;
376 else if( nScEscapem
< 0 )
377 mnEscapem
= EXC_FONTESC_SUB
;
379 mnEscapem
= EXC_FONTESC_NONE
;
382 void XclFontData::SetScStrikeout( FontStrikeout eScStrikeout
)
385 (eScStrikeout
== STRIKEOUT_SINGLE
) || (eScStrikeout
== STRIKEOUT_DOUBLE
) ||
386 (eScStrikeout
== STRIKEOUT_BOLD
) || (eScStrikeout
== STRIKEOUT_SLASH
) ||
387 (eScStrikeout
== STRIKEOUT_X
);
390 // *** conversion of API constants *** ----------------------------------------
392 float XclFontData::GetApiHeight() const
394 return o3tl::convert
<double>(mnHeight
, o3tl::Length::twip
, o3tl::Length::pt
);
397 sal_Int16
XclFontData::GetApiFamily() const
399 sal_Int16 nApiFamily
= AwtFontFamily::DONTKNOW
;
402 case FAMILY_DECORATIVE
: nApiFamily
= AwtFontFamily::DECORATIVE
; break;
403 case FAMILY_MODERN
: nApiFamily
= AwtFontFamily::MODERN
; break;
404 case FAMILY_ROMAN
: nApiFamily
= AwtFontFamily::ROMAN
; break;
405 case FAMILY_SCRIPT
: nApiFamily
= AwtFontFamily::SCRIPT
; break;
406 case FAMILY_SWISS
: nApiFamily
= AwtFontFamily::SWISS
; break;
407 case FAMILY_SYSTEM
: nApiFamily
= AwtFontFamily::SYSTEM
; break;
412 sal_Int16
XclFontData::GetApiFontEncoding() const
414 // API constants are equal to rtl_TextEncoding constants
415 return static_cast< sal_Int16
>( GetFontEncoding() );
418 Awt::FontSlant
XclFontData::GetApiPosture() const
420 return mbItalic
? Awt::FontSlant_ITALIC
: Awt::FontSlant_NONE
;
423 float XclFontData::GetApiWeight() const
425 return vcl::unohelper::ConvertFontWeight( GetScWeight() );
428 sal_Int16
XclFontData::GetApiUnderline() const
430 sal_Int16 nApiUnderl
= AwtFontLineStyle::NONE
;
431 switch( mnUnderline
)
433 case EXC_FONTUNDERL_SINGLE
:
434 case EXC_FONTUNDERL_SINGLE_ACC
: nApiUnderl
= AwtFontLineStyle::SINGLE
; break;
435 case EXC_FONTUNDERL_DOUBLE
:
436 case EXC_FONTUNDERL_DOUBLE_ACC
: nApiUnderl
= AwtFontLineStyle::DOUBLE
; break;
441 sal_Int16
XclFontData::GetApiEscapement() const
443 sal_Int16 nApiEscapem
= 0;
446 case EXC_FONTESC_SUPER
: nApiEscapem
= 33; break;
447 case EXC_FONTESC_SUB
: nApiEscapem
= -33; break;
452 sal_Int16
XclFontData::GetApiStrikeout() const
454 return mbStrikeout
? AwtFontStrikeout::SINGLE
: AwtFontStrikeout::NONE
;
457 void XclFontData::SetApiHeight( float fPoint
)
459 mnHeight
= std::min(o3tl::convert(fPoint
, o3tl::Length::pt
, o3tl::Length::twip
) + 0.5, 32767.0);
462 void XclFontData::SetApiFamily( sal_Int16 nApiFamily
)
466 case AwtFontFamily::DECORATIVE
: mnFamily
= FAMILY_DECORATIVE
; break;
467 case AwtFontFamily::MODERN
: mnFamily
= FAMILY_MODERN
; break;
468 case AwtFontFamily::ROMAN
: mnFamily
= FAMILY_ROMAN
; break;
469 case AwtFontFamily::SCRIPT
: mnFamily
= FAMILY_SCRIPT
; break;
470 case AwtFontFamily::SWISS
: mnFamily
= FAMILY_SWISS
; break;
471 case AwtFontFamily::SYSTEM
: mnFamily
= FAMILY_SYSTEM
; break;
472 default: mnFamily
= FAMILY_DONTKNOW
;
476 void XclFontData::SetApiPosture( Awt::FontSlant eApiPosture
)
479 (eApiPosture
== Awt::FontSlant_OBLIQUE
) ||
480 (eApiPosture
== Awt::FontSlant_ITALIC
) ||
481 (eApiPosture
== Awt::FontSlant_REVERSE_OBLIQUE
) ||
482 (eApiPosture
== Awt::FontSlant_REVERSE_ITALIC
);
485 void XclFontData::SetApiWeight( float fApiWeight
)
487 SetScWeight( vcl::unohelper::ConvertFontWeight( fApiWeight
) );
490 void XclFontData::SetApiUnderline( sal_Int16 nApiUnderl
)
494 case AwtFontLineStyle::NONE
:
495 case AwtFontLineStyle::DONTKNOW
: mnUnderline
= EXC_FONTUNDERL_NONE
; break;
496 case AwtFontLineStyle::DOUBLE
:
497 case AwtFontLineStyle::DOUBLEWAVE
: mnUnderline
= EXC_FONTUNDERL_DOUBLE
; break;
498 default: mnUnderline
= EXC_FONTUNDERL_SINGLE
;
502 void XclFontData::SetApiEscapement( sal_Int16 nApiEscapem
)
504 if( nApiEscapem
> 0 )
505 mnEscapem
= EXC_FONTESC_SUPER
;
506 else if( nApiEscapem
< 0 )
507 mnEscapem
= EXC_FONTESC_SUB
;
509 mnEscapem
= EXC_FONTESC_NONE
;
512 void XclFontData::SetApiStrikeout( sal_Int16 nApiStrikeout
)
515 (nApiStrikeout
!= AwtFontStrikeout::NONE
) &&
516 (nApiStrikeout
!= AwtFontStrikeout::DONTKNOW
);
519 bool operator==( const XclFontData
& rLeft
, const XclFontData
& rRight
)
522 (rLeft
.mnHeight
== rRight
.mnHeight
) &&
523 (rLeft
.mnWeight
== rRight
.mnWeight
) &&
524 (rLeft
.mnUnderline
== rRight
.mnUnderline
) &&
525 (rLeft
.maColor
== rRight
.maColor
) &&
526 (rLeft
.mnEscapem
== rRight
.mnEscapem
) &&
527 (rLeft
.mnFamily
== rRight
.mnFamily
) &&
528 (rLeft
.mnCharSet
== rRight
.mnCharSet
) &&
529 (rLeft
.mbItalic
== rRight
.mbItalic
) &&
530 (rLeft
.mbStrikeout
== rRight
.mbStrikeout
) &&
531 (rLeft
.mbOutline
== rRight
.mbOutline
) &&
532 (rLeft
.mbShadow
== rRight
.mbShadow
) &&
533 (rLeft
.maName
== rRight
.maName
);
538 /** Property names for common font settings. */
539 const char *const sppcPropNamesChCommon
[] =
541 "CharUnderline", "CharStrikeout", "CharColor", "CharContoured", "CharShadowed", nullptr
543 /** Property names for Western font settings. */
544 const char *const sppcPropNamesChWstrn
[] =
546 "CharFontName", "CharHeight", "CharPosture", "CharWeight", nullptr
548 /** Property names for Asian font settings. */
549 const char *const sppcPropNamesChAsian
[] =
551 "CharFontNameAsian", "CharHeightAsian", "CharPostureAsian", "CharWeightAsian", nullptr
553 /** Property names for Complex font settings. */
554 const char *const sppcPropNamesChCmplx
[] =
556 "CharFontNameComplex", "CharHeightComplex", "CharPostureComplex", "CharWeightComplex", nullptr
558 /** Property names for escapement. */
559 const char *const sppcPropNamesChEscapement
[] =
561 "CharEscapement", "CharEscapementHeight", nullptr
563 const sal_Int8 EXC_API_ESC_HEIGHT
= 58; /// Default escapement font height.
565 /** Property names for Western font settings without font name. */
566 const char *const *const sppcPropNamesChWstrnNoName
= sppcPropNamesChWstrn
+ 1;
567 /** Property names for Asian font settings without font name. */
568 const char *const *const sppcPropNamesChAsianNoName
= sppcPropNamesChAsian
+ 1;
569 /** Property names for Complex font settings without font name. */
570 const char *const *const sppcPropNamesChCmplxNoName
= sppcPropNamesChCmplx
+ 1;
572 /** Property names for font settings in form controls. */
573 const char *const sppcPropNamesControl
[] =
575 "FontName", "FontFamily", "FontCharset", "FontHeight", "FontSlant",
576 "FontWeight", "FontLineStyle", "FontStrikeout", "TextColor", nullptr
579 /** Inserts all passed API font settings into the font data object. */
580 void lclSetApiFontSettings( XclFontData
& rFontData
,
581 const OUString
& rApiFontName
, float fApiHeight
, float fApiWeight
,
582 Awt::FontSlant eApiPosture
, sal_Int16 nApiUnderl
, sal_Int16 nApiStrikeout
)
584 rFontData
.maName
= XclTools::GetXclFontName( rApiFontName
);
585 rFontData
.SetApiHeight( fApiHeight
);
586 rFontData
.SetApiWeight( fApiWeight
);
587 rFontData
.SetApiPosture( eApiPosture
);
588 rFontData
.SetApiUnderline( nApiUnderl
);
589 rFontData
.SetApiStrikeout( nApiStrikeout
);
592 /** Writes script dependent properties to a font property set helper. */
593 void lclWriteChartFont( ScfPropertySet
& rPropSet
,
594 ScfPropSetHelper
& rHlpName
, ScfPropSetHelper
& rHlpNoName
,
595 const XclFontData
& rFontData
, bool bHasFontName
)
597 // select the font helper
598 ScfPropSetHelper
& rPropSetHlp
= bHasFontName
? rHlpName
: rHlpNoName
;
599 // initialize the font helper (must be called before writing any properties)
600 rPropSetHlp
.InitializeWrite();
603 rPropSetHlp
<< rFontData
.maName
;
604 // write remaining properties
605 rPropSetHlp
<< rFontData
.GetApiHeight() << rFontData
.GetApiPosture() << rFontData
.GetApiWeight();
606 // write properties to property set
607 rPropSetHlp
.WriteToPropertySet( rPropSet
);
612 XclFontPropSetHelper::XclFontPropSetHelper() :
613 maHlpChCommon( sppcPropNamesChCommon
),
614 maHlpChWstrn( sppcPropNamesChWstrn
),
615 maHlpChAsian( sppcPropNamesChAsian
),
616 maHlpChCmplx( sppcPropNamesChCmplx
),
617 maHlpChWstrnNoName( sppcPropNamesChWstrnNoName
),
618 maHlpChAsianNoName( sppcPropNamesChAsianNoName
),
619 maHlpChCmplxNoName( sppcPropNamesChCmplxNoName
),
620 maHlpChEscapement( sppcPropNamesChEscapement
),
621 maHlpControl( sppcPropNamesControl
)
625 void XclFontPropSetHelper::ReadFontProperties( XclFontData
& rFontData
,
626 const ScfPropertySet
& rPropSet
, XclFontPropSetType eType
, sal_Int16 nScript
)
630 case EXC_FONTPROPSET_CHART
:
632 OUString aApiFontName
;
633 float fApiHeight
, fApiWeight
;
634 sal_Int16 nApiUnderl
= 0, nApiStrikeout
= 0;
635 Awt::FontSlant eApiPosture
;
637 // read script type dependent properties
638 ScfPropSetHelper
& rPropSetHlp
= GetChartHelper( nScript
);
639 rPropSetHlp
.ReadFromPropertySet( rPropSet
);
640 rPropSetHlp
>> aApiFontName
>> fApiHeight
>> eApiPosture
>> fApiWeight
;
641 // read common properties
642 maHlpChCommon
.ReadFromPropertySet( rPropSet
);
643 maHlpChCommon
>> nApiUnderl
646 >> rFontData
.mbOutline
647 >> rFontData
.mbShadow
;
649 // convert API property values to Excel settings
650 lclSetApiFontSettings( rFontData
, aApiFontName
,
651 fApiHeight
, fApiWeight
, eApiPosture
, nApiUnderl
, nApiStrikeout
);
654 sal_Int16 nApiEscapement
= 0;
655 sal_Int8 nApiEscHeight
= 0;
656 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
657 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
658 maHlpChEscapement
.ReadFromPropertySet( rPropSet
);
659 maHlpChEscapement
>> nApiEscapement
>> nApiEscHeight
;
660 rFontData
.SetApiEscapement( nApiEscapement
);
664 case EXC_FONTPROPSET_CONTROL
:
666 OUString aApiFontName
;
667 float fApiHeight(0.0), fApiWeight(0.0);
668 sal_Int16
nApiFamily(0), nApiCharSet(0), nApiPosture(0), nApiUnderl(0), nApiStrikeout(0);
670 // read font properties
671 maHlpControl
.ReadFromPropertySet( rPropSet
);
672 maHlpControl
>> aApiFontName
680 >> rFontData
.maColor
;
682 // convert API property values to Excel settings
683 Awt::FontSlant eApiPosture
= static_cast< Awt::FontSlant
>( nApiPosture
);
684 lclSetApiFontSettings( rFontData
, aApiFontName
,
685 fApiHeight
, fApiWeight
, eApiPosture
, nApiUnderl
, nApiStrikeout
);
686 rFontData
.SetApiFamily( nApiFamily
);
687 rFontData
.SetFontEncoding( nApiCharSet
);
693 void XclFontPropSetHelper::WriteFontProperties(
694 ScfPropertySet
& rPropSet
, XclFontPropSetType eType
,
695 const XclFontData
& rFontData
, bool bHasWstrn
, bool bHasAsian
, bool bHasCmplx
,
696 const Color
* pFontColor
)
700 case EXC_FONTPROPSET_CHART
:
702 // write common properties
703 maHlpChCommon
.InitializeWrite();
704 const Color
& rColor
= pFontColor
? *pFontColor
: rFontData
.maColor
;
705 maHlpChCommon
<< rFontData
.GetApiUnderline()
706 << rFontData
.GetApiStrikeout()
708 << rFontData
.mbOutline
709 << rFontData
.mbShadow
;
710 maHlpChCommon
.WriteToPropertySet( rPropSet
);
712 // write script type dependent properties
713 lclWriteChartFont( rPropSet
, maHlpChWstrn
, maHlpChWstrnNoName
, rFontData
, bHasWstrn
);
714 lclWriteChartFont( rPropSet
, maHlpChAsian
, maHlpChAsianNoName
, rFontData
, bHasAsian
);
715 lclWriteChartFont( rPropSet
, maHlpChCmplx
, maHlpChCmplxNoName
, rFontData
, bHasCmplx
);
718 if( rFontData
.GetScEscapement() != SvxEscapement::Off
)
720 maHlpChEscapement
.InitializeWrite();
721 maHlpChEscapement
<< rFontData
.GetApiEscapement() << EXC_API_ESC_HEIGHT
;
722 maHlpChEscapement
.WriteToPropertySet( rPropSet
);
727 case EXC_FONTPROPSET_CONTROL
:
729 maHlpControl
.InitializeWrite();
730 maHlpControl
<< rFontData
.maName
731 << rFontData
.GetApiFamily()
732 << rFontData
.GetApiFontEncoding()
733 << static_cast< sal_Int16
>( rFontData
.GetApiHeight() + 0.5 )
734 << rFontData
.GetApiPosture()
735 << rFontData
.GetApiWeight()
736 << rFontData
.GetApiUnderline()
737 << rFontData
.GetApiStrikeout()
738 << rFontData
.maColor
;
739 maHlpControl
.WriteToPropertySet( rPropSet
);
745 ScfPropSetHelper
& XclFontPropSetHelper::GetChartHelper( sal_Int16 nScript
)
747 namespace ApiScriptType
= ::com::sun::star::i18n::ScriptType
;
750 case ApiScriptType::LATIN
: return maHlpChWstrn
;
751 case ApiScriptType::ASIAN
: return maHlpChAsian
;
752 case ApiScriptType::COMPLEX
: return maHlpChCmplx
;
753 default: OSL_FAIL( "XclFontPropSetHelper::GetChartHelper - unknown script type" );
758 // Number formats =============================================================
762 /** Special number format index describing a reused format. */
763 const NfIndexTableOffset PRV_NF_INDEX_REUSE
= NF_INDEX_TABLE_ENTRIES
;
765 /** German primary language not defined, LANGUAGE_GERMAN belongs to Germany. */
766 constexpr LanguageType PRV_LANGUAGE_GERMAN_PRIM
= primary(LANGUAGE_GERMAN
);
767 /** French primary language not defined, LANGUAGE_FRENCH belongs to France. */
768 constexpr LanguageType PRV_LANGUAGE_FRENCH_PRIM
= primary(LANGUAGE_FRENCH
);
769 /** Parent language identifier for Asian languages. */
770 constexpr LanguageType PRV_LANGUAGE_ASIAN_PRIM
= primary(LANGUAGE_CHINESE
);
772 /** Stores the number format used in Calc for an Excel built-in number format. */
773 struct XclBuiltInFormat
775 sal_uInt16 mnXclNumFmt
; /// Excel built-in index.
776 const char* mpFormat
; /// Format string, may be 0 (meOffset used then).
777 NfIndexTableOffset meOffset
; /// SvNumberFormatter format index, if mpFormat==0.
778 sal_uInt16 mnXclReuseFmt
; /// Use this Excel format, if meOffset==PRV_NF_INDEX_REUSE.
781 /** Defines a literal Excel built-in number format. */
782 #define EXC_NUMFMT_STRING( nXclNumFmt, pcUtf8 ) \
783 { nXclNumFmt, pcUtf8, NF_NUMBER_STANDARD, 0 }
785 /** Defines an Excel built-in number format that maps to an own built-in format. */
786 #define EXC_NUMFMT_OFFSET( nXclNumFmt, eOffset ) \
787 { nXclNumFmt, nullptr, eOffset, 0 }
789 /** Defines an Excel built-in number format that is the same as the specified. */
790 #define EXC_NUMFMT_REUSE( nXclNumFmt, nXclReuse ) \
791 { nXclNumFmt, nullptr, PRV_NF_INDEX_REUSE, nXclReuse }
793 /** Terminates an Excel built-in number format table. */
794 #define EXC_NUMFMT_ENDTABLE() \
795 { EXC_FORMAT_NOTFOUND, nullptr, NF_NUMBER_STANDARD, 0 }
797 // Currency unit characters
798 #define UTF8_BAHT "\340\270\277"
799 #define UTF8_EURO "\342\202\254"
800 #define UTF8_POUND_UK "\302\243"
801 #define UTF8_SHEQEL "\342\202\252"
802 #define UTF8_WON "\357\277\246"
803 #define UTF8_YEN_CS "\357\277\245"
804 #define UTF8_YEN_JP "\302\245"
806 // Japanese/Chinese date/time characters
807 #define UTF8_CJ_YEAR "\345\271\264"
808 #define UTF8_CJ_MON "\346\234\210"
809 #define UTF8_CJ_DAY "\346\227\245"
810 #define UTF8_CJ_HOUR "\346\231\202"
811 #define UTF8_CJ_MIN "\345\210\206"
812 #define UTF8_CJ_SEC "\347\247\222"
814 // Chinese Simplified date/time characters
815 #define UTF8_CS_HOUR "\346\227\266"
817 // Korean date/time characters
818 #define UTF8_KO_YEAR "\353\205\204"
819 #define UTF8_KO_MON "\354\233\224"
820 #define UTF8_KO_DAY "\354\235\274"
821 #define UTF8_KO_HOUR "\354\213\234"
822 #define UTF8_KO_MIN "\353\266\204"
823 #define UTF8_KO_SEC "\354\264\210"
825 /** Default number format table. Last parent of all other tables, used for unknown languages. */
826 const XclBuiltInFormat spBuiltInFormats_DONTKNOW
[] =
828 EXC_NUMFMT_OFFSET( 0, NF_NUMBER_STANDARD
), // General
829 EXC_NUMFMT_OFFSET( 1, NF_NUMBER_INT
), // 0
830 EXC_NUMFMT_OFFSET( 2, NF_NUMBER_DEC2
), // 0.00
831 EXC_NUMFMT_OFFSET( 3, NF_NUMBER_1000INT
), // #,##0
832 EXC_NUMFMT_OFFSET( 4, NF_NUMBER_1000DEC2
), // #,##0.00
833 // 5...8 contained in file
834 EXC_NUMFMT_OFFSET( 9, NF_PERCENT_INT
), // 0%
835 EXC_NUMFMT_OFFSET( 10, NF_PERCENT_DEC2
), // 0.00%
836 EXC_NUMFMT_OFFSET( 11, NF_SCIENTIFIC_000E00
), // 0.00E+00
837 EXC_NUMFMT_OFFSET( 12, NF_FRACTION_1D
), // # ?/?
838 EXC_NUMFMT_OFFSET( 13, NF_FRACTION_2D
), // # ??/??
840 // 14...22 date and time formats
841 EXC_NUMFMT_OFFSET( 14, NF_DATE_SYS_DDMMYYYY
),
842 EXC_NUMFMT_OFFSET( 15, NF_DATE_SYS_DMMMYY
),
843 EXC_NUMFMT_OFFSET( 16, NF_DATE_SYS_DDMMM
),
844 EXC_NUMFMT_OFFSET( 17, NF_DATE_SYS_MMYY
),
845 EXC_NUMFMT_OFFSET( 18, NF_TIME_HHMMAMPM
),
846 EXC_NUMFMT_OFFSET( 19, NF_TIME_HHMMSSAMPM
),
847 EXC_NUMFMT_OFFSET( 20, NF_TIME_HHMM
),
848 EXC_NUMFMT_OFFSET( 21, NF_TIME_HHMMSS
),
849 EXC_NUMFMT_OFFSET( 22, NF_DATETIME_SYSTEM_SHORT_HHMM
),
851 // 23...36 international formats
852 EXC_NUMFMT_REUSE( 23, 0 ),
853 EXC_NUMFMT_REUSE( 24, 0 ),
854 EXC_NUMFMT_REUSE( 25, 0 ),
855 EXC_NUMFMT_REUSE( 26, 0 ),
856 EXC_NUMFMT_REUSE( 27, 14 ),
857 EXC_NUMFMT_REUSE( 28, 14 ),
858 EXC_NUMFMT_REUSE( 29, 14 ),
859 EXC_NUMFMT_REUSE( 30, 14 ),
860 EXC_NUMFMT_REUSE( 31, 14 ),
861 EXC_NUMFMT_REUSE( 32, 21 ),
862 EXC_NUMFMT_REUSE( 33, 21 ),
863 EXC_NUMFMT_REUSE( 34, 21 ),
864 EXC_NUMFMT_REUSE( 35, 21 ),
865 EXC_NUMFMT_REUSE( 36, 14 ),
867 // 37...44 accounting formats
868 // 41...44 contained in file
869 EXC_NUMFMT_STRING( 37, "#,##0;-#,##0" ),
870 EXC_NUMFMT_STRING( 38, "#,##0;[RED]-#,##0" ),
871 EXC_NUMFMT_STRING( 39, "#,##0.00;-#,##0.00" ),
872 EXC_NUMFMT_STRING( 40, "#,##0.00;[RED]-#,##0.00" ),
874 // 45...49 more special formats
875 EXC_NUMFMT_STRING( 45, "mm:ss" ),
876 EXC_NUMFMT_STRING( 46, "[h]:mm:ss" ),
877 EXC_NUMFMT_STRING( 47, "mm:ss.0" ),
878 EXC_NUMFMT_STRING( 48, "##0.0E+0" ),
879 EXC_NUMFMT_OFFSET( 49, NF_TEXT
),
881 // 50...81 international formats
882 EXC_NUMFMT_REUSE( 50, 14 ),
883 EXC_NUMFMT_REUSE( 51, 14 ),
884 EXC_NUMFMT_REUSE( 52, 14 ),
885 EXC_NUMFMT_REUSE( 53, 14 ),
886 EXC_NUMFMT_REUSE( 54, 14 ),
887 EXC_NUMFMT_REUSE( 55, 14 ),
888 EXC_NUMFMT_REUSE( 56, 14 ),
889 EXC_NUMFMT_REUSE( 57, 14 ),
890 EXC_NUMFMT_REUSE( 58, 14 ),
891 EXC_NUMFMT_REUSE( 59, 1 ),
892 EXC_NUMFMT_REUSE( 60, 2 ),
893 EXC_NUMFMT_REUSE( 61, 3 ),
894 EXC_NUMFMT_REUSE( 62, 4 ),
895 EXC_NUMFMT_REUSE( 67, 9 ),
896 EXC_NUMFMT_REUSE( 68, 10 ),
897 EXC_NUMFMT_REUSE( 69, 12 ),
898 EXC_NUMFMT_REUSE( 70, 13 ),
899 EXC_NUMFMT_REUSE( 71, 14 ),
900 EXC_NUMFMT_REUSE( 72, 14 ),
901 EXC_NUMFMT_REUSE( 73, 15 ),
902 EXC_NUMFMT_REUSE( 74, 16 ),
903 EXC_NUMFMT_REUSE( 75, 17 ),
904 EXC_NUMFMT_REUSE( 76, 20 ),
905 EXC_NUMFMT_REUSE( 77, 21 ),
906 EXC_NUMFMT_REUSE( 78, 22 ),
907 EXC_NUMFMT_REUSE( 79, 45 ),
908 EXC_NUMFMT_REUSE( 80, 46 ),
909 EXC_NUMFMT_REUSE( 81, 47 ),
911 // 82...163 not used, must not occur in a file (Excel may crash)
913 EXC_NUMFMT_ENDTABLE()
916 // ENGLISH --------------------------------------------------------------------
918 /** Base table for English locales. */
919 const XclBuiltInFormat spBuiltInFormats_ENGLISH
[] =
921 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
922 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
923 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
924 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
925 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
926 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY hh:mm" ),
927 EXC_NUMFMT_ENDTABLE()
930 const XclBuiltInFormat spBuiltInFormats_ENGLISH_UK
[] =
932 EXC_NUMFMT_STRING( 63, UTF8_POUND_UK
"#,##0;-" UTF8_POUND_UK
"#,##0" ),
933 EXC_NUMFMT_STRING( 64, UTF8_POUND_UK
"#,##0;[RED]-" UTF8_POUND_UK
"#,##0" ),
934 EXC_NUMFMT_STRING( 65, UTF8_POUND_UK
"#,##0.00;-" UTF8_POUND_UK
"#,##0.00" ),
935 EXC_NUMFMT_STRING( 66, UTF8_POUND_UK
"#,##0.00;[RED]-" UTF8_POUND_UK
"#,##0.00" ),
936 EXC_NUMFMT_ENDTABLE()
939 const XclBuiltInFormat spBuiltInFormats_ENGLISH_EIRE
[] =
941 EXC_NUMFMT_STRING( 63, UTF8_EURO
"#,##0;-" UTF8_EURO
"#,##0" ),
942 EXC_NUMFMT_STRING( 64, UTF8_EURO
"#,##0;[RED]-" UTF8_EURO
"#,##0" ),
943 EXC_NUMFMT_STRING( 65, UTF8_EURO
"#,##0.00;-" UTF8_EURO
"#,##0.00" ),
944 EXC_NUMFMT_STRING( 66, UTF8_EURO
"#,##0.00;[RED]-" UTF8_EURO
"#,##0.00" ),
945 EXC_NUMFMT_ENDTABLE()
948 const XclBuiltInFormat spBuiltInFormats_ENGLISH_US
[] =
950 EXC_NUMFMT_STRING( 14, "M/D/YYYY" ),
951 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
952 EXC_NUMFMT_STRING( 16, "D-MMM" ),
953 EXC_NUMFMT_STRING( 20, "h:mm" ),
954 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
955 EXC_NUMFMT_STRING( 22, "M/D/YYYY h:mm" ),
956 EXC_NUMFMT_STRING( 37, "#,##0_);(#,##0)" ),
957 EXC_NUMFMT_STRING( 38, "#,##0_);[RED](#,##0)" ),
958 EXC_NUMFMT_STRING( 39, "#,##0.00_);(#,##0.00)" ),
959 EXC_NUMFMT_STRING( 40, "#,##0.00_);[RED](#,##0.00)" ),
960 EXC_NUMFMT_STRING( 63, "$#,##0_);($#,##0)" ),
961 EXC_NUMFMT_STRING( 64, "$#,##0_);[RED]($#,##0)" ),
962 EXC_NUMFMT_STRING( 65, "$#,##0.00_);($#,##0.00)" ),
963 EXC_NUMFMT_STRING( 66, "$#,##0.00_);[RED]($#,##0.00)" ),
964 EXC_NUMFMT_ENDTABLE()
967 const XclBuiltInFormat spBuiltInFormats_ENGLISH_CAN
[] =
969 EXC_NUMFMT_STRING( 20, "h:mm" ),
970 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
971 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY h:mm" ),
972 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
973 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
974 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
975 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
976 EXC_NUMFMT_ENDTABLE()
979 const XclBuiltInFormat spBuiltInFormats_ENGLISH_AUS
[] =
981 EXC_NUMFMT_STRING( 14, "D/MM/YYYY" ),
982 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
983 EXC_NUMFMT_STRING( 16, "D-MMM" ),
984 EXC_NUMFMT_STRING( 20, "h:mm" ),
985 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
986 EXC_NUMFMT_STRING( 22, "D/MM/YYYY h:mm" ),
987 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
988 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
989 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
990 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
991 EXC_NUMFMT_ENDTABLE()
994 const XclBuiltInFormat spBuiltInFormats_ENGLISH_SAFRICA
[] =
996 EXC_NUMFMT_STRING( 14, "YYYY/MM/DD" ),
997 EXC_NUMFMT_OFFSET( 18, NF_TIME_HHMMAMPM
),
998 EXC_NUMFMT_OFFSET( 19, NF_TIME_HHMMSSAMPM
),
999 EXC_NUMFMT_STRING( 22, "YYYY/MM/DD hh:mm" ),
1000 EXC_NUMFMT_STRING( 63, "\\R #,##0;\\R -#,##0" ),
1001 EXC_NUMFMT_STRING( 64, "\\R #,##0;[RED]\\R -#,##0" ),
1002 EXC_NUMFMT_STRING( 65, "\\R #,##0.00;\\R -#,##0.00" ),
1003 EXC_NUMFMT_STRING( 66, "\\R #,##0.00;[RED]\\R -#,##0.00" ),
1004 EXC_NUMFMT_ENDTABLE()
1007 // FRENCH ---------------------------------------------------------------------
1009 /** Base table for French locales. */
1010 const XclBuiltInFormat spBuiltInFormats_FRENCH
[] =
1012 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1013 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1014 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1015 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1016 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1017 EXC_NUMFMT_ENDTABLE()
1020 const XclBuiltInFormat spBuiltInFormats_FRENCH_FRANCE
[] =
1022 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY hh:mm" ),
1023 EXC_NUMFMT_STRING( 37, "#,##0\\ _" UTF8_EURO
";-#,##0\\ _" UTF8_EURO
),
1024 EXC_NUMFMT_STRING( 38, "#,##0\\ _" UTF8_EURO
";[RED]-#,##0\\ _" UTF8_EURO
),
1025 EXC_NUMFMT_STRING( 39, "#,##0.00\\ _" UTF8_EURO
";-#,##0.00\\ _" UTF8_EURO
),
1026 EXC_NUMFMT_STRING( 40, "#,##0.00\\ _" UTF8_EURO
";[RED]-#,##0.00\\ _" UTF8_EURO
),
1027 EXC_NUMFMT_STRING( 63, "#,##0\\ " UTF8_EURO
";-#,##0\\ " UTF8_EURO
),
1028 EXC_NUMFMT_STRING( 64, "#,##0\\ " UTF8_EURO
";[RED]-#,##0\\ " UTF8_EURO
),
1029 EXC_NUMFMT_STRING( 65, "#,##0.00\\ " UTF8_EURO
";-#,##0.00\\ " UTF8_EURO
),
1030 EXC_NUMFMT_STRING( 66, "#,##0.00\\ " UTF8_EURO
";[RED]-#,##0.00\\ " UTF8_EURO
),
1031 EXC_NUMFMT_ENDTABLE()
1034 const XclBuiltInFormat spBuiltInFormats_FRENCH_CANADIAN
[] =
1036 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD hh:mm" ),
1037 EXC_NUMFMT_STRING( 37, "#,##0\\ _$_-;#,##0\\ _$-" ),
1038 EXC_NUMFMT_STRING( 38, "#,##0\\ _$_-;[RED]#,##0\\ _$-" ),
1039 EXC_NUMFMT_STRING( 39, "#,##0.00\\ _$_-;#,##0.00\\ _$-" ),
1040 EXC_NUMFMT_STRING( 40, "#,##0.00\\ _$_-;[RED]#,##0.00\\ _$-" ),
1041 EXC_NUMFMT_STRING( 63, "#,##0\\ $_-;#,##0\\ $-" ),
1042 EXC_NUMFMT_STRING( 64, "#,##0\\ $_-;[RED]#,##0\\ $-" ),
1043 EXC_NUMFMT_STRING( 65, "#,##0.00\\ $_-;#,##0.00\\ $-" ),
1044 EXC_NUMFMT_STRING( 66, "#,##0.00\\ $_-;[RED]#,##0.00\\ $-" ),
1045 EXC_NUMFMT_ENDTABLE()
1048 const XclBuiltInFormat spBuiltInFormats_FRENCH_SWISS
[] =
1050 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1051 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1052 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1053 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1054 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1055 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1056 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1057 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1058 EXC_NUMFMT_ENDTABLE()
1061 const XclBuiltInFormat spBuiltInFormats_FRENCH_BELGIAN
[] =
1063 EXC_NUMFMT_STRING( 14, "D/MM/YYYY" ),
1064 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1065 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1066 EXC_NUMFMT_STRING( 20, "h:mm" ),
1067 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1068 EXC_NUMFMT_STRING( 22, "D/MM/YYYY h:mm" ),
1069 EXC_NUMFMT_ENDTABLE()
1072 // GERMAN ---------------------------------------------------------------------
1074 /** Base table for German locales. */
1075 const XclBuiltInFormat spBuiltInFormats_GERMAN
[] =
1077 EXC_NUMFMT_STRING( 15, "DD. MMM YY" ),
1078 EXC_NUMFMT_STRING( 16, "DD. MMM" ),
1079 EXC_NUMFMT_STRING( 17, "MMM YY" ),
1080 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1081 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1082 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1083 EXC_NUMFMT_ENDTABLE()
1086 const XclBuiltInFormat spBuiltInFormats_GERMAN_GERMANY
[] =
1088 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1089 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1090 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1091 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1092 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1093 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1094 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1095 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1096 EXC_NUMFMT_ENDTABLE()
1099 const XclBuiltInFormat spBuiltInFormats_GERMAN_AUSTRIAN
[] =
1101 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1102 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1103 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1104 EXC_NUMFMT_STRING( 63, UTF8_EURO
" #,##0;-" UTF8_EURO
" #,##0" ),
1105 EXC_NUMFMT_STRING( 64, UTF8_EURO
" #,##0;[RED]-" UTF8_EURO
" #,##0" ),
1106 EXC_NUMFMT_STRING( 65, UTF8_EURO
" #,##0.00;-" UTF8_EURO
" #,##0.00" ),
1107 EXC_NUMFMT_STRING( 66, UTF8_EURO
" #,##0.00;[RED]-" UTF8_EURO
" #,##0.00" ),
1108 EXC_NUMFMT_ENDTABLE()
1111 const XclBuiltInFormat spBuiltInFormats_GERMAN_SWISS
[] =
1113 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1114 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1115 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1116 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1117 EXC_NUMFMT_ENDTABLE()
1120 const XclBuiltInFormat spBuiltInFormats_GERMAN_LUXEMBOURG
[] =
1122 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1123 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1124 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1125 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1126 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1127 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1128 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1129 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1130 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1131 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1132 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1133 EXC_NUMFMT_ENDTABLE()
1136 const XclBuiltInFormat spBuiltInFormats_GERMAN_LIECHTENSTEIN
[] =
1138 EXC_NUMFMT_STRING( 63, "\"CHF \"#,##0;\"CHF \"-#,##0" ),
1139 EXC_NUMFMT_STRING( 64, "\"CHF \"#,##0;[RED]\"CHF \"-#,##0" ),
1140 EXC_NUMFMT_STRING( 65, "\"CHF \"#,##0.00;\"CHF \"-#,##0.00" ),
1141 EXC_NUMFMT_STRING( 66, "\"CHF \"#,##0.00;[RED]\"CHF \"-#,##0.00" ),
1142 EXC_NUMFMT_ENDTABLE()
1145 // ITALIAN --------------------------------------------------------------------
1147 const XclBuiltInFormat spBuiltInFormats_ITALIAN_ITALY
[] =
1149 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1150 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1151 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1152 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1153 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1154 EXC_NUMFMT_STRING( 20, "h:mm" ),
1155 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1156 EXC_NUMFMT_STRING( 22, "DD/MM/YYYY h:mm" ),
1157 EXC_NUMFMT_STRING( 63, UTF8_EURO
" #,##0;-" UTF8_EURO
" #,##0" ),
1158 EXC_NUMFMT_STRING( 64, UTF8_EURO
" #,##0;[RED]-" UTF8_EURO
" #,##0" ),
1159 EXC_NUMFMT_STRING( 65, UTF8_EURO
" #,##0.00;-" UTF8_EURO
" #,##0.00" ),
1160 EXC_NUMFMT_STRING( 66, UTF8_EURO
" #,##0.00;[RED]-" UTF8_EURO
" #,##0.00" ),
1161 EXC_NUMFMT_ENDTABLE()
1164 const XclBuiltInFormat spBuiltInFormats_ITALIAN_SWISS
[] =
1166 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1167 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1168 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1169 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1170 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1171 EXC_NUMFMT_STRING( 22, "DD.MM.YYYY hh:mm" ),
1172 EXC_NUMFMT_STRING( 63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
1173 EXC_NUMFMT_STRING( 64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
1174 EXC_NUMFMT_STRING( 65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
1175 EXC_NUMFMT_STRING( 66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
1176 EXC_NUMFMT_ENDTABLE()
1179 // SWEDISH --------------------------------------------------------------------
1181 const XclBuiltInFormat spBuiltInFormats_SWEDISH_SWEDEN
[] =
1183 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1184 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1185 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1186 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1187 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1188 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD hh:mm" ),
1189 EXC_NUMFMT_STRING( 37, "#,##0 _k_r;-#,##0 _k_r" ),
1190 EXC_NUMFMT_STRING( 38, "#,##0 _k_r;[RED]-#,##0 _k_r" ),
1191 EXC_NUMFMT_STRING( 39, "#,##0.00 _k_r;-#,##0.00 _k_r" ),
1192 EXC_NUMFMT_STRING( 40, "#,##0.00 _k_r;[RED]-#,##0.00 _k_r" ),
1193 EXC_NUMFMT_STRING( 63, "#,##0 \"kr\";-#,##0 \"kr\"" ),
1194 EXC_NUMFMT_STRING( 64, "#,##0 \"kr\";[RED]-#,##0 \"kr\"" ),
1195 EXC_NUMFMT_STRING( 65, "#,##0.00 \"kr\";-#,##0.00 \"kr\"" ),
1196 EXC_NUMFMT_STRING( 66, "#,##0.00 \"kr\";[RED]-#,##0.00 \"kr\"" ),
1197 EXC_NUMFMT_ENDTABLE()
1200 const XclBuiltInFormat spBuiltInFormats_SWEDISH_FINLAND
[] =
1202 EXC_NUMFMT_STRING( 9, "0 %" ),
1203 EXC_NUMFMT_STRING( 10, "0.00 %" ),
1204 EXC_NUMFMT_STRING( 15, "DD.MMM.YY" ),
1205 EXC_NUMFMT_STRING( 16, "DD.MMM" ),
1206 EXC_NUMFMT_STRING( 17, "MMM.YY" ),
1207 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1208 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1209 EXC_NUMFMT_STRING( 22, "D.M.YYYY hh:mm" ),
1210 EXC_NUMFMT_STRING( 37, "#,##0 _" UTF8_EURO
";-#,##0 _" UTF8_EURO
),
1211 EXC_NUMFMT_STRING( 38, "#,##0 _" UTF8_EURO
";[RED]-#,##0 _" UTF8_EURO
),
1212 EXC_NUMFMT_STRING( 39, "#,##0.00 _" UTF8_EURO
";-#,##0.00 _" UTF8_EURO
),
1213 EXC_NUMFMT_STRING( 40, "#,##0.00 _" UTF8_EURO
";[RED]-#,##0.00 _" UTF8_EURO
),
1214 EXC_NUMFMT_STRING( 63, "#,##0 " UTF8_EURO
";-#,##0 " UTF8_EURO
),
1215 EXC_NUMFMT_STRING( 64, "#,##0 " UTF8_EURO
";[RED]-#,##0 " UTF8_EURO
),
1216 EXC_NUMFMT_STRING( 65, "#,##0.00 " UTF8_EURO
";-#,##0.00 " UTF8_EURO
),
1217 EXC_NUMFMT_STRING( 66, "#,##0.00 " UTF8_EURO
";[RED]-#,##0.00 " UTF8_EURO
),
1218 EXC_NUMFMT_ENDTABLE()
1221 // ASIAN ----------------------------------------------------------------------
1223 /** Base table for Asian locales. */
1224 const XclBuiltInFormat spBuiltInFormats_ASIAN
[] =
1226 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1227 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1228 EXC_NUMFMT_STRING( 20, "h:mm" ),
1229 EXC_NUMFMT_STRING( 21, "h:mm:ss" ),
1230 EXC_NUMFMT_STRING( 23, "$#,##0_);($#,##0)" ),
1231 EXC_NUMFMT_STRING( 24, "$#,##0_);[RED]($#,##0)" ),
1232 EXC_NUMFMT_STRING( 25, "$#,##0.00_);($#,##0.00)" ),
1233 EXC_NUMFMT_STRING( 26, "$#,##0.00_);[RED]($#,##0.00)" ),
1234 EXC_NUMFMT_REUSE( 29, 28 ),
1235 EXC_NUMFMT_REUSE( 36, 27 ),
1236 EXC_NUMFMT_REUSE( 50, 27 ),
1237 EXC_NUMFMT_REUSE( 51, 28 ),
1238 EXC_NUMFMT_REUSE( 52, 34 ),
1239 EXC_NUMFMT_REUSE( 53, 35 ),
1240 EXC_NUMFMT_REUSE( 54, 28 ),
1241 EXC_NUMFMT_REUSE( 55, 34 ),
1242 EXC_NUMFMT_REUSE( 56, 35 ),
1243 EXC_NUMFMT_REUSE( 57, 27 ),
1244 EXC_NUMFMT_REUSE( 58, 28 ),
1245 EXC_NUMFMT_ENDTABLE()
1248 const XclBuiltInFormat spBuiltInFormats_JAPANESE
[] =
1250 EXC_NUMFMT_STRING( 14, "YYYY/M/D" ),
1251 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1252 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1253 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1254 EXC_NUMFMT_STRING( 22, "YYYY/M/D h:mm" ),
1255 EXC_NUMFMT_STRING( 27, "[$-0411]GE.M.D" ),
1256 EXC_NUMFMT_STRING( 28, "[$-0411]GGGE" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1257 EXC_NUMFMT_STRING( 30, "[$-0411]M/D/YY" ),
1258 EXC_NUMFMT_STRING( 31, "[$-0411]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1259 EXC_NUMFMT_STRING( 32, "[$-0411]h" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1260 EXC_NUMFMT_STRING( 33, "[$-0411]h" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1261 EXC_NUMFMT_STRING( 34, "[$-0411]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
),
1262 EXC_NUMFMT_STRING( 35, "[$-0411]M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1263 EXC_NUMFMT_STRING( 63, UTF8_YEN_JP
"#,##0;-" UTF8_YEN_JP
"#,##0" ),
1264 EXC_NUMFMT_STRING( 64, UTF8_YEN_JP
"#,##0;[RED]-" UTF8_YEN_JP
"#,##0" ),
1265 EXC_NUMFMT_STRING( 65, UTF8_YEN_JP
"#,##0.00;-" UTF8_YEN_JP
"#,##0.00" ),
1266 EXC_NUMFMT_STRING( 66, UTF8_YEN_JP
"#,##0.00;[RED]-" UTF8_YEN_JP
"#,##0.00" ),
1267 EXC_NUMFMT_ENDTABLE()
1270 const XclBuiltInFormat spBuiltInFormats_KOREAN
[] =
1272 EXC_NUMFMT_STRING( 14, "YYYY-MM-DD" ),
1273 EXC_NUMFMT_STRING( 15, "DD-MMM-YY" ),
1274 EXC_NUMFMT_STRING( 16, "DD-MMM" ),
1275 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1276 EXC_NUMFMT_STRING( 22, "YYYY-MM-DD h:mm" ),
1277 EXC_NUMFMT_STRING( 27, "[$-0412]YYYY" UTF8_CJ_YEAR
" MM" UTF8_CJ_MON
" DD" UTF8_CJ_DAY
),
1278 EXC_NUMFMT_STRING( 28, "[$-0412]MM-DD" ),
1279 EXC_NUMFMT_STRING( 30, "[$-0412]MM-DD-YY" ),
1280 EXC_NUMFMT_STRING( 31, "[$-0412]YYYY" UTF8_KO_YEAR
" MM" UTF8_KO_MON
" DD" UTF8_KO_DAY
),
1281 EXC_NUMFMT_STRING( 32, "[$-0412]h" UTF8_KO_HOUR
" mm" UTF8_KO_MIN
),
1282 EXC_NUMFMT_STRING( 33, "[$-0412]h" UTF8_KO_HOUR
" mm" UTF8_KO_MIN
" ss" UTF8_KO_SEC
),
1283 EXC_NUMFMT_STRING( 34, "[$-0412]YYYY\"/\"MM\"/\"DD" ),
1284 EXC_NUMFMT_STRING( 35, "[$-0412]YYYY-MM-DD" ),
1285 EXC_NUMFMT_STRING( 63, UTF8_WON
"#,##0;-" UTF8_WON
"#,##0" ),
1286 EXC_NUMFMT_STRING( 64, UTF8_WON
"#,##0;[RED]-" UTF8_WON
"#,##0" ),
1287 EXC_NUMFMT_STRING( 65, UTF8_WON
"#,##0.00;-" UTF8_WON
"#,##0.00" ),
1288 EXC_NUMFMT_STRING( 66, UTF8_WON
"#,##0.00;[RED]-" UTF8_WON
"#,##0.00" ),
1289 EXC_NUMFMT_ENDTABLE()
1292 const XclBuiltInFormat spBuiltInFormats_CHINESE_SIMPLIFIED
[] =
1294 EXC_NUMFMT_STRING( 14, "YYYY-M-D" ),
1295 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1296 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1297 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1298 EXC_NUMFMT_STRING( 22, "YYYY-M-D h:mm" ),
1299 EXC_NUMFMT_STRING( 27, "[$-0804]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
),
1300 EXC_NUMFMT_STRING( 28, "[$-0804]M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1301 EXC_NUMFMT_STRING( 30, "[$-0804]M-D-YY" ),
1302 EXC_NUMFMT_STRING( 31, "[$-0804]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1303 EXC_NUMFMT_STRING( 32, "[$-0804]h" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
),
1304 EXC_NUMFMT_STRING( 33, "[$-0804]h" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1305 EXC_NUMFMT_STRING( 34, "[$-0804]AM/PMh" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
),
1306 EXC_NUMFMT_STRING( 35, "[$-0804]AM/PMh" UTF8_CS_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1307 EXC_NUMFMT_REUSE( 52, 27 ),
1308 EXC_NUMFMT_REUSE( 53, 28 ),
1309 EXC_NUMFMT_STRING( 63, UTF8_YEN_CS
"#,##0;-" UTF8_YEN_CS
"#,##0" ),
1310 EXC_NUMFMT_STRING( 64, UTF8_YEN_CS
"#,##0;[RED]-" UTF8_YEN_CS
"#,##0" ),
1311 EXC_NUMFMT_STRING( 65, UTF8_YEN_CS
"#,##0.00;-" UTF8_YEN_CS
"#,##0.00" ),
1312 EXC_NUMFMT_STRING( 66, UTF8_YEN_CS
"#,##0.00;[RED]-" UTF8_YEN_CS
"#,##0.00" ),
1313 EXC_NUMFMT_ENDTABLE()
1316 const XclBuiltInFormat spBuiltInFormats_CHINESE_TRADITIONAL
[] =
1318 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1319 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1320 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1321 EXC_NUMFMT_STRING( 18, "hh:mm AM/PM" ),
1322 EXC_NUMFMT_STRING( 19, "hh:mm:ss AM/PM" ),
1323 EXC_NUMFMT_OFFSET( 20, NF_TIME_HHMM
),
1324 EXC_NUMFMT_OFFSET( 21, NF_TIME_HHMMSS
),
1325 EXC_NUMFMT_STRING( 22, "YYYY/M/D hh:mm" ),
1326 EXC_NUMFMT_STRING( 23, "US$#,##0_);(US$#,##0)" ),
1327 EXC_NUMFMT_STRING( 24, "US$#,##0_);[RED](US$#,##0)" ),
1328 EXC_NUMFMT_STRING( 25, "US$#,##0.00_);(US$#,##0.00)" ),
1329 EXC_NUMFMT_STRING( 26, "US$#,##0.00_);[RED](US$#,##0.00)" ),
1330 EXC_NUMFMT_STRING( 27, "[$-0404]E/M/D" ),
1331 EXC_NUMFMT_STRING( 28, "[$-0404]E" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1332 EXC_NUMFMT_STRING( 30, "[$-0404]M/D/YY" ),
1333 EXC_NUMFMT_STRING( 31, "[$-0404]YYYY" UTF8_CJ_YEAR
"M" UTF8_CJ_MON
"D" UTF8_CJ_DAY
),
1334 EXC_NUMFMT_STRING( 32, "[$-0404]hh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1335 EXC_NUMFMT_STRING( 33, "[$-0404]hh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1336 EXC_NUMFMT_STRING( 34, "[$-0404]AM/PMhh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
),
1337 EXC_NUMFMT_STRING( 35, "[$-0404]AM/PMhh" UTF8_CJ_HOUR
"mm" UTF8_CJ_MIN
"ss" UTF8_CJ_SEC
),
1338 EXC_NUMFMT_STRING( 63, "$#,##0;-$#,##0" ),
1339 EXC_NUMFMT_STRING( 64, "$#,##0;[RED]-$#,##0" ),
1340 EXC_NUMFMT_STRING( 65, "$#,##0.00;-$#,##0.00" ),
1341 EXC_NUMFMT_STRING( 66, "$#,##0.00;[RED]-$#,##0.00" ),
1342 EXC_NUMFMT_ENDTABLE()
1345 // OTHER ----------------------------------------------------------------------
1347 const XclBuiltInFormat spBuiltInFormats_HEBREW
[] =
1349 EXC_NUMFMT_STRING( 15, "DD-MMMM-YY" ),
1350 EXC_NUMFMT_STRING( 16, "DD-MMMM" ),
1351 EXC_NUMFMT_STRING( 17, "MMMM-YY" ),
1352 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1353 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1354 EXC_NUMFMT_STRING( 63, UTF8_SHEQEL
" #,##0;" UTF8_SHEQEL
" -#,##0" ),
1355 EXC_NUMFMT_STRING( 64, UTF8_SHEQEL
" #,##0;[RED]" UTF8_SHEQEL
" -#,##0" ),
1356 EXC_NUMFMT_STRING( 65, UTF8_SHEQEL
" #,##0.00;" UTF8_SHEQEL
" -#,##0.00" ),
1357 EXC_NUMFMT_STRING( 66, UTF8_SHEQEL
" #,##0.00;[RED]" UTF8_SHEQEL
" -#,##0.00" ),
1358 EXC_NUMFMT_ENDTABLE()
1361 const XclBuiltInFormat spBuiltInFormats_THAI
[] =
1363 EXC_NUMFMT_STRING( 14, "D/M/YYYY" ),
1364 EXC_NUMFMT_STRING( 15, "D-MMM-YY" ),
1365 EXC_NUMFMT_STRING( 16, "D-MMM" ),
1366 EXC_NUMFMT_STRING( 17, "MMM-YY" ),
1367 EXC_NUMFMT_STRING( 18, "h:mm AM/PM" ),
1368 EXC_NUMFMT_STRING( 19, "h:mm:ss AM/PM" ),
1369 EXC_NUMFMT_STRING( 22, "D/M/YYYY h:mm" ),
1370 EXC_NUMFMT_STRING( 59, "t0" ),
1371 EXC_NUMFMT_STRING( 60, "t0.00" ),
1372 EXC_NUMFMT_STRING( 61, "t#,##0" ),
1373 EXC_NUMFMT_STRING( 62, "t#,##0.00" ),
1374 EXC_NUMFMT_STRING( 63, "t" UTF8_BAHT
"#,##0_);t(" UTF8_BAHT
"#,##0)" ),
1375 EXC_NUMFMT_STRING( 64, "t" UTF8_BAHT
"#,##0_);[RED]t(" UTF8_BAHT
"#,##0)" ),
1376 EXC_NUMFMT_STRING( 65, "t" UTF8_BAHT
"#,##0.00_);t(" UTF8_BAHT
"#,##0.00)" ),
1377 EXC_NUMFMT_STRING( 66, "t" UTF8_BAHT
"#,##0.00_);[RED]t(" UTF8_BAHT
"#,##0.00)" ),
1378 EXC_NUMFMT_STRING( 67, "t0%" ),
1379 EXC_NUMFMT_STRING( 68, "t0.00%" ),
1380 EXC_NUMFMT_STRING( 69, "t# ?/?" ),
1381 EXC_NUMFMT_STRING( 70, "t# ?\?/?\?" ),
1382 EXC_NUMFMT_STRING( 71, "tD/M/EE" ),
1383 EXC_NUMFMT_STRING( 72, "tD-MMM-E" ),
1384 EXC_NUMFMT_STRING( 73, "tD-MMM" ),
1385 EXC_NUMFMT_STRING( 74, "tMMM-E" ),
1386 EXC_NUMFMT_STRING( 75, "th:mm" ),
1387 EXC_NUMFMT_STRING( 76, "th:mm:ss" ),
1388 EXC_NUMFMT_STRING( 77, "tD/M/EE h:mm" ),
1389 EXC_NUMFMT_STRING( 78, "tmm:ss" ),
1390 EXC_NUMFMT_STRING( 79, "t[h]:mm:ss" ),
1391 EXC_NUMFMT_STRING( 80, "tmm:ss.0" ),
1392 EXC_NUMFMT_STRING( 81, "D/M/E" ),
1393 EXC_NUMFMT_ENDTABLE()
1396 #undef EXC_NUMFMT_ENDTABLE
1397 #undef EXC_NUMFMT_REUSE
1398 #undef EXC_NUMFMT_OFFSET
1399 #undef EXC_NUMFMT_STRING
1401 /** Specifies a number format table for a specific language. */
1402 struct XclBuiltInFormatTable
1404 LanguageType meLanguage
; /// The language of this table.
1405 LanguageType meParentLang
; /// The language of the parent table.
1406 const XclBuiltInFormat
* mpFormats
; /// The number format table.
1409 const XclBuiltInFormatTable spBuiltInFormatTables
[] =
1410 { // language parent language format table
1411 { LANGUAGE_DONTKNOW
, LANGUAGE_NONE
, spBuiltInFormats_DONTKNOW
},
1413 { LANGUAGE_ENGLISH
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ENGLISH
},
1414 { LANGUAGE_ENGLISH_UK
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_UK
},
1415 { LANGUAGE_ENGLISH_EIRE
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_EIRE
},
1416 { LANGUAGE_ENGLISH_US
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_US
},
1417 { LANGUAGE_ENGLISH_CAN
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_CAN
},
1418 { LANGUAGE_ENGLISH_AUS
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_AUS
},
1419 { LANGUAGE_ENGLISH_SAFRICA
, LANGUAGE_ENGLISH
, spBuiltInFormats_ENGLISH_SAFRICA
},
1420 { LANGUAGE_ENGLISH_NZ
, LANGUAGE_ENGLISH_AUS
, nullptr },
1422 { PRV_LANGUAGE_FRENCH_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_FRENCH
},
1423 { LANGUAGE_FRENCH
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_FRANCE
},
1424 { LANGUAGE_FRENCH_CANADIAN
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_CANADIAN
},
1425 { LANGUAGE_FRENCH_SWISS
, PRV_LANGUAGE_FRENCH_PRIM
, spBuiltInFormats_FRENCH_SWISS
},
1426 { LANGUAGE_FRENCH_BELGIAN
, LANGUAGE_FRENCH
, spBuiltInFormats_FRENCH_BELGIAN
},
1427 { LANGUAGE_FRENCH_LUXEMBOURG
, LANGUAGE_FRENCH
, nullptr },
1428 { LANGUAGE_FRENCH_MONACO
, LANGUAGE_FRENCH
, nullptr },
1430 { PRV_LANGUAGE_GERMAN_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_GERMAN
},
1431 { LANGUAGE_GERMAN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_GERMANY
},
1432 { LANGUAGE_GERMAN_AUSTRIAN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_AUSTRIAN
},
1433 { LANGUAGE_GERMAN_SWISS
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_SWISS
},
1434 { LANGUAGE_GERMAN_LUXEMBOURG
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_LUXEMBOURG
},
1435 { LANGUAGE_GERMAN_LIECHTENSTEIN
, PRV_LANGUAGE_GERMAN_PRIM
, spBuiltInFormats_GERMAN_LIECHTENSTEIN
},
1437 { LANGUAGE_ITALIAN
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ITALIAN_ITALY
},
1438 { LANGUAGE_ITALIAN_SWISS
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ITALIAN_SWISS
},
1440 { LANGUAGE_SWEDISH
, LANGUAGE_DONTKNOW
, spBuiltInFormats_SWEDISH_SWEDEN
},
1441 { LANGUAGE_SWEDISH_FINLAND
, LANGUAGE_DONTKNOW
, spBuiltInFormats_SWEDISH_FINLAND
},
1443 { PRV_LANGUAGE_ASIAN_PRIM
, LANGUAGE_DONTKNOW
, spBuiltInFormats_ASIAN
},
1444 { LANGUAGE_JAPANESE
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_JAPANESE
},
1445 { LANGUAGE_KOREAN
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_KOREAN
},
1446 { LANGUAGE_CHINESE_SIMPLIFIED
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_CHINESE_SIMPLIFIED
},
1447 { LANGUAGE_CHINESE_TRADITIONAL
, PRV_LANGUAGE_ASIAN_PRIM
, spBuiltInFormats_CHINESE_TRADITIONAL
},
1449 { LANGUAGE_HEBREW
, LANGUAGE_DONTKNOW
, spBuiltInFormats_HEBREW
},
1450 { LANGUAGE_THAI
, LANGUAGE_DONTKNOW
, spBuiltInFormats_THAI
}
1455 XclNumFmtBuffer::XclNumFmtBuffer( const XclRoot
& rRoot
) :
1456 meSysLang( rRoot
.GetSysLanguage() ),
1457 mnStdScNumFmt( rRoot
.GetFormatter().GetStandardIndex( ScGlobal::eLnge
) )
1459 // *** insert default formats (BIFF5+ only)***
1461 if( rRoot
.GetBiff() >= EXC_BIFF5
)
1462 InsertBuiltinFormats();
1465 void XclNumFmtBuffer::InitializeImport()
1470 void XclNumFmtBuffer::InsertFormat( sal_uInt16 nXclNumFmt
, const OUString
& rFormat
)
1472 XclNumFmt
& rNumFmt
= maFmtMap
[ nXclNumFmt
];
1473 rNumFmt
.maFormat
= rFormat
;
1474 // #i62053# rFormat may be an empty string, meOffset must be initialized
1475 rNumFmt
.meOffset
= NF_NUMBER_STANDARD
;
1476 rNumFmt
.meLanguage
= LANGUAGE_SYSTEM
;
1479 void XclNumFmtBuffer::InsertBuiltinFormats()
1481 // build a map containing tables for all languages
1482 typedef ::std::map
< LanguageType
, const XclBuiltInFormatTable
* > XclBuiltInMap
;
1483 XclBuiltInMap aBuiltInMap
;
1484 for(const auto &rTable
: spBuiltInFormatTables
)
1485 aBuiltInMap
[ rTable
.meLanguage
] = &rTable
;
1487 // build a list of table pointers for the current language, with all parent tables
1488 typedef ::std::vector
< const XclBuiltInFormatTable
* > XclBuiltInVec
;
1489 XclBuiltInVec aBuiltInVec
;
1490 for( XclBuiltInMap::const_iterator aMIt
= aBuiltInMap
.find( meSysLang
), aMEnd
= aBuiltInMap
.end();
1491 aMIt
!= aMEnd
; aMIt
= aBuiltInMap
.find( aMIt
->second
->meParentLang
) )
1492 aBuiltInVec
.push_back( aMIt
->second
);
1493 // language not supported
1494 if( aBuiltInVec
.empty() )
1496 SAL_WARN("sc", "XclNumFmtBuffer::InsertBuiltinFormats - language not supported (#i29949#) 0x" << std::hex
<< meSysLang
);
1497 XclBuiltInMap::const_iterator aMIt
= aBuiltInMap
.find( LANGUAGE_DONTKNOW
);
1498 OSL_ENSURE( aMIt
!= aBuiltInMap
.end(), "XclNumFmtBuffer::InsertBuiltinFormats - default map not found" );
1499 if( aMIt
!= aBuiltInMap
.end() )
1500 aBuiltInVec
.push_back( aMIt
->second
);
1503 // insert the default formats in the format map, from root parent to system language
1504 std::map
< sal_uInt16
, sal_uInt16
> aReuseMap
;
1505 for( XclBuiltInVec::reverse_iterator aVIt
= aBuiltInVec
.rbegin(), aVEnd
= aBuiltInVec
.rend(); aVIt
!= aVEnd
; ++aVIt
)
1507 // put LANGUAGE_SYSTEM for all entries in default table
1508 LanguageType eLang
= ((*aVIt
)->meLanguage
== LANGUAGE_DONTKNOW
) ? LANGUAGE_SYSTEM
: meSysLang
;
1509 for( const XclBuiltInFormat
* pBuiltIn
= (*aVIt
)->mpFormats
; pBuiltIn
&& (pBuiltIn
->mnXclNumFmt
!= EXC_FORMAT_NOTFOUND
); ++pBuiltIn
)
1511 XclNumFmt
& rNumFmt
= maFmtMap
[ pBuiltIn
->mnXclNumFmt
];
1513 rNumFmt
.meOffset
= pBuiltIn
->meOffset
;
1514 rNumFmt
.meLanguage
= eLang
;
1516 if( pBuiltIn
->mpFormat
)
1517 rNumFmt
.maFormat
= OUString( pBuiltIn
->mpFormat
, strlen(pBuiltIn
->mpFormat
), RTL_TEXTENCODING_UTF8
);
1519 rNumFmt
.maFormat
.clear();
1521 if( pBuiltIn
->meOffset
== PRV_NF_INDEX_REUSE
)
1522 aReuseMap
[ pBuiltIn
->mnXclNumFmt
] = pBuiltIn
->mnXclReuseFmt
;
1524 aReuseMap
.erase( pBuiltIn
->mnXclNumFmt
);
1528 // copy reused number formats
1529 for( const auto& [rXclNumFmt
, rXclReuseFmt
] : aReuseMap
)
1530 maFmtMap
[ rXclNumFmt
] = maFmtMap
[ rXclReuseFmt
];
1533 // Cell formatting data (XF) ==================================================
1535 XclCellProt::XclCellProt() :
1536 mbLocked( true ), // default in Excel and Calc
1541 bool operator==( const XclCellProt
& rLeft
, const XclCellProt
& rRight
)
1543 return (rLeft
.mbLocked
== rRight
.mbLocked
) && (rLeft
.mbHidden
== rRight
.mbHidden
);
1546 XclCellAlign::XclCellAlign() :
1547 mnHorAlign( EXC_XF_HOR_GENERAL
),
1548 mnVerAlign( EXC_XF_VER_BOTTOM
),
1549 mnOrient( EXC_ORIENT_NONE
),
1550 mnTextDir( EXC_XF_TEXTDIR_CONTEXT
),
1551 mnRotation( EXC_ROT_NONE
),
1553 mbLineBreak( false ),
1558 SvxCellHorJustify
XclCellAlign::GetScHorAlign() const
1560 SvxCellHorJustify eHorJust
= SvxCellHorJustify::Standard
;
1561 switch( mnHorAlign
)
1563 case EXC_XF_HOR_GENERAL
: eHorJust
= SvxCellHorJustify::Standard
; break;
1564 case EXC_XF_HOR_LEFT
: eHorJust
= SvxCellHorJustify::Left
; break;
1565 case EXC_XF_HOR_CENTER_AS
:
1566 case EXC_XF_HOR_CENTER
: eHorJust
= SvxCellHorJustify::Center
; break;
1567 case EXC_XF_HOR_RIGHT
: eHorJust
= SvxCellHorJustify::Right
; break;
1568 case EXC_XF_HOR_FILL
: eHorJust
= SvxCellHorJustify::Repeat
; break;
1569 case EXC_XF_HOR_JUSTIFY
:
1570 case EXC_XF_HOR_DISTRIB
: eHorJust
= SvxCellHorJustify::Block
; break;
1571 default: OSL_FAIL( "XclCellAlign::GetScHorAlign - unknown horizontal alignment" );
1576 SvxCellJustifyMethod
XclCellAlign::GetScHorJustifyMethod() const
1578 return (mnHorAlign
== EXC_XF_HOR_DISTRIB
) ? SvxCellJustifyMethod::Distribute
: SvxCellJustifyMethod::Auto
;
1581 SvxCellVerJustify
XclCellAlign::GetScVerAlign() const
1583 SvxCellVerJustify eVerJust
= SvxCellVerJustify::Standard
;
1584 switch( mnVerAlign
)
1586 case EXC_XF_VER_TOP
: eVerJust
= SvxCellVerJustify::Top
; break;
1587 case EXC_XF_VER_CENTER
: eVerJust
= SvxCellVerJustify::Center
; break;
1588 case EXC_XF_VER_BOTTOM
: eVerJust
= SvxCellVerJustify::Standard
; break;
1589 case EXC_XF_VER_JUSTIFY
:
1590 case EXC_XF_VER_DISTRIB
: eVerJust
= SvxCellVerJustify::Block
; break;
1591 default: OSL_FAIL( "XclCellAlign::GetScVerAlign - unknown vertical alignment" );
1596 SvxCellJustifyMethod
XclCellAlign::GetScVerJustifyMethod() const
1598 return (mnVerAlign
== EXC_XF_VER_DISTRIB
) ? SvxCellJustifyMethod::Distribute
: SvxCellJustifyMethod::Auto
;
1601 SvxFrameDirection
XclCellAlign::GetScFrameDir() const
1603 SvxFrameDirection eFrameDir
= SvxFrameDirection::Environment
;
1606 case EXC_XF_TEXTDIR_CONTEXT
: eFrameDir
= SvxFrameDirection::Environment
; break;
1607 case EXC_XF_TEXTDIR_LTR
: eFrameDir
= SvxFrameDirection::Horizontal_LR_TB
; break;
1608 case EXC_XF_TEXTDIR_RTL
: eFrameDir
= SvxFrameDirection::Horizontal_RL_TB
; break;
1609 default: OSL_FAIL( "XclCellAlign::GetScFrameDir - unknown CTL text direction" );
1614 void XclCellAlign::SetScHorAlign( SvxCellHorJustify eHorJust
)
1618 case SvxCellHorJustify::Standard
: mnHorAlign
= EXC_XF_HOR_GENERAL
; break;
1619 case SvxCellHorJustify::Left
: mnHorAlign
= EXC_XF_HOR_LEFT
; break;
1620 case SvxCellHorJustify::Center
: mnHorAlign
= EXC_XF_HOR_CENTER
; break;
1621 case SvxCellHorJustify::Right
: mnHorAlign
= EXC_XF_HOR_RIGHT
; break;
1622 case SvxCellHorJustify::Block
: mnHorAlign
= EXC_XF_HOR_JUSTIFY
; break;
1623 case SvxCellHorJustify::Repeat
: mnHorAlign
= EXC_XF_HOR_FILL
; break;
1624 default: mnHorAlign
= EXC_XF_HOR_GENERAL
;
1625 OSL_FAIL( "XclCellAlign::SetScHorAlign - unknown horizontal alignment" );
1629 void XclCellAlign::SetScVerAlign( SvxCellVerJustify eVerJust
)
1633 case SvxCellVerJustify::Standard
: mnVerAlign
= EXC_XF_VER_BOTTOM
; break;
1634 case SvxCellVerJustify::Top
: mnVerAlign
= EXC_XF_VER_TOP
; break;
1635 case SvxCellVerJustify::Center
: mnVerAlign
= EXC_XF_VER_CENTER
; break;
1636 case SvxCellVerJustify::Bottom
: mnVerAlign
= EXC_XF_VER_BOTTOM
; break;
1637 default: mnVerAlign
= EXC_XF_VER_BOTTOM
;
1638 OSL_FAIL( "XclCellAlign::SetScVerAlign - unknown vertical alignment" );
1642 void XclCellAlign::SetScFrameDir( SvxFrameDirection eFrameDir
)
1646 case SvxFrameDirection::Environment
: mnTextDir
= EXC_XF_TEXTDIR_CONTEXT
; break;
1647 case SvxFrameDirection::Horizontal_LR_TB
: mnTextDir
= EXC_XF_TEXTDIR_LTR
; break;
1648 case SvxFrameDirection::Horizontal_RL_TB
: mnTextDir
= EXC_XF_TEXTDIR_RTL
; break;
1649 default: mnTextDir
= EXC_XF_TEXTDIR_CONTEXT
;
1650 OSL_FAIL( "XclCellAlign::SetScFrameDir - unknown CTL text direction" );
1654 bool operator==( const XclCellAlign
& rLeft
, const XclCellAlign
& rRight
)
1657 (rLeft
.mnHorAlign
== rRight
.mnHorAlign
) && (rLeft
.mnVerAlign
== rRight
.mnVerAlign
) &&
1658 (rLeft
.mnTextDir
== rRight
.mnTextDir
) && (rLeft
.mnOrient
== rRight
.mnOrient
) &&
1659 (rLeft
.mnRotation
== rRight
.mnRotation
) && (rLeft
.mnIndent
== rRight
.mnIndent
) &&
1660 (rLeft
.mbLineBreak
== rRight
.mbLineBreak
) && (rLeft
.mbShrink
== rRight
.mbShrink
);
1663 XclCellBorder::XclCellBorder() :
1669 mnLeftLine( EXC_LINE_NONE
),
1670 mnRightLine( EXC_LINE_NONE
),
1671 mnTopLine( EXC_LINE_NONE
),
1672 mnBottomLine( EXC_LINE_NONE
),
1673 mnDiagLine( EXC_LINE_NONE
),
1674 mbDiagTLtoBR( false ),
1675 mbDiagBLtoTR( false )
1679 bool operator==( const XclCellBorder
& rLeft
, const XclCellBorder
& rRight
)
1682 (rLeft
.mnLeftColor
== rRight
.mnLeftColor
) && (rLeft
.mnRightColor
== rRight
.mnRightColor
) &&
1683 (rLeft
.mnTopColor
== rRight
.mnTopColor
) && (rLeft
.mnBottomColor
== rRight
.mnBottomColor
) &&
1684 (rLeft
.mnLeftLine
== rRight
.mnLeftLine
) && (rLeft
.mnRightLine
== rRight
.mnRightLine
) &&
1685 (rLeft
.mnTopLine
== rRight
.mnTopLine
) && (rLeft
.mnBottomLine
== rRight
.mnBottomLine
) &&
1686 (rLeft
.mnDiagColor
== rRight
.mnDiagColor
) && (rLeft
.mnDiagLine
== rRight
.mnDiagLine
) &&
1687 (rLeft
.mbDiagTLtoBR
== rRight
.mbDiagTLtoBR
) && (rLeft
.mbDiagBLtoTR
== rRight
.mbDiagBLtoTR
);
1690 XclCellArea::XclCellArea() :
1691 mnForeColor( EXC_COLOR_WINDOWTEXT
),
1692 mnBackColor( EXC_COLOR_WINDOWBACK
),
1693 mnPattern( EXC_PATT_NONE
)
1697 XclCellArea::XclCellArea(sal_uInt8 nPattern
) :
1698 mnForeColor( EXC_COLOR_WINDOWTEXT
),
1699 mnBackColor( EXC_COLOR_WINDOWBACK
),
1700 mnPattern( nPattern
)
1704 bool XclCellArea::IsTransparent() const
1706 return (mnPattern
== EXC_PATT_NONE
) && (mnBackColor
== EXC_COLOR_WINDOWBACK
);
1709 bool operator==( const XclCellArea
& rLeft
, const XclCellArea
& rRight
)
1712 (rLeft
.mnForeColor
== rRight
.mnForeColor
) && (rLeft
.mnBackColor
== rRight
.mnBackColor
) &&
1713 (rLeft
.mnPattern
== rRight
.mnPattern
);
1716 XclXFBase::XclXFBase( bool bCellXF
) :
1717 mnParent( bCellXF
? EXC_XF_DEFAULTSTYLE
: EXC_XF_STYLEPARENT
),
1720 SetAllUsedFlags( false );
1723 XclXFBase::~XclXFBase()
1727 void XclXFBase::SetAllUsedFlags( bool bUsed
)
1729 mbProtUsed
= mbFontUsed
= mbFmtUsed
= mbAlignUsed
= mbBorderUsed
= mbAreaUsed
= bUsed
;
1732 bool XclXFBase::HasUsedFlags() const
1734 return mbProtUsed
|| mbFontUsed
|| mbFmtUsed
|| mbAlignUsed
|| mbBorderUsed
|| mbAreaUsed
;
1737 bool XclXFBase::Equals( const XclXFBase
& rCmp
) const
1740 (mbCellXF
== rCmp
.mbCellXF
) && (mnParent
== rCmp
.mnParent
) &&
1741 (mbProtUsed
== rCmp
.mbProtUsed
) && (mbFontUsed
== rCmp
.mbFontUsed
) &&
1742 (mbFmtUsed
== rCmp
.mbFmtUsed
) && (mbAlignUsed
== rCmp
.mbAlignUsed
) &&
1743 (mbBorderUsed
== rCmp
.mbBorderUsed
) && (mbAreaUsed
== rCmp
.mbAreaUsed
);
1746 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */