LCOV - code coverage report
Current view: top level - sc/source/filter/excel - xlstyle.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 391 496 78.8 %
Date: 2015-06-13 12:38:46 Functions: 68 74 91.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       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/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      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 .
      18             :  */
      19             : 
      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/FontUnderline.hpp>
      24             : #include <com/sun/star/i18n/ScriptType.hpp>
      25             : #include <vcl/svapp.hxx>
      26             : #include <vcl/settings.hxx>
      27             : #include <vcl/font.hxx>
      28             : #include <sal/macros.h>
      29             : #include <rtl/tencinfo.h>
      30             : #include <svtools/colorcfg.hxx>
      31             : #include <toolkit/helper/vclunohelper.hxx>
      32             : #include <editeng/svxfont.hxx>
      33             : #include "global.hxx"
      34             : #include "xlroot.hxx"
      35             : // Color data =================================================================
      36             : 
      37             : /** Standard EGA colors, bright. */
      38             : #define EXC_PALETTE_EGA_COLORS_LIGHT \
      39             :             0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF
      40             : /** Standard EGA colors, dark. */
      41             : #define EXC_PALETTE_EGA_COLORS_DARK \
      42             :             0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0xC0C0C0, 0x808080
      43             : 
      44             : /** Default color table for BIFF2. */
      45             : static const ColorData spnDefColorTable2[] =
      46             : {
      47             : /*  0 */    EXC_PALETTE_EGA_COLORS_LIGHT
      48             : };
      49             : 
      50             : /** Default color table for BIFF3/BIFF4. */
      51             : static const ColorData spnDefColorTable3[] =
      52             : {
      53             : /*  0 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      54             : /*  8 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      55             : /* 16 */    EXC_PALETTE_EGA_COLORS_DARK
      56             : };
      57             : 
      58             : /** Default color table for BIFF5/BIFF7. */
      59             : static const ColorData spnDefColorTable5[] =
      60             : {
      61             : /*  0 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      62             : /*  8 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      63             : /* 16 */    EXC_PALETTE_EGA_COLORS_DARK,
      64             : /* 24 */    0x8080FF, 0x802060, 0xFFFFC0, 0xA0E0E0, 0x600080, 0xFF8080, 0x0080C0, 0xC0C0FF,
      65             : /* 32 */    0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF,
      66             : /* 40 */    0x00CFFF, 0x69FFFF, 0xE0FFE0, 0xFFFF80, 0xA6CAF0, 0xDD9CB3, 0xB38FEE, 0xE3E3E3,
      67             : /* 48 */    0x2A6FF9, 0x3FB8CD, 0x488436, 0x958C41, 0x8E5E42, 0xA0627A, 0x624FAC, 0x969696,
      68             : /* 56 */    0x1D2FBE, 0x286676, 0x004500, 0x453E01, 0x6A2813, 0x85396A, 0x4A3285, 0x424242
      69             : };
      70             : 
      71             : /** Default color table for BIFF8. */
      72             : static const ColorData spnDefColorTable8[] =
      73             : {
      74             : /*  0 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      75             : /*  8 */    EXC_PALETTE_EGA_COLORS_LIGHT,
      76             : /* 16 */    EXC_PALETTE_EGA_COLORS_DARK,
      77             : /* 24 */    0x9999FF, 0x993366, 0xFFFFCC, 0xCCFFFF, 0x660066, 0xFF8080, 0x0066CC, 0xCCCCFF,
      78             : /* 32 */    0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF,
      79             : /* 40 */    0x00CCFF, 0xCCFFFF, 0xCCFFCC, 0xFFFF99, 0x99CCFF, 0xFF99CC, 0xCC99FF, 0xFFCC99,
      80             : /* 48 */    0x3366FF, 0x33CCCC, 0x99CC00, 0xFFCC00, 0xFF9900, 0xFF6600, 0x666699, 0x969696,
      81             : /* 56 */    0x003366, 0x339966, 0x003300, 0x333300, 0x993300, 0x993366, 0x333399, 0x333333
      82             : };
      83             : 
      84             : #undef EXC_PALETTE_EGA_COLORS_LIGHT
      85             : #undef EXC_PALETTE_EGA_COLORS_DARK
      86             : 
      87         156 : XclDefaultPalette::XclDefaultPalette( const XclRoot& rRoot ) :
      88             :     mpnColorTable( 0 ),
      89         156 :     mnTableSize( 0 )
      90             : {
      91         156 :     const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
      92         156 :     mnWindowText = rSett.GetWindowTextColor().GetColor();
      93         156 :     mnWindowBack = rSett.GetWindowColor().GetColor();
      94         156 :     mnFaceColor = rSett.GetFaceColor().GetColor();
      95             :     // Don't use the system HelpBack and HelpText colours as it causes problems
      96             :     // with modern gnome. This is because mnNoteText and mnNoteBack are used
      97             :     // when colour indices ( instead of real colours ) are specified.
      98             :     // Note: That this it is not an unusual scenario that we get the Note
      99             :     // background specified as a real colour and the text specified as a
     100             :     // colour index. That means the text colour would be picked from
     101             :     // the system where the note background would be picked from a real colour.
     102             :     // Previously the note text colour was picked from the system tooltip
     103             :     // text colour, on modern gnome(e.g. 3) that tends to be 'white' with the
     104             :     // default theme.
     105             :     // Using the Libreoffice defaults ( instead of system specific colours
     106             :     // ) lessens the chance of the one colour being an unsuitable combination
     107             :     // because by default the note text is black and the note background is
     108             :     // a light yellow colour ( very similar to Excel's normal defaults )
     109         156 :     mnNoteText =  svtools::ColorConfig::GetDefaultColor( svtools::FONTCOLOR ).GetColor();
     110         156 :     mnNoteBack =  svtools::ColorConfig::GetDefaultColor( svtools::CALCNOTESBACKGROUND ).GetColor();
     111             : 
     112             :     // default colors
     113         156 :     switch( rRoot.GetBiff() )
     114             :     {
     115             :         case EXC_BIFF2:
     116           0 :             mpnColorTable = spnDefColorTable2;
     117           0 :             mnTableSize = SAL_N_ELEMENTS( spnDefColorTable2 );
     118           0 :         break;
     119             :         case EXC_BIFF3:
     120             :         case EXC_BIFF4:
     121           0 :             mpnColorTable = spnDefColorTable3;
     122           0 :             mnTableSize = SAL_N_ELEMENTS( spnDefColorTable3 );
     123           0 :         break;
     124             :         case EXC_BIFF5:
     125           3 :             mpnColorTable = spnDefColorTable5;
     126           3 :             mnTableSize = SAL_N_ELEMENTS( spnDefColorTable5 );
     127           3 :         break;
     128             :         case EXC_BIFF8:
     129         153 :             mpnColorTable = spnDefColorTable8;
     130         153 :             mnTableSize = SAL_N_ELEMENTS( spnDefColorTable8 );
     131         153 :         break;
     132             :         default:
     133             :             DBG_ERROR_BIFF();
     134             :     }
     135         156 : }
     136             : 
     137       16504 : ColorData XclDefaultPalette::GetDefColorData( sal_uInt16 nXclIndex ) const
     138             : {
     139             :     ColorData nColor;
     140       16504 :     if( nXclIndex < mnTableSize )
     141        9919 :         nColor = mpnColorTable[ nXclIndex ];
     142        6585 :     else switch( nXclIndex )
     143             :     {
     144             :         case EXC_COLOR_WINDOWTEXT3:
     145             :         case EXC_COLOR_WINDOWTEXT:
     146        5628 :         case EXC_COLOR_CHWINDOWTEXT:    nColor = mnWindowText;  break;
     147             :         case EXC_COLOR_WINDOWBACK3:
     148             :         case EXC_COLOR_WINDOWBACK:
     149         551 :         case EXC_COLOR_CHWINDOWBACK:    nColor = mnWindowBack;  break;
     150           0 :         case EXC_COLOR_BUTTONBACK:      nColor = mnFaceColor;   break;
     151          10 :         case EXC_COLOR_CHBORDERAUTO:    nColor = COL_BLACK;     break;  // TODO: really always black?
     152           0 :         case EXC_COLOR_NOTEBACK:        nColor = mnNoteBack;    break;
     153           0 :         case EXC_COLOR_NOTETEXT:        nColor = mnNoteText;    break;
     154         396 :         case EXC_COLOR_FONTAUTO:        nColor = COL_AUTO;      break;
     155             :         default:
     156             :             OSL_TRACE( "XclDefaultPalette::GetDefColorData - unknown default color index: %d", nXclIndex );
     157           0 :             nColor = COL_AUTO;
     158             :     }
     159       16504 :     return nColor;
     160             : }
     161             : 
     162             : // Font Data ==================================================================
     163             : 
     164             : namespace Awt              = ::com::sun::star::awt;
     165             : namespace AwtFontFamily    = Awt::FontFamily;
     166             : namespace AwtFontUnderline = Awt::FontUnderline;
     167             : namespace AwtFontStrikeout = Awt::FontStrikeout;
     168             : 
     169        2074 : XclFontData::XclFontData()
     170             : {
     171        2074 :     Clear();
     172        2074 : }
     173             : 
     174         268 : XclFontData::XclFontData( const vcl::Font& rFont )
     175             : {
     176         268 :     Clear();
     177         268 :     FillFromVclFont( rFont );
     178         268 : }
     179             : 
     180         469 : XclFontData::XclFontData( const SvxFont& rFont )
     181             : {
     182         469 :     FillFromSvxFont( rFont );
     183         469 : }
     184             : 
     185        2342 : void XclFontData::Clear()
     186             : {
     187        2342 :     maName.clear();
     188        2342 :     maStyle.clear();
     189        2342 :     maColor.SetColor( COL_AUTO );
     190        2342 :     mnHeight = 0;
     191        2342 :     mnWeight = EXC_FONTWGHT_DONTKNOW;
     192        2342 :     mnEscapem = EXC_FONTESC_NONE;
     193        2342 :     mnFamily = EXC_FONTFAM_SYSTEM;
     194        2342 :     mnCharSet = EXC_FONTCSET_ANSI_LATIN;
     195        2342 :     mnUnderline = EXC_FONTUNDERL_NONE;
     196        2342 :     mbItalic = mbStrikeout = mbOutline = mbShadow = false;
     197        2342 : }
     198             : 
     199         737 : void XclFontData::FillFromVclFont( const vcl::Font& rFont )
     200             : {
     201         737 :     maName = XclTools::GetXclFontName( rFont.GetName() );   // substitute with MS fonts
     202         737 :     maStyle.clear();
     203         737 :     maColor = rFont.GetColor();
     204         737 :     SetScUnderline( rFont.GetUnderline() );
     205         737 :     mnEscapem = EXC_FONTESC_NONE;
     206         737 :     SetScHeight( rFont.GetSize().Height() );
     207         737 :     SetScWeight( rFont.GetWeight() );
     208         737 :     SetScFamily( rFont.GetFamily() );
     209         737 :     SetFontEncoding( rFont.GetCharSet() );
     210         737 :     SetScPosture( rFont.GetItalic() );
     211         737 :     SetScStrikeout( rFont.GetStrikeout() );
     212         737 :     mbOutline = rFont.IsOutline();
     213         737 :     mbShadow = rFont.IsShadow();
     214         737 : }
     215             : 
     216         469 : void XclFontData::FillFromSvxFont( const SvxFont& rFont )
     217             : {
     218         469 :     FillFromVclFont( rFont );
     219         469 :     SetScEscapement( rFont.GetEscapement() );
     220         469 : }
     221             : 
     222             : // *** conversion of VCL/SVX constants *** ------------------------------------
     223             : 
     224        1722 : FontFamily XclFontData::GetScFamily( rtl_TextEncoding eDefTextEnc ) const
     225             : {
     226             :     FontFamily eScFamily;
     227             :     // ! format differs from Windows documentation: family is in lower nibble, pitch unknown
     228        1722 :     switch( mnFamily & 0x0F )
     229             :     {
     230           1 :         case EXC_FONTFAM_ROMAN:         eScFamily = FAMILY_ROMAN;       break;
     231        1258 :         case EXC_FONTFAM_SWISS:         eScFamily = FAMILY_SWISS;       break;
     232          93 :         case EXC_FONTFAM_MODERN:        eScFamily = FAMILY_MODERN;      break;
     233           0 :         case EXC_FONTFAM_SCRIPT:        eScFamily = FAMILY_SCRIPT;      break;
     234           0 :         case EXC_FONTFAM_DECORATIVE:    eScFamily = FAMILY_DECORATIVE;  break;
     235             :         default:
     236             :             eScFamily =
     237           0 :                 ((eDefTextEnc == RTL_TEXTENCODING_APPLE_ROMAN) &&
     238           0 :                 (maName.equalsIgnoreAsciiCase( "Geneva" ) || maName.equalsIgnoreAsciiCase( "Chicago" ))) ?
     239         370 :                 FAMILY_SWISS : FAMILY_DONTKNOW;
     240             :     }
     241        1722 :     return eScFamily;
     242             : }
     243             : 
     244        2560 : rtl_TextEncoding XclFontData::GetFontEncoding() const
     245             : {
     246             :     // convert Windows character set to text encoding identifier
     247        2560 :     return rtl_getTextEncodingFromWindowsCharset( mnCharSet );
     248             : }
     249             : 
     250        1484 : FontItalic XclFontData::GetScPosture() const
     251             : {
     252        1484 :     return mbItalic ? ITALIC_NORMAL : ITALIC_NONE;
     253             : }
     254             : 
     255        2331 : FontWeight XclFontData::GetScWeight() const
     256             : {
     257             :     FontWeight eScWeight;
     258             : 
     259        2331 :     if( !mnWeight )             eScWeight = WEIGHT_DONTKNOW;
     260        2331 :     else if( mnWeight < 150 )   eScWeight = WEIGHT_THIN;
     261        2331 :     else if( mnWeight < 250 )   eScWeight = WEIGHT_ULTRALIGHT;
     262        2331 :     else if( mnWeight < 325 )   eScWeight = WEIGHT_LIGHT;
     263        2331 :     else if( mnWeight < 375 )   eScWeight = WEIGHT_SEMILIGHT;
     264        2331 :     else if( mnWeight < 450 )   eScWeight = WEIGHT_NORMAL;
     265         546 :     else if( mnWeight < 550 )   eScWeight = WEIGHT_MEDIUM;
     266         546 :     else if( mnWeight < 650 )   eScWeight = WEIGHT_SEMIBOLD;
     267         546 :     else if( mnWeight < 750 )   eScWeight = WEIGHT_BOLD;
     268           0 :     else if( mnWeight < 850 )   eScWeight = WEIGHT_ULTRABOLD;
     269           0 :     else                        eScWeight = WEIGHT_BLACK;
     270             : 
     271        2331 :     return eScWeight;
     272             : }
     273             : 
     274        1766 : FontUnderline XclFontData::GetScUnderline() const
     275             : {
     276        1766 :     FontUnderline eScUnderl = UNDERLINE_NONE;
     277        1766 :     switch( mnUnderline )
     278             :     {
     279             :         case EXC_FONTUNDERL_SINGLE:
     280           5 :         case EXC_FONTUNDERL_SINGLE_ACC: eScUnderl = UNDERLINE_SINGLE;  break;
     281             :         case EXC_FONTUNDERL_DOUBLE:
     282           1 :         case EXC_FONTUNDERL_DOUBLE_ACC: eScUnderl = UNDERLINE_DOUBLE;  break;
     283             :     }
     284        1766 :     return eScUnderl;
     285             : }
     286             : 
     287         670 : SvxEscapement XclFontData::GetScEscapement() const
     288             : {
     289         670 :     SvxEscapement eScEscapem = SVX_ESCAPEMENT_OFF;
     290         670 :     switch( mnEscapem )
     291             :     {
     292           0 :         case EXC_FONTESC_SUPER: eScEscapem = SVX_ESCAPEMENT_SUPERSCRIPT;    break;
     293           0 :         case EXC_FONTESC_SUB:   eScEscapem = SVX_ESCAPEMENT_SUBSCRIPT;      break;
     294             :     }
     295         670 :     return eScEscapem;
     296             : }
     297             : 
     298        1484 : FontStrikeout XclFontData::GetScStrikeout() const
     299             : {
     300        1484 :     return mbStrikeout ? STRIKEOUT_SINGLE : STRIKEOUT_NONE;
     301             : }
     302             : 
     303         809 : void XclFontData::SetScHeight( sal_Int32 nTwips )
     304             : {
     305         809 :     mnHeight = static_cast< sal_uInt16 >( ::std::min( nTwips, static_cast<sal_Int32>(0x7FFFL) ) );
     306         809 : }
     307             : 
     308         809 : void XclFontData::SetScFamily( FontFamily eScFamily )
     309             : {
     310         809 :     switch( eScFamily )
     311             :     {
     312          73 :         case FAMILY_DONTKNOW:   mnFamily = EXC_FONTFAM_DONTKNOW;    break;
     313           0 :         case FAMILY_DECORATIVE: mnFamily = EXC_FONTFAM_DECORATIVE;  break;
     314           0 :         case FAMILY_MODERN:     mnFamily = EXC_FONTFAM_MODERN;      break;
     315           0 :         case FAMILY_ROMAN:      mnFamily = EXC_FONTFAM_ROMAN;       break;
     316           0 :         case FAMILY_SCRIPT:     mnFamily = EXC_FONTFAM_SCRIPT;      break;
     317         736 :         case FAMILY_SWISS:      mnFamily = EXC_FONTFAM_SWISS;       break;
     318           0 :         case FAMILY_SYSTEM:     mnFamily = EXC_FONTFAM_SYSTEM;      break;
     319             :         default:
     320             :             OSL_FAIL( "XclFontData::SetScFamily - unknown font family" );
     321           0 :             mnFamily = EXC_FONTFAM_DONTKNOW;
     322             :     }
     323         809 : }
     324             : 
     325         809 : void XclFontData::SetFontEncoding( rtl_TextEncoding eFontEnc )
     326             : {
     327             :     // convert text encoding identifier to Windows character set
     328         809 :     mnCharSet = rtl_getBestWindowsCharsetFromTextEncoding( eFontEnc );
     329         809 : }
     330             : 
     331         753 : void XclFontData::SetScPosture( FontItalic eScPosture )
     332             : {
     333         753 :     mbItalic = (eScPosture == ITALIC_OBLIQUE) || (eScPosture == ITALIC_NORMAL);
     334         753 : }
     335             : 
     336         920 : void XclFontData::SetScWeight( FontWeight eScWeight )
     337             : {
     338         920 :     switch( eScWeight )
     339             :     {
     340           0 :         case WEIGHT_DONTKNOW:   mnWeight = EXC_FONTWGHT_DONTKNOW;   break;
     341           0 :         case WEIGHT_THIN:       mnWeight = EXC_FONTWGHT_THIN;       break;
     342           0 :         case WEIGHT_ULTRALIGHT: mnWeight = EXC_FONTWGHT_ULTRALIGHT; break;
     343           0 :         case WEIGHT_LIGHT:      mnWeight = EXC_FONTWGHT_LIGHT;      break;
     344           0 :         case WEIGHT_SEMILIGHT:  mnWeight = EXC_FONTWGHT_SEMILIGHT;  break;
     345         868 :         case WEIGHT_NORMAL:     mnWeight = EXC_FONTWGHT_NORMAL;     break;
     346           0 :         case WEIGHT_MEDIUM:     mnWeight = EXC_FONTWGHT_MEDIUM;     break;
     347           0 :         case WEIGHT_SEMIBOLD:   mnWeight = EXC_FONTWGHT_SEMIBOLD;   break;
     348          52 :         case WEIGHT_BOLD:       mnWeight = EXC_FONTWGHT_BOLD;       break;
     349           0 :         case WEIGHT_ULTRABOLD:  mnWeight = EXC_FONTWGHT_ULTRABOLD;  break;
     350           0 :         case WEIGHT_BLACK:      mnWeight = EXC_FONTWGHT_BLACK;      break;
     351           0 :         default:                mnWeight = EXC_FONTWGHT_NORMAL;
     352             :     }
     353         920 : }
     354             : 
     355         737 : void XclFontData::SetScUnderline( FontUnderline eScUnderl )
     356             : {
     357         737 :     switch( eScUnderl )
     358             :     {
     359             :         case UNDERLINE_NONE:
     360         735 :         case UNDERLINE_DONTKNOW:    mnUnderline = EXC_FONTUNDERL_NONE;      break;
     361             :         case UNDERLINE_DOUBLE:
     362           1 :         case UNDERLINE_DOUBLEWAVE:  mnUnderline = EXC_FONTUNDERL_DOUBLE;    break;
     363           1 :         default:                    mnUnderline = EXC_FONTUNDERL_SINGLE;
     364             :     }
     365         737 : }
     366             : 
     367         551 : void XclFontData::SetScEscapement( short nScEscapem )
     368             : {
     369         551 :     if( nScEscapem > 0 )
     370           0 :         mnEscapem = EXC_FONTESC_SUPER;
     371         551 :     else if( nScEscapem < 0 )
     372           0 :         mnEscapem = EXC_FONTESC_SUB;
     373             :     else
     374         551 :         mnEscapem = EXC_FONTESC_NONE;
     375         551 : }
     376             : 
     377         737 : void XclFontData::SetScStrikeout( FontStrikeout eScStrikeout )
     378             : {
     379             :     mbStrikeout =
     380         737 :         (eScStrikeout == STRIKEOUT_SINGLE) || (eScStrikeout == STRIKEOUT_DOUBLE) ||
     381        1474 :         (eScStrikeout == STRIKEOUT_BOLD)   || (eScStrikeout == STRIKEOUT_SLASH)  ||
     382         737 :         (eScStrikeout == STRIKEOUT_X);
     383         737 : }
     384             : 
     385             : // *** conversion of API constants *** ----------------------------------------
     386             : 
     387         609 : float XclFontData::GetApiHeight() const
     388             : {
     389         609 :     return static_cast< float >( mnHeight / TWIPS_PER_POINT );
     390             : }
     391             : 
     392           6 : sal_Int16 XclFontData::GetApiFamily() const
     393             : {
     394           6 :     sal_Int16 nApiFamily = AwtFontFamily::DONTKNOW;
     395           6 :     switch( mnFamily )
     396             :     {
     397           0 :         case FAMILY_DECORATIVE: nApiFamily = AwtFontFamily::DECORATIVE; break;
     398           5 :         case FAMILY_MODERN:     nApiFamily = AwtFontFamily::MODERN;     break;
     399           0 :         case FAMILY_ROMAN:      nApiFamily = AwtFontFamily::ROMAN;      break;
     400           0 :         case FAMILY_SCRIPT:     nApiFamily = AwtFontFamily::SCRIPT;     break;
     401           0 :         case FAMILY_SWISS:      nApiFamily = AwtFontFamily::SWISS;      break;
     402           0 :         case FAMILY_SYSTEM:     nApiFamily = AwtFontFamily::SYSTEM;     break;
     403             :     }
     404           6 :     return nApiFamily;
     405             : }
     406             : 
     407           6 : sal_Int16 XclFontData::GetApiFontEncoding() const
     408             : {
     409             :     // API constants are equal to rtl_TextEncoding constants
     410           6 :     return static_cast< sal_Int16 >( GetFontEncoding() );
     411             : }
     412             : 
     413         609 : Awt::FontSlant XclFontData::GetApiPosture() const
     414             : {
     415         609 :     return mbItalic ? Awt::FontSlant_ITALIC : Awt::FontSlant_NONE;
     416             : }
     417             : 
     418         609 : float XclFontData::GetApiWeight() const
     419             : {
     420         609 :     return VCLUnoHelper::ConvertFontWeight( GetScWeight() );
     421             : }
     422             : 
     423         207 : sal_Int16 XclFontData::GetApiUnderline() const
     424             : {
     425         207 :     sal_Int16 nApiUnderl = AwtFontUnderline::NONE;
     426         207 :     switch( mnUnderline )
     427             :     {
     428             :         case EXC_FONTUNDERL_SINGLE:
     429           0 :         case EXC_FONTUNDERL_SINGLE_ACC: nApiUnderl = AwtFontUnderline::SINGLE;  break;
     430             :         case EXC_FONTUNDERL_DOUBLE:
     431           0 :         case EXC_FONTUNDERL_DOUBLE_ACC: nApiUnderl = AwtFontUnderline::DOUBLE;  break;
     432             :     }
     433         207 :     return nApiUnderl;
     434             : }
     435             : 
     436           0 : sal_Int16 XclFontData::GetApiEscapement() const
     437             : {
     438           0 :     sal_Int16 nApiEscapem = 0;
     439           0 :     switch( mnEscapem )
     440             :     {
     441           0 :         case EXC_FONTESC_SUPER: nApiEscapem = 33;   break;
     442           0 :         case EXC_FONTESC_SUB:   nApiEscapem = -33;  break;
     443             :     }
     444           0 :     return nApiEscapem;
     445             : }
     446             : 
     447         207 : sal_Int16 XclFontData::GetApiStrikeout() const
     448             : {
     449         207 :     return mbStrikeout ? AwtFontStrikeout::SINGLE : AwtFontStrikeout::NONE;
     450             : }
     451             : 
     452          95 : void XclFontData::SetApiHeight( float fPoint )
     453             : {
     454          95 :     mnHeight = static_cast< sal_uInt16 >( ::std::min( fPoint * TWIPS_PER_POINT + 0.5, 32767.0 ) );
     455          95 : }
     456             : 
     457           0 : void XclFontData::SetApiFamily( sal_Int16 nApiFamily )
     458             : {
     459           0 :     switch( nApiFamily )
     460             :     {
     461           0 :         case AwtFontFamily::DECORATIVE: mnFamily = FAMILY_DECORATIVE;   break;
     462           0 :         case AwtFontFamily::MODERN:     mnFamily = FAMILY_MODERN;       break;
     463           0 :         case AwtFontFamily::ROMAN:      mnFamily = FAMILY_ROMAN;        break;
     464           0 :         case AwtFontFamily::SCRIPT:     mnFamily = FAMILY_SCRIPT;       break;
     465           0 :         case AwtFontFamily::SWISS:      mnFamily = FAMILY_SWISS;        break;
     466           0 :         case AwtFontFamily::SYSTEM:     mnFamily = FAMILY_SYSTEM;       break;
     467           0 :         default:                        mnFamily = FAMILY_DONTKNOW;
     468             :     }
     469           0 : }
     470             : 
     471          95 : void XclFontData::SetApiPosture( Awt::FontSlant eApiPosture )
     472             : {
     473             :     mbItalic =
     474          95 :         (eApiPosture == Awt::FontSlant_OBLIQUE) ||
     475          94 :         (eApiPosture == Awt::FontSlant_ITALIC) ||
     476         189 :         (eApiPosture == Awt::FontSlant_REVERSE_OBLIQUE) ||
     477          95 :         (eApiPosture == Awt::FontSlant_REVERSE_ITALIC);
     478          95 : }
     479             : 
     480          95 : void XclFontData::SetApiWeight( float fApiWeight )
     481             : {
     482          95 :     SetScWeight( VCLUnoHelper::ConvertFontWeight( fApiWeight ) );
     483          95 : }
     484             : 
     485          95 : void XclFontData::SetApiUnderline( sal_Int16 nApiUnderl )
     486             : {
     487          95 :     switch( nApiUnderl )
     488             :     {
     489             :         case AwtFontUnderline::NONE:
     490          94 :         case AwtFontUnderline::DONTKNOW:    mnUnderline = EXC_FONTUNDERL_NONE;      break;
     491             :         case AwtFontUnderline::DOUBLE:
     492           0 :         case AwtFontUnderline::DOUBLEWAVE:  mnUnderline = EXC_FONTUNDERL_DOUBLE;    break;
     493           1 :         default:                            mnUnderline = EXC_FONTUNDERL_SINGLE;
     494             :     }
     495          95 : }
     496             : 
     497          95 : void XclFontData::SetApiEscapement( sal_Int16 nApiEscapem )
     498             : {
     499          95 :     if( nApiEscapem > 0 )
     500           0 :         mnEscapem = EXC_FONTESC_SUPER;
     501          95 :     else if( nApiEscapem < 0 )
     502           0 :         mnEscapem = EXC_FONTESC_SUB;
     503             :     else
     504          95 :         mnEscapem = EXC_FONTESC_NONE;
     505          95 : }
     506             : 
     507          95 : void XclFontData::SetApiStrikeout( sal_Int16 nApiStrikeout )
     508             : {
     509             :     mbStrikeout =
     510          95 :         (nApiStrikeout != AwtFontStrikeout::NONE) &&
     511          95 :         (nApiStrikeout != AwtFontStrikeout::DONTKNOW);
     512          95 : }
     513             : 
     514         696 : bool operator==( const XclFontData& rLeft, const XclFontData& rRight )
     515             : {
     516             :     return
     517        1392 :         (rLeft.mnHeight    == rRight.mnHeight)    &&
     518        1392 :         (rLeft.mnWeight    == rRight.mnWeight)    &&
     519        1392 :         (rLeft.mnUnderline == rRight.mnUnderline) &&
     520        1392 :         (rLeft.maColor     == rRight.maColor)     &&
     521        1392 :         (rLeft.mnEscapem   == rRight.mnEscapem)   &&
     522        1392 :         (rLeft.mnFamily    == rRight.mnFamily)    &&
     523        1392 :         (rLeft.mnCharSet   == rRight.mnCharSet)   &&
     524        1392 :         (rLeft.mbItalic    == rRight.mbItalic)    &&
     525        1392 :         (rLeft.mbStrikeout == rRight.mbStrikeout) &&
     526        1392 :         (rLeft.mbOutline   == rRight.mbOutline)   &&
     527        2088 :         (rLeft.mbShadow    == rRight.mbShadow)    &&
     528        1392 :         (rLeft.maName      == rRight.maName);
     529             : }
     530             : 
     531             : namespace {
     532             : 
     533             : /** Property names for common font settings. */
     534             : const sal_Char *const sppcPropNamesChCommon[] =
     535             : {
     536             :     "CharUnderline", "CharStrikeout", "CharColor", "CharContoured", "CharShadowed", 0
     537             : };
     538             : /** Property names for Western font settings. */
     539             : const sal_Char *const sppcPropNamesChWstrn[] =
     540             : {
     541             :     "CharFontName", "CharHeight", "CharPosture", "CharWeight", 0
     542             : };
     543             : /** Property names for Asian font settings. */
     544             : const sal_Char *const sppcPropNamesChAsian[] =
     545             : {
     546             :     "CharFontNameAsian", "CharHeightAsian", "CharPostureAsian", "CharWeightAsian", 0
     547             : };
     548             : /** Property names for Complex font settings. */
     549             : const sal_Char *const sppcPropNamesChCmplx[] =
     550             : {
     551             :     "CharFontNameComplex", "CharHeightComplex", "CharPostureComplex", "CharWeightComplex", 0
     552             : };
     553             : /** Property names for escapement. */
     554             : const sal_Char *const sppcPropNamesChEscapement[] =
     555             : {
     556             :     "CharEscapement", "CharEscapementHeight", 0
     557             : };
     558             : const sal_Int8 EXC_API_ESC_HEIGHT           = 58;   /// Default escapement font height.
     559             : 
     560             : /** Property names for Western font settings without font name. */
     561             : const sal_Char *const *const sppcPropNamesChWstrnNoName = sppcPropNamesChWstrn + 1;
     562             : /** Property names for Asian font settings without font name. */
     563             : const sal_Char *const *const sppcPropNamesChAsianNoName = sppcPropNamesChAsian + 1;
     564             : /** Property names for Complex font settings without font name. */
     565             : const sal_Char *const *const sppcPropNamesChCmplxNoName = sppcPropNamesChCmplx + 1;
     566             : 
     567             : /** Property names for font settings in form controls. */
     568             : const sal_Char *const sppcPropNamesControl[] =
     569             : {
     570             :     "FontName", "FontFamily", "FontCharset", "FontHeight", "FontSlant",
     571             :     "FontWeight", "FontUnderline", "FontStrikeout", "TextColor", 0
     572             : };
     573             : 
     574             : /** Inserts all passed API font settings into the font data object. */
     575          95 : void lclSetApiFontSettings( XclFontData& rFontData,
     576             :         const OUString& rApiFontName, float fApiHeight, float fApiWeight,
     577             :         Awt::FontSlant eApiPosture, sal_Int16 nApiUnderl, sal_Int16 nApiStrikeout )
     578             : {
     579          95 :     rFontData.maName = XclTools::GetXclFontName( rApiFontName );
     580          95 :     rFontData.SetApiHeight( fApiHeight );
     581          95 :     rFontData.SetApiWeight( fApiWeight );
     582          95 :     rFontData.SetApiPosture( eApiPosture );
     583          95 :     rFontData.SetApiUnderline( nApiUnderl );
     584          95 :     rFontData.SetApiStrikeout( nApiStrikeout );
     585          95 : }
     586             : 
     587             : /** Writes script dependent properties to a font property set helper. */
     588         603 : void lclWriteChartFont( ScfPropertySet& rPropSet,
     589             :         ScfPropSetHelper& rHlpName, ScfPropSetHelper& rHlpNoName,
     590             :         const XclFontData& rFontData, bool bHasFontName )
     591             : {
     592             :     // select the font helper
     593         603 :     ScfPropSetHelper& rPropSetHlp = bHasFontName ? rHlpName : rHlpNoName;
     594             :     // initialize the font helper (must be called before writing any properties)
     595         603 :     rPropSetHlp.InitializeWrite();
     596             :     // write font name
     597         603 :     if( bHasFontName )
     598         229 :         rPropSetHlp << rFontData.maName;
     599             :     // write remaining properties
     600         603 :     rPropSetHlp << rFontData.GetApiHeight() << rFontData.GetApiPosture() << rFontData.GetApiWeight();
     601             :     // write properties to property set
     602         603 :     rPropSetHlp.WriteToPropertySet( rPropSet );
     603         603 : }
     604             : 
     605             : } // namespace
     606             : 
     607         156 : XclFontPropSetHelper::XclFontPropSetHelper() :
     608             :     maHlpChCommon( sppcPropNamesChCommon ),
     609             :     maHlpChWstrn( sppcPropNamesChWstrn ),
     610             :     maHlpChAsian( sppcPropNamesChAsian ),
     611             :     maHlpChCmplx( sppcPropNamesChCmplx ),
     612             :     maHlpChWstrnNoName( sppcPropNamesChWstrnNoName ),
     613             :     maHlpChAsianNoName( sppcPropNamesChAsianNoName ),
     614             :     maHlpChCmplxNoName( sppcPropNamesChCmplxNoName ),
     615             :     maHlpChEscapement( sppcPropNamesChEscapement ),
     616         156 :     maHlpControl( sppcPropNamesControl )
     617             : {
     618         156 : }
     619             : 
     620          95 : void XclFontPropSetHelper::ReadFontProperties( XclFontData& rFontData,
     621             :         const ScfPropertySet& rPropSet, XclFontPropSetType eType, sal_Int16 nScript )
     622             : {
     623          95 :     switch( eType )
     624             :     {
     625             :         case EXC_FONTPROPSET_CHART:
     626             :         {
     627          95 :             OUString aApiFontName;
     628             :             float fApiHeight, fApiWeight;
     629          95 :             sal_Int16 nApiUnderl = 0, nApiStrikeout = 0;
     630             :             Awt::FontSlant eApiPosture;
     631             : 
     632             :             // read script type dependent properties
     633          95 :             ScfPropSetHelper& rPropSetHlp = GetChartHelper( nScript );
     634          95 :             rPropSetHlp.ReadFromPropertySet( rPropSet );
     635          95 :             rPropSetHlp >> aApiFontName >> fApiHeight >> eApiPosture >> fApiWeight;
     636             :             // read common properties
     637          95 :             maHlpChCommon.ReadFromPropertySet( rPropSet );
     638          95 :             maHlpChCommon   >> nApiUnderl
     639          95 :                             >> nApiStrikeout
     640         190 :                             >> rFontData.maColor
     641         190 :                             >> rFontData.mbOutline
     642         190 :                             >> rFontData.mbShadow;
     643             : 
     644             :             // convert API property values to Excel settings
     645             :             lclSetApiFontSettings( rFontData, aApiFontName,
     646          95 :                 fApiHeight, fApiWeight, eApiPosture, nApiUnderl, nApiStrikeout );
     647             : 
     648             :             // font escapement
     649          95 :             sal_Int16 nApiEscapement = 0;
     650          95 :             sal_Int8 nApiEscHeight = 0;
     651          95 :             maHlpChEscapement.ReadFromPropertySet( rPropSet );
     652          95 :             maHlpChEscapement.ReadFromPropertySet( rPropSet );
     653          95 :             maHlpChEscapement.ReadFromPropertySet( rPropSet );
     654          95 :             maHlpChEscapement >> nApiEscapement >> nApiEscHeight;
     655          95 :             rFontData.SetApiEscapement( nApiEscapement );
     656             :         }
     657          95 :         break;
     658             : 
     659             :         case EXC_FONTPROPSET_CONTROL:
     660             :         {
     661           0 :             OUString aApiFontName;
     662             :             float fApiHeight, fApiWeight;
     663             :             sal_Int16 nApiFamily, nApiCharSet, nApiPosture, nApiUnderl, nApiStrikeout;
     664             : 
     665             :             // read font properties
     666           0 :             maHlpControl.ReadFromPropertySet( rPropSet );
     667           0 :             maHlpControl    >> aApiFontName
     668           0 :                             >> nApiFamily
     669           0 :                             >> nApiCharSet
     670           0 :                             >> fApiHeight
     671           0 :                             >> nApiPosture
     672           0 :                             >> fApiWeight
     673           0 :                             >> nApiUnderl
     674           0 :                             >> nApiStrikeout
     675           0 :                             >> rFontData.maColor;
     676             : 
     677             :             // convert API property values to Excel settings
     678           0 :             Awt::FontSlant eApiPosture = static_cast< Awt::FontSlant >( nApiPosture );
     679             :             lclSetApiFontSettings( rFontData, aApiFontName,
     680           0 :                 fApiHeight, fApiWeight, eApiPosture, nApiUnderl, nApiStrikeout );
     681           0 :             rFontData.SetApiFamily( nApiFamily );
     682           0 :             rFontData.SetFontEncoding( nApiCharSet );
     683             :         }
     684           0 :         break;
     685             :     }
     686          95 : }
     687             : 
     688         207 : void XclFontPropSetHelper::WriteFontProperties(
     689             :         ScfPropertySet& rPropSet, XclFontPropSetType eType,
     690             :         const XclFontData& rFontData, bool bHasWstrn, bool bHasAsian, bool bHasCmplx,
     691             :         const Color* pFontColor )
     692             : {
     693         207 :     switch( eType )
     694             :     {
     695             :         case EXC_FONTPROPSET_CHART:
     696             :         {
     697             :             // write common properties
     698         201 :             maHlpChCommon.InitializeWrite();
     699         201 :             const Color& rColor = pFontColor ? *pFontColor : rFontData.maColor;
     700         402 :             maHlpChCommon   << rFontData.GetApiUnderline()
     701         603 :                             << rFontData.GetApiStrikeout()
     702         201 :                             << rColor
     703         402 :                             << rFontData.mbOutline
     704         402 :                             << rFontData.mbShadow;
     705         201 :             maHlpChCommon.WriteToPropertySet( rPropSet );
     706             : 
     707             :             // write script type dependent properties
     708         201 :             lclWriteChartFont( rPropSet, maHlpChWstrn, maHlpChWstrnNoName, rFontData, bHasWstrn );
     709         201 :             lclWriteChartFont( rPropSet, maHlpChAsian, maHlpChAsianNoName, rFontData, bHasAsian );
     710         201 :             lclWriteChartFont( rPropSet, maHlpChCmplx, maHlpChCmplxNoName, rFontData, bHasCmplx );
     711             : 
     712             :             // font escapement
     713         201 :             if( rFontData.GetScEscapement() != SVX_ESCAPEMENT_OFF )
     714             :             {
     715           0 :                 maHlpChEscapement.InitializeWrite();
     716           0 :                 maHlpChEscapement << rFontData.GetApiEscapement() << EXC_API_ESC_HEIGHT;
     717           0 :                 maHlpChEscapement.WriteToPropertySet( rPropSet );
     718             :             }
     719             :         }
     720         201 :         break;
     721             : 
     722             :         case EXC_FONTPROPSET_CONTROL:
     723             :         {
     724           6 :             maHlpControl.InitializeWrite();
     725           6 :             maHlpControl    << rFontData.maName
     726          18 :                             << rFontData.GetApiFamily()
     727          18 :                             << rFontData.GetApiFontEncoding()
     728          18 :                             << static_cast< sal_Int16 >( rFontData.GetApiHeight() + 0.5 )
     729          18 :                             << rFontData.GetApiPosture()
     730          18 :                             << rFontData.GetApiWeight()
     731          18 :                             << rFontData.GetApiUnderline()
     732          18 :                             << rFontData.GetApiStrikeout()
     733          12 :                             << rFontData.maColor;
     734           6 :             maHlpControl.WriteToPropertySet( rPropSet );
     735             :         }
     736           6 :         break;
     737             :     }
     738         207 : }
     739             : 
     740          95 : ScfPropSetHelper& XclFontPropSetHelper::GetChartHelper( sal_Int16 nScript )
     741             : {
     742             :     namespace ApiScriptType = ::com::sun::star::i18n::ScriptType;
     743          95 :     switch( nScript )
     744             :     {
     745          95 :         case ApiScriptType::LATIN:      return maHlpChWstrn;
     746           0 :         case ApiScriptType::ASIAN:      return maHlpChAsian;
     747           0 :         case ApiScriptType::COMPLEX:    return maHlpChCmplx;
     748             :         default:    OSL_FAIL( "XclFontPropSetHelper::GetChartHelper - unknown script type" );
     749             :     }
     750           0 :     return maHlpChWstrn;
     751             : }
     752             : 
     753             : // Number formats =============================================================
     754             : 
     755             : namespace {
     756             : 
     757             : /** Special number format index describing a reused format. */
     758             : const NfIndexTableOffset PRV_NF_INDEX_REUSE = NF_INDEX_TABLE_ENTRIES;
     759             : 
     760             : /** German primary language not defined, LANGUAGE_GERMAN belongs to Germany. */
     761             : const LanguageType PRV_LANGUAGE_GERMAN_PRIM = LANGUAGE_GERMAN & LANGUAGE_MASK_PRIMARY;
     762             : /** French primary language not defined, LANGUAGE_FRENCH belongs to France. */
     763             : const LanguageType PRV_LANGUAGE_FRENCH_PRIM = LANGUAGE_FRENCH & LANGUAGE_MASK_PRIMARY;
     764             : /** Parent language identifier for Asian languages. */
     765             : const LanguageType PRV_LANGUAGE_ASIAN_PRIM = LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY;
     766             : 
     767             : /** Stores the number format used in Calc for an Excel built-in number format. */
     768             : struct XclBuiltInFormat
     769             : {
     770             :     sal_uInt16          mnXclNumFmt;    /// Excel built-in index.
     771             :     const sal_Char*     mpFormat;       /// Format string, may be 0 (meOffset used then).
     772             :     NfIndexTableOffset  meOffset;       /// SvNumberFormatter format index, if mpFormat==0.
     773             :     sal_uInt16          mnXclReuseFmt;  /// Use this Excel format, if meOffset==PRV_NF_INDEX_REUSE.
     774             : };
     775             : 
     776             : /** Defines a literal Excel built-in number format. */
     777             : #define EXC_NUMFMT_STRING( nXclNumFmt, pcUtf8 ) \
     778             :     { nXclNumFmt, pcUtf8, NF_NUMBER_STANDARD, 0 }
     779             : 
     780             : /** Defines an Excel built-in number format that maps to an own built-in format. */
     781             : #define EXC_NUMFMT_OFFSET( nXclNumFmt, eOffset ) \
     782             :     { nXclNumFmt, 0, eOffset, 0 }
     783             : 
     784             : /** Defines an Excel built-in number format that is the same as the specified. */
     785             : #define EXC_NUMFMT_REUSE( nXclNumFmt, nXclReuse ) \
     786             :     { nXclNumFmt, 0, PRV_NF_INDEX_REUSE, nXclReuse }
     787             : 
     788             : /** Terminates an Excel built-in number format table. */
     789             : #define EXC_NUMFMT_ENDTABLE() \
     790             :     { EXC_FORMAT_NOTFOUND, 0, NF_NUMBER_STANDARD, 0 }
     791             : 
     792             : // Currency unit characters
     793             : #define UTF8_BAHT       "\340\270\277"
     794             : #define UTF8_EURO       "\342\202\254"
     795             : #define UTF8_POUND_UK   "\302\243"
     796             : #define UTF8_SHEQEL     "\342\202\252"
     797             : #define UTF8_WON        "\357\277\246"
     798             : #define UTF8_YEN_CS     "\357\277\245"
     799             : #define UTF8_YEN_JP     "\302\245"
     800             : 
     801             : // Japanese/Chinese date/time characters
     802             : #define UTF8_CJ_YEAR    "\345\271\264"
     803             : #define UTF8_CJ_MON     "\346\234\210"
     804             : #define UTF8_CJ_DAY     "\346\227\245"
     805             : #define UTF8_CJ_HOUR    "\346\231\202"
     806             : #define UTF8_CJ_MIN     "\345\210\206"
     807             : #define UTF8_CJ_SEC     "\347\247\222"
     808             : 
     809             : // Chinese Simplified date/time characters
     810             : #define UTF8_CS_HOUR    "\346\227\266"
     811             : 
     812             : // Korean date/time characters
     813             : #define UTF8_KO_YEAR    "\353\205\204"
     814             : #define UTF8_KO_MON     "\354\233\224"
     815             : #define UTF8_KO_DAY     "\354\235\274"
     816             : #define UTF8_KO_HOUR    "\354\213\234"
     817             : #define UTF8_KO_MIN     "\353\266\204"
     818             : #define UTF8_KO_SEC     "\354\264\210"
     819             : 
     820             : /** Default number format table. Last parent of all other tables, used for unknown languages. */
     821             : static const XclBuiltInFormat spBuiltInFormats_DONTKNOW[] =
     822             : {
     823             :     EXC_NUMFMT_OFFSET(   0, NF_NUMBER_STANDARD ),       // General
     824             :     EXC_NUMFMT_OFFSET(   1, NF_NUMBER_INT ),            // 0
     825             :     EXC_NUMFMT_OFFSET(   2, NF_NUMBER_DEC2 ),           // 0.00
     826             :     EXC_NUMFMT_OFFSET(   3, NF_NUMBER_1000INT ),        // #,##0
     827             :     EXC_NUMFMT_OFFSET(   4, NF_NUMBER_1000DEC2 ),       // #,##0.00
     828             :     // 5...8 contained in file
     829             :     EXC_NUMFMT_OFFSET(   9, NF_PERCENT_INT ),           // 0%
     830             :     EXC_NUMFMT_OFFSET(  10, NF_PERCENT_DEC2 ),          // 0.00%
     831             :     EXC_NUMFMT_OFFSET(  11, NF_SCIENTIFIC_000E00 ),     // 0.00E+00
     832             :     EXC_NUMFMT_OFFSET(  12, NF_FRACTION_1 ),            // # ?/?
     833             :     EXC_NUMFMT_OFFSET(  13, NF_FRACTION_2 ),            // # ??/??
     834             : 
     835             :     // 14...22 date and time formats
     836             :     EXC_NUMFMT_OFFSET(  14, NF_DATE_SYS_DDMMYYYY ),
     837             :     EXC_NUMFMT_OFFSET(  15, NF_DATE_SYS_DMMMYY ),
     838             :     EXC_NUMFMT_OFFSET(  16, NF_DATE_SYS_DDMMM ),
     839             :     EXC_NUMFMT_OFFSET(  17, NF_DATE_SYS_MMYY ),
     840             :     EXC_NUMFMT_OFFSET(  18, NF_TIME_HHMMAMPM ),
     841             :     EXC_NUMFMT_OFFSET(  19, NF_TIME_HHMMSSAMPM ),
     842             :     EXC_NUMFMT_OFFSET(  20, NF_TIME_HHMM ),
     843             :     EXC_NUMFMT_OFFSET(  21, NF_TIME_HHMMSS ),
     844             :     EXC_NUMFMT_OFFSET(  22, NF_DATETIME_SYSTEM_SHORT_HHMM ),
     845             : 
     846             :     // 23...36 international formats
     847             :     EXC_NUMFMT_REUSE(   23, 0 ),
     848             :     EXC_NUMFMT_REUSE(   24, 0 ),
     849             :     EXC_NUMFMT_REUSE(   25, 0 ),
     850             :     EXC_NUMFMT_REUSE(   26, 0 ),
     851             :     EXC_NUMFMT_REUSE(   27, 14 ),
     852             :     EXC_NUMFMT_REUSE(   28, 14 ),
     853             :     EXC_NUMFMT_REUSE(   29, 14 ),
     854             :     EXC_NUMFMT_REUSE(   30, 14 ),
     855             :     EXC_NUMFMT_REUSE(   31, 14 ),
     856             :     EXC_NUMFMT_REUSE(   32, 21 ),
     857             :     EXC_NUMFMT_REUSE(   33, 21 ),
     858             :     EXC_NUMFMT_REUSE(   34, 21 ),
     859             :     EXC_NUMFMT_REUSE(   35, 21 ),
     860             :     EXC_NUMFMT_REUSE(   36, 14 ),
     861             : 
     862             :     // 37...44 accounting formats
     863             :     // 41...44 contained in file
     864             :     EXC_NUMFMT_STRING(  37, "#,##0;-#,##0" ),
     865             :     EXC_NUMFMT_STRING(  38, "#,##0;[RED]-#,##0" ),
     866             :     EXC_NUMFMT_STRING(  39, "#,##0.00;-#,##0.00" ),
     867             :     EXC_NUMFMT_STRING(  40, "#,##0.00;[RED]-#,##0.00" ),
     868             : 
     869             :     // 45...49 more special formats
     870             :     EXC_NUMFMT_STRING(  45, "mm:ss" ),
     871             :     EXC_NUMFMT_STRING(  46, "[h]:mm:ss" ),
     872             :     EXC_NUMFMT_STRING(  47, "mm:ss.0" ),
     873             :     EXC_NUMFMT_STRING(  48, "##0.0E+0" ),
     874             :     EXC_NUMFMT_OFFSET(  49, NF_TEXT ),
     875             : 
     876             :     // 50...81 international formats
     877             :     EXC_NUMFMT_REUSE(   50, 14 ),
     878             :     EXC_NUMFMT_REUSE(   51, 14 ),
     879             :     EXC_NUMFMT_REUSE(   52, 14 ),
     880             :     EXC_NUMFMT_REUSE(   53, 14 ),
     881             :     EXC_NUMFMT_REUSE(   54, 14 ),
     882             :     EXC_NUMFMT_REUSE(   55, 14 ),
     883             :     EXC_NUMFMT_REUSE(   56, 14 ),
     884             :     EXC_NUMFMT_REUSE(   57, 14 ),
     885             :     EXC_NUMFMT_REUSE(   58, 14 ),
     886             :     EXC_NUMFMT_REUSE(   59, 1 ),
     887             :     EXC_NUMFMT_REUSE(   60, 2 ),
     888             :     EXC_NUMFMT_REUSE(   61, 3 ),
     889             :     EXC_NUMFMT_REUSE(   62, 4 ),
     890             :     EXC_NUMFMT_REUSE(   67, 9 ),
     891             :     EXC_NUMFMT_REUSE(   68, 10 ),
     892             :     EXC_NUMFMT_REUSE(   69, 12 ),
     893             :     EXC_NUMFMT_REUSE(   70, 13 ),
     894             :     EXC_NUMFMT_REUSE(   71, 14 ),
     895             :     EXC_NUMFMT_REUSE(   72, 14 ),
     896             :     EXC_NUMFMT_REUSE(   73, 15 ),
     897             :     EXC_NUMFMT_REUSE(   74, 16 ),
     898             :     EXC_NUMFMT_REUSE(   75, 17 ),
     899             :     EXC_NUMFMT_REUSE(   76, 20 ),
     900             :     EXC_NUMFMT_REUSE(   77, 21 ),
     901             :     EXC_NUMFMT_REUSE(   78, 22 ),
     902             :     EXC_NUMFMT_REUSE(   79, 45 ),
     903             :     EXC_NUMFMT_REUSE(   80, 46 ),
     904             :     EXC_NUMFMT_REUSE(   81, 47 ),
     905             : 
     906             :     // 82...163 not used, must not occur in a file (Excel may crash)
     907             : 
     908             :     EXC_NUMFMT_ENDTABLE()
     909             : };
     910             : 
     911             : // ENGLISH --------------------------------------------------------------------
     912             : 
     913             : /** Base table for English locales. */
     914             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH[] =
     915             : {
     916             :     EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
     917             :     EXC_NUMFMT_STRING(  16, "DD-MMM" ),
     918             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
     919             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
     920             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
     921             :     EXC_NUMFMT_STRING(  22, "DD/MM/YYYY hh:mm" ),
     922             :     EXC_NUMFMT_ENDTABLE()
     923             : };
     924             : 
     925             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_UK[] =
     926             : {
     927             :     EXC_NUMFMT_STRING(  63, UTF8_POUND_UK "#,##0;-" UTF8_POUND_UK "#,##0" ),
     928             :     EXC_NUMFMT_STRING(  64, UTF8_POUND_UK "#,##0;[RED]-" UTF8_POUND_UK "#,##0" ),
     929             :     EXC_NUMFMT_STRING(  65, UTF8_POUND_UK "#,##0.00;-" UTF8_POUND_UK "#,##0.00" ),
     930             :     EXC_NUMFMT_STRING(  66, UTF8_POUND_UK "#,##0.00;[RED]-" UTF8_POUND_UK "#,##0.00" ),
     931             :     EXC_NUMFMT_ENDTABLE()
     932             : };
     933             : 
     934             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_EIRE[] =
     935             : {
     936             :     EXC_NUMFMT_STRING(  63, UTF8_EURO "#,##0;-" UTF8_EURO "#,##0" ),
     937             :     EXC_NUMFMT_STRING(  64, UTF8_EURO "#,##0;[RED]-" UTF8_EURO "#,##0" ),
     938             :     EXC_NUMFMT_STRING(  65, UTF8_EURO "#,##0.00;-" UTF8_EURO "#,##0.00" ),
     939             :     EXC_NUMFMT_STRING(  66, UTF8_EURO "#,##0.00;[RED]-" UTF8_EURO "#,##0.00" ),
     940             :     EXC_NUMFMT_ENDTABLE()
     941             : };
     942             : 
     943             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_US[] =
     944             : {
     945             :     EXC_NUMFMT_STRING(  14, "M/D/YYYY" ),
     946             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
     947             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
     948             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
     949             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
     950             :     EXC_NUMFMT_STRING(  22, "M/D/YYYY h:mm" ),
     951             :     EXC_NUMFMT_STRING(  37, "#,##0_);(#,##0)" ),
     952             :     EXC_NUMFMT_STRING(  38, "#,##0_);[RED](#,##0)" ),
     953             :     EXC_NUMFMT_STRING(  39, "#,##0.00_);(#,##0.00)" ),
     954             :     EXC_NUMFMT_STRING(  40, "#,##0.00_);[RED](#,##0.00)" ),
     955             :     EXC_NUMFMT_STRING(  63, "$#,##0_);($#,##0)" ),
     956             :     EXC_NUMFMT_STRING(  64, "$#,##0_);[RED]($#,##0)" ),
     957             :     EXC_NUMFMT_STRING(  65, "$#,##0.00_);($#,##0.00)" ),
     958             :     EXC_NUMFMT_STRING(  66, "$#,##0.00_);[RED]($#,##0.00)" ),
     959             :     EXC_NUMFMT_ENDTABLE()
     960             : };
     961             : 
     962             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_CAN[] =
     963             : {
     964             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
     965             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
     966             :     EXC_NUMFMT_STRING(  22, "DD/MM/YYYY h:mm" ),
     967             :     EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
     968             :     EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
     969             :     EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
     970             :     EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
     971             :     EXC_NUMFMT_ENDTABLE()
     972             : };
     973             : 
     974             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_AUS[] =
     975             : {
     976             :     EXC_NUMFMT_STRING(  14, "D/MM/YYYY" ),
     977             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
     978             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
     979             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
     980             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
     981             :     EXC_NUMFMT_STRING(  22, "D/MM/YYYY h:mm" ),
     982             :     EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
     983             :     EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
     984             :     EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
     985             :     EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
     986             :     EXC_NUMFMT_ENDTABLE()
     987             : };
     988             : 
     989             : static const XclBuiltInFormat spBuiltInFormats_ENGLISH_SAFRICA[] =
     990             : {
     991             :     EXC_NUMFMT_STRING(  14, "YYYY/MM/DD" ),
     992             :     EXC_NUMFMT_OFFSET(  18, NF_TIME_HHMMAMPM ),
     993             :     EXC_NUMFMT_OFFSET(  19, NF_TIME_HHMMSSAMPM ),
     994             :     EXC_NUMFMT_STRING(  22, "YYYY/MM/DD hh:mm" ),
     995             :     EXC_NUMFMT_STRING(  63, "\\R #,##0;\\R -#,##0" ),
     996             :     EXC_NUMFMT_STRING(  64, "\\R #,##0;[RED]\\R -#,##0" ),
     997             :     EXC_NUMFMT_STRING(  65, "\\R #,##0.00;\\R -#,##0.00" ),
     998             :     EXC_NUMFMT_STRING(  66, "\\R #,##0.00;[RED]\\R -#,##0.00" ),
     999             :     EXC_NUMFMT_ENDTABLE()
    1000             : };
    1001             : 
    1002             : // FRENCH ---------------------------------------------------------------------
    1003             : 
    1004             : /** Base table for French locales. */
    1005             : static const XclBuiltInFormat spBuiltInFormats_FRENCH[] =
    1006             : {
    1007             :     EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
    1008             :     EXC_NUMFMT_STRING(  16, "DD-MMM" ),
    1009             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1010             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1011             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1012             :     EXC_NUMFMT_ENDTABLE()
    1013             : };
    1014             : 
    1015             : static const XclBuiltInFormat spBuiltInFormats_FRENCH_FRANCE[] =
    1016             : {
    1017             :     EXC_NUMFMT_STRING(  22, "DD/MM/YYYY hh:mm" ),
    1018             :     EXC_NUMFMT_STRING(  37, "#,##0\\ _" UTF8_EURO ";-#,##0\\ _" UTF8_EURO ),
    1019             :     EXC_NUMFMT_STRING(  38, "#,##0\\ _" UTF8_EURO ";[RED]-#,##0\\ _" UTF8_EURO ),
    1020             :     EXC_NUMFMT_STRING(  39, "#,##0.00\\ _" UTF8_EURO ";-#,##0.00\\ _" UTF8_EURO ),
    1021             :     EXC_NUMFMT_STRING(  40, "#,##0.00\\ _" UTF8_EURO ";[RED]-#,##0.00\\ _" UTF8_EURO ),
    1022             :     EXC_NUMFMT_STRING(  63, "#,##0\\ " UTF8_EURO ";-#,##0\\ " UTF8_EURO ),
    1023             :     EXC_NUMFMT_STRING(  64, "#,##0\\ " UTF8_EURO ";[RED]-#,##0\\ " UTF8_EURO ),
    1024             :     EXC_NUMFMT_STRING(  65, "#,##0.00\\ " UTF8_EURO ";-#,##0.00\\ " UTF8_EURO ),
    1025             :     EXC_NUMFMT_STRING(  66, "#,##0.00\\ " UTF8_EURO ";[RED]-#,##0.00\\ " UTF8_EURO ),
    1026             :     EXC_NUMFMT_ENDTABLE()
    1027             : };
    1028             : 
    1029             : static const XclBuiltInFormat spBuiltInFormats_FRENCH_CANADIAN[] =
    1030             : {
    1031             :     EXC_NUMFMT_STRING(  22, "YYYY-MM-DD hh:mm" ),
    1032             :     EXC_NUMFMT_STRING(  37, "#,##0\\ _$_-;#,##0\\ _$-" ),
    1033             :     EXC_NUMFMT_STRING(  38, "#,##0\\ _$_-;[RED]#,##0\\ _$-" ),
    1034             :     EXC_NUMFMT_STRING(  39, "#,##0.00\\ _$_-;#,##0.00\\ _$-" ),
    1035             :     EXC_NUMFMT_STRING(  40, "#,##0.00\\ _$_-;[RED]#,##0.00\\ _$-" ),
    1036             :     EXC_NUMFMT_STRING(  63, "#,##0\\ $_-;#,##0\\ $-" ),
    1037             :     EXC_NUMFMT_STRING(  64, "#,##0\\ $_-;[RED]#,##0\\ $-" ),
    1038             :     EXC_NUMFMT_STRING(  65, "#,##0.00\\ $_-;#,##0.00\\ $-" ),
    1039             :     EXC_NUMFMT_STRING(  66, "#,##0.00\\ $_-;[RED]#,##0.00\\ $-" ),
    1040             :     EXC_NUMFMT_ENDTABLE()
    1041             : };
    1042             : 
    1043             : static const XclBuiltInFormat spBuiltInFormats_FRENCH_SWISS[] =
    1044             : {
    1045             :     EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
    1046             :     EXC_NUMFMT_STRING(  16, "DD.MMM" ),
    1047             :     EXC_NUMFMT_STRING(  17, "MMM.YY" ),
    1048             :     EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
    1049             :     EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
    1050             :     EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
    1051             :     EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
    1052             :     EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
    1053             :     EXC_NUMFMT_ENDTABLE()
    1054             : };
    1055             : 
    1056             : static const XclBuiltInFormat spBuiltInFormats_FRENCH_BELGIAN[] =
    1057             : {
    1058             :     EXC_NUMFMT_STRING(  14, "D/MM/YYYY" ),
    1059             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
    1060             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
    1061             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
    1062             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
    1063             :     EXC_NUMFMT_STRING(  22, "D/MM/YYYY h:mm" ),
    1064             :     EXC_NUMFMT_ENDTABLE()
    1065             : };
    1066             : 
    1067             : // GERMAN ---------------------------------------------------------------------
    1068             : 
    1069             : /** Base table for German locales. */
    1070             : static const XclBuiltInFormat spBuiltInFormats_GERMAN[] =
    1071             : {
    1072             :     EXC_NUMFMT_STRING(  15, "DD. MMM YY" ),
    1073             :     EXC_NUMFMT_STRING(  16, "DD. MMM" ),
    1074             :     EXC_NUMFMT_STRING(  17, "MMM YY" ),
    1075             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1076             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1077             :     EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
    1078             :     EXC_NUMFMT_ENDTABLE()
    1079             : };
    1080             : 
    1081             : static const XclBuiltInFormat spBuiltInFormats_GERMAN_GERMANY[] =
    1082             : {
    1083             :     EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
    1084             :     EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
    1085             :     EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
    1086             :     EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" UTF8_EURO ),
    1087             :     EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
    1088             :     EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
    1089             :     EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
    1090             :     EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO ),
    1091             :     EXC_NUMFMT_ENDTABLE()
    1092             : };
    1093             : 
    1094             : static const XclBuiltInFormat spBuiltInFormats_GERMAN_AUSTRIAN[] =
    1095             : {
    1096             :     EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
    1097             :     EXC_NUMFMT_STRING(  16, "DD.MMM" ),
    1098             :     EXC_NUMFMT_STRING(  17, "MMM.YY" ),
    1099             :     EXC_NUMFMT_STRING(  63, UTF8_EURO " #,##0;-" UTF8_EURO " #,##0" ),
    1100             :     EXC_NUMFMT_STRING(  64, UTF8_EURO " #,##0;[RED]-" UTF8_EURO " #,##0" ),
    1101             :     EXC_NUMFMT_STRING(  65, UTF8_EURO " #,##0.00;-" UTF8_EURO " #,##0.00" ),
    1102             :     EXC_NUMFMT_STRING(  66, UTF8_EURO " #,##0.00;[RED]-" UTF8_EURO " #,##0.00" ),
    1103             :     EXC_NUMFMT_ENDTABLE()
    1104             : };
    1105             : 
    1106             : static const XclBuiltInFormat spBuiltInFormats_GERMAN_SWISS[] =
    1107             : {
    1108             :     EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
    1109             :     EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
    1110             :     EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
    1111             :     EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
    1112             :     EXC_NUMFMT_ENDTABLE()
    1113             : };
    1114             : 
    1115             : static const XclBuiltInFormat spBuiltInFormats_GERMAN_LUXEMBOURG[] =
    1116             : {
    1117             :     EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
    1118             :     EXC_NUMFMT_STRING(  16, "DD.MMM" ),
    1119             :     EXC_NUMFMT_STRING(  17, "MMM.YY" ),
    1120             :     EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
    1121             :     EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
    1122             :     EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
    1123             :     EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" UTF8_EURO ),
    1124             :     EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
    1125             :     EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
    1126             :     EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
    1127             :     EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO ),
    1128             :     EXC_NUMFMT_ENDTABLE()
    1129             : };
    1130             : 
    1131             : static const XclBuiltInFormat spBuiltInFormats_GERMAN_LIECHTENSTEIN[] =
    1132             : {
    1133             :     EXC_NUMFMT_STRING(  63, "\"CHF \"#,##0;\"CHF \"-#,##0" ),
    1134             :     EXC_NUMFMT_STRING(  64, "\"CHF \"#,##0;[RED]\"CHF \"-#,##0" ),
    1135             :     EXC_NUMFMT_STRING(  65, "\"CHF \"#,##0.00;\"CHF \"-#,##0.00" ),
    1136             :     EXC_NUMFMT_STRING(  66, "\"CHF \"#,##0.00;[RED]\"CHF \"-#,##0.00" ),
    1137             :     EXC_NUMFMT_ENDTABLE()
    1138             : };
    1139             : 
    1140             : // ITALIAN --------------------------------------------------------------------
    1141             : 
    1142             : static const XclBuiltInFormat spBuiltInFormats_ITALIAN_ITALY[] =
    1143             : {
    1144             :     EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
    1145             :     EXC_NUMFMT_STRING(  16, "DD-MMM" ),
    1146             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1147             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1148             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1149             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
    1150             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
    1151             :     EXC_NUMFMT_STRING(  22, "DD/MM/YYYY h:mm" ),
    1152             :     EXC_NUMFMT_STRING(  63, UTF8_EURO " #,##0;-" UTF8_EURO " #,##0" ),
    1153             :     EXC_NUMFMT_STRING(  64, UTF8_EURO " #,##0;[RED]-" UTF8_EURO " #,##0" ),
    1154             :     EXC_NUMFMT_STRING(  65, UTF8_EURO " #,##0.00;-" UTF8_EURO " #,##0.00" ),
    1155             :     EXC_NUMFMT_STRING(  66, UTF8_EURO " #,##0.00;[RED]-" UTF8_EURO " #,##0.00" ),
    1156             :     EXC_NUMFMT_ENDTABLE()
    1157             : };
    1158             : 
    1159             : static const XclBuiltInFormat spBuiltInFormats_ITALIAN_SWISS[] =
    1160             : {
    1161             :     EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
    1162             :     EXC_NUMFMT_STRING(  16, "DD.MMM" ),
    1163             :     EXC_NUMFMT_STRING(  17, "MMM.YY" ),
    1164             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1165             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1166             :     EXC_NUMFMT_STRING(  22, "DD.MM.YYYY hh:mm" ),
    1167             :     EXC_NUMFMT_STRING(  63, "\"SFr. \"#,##0;\"SFr. \"-#,##0" ),
    1168             :     EXC_NUMFMT_STRING(  64, "\"SFr. \"#,##0;[RED]\"SFr. \"-#,##0" ),
    1169             :     EXC_NUMFMT_STRING(  65, "\"SFr. \"#,##0.00;\"SFr. \"-#,##0.00" ),
    1170             :     EXC_NUMFMT_STRING(  66, "\"SFr. \"#,##0.00;[RED]\"SFr. \"-#,##0.00" ),
    1171             :     EXC_NUMFMT_ENDTABLE()
    1172             : };
    1173             : 
    1174             : // SWEDISH --------------------------------------------------------------------
    1175             : 
    1176             : static const XclBuiltInFormat spBuiltInFormats_SWEDISH_SWEDEN[] =
    1177             : {
    1178             :     EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
    1179             :     EXC_NUMFMT_STRING(  16, "DD-MMM" ),
    1180             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1181             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1182             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1183             :     EXC_NUMFMT_STRING(  22, "YYYY-MM-DD hh:mm" ),
    1184             :     EXC_NUMFMT_STRING(  37, "#,##0 _k_r;-#,##0 _k_r" ),
    1185             :     EXC_NUMFMT_STRING(  38, "#,##0 _k_r;[RED]-#,##0 _k_r" ),
    1186             :     EXC_NUMFMT_STRING(  39, "#,##0.00 _k_r;-#,##0.00 _k_r" ),
    1187             :     EXC_NUMFMT_STRING(  40, "#,##0.00 _k_r;[RED]-#,##0.00 _k_r" ),
    1188             :     EXC_NUMFMT_STRING(  63, "#,##0 \"kr\";-#,##0 \"kr\"" ),
    1189             :     EXC_NUMFMT_STRING(  64, "#,##0 \"kr\";[RED]-#,##0 \"kr\"" ),
    1190             :     EXC_NUMFMT_STRING(  65, "#,##0.00 \"kr\";-#,##0.00 \"kr\"" ),
    1191             :     EXC_NUMFMT_STRING(  66, "#,##0.00 \"kr\";[RED]-#,##0.00 \"kr\"" ),
    1192             :     EXC_NUMFMT_ENDTABLE()
    1193             : };
    1194             : 
    1195             : static const XclBuiltInFormat spBuiltInFormats_SWEDISH_FINLAND[] =
    1196             : {
    1197             :     EXC_NUMFMT_STRING(   9, "0 %" ),
    1198             :     EXC_NUMFMT_STRING(  10, "0.00 %" ),
    1199             :     EXC_NUMFMT_STRING(  15, "DD.MMM.YY" ),
    1200             :     EXC_NUMFMT_STRING(  16, "DD.MMM" ),
    1201             :     EXC_NUMFMT_STRING(  17, "MMM.YY" ),
    1202             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1203             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1204             :     EXC_NUMFMT_STRING(  22, "D.M.YYYY hh:mm" ),
    1205             :     EXC_NUMFMT_STRING(  37, "#,##0 _" UTF8_EURO ";-#,##0 _" UTF8_EURO ),
    1206             :     EXC_NUMFMT_STRING(  38, "#,##0 _" UTF8_EURO ";[RED]-#,##0 _" UTF8_EURO ),
    1207             :     EXC_NUMFMT_STRING(  39, "#,##0.00 _" UTF8_EURO ";-#,##0.00 _" UTF8_EURO ),
    1208             :     EXC_NUMFMT_STRING(  40, "#,##0.00 _" UTF8_EURO ";[RED]-#,##0.00 _" UTF8_EURO ),
    1209             :     EXC_NUMFMT_STRING(  63, "#,##0 " UTF8_EURO ";-#,##0 " UTF8_EURO ),
    1210             :     EXC_NUMFMT_STRING(  64, "#,##0 " UTF8_EURO ";[RED]-#,##0 " UTF8_EURO ),
    1211             :     EXC_NUMFMT_STRING(  65, "#,##0.00 " UTF8_EURO ";-#,##0.00 " UTF8_EURO ),
    1212             :     EXC_NUMFMT_STRING(  66, "#,##0.00 " UTF8_EURO ";[RED]-#,##0.00 " UTF8_EURO ),
    1213             :     EXC_NUMFMT_ENDTABLE()
    1214             : };
    1215             : 
    1216             : // ASIAN ----------------------------------------------------------------------
    1217             : 
    1218             : /** Base table for Asian locales. */
    1219             : static const XclBuiltInFormat spBuiltInFormats_ASIAN[] =
    1220             : {
    1221             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1222             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1223             :     EXC_NUMFMT_STRING(  20, "h:mm" ),
    1224             :     EXC_NUMFMT_STRING(  21, "h:mm:ss" ),
    1225             :     EXC_NUMFMT_STRING(  23, "$#,##0_);($#,##0)" ),
    1226             :     EXC_NUMFMT_STRING(  24, "$#,##0_);[RED]($#,##0)" ),
    1227             :     EXC_NUMFMT_STRING(  25, "$#,##0.00_);($#,##0.00)" ),
    1228             :     EXC_NUMFMT_STRING(  26, "$#,##0.00_);[RED]($#,##0.00)" ),
    1229             :     EXC_NUMFMT_REUSE(   29, 28 ),
    1230             :     EXC_NUMFMT_REUSE(   36, 27 ),
    1231             :     EXC_NUMFMT_REUSE(   50, 27 ),
    1232             :     EXC_NUMFMT_REUSE(   51, 28 ),
    1233             :     EXC_NUMFMT_REUSE(   52, 34 ),
    1234             :     EXC_NUMFMT_REUSE(   53, 35 ),
    1235             :     EXC_NUMFMT_REUSE(   54, 28 ),
    1236             :     EXC_NUMFMT_REUSE(   55, 34 ),
    1237             :     EXC_NUMFMT_REUSE(   56, 35 ),
    1238             :     EXC_NUMFMT_REUSE(   57, 27 ),
    1239             :     EXC_NUMFMT_REUSE(   58, 28 ),
    1240             :     EXC_NUMFMT_ENDTABLE()
    1241             : };
    1242             : 
    1243             : static const XclBuiltInFormat spBuiltInFormats_JAPANESE[] =
    1244             : {
    1245             :     EXC_NUMFMT_STRING(  14, "YYYY/M/D" ),
    1246             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
    1247             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
    1248             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1249             :     EXC_NUMFMT_STRING(  22, "YYYY/M/D h:mm" ),
    1250             :     EXC_NUMFMT_STRING(  27, "[$-0411]GE.M.D" ),
    1251             :     EXC_NUMFMT_STRING(  28, "[$-0411]GGGE" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1252             :     EXC_NUMFMT_STRING(  30, "[$-0411]M/D/YY" ),
    1253             :     EXC_NUMFMT_STRING(  31, "[$-0411]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1254             :     EXC_NUMFMT_STRING(  32, "[$-0411]h" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
    1255             :     EXC_NUMFMT_STRING(  33, "[$-0411]h" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN "ss" UTF8_CJ_SEC ),
    1256             :     EXC_NUMFMT_STRING(  34, "[$-0411]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON ),
    1257             :     EXC_NUMFMT_STRING(  35, "[$-0411]M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1258             :     EXC_NUMFMT_STRING(  63, UTF8_YEN_JP "#,##0;-" UTF8_YEN_JP "#,##0" ),
    1259             :     EXC_NUMFMT_STRING(  64, UTF8_YEN_JP "#,##0;[RED]-" UTF8_YEN_JP "#,##0" ),
    1260             :     EXC_NUMFMT_STRING(  65, UTF8_YEN_JP "#,##0.00;-" UTF8_YEN_JP "#,##0.00" ),
    1261             :     EXC_NUMFMT_STRING(  66, UTF8_YEN_JP "#,##0.00;[RED]-" UTF8_YEN_JP "#,##0.00" ),
    1262             :     EXC_NUMFMT_ENDTABLE()
    1263             : };
    1264             : 
    1265             : static const XclBuiltInFormat spBuiltInFormats_KOREAN[] =
    1266             : {
    1267             :     EXC_NUMFMT_STRING(  14, "YYYY-MM-DD" ),
    1268             :     EXC_NUMFMT_STRING(  15, "DD-MMM-YY" ),
    1269             :     EXC_NUMFMT_STRING(  16, "DD-MMM" ),
    1270             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1271             :     EXC_NUMFMT_STRING(  22, "YYYY-MM-DD h:mm" ),
    1272             :     EXC_NUMFMT_STRING(  27, "[$-0412]YYYY" UTF8_CJ_YEAR " MM" UTF8_CJ_MON " DD" UTF8_CJ_DAY ),
    1273             :     EXC_NUMFMT_STRING(  28, "[$-0412]MM-DD" ),
    1274             :     EXC_NUMFMT_STRING(  30, "[$-0412]MM-DD-YY" ),
    1275             :     EXC_NUMFMT_STRING(  31, "[$-0412]YYYY" UTF8_KO_YEAR " MM" UTF8_KO_MON " DD" UTF8_KO_DAY ),
    1276             :     EXC_NUMFMT_STRING(  32, "[$-0412]h" UTF8_KO_HOUR " mm" UTF8_KO_MIN ),
    1277             :     EXC_NUMFMT_STRING(  33, "[$-0412]h" UTF8_KO_HOUR " mm" UTF8_KO_MIN " ss" UTF8_KO_SEC ),
    1278             :     EXC_NUMFMT_STRING(  34, "[$-0412]YYYY\"/\"MM\"/\"DD" ),
    1279             :     EXC_NUMFMT_STRING(  35, "[$-0412]YYYY-MM-DD" ),
    1280             :     EXC_NUMFMT_STRING(  63, UTF8_WON "#,##0;-" UTF8_WON "#,##0" ),
    1281             :     EXC_NUMFMT_STRING(  64, UTF8_WON "#,##0;[RED]-" UTF8_WON "#,##0" ),
    1282             :     EXC_NUMFMT_STRING(  65, UTF8_WON "#,##0.00;-" UTF8_WON "#,##0.00" ),
    1283             :     EXC_NUMFMT_STRING(  66, UTF8_WON "#,##0.00;[RED]-" UTF8_WON "#,##0.00" ),
    1284             :     EXC_NUMFMT_ENDTABLE()
    1285             : };
    1286             : 
    1287             : static const XclBuiltInFormat spBuiltInFormats_CHINESE_SIMPLIFIED[] =
    1288             : {
    1289             :     EXC_NUMFMT_STRING(  14, "YYYY-M-D" ),
    1290             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
    1291             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
    1292             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1293             :     EXC_NUMFMT_STRING(  22, "YYYY-M-D h:mm" ),
    1294             :     EXC_NUMFMT_STRING(  27, "[$-0804]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON ),
    1295             :     EXC_NUMFMT_STRING(  28, "[$-0804]M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1296             :     EXC_NUMFMT_STRING(  30, "[$-0804]M-D-YY" ),
    1297             :     EXC_NUMFMT_STRING(  31, "[$-0804]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1298             :     EXC_NUMFMT_STRING(  32, "[$-0804]h" UTF8_CS_HOUR "mm" UTF8_CJ_MIN ),
    1299             :     EXC_NUMFMT_STRING(  33, "[$-0804]h" UTF8_CS_HOUR "mm" UTF8_CJ_MIN "ss" UTF8_CJ_SEC ),
    1300             :     EXC_NUMFMT_STRING(  34, "[$-0804]AM/PMh" UTF8_CS_HOUR "mm" UTF8_CJ_MIN ),
    1301             :     EXC_NUMFMT_STRING(  35, "[$-0804]AM/PMh" UTF8_CS_HOUR "mm" UTF8_CJ_MIN "ss" UTF8_CJ_SEC ),
    1302             :     EXC_NUMFMT_REUSE(   52, 27 ),
    1303             :     EXC_NUMFMT_REUSE(   53, 28 ),
    1304             :     EXC_NUMFMT_STRING(  63, UTF8_YEN_CS "#,##0;-" UTF8_YEN_CS "#,##0" ),
    1305             :     EXC_NUMFMT_STRING(  64, UTF8_YEN_CS "#,##0;[RED]-" UTF8_YEN_CS "#,##0" ),
    1306             :     EXC_NUMFMT_STRING(  65, UTF8_YEN_CS "#,##0.00;-" UTF8_YEN_CS "#,##0.00" ),
    1307             :     EXC_NUMFMT_STRING(  66, UTF8_YEN_CS "#,##0.00;[RED]-" UTF8_YEN_CS "#,##0.00" ),
    1308             :     EXC_NUMFMT_ENDTABLE()
    1309             : };
    1310             : 
    1311             : static const XclBuiltInFormat spBuiltInFormats_CHINESE_TRADITIONAL[] =
    1312             : {
    1313             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
    1314             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
    1315             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1316             :     EXC_NUMFMT_STRING(  18, "hh:mm AM/PM" ),
    1317             :     EXC_NUMFMT_STRING(  19, "hh:mm:ss AM/PM" ),
    1318             :     EXC_NUMFMT_OFFSET(  20, NF_TIME_HHMM ),
    1319             :     EXC_NUMFMT_OFFSET(  21, NF_TIME_HHMMSS ),
    1320             :     EXC_NUMFMT_STRING(  22, "YYYY/M/D hh:mm" ),
    1321             :     EXC_NUMFMT_STRING(  23, "US$#,##0_);(US$#,##0)" ),
    1322             :     EXC_NUMFMT_STRING(  24, "US$#,##0_);[RED](US$#,##0)" ),
    1323             :     EXC_NUMFMT_STRING(  25, "US$#,##0.00_);(US$#,##0.00)" ),
    1324             :     EXC_NUMFMT_STRING(  26, "US$#,##0.00_);[RED](US$#,##0.00)" ),
    1325             :     EXC_NUMFMT_STRING(  27, "[$-0404]E/M/D" ),
    1326             :     EXC_NUMFMT_STRING(  28, "[$-0404]E" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1327             :     EXC_NUMFMT_STRING(  30, "[$-0404]M/D/YY" ),
    1328             :     EXC_NUMFMT_STRING(  31, "[$-0404]YYYY" UTF8_CJ_YEAR "M" UTF8_CJ_MON "D" UTF8_CJ_DAY ),
    1329             :     EXC_NUMFMT_STRING(  32, "[$-0404]hh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
    1330             :     EXC_NUMFMT_STRING(  33, "[$-0404]hh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN "ss" UTF8_CJ_SEC ),
    1331             :     EXC_NUMFMT_STRING(  34, "[$-0404]AM/PMhh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN ),
    1332             :     EXC_NUMFMT_STRING(  35, "[$-0404]AM/PMhh" UTF8_CJ_HOUR "mm" UTF8_CJ_MIN "ss" UTF8_CJ_SEC ),
    1333             :     EXC_NUMFMT_STRING(  63, "$#,##0;-$#,##0" ),
    1334             :     EXC_NUMFMT_STRING(  64, "$#,##0;[RED]-$#,##0" ),
    1335             :     EXC_NUMFMT_STRING(  65, "$#,##0.00;-$#,##0.00" ),
    1336             :     EXC_NUMFMT_STRING(  66, "$#,##0.00;[RED]-$#,##0.00" ),
    1337             :     EXC_NUMFMT_ENDTABLE()
    1338             : };
    1339             : 
    1340             : // OTHER ----------------------------------------------------------------------
    1341             : 
    1342             : static const XclBuiltInFormat spBuiltInFormats_HEBREW[] =
    1343             : {
    1344             :     EXC_NUMFMT_STRING(  15, "DD-MMMM-YY" ),
    1345             :     EXC_NUMFMT_STRING(  16, "DD-MMMM" ),
    1346             :     EXC_NUMFMT_STRING(  17, "MMMM-YY" ),
    1347             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1348             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1349             :     EXC_NUMFMT_STRING(  63, UTF8_SHEQEL " #,##0;" UTF8_SHEQEL " -#,##0" ),
    1350             :     EXC_NUMFMT_STRING(  64, UTF8_SHEQEL " #,##0;[RED]" UTF8_SHEQEL " -#,##0" ),
    1351             :     EXC_NUMFMT_STRING(  65, UTF8_SHEQEL " #,##0.00;" UTF8_SHEQEL " -#,##0.00" ),
    1352             :     EXC_NUMFMT_STRING(  66, UTF8_SHEQEL " #,##0.00;[RED]" UTF8_SHEQEL " -#,##0.00" ),
    1353             :     EXC_NUMFMT_ENDTABLE()
    1354             : };
    1355             : 
    1356             : static const XclBuiltInFormat spBuiltInFormats_THAI[] =
    1357             : {
    1358             :     EXC_NUMFMT_STRING(  14, "D/M/YYYY" ),
    1359             :     EXC_NUMFMT_STRING(  15, "D-MMM-YY" ),
    1360             :     EXC_NUMFMT_STRING(  16, "D-MMM" ),
    1361             :     EXC_NUMFMT_STRING(  17, "MMM-YY" ),
    1362             :     EXC_NUMFMT_STRING(  18, "h:mm AM/PM" ),
    1363             :     EXC_NUMFMT_STRING(  19, "h:mm:ss AM/PM" ),
    1364             :     EXC_NUMFMT_STRING(  22, "D/M/YYYY h:mm" ),
    1365             :     EXC_NUMFMT_STRING(  59, "t0" ),
    1366             :     EXC_NUMFMT_STRING(  60, "t0.00" ),
    1367             :     EXC_NUMFMT_STRING(  61, "t#,##0" ),
    1368             :     EXC_NUMFMT_STRING(  62, "t#,##0.00" ),
    1369             :     EXC_NUMFMT_STRING(  63, "t" UTF8_BAHT "#,##0_);t(" UTF8_BAHT "#,##0)" ),
    1370             :     EXC_NUMFMT_STRING(  64, "t" UTF8_BAHT "#,##0_);[RED]t(" UTF8_BAHT "#,##0)" ),
    1371             :     EXC_NUMFMT_STRING(  65, "t" UTF8_BAHT "#,##0.00_);t(" UTF8_BAHT "#,##0.00)" ),
    1372             :     EXC_NUMFMT_STRING(  66, "t" UTF8_BAHT "#,##0.00_);[RED]t(" UTF8_BAHT "#,##0.00)" ),
    1373             :     EXC_NUMFMT_STRING(  67, "t0%" ),
    1374             :     EXC_NUMFMT_STRING(  68, "t0.00%" ),
    1375             :     EXC_NUMFMT_STRING(  69, "t# ?/?" ),
    1376             :     EXC_NUMFMT_STRING(  70, "t# ?\?/?\?" ),
    1377             :     EXC_NUMFMT_STRING(  71, "tD/M/EE" ),
    1378             :     EXC_NUMFMT_STRING(  72, "tD-MMM-E" ),
    1379             :     EXC_NUMFMT_STRING(  73, "tD-MMM" ),
    1380             :     EXC_NUMFMT_STRING(  74, "tMMM-E" ),
    1381             :     EXC_NUMFMT_STRING(  75, "th:mm" ),
    1382             :     EXC_NUMFMT_STRING(  76, "th:mm:ss" ),
    1383             :     EXC_NUMFMT_STRING(  77, "tD/M/EE h:mm" ),
    1384             :     EXC_NUMFMT_STRING(  78, "tmm:ss" ),
    1385             :     EXC_NUMFMT_STRING(  79, "t[h]:mm:ss" ),
    1386             :     EXC_NUMFMT_STRING(  80, "tmm:ss.0" ),
    1387             :     EXC_NUMFMT_STRING(  81, "D/M/E" ),
    1388             :     EXC_NUMFMT_ENDTABLE()
    1389             : };
    1390             : 
    1391             : #undef EXC_NUMFMT_ENDTABLE
    1392             : #undef EXC_NUMFMT_REUSE
    1393             : #undef EXC_NUMFMT_OFFSET
    1394             : #undef EXC_NUMFMT_STRING
    1395             : 
    1396             : /** Specifies a number format table for a specific language. */
    1397             : struct XclBuiltInFormatTable
    1398             : {
    1399             :     LanguageType        meLanguage;         /// The language of this table.
    1400             :     LanguageType        meParentLang;       /// The language of the parent table.
    1401             :     const XclBuiltInFormat* mpFormats;      /// The number format table.
    1402             : };
    1403             : 
    1404             : static const XclBuiltInFormatTable spBuiltInFormatTables[] =
    1405             : {   //  language                        parent language             format table
    1406             :     {   LANGUAGE_DONTKNOW,              LANGUAGE_NONE,              spBuiltInFormats_DONTKNOW               },
    1407             : 
    1408             :     {   LANGUAGE_ENGLISH,               LANGUAGE_DONTKNOW,          spBuiltInFormats_ENGLISH                },
    1409             :     {   LANGUAGE_ENGLISH_UK,            LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_UK             },
    1410             :     {   LANGUAGE_ENGLISH_EIRE,          LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_EIRE           },
    1411             :     {   LANGUAGE_ENGLISH_US,            LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_US             },
    1412             :     {   LANGUAGE_ENGLISH_CAN,           LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_CAN            },
    1413             :     {   LANGUAGE_ENGLISH_AUS,           LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_AUS            },
    1414             :     {   LANGUAGE_ENGLISH_SAFRICA,       LANGUAGE_ENGLISH,           spBuiltInFormats_ENGLISH_SAFRICA        },
    1415             :     {   LANGUAGE_ENGLISH_NZ,            LANGUAGE_ENGLISH_AUS,       0                                       },
    1416             : 
    1417             :     {   PRV_LANGUAGE_FRENCH_PRIM,       LANGUAGE_DONTKNOW,          spBuiltInFormats_FRENCH                 },
    1418             :     {   LANGUAGE_FRENCH,                PRV_LANGUAGE_FRENCH_PRIM,   spBuiltInFormats_FRENCH_FRANCE          },
    1419             :     {   LANGUAGE_FRENCH_CANADIAN,       PRV_LANGUAGE_FRENCH_PRIM,   spBuiltInFormats_FRENCH_CANADIAN        },
    1420             :     {   LANGUAGE_FRENCH_SWISS,          PRV_LANGUAGE_FRENCH_PRIM,   spBuiltInFormats_FRENCH_SWISS           },
    1421             :     {   LANGUAGE_FRENCH_BELGIAN,        LANGUAGE_FRENCH,            spBuiltInFormats_FRENCH_BELGIAN         },
    1422             :     {   LANGUAGE_FRENCH_LUXEMBOURG,     LANGUAGE_FRENCH,            0                                       },
    1423             :     {   LANGUAGE_FRENCH_MONACO,         LANGUAGE_FRENCH,            0                                       },
    1424             : 
    1425             :     {   PRV_LANGUAGE_GERMAN_PRIM,       LANGUAGE_DONTKNOW,          spBuiltInFormats_GERMAN                 },
    1426             :     {   LANGUAGE_GERMAN,                PRV_LANGUAGE_GERMAN_PRIM,   spBuiltInFormats_GERMAN_GERMANY         },
    1427             :     {   LANGUAGE_GERMAN_AUSTRIAN,       PRV_LANGUAGE_GERMAN_PRIM,   spBuiltInFormats_GERMAN_AUSTRIAN        },
    1428             :     {   LANGUAGE_GERMAN_SWISS,          PRV_LANGUAGE_GERMAN_PRIM,   spBuiltInFormats_GERMAN_SWISS           },
    1429             :     {   LANGUAGE_GERMAN_LUXEMBOURG,     PRV_LANGUAGE_GERMAN_PRIM,   spBuiltInFormats_GERMAN_LUXEMBOURG      },
    1430             :     {   LANGUAGE_GERMAN_LIECHTENSTEIN,  PRV_LANGUAGE_GERMAN_PRIM,   spBuiltInFormats_GERMAN_LIECHTENSTEIN   },
    1431             : 
    1432             :     {   LANGUAGE_ITALIAN,               LANGUAGE_DONTKNOW,          spBuiltInFormats_ITALIAN_ITALY          },
    1433             :     {   LANGUAGE_ITALIAN_SWISS,         LANGUAGE_DONTKNOW,          spBuiltInFormats_ITALIAN_SWISS          },
    1434             : 
    1435             :     {   LANGUAGE_SWEDISH,               LANGUAGE_DONTKNOW,          spBuiltInFormats_SWEDISH_SWEDEN         },
    1436             :     {   LANGUAGE_SWEDISH_FINLAND,       LANGUAGE_DONTKNOW,          spBuiltInFormats_SWEDISH_FINLAND        },
    1437             : 
    1438             :     {   PRV_LANGUAGE_ASIAN_PRIM,        LANGUAGE_DONTKNOW,          spBuiltInFormats_ASIAN                  },
    1439             :     {   LANGUAGE_JAPANESE,              PRV_LANGUAGE_ASIAN_PRIM,    spBuiltInFormats_JAPANESE               },
    1440             :     {   LANGUAGE_KOREAN,                PRV_LANGUAGE_ASIAN_PRIM,    spBuiltInFormats_KOREAN                 },
    1441             :     {   LANGUAGE_CHINESE_SIMPLIFIED,    PRV_LANGUAGE_ASIAN_PRIM,    spBuiltInFormats_CHINESE_SIMPLIFIED     },
    1442             :     {   LANGUAGE_CHINESE_TRADITIONAL,   PRV_LANGUAGE_ASIAN_PRIM,    spBuiltInFormats_CHINESE_TRADITIONAL    },
    1443             : 
    1444             :     {   LANGUAGE_HEBREW,                LANGUAGE_DONTKNOW,          spBuiltInFormats_HEBREW                 },
    1445             :     {   LANGUAGE_THAI,                  LANGUAGE_DONTKNOW,          spBuiltInFormats_THAI                   }
    1446             : };
    1447             : 
    1448             : } // namespace
    1449             : 
    1450          84 : XclNumFmtBuffer::XclNumFmtBuffer( const XclRoot& rRoot ) :
    1451          84 :     meSysLang( rRoot.GetSysLanguage() ),
    1452         168 :     mnStdScNumFmt( rRoot.GetFormatter().GetStandardFormat( ScGlobal::eLnge ) )
    1453             : {
    1454             :     // *** insert default formats (BIFF5+ only)***
    1455             : 
    1456          84 :     if( rRoot.GetBiff() >= EXC_BIFF5 )
    1457          84 :         InsertBuiltinFormats();
    1458          84 : }
    1459             : 
    1460           0 : void XclNumFmtBuffer::InitializeImport()
    1461             : {
    1462           0 :     maFmtMap.clear();
    1463           0 : }
    1464             : 
    1465         855 : void XclNumFmtBuffer::InsertFormat( sal_uInt16 nXclNumFmt, const OUString& rFormat )
    1466             : {
    1467         855 :     XclNumFmt& rNumFmt = maFmtMap[ nXclNumFmt ];
    1468         855 :     rNumFmt.maFormat = rFormat;
    1469             :     // #i62053# rFormat may be an empty string, meOffset must be initialized
    1470         855 :     rNumFmt.meOffset = NF_NUMBER_STANDARD;
    1471         855 :     rNumFmt.meLanguage = LANGUAGE_SYSTEM;
    1472         855 : }
    1473             : 
    1474          84 : void XclNumFmtBuffer::InsertBuiltinFormats()
    1475             : {
    1476             :     // build a map containing tables for all languages
    1477             :     typedef ::std::map< LanguageType, const XclBuiltInFormatTable* > XclBuiltInMap;
    1478          84 :     XclBuiltInMap aBuiltInMap;
    1479        5712 :     for( const XclBuiltInFormatTable* pTable = spBuiltInFormatTables;
    1480        2856 :             pTable != STATIC_ARRAY_END( spBuiltInFormatTables ); ++pTable )
    1481        2772 :         aBuiltInMap[ pTable->meLanguage ] = pTable;
    1482             : 
    1483             :     // build a list of table pointers for the current language, with all parent tables
    1484             :     typedef ::std::vector< const XclBuiltInFormatTable* > XclBuiltInVec;
    1485         168 :     XclBuiltInVec aBuiltInVec;
    1486         336 :     for( XclBuiltInMap::const_iterator aMIt = aBuiltInMap.find( meSysLang ), aMEnd = aBuiltInMap.end();
    1487         252 :             aMIt != aMEnd; aMIt = aBuiltInMap.find( aMIt->second->meParentLang ) )
    1488         252 :         aBuiltInVec.push_back( aMIt->second );
    1489             :     // language not supported
    1490          84 :     if( aBuiltInVec.empty() )
    1491             :     {
    1492             :         OSL_TRACE( "XclNumFmtBuffer::InsertBuiltinFormats - language 0x%04hX not supported (#i29949#)", meSysLang );
    1493           0 :         XclBuiltInMap::const_iterator aMIt = aBuiltInMap.find( LANGUAGE_DONTKNOW );
    1494             :         OSL_ENSURE( aMIt != aBuiltInMap.end(), "XclNumFmtBuffer::InsertBuiltinFormats - default map not found" );
    1495           0 :         if( aMIt != aBuiltInMap.end() )
    1496           0 :             aBuiltInVec.push_back( aMIt->second );
    1497             :     }
    1498             : 
    1499             :     // insert the default formats in the format map, from root parent to system language
    1500             :     typedef ::std::map< sal_uInt16, sal_uInt16 > XclReuseMap;
    1501         168 :     XclReuseMap aReuseMap;
    1502         336 :     for( XclBuiltInVec::reverse_iterator aVIt = aBuiltInVec.rbegin(), aVEnd = aBuiltInVec.rend(); aVIt != aVEnd; ++aVIt )
    1503             :     {
    1504             :         // put LANGUAGE_SYSTEM for all entries in default table
    1505         252 :         LanguageType eLang = ((*aVIt)->meLanguage == LANGUAGE_DONTKNOW) ? LANGUAGE_SYSTEM : meSysLang;
    1506        7812 :         for( const XclBuiltInFormat* pBuiltIn = (*aVIt)->mpFormats; pBuiltIn && (pBuiltIn->mnXclNumFmt != EXC_FORMAT_NOTFOUND); ++pBuiltIn )
    1507             :         {
    1508        7560 :             XclNumFmt& rNumFmt = maFmtMap[ pBuiltIn->mnXclNumFmt ];
    1509             : 
    1510        7560 :             rNumFmt.meOffset = pBuiltIn->meOffset;
    1511        7560 :             rNumFmt.meLanguage = eLang;
    1512             : 
    1513        7560 :             if( pBuiltIn->mpFormat )
    1514        2352 :                 rNumFmt.maFormat = OUString( pBuiltIn->mpFormat, strlen(pBuiltIn->mpFormat), RTL_TEXTENCODING_UTF8 );
    1515             :             else
    1516        5208 :                 rNumFmt.maFormat = EMPTY_OUSTRING;
    1517             : 
    1518        7560 :             if( pBuiltIn->meOffset == PRV_NF_INDEX_REUSE )
    1519        3528 :                 aReuseMap[ pBuiltIn->mnXclNumFmt ] = pBuiltIn->mnXclReuseFmt;
    1520             :             else
    1521        4032 :                 aReuseMap.erase( pBuiltIn->mnXclNumFmt );
    1522             :         }
    1523             :     }
    1524             : 
    1525             :     // copy reused number formats
    1526        3612 :     for( XclReuseMap::const_iterator aRIt = aReuseMap.begin(), aREnd = aReuseMap.end(); aRIt != aREnd; ++aRIt )
    1527        3612 :         maFmtMap[ aRIt->first ] = maFmtMap[ aRIt->second ];
    1528          84 : }
    1529             : 
    1530             : // Cell formatting data (XF) ==================================================
    1531             : 
    1532        4350 : XclCellProt::XclCellProt() :
    1533             :     mbLocked( true ),       // default in Excel and Calc
    1534        4350 :     mbHidden( false )
    1535             : {
    1536        4350 : }
    1537             : 
    1538        1843 : bool operator==( const XclCellProt& rLeft, const XclCellProt& rRight )
    1539             : {
    1540        1843 :     return (rLeft.mbLocked == rRight.mbLocked) && (rLeft.mbHidden == rRight.mbHidden);
    1541             : }
    1542             : 
    1543        4350 : XclCellAlign::XclCellAlign() :
    1544             :     mnHorAlign( EXC_XF_HOR_GENERAL ),
    1545             :     mnVerAlign( EXC_XF_VER_BOTTOM ),
    1546             :     mnOrient( EXC_ORIENT_NONE ),
    1547             :     mnTextDir( EXC_XF_TEXTDIR_CONTEXT ),
    1548             :     mnRotation( EXC_ROT_NONE ),
    1549             :     mnIndent( 0 ),
    1550             :     mbLineBreak( false ),
    1551        4350 :     mbShrink( false )
    1552             : {
    1553        4350 : }
    1554             : 
    1555         999 : SvxCellHorJustify XclCellAlign::GetScHorAlign() const
    1556             : {
    1557         999 :     SvxCellHorJustify eHorJust = SVX_HOR_JUSTIFY_STANDARD;
    1558         999 :     switch( mnHorAlign )
    1559             :     {
    1560         190 :         case EXC_XF_HOR_GENERAL:    eHorJust = SVX_HOR_JUSTIFY_STANDARD;    break;
    1561          94 :         case EXC_XF_HOR_LEFT:       eHorJust = SVX_HOR_JUSTIFY_LEFT;        break;
    1562             :         case EXC_XF_HOR_CENTER_AS:
    1563         707 :         case EXC_XF_HOR_CENTER:     eHorJust = SVX_HOR_JUSTIFY_CENTER;      break;
    1564           8 :         case EXC_XF_HOR_RIGHT:      eHorJust = SVX_HOR_JUSTIFY_RIGHT;       break;
    1565           0 :         case EXC_XF_HOR_FILL:       eHorJust = SVX_HOR_JUSTIFY_REPEAT;      break;
    1566             :         case EXC_XF_HOR_JUSTIFY:
    1567           0 :         case EXC_XF_HOR_DISTRIB:    eHorJust = SVX_HOR_JUSTIFY_BLOCK;       break;
    1568             :         default:    OSL_FAIL( "XclCellAlign::GetScHorAlign - unknown horizontal alignment" );
    1569             :     }
    1570         999 :     return eHorJust;
    1571             : }
    1572             : 
    1573         999 : SvxCellJustifyMethod XclCellAlign::GetScHorJustifyMethod() const
    1574             : {
    1575         999 :     return (mnHorAlign == EXC_XF_HOR_DISTRIB) ? SVX_JUSTIFY_METHOD_DISTRIBUTE : SVX_JUSTIFY_METHOD_AUTO;
    1576             : }
    1577             : 
    1578         999 : SvxCellVerJustify XclCellAlign::GetScVerAlign() const
    1579             : {
    1580         999 :     SvxCellVerJustify eVerJust = SVX_VER_JUSTIFY_STANDARD;
    1581         999 :     switch( mnVerAlign )
    1582             :     {
    1583          18 :         case EXC_XF_VER_TOP:        eVerJust = SVX_VER_JUSTIFY_TOP;         break;
    1584         142 :         case EXC_XF_VER_CENTER:     eVerJust = SVX_VER_JUSTIFY_CENTER;      break;
    1585         788 :         case EXC_XF_VER_BOTTOM:     eVerJust = SVX_VER_JUSTIFY_STANDARD;    break;
    1586             :         case EXC_XF_VER_JUSTIFY:
    1587          51 :         case EXC_XF_VER_DISTRIB:    eVerJust = SVX_VER_JUSTIFY_BLOCK;       break;
    1588             :         default:    OSL_FAIL( "XclCellAlign::GetScVerAlign - unknown vertical alignment" );
    1589             :     }
    1590         999 :     return eVerJust;
    1591             : }
    1592             : 
    1593         999 : SvxCellJustifyMethod XclCellAlign::GetScVerJustifyMethod() const
    1594             : {
    1595         999 :     return (mnVerAlign == EXC_XF_VER_DISTRIB) ? SVX_JUSTIFY_METHOD_DISTRIBUTE : SVX_JUSTIFY_METHOD_AUTO;
    1596             : }
    1597             : 
    1598         999 : SvxFrameDirection XclCellAlign::GetScFrameDir() const
    1599             : {
    1600         999 :     SvxFrameDirection eFrameDir = FRMDIR_ENVIRONMENT;
    1601         999 :     switch( mnTextDir )
    1602             :     {
    1603         991 :         case EXC_XF_TEXTDIR_CONTEXT:    eFrameDir = FRMDIR_ENVIRONMENT;     break;
    1604           8 :         case EXC_XF_TEXTDIR_LTR:        eFrameDir = FRMDIR_HORI_LEFT_TOP;   break;
    1605           0 :         case EXC_XF_TEXTDIR_RTL:        eFrameDir = FRMDIR_HORI_RIGHT_TOP;  break;
    1606             :         default:    OSL_FAIL( "XclCellAlign::GetScFrameDir - unknown CTL text direction" );
    1607             :     }
    1608         999 :     return eFrameDir;
    1609             : }
    1610             : 
    1611         312 : void XclCellAlign::SetScHorAlign( SvxCellHorJustify eHorJust )
    1612             : {
    1613         312 :     switch( eHorJust )
    1614             :     {
    1615         290 :         case SVX_HOR_JUSTIFY_STANDARD:  mnHorAlign = EXC_XF_HOR_GENERAL;    break;
    1616          15 :         case SVX_HOR_JUSTIFY_LEFT:      mnHorAlign = EXC_XF_HOR_LEFT;       break;
    1617           5 :         case SVX_HOR_JUSTIFY_CENTER:    mnHorAlign = EXC_XF_HOR_CENTER;     break;
    1618           2 :         case SVX_HOR_JUSTIFY_RIGHT:     mnHorAlign = EXC_XF_HOR_RIGHT;      break;
    1619           0 :         case SVX_HOR_JUSTIFY_BLOCK:     mnHorAlign = EXC_XF_HOR_JUSTIFY;    break;
    1620           0 :         case SVX_HOR_JUSTIFY_REPEAT:    mnHorAlign = EXC_XF_HOR_FILL;       break;
    1621           0 :         default:                        mnHorAlign = EXC_XF_HOR_GENERAL;
    1622             :             OSL_FAIL( "XclCellAlign::SetScHorAlign - unknown horizontal alignment" );
    1623             :     }
    1624         312 : }
    1625             : 
    1626         312 : void XclCellAlign::SetScVerAlign( SvxCellVerJustify eVerJust )
    1627             : {
    1628         312 :     switch( eVerJust )
    1629             :     {
    1630         103 :         case SVX_VER_JUSTIFY_STANDARD:  mnVerAlign = EXC_XF_VER_BOTTOM; break;
    1631           0 :         case SVX_VER_JUSTIFY_TOP:       mnVerAlign = EXC_XF_VER_TOP;    break;
    1632           6 :         case SVX_VER_JUSTIFY_CENTER:    mnVerAlign = EXC_XF_VER_CENTER; break;
    1633         203 :         case SVX_VER_JUSTIFY_BOTTOM:    mnVerAlign = EXC_XF_VER_BOTTOM; break;
    1634           0 :         default:                        mnVerAlign = EXC_XF_VER_BOTTOM;
    1635             :             OSL_FAIL( "XclCellAlign::SetScVerAlign - unknown vertical alignment" );
    1636             :     }
    1637         312 : }
    1638             : 
    1639         312 : void XclCellAlign::SetScFrameDir( SvxFrameDirection eFrameDir )
    1640             : {
    1641         312 :     switch( eFrameDir )
    1642             :     {
    1643         312 :         case FRMDIR_ENVIRONMENT:    mnTextDir = EXC_XF_TEXTDIR_CONTEXT; break;
    1644           0 :         case FRMDIR_HORI_LEFT_TOP:  mnTextDir = EXC_XF_TEXTDIR_LTR;     break;
    1645           0 :         case FRMDIR_HORI_RIGHT_TOP: mnTextDir = EXC_XF_TEXTDIR_RTL;     break;
    1646           0 :         default:                    mnTextDir = EXC_XF_TEXTDIR_CONTEXT;
    1647             :             OSL_FAIL( "XclCellAlign::SetScFrameDir - unknown CTL text direction" );
    1648             :     }
    1649         312 : }
    1650             : 
    1651         968 : bool operator==( const XclCellAlign& rLeft, const XclCellAlign& rRight )
    1652             : {
    1653             :     return
    1654        2900 :         (rLeft.mnHorAlign  == rRight.mnHorAlign)  && (rLeft.mnVerAlign == rRight.mnVerAlign) &&
    1655        2898 :         (rLeft.mnTextDir   == rRight.mnTextDir)   && (rLeft.mnOrient   == rRight.mnOrient)   &&
    1656        2898 :         (rLeft.mnRotation  == rRight.mnRotation)  && (rLeft.mnIndent   == rRight.mnIndent)   &&
    1657        2899 :         (rLeft.mbLineBreak == rRight.mbLineBreak) && (rLeft.mbShrink   == rRight.mbShrink);
    1658             : }
    1659             : 
    1660        4360 : XclCellBorder::XclCellBorder() :
    1661             :     mnLeftColor( 0 ),
    1662             :     mnRightColor( 0 ),
    1663             :     mnTopColor( 0 ),
    1664             :     mnBottomColor( 0 ),
    1665             :     mnDiagColor( 0 ),
    1666             :     mnLeftLine( EXC_LINE_NONE ),
    1667             :     mnRightLine( EXC_LINE_NONE ),
    1668             :     mnTopLine( EXC_LINE_NONE ),
    1669             :     mnBottomLine( EXC_LINE_NONE ),
    1670             :     mnDiagLine( EXC_LINE_NONE ),
    1671             :     mbDiagTLtoBR( false ),
    1672        4360 :     mbDiagBLtoTR( false )
    1673             : {
    1674        4360 : }
    1675             : 
    1676         785 : bool operator==( const XclCellBorder& rLeft, const XclCellBorder& rRight )
    1677             : {
    1678             :     return
    1679        1937 :         (rLeft.mnLeftColor  == rRight.mnLeftColor)  && (rLeft.mnRightColor  == rRight.mnRightColor)  &&
    1680        1596 :         (rLeft.mnTopColor   == rRight.mnTopColor)   && (rLeft.mnBottomColor == rRight.mnBottomColor) &&
    1681        1405 :         (rLeft.mnLeftLine   == rRight.mnLeftLine)   && (rLeft.mnRightLine   == rRight.mnRightLine)   &&
    1682        1078 :         (rLeft.mnTopLine    == rRight.mnTopLine)    && (rLeft.mnBottomLine  == rRight.mnBottomLine)  &&
    1683         945 :         (rLeft.mnDiagColor  == rRight.mnDiagColor)  && (rLeft.mnDiagLine    == rRight.mnDiagLine)    &&
    1684        1415 :         (rLeft.mbDiagTLtoBR == rRight.mbDiagTLtoBR) && (rLeft.mbDiagBLtoTR  == rRight.mbDiagBLtoTR);
    1685             : }
    1686             : 
    1687        4494 : XclCellArea::XclCellArea() :
    1688             :     mnForeColor( EXC_COLOR_WINDOWTEXT ),
    1689             :     mnBackColor( EXC_COLOR_WINDOWBACK ),
    1690        4494 :     mnPattern( EXC_PATT_NONE )
    1691             : {
    1692        4494 : }
    1693             : 
    1694           0 : bool XclCellArea::IsTransparent() const
    1695             : {
    1696           0 :     return (mnPattern == EXC_PATT_NONE) && (mnBackColor == EXC_COLOR_WINDOWBACK);
    1697             : }
    1698             : 
    1699         439 : bool operator==( const XclCellArea& rLeft, const XclCellArea& rRight )
    1700             : {
    1701             :     return
    1702         877 :         (rLeft.mnForeColor == rRight.mnForeColor) && (rLeft.mnBackColor == rRight.mnBackColor) &&
    1703         877 :         (rLeft.mnPattern == rRight.mnPattern);
    1704             : }
    1705             : 
    1706        4340 : XclXFBase::XclXFBase( bool bCellXF ) :
    1707             :     mnParent( bCellXF ? EXC_XF_DEFAULTSTYLE : EXC_XF_STYLEPARENT ),
    1708        4340 :     mbCellXF( bCellXF )
    1709             : {
    1710        4340 :     SetAllUsedFlags( false );
    1711        4340 : }
    1712             : 
    1713        5708 : XclXFBase::~XclXFBase()
    1714             : {
    1715        5708 : }
    1716             : 
    1717        4486 : void XclXFBase::SetAllUsedFlags( bool bUsed )
    1718             : {
    1719        4486 :     mbProtUsed = mbFontUsed = mbFmtUsed = mbAlignUsed = mbBorderUsed = mbAreaUsed = bUsed;
    1720        4486 : }
    1721             : 
    1722           0 : bool XclXFBase::HasUsedFlags() const
    1723             : {
    1724           0 :     return mbProtUsed || mbFontUsed || mbFmtUsed || mbAlignUsed || mbBorderUsed || mbAreaUsed;
    1725             : }
    1726             : 
    1727        1076 : bool XclXFBase::Equals( const XclXFBase& rCmp ) const
    1728             : {
    1729             :     return
    1730        3228 :         (mbCellXF     == rCmp.mbCellXF)     && (mnParent    == rCmp.mnParent)    &&
    1731        2922 :         (mbProtUsed   == rCmp.mbProtUsed)   && (mbFontUsed  == rCmp.mbFontUsed)  &&
    1732        1993 :         (mbFmtUsed    == rCmp.mbFmtUsed)    && (mbAlignUsed == rCmp.mbAlignUsed) &&
    1733        2192 :         (mbBorderUsed == rCmp.mbBorderUsed) && (mbAreaUsed  == rCmp.mbAreaUsed);
    1734          30 : }
    1735             : 
    1736             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11