LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/xmloff/source/draw - XMLNumberStyles.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 183 0.5 %
Date: 2013-07-09 Functions: 1 30 3.3 %
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 <boost/shared_ptr.hpp>
      21             : #include <tools/debug.hxx>
      22             : #include <XMLNumberStylesExport.hxx>
      23             : #include <XMLNumberStylesImport.hxx>
      24             : #include "xmloff/xmlnmspe.hxx"
      25             : #include <xmloff/xmlimp.hxx>
      26             : #include <xmloff/nmspmap.hxx>
      27             : #include <xmloff/xmltoken.hxx>
      28             : 
      29             : #include "sdxmlexp_impl.hxx"
      30             : #include "sdxmlimp_impl.hxx"
      31             : 
      32             : using namespace ::xmloff::token;
      33             : 
      34             : 
      35             : struct SdXMLDataStyleNumber
      36             : {
      37             :     enum XMLTokenEnum meNumberStyle;
      38             :     sal_Bool    mbLong;
      39             :     sal_Bool    mbTextual;
      40             :     sal_Bool    mbDecimal02;
      41             :     const char* mpText;
      42             : }
      43             :     aSdXMLDataStyleNumbers[] =
      44             : {
      45             :     { XML_DAY,          sal_False,      sal_False,      sal_False,      NULL },
      46             :     { XML_DAY,          sal_True,       sal_False,      sal_False,      NULL },
      47             :     { XML_MONTH,        sal_True,       sal_False,      sal_False,      NULL },
      48             :     { XML_MONTH,        sal_False,      sal_True,       sal_False,      NULL },
      49             :     { XML_MONTH,        sal_True,       sal_True,       sal_False,      NULL },
      50             :     { XML_YEAR,         sal_False,      sal_False,      sal_False,      NULL },
      51             :     { XML_YEAR,         sal_True,       sal_False,      sal_False,      NULL },
      52             :     { XML_DAY_OF_WEEK,  sal_False,      sal_False,      sal_False,      NULL },
      53             :     { XML_DAY_OF_WEEK,  sal_True,       sal_False,      sal_False,      NULL },
      54             :     { XML_TEXT,         sal_False,      sal_False,      sal_False,      "."  },
      55             :     { XML_TEXT,         sal_False,      sal_False,      sal_False,      " "  },
      56             :     { XML_TEXT,         sal_False,      sal_False,      sal_False,      ", " },
      57             :     { XML_TEXT,         sal_False,      sal_False,      sal_False,      ". " },
      58             :     { XML_HOURS,        sal_False,      sal_False,      sal_False,      NULL },
      59             :     { XML_MINUTES,      sal_False,      sal_False,      sal_False,      NULL },
      60             :     { XML_TEXT,         sal_False,      sal_False,      sal_False,      ":"  },
      61             :     { XML_AM_PM,        sal_False,      sal_False,      sal_False,      NULL },
      62             :     { XML_SECONDS,      sal_False,      sal_False,      sal_False,      NULL },
      63             :     { XML_SECONDS,      sal_False,      sal_False,      sal_True,       NULL },
      64             :     { XML_TOKEN_INVALID,        0,              0,             0,       NULL  }
      65             : };
      66             : 
      67             : // date
      68             : 
      69             : #define DATA_STYLE_NUMBER_DAY               1   // <number:day/>
      70             : #define DATA_STYLE_NUMBER_DAY_LONG          2   // <number:day number:style="long"/>
      71             : #define DATA_STYLE_NUMBER_MONTH_LONG        3   // <number:month number:style="long"/>
      72             : #define DATA_STYLE_NUMBER_MONTH_TEXT        4   // <number:month number:textual="true"/>
      73             : #define DATA_STYLE_NUMBER_MONTH_LONG_TEXT   5   // <number:month number:style="long" number:textual="true"/>
      74             : #define DATA_STYLE_NUMBER_YEAR              6   // <number:year/>
      75             : #define DATA_STYLE_NUMBER_YEAR_LONG         7   // <number:year number:style="long"/>
      76             : #define DATA_STYLE_NUMBER_DAYOFWEEK         8   // <number:day-of-week/>
      77             : #define DATA_STYLE_NUMBER_DAYOFWEEK_LONG    9   // <number:day-of-week number:style="long"/>
      78             : #define DATA_STYLE_NUMBER_TEXT_POINT        10  // <number:text>.</number:text>
      79             : #define DATA_STYLE_NUMBER_TEXT_SPACE        11  // <number:text> </number:text>
      80             : #define DATA_STYLE_NUMBER_TEXT_COMMASPACE   12  // <number:text>, </number:text>
      81             : #define DATA_STYLE_NUMBER_TEXT_POINTSPACE   13  // <number:text>. </number:text>
      82             : #define DATA_STYLE_NUMBER_HOURS             14  // <number:hours/>
      83             : #define DATA_STYLE_NUMBER_MINUTES           15  // <number:minutes/>
      84             : #define DATA_STYLE_NUMBER_TEXT_COLON        16  // <number:text>:</number:text>
      85             : #define DATA_STYLE_NUMBER_AMPM              17  // <number:am-pm/>
      86             : #define DATA_STYLE_NUMBER_SECONDS           18  // <number:seconds/>
      87             : #define DATA_STYLE_NUMBER_SECONDS_02        19  // <number:seconds number:/>
      88             : 
      89             : 
      90             : struct SdXMLFixedDataStyle
      91             : {
      92             :     const char* mpName;
      93             :     sal_Bool    mbAutomatic;
      94             :     sal_Bool    mbDateStyle;
      95             :     sal_uInt8   mpFormat[8];
      96             : };
      97             : 
      98             : const SdXMLFixedDataStyle aSdXML_Standard_Short =
      99             : {
     100             :     "D1", sal_True, sal_True,
     101             :     {
     102             :         DATA_STYLE_NUMBER_DAY_LONG,
     103             :         DATA_STYLE_NUMBER_TEXT_POINT,
     104             :         DATA_STYLE_NUMBER_MONTH_LONG,
     105             :         DATA_STYLE_NUMBER_TEXT_POINT,
     106             :         DATA_STYLE_NUMBER_YEAR_LONG,
     107             :         0, 0, 0
     108             :     }
     109             : };
     110             : 
     111             : const SdXMLFixedDataStyle aSdXML_Standard_Long =
     112             : {
     113             :     "D2", sal_True, sal_True,
     114             :     {
     115             :         DATA_STYLE_NUMBER_DAYOFWEEK_LONG,
     116             :         DATA_STYLE_NUMBER_TEXT_COMMASPACE,
     117             :         DATA_STYLE_NUMBER_DAY,
     118             :         DATA_STYLE_NUMBER_TEXT_POINTSPACE,
     119             :         DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
     120             :         DATA_STYLE_NUMBER_TEXT_SPACE,
     121             :         DATA_STYLE_NUMBER_YEAR_LONG,
     122             :         0
     123             :     }
     124             : };
     125             : 
     126             : const SdXMLFixedDataStyle aSdXML_DateStyle_1 =
     127             : {
     128             :     "D3", sal_False, sal_True,
     129             :     {
     130             :         DATA_STYLE_NUMBER_DAY_LONG,
     131             :         DATA_STYLE_NUMBER_TEXT_POINT,
     132             :         DATA_STYLE_NUMBER_MONTH_LONG,
     133             :         DATA_STYLE_NUMBER_TEXT_POINT,
     134             :         DATA_STYLE_NUMBER_YEAR,
     135             :         0, 0, 0
     136             :     }
     137             : };
     138             : 
     139             : const SdXMLFixedDataStyle aSdXML_DateStyle_2 =
     140             : {
     141             :     "D4", sal_False, sal_True,
     142             :     {
     143             :         DATA_STYLE_NUMBER_DAY_LONG,
     144             :         DATA_STYLE_NUMBER_TEXT_POINT,
     145             :         DATA_STYLE_NUMBER_MONTH_LONG,
     146             :         DATA_STYLE_NUMBER_TEXT_POINT,
     147             :         DATA_STYLE_NUMBER_YEAR_LONG,
     148             :         0, 0, 0
     149             :     }
     150             : };
     151             : 
     152             : const SdXMLFixedDataStyle aSdXML_DateStyle_3 =
     153             : {
     154             :     "D5", sal_False, sal_True,
     155             :     {
     156             :         DATA_STYLE_NUMBER_DAY,
     157             :         DATA_STYLE_NUMBER_TEXT_POINTSPACE,
     158             :         DATA_STYLE_NUMBER_MONTH_TEXT,
     159             :         DATA_STYLE_NUMBER_TEXT_SPACE,
     160             :         DATA_STYLE_NUMBER_YEAR_LONG,
     161             :         0, 0, 0
     162             :     }
     163             : };
     164             : 
     165             : const SdXMLFixedDataStyle aSdXML_DateStyle_4 =
     166             : {
     167             :     "D6", sal_False, sal_True,
     168             :     {
     169             :         DATA_STYLE_NUMBER_DAY,
     170             :         DATA_STYLE_NUMBER_TEXT_POINTSPACE,
     171             :         DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
     172             :         DATA_STYLE_NUMBER_TEXT_SPACE,
     173             :         DATA_STYLE_NUMBER_YEAR_LONG,
     174             :         0, 0, 0
     175             :     }
     176             : };
     177             : 
     178             : const SdXMLFixedDataStyle aSdXML_DateStyle_5 =
     179             : {
     180             :     "D7", sal_False, sal_True,
     181             :     {
     182             :         DATA_STYLE_NUMBER_DAYOFWEEK,
     183             :         DATA_STYLE_NUMBER_TEXT_COMMASPACE,
     184             :         DATA_STYLE_NUMBER_DAY,
     185             :         DATA_STYLE_NUMBER_TEXT_POINTSPACE,
     186             :         DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
     187             :         DATA_STYLE_NUMBER_TEXT_SPACE,
     188             :         DATA_STYLE_NUMBER_YEAR_LONG,
     189             :         0
     190             :     }
     191             : };
     192             : 
     193             : const SdXMLFixedDataStyle aSdXML_DateStyle_6 =
     194             : {
     195             :     "D8", sal_False, sal_True,
     196             :     {
     197             :         DATA_STYLE_NUMBER_DAYOFWEEK_LONG,
     198             :         DATA_STYLE_NUMBER_TEXT_COMMASPACE,
     199             :         DATA_STYLE_NUMBER_DAY,
     200             :         DATA_STYLE_NUMBER_TEXT_POINTSPACE,
     201             :         DATA_STYLE_NUMBER_MONTH_LONG_TEXT,
     202             :         DATA_STYLE_NUMBER_TEXT_SPACE,
     203             :         DATA_STYLE_NUMBER_YEAR_LONG,
     204             :         0
     205             :     }
     206             : };
     207             : 
     208             : const SdXMLFixedDataStyle aSdXML_TimeStyle_1 =
     209             : {   "T1", sal_True, sal_False,
     210             :     {
     211             :         DATA_STYLE_NUMBER_HOURS,
     212             :         DATA_STYLE_NUMBER_TEXT_COLON,
     213             :         DATA_STYLE_NUMBER_MINUTES,
     214             :         DATA_STYLE_NUMBER_TEXT_COLON,
     215             :         DATA_STYLE_NUMBER_SECONDS,
     216             :         DATA_STYLE_NUMBER_AMPM,
     217             :         0, 0,
     218             :     }
     219             : };
     220             : 
     221             : const SdXMLFixedDataStyle aSdXML_TimeStyle_2 =
     222             : {   "T2", sal_False, sal_False,
     223             :     {
     224             :         DATA_STYLE_NUMBER_HOURS,
     225             :         DATA_STYLE_NUMBER_TEXT_COLON,
     226             :         DATA_STYLE_NUMBER_MINUTES,
     227             :         0, 0, 0, 0, 0
     228             :     }
     229             : };
     230             : 
     231             : const SdXMLFixedDataStyle aSdXML_TimeStyle_3 =
     232             : {   "T3", sal_False, sal_False,
     233             :     {
     234             :         DATA_STYLE_NUMBER_HOURS,
     235             :         DATA_STYLE_NUMBER_TEXT_COLON,
     236             :         DATA_STYLE_NUMBER_MINUTES,
     237             :         DATA_STYLE_NUMBER_TEXT_COLON,
     238             :         DATA_STYLE_NUMBER_SECONDS,
     239             :         0, 0, 0
     240             :     }
     241             : };
     242             : 
     243             : const SdXMLFixedDataStyle aSdXML_TimeStyle_4 =
     244             : {   "T4", sal_False, sal_False,
     245             :     {
     246             :         DATA_STYLE_NUMBER_HOURS,
     247             :         DATA_STYLE_NUMBER_TEXT_COLON,
     248             :         DATA_STYLE_NUMBER_MINUTES,
     249             :         DATA_STYLE_NUMBER_TEXT_COLON,
     250             :         DATA_STYLE_NUMBER_SECONDS_02,
     251             :         0, 0, 0
     252             :     }
     253             : };
     254             : 
     255             : const SdXMLFixedDataStyle aSdXML_TimeStyle_5 =
     256             : {   "T5", sal_False, sal_False,
     257             :     {
     258             :         DATA_STYLE_NUMBER_HOURS,
     259             :         DATA_STYLE_NUMBER_TEXT_COLON,
     260             :         DATA_STYLE_NUMBER_MINUTES,
     261             :         DATA_STYLE_NUMBER_AMPM,
     262             :         0, 0, 0, 0
     263             :     }
     264             : };
     265             : 
     266             : const SdXMLFixedDataStyle aSdXML_TimeStyle_6 =
     267             : {   "T6", sal_False, sal_False,
     268             :     {
     269             :         DATA_STYLE_NUMBER_HOURS,
     270             :         DATA_STYLE_NUMBER_TEXT_COLON,
     271             :         DATA_STYLE_NUMBER_MINUTES,
     272             :         DATA_STYLE_NUMBER_TEXT_COLON,
     273             :         DATA_STYLE_NUMBER_SECONDS,
     274             :         DATA_STYLE_NUMBER_AMPM,
     275             :         0, 0
     276             :     }
     277             : };
     278             : 
     279             : const SdXMLFixedDataStyle aSdXML_TimeStyle_7 =
     280             : {   "T7", sal_False, sal_False,
     281             :     {
     282             :         DATA_STYLE_NUMBER_HOURS,
     283             :         DATA_STYLE_NUMBER_TEXT_COLON,
     284             :         DATA_STYLE_NUMBER_MINUTES,
     285             :         DATA_STYLE_NUMBER_TEXT_COLON,
     286             :         DATA_STYLE_NUMBER_SECONDS_02,
     287             :         DATA_STYLE_NUMBER_AMPM,
     288             :         0, 0
     289             :     }
     290             : };
     291             : 
     292             : const SdXMLFixedDataStyle* aSdXMLFixedDateFormats[SdXMLDateFormatCount] =
     293             : {
     294             :     &aSdXML_Standard_Short,
     295             :     &aSdXML_Standard_Long,
     296             :     &aSdXML_DateStyle_1,
     297             :     &aSdXML_DateStyle_2,
     298             :     &aSdXML_DateStyle_3,
     299             :     &aSdXML_DateStyle_4,
     300             :     &aSdXML_DateStyle_5,
     301             :     &aSdXML_DateStyle_6,
     302             : };
     303             : 
     304             : const SdXMLFixedDataStyle* aSdXMLFixedTimeFormats[SdXMLTimeFormatCount] =
     305             : {
     306             :     &aSdXML_TimeStyle_1,
     307             :     &aSdXML_TimeStyle_2,
     308             :     &aSdXML_TimeStyle_3,
     309             :     &aSdXML_TimeStyle_4,
     310             :     &aSdXML_TimeStyle_5,
     311             :     &aSdXML_TimeStyle_6,
     312             :     &aSdXML_TimeStyle_7
     313             : };
     314             : 
     315             : 
     316             : ///////////////////////////////////////////////////////////////////////
     317             : // export
     318             : 
     319           0 : static void SdXMLExportDataStyleNumber( SdXMLExport& rExport, SdXMLDataStyleNumber& rElement )
     320             : {
     321           0 :     if( rElement.mbDecimal02 )
     322             :     {
     323           0 :         rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, XML_2 );
     324             :     }
     325             : 
     326           0 :     if( rElement.mbLong )
     327             :     {
     328           0 :         rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_STYLE, XML_LONG );
     329             :     }
     330             : 
     331           0 :     if( rElement.mbTextual )
     332             :     {
     333           0 :         rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TEXTUAL, XML_TRUE );
     334             :     }
     335             : 
     336           0 :     SvXMLElementExport aNumberStyle( rExport, XML_NAMESPACE_NUMBER, rElement.meNumberStyle, sal_True, sal_False );
     337           0 :     if( rElement.mpText )
     338             :     {
     339           0 :         OUString sAttrValue( OUString::createFromAscii( rElement.mpText ) );
     340           0 :         rExport.GetDocHandler()->characters( sAttrValue );
     341           0 :     }
     342           0 : }
     343             : 
     344           0 : static void SdXMLExportStyle( SdXMLExport& rExport, const SdXMLFixedDataStyle* pStyle, const SdXMLFixedDataStyle* pStyle2 = NULL )
     345             : {
     346           0 :     OUString sAttrValue;
     347             : 
     348             :     // name
     349           0 :     sAttrValue = OUString::createFromAscii( pStyle->mpName );
     350           0 :     if( pStyle2 )
     351           0 :         sAttrValue += OUString::createFromAscii( pStyle2->mpName );
     352             : 
     353           0 :     rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_NAME, sAttrValue );
     354             : 
     355           0 :     if( pStyle->mbAutomatic )
     356             :     {
     357           0 :         rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_AUTOMATIC_ORDER, XML_TRUE );
     358             :     }
     359             : 
     360           0 :     SvXMLElementExport aElement( rExport, XML_NAMESPACE_NUMBER, pStyle->mbDateStyle ? XML_DATE_STYLE : XML_TIME_STYLE, sal_True, sal_True );
     361             : 
     362           0 :     do
     363             :     {
     364             : 
     365           0 :         const sal_uInt8* pElements = (const sal_uInt8*)&pStyle->mpFormat[0];
     366             : 
     367           0 :         while( *pElements )
     368             :         {
     369           0 :             SdXMLDataStyleNumber& rElement = aSdXMLDataStyleNumbers[ (*pElements++) - 1 ];
     370           0 :             SdXMLExportDataStyleNumber( rExport, rElement );
     371             :         }
     372             : 
     373           0 :         if( pStyle2 )
     374             :         {
     375           0 :             SdXMLDataStyleNumber& rElement = aSdXMLDataStyleNumbers[ DATA_STYLE_NUMBER_TEXT_SPACE - 1 ];
     376           0 :             SdXMLExportDataStyleNumber( rExport, rElement );
     377             :         }
     378             : 
     379           0 :         pStyle = pStyle2;
     380           0 :         pStyle2 = NULL;
     381             :     }
     382           0 :     while( pStyle );
     383           0 : }
     384             : 
     385           0 : void SdXMLNumberStylesExporter::exportTimeStyle( SdXMLExport& rExport, sal_Int32 nStyle )
     386             : {
     387             :     DBG_ASSERT( (nStyle >= 0) && (nStyle < SdXMLTimeFormatCount), "Unknown time style!" );
     388           0 :     if( (nStyle >= 0) && (nStyle < SdXMLTimeFormatCount) )
     389           0 :         SdXMLExportStyle( rExport, aSdXMLFixedTimeFormats[ nStyle ] );
     390           0 : }
     391             : 
     392           0 : void SdXMLNumberStylesExporter::exportDateStyle( SdXMLExport& rExport, sal_Int32 nStyle )
     393             : {
     394           0 :     if( nStyle > 0x0f )
     395             :     {
     396           0 :         int nDateStyle = nStyle & 0x0f;
     397           0 :         bool bHasDate = nDateStyle != 0;
     398             : 
     399           0 :         if( nDateStyle > 1 )
     400           0 :             nDateStyle -= 2;
     401             : 
     402             :         DBG_ASSERT( (nDateStyle >= 0) && (nDateStyle < SdXMLDateFormatCount), "unknown date style!" );
     403             : 
     404           0 :         int nTimeStyle = (nStyle >> 4) & 0x0f;
     405           0 :         bool bHasTime = nTimeStyle != 0;
     406             : 
     407           0 :         if( nTimeStyle > 1 )
     408           0 :             nTimeStyle -= 2;
     409             : 
     410             :         DBG_ASSERT( (nTimeStyle >= 0) && (nTimeStyle < SdXMLTimeFormatCount), "Unknown time style!" );
     411             : 
     412           0 :         if( (nDateStyle >= 0) && (nDateStyle < SdXMLDateFormatCount) && (nTimeStyle >= 0) && (nTimeStyle < SdXMLTimeFormatCount) )
     413             :         {
     414           0 :             if( bHasDate )
     415             :             {
     416           0 :                 if( bHasTime )
     417             :                 {
     418           0 :                     SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nDateStyle ], aSdXMLFixedTimeFormats[ nTimeStyle ] );
     419             :                 }
     420             :                 else
     421             :                 {
     422           0 :                     SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nDateStyle ] );
     423             :                 }
     424             :             }
     425           0 :             else if( bHasTime )
     426             :             {
     427           0 :                 SdXMLExportStyle( rExport, aSdXMLFixedTimeFormats[ nTimeStyle ] );
     428             :             }
     429             :         }
     430             :     }
     431             :     else
     432             :     {
     433             :         DBG_ASSERT( (nStyle >= 0) && (nStyle < SdXMLDateFormatCount), "unknown date style!" );
     434           0 :         if( (nStyle >= 0) && (nStyle < SdXMLDateFormatCount) )
     435           0 :             SdXMLExportStyle( rExport, aSdXMLFixedDateFormats[ nStyle ] );
     436             :     }
     437           0 : }
     438             : 
     439           0 : OUString SdXMLNumberStylesExporter::getTimeStyleName(const sal_Int32 nTimeFormat )
     440             : {
     441           0 :     sal_Int32 nFormat = nTimeFormat;
     442           0 :     if( nFormat > 1 )
     443           0 :         nFormat -= 2;
     444             : 
     445           0 :     if( (nFormat >= 0) && (nFormat < SdXMLTimeFormatCount) )
     446             :     {
     447           0 :         return OUString::createFromAscii(aSdXMLFixedTimeFormats[nFormat]->mpName );
     448             :     }
     449             :     else
     450             :     {
     451           0 :         return OUString();
     452             :     }
     453             : }
     454             : 
     455           0 : OUString SdXMLNumberStylesExporter::getDateStyleName(const sal_Int32 nDateFormat )
     456             : {
     457           0 :     sal_Int32 nFormat = nDateFormat;
     458             : 
     459           0 :     if( nFormat > 0x0f )
     460             :     {
     461           0 :         OUString aStr;
     462           0 :         if( nFormat & 0x0f )
     463           0 :             aStr = getDateStyleName( nFormat & 0x0f );
     464           0 :         aStr += getTimeStyleName( (nFormat >> 4) & 0x0f );
     465           0 :         return aStr;
     466             :     }
     467             : 
     468           0 :     if( nFormat > 1 )
     469           0 :         nFormat -= 2;
     470             : 
     471           0 :     if( (nFormat >= 0) && (nFormat < SdXMLDateFormatCount) )
     472             :     {
     473           0 :         return OUString::createFromAscii(aSdXMLFixedDateFormats[nFormat]->mpName );
     474             :     }
     475             :     else
     476             :     {
     477           0 :         return OUString();
     478             :     }
     479             : }
     480             : 
     481             : 
     482             : ///////////////////////////////////////////////////////////////////////
     483             : // import
     484             : 
     485             : class SdXMLNumberFormatMemberImportContext : public SvXMLImportContext
     486             : {
     487             : private:
     488             :     SdXMLNumberFormatImportContext* mpParent;
     489             : 
     490             :     OUString maNumberStyle;
     491             :     sal_Bool mbLong;
     492             :     sal_Bool mbTextual;
     493             :     sal_Bool mbDecimal02;
     494             :     OUString maText;
     495             :     boost::shared_ptr< SvXMLImportContext > mpSlaveContext;
     496             : 
     497             : public:
     498             :     TYPEINFO();
     499             : 
     500             :     SdXMLNumberFormatMemberImportContext( SvXMLImport& rImport,
     501             :         sal_uInt16 nPrfx,
     502             :         const OUString& rLocalName,
     503             :         const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList,
     504             :         SdXMLNumberFormatImportContext* pParent,
     505             :         SvXMLImportContext* pSlaveContext );
     506             :     virtual ~SdXMLNumberFormatMemberImportContext();
     507             : 
     508             :     virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix,
     509             :                                    const OUString& rLocalName,
     510             :                                    const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
     511             : 
     512             :     virtual void StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
     513             : 
     514             :     virtual void EndElement();
     515             : 
     516             :     virtual void Characters( const OUString& rChars );
     517             : };
     518             : 
     519           0 : TYPEINIT1( SdXMLNumberFormatMemberImportContext, SvXMLImportContext );
     520             : 
     521           0 : SdXMLNumberFormatMemberImportContext::SdXMLNumberFormatMemberImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, SdXMLNumberFormatImportContext* pParent, SvXMLImportContext* pSlaveContext )
     522             : :   SvXMLImportContext(rImport, nPrfx, rLocalName),
     523             :     mpParent( pParent ),
     524             :     maNumberStyle( rLocalName ),
     525           0 :     mpSlaveContext( pSlaveContext )
     526             : {
     527           0 :     mbLong = sal_False;
     528           0 :     mbTextual = sal_False;
     529           0 :     mbDecimal02 = sal_False;
     530             : 
     531           0 :     const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     532           0 :     for(sal_Int16 i=0; i < nAttrCount; i++)
     533             :     {
     534           0 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     535           0 :         OUString aLocalName;
     536           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     537           0 :         OUString sValue = xAttrList->getValueByIndex( i );
     538             : 
     539           0 :         if( nPrefix == XML_NAMESPACE_NUMBER )
     540             :         {
     541           0 :             if( IsXMLToken( aLocalName, XML_DECIMAL_PLACES ) )
     542             :             {
     543           0 :                 mbDecimal02 =  IsXMLToken( sValue, XML_2 );
     544             :             }
     545           0 :             else if( IsXMLToken( aLocalName, XML_STYLE ) )
     546             :             {
     547           0 :                 mbLong = IsXMLToken( sValue, XML_LONG );
     548             :             }
     549           0 :             else if( IsXMLToken( aLocalName, XML_TEXTUAL ) )
     550             :             {
     551           0 :                 mbTextual = IsXMLToken( sValue, XML_TRUE );
     552             :             }
     553             :         }
     554           0 :     }
     555             : 
     556           0 : }
     557             : 
     558           0 : SdXMLNumberFormatMemberImportContext::~SdXMLNumberFormatMemberImportContext()
     559             : {
     560           0 : }
     561             : 
     562           0 : SvXMLImportContext *SdXMLNumberFormatMemberImportContext::CreateChildContext( sal_uInt16 nPrefix,
     563             :                            const OUString& rLocalName,
     564             :                            const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
     565             : {
     566           0 :     return mpSlaveContext->CreateChildContext( nPrefix, rLocalName, xAttrList );
     567             : }
     568             : 
     569           0 : void SdXMLNumberFormatMemberImportContext::StartElement( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
     570             : {
     571           0 :     mpSlaveContext->StartElement( xAttrList );
     572           0 : }
     573             : 
     574           0 : void SdXMLNumberFormatMemberImportContext::EndElement()
     575             : {
     576           0 :     mpSlaveContext->EndElement();
     577             : 
     578           0 :     if( mpParent )
     579           0 :         mpParent->add( maNumberStyle, mbLong, mbTextual, mbDecimal02, maText );
     580           0 : }
     581             : 
     582           0 : void SdXMLNumberFormatMemberImportContext::Characters( const OUString& rChars )
     583             : {
     584           0 :     mpSlaveContext->Characters( rChars );
     585           0 :     maText += rChars;
     586           0 : }
     587             : 
     588          12 : TYPEINIT1( SdXMLNumberFormatImportContext, SvXMLImportContext );
     589             : 
     590             : 
     591           0 : SdXMLNumberFormatImportContext::SdXMLNumberFormatImportContext( SdXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLocalName, SvXMLNumImpData* pNewData, sal_uInt16 nNewType, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList, SvXMLStylesContext& rStyles)
     592             : :   SvXMLNumFormatContext(rImport, nPrfx, rLocalName, pNewData, nNewType, xAttrList, rStyles),
     593             :     mbAutomatic( sal_False ),
     594             :     mnIndex(0),
     595           0 :     mnKey( -1 )
     596             : {
     597           0 :     mbTimeStyle = IsXMLToken( rLocalName, XML_TIME_STYLE );
     598             : 
     599           0 :     const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
     600           0 :     for(sal_Int16 i=0; i < nAttrCount; i++)
     601             :     {
     602           0 :         OUString sAttrName = xAttrList->getNameByIndex( i );
     603           0 :         OUString aLocalName;
     604           0 :         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName );
     605           0 :         OUString sValue = xAttrList->getValueByIndex( i );
     606             : 
     607           0 :         if( nPrefix == XML_NAMESPACE_NUMBER )
     608             :         {
     609           0 :             if( IsXMLToken( aLocalName, XML_AUTOMATIC_ORDER ) )
     610             :             {
     611           0 :                 mbAutomatic = IsXMLToken( sValue, XML_TRUE );
     612             :             }
     613             :         }
     614           0 :     }
     615           0 : }
     616             : 
     617           0 : SdXMLNumberFormatImportContext::~SdXMLNumberFormatImportContext()
     618             : {
     619           0 : }
     620             : 
     621           0 : void SdXMLNumberFormatImportContext::add( OUString& rNumberStyle, sal_Bool bLong, sal_Bool bTextual, sal_Bool   bDecimal02, OUString& rText )
     622             : {
     623           0 :     if( mnIndex == -1 || mnIndex == 16 )
     624             :     {
     625           0 :         mnIndex = -1;
     626           0 :         return;
     627             :     }
     628             : 
     629           0 :     const SdXMLDataStyleNumber* pStyleMember = aSdXMLDataStyleNumbers;
     630           0 :     for( sal_uInt8 nIndex = 0; pStyleMember->meNumberStyle != XML_TOKEN_INVALID; nIndex++, pStyleMember++ )
     631             :     {
     632           0 :         if( (IsXMLToken(rNumberStyle, pStyleMember->meNumberStyle) &&
     633           0 :             (pStyleMember->mbLong == bLong) &&
     634           0 :             (pStyleMember->mbTextual == bTextual) &&
     635           0 :             (pStyleMember->mbDecimal02 == bDecimal02) &&
     636           0 :             ( ( (pStyleMember->mpText == NULL) && (rText.isEmpty()) ) ||
     637           0 :               ( pStyleMember->mpText && (rText.compareToAscii( pStyleMember->mpText )  == 0 )) ) ) )
     638             :         {
     639           0 :             mnElements[mnIndex++] = nIndex + 1;
     640           0 :             return;
     641             :         }
     642             :     }
     643             : }
     644             : 
     645           0 : bool SdXMLNumberFormatImportContext::compareStyle( const SdXMLFixedDataStyle* pStyle, sal_Int16& nIndex ) const
     646             : {
     647           0 :     if( (pStyle->mbAutomatic != mbAutomatic) && (nIndex == 0))
     648           0 :         return sal_False;
     649             : 
     650             :     sal_Int16 nCompareIndex;
     651           0 :     for( nCompareIndex = 0; nCompareIndex < 8; nIndex++, nCompareIndex++ )
     652             :     {
     653           0 :         if( pStyle->mpFormat[nCompareIndex] != mnElements[nIndex] )
     654           0 :             return sal_False;
     655             :     }
     656             : 
     657           0 :     return sal_True;
     658             : }
     659             : 
     660           0 : void SdXMLNumberFormatImportContext::EndElement()
     661             : {
     662           0 :     SvXMLNumFormatContext::EndElement();
     663             : 
     664           0 :     for( ; mnIndex < 16; mnIndex++ )
     665             :     {
     666           0 :         mnElements[mnIndex] = 0;
     667             :     }
     668             : 
     669           0 :     if( mbTimeStyle )
     670             :     {
     671             :         // compare import with all time styles
     672           0 :         for( sal_Int16 nFormat = 0; nFormat < SdXMLTimeFormatCount; nFormat++ )
     673             :         {
     674           0 :             sal_Int16 nIndex = 0;
     675           0 :             if( compareStyle( aSdXMLFixedTimeFormats[nFormat], nIndex ) )
     676             :             {
     677           0 :                 mnKey = nFormat + 2;
     678           0 :                 break;
     679             :             }
     680             :         }
     681             :     }
     682             :     else
     683             :     {
     684             :         // compare import with all date styles
     685           0 :         for( sal_Int16 nFormat = 0; nFormat < SdXMLDateFormatCount; nFormat++ )
     686             :         {
     687           0 :             sal_Int16 nIndex = 0;
     688           0 :             if( compareStyle( aSdXMLFixedDateFormats[nFormat], nIndex ) )
     689             :             {
     690           0 :                 mnKey = nFormat + 2;
     691           0 :                 break;
     692             :             }
     693           0 :             else if( mnElements[nIndex] == DATA_STYLE_NUMBER_TEXT_SPACE )
     694             :             {
     695             :                 // if its a valid date ending with a space, see if a time style follows
     696           0 :                 for( sal_Int16 nTimeFormat = 0; nTimeFormat < SdXMLTimeFormatCount; nTimeFormat++ )
     697             :                 {
     698           0 :                     sal_Int16 nIndex2 = nIndex + 1;
     699           0 :                     if( compareStyle( aSdXMLFixedTimeFormats[nTimeFormat], nIndex2 ) )
     700             :                     {
     701           0 :                         mnKey = (nFormat + 2) | ((nTimeFormat + 2) << 4);
     702           0 :                         break;
     703             :                     }
     704             :                 }
     705             :             }
     706             :         }
     707             : 
     708             :         // no date style found? maybe its an extended time style
     709           0 :         if( mnKey == -1 )
     710             :         {
     711             :             // compare import with all time styles
     712           0 :             for( sal_Int16 nFormat = 0; nFormat < SdXMLTimeFormatCount; nFormat++ )
     713             :             {
     714           0 :                 sal_Int16 nIndex = 0;
     715           0 :                 if( compareStyle( aSdXMLFixedTimeFormats[nFormat], nIndex ) )
     716             :                 {
     717           0 :                     mnKey = (nFormat + 2) << 4;
     718           0 :                     break;
     719             :                 }
     720             :             }
     721             :         }
     722             :     }
     723           0 : }
     724             : 
     725           0 : SvXMLImportContext * SdXMLNumberFormatImportContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList>& xAttrList )
     726             : {
     727           0 :     return new SdXMLNumberFormatMemberImportContext( GetImport(), nPrefix, rLocalName, xAttrList, this, SvXMLNumFormatContext::CreateChildContext( nPrefix, rLocalName, xAttrList ) );
     728             : }
     729             : 
     730             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10