163bba73cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 363bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 463bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file 563bba73cSAndrew Rist * distributed with this work for additional information 663bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 763bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the 863bba73cSAndrew Rist * "License"); you may not use this file except in compliance 963bba73cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1163bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1363bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing, 1463bba73cSAndrew Rist * software distributed under the License is distributed on an 1563bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1663bba73cSAndrew Rist * KIND, either express or implied. See the License for the 1763bba73cSAndrew Rist * specific language governing permissions and limitations 1863bba73cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 2063bba73cSAndrew Rist *************************************************************/ 2163bba73cSAndrew Rist 2263bba73cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <unotools/syslocale.hxx> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE 30cdf0e10cSrcweir #include <svl/zforlist.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #include <svl/zformat.hxx> 33cdf0e10cSrcweir #include <svl/numuno.hxx> 34cdf0e10cSrcweir #include <rtl/math.hxx> 35cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 36cdf0e10cSrcweir #include <tools/debug.hxx> 37cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 38cdf0e10cSrcweir 39cdf0e10cSrcweir // #110680# 40cdf0e10cSrcweir //#include <comphelper/processfactory.hxx> 41cdf0e10cSrcweir 42cdf0e10cSrcweir #include <xmloff/xmlnumfi.hxx> 43cdf0e10cSrcweir #include <xmloff/xmltkmap.hxx> 44cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 45cdf0e10cSrcweir #include <xmloff/xmlictxt.hxx> 46cdf0e10cSrcweir #include <xmloff/xmlimp.hxx> 47cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 48cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 49cdf0e10cSrcweir #include <xmloff/families.hxx> 50cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 51cdf0e10cSrcweir 52cdf0e10cSrcweir using ::rtl::OUString; 53cdf0e10cSrcweir using ::rtl::OUStringBuffer; 54cdf0e10cSrcweir 55cdf0e10cSrcweir using namespace ::com::sun::star; 56cdf0e10cSrcweir using namespace ::xmloff::token; 57cdf0e10cSrcweir 58cdf0e10cSrcweir //------------------------------------------------------------------------- 59cdf0e10cSrcweir 60cdf0e10cSrcweir struct SvXMLNumFmtEntry 61cdf0e10cSrcweir { 62cdf0e10cSrcweir rtl::OUString aName; 63cdf0e10cSrcweir sal_uInt32 nKey; 64cdf0e10cSrcweir sal_Bool bRemoveAfterUse; 65cdf0e10cSrcweir 66cdf0e10cSrcweir SvXMLNumFmtEntry( const rtl::OUString& rN, sal_uInt32 nK, sal_Bool bR ) : 67cdf0e10cSrcweir aName(rN), nKey(nK), bRemoveAfterUse(bR) {} 68cdf0e10cSrcweir }; 69cdf0e10cSrcweir 70cdf0e10cSrcweir typedef SvXMLNumFmtEntry* SvXMLNumFmtEntryPtr; 71cdf0e10cSrcweir SV_DECL_PTRARR_DEL( SvXMLNumFmtEntryArr, SvXMLNumFmtEntryPtr, 4, 4 ) 72cdf0e10cSrcweir 73cdf0e10cSrcweir struct SvXMLEmbeddedElement 74cdf0e10cSrcweir { 75cdf0e10cSrcweir sal_Int32 nFormatPos; 76cdf0e10cSrcweir rtl::OUString aText; 77cdf0e10cSrcweir 78cdf0e10cSrcweir SvXMLEmbeddedElement( sal_Int32 nFP, const rtl::OUString& rT ) : 79cdf0e10cSrcweir nFormatPos(nFP), aText(rT) {} 80cdf0e10cSrcweir 81cdf0e10cSrcweir // comparison operators for PTRARR sorting - sorted by position 82cdf0e10cSrcweir sal_Bool operator ==( const SvXMLEmbeddedElement& r ) const { return nFormatPos == r.nFormatPos; } 83cdf0e10cSrcweir sal_Bool operator < ( const SvXMLEmbeddedElement& r ) const { return nFormatPos < r.nFormatPos; } 84cdf0e10cSrcweir }; 85cdf0e10cSrcweir 86cdf0e10cSrcweir typedef SvXMLEmbeddedElement* SvXMLEmbeddedElementPtr; 87cdf0e10cSrcweir SV_DECL_PTRARR_SORT_DEL( SvXMLEmbeddedElementArr, SvXMLEmbeddedElementPtr, 0, 4 ) 88cdf0e10cSrcweir 89cdf0e10cSrcweir //------------------------------------------------------------------------- 90cdf0e10cSrcweir 91cdf0e10cSrcweir class SvXMLNumImpData 92cdf0e10cSrcweir { 93cdf0e10cSrcweir SvNumberFormatter* pFormatter; 94cdf0e10cSrcweir SvXMLTokenMap* pStylesElemTokenMap; 95cdf0e10cSrcweir SvXMLTokenMap* pStyleElemTokenMap; 96cdf0e10cSrcweir SvXMLTokenMap* pStyleAttrTokenMap; 97cdf0e10cSrcweir SvXMLTokenMap* pStyleElemAttrTokenMap; 98cdf0e10cSrcweir LocaleDataWrapper* pLocaleData; 99cdf0e10cSrcweir SvXMLNumFmtEntryArr aNameEntries; 100cdf0e10cSrcweir 101cdf0e10cSrcweir // #110680# 102cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxServiceFactory; 103cdf0e10cSrcweir 104cdf0e10cSrcweir public: 105cdf0e10cSrcweir // #110680# 106cdf0e10cSrcweir // SvXMLNumImpData( SvNumberFormatter* pFmt ); 107cdf0e10cSrcweir SvXMLNumImpData( 108cdf0e10cSrcweir SvNumberFormatter* pFmt, 109cdf0e10cSrcweir const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory ); 110cdf0e10cSrcweir ~SvXMLNumImpData(); 111cdf0e10cSrcweir 112cdf0e10cSrcweir SvNumberFormatter* GetNumberFormatter() const { return pFormatter; } 113cdf0e10cSrcweir const SvXMLTokenMap& GetStylesElemTokenMap(); 114cdf0e10cSrcweir const SvXMLTokenMap& GetStyleElemTokenMap(); 115cdf0e10cSrcweir const SvXMLTokenMap& GetStyleAttrTokenMap(); 116cdf0e10cSrcweir const SvXMLTokenMap& GetStyleElemAttrTokenMap(); 117cdf0e10cSrcweir const LocaleDataWrapper& GetLocaleData( LanguageType nLang ); 118cdf0e10cSrcweir sal_uInt32 GetKeyForName( const rtl::OUString& rName ); 119cdf0e10cSrcweir void AddKey( sal_uInt32 nKey, const rtl::OUString& rName, sal_Bool bRemoveAfterUse ); 120cdf0e10cSrcweir void SetUsed( sal_uInt32 nKey ); 121cdf0e10cSrcweir void RemoveVolatileFormats(); 122cdf0e10cSrcweir }; 123cdf0e10cSrcweir 124cdf0e10cSrcweir 125cdf0e10cSrcweir struct SvXMLNumberInfo 126cdf0e10cSrcweir { 127cdf0e10cSrcweir sal_Int32 nDecimals; 128cdf0e10cSrcweir sal_Int32 nInteger; 129cdf0e10cSrcweir sal_Int32 nExpDigits; 130cdf0e10cSrcweir sal_Int32 nNumerDigits; 131cdf0e10cSrcweir sal_Int32 nDenomDigits; 132cdf0e10cSrcweir sal_Bool bGrouping; 133cdf0e10cSrcweir sal_Bool bDecReplace; 134cdf0e10cSrcweir sal_Bool bVarDecimals; 135cdf0e10cSrcweir double fDisplayFactor; 136cdf0e10cSrcweir SvXMLEmbeddedElementArr aEmbeddedElements; 137cdf0e10cSrcweir 138cdf0e10cSrcweir SvXMLNumberInfo() 139cdf0e10cSrcweir { 140cdf0e10cSrcweir nDecimals = nInteger = nExpDigits = nNumerDigits = nDenomDigits = -1; 141cdf0e10cSrcweir bGrouping = bDecReplace = bVarDecimals = sal_False; 142cdf0e10cSrcweir fDisplayFactor = 1.0; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir }; 145cdf0e10cSrcweir 146cdf0e10cSrcweir class SvXMLNumFmtElementContext : public SvXMLImportContext 147cdf0e10cSrcweir { 148cdf0e10cSrcweir SvXMLNumFormatContext& rParent; 149cdf0e10cSrcweir sal_uInt16 nType; 150cdf0e10cSrcweir rtl::OUStringBuffer aContent; 151cdf0e10cSrcweir SvXMLNumberInfo aNumInfo; 152cdf0e10cSrcweir LanguageType nElementLang; 153cdf0e10cSrcweir sal_Bool bLong; 154cdf0e10cSrcweir sal_Bool bTextual; 155cdf0e10cSrcweir rtl::OUString sCalendar; 156cdf0e10cSrcweir 157cdf0e10cSrcweir public: 158cdf0e10cSrcweir SvXMLNumFmtElementContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 159cdf0e10cSrcweir const rtl::OUString& rLName, 160cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, sal_uInt16 nNewType, 161cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 162cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 163cdf0e10cSrcweir virtual ~SvXMLNumFmtElementContext(); 164cdf0e10cSrcweir 165cdf0e10cSrcweir virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 166cdf0e10cSrcweir const rtl::OUString& rLocalName, 167cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 168cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 169cdf0e10cSrcweir virtual void Characters( const rtl::OUString& rChars ); 170cdf0e10cSrcweir virtual void EndElement(); 171cdf0e10cSrcweir 172cdf0e10cSrcweir void AddEmbeddedElement( sal_Int32 nFormatPos, const rtl::OUString& rContent ); 173cdf0e10cSrcweir }; 174cdf0e10cSrcweir 175cdf0e10cSrcweir 176cdf0e10cSrcweir class SvXMLNumFmtEmbeddedTextContext : public SvXMLImportContext 177cdf0e10cSrcweir { 178cdf0e10cSrcweir SvXMLNumFmtElementContext& rParent; 179cdf0e10cSrcweir rtl::OUStringBuffer aContent; 180cdf0e10cSrcweir sal_Int32 nTextPosition; 181cdf0e10cSrcweir 182cdf0e10cSrcweir public: 183cdf0e10cSrcweir SvXMLNumFmtEmbeddedTextContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 184cdf0e10cSrcweir const rtl::OUString& rLName, 185cdf0e10cSrcweir SvXMLNumFmtElementContext& rParentContext, 186cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 187cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 188cdf0e10cSrcweir virtual ~SvXMLNumFmtEmbeddedTextContext(); 189cdf0e10cSrcweir 190cdf0e10cSrcweir virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 191cdf0e10cSrcweir const rtl::OUString& rLocalName, 192cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 193cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 194cdf0e10cSrcweir virtual void Characters( const rtl::OUString& rChars ); 195cdf0e10cSrcweir virtual void EndElement(); 196cdf0e10cSrcweir }; 197cdf0e10cSrcweir 198cdf0e10cSrcweir 199cdf0e10cSrcweir class SvXMLNumFmtMapContext : public SvXMLImportContext 200cdf0e10cSrcweir { 201cdf0e10cSrcweir SvXMLNumFormatContext& rParent; 202cdf0e10cSrcweir rtl::OUString sCondition; 203cdf0e10cSrcweir rtl::OUString sName; 204cdf0e10cSrcweir 205cdf0e10cSrcweir public: 206cdf0e10cSrcweir SvXMLNumFmtMapContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 207cdf0e10cSrcweir const rtl::OUString& rLName, 208cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, 209cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 210cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 211cdf0e10cSrcweir virtual ~SvXMLNumFmtMapContext(); 212cdf0e10cSrcweir 213cdf0e10cSrcweir virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 214cdf0e10cSrcweir const rtl::OUString& rLocalName, 215cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 216cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 217cdf0e10cSrcweir virtual void Characters( const rtl::OUString& rChars ); 218cdf0e10cSrcweir virtual void EndElement(); 219cdf0e10cSrcweir }; 220cdf0e10cSrcweir 221cdf0e10cSrcweir 222cdf0e10cSrcweir class SvXMLNumFmtPropContext : public SvXMLImportContext 223cdf0e10cSrcweir { 224cdf0e10cSrcweir SvXMLNumFormatContext& rParent; 225cdf0e10cSrcweir Color aColor; 226cdf0e10cSrcweir sal_Bool bColSet; 227cdf0e10cSrcweir 228cdf0e10cSrcweir public: 229cdf0e10cSrcweir SvXMLNumFmtPropContext( SvXMLImport& rImport, sal_uInt16 nPrfx, 230cdf0e10cSrcweir const rtl::OUString& rLName, 231cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, 232cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 233cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 234cdf0e10cSrcweir virtual ~SvXMLNumFmtPropContext(); 235cdf0e10cSrcweir 236cdf0e10cSrcweir virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, 237cdf0e10cSrcweir const rtl::OUString& rLocalName, 238cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 239cdf0e10cSrcweir ::com::sun::star::xml::sax::XAttributeList>& xAttrList ); 240cdf0e10cSrcweir virtual void Characters( const rtl::OUString& rChars ); 241cdf0e10cSrcweir virtual void EndElement(); 242cdf0e10cSrcweir }; 243cdf0e10cSrcweir 244cdf0e10cSrcweir 245cdf0e10cSrcweir //------------------------------------------------------------------------- 246cdf0e10cSrcweir 247cdf0e10cSrcweir enum SvXMLStyleTokens 248cdf0e10cSrcweir { 249cdf0e10cSrcweir XML_TOK_STYLE_TEXT, 250cdf0e10cSrcweir XML_TOK_STYLE_NUMBER, 251cdf0e10cSrcweir XML_TOK_STYLE_SCIENTIFIC_NUMBER, 252cdf0e10cSrcweir XML_TOK_STYLE_FRACTION, 253cdf0e10cSrcweir XML_TOK_STYLE_CURRENCY_SYMBOL, 254cdf0e10cSrcweir XML_TOK_STYLE_DAY, 255cdf0e10cSrcweir XML_TOK_STYLE_MONTH, 256cdf0e10cSrcweir XML_TOK_STYLE_YEAR, 257cdf0e10cSrcweir XML_TOK_STYLE_ERA, 258cdf0e10cSrcweir XML_TOK_STYLE_DAY_OF_WEEK, 259cdf0e10cSrcweir XML_TOK_STYLE_WEEK_OF_YEAR, 260cdf0e10cSrcweir XML_TOK_STYLE_QUARTER, 261cdf0e10cSrcweir XML_TOK_STYLE_HOURS, 262cdf0e10cSrcweir XML_TOK_STYLE_AM_PM, 263cdf0e10cSrcweir XML_TOK_STYLE_MINUTES, 264cdf0e10cSrcweir XML_TOK_STYLE_SECONDS, 265cdf0e10cSrcweir XML_TOK_STYLE_BOOLEAN, 266cdf0e10cSrcweir XML_TOK_STYLE_TEXT_CONTENT, 267cdf0e10cSrcweir XML_TOK_STYLE_PROPERTIES, 268cdf0e10cSrcweir XML_TOK_STYLE_MAP 269cdf0e10cSrcweir }; 270cdf0e10cSrcweir 271cdf0e10cSrcweir enum SvXMLStyleAttrTokens 272cdf0e10cSrcweir { 273cdf0e10cSrcweir XML_TOK_STYLE_ATTR_NAME, 274cdf0e10cSrcweir XML_TOK_STYLE_ATTR_LANGUAGE, 275cdf0e10cSrcweir XML_TOK_STYLE_ATTR_COUNTRY, 276cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TITLE, 277cdf0e10cSrcweir XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER, 278cdf0e10cSrcweir XML_TOK_STYLE_ATTR_FORMAT_SOURCE, 279cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW, 280cdf0e10cSrcweir XML_TOK_STYLE_ATTR_VOLATILE, 281cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TRANSL_FORMAT, 282cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE, 283cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TRANSL_COUNTRY, 284cdf0e10cSrcweir XML_TOK_STYLE_ATTR_TRANSL_STYLE 285cdf0e10cSrcweir }; 286cdf0e10cSrcweir 287cdf0e10cSrcweir enum SvXMLStyleElemAttrTokens 288cdf0e10cSrcweir { 289cdf0e10cSrcweir XML_TOK_ELEM_ATTR_DECIMAL_PLACES, 290cdf0e10cSrcweir XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS, 291cdf0e10cSrcweir XML_TOK_ELEM_ATTR_GROUPING, 292cdf0e10cSrcweir XML_TOK_ELEM_ATTR_DISPLAY_FACTOR, 293cdf0e10cSrcweir XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT, 294cdf0e10cSrcweir XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS, 295cdf0e10cSrcweir XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS, 296cdf0e10cSrcweir XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS, 297cdf0e10cSrcweir XML_TOK_ELEM_ATTR_LANGUAGE, 298cdf0e10cSrcweir XML_TOK_ELEM_ATTR_COUNTRY, 299cdf0e10cSrcweir XML_TOK_ELEM_ATTR_STYLE, 300cdf0e10cSrcweir XML_TOK_ELEM_ATTR_TEXTUAL, 301cdf0e10cSrcweir XML_TOK_ELEM_ATTR_CALENDAR 302cdf0e10cSrcweir }; 303cdf0e10cSrcweir 304cdf0e10cSrcweir //------------------------------------------------------------------------- 305cdf0e10cSrcweir 306cdf0e10cSrcweir // 307cdf0e10cSrcweir // standard colors 308cdf0e10cSrcweir // 309cdf0e10cSrcweir 310cdf0e10cSrcweir #define XML_NUMF_COLORCOUNT 10 311cdf0e10cSrcweir 312cdf0e10cSrcweir static ColorData aNumFmtStdColors[XML_NUMF_COLORCOUNT] = 313cdf0e10cSrcweir { 314cdf0e10cSrcweir COL_BLACK, 315cdf0e10cSrcweir COL_LIGHTBLUE, 316cdf0e10cSrcweir COL_LIGHTGREEN, 317cdf0e10cSrcweir COL_LIGHTCYAN, 318cdf0e10cSrcweir COL_LIGHTRED, 319cdf0e10cSrcweir COL_LIGHTMAGENTA, 320cdf0e10cSrcweir COL_BROWN, 321cdf0e10cSrcweir COL_GRAY, 322cdf0e10cSrcweir COL_YELLOW, 323cdf0e10cSrcweir COL_WHITE 324cdf0e10cSrcweir }; 325cdf0e10cSrcweir 326cdf0e10cSrcweir // 327cdf0e10cSrcweir // token maps 328cdf0e10cSrcweir // 329cdf0e10cSrcweir 330cdf0e10cSrcweir // maps for SvXMLUnitConverter::convertEnum 331cdf0e10cSrcweir 332cdf0e10cSrcweir static __FAR_DATA SvXMLEnumMapEntry aStyleValueMap[] = 333cdf0e10cSrcweir { 334cdf0e10cSrcweir { XML_SHORT, sal_False }, 335cdf0e10cSrcweir { XML_LONG, sal_True }, 336cdf0e10cSrcweir { XML_TOKEN_INVALID, 0 } 337cdf0e10cSrcweir }; 338cdf0e10cSrcweir 339cdf0e10cSrcweir static __FAR_DATA SvXMLEnumMapEntry aFormatSourceMap[] = 340cdf0e10cSrcweir { 341cdf0e10cSrcweir { XML_FIXED, sal_False }, 342cdf0e10cSrcweir { XML_LANGUAGE, sal_True }, 343cdf0e10cSrcweir { XML_TOKEN_INVALID, 0 } 344cdf0e10cSrcweir }; 345cdf0e10cSrcweir 346cdf0e10cSrcweir //------------------------------------------------------------------------- 347cdf0e10cSrcweir 348cdf0e10cSrcweir struct SvXMLDefaultDateFormat 349cdf0e10cSrcweir { 350cdf0e10cSrcweir NfIndexTableOffset eFormat; 351cdf0e10cSrcweir SvXMLDateElementAttributes eDOW; 352cdf0e10cSrcweir SvXMLDateElementAttributes eDay; 353cdf0e10cSrcweir SvXMLDateElementAttributes eMonth; 354cdf0e10cSrcweir SvXMLDateElementAttributes eYear; 355cdf0e10cSrcweir SvXMLDateElementAttributes eHours; 356cdf0e10cSrcweir SvXMLDateElementAttributes eMins; 357cdf0e10cSrcweir SvXMLDateElementAttributes eSecs; 358cdf0e10cSrcweir sal_Bool bSystem; 359cdf0e10cSrcweir }; 360cdf0e10cSrcweir 361cdf0e10cSrcweir static __FAR_DATA SvXMLDefaultDateFormat aDefaultDateFormats[] = 362cdf0e10cSrcweir { 363cdf0e10cSrcweir // format day-of-week day month year hours minutes seconds format-source 364cdf0e10cSrcweir 365cdf0e10cSrcweir { NF_DATE_SYSTEM_SHORT, XML_DEA_NONE, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_True }, 366cdf0e10cSrcweir { NF_DATE_SYSTEM_LONG, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_True }, 367cdf0e10cSrcweir { NF_DATE_SYS_MMYY, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_LONG, XML_DEA_SHORT, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 368cdf0e10cSrcweir { NF_DATE_SYS_DDMMM, XML_DEA_NONE, XML_DEA_LONG, XML_DEA_TEXTSHORT, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 369cdf0e10cSrcweir { NF_DATE_SYS_DDMMYYYY, XML_DEA_NONE, XML_DEA_LONG, XML_DEA_LONG, XML_DEA_LONG, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 370cdf0e10cSrcweir { NF_DATE_SYS_DDMMYY, XML_DEA_NONE, XML_DEA_LONG, XML_DEA_LONG, XML_DEA_SHORT, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 371cdf0e10cSrcweir { NF_DATE_SYS_DMMMYY, XML_DEA_NONE, XML_DEA_SHORT, XML_DEA_TEXTSHORT, XML_DEA_SHORT, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 372cdf0e10cSrcweir { NF_DATE_SYS_DMMMYYYY, XML_DEA_NONE, XML_DEA_SHORT, XML_DEA_TEXTSHORT, XML_DEA_LONG, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 373cdf0e10cSrcweir { NF_DATE_SYS_DMMMMYYYY, XML_DEA_NONE, XML_DEA_SHORT, XML_DEA_TEXTLONG, XML_DEA_LONG, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 374cdf0e10cSrcweir { NF_DATE_SYS_NNDMMMYY, XML_DEA_SHORT, XML_DEA_SHORT, XML_DEA_TEXTSHORT, XML_DEA_SHORT, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 375cdf0e10cSrcweir { NF_DATE_SYS_NNDMMMMYYYY, XML_DEA_SHORT, XML_DEA_SHORT, XML_DEA_TEXTLONG, XML_DEA_LONG, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 376cdf0e10cSrcweir { NF_DATE_SYS_NNNNDMMMMYYYY, XML_DEA_LONG, XML_DEA_SHORT, XML_DEA_TEXTLONG, XML_DEA_LONG, XML_DEA_NONE, XML_DEA_NONE, XML_DEA_NONE, sal_False }, 377cdf0e10cSrcweir { NF_DATETIME_SYSTEM_SHORT_HHMM, XML_DEA_NONE, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_NONE, sal_True }, 378cdf0e10cSrcweir { NF_DATETIME_SYS_DDMMYYYY_HHMMSS, XML_DEA_NONE, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, XML_DEA_ANY, sal_False } 379cdf0e10cSrcweir }; 380cdf0e10cSrcweir 381cdf0e10cSrcweir //------------------------------------------------------------------------- 382cdf0e10cSrcweir 383cdf0e10cSrcweir SV_IMPL_PTRARR( SvXMLNumFmtEntryArr, SvXMLNumFmtEntryPtr ); 384cdf0e10cSrcweir SV_IMPL_OP_PTRARR_SORT( SvXMLEmbeddedElementArr, SvXMLEmbeddedElementPtr ); 385cdf0e10cSrcweir 386cdf0e10cSrcweir //------------------------------------------------------------------------- 387cdf0e10cSrcweir 388cdf0e10cSrcweir // 389cdf0e10cSrcweir // SvXMLNumImpData 390cdf0e10cSrcweir // 391cdf0e10cSrcweir 392cdf0e10cSrcweir // #110680# 393cdf0e10cSrcweir // SvXMLNumImpData::SvXMLNumImpData( SvNumberFormatter* pFmt ) : 394cdf0e10cSrcweir SvXMLNumImpData::SvXMLNumImpData( 395cdf0e10cSrcweir SvNumberFormatter* pFmt, 396cdf0e10cSrcweir const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory ) 397cdf0e10cSrcweir : pFormatter(pFmt), 398cdf0e10cSrcweir pStylesElemTokenMap(NULL), 399cdf0e10cSrcweir pStyleElemTokenMap(NULL), 400cdf0e10cSrcweir pStyleAttrTokenMap(NULL), 401cdf0e10cSrcweir pStyleElemAttrTokenMap(NULL), 402cdf0e10cSrcweir pLocaleData(NULL), 403cdf0e10cSrcweir 404cdf0e10cSrcweir // #110680# 405cdf0e10cSrcweir mxServiceFactory(xServiceFactory) 406cdf0e10cSrcweir { 407cdf0e10cSrcweir DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir SvXMLNumImpData::~SvXMLNumImpData() 411cdf0e10cSrcweir { 412cdf0e10cSrcweir delete pStylesElemTokenMap; 413cdf0e10cSrcweir delete pStyleElemTokenMap; 414cdf0e10cSrcweir delete pStyleAttrTokenMap; 415cdf0e10cSrcweir delete pStyleElemAttrTokenMap; 416cdf0e10cSrcweir delete pLocaleData; 417cdf0e10cSrcweir } 418cdf0e10cSrcweir 419cdf0e10cSrcweir sal_uInt32 SvXMLNumImpData::GetKeyForName( const rtl::OUString& rName ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir sal_uInt16 nCount = aNameEntries.Count(); 422cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 423cdf0e10cSrcweir { 424cdf0e10cSrcweir const SvXMLNumFmtEntry* pObj = aNameEntries[i]; 425cdf0e10cSrcweir if ( pObj->aName == rName ) 426cdf0e10cSrcweir return pObj->nKey; // found 427cdf0e10cSrcweir } 428cdf0e10cSrcweir return NUMBERFORMAT_ENTRY_NOT_FOUND; 429cdf0e10cSrcweir } 430cdf0e10cSrcweir 431cdf0e10cSrcweir void SvXMLNumImpData::AddKey( sal_uInt32 nKey, const rtl::OUString& rName, sal_Bool bRemoveAfterUse ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir if ( bRemoveAfterUse ) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir // if there is already an entry for this key without the bRemoveAfterUse flag, 436cdf0e10cSrcweir // clear the flag for this entry, too 437cdf0e10cSrcweir 438cdf0e10cSrcweir sal_uInt16 nCount = aNameEntries.Count(); 439cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir SvXMLNumFmtEntry* pObj = aNameEntries[i]; 442cdf0e10cSrcweir if ( pObj->nKey == nKey && !pObj->bRemoveAfterUse ) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir bRemoveAfterUse = sal_False; // clear flag for new entry 445cdf0e10cSrcweir break; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir } 448cdf0e10cSrcweir } 449cdf0e10cSrcweir else 450cdf0e10cSrcweir { 451cdf0e10cSrcweir // call SetUsed to clear the bRemoveAfterUse flag for other entries for this key 452cdf0e10cSrcweir SetUsed( nKey ); 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir SvXMLNumFmtEntry* pObj = new SvXMLNumFmtEntry( rName, nKey, bRemoveAfterUse ); 456cdf0e10cSrcweir aNameEntries.Insert( pObj, aNameEntries.Count() ); 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir void SvXMLNumImpData::SetUsed( sal_uInt32 nKey ) 460cdf0e10cSrcweir { 461cdf0e10cSrcweir sal_uInt16 nCount = aNameEntries.Count(); 462cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 463cdf0e10cSrcweir { 464cdf0e10cSrcweir SvXMLNumFmtEntry* pObj = aNameEntries[i]; 465cdf0e10cSrcweir if ( pObj->nKey == nKey ) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir pObj->bRemoveAfterUse = sal_False; // used -> don't remove 468cdf0e10cSrcweir 469cdf0e10cSrcweir // continue searching - there may be several entries for the same key 470cdf0e10cSrcweir // (with different names), the format must not be deleted if any one of 471cdf0e10cSrcweir // them is used 472cdf0e10cSrcweir } 473cdf0e10cSrcweir } 474cdf0e10cSrcweir } 475cdf0e10cSrcweir 476cdf0e10cSrcweir void SvXMLNumImpData::RemoveVolatileFormats() 477cdf0e10cSrcweir { 478cdf0e10cSrcweir // remove temporary (volatile) formats from NumberFormatter 479cdf0e10cSrcweir // called at the end of each import (styles and content), so volatile formats 480cdf0e10cSrcweir // from styles can't be used in content 481cdf0e10cSrcweir 482cdf0e10cSrcweir if ( !pFormatter ) 483cdf0e10cSrcweir return; 484cdf0e10cSrcweir 485cdf0e10cSrcweir sal_uInt16 nCount = aNameEntries.Count(); 486cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 487cdf0e10cSrcweir { 488cdf0e10cSrcweir const SvXMLNumFmtEntry* pObj = aNameEntries[i]; 489cdf0e10cSrcweir if ( pObj->bRemoveAfterUse ) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir const SvNumberformat* pFormat = pFormatter->GetEntry(pObj->nKey); 492cdf0e10cSrcweir if (pFormat && (pFormat->GetType() & NUMBERFORMAT_DEFINED)) 493cdf0e10cSrcweir pFormatter->DeleteEntry( pObj->nKey ); 494cdf0e10cSrcweir } 495cdf0e10cSrcweir } 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir const SvXMLTokenMap& SvXMLNumImpData::GetStylesElemTokenMap() 499cdf0e10cSrcweir { 500cdf0e10cSrcweir if( !pStylesElemTokenMap ) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aStylesElemMap[] = 503cdf0e10cSrcweir { 504cdf0e10cSrcweir // style elements 505cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_NUMBER_STYLE, XML_TOK_STYLES_NUMBER_STYLE }, 506cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_CURRENCY_STYLE, XML_TOK_STYLES_CURRENCY_STYLE }, 507cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_PERCENTAGE_STYLE, XML_TOK_STYLES_PERCENTAGE_STYLE }, 508cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DATE_STYLE, XML_TOK_STYLES_DATE_STYLE }, 509cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TIME_STYLE, XML_TOK_STYLES_TIME_STYLE }, 510cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_BOOLEAN_STYLE, XML_TOK_STYLES_BOOLEAN_STYLE }, 511cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TEXT_STYLE, XML_TOK_STYLES_TEXT_STYLE }, 512cdf0e10cSrcweir XML_TOKEN_MAP_END 513cdf0e10cSrcweir }; 514cdf0e10cSrcweir 515cdf0e10cSrcweir pStylesElemTokenMap = new SvXMLTokenMap( aStylesElemMap ); 516cdf0e10cSrcweir } 517cdf0e10cSrcweir return *pStylesElemTokenMap; 518cdf0e10cSrcweir } 519cdf0e10cSrcweir 520cdf0e10cSrcweir const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemTokenMap() 521cdf0e10cSrcweir { 522cdf0e10cSrcweir if( !pStyleElemTokenMap ) 523cdf0e10cSrcweir { 524cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aStyleElemMap[] = 525cdf0e10cSrcweir { 526cdf0e10cSrcweir // elements in a style 527cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TEXT, XML_TOK_STYLE_TEXT }, 528cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_NUMBER, XML_TOK_STYLE_NUMBER }, 529cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER, XML_TOK_STYLE_SCIENTIFIC_NUMBER }, 530cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_FRACTION, XML_TOK_STYLE_FRACTION }, 531cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_CURRENCY_SYMBOL, XML_TOK_STYLE_CURRENCY_SYMBOL }, 532cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DAY, XML_TOK_STYLE_DAY }, 533cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MONTH, XML_TOK_STYLE_MONTH }, 534cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_YEAR, XML_TOK_STYLE_YEAR }, 535cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_ERA, XML_TOK_STYLE_ERA }, 536cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DAY_OF_WEEK, XML_TOK_STYLE_DAY_OF_WEEK }, 537cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_WEEK_OF_YEAR, XML_TOK_STYLE_WEEK_OF_YEAR }, 538cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_QUARTER, XML_TOK_STYLE_QUARTER }, 539cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_HOURS, XML_TOK_STYLE_HOURS }, 540cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_AM_PM, XML_TOK_STYLE_AM_PM }, 541cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MINUTES, XML_TOK_STYLE_MINUTES }, 542cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_SECONDS, XML_TOK_STYLE_SECONDS }, 543cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_BOOLEAN, XML_TOK_STYLE_BOOLEAN }, 544cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TEXT_CONTENT, XML_TOK_STYLE_TEXT_CONTENT }, 545cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_TEXT_PROPERTIES, XML_TOK_STYLE_PROPERTIES }, 546cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_MAP, XML_TOK_STYLE_MAP }, 547cdf0e10cSrcweir XML_TOKEN_MAP_END 548cdf0e10cSrcweir }; 549cdf0e10cSrcweir 550cdf0e10cSrcweir pStyleElemTokenMap = new SvXMLTokenMap( aStyleElemMap ); 551cdf0e10cSrcweir } 552cdf0e10cSrcweir return *pStyleElemTokenMap; 553cdf0e10cSrcweir } 554cdf0e10cSrcweir 555cdf0e10cSrcweir const SvXMLTokenMap& SvXMLNumImpData::GetStyleAttrTokenMap() 556cdf0e10cSrcweir { 557cdf0e10cSrcweir if( !pStyleAttrTokenMap ) 558cdf0e10cSrcweir { 559cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aStyleAttrMap[] = 560cdf0e10cSrcweir { 561cdf0e10cSrcweir // attributes for a style 562cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_NAME, XML_TOK_STYLE_ATTR_NAME }, 563cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_LANGUAGE, XML_TOK_STYLE_ATTR_LANGUAGE }, 564cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_COUNTRY, XML_TOK_STYLE_ATTR_COUNTRY }, 565cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TITLE, XML_TOK_STYLE_ATTR_TITLE }, 566cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_AUTOMATIC_ORDER, XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER }, 567cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_FORMAT_SOURCE, XML_TOK_STYLE_ATTR_FORMAT_SOURCE }, 568cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TRUNCATE_ON_OVERFLOW, XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW }, 569cdf0e10cSrcweir { XML_NAMESPACE_STYLE, XML_VOLATILE, XML_TOK_STYLE_ATTR_VOLATILE }, 570cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_FORMAT, XML_TOK_STYLE_ATTR_TRANSL_FORMAT }, 571cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_LANGUAGE, XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE }, 572cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_COUNTRY, XML_TOK_STYLE_ATTR_TRANSL_COUNTRY }, 573cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_STYLE, XML_TOK_STYLE_ATTR_TRANSL_STYLE }, 574cdf0e10cSrcweir XML_TOKEN_MAP_END 575cdf0e10cSrcweir }; 576cdf0e10cSrcweir 577cdf0e10cSrcweir pStyleAttrTokenMap = new SvXMLTokenMap( aStyleAttrMap ); 578cdf0e10cSrcweir } 579cdf0e10cSrcweir return *pStyleAttrTokenMap; 580cdf0e10cSrcweir } 581cdf0e10cSrcweir 582cdf0e10cSrcweir const SvXMLTokenMap& SvXMLNumImpData::GetStyleElemAttrTokenMap() 583cdf0e10cSrcweir { 584cdf0e10cSrcweir if( !pStyleElemAttrTokenMap ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir static __FAR_DATA SvXMLTokenMapEntry aStyleElemAttrMap[] = 587cdf0e10cSrcweir { 588cdf0e10cSrcweir // attributes for an element within a style 589cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, XML_TOK_ELEM_ATTR_DECIMAL_PLACES }, 590cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS, XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS }, 591cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TOK_ELEM_ATTR_GROUPING }, 592cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DISPLAY_FACTOR, XML_TOK_ELEM_ATTR_DISPLAY_FACTOR }, 593cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT, XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT }, 594cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS, XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS }, 595cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS }, 596cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS, XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS }, 597cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_LANGUAGE, XML_TOK_ELEM_ATTR_LANGUAGE }, 598cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_COUNTRY, XML_TOK_ELEM_ATTR_COUNTRY }, 599cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_STYLE, XML_TOK_ELEM_ATTR_STYLE }, 600cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_TEXTUAL, XML_TOK_ELEM_ATTR_TEXTUAL }, 601cdf0e10cSrcweir { XML_NAMESPACE_NUMBER, XML_CALENDAR, XML_TOK_ELEM_ATTR_CALENDAR }, 602cdf0e10cSrcweir XML_TOKEN_MAP_END 603cdf0e10cSrcweir }; 604cdf0e10cSrcweir 605cdf0e10cSrcweir pStyleElemAttrTokenMap = new SvXMLTokenMap( aStyleElemAttrMap ); 606cdf0e10cSrcweir } 607cdf0e10cSrcweir return *pStyleElemAttrTokenMap; 608cdf0e10cSrcweir } 609cdf0e10cSrcweir 610cdf0e10cSrcweir const LocaleDataWrapper& SvXMLNumImpData::GetLocaleData( LanguageType nLang ) 611cdf0e10cSrcweir { 612cdf0e10cSrcweir if ( !pLocaleData ) 613cdf0e10cSrcweir // #110680# 614cdf0e10cSrcweir //pLocaleData = new LocaleDataWrapper( 615cdf0e10cSrcweir // (pFormatter ? pFormatter->GetServiceManager() : 616cdf0e10cSrcweir // ::comphelper::getProcessServiceFactory()), 617cdf0e10cSrcweir // MsLangId::convertLanguageToLocale( nLang ) ); 618cdf0e10cSrcweir pLocaleData = new LocaleDataWrapper( 619cdf0e10cSrcweir (pFormatter ? pFormatter->GetServiceManager() : 620cdf0e10cSrcweir mxServiceFactory), 621cdf0e10cSrcweir MsLangId::convertLanguageToLocale( nLang ) ); 622cdf0e10cSrcweir else 623cdf0e10cSrcweir pLocaleData->setLocale( MsLangId::convertLanguageToLocale( nLang ) ); 624cdf0e10cSrcweir return *pLocaleData; 625cdf0e10cSrcweir } 626cdf0e10cSrcweir 627cdf0e10cSrcweir //------------------------------------------------------------------------- 628cdf0e10cSrcweir 629cdf0e10cSrcweir // 630cdf0e10cSrcweir // SvXMLNumFmtMapContext 631cdf0e10cSrcweir // 632cdf0e10cSrcweir 633cdf0e10cSrcweir SvXMLNumFmtMapContext::SvXMLNumFmtMapContext( SvXMLImport& rImport, 634cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 635cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, 636cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) : 637cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ), 638cdf0e10cSrcweir rParent( rParentContext ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 641cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 642cdf0e10cSrcweir { 643cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 644cdf0e10cSrcweir OUString sValue = xAttrList->getValueByIndex( i ); 645cdf0e10cSrcweir OUString aLocalName; 646cdf0e10cSrcweir sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 647cdf0e10cSrcweir if ( nPrefix == XML_NAMESPACE_STYLE ) 648cdf0e10cSrcweir { 649cdf0e10cSrcweir if ( IsXMLToken( aLocalName, XML_CONDITION) ) 650cdf0e10cSrcweir sCondition = sValue; 651cdf0e10cSrcweir else if ( IsXMLToken( aLocalName, XML_APPLY_STYLE_NAME) ) 652cdf0e10cSrcweir sName = sValue; 653cdf0e10cSrcweir } 654cdf0e10cSrcweir } 655cdf0e10cSrcweir } 656cdf0e10cSrcweir 657cdf0e10cSrcweir SvXMLNumFmtMapContext::~SvXMLNumFmtMapContext() 658cdf0e10cSrcweir { 659cdf0e10cSrcweir } 660cdf0e10cSrcweir 661cdf0e10cSrcweir SvXMLImportContext* SvXMLNumFmtMapContext::CreateChildContext( 662cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 663cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& ) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir // no elements supported - use default context 666cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), nPrfx, rLName ); 667cdf0e10cSrcweir } 668cdf0e10cSrcweir 669cdf0e10cSrcweir void SvXMLNumFmtMapContext::Characters( const rtl::OUString& ) 670cdf0e10cSrcweir { 671cdf0e10cSrcweir } 672cdf0e10cSrcweir 673cdf0e10cSrcweir void SvXMLNumFmtMapContext::EndElement() 674cdf0e10cSrcweir { 675cdf0e10cSrcweir rParent.AddCondition( sCondition, sName ); 676cdf0e10cSrcweir } 677cdf0e10cSrcweir 678cdf0e10cSrcweir //------------------------------------------------------------------------- 679cdf0e10cSrcweir 680cdf0e10cSrcweir // 681cdf0e10cSrcweir // SvXMLNumFmtPropContext 682cdf0e10cSrcweir // 683cdf0e10cSrcweir 684cdf0e10cSrcweir SvXMLNumFmtPropContext::SvXMLNumFmtPropContext( SvXMLImport& rImport, 685cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 686cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, 687cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) : 688cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ), 689cdf0e10cSrcweir rParent( rParentContext ), 690cdf0e10cSrcweir bColSet( sal_False ) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 693cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 696cdf0e10cSrcweir OUString sValue = xAttrList->getValueByIndex( i ); 697cdf0e10cSrcweir OUString aLocalName; 698cdf0e10cSrcweir sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 699cdf0e10cSrcweir if ( nPrefix == XML_NAMESPACE_FO && IsXMLToken( aLocalName, XML_COLOR ) ) 700cdf0e10cSrcweir bColSet = SvXMLUnitConverter::convertColor( aColor, sValue ); 701cdf0e10cSrcweir } 702cdf0e10cSrcweir } 703cdf0e10cSrcweir 704cdf0e10cSrcweir SvXMLNumFmtPropContext::~SvXMLNumFmtPropContext() 705cdf0e10cSrcweir { 706cdf0e10cSrcweir } 707cdf0e10cSrcweir 708cdf0e10cSrcweir SvXMLImportContext* SvXMLNumFmtPropContext::CreateChildContext( 709cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 710cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& ) 711cdf0e10cSrcweir { 712cdf0e10cSrcweir // no elements supported - use default context 713cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), nPrfx, rLName ); 714cdf0e10cSrcweir } 715cdf0e10cSrcweir 716cdf0e10cSrcweir void SvXMLNumFmtPropContext::Characters( const rtl::OUString& ) 717cdf0e10cSrcweir { 718cdf0e10cSrcweir } 719cdf0e10cSrcweir 720cdf0e10cSrcweir void SvXMLNumFmtPropContext::EndElement() 721cdf0e10cSrcweir { 722cdf0e10cSrcweir if (bColSet) 723cdf0e10cSrcweir rParent.AddColor( aColor ); 724cdf0e10cSrcweir } 725cdf0e10cSrcweir 726cdf0e10cSrcweir //------------------------------------------------------------------------- 727cdf0e10cSrcweir 728cdf0e10cSrcweir // 729cdf0e10cSrcweir // SvXMLNumFmtEmbeddedTextContext 730cdf0e10cSrcweir // 731cdf0e10cSrcweir 732cdf0e10cSrcweir SvXMLNumFmtEmbeddedTextContext::SvXMLNumFmtEmbeddedTextContext( SvXMLImport& rImport, 733cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 734cdf0e10cSrcweir SvXMLNumFmtElementContext& rParentContext, 735cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) : 736cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ), 737cdf0e10cSrcweir rParent( rParentContext ), 738cdf0e10cSrcweir nTextPosition( 0 ) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir sal_Int32 nAttrVal; 741cdf0e10cSrcweir 742cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 743cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 746cdf0e10cSrcweir OUString sValue = xAttrList->getValueByIndex( i ); 747cdf0e10cSrcweir OUString aLocalName; 748cdf0e10cSrcweir sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 749cdf0e10cSrcweir if ( nPrefix == XML_NAMESPACE_NUMBER && IsXMLToken( aLocalName, XML_POSITION ) ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 752cdf0e10cSrcweir nTextPosition = nAttrVal; 753cdf0e10cSrcweir } 754cdf0e10cSrcweir } 755cdf0e10cSrcweir } 756cdf0e10cSrcweir 757cdf0e10cSrcweir SvXMLNumFmtEmbeddedTextContext::~SvXMLNumFmtEmbeddedTextContext() 758cdf0e10cSrcweir { 759cdf0e10cSrcweir } 760cdf0e10cSrcweir 761cdf0e10cSrcweir SvXMLImportContext* SvXMLNumFmtEmbeddedTextContext::CreateChildContext( 762cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 763cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& ) 764cdf0e10cSrcweir { 765cdf0e10cSrcweir // no elements supported - use default context 766cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), nPrfx, rLName ); 767cdf0e10cSrcweir } 768cdf0e10cSrcweir 769cdf0e10cSrcweir void SvXMLNumFmtEmbeddedTextContext::Characters( const rtl::OUString& rChars ) 770cdf0e10cSrcweir { 771cdf0e10cSrcweir aContent.append( rChars ); 772cdf0e10cSrcweir } 773cdf0e10cSrcweir 774cdf0e10cSrcweir void SvXMLNumFmtEmbeddedTextContext::EndElement() 775cdf0e10cSrcweir { 776cdf0e10cSrcweir rParent.AddEmbeddedElement( nTextPosition, aContent.makeStringAndClear() ); 777cdf0e10cSrcweir } 778cdf0e10cSrcweir 779cdf0e10cSrcweir //------------------------------------------------------------------------- 780cdf0e10cSrcweir 781cdf0e10cSrcweir sal_Bool lcl_ValidChar( sal_Unicode cChar, const SvXMLNumFormatContext& rParent ) 782cdf0e10cSrcweir { 783cdf0e10cSrcweir sal_uInt16 nFormatType = rParent.GetType(); 784cdf0e10cSrcweir 785cdf0e10cSrcweir // Treat space equal to non-breaking space separator. 786cdf0e10cSrcweir const sal_Unicode cNBSP = 0x00A0; 787cdf0e10cSrcweir sal_Unicode cTS; 788cdf0e10cSrcweir if ( ( nFormatType == XML_TOK_STYLES_NUMBER_STYLE || 789cdf0e10cSrcweir nFormatType == XML_TOK_STYLES_CURRENCY_STYLE || 790cdf0e10cSrcweir nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE ) && 791cdf0e10cSrcweir (cChar == (cTS = rParent.GetLocaleData().getNumThousandSep().GetChar(0)) || 792cdf0e10cSrcweir (cChar == ' ' && cTS == cNBSP)) ) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir // #i22394# Extra occurrences of thousands separator must be quoted, so they 795cdf0e10cSrcweir // aren't mis-interpreted as display-factor. 796cdf0e10cSrcweir // This must be limited to the format types that can contain a number element, 797cdf0e10cSrcweir // because the same character can be a date separator that should not be quoted 798cdf0e10cSrcweir // in date formats. 799cdf0e10cSrcweir 800cdf0e10cSrcweir return sal_False; // force quotes 801cdf0e10cSrcweir } 802cdf0e10cSrcweir 803cdf0e10cSrcweir // see ImpSvNumberformatScan::Next_Symbol 804cdf0e10cSrcweir if ( cChar == ' ' || 805cdf0e10cSrcweir cChar == '-' || 806cdf0e10cSrcweir cChar == '/' || 807cdf0e10cSrcweir cChar == '.' || 808cdf0e10cSrcweir cChar == ',' || 809cdf0e10cSrcweir cChar == ':' || 810cdf0e10cSrcweir cChar == '\'' ) 811cdf0e10cSrcweir return sal_True; // for all format types 812cdf0e10cSrcweir 813cdf0e10cSrcweir // percent sign must be used without quotes for percentage styles only 814cdf0e10cSrcweir if ( nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE && cChar == '%' ) 815cdf0e10cSrcweir return sal_True; 816cdf0e10cSrcweir 817cdf0e10cSrcweir // don't put quotes around single parentheses (often used for negative numbers) 818cdf0e10cSrcweir if ( ( nFormatType == XML_TOK_STYLES_NUMBER_STYLE || 819cdf0e10cSrcweir nFormatType == XML_TOK_STYLES_CURRENCY_STYLE || 820cdf0e10cSrcweir nFormatType == XML_TOK_STYLES_PERCENTAGE_STYLE ) && 821cdf0e10cSrcweir ( cChar == '(' || cChar == ')' ) ) 822cdf0e10cSrcweir return sal_True; 823cdf0e10cSrcweir 824cdf0e10cSrcweir return sal_False; 825cdf0e10cSrcweir } 826cdf0e10cSrcweir 827cdf0e10cSrcweir void lcl_EnquoteIfNecessary( rtl::OUStringBuffer& rContent, const SvXMLNumFormatContext& rParent ) 828cdf0e10cSrcweir { 829cdf0e10cSrcweir sal_Bool bQuote = sal_True; 830cdf0e10cSrcweir sal_Int32 nLength = rContent.getLength(); 831cdf0e10cSrcweir 832cdf0e10cSrcweir if ( ( nLength == 1 && 833cdf0e10cSrcweir lcl_ValidChar( rContent.charAt(0), rParent ) ) || 834cdf0e10cSrcweir ( nLength == 2 && 835cdf0e10cSrcweir lcl_ValidChar( rContent.charAt(0), rParent ) && 836cdf0e10cSrcweir rContent.charAt(1) == ' ' ) ) 837cdf0e10cSrcweir { 838cdf0e10cSrcweir // don't quote single separator characters like space or percent, 839cdf0e10cSrcweir // or separator characters followed by space (used in date formats) 840cdf0e10cSrcweir bQuote = sal_False; 841cdf0e10cSrcweir } 842cdf0e10cSrcweir else if ( rParent.GetType() == XML_TOK_STYLES_PERCENTAGE_STYLE && nLength > 1 ) 843cdf0e10cSrcweir { 844cdf0e10cSrcweir // the percent character in percentage styles must be left out of quoting 845*86e1cf34SPedro Giffuni // (one occurrence is enough even if there are several percent characters in the string) 846cdf0e10cSrcweir 847cdf0e10cSrcweir rtl::OUString aString( rContent.getStr() ); 848cdf0e10cSrcweir sal_Int32 nPos = aString.indexOf( (sal_Unicode) '%' ); 849cdf0e10cSrcweir if ( nPos >= 0 ) 850cdf0e10cSrcweir { 851cdf0e10cSrcweir if ( nPos + 1 < nLength ) 852cdf0e10cSrcweir { 853cdf0e10cSrcweir if ( nPos + 2 == nLength && lcl_ValidChar( rContent.charAt(nPos + 1), rParent ) ) 854cdf0e10cSrcweir { 855cdf0e10cSrcweir // single character that doesn't need quoting 856cdf0e10cSrcweir } 857cdf0e10cSrcweir else 858cdf0e10cSrcweir { 859cdf0e10cSrcweir // quote text behind percent character 860cdf0e10cSrcweir rContent.insert( nPos + 1, (sal_Unicode) '"' ); 861cdf0e10cSrcweir rContent.append( (sal_Unicode) '"' ); 862cdf0e10cSrcweir } 863cdf0e10cSrcweir } 864cdf0e10cSrcweir if ( nPos > 0 ) 865cdf0e10cSrcweir { 866cdf0e10cSrcweir if ( nPos == 1 && lcl_ValidChar( rContent.charAt(0), rParent ) ) 867cdf0e10cSrcweir { 868cdf0e10cSrcweir // single character that doesn't need quoting 869cdf0e10cSrcweir } 870cdf0e10cSrcweir else 871cdf0e10cSrcweir { 872cdf0e10cSrcweir // quote text before percent character 873cdf0e10cSrcweir rContent.insert( nPos, (sal_Unicode) '"' ); 874cdf0e10cSrcweir rContent.insert( 0, (sal_Unicode) '"' ); 875cdf0e10cSrcweir } 876cdf0e10cSrcweir } 877cdf0e10cSrcweir bQuote = sal_False; 878cdf0e10cSrcweir } 879cdf0e10cSrcweir // else: normal quoting (below) 880cdf0e10cSrcweir } 881cdf0e10cSrcweir 882cdf0e10cSrcweir if ( bQuote ) 883cdf0e10cSrcweir { 884cdf0e10cSrcweir // #i55469# quotes in the string itself have to be escaped 885cdf0e10cSrcweir rtl::OUString aString( rContent.getStr() ); 886cdf0e10cSrcweir bool bEscape = ( aString.indexOf( (sal_Unicode) '"' ) >= 0 ); 887cdf0e10cSrcweir if ( bEscape ) 888cdf0e10cSrcweir { 889cdf0e10cSrcweir // A quote is turned into "\"" - a quote to end quoted text, an escaped quote, 890cdf0e10cSrcweir // and a quote to resume quoting. 891cdf0e10cSrcweir rtl::OUString aInsert( rtl::OUString::createFromAscii( "\"\\\"" ) ); 892cdf0e10cSrcweir 893cdf0e10cSrcweir sal_Int32 nPos = 0; 894cdf0e10cSrcweir while ( nPos < rContent.getLength() ) 895cdf0e10cSrcweir { 896cdf0e10cSrcweir if ( rContent.charAt( nPos ) == (sal_Unicode) '"' ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir rContent.insert( nPos, aInsert ); 899cdf0e10cSrcweir nPos += aInsert.getLength(); 900cdf0e10cSrcweir } 901cdf0e10cSrcweir ++nPos; 902cdf0e10cSrcweir } 903cdf0e10cSrcweir } 904cdf0e10cSrcweir 905cdf0e10cSrcweir // quote string literals 906cdf0e10cSrcweir rContent.insert( 0, (sal_Unicode) '"' ); 907cdf0e10cSrcweir rContent.append( (sal_Unicode) '"' ); 908cdf0e10cSrcweir 909cdf0e10cSrcweir // remove redundant double quotes at start or end 910cdf0e10cSrcweir if ( bEscape ) 911cdf0e10cSrcweir { 912cdf0e10cSrcweir if ( rContent.getLength() > 2 && 913cdf0e10cSrcweir rContent.charAt(0) == (sal_Unicode) '"' && 914cdf0e10cSrcweir rContent.charAt(1) == (sal_Unicode) '"' ) 915cdf0e10cSrcweir { 916cdf0e10cSrcweir String aTrimmed( rContent.makeStringAndClear().copy(2) ); 917cdf0e10cSrcweir rContent = rtl::OUStringBuffer( aTrimmed ); 918cdf0e10cSrcweir } 919cdf0e10cSrcweir 920cdf0e10cSrcweir sal_Int32 nLen = rContent.getLength(); 921cdf0e10cSrcweir if ( nLen > 2 && 922cdf0e10cSrcweir rContent.charAt(nLen-1) == (sal_Unicode) '"' && 923cdf0e10cSrcweir rContent.charAt(nLen-2) == (sal_Unicode) '"' ) 924cdf0e10cSrcweir { 925cdf0e10cSrcweir String aTrimmed( rContent.makeStringAndClear().copy( 0, nLen - 2 ) ); 926cdf0e10cSrcweir rContent = rtl::OUStringBuffer( aTrimmed ); 927cdf0e10cSrcweir } 928cdf0e10cSrcweir } 929cdf0e10cSrcweir } 930cdf0e10cSrcweir } 931cdf0e10cSrcweir 932cdf0e10cSrcweir // 933cdf0e10cSrcweir // SvXMLNumFmtElementContext 934cdf0e10cSrcweir // 935cdf0e10cSrcweir 936cdf0e10cSrcweir SvXMLNumFmtElementContext::SvXMLNumFmtElementContext( SvXMLImport& rImport, 937cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 938cdf0e10cSrcweir SvXMLNumFormatContext& rParentContext, sal_uInt16 nNewType, 939cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) : 940cdf0e10cSrcweir SvXMLImportContext( rImport, nPrfx, rLName ), 941cdf0e10cSrcweir rParent( rParentContext ), 942cdf0e10cSrcweir nType( nNewType ), 943cdf0e10cSrcweir nElementLang( LANGUAGE_SYSTEM ), 944cdf0e10cSrcweir bLong( sal_False ), 945cdf0e10cSrcweir bTextual( sal_False ) 946cdf0e10cSrcweir { 947cdf0e10cSrcweir OUString sLanguage, sCountry; 948cdf0e10cSrcweir sal_Int32 nAttrVal; 949cdf0e10cSrcweir sal_Bool bAttrBool; 950cdf0e10cSrcweir sal_uInt16 nAttrEnum; 951cdf0e10cSrcweir double fAttrDouble; 952cdf0e10cSrcweir 953cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 954cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 955cdf0e10cSrcweir { 956cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 957cdf0e10cSrcweir OUString sValue = xAttrList->getValueByIndex( i ); 958cdf0e10cSrcweir OUString aLocalName; 959cdf0e10cSrcweir sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 960cdf0e10cSrcweir 961cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap = rParent.GetData()->GetStyleElemAttrTokenMap(); 962cdf0e10cSrcweir sal_uInt16 nToken = rTokenMap.Get( nPrefix, aLocalName ); 963cdf0e10cSrcweir 964cdf0e10cSrcweir switch (nToken) 965cdf0e10cSrcweir { 966cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_DECIMAL_PLACES: 967cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 968cdf0e10cSrcweir aNumInfo.nDecimals = nAttrVal; 969cdf0e10cSrcweir break; 970cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_MIN_INTEGER_DIGITS: 971cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 972cdf0e10cSrcweir aNumInfo.nInteger = nAttrVal; 973cdf0e10cSrcweir break; 974cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_GROUPING: 975cdf0e10cSrcweir if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) ) 976cdf0e10cSrcweir aNumInfo.bGrouping = bAttrBool; 977cdf0e10cSrcweir break; 978cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_DISPLAY_FACTOR: 979cdf0e10cSrcweir if ( SvXMLUnitConverter::convertDouble( fAttrDouble, sValue ) ) 980cdf0e10cSrcweir aNumInfo.fDisplayFactor = fAttrDouble; 981cdf0e10cSrcweir break; 982cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_DECIMAL_REPLACEMENT: 983cdf0e10cSrcweir if ( sValue.getLength() > 0 ) 984cdf0e10cSrcweir aNumInfo.bDecReplace = sal_True; // only a default string is supported 985cdf0e10cSrcweir else 986cdf0e10cSrcweir aNumInfo.bVarDecimals = sal_True; // empty replacement string: variable decimals 987cdf0e10cSrcweir break; 988cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_MIN_EXPONENT_DIGITS: 989cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 990cdf0e10cSrcweir aNumInfo.nExpDigits = nAttrVal; 991cdf0e10cSrcweir break; 992cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_MIN_NUMERATOR_DIGITS: 993cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 994cdf0e10cSrcweir aNumInfo.nNumerDigits = nAttrVal; 995cdf0e10cSrcweir break; 996cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_MIN_DENOMINATOR_DIGITS: 997cdf0e10cSrcweir if ( SvXMLUnitConverter::convertNumber( nAttrVal, sValue, 0 ) ) 998cdf0e10cSrcweir aNumInfo.nDenomDigits = nAttrVal; 999cdf0e10cSrcweir break; 1000cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_LANGUAGE: 1001cdf0e10cSrcweir sLanguage = sValue; 1002cdf0e10cSrcweir break; 1003cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_COUNTRY: 1004cdf0e10cSrcweir sCountry = sValue; 1005cdf0e10cSrcweir break; 1006cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_STYLE: 1007cdf0e10cSrcweir if ( SvXMLUnitConverter::convertEnum( nAttrEnum, sValue, aStyleValueMap ) ) 1008cdf0e10cSrcweir bLong = (sal_Bool) nAttrEnum; 1009cdf0e10cSrcweir break; 1010cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_TEXTUAL: 1011cdf0e10cSrcweir if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) ) 1012cdf0e10cSrcweir bTextual = bAttrBool; 1013cdf0e10cSrcweir break; 1014cdf0e10cSrcweir case XML_TOK_ELEM_ATTR_CALENDAR: 1015cdf0e10cSrcweir sCalendar = sValue; 1016cdf0e10cSrcweir break; 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir } 1019cdf0e10cSrcweir 1020cdf0e10cSrcweir if ( sLanguage.getLength() || sCountry.getLength() ) 1021cdf0e10cSrcweir { 1022cdf0e10cSrcweir nElementLang = MsLangId::convertIsoNamesToLanguage( sLanguage, sCountry ); 1023cdf0e10cSrcweir if ( nElementLang == LANGUAGE_DONTKNOW ) 1024cdf0e10cSrcweir nElementLang = LANGUAGE_SYSTEM; //! error handling for invalid locales? 1025cdf0e10cSrcweir } 1026cdf0e10cSrcweir } 1027cdf0e10cSrcweir 1028cdf0e10cSrcweir SvXMLNumFmtElementContext::~SvXMLNumFmtElementContext() 1029cdf0e10cSrcweir { 1030cdf0e10cSrcweir } 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir SvXMLImportContext* SvXMLNumFmtElementContext::CreateChildContext( 1033cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 1034cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 1035cdf0e10cSrcweir { 1036cdf0e10cSrcweir // only number:number supports number:embedded-text child element 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir if ( nType == XML_TOK_STYLE_NUMBER && 1039cdf0e10cSrcweir nPrfx == XML_NAMESPACE_NUMBER && IsXMLToken( rLName, XML_EMBEDDED_TEXT ) ) 1040cdf0e10cSrcweir { 1041cdf0e10cSrcweir return new SvXMLNumFmtEmbeddedTextContext( GetImport(), nPrfx, rLName, *this, xAttrList ); 1042cdf0e10cSrcweir } 1043cdf0e10cSrcweir else 1044cdf0e10cSrcweir return new SvXMLImportContext( GetImport(), nPrfx, rLName ); 1045cdf0e10cSrcweir } 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir void SvXMLNumFmtElementContext::Characters( const rtl::OUString& rChars ) 1048cdf0e10cSrcweir { 1049cdf0e10cSrcweir aContent.append( rChars ); 1050cdf0e10cSrcweir } 1051cdf0e10cSrcweir 1052cdf0e10cSrcweir void SvXMLNumFmtElementContext::AddEmbeddedElement( sal_Int32 nFormatPos, const rtl::OUString& rContent ) 1053cdf0e10cSrcweir { 1054cdf0e10cSrcweir if ( rContent.getLength() ) 1055cdf0e10cSrcweir { 1056cdf0e10cSrcweir SvXMLEmbeddedElement* pObj = new SvXMLEmbeddedElement( nFormatPos, rContent ); 1057cdf0e10cSrcweir if ( !aNumInfo.aEmbeddedElements.Insert( pObj ) ) 1058cdf0e10cSrcweir { 1059cdf0e10cSrcweir // there's already an element at this position - append text to existing element 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir delete pObj; 1062cdf0e10cSrcweir sal_uInt16 nElementCount = aNumInfo.aEmbeddedElements.Count(); 1063cdf0e10cSrcweir for (sal_uInt16 i=0; i<nElementCount; i++) 1064cdf0e10cSrcweir { 1065cdf0e10cSrcweir pObj = aNumInfo.aEmbeddedElements[i]; 1066cdf0e10cSrcweir if ( pObj->nFormatPos == nFormatPos ) 1067cdf0e10cSrcweir { 1068cdf0e10cSrcweir pObj->aText += rContent; 1069cdf0e10cSrcweir break; 1070cdf0e10cSrcweir } 1071cdf0e10cSrcweir } 1072cdf0e10cSrcweir } 1073cdf0e10cSrcweir } 1074cdf0e10cSrcweir } 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir void SvXMLNumFmtElementContext::EndElement() 1077cdf0e10cSrcweir { 1078cdf0e10cSrcweir sal_Bool bEffLong = bLong; 1079cdf0e10cSrcweir switch (nType) 1080cdf0e10cSrcweir { 1081cdf0e10cSrcweir case XML_TOK_STYLE_TEXT: 1082cdf0e10cSrcweir if ( rParent.HasLongDoW() && 1083cdf0e10cSrcweir rParent.GetLocaleData().getLongDateDayOfWeekSep() == 1084cdf0e10cSrcweir String( aContent.getStr() ) ) 1085cdf0e10cSrcweir { 1086cdf0e10cSrcweir // skip separator constant after long day of week 1087cdf0e10cSrcweir // (NF_KEY_NNNN contains the separator) 1088cdf0e10cSrcweir 1089cdf0e10cSrcweir if ( rParent.ReplaceNfKeyword( NF_KEY_NNN, NF_KEY_NNNN ) ) 1090cdf0e10cSrcweir { 1091cdf0e10cSrcweir //!aContent.setLength(0); //! doesn't work, #76293# 1092cdf0e10cSrcweir aContent = OUStringBuffer(); 1093cdf0e10cSrcweir } 1094cdf0e10cSrcweir 1095cdf0e10cSrcweir rParent.SetHasLongDoW( sal_False ); // only once 1096cdf0e10cSrcweir } 1097cdf0e10cSrcweir if ( aContent.getLength() ) 1098cdf0e10cSrcweir { 1099cdf0e10cSrcweir lcl_EnquoteIfNecessary( aContent, rParent ); 1100cdf0e10cSrcweir rParent.AddToCode( aContent.makeStringAndClear() ); 1101cdf0e10cSrcweir } 1102cdf0e10cSrcweir break; 1103cdf0e10cSrcweir 1104cdf0e10cSrcweir case XML_TOK_STYLE_NUMBER: 1105cdf0e10cSrcweir rParent.AddNumber( aNumInfo ); 1106cdf0e10cSrcweir break; 1107cdf0e10cSrcweir 1108cdf0e10cSrcweir case XML_TOK_STYLE_CURRENCY_SYMBOL: 1109cdf0e10cSrcweir rParent.AddCurrency( aContent.makeStringAndClear(), nElementLang ); 1110cdf0e10cSrcweir break; 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir case XML_TOK_STYLE_TEXT_CONTENT: 1113cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'@') ); 1114cdf0e10cSrcweir break; 1115cdf0e10cSrcweir case XML_TOK_STYLE_BOOLEAN: 1116cdf0e10cSrcweir // ignored - only default boolean format is supported 1117cdf0e10cSrcweir break; 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir case XML_TOK_STYLE_DAY: 1120cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1121cdf0e10cSrcweir #if 0 1122cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1123cdf0e10cSrcweir if ( rParent.IsFromSystem() ) 1124cdf0e10cSrcweir bEffLong = SvXMLNumFmtDefaults::IsSystemLongDay( rParent.GetInternational(), bLong ); 1125cdf0e10cSrcweir #endif 1126cdf0e10cSrcweir rParent.AddNfKeyword( 1127cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1128cdf0e10cSrcweir bEffLong ? NF_KEY_DD : NF_KEY_D ) ); 1129cdf0e10cSrcweir break; 1130cdf0e10cSrcweir case XML_TOK_STYLE_MONTH: 1131cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1132cdf0e10cSrcweir #if 0 1133cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1134cdf0e10cSrcweir if ( rParent.IsFromSystem() ) 1135cdf0e10cSrcweir { 1136cdf0e10cSrcweir bEffLong = SvXMLNumFmtDefaults::IsSystemLongMonth( rParent.GetInternational(), bLong ); 1137cdf0e10cSrcweir bTextual = SvXMLNumFmtDefaults::IsSystemTextualMonth( rParent.GetInternational(), bLong ); 1138cdf0e10cSrcweir } 1139cdf0e10cSrcweir #endif 1140cdf0e10cSrcweir rParent.AddNfKeyword( 1141cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1142cdf0e10cSrcweir bTextual 1143cdf0e10cSrcweir ? ( bEffLong ? NF_KEY_MMMM : NF_KEY_MMM ) 1144cdf0e10cSrcweir : ( bEffLong ? NF_KEY_MM : NF_KEY_M ) ) ); 1145cdf0e10cSrcweir break; 1146cdf0e10cSrcweir case XML_TOK_STYLE_YEAR: 1147cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1148cdf0e10cSrcweir #if 0 1149cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1150cdf0e10cSrcweir if ( rParent.IsFromSystem() ) 1151cdf0e10cSrcweir bEffLong = SvXMLNumFmtDefaults::IsSystemLongYear( rParent.GetInternational(), bLong ); 1152cdf0e10cSrcweir #endif 1153cdf0e10cSrcweir // Y after G (era) is replaced by E 1154cdf0e10cSrcweir if ( rParent.HasEra() ) 1155cdf0e10cSrcweir rParent.AddNfKeyword( 1156cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1157cdf0e10cSrcweir bEffLong ? NF_KEY_EEC : NF_KEY_EC ) ); 1158cdf0e10cSrcweir else 1159cdf0e10cSrcweir rParent.AddNfKeyword( 1160cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1161cdf0e10cSrcweir bEffLong ? NF_KEY_YYYY : NF_KEY_YY ) ); 1162cdf0e10cSrcweir break; 1163cdf0e10cSrcweir case XML_TOK_STYLE_ERA: 1164cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1165cdf0e10cSrcweir #if 0 1166cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1167cdf0e10cSrcweir if ( rParent.IsFromSystem() ) 1168cdf0e10cSrcweir bEffLong = SvXMLNumFmtDefaults::IsSystemLongEra( rParent.GetInternational(), bLong ); 1169cdf0e10cSrcweir #endif 1170cdf0e10cSrcweir rParent.AddNfKeyword( 1171cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1172cdf0e10cSrcweir bEffLong ? NF_KEY_GGG : NF_KEY_G ) ); 1173cdf0e10cSrcweir // HasEra flag is set 1174cdf0e10cSrcweir break; 1175cdf0e10cSrcweir case XML_TOK_STYLE_DAY_OF_WEEK: 1176cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1177cdf0e10cSrcweir #if 0 1178cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1179cdf0e10cSrcweir if ( rParent.IsFromSystem() ) 1180cdf0e10cSrcweir bEffLong = SvXMLNumFmtDefaults::IsSystemLongDayOfWeek( rParent.GetInternational(), bLong ); 1181cdf0e10cSrcweir #endif 1182cdf0e10cSrcweir rParent.AddNfKeyword( 1183cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1184cdf0e10cSrcweir bEffLong ? NF_KEY_NNNN : NF_KEY_NN ) ); 1185cdf0e10cSrcweir break; 1186cdf0e10cSrcweir case XML_TOK_STYLE_WEEK_OF_YEAR: 1187cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1188cdf0e10cSrcweir rParent.AddNfKeyword( NF_KEY_WW ); 1189cdf0e10cSrcweir break; 1190cdf0e10cSrcweir case XML_TOK_STYLE_QUARTER: 1191cdf0e10cSrcweir rParent.UpdateCalendar( sCalendar ); 1192cdf0e10cSrcweir rParent.AddNfKeyword( 1193cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1194cdf0e10cSrcweir bEffLong ? NF_KEY_QQ : NF_KEY_Q ) ); 1195cdf0e10cSrcweir break; 1196cdf0e10cSrcweir case XML_TOK_STYLE_HOURS: 1197cdf0e10cSrcweir rParent.AddNfKeyword( 1198cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1199cdf0e10cSrcweir bEffLong ? NF_KEY_HH : NF_KEY_H ) ); 1200cdf0e10cSrcweir break; 1201cdf0e10cSrcweir case XML_TOK_STYLE_AM_PM: 1202cdf0e10cSrcweir //! short/long? 1203cdf0e10cSrcweir rParent.AddNfKeyword( NF_KEY_AMPM ); 1204cdf0e10cSrcweir break; 1205cdf0e10cSrcweir case XML_TOK_STYLE_MINUTES: 1206cdf0e10cSrcweir rParent.AddNfKeyword( 1207cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1208cdf0e10cSrcweir bEffLong ? NF_KEY_MMI : NF_KEY_MI ) ); 1209cdf0e10cSrcweir break; 1210cdf0e10cSrcweir case XML_TOK_STYLE_SECONDS: 1211cdf0e10cSrcweir rParent.AddNfKeyword( 1212cdf0e10cSrcweir sal::static_int_cast< sal_uInt16 >( 1213cdf0e10cSrcweir bEffLong ? NF_KEY_SS : NF_KEY_S ) ); 1214cdf0e10cSrcweir if ( aNumInfo.nDecimals > 0 ) 1215cdf0e10cSrcweir { 1216cdf0e10cSrcweir // manually add the decimal places 1217cdf0e10cSrcweir const String& rSep = rParent.GetLocaleData().getNumDecimalSep(); 1218cdf0e10cSrcweir for ( xub_StrLen j=0; j<rSep.Len(); j++ ) 1219cdf0e10cSrcweir { 1220cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf( rSep.GetChar(j) ) ); 1221cdf0e10cSrcweir } 1222cdf0e10cSrcweir for (sal_Int32 i=0; i<aNumInfo.nDecimals; i++) 1223cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'0') ); 1224cdf0e10cSrcweir } 1225cdf0e10cSrcweir break; 1226cdf0e10cSrcweir 1227cdf0e10cSrcweir case XML_TOK_STYLE_FRACTION: 1228cdf0e10cSrcweir { 1229cdf0e10cSrcweir if ( aNumInfo.nInteger >= 0 ) 1230cdf0e10cSrcweir { 1231cdf0e10cSrcweir // add integer part only if min-integer-digits attribute is there 1232cdf0e10cSrcweir aNumInfo.nDecimals = 0; 1233cdf0e10cSrcweir rParent.AddNumber( aNumInfo ); // number without decimals 1234cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)' ') ); 1235cdf0e10cSrcweir } 1236cdf0e10cSrcweir 1237cdf0e10cSrcweir //! build string and add at once 1238cdf0e10cSrcweir 1239cdf0e10cSrcweir sal_Int32 i; 1240cdf0e10cSrcweir for (i=0; i<aNumInfo.nNumerDigits; i++) 1241cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'?') ); 1242cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'/') ); 1243cdf0e10cSrcweir for (i=0; i<aNumInfo.nDenomDigits; i++) 1244cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'?') ); 1245cdf0e10cSrcweir } 1246cdf0e10cSrcweir break; 1247cdf0e10cSrcweir 1248cdf0e10cSrcweir case XML_TOK_STYLE_SCIENTIFIC_NUMBER: 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir rParent.AddNumber( aNumInfo ); // simple number 1251cdf0e10cSrcweir 1252cdf0e10cSrcweir rParent.AddToCode( OUString::createFromAscii( "E+" ) ); 1253cdf0e10cSrcweir for (sal_Int32 i=0; i<aNumInfo.nExpDigits; i++) 1254cdf0e10cSrcweir rParent.AddToCode( OUString::valueOf((sal_Unicode)'0') ); 1255cdf0e10cSrcweir } 1256cdf0e10cSrcweir break; 1257cdf0e10cSrcweir 1258cdf0e10cSrcweir default: 1259cdf0e10cSrcweir DBG_ERROR("invalid element ID"); 1260cdf0e10cSrcweir } 1261cdf0e10cSrcweir } 1262cdf0e10cSrcweir 1263cdf0e10cSrcweir //------------------------------------------------------------------------- 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemLongDay( const SvtSysLocale&, sal_Bool bLong ) 1266cdf0e10cSrcweir { 1267cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1268cdf0e10cSrcweir #if 0 1269cdf0e10cSrcweir return bLong ? rIntn.IsLongDateDayLeadingZero() : rIntn.IsDateDayLeadingZero(); 1270cdf0e10cSrcweir #else 1271cdf0e10cSrcweir return !bLong; 1272cdf0e10cSrcweir #endif 1273cdf0e10cSrcweir } 1274cdf0e10cSrcweir 1275cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemLongMonth( const SvtSysLocale&, sal_Bool bLong ) 1276cdf0e10cSrcweir { 1277cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1278cdf0e10cSrcweir #if 0 1279cdf0e10cSrcweir if (bLong) 1280cdf0e10cSrcweir { 1281cdf0e10cSrcweir MonthFormat eMonth = rIntn.GetLongDateMonthFormat(); 1282cdf0e10cSrcweir return ( eMonth == MONTH_ZERO || eMonth == MONTH_LONG ); 1283cdf0e10cSrcweir } 1284cdf0e10cSrcweir else 1285cdf0e10cSrcweir return rIntn.IsDateMonthLeadingZero(); 1286cdf0e10cSrcweir #else 1287cdf0e10cSrcweir return !bLong; 1288cdf0e10cSrcweir #endif 1289cdf0e10cSrcweir } 1290cdf0e10cSrcweir 1291cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemTextualMonth( const SvtSysLocale&, sal_Bool bLong ) 1292cdf0e10cSrcweir { 1293cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1294cdf0e10cSrcweir #if 0 1295cdf0e10cSrcweir if (bLong) 1296cdf0e10cSrcweir { 1297cdf0e10cSrcweir MonthFormat eMonth = rIntn.GetLongDateMonthFormat(); 1298cdf0e10cSrcweir return ( eMonth == MONTH_SHORT || eMonth == MONTH_LONG ); 1299cdf0e10cSrcweir } 1300cdf0e10cSrcweir else 1301cdf0e10cSrcweir return sal_False; 1302cdf0e10cSrcweir #else 1303cdf0e10cSrcweir return bLong; 1304cdf0e10cSrcweir #endif 1305cdf0e10cSrcweir } 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemLongYear( const SvtSysLocale&, sal_Bool bLong ) 1308cdf0e10cSrcweir { 1309cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1310cdf0e10cSrcweir #if 0 1311cdf0e10cSrcweir return bLong ? rIntn.IsLongDateCentury() : rIntn.IsDateCentury(); 1312cdf0e10cSrcweir #else 1313cdf0e10cSrcweir return bLong; 1314cdf0e10cSrcweir #endif 1315cdf0e10cSrcweir } 1316cdf0e10cSrcweir 1317cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemLongEra( const SvtSysLocale& rSysLoc, sal_Bool bLong ) 1318cdf0e10cSrcweir { 1319cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1320cdf0e10cSrcweir return IsSystemLongYear( rSysLoc, bLong ); // no separate setting 1321cdf0e10cSrcweir } 1322cdf0e10cSrcweir 1323cdf0e10cSrcweir sal_Bool SvXMLNumFmtDefaults::IsSystemLongDayOfWeek( const SvtSysLocale&, sal_Bool bLong ) 1324cdf0e10cSrcweir { 1325cdf0e10cSrcweir // TODO: merge system information and defaults into i18n locale data 1326cdf0e10cSrcweir #if 0 1327cdf0e10cSrcweir return ( bLong && rIntn.GetLongDateDayOfWeekFormat() == DAYOFWEEK_LONG ); 1328cdf0e10cSrcweir #else 1329cdf0e10cSrcweir return bLong && true; 1330cdf0e10cSrcweir #endif 1331cdf0e10cSrcweir } 1332cdf0e10cSrcweir 1333cdf0e10cSrcweir sal_uInt16 SvXMLNumFmtDefaults::GetDefaultDateFormat( SvXMLDateElementAttributes eDOW, 1334cdf0e10cSrcweir SvXMLDateElementAttributes eDay, SvXMLDateElementAttributes eMonth, 1335cdf0e10cSrcweir SvXMLDateElementAttributes eYear, SvXMLDateElementAttributes eHours, 1336cdf0e10cSrcweir SvXMLDateElementAttributes eMins, SvXMLDateElementAttributes eSecs, 1337cdf0e10cSrcweir sal_Bool bSystem ) 1338cdf0e10cSrcweir { 1339cdf0e10cSrcweir const sal_uInt16 nCount = sizeof(aDefaultDateFormats) / sizeof(SvXMLDefaultDateFormat); 1340cdf0e10cSrcweir for (sal_uInt16 nPos=0; nPos<nCount; nPos++) 1341cdf0e10cSrcweir { 1342cdf0e10cSrcweir const SvXMLDefaultDateFormat& rEntry = aDefaultDateFormats[nPos]; 1343cdf0e10cSrcweir if ( bSystem == rEntry.bSystem && 1344cdf0e10cSrcweir ( eDOW == rEntry.eDOW || ( rEntry.eDOW == XML_DEA_ANY && eDOW != XML_DEA_NONE ) ) && 1345cdf0e10cSrcweir ( eDay == rEntry.eDay || ( rEntry.eDay == XML_DEA_ANY && eDay != XML_DEA_NONE ) ) && 1346cdf0e10cSrcweir ( eMonth == rEntry.eMonth || ( rEntry.eMonth == XML_DEA_ANY && eMonth != XML_DEA_NONE ) ) && 1347cdf0e10cSrcweir ( eYear == rEntry.eYear || ( rEntry.eYear == XML_DEA_ANY && eYear != XML_DEA_NONE ) ) && 1348cdf0e10cSrcweir ( eHours == rEntry.eHours || ( rEntry.eHours == XML_DEA_ANY && eHours != XML_DEA_NONE ) ) && 1349cdf0e10cSrcweir ( eMins == rEntry.eMins || ( rEntry.eMins == XML_DEA_ANY && eMins != XML_DEA_NONE ) ) && 1350cdf0e10cSrcweir ( eSecs == rEntry.eSecs || ( rEntry.eSecs == XML_DEA_ANY && eSecs != XML_DEA_NONE ) ) ) 1351cdf0e10cSrcweir { 1352cdf0e10cSrcweir return sal::static_int_cast< sal_uInt16 >(rEntry.eFormat); 1353cdf0e10cSrcweir } 1354cdf0e10cSrcweir } 1355cdf0e10cSrcweir 1356cdf0e10cSrcweir return NF_INDEX_TABLE_ENTRIES; // invalid 1357cdf0e10cSrcweir } 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir //------------------------------------------------------------------------- 1360cdf0e10cSrcweir 1361cdf0e10cSrcweir // 1362cdf0e10cSrcweir // SvXMLNumFormatContext 1363cdf0e10cSrcweir // 1364cdf0e10cSrcweir 1365cdf0e10cSrcweir SvXMLNumFormatContext::SvXMLNumFormatContext( SvXMLImport& rImport, 1366cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 1367cdf0e10cSrcweir SvXMLNumImpData* pNewData, sal_uInt16 nNewType, 1368cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList, 1369cdf0e10cSrcweir SvXMLStylesContext& rStyles ) : 1370cdf0e10cSrcweir SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList ), 1371cdf0e10cSrcweir pData( pNewData ), 1372cdf0e10cSrcweir pStyles( &rStyles ), 1373cdf0e10cSrcweir aMyConditions(), 1374cdf0e10cSrcweir nType( nNewType ), 1375cdf0e10cSrcweir nKey(-1), 1376cdf0e10cSrcweir nFormatLang( LANGUAGE_SYSTEM ), 1377cdf0e10cSrcweir bAutoOrder( sal_False ), 1378cdf0e10cSrcweir bFromSystem( sal_False ), 1379cdf0e10cSrcweir bTruncate( sal_True ), 1380cdf0e10cSrcweir bAutoDec( sal_False ), 1381cdf0e10cSrcweir bAutoInt( sal_False ), 1382cdf0e10cSrcweir bHasExtraText( sal_False ), 1383cdf0e10cSrcweir bHasLongDoW( sal_False ), 1384cdf0e10cSrcweir bHasEra( sal_False ), 1385cdf0e10cSrcweir bHasDateTime( sal_False ), 1386cdf0e10cSrcweir bRemoveAfterUse( sal_False ), 1387cdf0e10cSrcweir eDateDOW( XML_DEA_NONE ), 1388cdf0e10cSrcweir eDateDay( XML_DEA_NONE ), 1389cdf0e10cSrcweir eDateMonth( XML_DEA_NONE ), 1390cdf0e10cSrcweir eDateYear( XML_DEA_NONE ), 1391cdf0e10cSrcweir eDateHours( XML_DEA_NONE ), 1392cdf0e10cSrcweir eDateMins( XML_DEA_NONE ), 1393cdf0e10cSrcweir eDateSecs( XML_DEA_NONE ), 1394cdf0e10cSrcweir bDateNoDefault( sal_False ) 1395cdf0e10cSrcweir { 1396cdf0e10cSrcweir OUString sLanguage, sCountry; 1397cdf0e10cSrcweir ::com::sun::star::i18n::NativeNumberXmlAttributes aNatNumAttr; 1398cdf0e10cSrcweir sal_Bool bAttrBool; 1399cdf0e10cSrcweir sal_uInt16 nAttrEnum; 1400cdf0e10cSrcweir 1401cdf0e10cSrcweir sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; 1402cdf0e10cSrcweir for( sal_Int16 i=0; i < nAttrCount; i++ ) 1403cdf0e10cSrcweir { 1404cdf0e10cSrcweir OUString sAttrName = xAttrList->getNameByIndex( i ); 1405cdf0e10cSrcweir OUString sValue = xAttrList->getValueByIndex( i ); 1406cdf0e10cSrcweir OUString aLocalName; 1407cdf0e10cSrcweir sal_uInt16 nPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); 1408cdf0e10cSrcweir 1409cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap = pData->GetStyleAttrTokenMap(); 1410cdf0e10cSrcweir sal_uInt16 nToken = rTokenMap.Get( nPrefix, aLocalName ); 1411cdf0e10cSrcweir switch (nToken) 1412cdf0e10cSrcweir { 1413cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_NAME: 1414cdf0e10cSrcweir // aName = sValue; 1415cdf0e10cSrcweir break; 1416cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_LANGUAGE: 1417cdf0e10cSrcweir sLanguage = sValue; 1418cdf0e10cSrcweir break; 1419cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_COUNTRY: 1420cdf0e10cSrcweir sCountry = sValue; 1421cdf0e10cSrcweir break; 1422cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TITLE: 1423cdf0e10cSrcweir sFormatTitle = sValue; 1424cdf0e10cSrcweir break; 1425cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_AUTOMATIC_ORDER: 1426cdf0e10cSrcweir if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) ) 1427cdf0e10cSrcweir bAutoOrder = bAttrBool; 1428cdf0e10cSrcweir break; 1429cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_FORMAT_SOURCE: 1430cdf0e10cSrcweir if ( SvXMLUnitConverter::convertEnum( nAttrEnum, sValue, aFormatSourceMap ) ) 1431cdf0e10cSrcweir bFromSystem = (sal_Bool) nAttrEnum; 1432cdf0e10cSrcweir break; 1433cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TRUNCATE_ON_OVERFLOW: 1434cdf0e10cSrcweir if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) ) 1435cdf0e10cSrcweir bTruncate = bAttrBool; 1436cdf0e10cSrcweir break; 1437cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_VOLATILE: 1438cdf0e10cSrcweir // volatile formats can be removed after importing 1439cdf0e10cSrcweir // if not used in other styles 1440cdf0e10cSrcweir if ( SvXMLUnitConverter::convertBool( bAttrBool, sValue ) ) 1441cdf0e10cSrcweir bRemoveAfterUse = bAttrBool; 1442cdf0e10cSrcweir break; 1443cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TRANSL_FORMAT: 1444cdf0e10cSrcweir aNatNumAttr.Format = sValue; 1445cdf0e10cSrcweir break; 1446cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TRANSL_LANGUAGE: 1447cdf0e10cSrcweir aNatNumAttr.Locale.Language = sValue; 1448cdf0e10cSrcweir break; 1449cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TRANSL_COUNTRY: 1450cdf0e10cSrcweir aNatNumAttr.Locale.Country = sValue; 1451cdf0e10cSrcweir break; 1452cdf0e10cSrcweir case XML_TOK_STYLE_ATTR_TRANSL_STYLE: 1453cdf0e10cSrcweir aNatNumAttr.Style = sValue; 1454cdf0e10cSrcweir break; 1455cdf0e10cSrcweir } 1456cdf0e10cSrcweir } 1457cdf0e10cSrcweir 1458cdf0e10cSrcweir if ( sLanguage.getLength() || sCountry.getLength() ) 1459cdf0e10cSrcweir { 1460cdf0e10cSrcweir nFormatLang = MsLangId::convertIsoNamesToLanguage( sLanguage, sCountry ); 1461cdf0e10cSrcweir if ( nFormatLang == LANGUAGE_DONTKNOW ) 1462cdf0e10cSrcweir nFormatLang = LANGUAGE_SYSTEM; //! error handling for invalid locales? 1463cdf0e10cSrcweir } 1464cdf0e10cSrcweir 1465cdf0e10cSrcweir if ( aNatNumAttr.Format.getLength() ) 1466cdf0e10cSrcweir { 1467cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 1468cdf0e10cSrcweir if ( pFormatter ) 1469cdf0e10cSrcweir { 1470cdf0e10cSrcweir sal_Int32 nNatNum = pFormatter->GetNatNum()->convertFromXmlAttributes( aNatNumAttr ); 1471cdf0e10cSrcweir aFormatCode.appendAscii( RTL_CONSTASCII_STRINGPARAM( "[NatNum" ) ); 1472cdf0e10cSrcweir aFormatCode.append( nNatNum, 10 ); 1473cdf0e10cSrcweir 1474cdf0e10cSrcweir LanguageType eLang = MsLangId::convertLocaleToLanguage( aNatNumAttr.Locale ); 1475cdf0e10cSrcweir if ( eLang == LANGUAGE_DONTKNOW ) 1476cdf0e10cSrcweir eLang = LANGUAGE_SYSTEM; //! error handling for invalid locales? 1477cdf0e10cSrcweir if ( eLang != nFormatLang && eLang != LANGUAGE_SYSTEM ) 1478cdf0e10cSrcweir { 1479cdf0e10cSrcweir aFormatCode.appendAscii( RTL_CONSTASCII_STRINGPARAM( "][$-" ) ); 1480cdf0e10cSrcweir // language code in upper hex: 1481cdf0e10cSrcweir aFormatCode.append( String::CreateFromInt32( sal_Int32( eLang ), 16 ).ToUpperAscii() ); 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir aFormatCode.append( sal_Unicode(']') ); 1484cdf0e10cSrcweir } 1485cdf0e10cSrcweir } 1486cdf0e10cSrcweir } 1487cdf0e10cSrcweir 1488cdf0e10cSrcweir SvXMLNumFormatContext::SvXMLNumFormatContext( SvXMLImport& rImport, 1489cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 1490cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList, 1491cdf0e10cSrcweir const sal_Int32 nTempKey, 1492cdf0e10cSrcweir SvXMLStylesContext& rStyles ) : 1493cdf0e10cSrcweir SvXMLStyleContext( rImport, nPrfx, rLName, xAttrList, XML_STYLE_FAMILY_DATA_STYLE ), 1494cdf0e10cSrcweir pData( NULL ), 1495cdf0e10cSrcweir pStyles( &rStyles ), 1496cdf0e10cSrcweir aMyConditions(), 1497cdf0e10cSrcweir nType( 0 ), 1498cdf0e10cSrcweir nKey(nTempKey), 1499cdf0e10cSrcweir nFormatLang( LANGUAGE_SYSTEM ), 1500cdf0e10cSrcweir bAutoOrder( sal_False ), 1501cdf0e10cSrcweir bFromSystem( sal_False ), 1502cdf0e10cSrcweir bTruncate( sal_True ), 1503cdf0e10cSrcweir bAutoDec( sal_False ), 1504cdf0e10cSrcweir bAutoInt( sal_False ), 1505cdf0e10cSrcweir bHasExtraText( sal_False ), 1506cdf0e10cSrcweir bHasLongDoW( sal_False ), 1507cdf0e10cSrcweir bHasEra( sal_False ), 1508cdf0e10cSrcweir bHasDateTime( sal_False ), 1509cdf0e10cSrcweir bRemoveAfterUse( sal_False ), 1510cdf0e10cSrcweir eDateDOW( XML_DEA_NONE ), 1511cdf0e10cSrcweir eDateDay( XML_DEA_NONE ), 1512cdf0e10cSrcweir eDateMonth( XML_DEA_NONE ), 1513cdf0e10cSrcweir eDateYear( XML_DEA_NONE ), 1514cdf0e10cSrcweir eDateHours( XML_DEA_NONE ), 1515cdf0e10cSrcweir eDateMins( XML_DEA_NONE ), 1516cdf0e10cSrcweir eDateSecs( XML_DEA_NONE ), 1517cdf0e10cSrcweir bDateNoDefault( sal_False ) 1518cdf0e10cSrcweir { 1519cdf0e10cSrcweir SetAttribute(XML_NAMESPACE_STYLE, GetXMLToken(XML_NAME), rLName); 1520cdf0e10cSrcweir } 1521cdf0e10cSrcweir 1522cdf0e10cSrcweir SvXMLNumFormatContext::~SvXMLNumFormatContext() 1523cdf0e10cSrcweir { 1524cdf0e10cSrcweir } 1525cdf0e10cSrcweir 1526cdf0e10cSrcweir SvXMLImportContext* SvXMLNumFormatContext::CreateChildContext( 1527cdf0e10cSrcweir sal_uInt16 nPrfx, const rtl::OUString& rLName, 1528cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList ) 1529cdf0e10cSrcweir { 1530cdf0e10cSrcweir SvXMLImportContext* pContext = NULL; 1531cdf0e10cSrcweir 1532cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap = pData->GetStyleElemTokenMap(); 1533cdf0e10cSrcweir sal_uInt16 nToken = rTokenMap.Get( nPrfx, rLName ); 1534cdf0e10cSrcweir switch (nToken) 1535cdf0e10cSrcweir { 1536cdf0e10cSrcweir case XML_TOK_STYLE_TEXT: 1537cdf0e10cSrcweir case XML_TOK_STYLE_NUMBER: 1538cdf0e10cSrcweir case XML_TOK_STYLE_SCIENTIFIC_NUMBER: 1539cdf0e10cSrcweir case XML_TOK_STYLE_FRACTION: 1540cdf0e10cSrcweir case XML_TOK_STYLE_CURRENCY_SYMBOL: 1541cdf0e10cSrcweir case XML_TOK_STYLE_DAY: 1542cdf0e10cSrcweir case XML_TOK_STYLE_MONTH: 1543cdf0e10cSrcweir case XML_TOK_STYLE_YEAR: 1544cdf0e10cSrcweir case XML_TOK_STYLE_ERA: 1545cdf0e10cSrcweir case XML_TOK_STYLE_DAY_OF_WEEK: 1546cdf0e10cSrcweir case XML_TOK_STYLE_WEEK_OF_YEAR: 1547cdf0e10cSrcweir case XML_TOK_STYLE_QUARTER: 1548cdf0e10cSrcweir case XML_TOK_STYLE_HOURS: 1549cdf0e10cSrcweir case XML_TOK_STYLE_AM_PM: 1550cdf0e10cSrcweir case XML_TOK_STYLE_MINUTES: 1551cdf0e10cSrcweir case XML_TOK_STYLE_SECONDS: 1552cdf0e10cSrcweir case XML_TOK_STYLE_BOOLEAN: 1553cdf0e10cSrcweir case XML_TOK_STYLE_TEXT_CONTENT: 1554cdf0e10cSrcweir pContext = new SvXMLNumFmtElementContext( GetImport(), nPrfx, rLName, 1555cdf0e10cSrcweir *this, nToken, xAttrList ); 1556cdf0e10cSrcweir break; 1557cdf0e10cSrcweir 1558cdf0e10cSrcweir case XML_TOK_STYLE_PROPERTIES: 1559cdf0e10cSrcweir pContext = new SvXMLNumFmtPropContext( GetImport(), nPrfx, rLName, 1560cdf0e10cSrcweir *this, xAttrList ); 1561cdf0e10cSrcweir break; 1562cdf0e10cSrcweir case XML_TOK_STYLE_MAP: 1563cdf0e10cSrcweir { 1564cdf0e10cSrcweir // SvXMLNumFmtMapContext::EndElement adds to aMyConditions, 1565cdf0e10cSrcweir // so there's no need for an extra flag 1566cdf0e10cSrcweir pContext = new SvXMLNumFmtMapContext( GetImport(), nPrfx, rLName, 1567cdf0e10cSrcweir *this, xAttrList ); 1568cdf0e10cSrcweir } 1569cdf0e10cSrcweir break; 1570cdf0e10cSrcweir } 1571cdf0e10cSrcweir 1572cdf0e10cSrcweir if( !pContext ) 1573cdf0e10cSrcweir pContext = new SvXMLImportContext( GetImport(), nPrfx, rLName ); 1574cdf0e10cSrcweir return pContext; 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir 1577cdf0e10cSrcweir sal_Int32 SvXMLNumFormatContext::GetKey() 1578cdf0e10cSrcweir { 1579cdf0e10cSrcweir if (nKey > -1) 1580cdf0e10cSrcweir { 1581cdf0e10cSrcweir if (bRemoveAfterUse) 1582cdf0e10cSrcweir { 1583cdf0e10cSrcweir // format is used -> don't remove 1584cdf0e10cSrcweir bRemoveAfterUse = sal_False; 1585cdf0e10cSrcweir if (pData) 1586cdf0e10cSrcweir pData->SetUsed(nKey); 1587cdf0e10cSrcweir 1588cdf0e10cSrcweir // Add to import's list of keys now - CreateAndInsert didn't add 1589cdf0e10cSrcweir // the style if bRemoveAfterUse was set. 1590cdf0e10cSrcweir GetImport().AddNumberStyle( nKey, GetName() ); 1591cdf0e10cSrcweir } 1592cdf0e10cSrcweir return nKey; 1593cdf0e10cSrcweir } 1594cdf0e10cSrcweir else 1595cdf0e10cSrcweir { 1596cdf0e10cSrcweir // reset bRemoveAfterUse before CreateAndInsert, so AddKey is called without bRemoveAfterUse set 1597cdf0e10cSrcweir bRemoveAfterUse = sal_False; 1598cdf0e10cSrcweir CreateAndInsert(sal_True); 1599cdf0e10cSrcweir return nKey; 1600cdf0e10cSrcweir } 1601cdf0e10cSrcweir } 1602cdf0e10cSrcweir 1603cdf0e10cSrcweir sal_Int32 SvXMLNumFormatContext::PrivateGetKey() 1604cdf0e10cSrcweir { 1605cdf0e10cSrcweir // used for map elements in CreateAndInsert - don't reset bRemoveAfterUse flag 1606cdf0e10cSrcweir 1607cdf0e10cSrcweir if (nKey > -1) 1608cdf0e10cSrcweir return nKey; 1609cdf0e10cSrcweir else 1610cdf0e10cSrcweir { 1611cdf0e10cSrcweir CreateAndInsert(sal_True); 1612cdf0e10cSrcweir return nKey; 1613cdf0e10cSrcweir } 1614cdf0e10cSrcweir } 1615cdf0e10cSrcweir 1616cdf0e10cSrcweir sal_Int32 SvXMLNumFormatContext::CreateAndInsert( com::sun::star::uno::Reference< com::sun::star::util::XNumberFormatsSupplier >& xFormatsSupplier ) 1617cdf0e10cSrcweir { 1618cdf0e10cSrcweir if (nKey <= -1) 1619cdf0e10cSrcweir { 1620cdf0e10cSrcweir SvNumberFormatter* pFormatter = NULL; 1621cdf0e10cSrcweir SvNumberFormatsSupplierObj* pObj = 1622cdf0e10cSrcweir SvNumberFormatsSupplierObj::getImplementation( xFormatsSupplier ); 1623cdf0e10cSrcweir if (pObj) 1624cdf0e10cSrcweir pFormatter = pObj->GetNumberFormatter(); 1625cdf0e10cSrcweir 1626cdf0e10cSrcweir if ( pFormatter ) 1627cdf0e10cSrcweir return CreateAndInsert( pFormatter ); 1628cdf0e10cSrcweir else 1629cdf0e10cSrcweir return -1; 1630cdf0e10cSrcweir } 1631cdf0e10cSrcweir else 1632cdf0e10cSrcweir return nKey; 1633cdf0e10cSrcweir } 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir void SvXMLNumFormatContext::CreateAndInsert(sal_Bool /*bOverwrite*/) 1636cdf0e10cSrcweir { 1637cdf0e10cSrcweir if (!(nKey > -1)) 1638cdf0e10cSrcweir CreateAndInsert(pData->GetNumberFormatter()); 1639cdf0e10cSrcweir } 1640cdf0e10cSrcweir 1641cdf0e10cSrcweir sal_Int32 SvXMLNumFormatContext::CreateAndInsert(SvNumberFormatter* pFormatter) 1642cdf0e10cSrcweir { 1643cdf0e10cSrcweir if (!pFormatter) 1644cdf0e10cSrcweir { 1645cdf0e10cSrcweir DBG_ERROR("no number formatter"); 1646cdf0e10cSrcweir return -1; 1647cdf0e10cSrcweir } 1648cdf0e10cSrcweir 1649cdf0e10cSrcweir sal_uInt32 nIndex = NUMBERFORMAT_ENTRY_NOT_FOUND; 1650cdf0e10cSrcweir 1651cdf0e10cSrcweir for (sal_uInt32 i = 0; i < aMyConditions.size(); i++) 1652cdf0e10cSrcweir { 1653cdf0e10cSrcweir SvXMLNumFormatContext* pStyle = (SvXMLNumFormatContext *)pStyles->FindStyleChildContext( 1654cdf0e10cSrcweir XML_STYLE_FAMILY_DATA_STYLE, aMyConditions[i].sMapName, sal_False); 1655cdf0e10cSrcweir if (pStyle) 1656cdf0e10cSrcweir { 1657cdf0e10cSrcweir if ((pStyle->PrivateGetKey() > -1)) // don't reset pStyle's bRemoveAfterUse flag 1658cdf0e10cSrcweir AddCondition(i); 1659cdf0e10cSrcweir } 1660cdf0e10cSrcweir } 1661cdf0e10cSrcweir 1662cdf0e10cSrcweir if ( !aFormatCode.getLength() ) 1663cdf0e10cSrcweir { 1664cdf0e10cSrcweir // insert empty format as empty string (with quotes) 1665cdf0e10cSrcweir // #93901# this check has to be done before inserting the conditions 1666cdf0e10cSrcweir aFormatCode.appendAscii("\"\""); // "" 1667cdf0e10cSrcweir } 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir aFormatCode.insert( 0, aConditions.makeStringAndClear() ); 1670cdf0e10cSrcweir OUString sFormat = aFormatCode.makeStringAndClear(); 1671cdf0e10cSrcweir 1672cdf0e10cSrcweir // test special cases 1673cdf0e10cSrcweir 1674cdf0e10cSrcweir if ( bAutoDec ) // automatic decimal places 1675cdf0e10cSrcweir { 1676cdf0e10cSrcweir // #99391# adjust only if the format contains no text elements, no conditions 1677cdf0e10cSrcweir // and no color definition (detected by the '[' at the start) 1678cdf0e10cSrcweir 1679cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_NUMBER_STYLE && !bHasExtraText && 1680cdf0e10cSrcweir aMyConditions.size() == 0 && sFormat.toChar() != (sal_Unicode)'[' ) 1681cdf0e10cSrcweir nIndex = pFormatter->GetStandardIndex( nFormatLang ); 1682cdf0e10cSrcweir } 1683cdf0e10cSrcweir if ( bAutoInt ) // automatic integer digits 1684cdf0e10cSrcweir { 1685cdf0e10cSrcweir //! only if two decimal places was set? 1686cdf0e10cSrcweir 1687cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_NUMBER_STYLE && !bHasExtraText && 1688cdf0e10cSrcweir aMyConditions.size() == 0 && sFormat.toChar() != (sal_Unicode)'[' ) 1689cdf0e10cSrcweir nIndex = pFormatter->GetFormatIndex( NF_NUMBER_SYSTEM, nFormatLang ); 1690cdf0e10cSrcweir } 1691cdf0e10cSrcweir 1692cdf0e10cSrcweir // boolean is always the builtin boolean format 1693cdf0e10cSrcweir // (no other boolean formats are implemented) 1694cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_BOOLEAN_STYLE ) 1695cdf0e10cSrcweir nIndex = pFormatter->GetFormatIndex( NF_BOOLEAN, nFormatLang ); 1696cdf0e10cSrcweir 1697cdf0e10cSrcweir // check for default date formats 1698cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_DATE_STYLE && bAutoOrder && !bDateNoDefault ) 1699cdf0e10cSrcweir { 1700cdf0e10cSrcweir NfIndexTableOffset eFormat = (NfIndexTableOffset) SvXMLNumFmtDefaults::GetDefaultDateFormat( 1701cdf0e10cSrcweir eDateDOW, eDateDay, eDateMonth, eDateYear, 1702cdf0e10cSrcweir eDateHours, eDateMins, eDateSecs, bFromSystem ); 1703cdf0e10cSrcweir if ( eFormat < NF_INDEX_TABLE_ENTRIES ) 1704cdf0e10cSrcweir { 1705cdf0e10cSrcweir // #109651# if a date format has the automatic-order attribute and 1706cdf0e10cSrcweir // contains exactly the elements of one of the default date formats, 1707cdf0e10cSrcweir // use that default format, with the element order and separators 1708cdf0e10cSrcweir // from the current locale settings 1709cdf0e10cSrcweir 1710cdf0e10cSrcweir nIndex = pFormatter->GetFormatIndex( eFormat, nFormatLang ); 1711cdf0e10cSrcweir } 1712cdf0e10cSrcweir } 1713cdf0e10cSrcweir 1714cdf0e10cSrcweir if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND && sFormat.getLength() ) 1715cdf0e10cSrcweir { 1716cdf0e10cSrcweir // insert by format string 1717cdf0e10cSrcweir 1718cdf0e10cSrcweir String aFormatStr( sFormat ); 1719cdf0e10cSrcweir nIndex = pFormatter->GetEntryKey( aFormatStr, nFormatLang ); 1720cdf0e10cSrcweir if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND ) 1721cdf0e10cSrcweir { 1722cdf0e10cSrcweir xub_StrLen nErrPos = 0; 1723cdf0e10cSrcweir short l_nType = 0; 1724cdf0e10cSrcweir sal_Bool bOk = pFormatter->PutEntry( aFormatStr, nErrPos, l_nType, nIndex, nFormatLang ); 1725cdf0e10cSrcweir if ( !bOk && nErrPos == 0 && aFormatStr != String(sFormat) ) 1726cdf0e10cSrcweir { 1727cdf0e10cSrcweir // if the string was modified by PutEntry, look for an existing format 1728cdf0e10cSrcweir // with the modified string 1729cdf0e10cSrcweir nIndex = pFormatter->GetEntryKey( aFormatStr, nFormatLang ); 1730cdf0e10cSrcweir if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND ) 1731cdf0e10cSrcweir bOk = sal_True; 1732cdf0e10cSrcweir } 1733cdf0e10cSrcweir if (!bOk) 1734cdf0e10cSrcweir nIndex = NUMBERFORMAT_ENTRY_NOT_FOUND; 1735cdf0e10cSrcweir } 1736cdf0e10cSrcweir } 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir #if 0 1739cdf0e10cSrcweir //! I18N doesn't provide SYSTEM or extended date information yet 1740cdf0e10cSrcweir if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND && !bFromSystem ) 1741cdf0e10cSrcweir { 1742cdf0e10cSrcweir // instead of automatic date format, use fixed formats if bFromSystem is not set 1743cdf0e10cSrcweir //! prevent use of automatic formats in other cases, force user-defined format? 1744cdf0e10cSrcweir 1745cdf0e10cSrcweir sal_uInt32 nNewIndex = nIndex; 1746cdf0e10cSrcweir 1747cdf0e10cSrcweir NfIndexTableOffset eOffset = pFormatter->GetIndexTableOffset( nIndex ); 1748cdf0e10cSrcweir if ( eOffset == NF_DATE_SYSTEM_SHORT ) 1749cdf0e10cSrcweir { 1750cdf0e10cSrcweir const International& rInt = pData->GetInternational( nFormatLang ); 1751cdf0e10cSrcweir if ( rInt.IsDateDayLeadingZero() && rInt.IsDateMonthLeadingZero() ) 1752cdf0e10cSrcweir { 1753cdf0e10cSrcweir if ( rInt.IsDateCentury() ) 1754cdf0e10cSrcweir nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_DDMMYYYY, nFormatLang ); 1755cdf0e10cSrcweir else 1756cdf0e10cSrcweir nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_DDMMYY, nFormatLang ); 1757cdf0e10cSrcweir } 1758cdf0e10cSrcweir } 1759cdf0e10cSrcweir else if ( eOffset == NF_DATE_SYSTEM_LONG ) 1760cdf0e10cSrcweir { 1761cdf0e10cSrcweir const International& rInt = pData->GetInternational( nFormatLang ); 1762cdf0e10cSrcweir if ( !rInt.IsLongDateDayLeadingZero() ) 1763cdf0e10cSrcweir { 1764cdf0e10cSrcweir sal_Bool bCentury = rInt.IsLongDateCentury(); 1765cdf0e10cSrcweir MonthFormat eMonth = rInt.GetLongDateMonthFormat(); 1766cdf0e10cSrcweir if ( eMonth == MONTH_LONG && bCentury ) 1767cdf0e10cSrcweir { 1768cdf0e10cSrcweir if ( rInt.GetLongDateDayOfWeekFormat() == DAYOFWEEK_LONG ) 1769cdf0e10cSrcweir nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNNNDMMMMYYYY, nFormatLang ); 1770cdf0e10cSrcweir else 1771cdf0e10cSrcweir nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNDMMMMYYYY, nFormatLang ); 1772cdf0e10cSrcweir } 1773cdf0e10cSrcweir else if ( eMonth == MONTH_SHORT && !bCentury ) 1774cdf0e10cSrcweir nNewIndex = pFormatter->GetFormatIndex( NF_DATE_SYS_NNDMMMYY, nFormatLang ); 1775cdf0e10cSrcweir } 1776cdf0e10cSrcweir } 1777cdf0e10cSrcweir 1778cdf0e10cSrcweir if ( nNewIndex != nIndex ) 1779cdf0e10cSrcweir { 1780cdf0e10cSrcweir // verify the fixed format really matches the format string 1781cdf0e10cSrcweir // (not the case with some formats from locale data) 1782cdf0e10cSrcweir 1783cdf0e10cSrcweir const SvNumberformat* pFixedFormat = pFormatter->GetEntry( nNewIndex ); 1784cdf0e10cSrcweir if ( pFixedFormat && pFixedFormat->GetFormatstring() == String(sFormat) ) 1785cdf0e10cSrcweir nIndex = nNewIndex; 1786cdf0e10cSrcweir } 1787cdf0e10cSrcweir } 1788cdf0e10cSrcweir #endif 1789cdf0e10cSrcweir 1790cdf0e10cSrcweir if ( nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND && !bAutoOrder ) 1791cdf0e10cSrcweir { 1792cdf0e10cSrcweir // use fixed-order formats instead of SYS... if bAutoOrder is false 1793cdf0e10cSrcweir // (only if the format strings are equal for the locale) 1794cdf0e10cSrcweir 1795cdf0e10cSrcweir NfIndexTableOffset eOffset = pFormatter->GetIndexTableOffset( nIndex ); 1796cdf0e10cSrcweir if ( eOffset == NF_DATE_SYS_DMMMYYYY ) 1797cdf0e10cSrcweir { 1798cdf0e10cSrcweir sal_uInt32 nNewIndex = pFormatter->GetFormatIndex( NF_DATE_DIN_DMMMYYYY, nFormatLang ); 1799cdf0e10cSrcweir const SvNumberformat* pOldEntry = pFormatter->GetEntry( nIndex ); 1800cdf0e10cSrcweir const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewIndex ); 1801cdf0e10cSrcweir if ( pOldEntry && pNewEntry && pOldEntry->GetFormatstring() == pNewEntry->GetFormatstring() ) 1802cdf0e10cSrcweir nIndex = nNewIndex; 1803cdf0e10cSrcweir } 1804cdf0e10cSrcweir else if ( eOffset == NF_DATE_SYS_DMMMMYYYY ) 1805cdf0e10cSrcweir { 1806cdf0e10cSrcweir sal_uInt32 nNewIndex = pFormatter->GetFormatIndex( NF_DATE_DIN_DMMMMYYYY, nFormatLang ); 1807cdf0e10cSrcweir const SvNumberformat* pOldEntry = pFormatter->GetEntry( nIndex ); 1808cdf0e10cSrcweir const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewIndex ); 1809cdf0e10cSrcweir if ( pOldEntry && pNewEntry && pOldEntry->GetFormatstring() == pNewEntry->GetFormatstring() ) 1810cdf0e10cSrcweir nIndex = nNewIndex; 1811cdf0e10cSrcweir } 1812cdf0e10cSrcweir } 1813cdf0e10cSrcweir 1814cdf0e10cSrcweir if ((nIndex != NUMBERFORMAT_ENTRY_NOT_FOUND) && sFormatTitle.getLength()) 1815cdf0e10cSrcweir { 1816cdf0e10cSrcweir SvNumberformat* pFormat = const_cast<SvNumberformat*>(pFormatter->GetEntry( nIndex )); 1817cdf0e10cSrcweir if (pFormat) 1818cdf0e10cSrcweir { 1819cdf0e10cSrcweir String sTitle (sFormatTitle); 1820cdf0e10cSrcweir pFormat->SetComment(sTitle); 1821cdf0e10cSrcweir } 1822cdf0e10cSrcweir } 1823cdf0e10cSrcweir 1824cdf0e10cSrcweir if ( nIndex == NUMBERFORMAT_ENTRY_NOT_FOUND ) 1825cdf0e10cSrcweir { 1826cdf0e10cSrcweir DBG_ERROR("invalid number format"); 1827cdf0e10cSrcweir nIndex = pFormatter->GetStandardIndex( nFormatLang ); 1828cdf0e10cSrcweir } 1829cdf0e10cSrcweir 1830cdf0e10cSrcweir pData->AddKey( nIndex, GetName(), bRemoveAfterUse ); 1831cdf0e10cSrcweir nKey = nIndex; 1832cdf0e10cSrcweir 1833cdf0e10cSrcweir // Add to import's list of keys (shared between styles and content import) 1834cdf0e10cSrcweir // only if not volatile - formats are removed from NumberFormatter at the 1835cdf0e10cSrcweir // end of each import (in SvXMLNumFmtHelper dtor). 1836cdf0e10cSrcweir // If bRemoveAfterUse is reset later in GetKey, AddNumberStyle is called there. 1837cdf0e10cSrcweir 1838cdf0e10cSrcweir if (!bRemoveAfterUse) 1839cdf0e10cSrcweir GetImport().AddNumberStyle( nKey, GetName() ); 1840cdf0e10cSrcweir 1841cdf0e10cSrcweir #if 0 1842cdf0e10cSrcweir ByteString aByte( String(sFormatName), gsl_getSystemTextEncoding() ); 1843cdf0e10cSrcweir aByte.Append( " | " ); 1844cdf0e10cSrcweir aByte.Append(ByteString( String(sFormat), gsl_getSystemTextEncoding() )); 1845cdf0e10cSrcweir aByte.Append( " | " ); 1846cdf0e10cSrcweir aByte.Append(ByteString::CreateFromInt32( nIndex )); 1847cdf0e10cSrcweir 1848cdf0e10cSrcweir // DBG_ERROR(aByte.GetBuffer()); 1849cdf0e10cSrcweir int xxx=42; 1850cdf0e10cSrcweir #endif 1851cdf0e10cSrcweir 1852cdf0e10cSrcweir return nKey; 1853cdf0e10cSrcweir } 1854cdf0e10cSrcweir 1855cdf0e10cSrcweir void SvXMLNumFormatContext::Finish( sal_Bool bOverwrite ) 1856cdf0e10cSrcweir { 1857cdf0e10cSrcweir SvXMLStyleContext::Finish( bOverwrite ); 1858cdf0e10cSrcweir // AddCondition(); 1859cdf0e10cSrcweir } 1860cdf0e10cSrcweir 1861cdf0e10cSrcweir const LocaleDataWrapper& SvXMLNumFormatContext::GetLocaleData() const 1862cdf0e10cSrcweir { 1863cdf0e10cSrcweir return pData->GetLocaleData( nFormatLang ); 1864cdf0e10cSrcweir } 1865cdf0e10cSrcweir 1866cdf0e10cSrcweir void SvXMLNumFormatContext::AddToCode( const rtl::OUString& rString ) 1867cdf0e10cSrcweir { 1868cdf0e10cSrcweir aFormatCode.append( rString ); 1869cdf0e10cSrcweir bHasExtraText = sal_True; 1870cdf0e10cSrcweir } 1871cdf0e10cSrcweir 1872cdf0e10cSrcweir void SvXMLNumFormatContext::AddNumber( const SvXMLNumberInfo& rInfo ) 1873cdf0e10cSrcweir { 1874cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 1875cdf0e10cSrcweir if (!pFormatter) 1876cdf0e10cSrcweir return; 1877cdf0e10cSrcweir 1878cdf0e10cSrcweir // store special conditions 1879cdf0e10cSrcweir bAutoDec = ( rInfo.nDecimals < 0 ); 1880cdf0e10cSrcweir bAutoInt = ( rInfo.nInteger < 0 ); 1881cdf0e10cSrcweir 1882cdf0e10cSrcweir sal_uInt16 nPrec = 0; 1883cdf0e10cSrcweir sal_uInt16 nLeading = 0; 1884cdf0e10cSrcweir if ( rInfo.nDecimals >= 0 ) // < 0 : Default 1885cdf0e10cSrcweir nPrec = (sal_uInt16) rInfo.nDecimals; 1886cdf0e10cSrcweir if ( rInfo.nInteger >= 0 ) // < 0 : Default 1887cdf0e10cSrcweir nLeading = (sal_uInt16) rInfo.nInteger; 1888cdf0e10cSrcweir 1889cdf0e10cSrcweir if ( bAutoDec ) 1890cdf0e10cSrcweir { 1891cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_CURRENCY_STYLE ) 1892cdf0e10cSrcweir { 1893cdf0e10cSrcweir // for currency formats, "automatic decimals" is used for the automatic 1894cdf0e10cSrcweir // currency format with (fixed) decimals from the locale settings 1895cdf0e10cSrcweir 1896cdf0e10cSrcweir const LocaleDataWrapper& rLoc = pData->GetLocaleData( nFormatLang ); 1897cdf0e10cSrcweir nPrec = rLoc.getCurrDigits(); 1898cdf0e10cSrcweir } 1899cdf0e10cSrcweir else 1900cdf0e10cSrcweir { 1901cdf0e10cSrcweir // for other types, "automatic decimals" means dynamic determination of 1902cdf0e10cSrcweir // decimals, as achieved with the "general" keyword 1903cdf0e10cSrcweir 1904cdf0e10cSrcweir aFormatCode.append( pFormatter->GetStandardName( nFormatLang ) ); 1905cdf0e10cSrcweir return; 1906cdf0e10cSrcweir } 1907cdf0e10cSrcweir } 1908cdf0e10cSrcweir if ( bAutoInt ) 1909cdf0e10cSrcweir { 1910cdf0e10cSrcweir //!... 1911cdf0e10cSrcweir } 1912cdf0e10cSrcweir 1913cdf0e10cSrcweir sal_uInt16 nGenPrec = nPrec; 1914cdf0e10cSrcweir if ( rInfo.bDecReplace || rInfo.bVarDecimals ) 1915cdf0e10cSrcweir nGenPrec = 0; // generate format without decimals... 1916cdf0e10cSrcweir 1917cdf0e10cSrcweir sal_Bool bGrouping = rInfo.bGrouping; 1918cdf0e10cSrcweir sal_uInt16 nEmbeddedCount = rInfo.aEmbeddedElements.Count(); 1919cdf0e10cSrcweir if ( nEmbeddedCount ) 1920cdf0e10cSrcweir bGrouping = sal_False; // grouping and embedded characters can't be used together 1921cdf0e10cSrcweir 1922cdf0e10cSrcweir String aNumStr; 1923cdf0e10cSrcweir sal_uInt32 nStdIndex = pFormatter->GetStandardIndex( nFormatLang ); 1924cdf0e10cSrcweir pFormatter->GenerateFormat( aNumStr, nStdIndex, nFormatLang, 1925cdf0e10cSrcweir bGrouping, sal_False, nGenPrec, nLeading ); 1926cdf0e10cSrcweir 1927cdf0e10cSrcweir if ( rInfo.nExpDigits >= 0 && nLeading == 0 && !bGrouping && nEmbeddedCount == 0 ) 1928cdf0e10cSrcweir { 1929cdf0e10cSrcweir // #i43959# For scientific numbers, "#" in the integer part forces a digit, 1930cdf0e10cSrcweir // so it has to be removed if nLeading is 0 (".00E+0", not "#.00E+0"). 1931cdf0e10cSrcweir 1932cdf0e10cSrcweir aNumStr.EraseLeadingChars( (sal_Unicode)'#' ); 1933cdf0e10cSrcweir } 1934cdf0e10cSrcweir 1935cdf0e10cSrcweir if ( nEmbeddedCount ) 1936cdf0e10cSrcweir { 1937cdf0e10cSrcweir // insert embedded strings into number string 1938cdf0e10cSrcweir // only the integer part is supported 1939cdf0e10cSrcweir // nZeroPos is the string position where format position 0 is inserted 1940cdf0e10cSrcweir 1941cdf0e10cSrcweir xub_StrLen nZeroPos = aNumStr.Search( pData->GetLocaleData( nFormatLang ).getNumDecimalSep() ); 1942cdf0e10cSrcweir if ( nZeroPos == STRING_NOTFOUND ) 1943cdf0e10cSrcweir nZeroPos = aNumStr.Len(); 1944cdf0e10cSrcweir 1945cdf0e10cSrcweir // aEmbeddedElements is sorted - last entry has the largest position (leftmost) 1946cdf0e10cSrcweir const SvXMLEmbeddedElement* pLastObj = rInfo.aEmbeddedElements[nEmbeddedCount - 1]; 1947cdf0e10cSrcweir sal_Int32 nLastFormatPos = pLastObj->nFormatPos; 1948cdf0e10cSrcweir if ( nLastFormatPos >= nZeroPos ) 1949cdf0e10cSrcweir { 1950cdf0e10cSrcweir // add '#' characters so all embedded texts are really embedded in digits 1951cdf0e10cSrcweir // (there always has to be a digit before the leftmost embedded text) 1952cdf0e10cSrcweir 1953cdf0e10cSrcweir xub_StrLen nAddCount = (xub_StrLen)nLastFormatPos + 1 - nZeroPos; 1954cdf0e10cSrcweir String aDigitStr; 1955cdf0e10cSrcweir aDigitStr.Fill( nAddCount, (sal_Unicode)'#' ); 1956cdf0e10cSrcweir aNumStr.Insert( aDigitStr, 0 ); 1957cdf0e10cSrcweir nZeroPos = nZeroPos + nAddCount; 1958cdf0e10cSrcweir } 1959cdf0e10cSrcweir 1960cdf0e10cSrcweir // aEmbeddedElements is sorted with ascending positions - loop is from right to left 1961cdf0e10cSrcweir for (sal_uInt16 nElement = 0; nElement < nEmbeddedCount; nElement++) 1962cdf0e10cSrcweir { 1963cdf0e10cSrcweir const SvXMLEmbeddedElement* pObj = rInfo.aEmbeddedElements[nElement]; 1964cdf0e10cSrcweir sal_Int32 nFormatPos = pObj->nFormatPos; 1965cdf0e10cSrcweir sal_Int32 nInsertPos = nZeroPos - nFormatPos; 1966cdf0e10cSrcweir if ( nFormatPos >= 0 && nInsertPos >= 0 ) 1967cdf0e10cSrcweir { 1968cdf0e10cSrcweir rtl::OUStringBuffer aContent( pObj->aText ); 1969cdf0e10cSrcweir // #107805# always quote embedded strings - even space would otherwise 1970cdf0e10cSrcweir // be recognized as thousands separator in French. 1971cdf0e10cSrcweir aContent.insert( 0, (sal_Unicode) '"' ); 1972cdf0e10cSrcweir aContent.append( (sal_Unicode) '"' ); 1973cdf0e10cSrcweir 1974cdf0e10cSrcweir aNumStr.Insert( String( aContent.makeStringAndClear() ), (xub_StrLen)nInsertPos ); 1975cdf0e10cSrcweir } 1976cdf0e10cSrcweir } 1977cdf0e10cSrcweir } 1978cdf0e10cSrcweir 1979cdf0e10cSrcweir aFormatCode.append( aNumStr ); 1980cdf0e10cSrcweir 1981cdf0e10cSrcweir if ( ( rInfo.bDecReplace || rInfo.bVarDecimals ) && nPrec ) // add decimal replacement (dashes) 1982cdf0e10cSrcweir { 1983cdf0e10cSrcweir // add dashes for explicit decimal replacement, # for variable decimals 1984cdf0e10cSrcweir sal_Unicode cAdd = rInfo.bDecReplace ? '-' : '#'; 1985cdf0e10cSrcweir 1986cdf0e10cSrcweir aFormatCode.append( pData->GetLocaleData( nFormatLang ).getNumDecimalSep() ); 1987cdf0e10cSrcweir for ( sal_uInt16 i=0; i<nPrec; i++) 1988cdf0e10cSrcweir aFormatCode.append( cAdd ); 1989cdf0e10cSrcweir } 1990cdf0e10cSrcweir 1991cdf0e10cSrcweir // add extra thousands separators for display factor 1992cdf0e10cSrcweir 1993cdf0e10cSrcweir if ( rInfo.fDisplayFactor != 1.0 && rInfo.fDisplayFactor > 0.0 ) 1994cdf0e10cSrcweir { 1995cdf0e10cSrcweir // test for 1.0 is just for optimization - nSepCount would be 0 1996cdf0e10cSrcweir 1997cdf0e10cSrcweir // one separator for each factor of 1000 1998cdf0e10cSrcweir sal_Int32 nSepCount = (sal_Int32) ::rtl::math::round( log10(rInfo.fDisplayFactor) / 3.0 ); 1999cdf0e10cSrcweir if ( nSepCount > 0 ) 2000cdf0e10cSrcweir { 2001cdf0e10cSrcweir OUString aSep = pData->GetLocaleData( nFormatLang ).getNumThousandSep(); 2002cdf0e10cSrcweir for ( sal_Int32 i=0; i<nSepCount; i++ ) 2003cdf0e10cSrcweir aFormatCode.append( aSep ); 2004cdf0e10cSrcweir } 2005cdf0e10cSrcweir } 2006cdf0e10cSrcweir } 2007cdf0e10cSrcweir 2008cdf0e10cSrcweir void SvXMLNumFormatContext::AddCurrency( const rtl::OUString& rContent, LanguageType nLang ) 2009cdf0e10cSrcweir { 2010cdf0e10cSrcweir sal_Bool bAutomatic = sal_False; 2011cdf0e10cSrcweir OUString aSymbol = rContent; 2012cdf0e10cSrcweir if ( aSymbol.getLength() == 0 ) 2013cdf0e10cSrcweir { 2014cdf0e10cSrcweir // get currency symbol for language 2015cdf0e10cSrcweir 2016cdf0e10cSrcweir //aSymbol = pData->GetLocaleData( nFormatLang ).getCurrSymbol(); 2017cdf0e10cSrcweir 2018cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 2019cdf0e10cSrcweir if ( pFormatter ) 2020cdf0e10cSrcweir { 2021cdf0e10cSrcweir pFormatter->ChangeIntl( nFormatLang ); 2022cdf0e10cSrcweir String sCurString, sDummy; 2023cdf0e10cSrcweir pFormatter->GetCompatibilityCurrency( sCurString, sDummy ); 2024cdf0e10cSrcweir aSymbol = sCurString; 2025cdf0e10cSrcweir 2026cdf0e10cSrcweir bAutomatic = sal_True; 2027cdf0e10cSrcweir } 2028cdf0e10cSrcweir } 2029cdf0e10cSrcweir else if ( nLang == LANGUAGE_SYSTEM && aSymbol.compareToAscii("CCC") == 0 ) 2030cdf0e10cSrcweir { 2031cdf0e10cSrcweir // "CCC" is used for automatic long symbol 2032cdf0e10cSrcweir bAutomatic = sal_True; 2033cdf0e10cSrcweir } 2034cdf0e10cSrcweir 2035cdf0e10cSrcweir if ( bAutomatic ) 2036cdf0e10cSrcweir { 2037cdf0e10cSrcweir // remove unnecessary quotes before automatic symbol (formats like "-(0DM)") 2038cdf0e10cSrcweir // otherwise the currency symbol isn't recognized (#94048#) 2039cdf0e10cSrcweir 2040cdf0e10cSrcweir sal_Int32 nLength = aFormatCode.getLength(); 2041cdf0e10cSrcweir if ( nLength > 1 && aFormatCode.charAt( nLength-1 ) == '"' ) 2042cdf0e10cSrcweir { 2043cdf0e10cSrcweir // find start of quoted string 2044cdf0e10cSrcweir // When SvXMLNumFmtElementContext::EndElement creates escaped quotes, 2045cdf0e10cSrcweir // they must be handled here, too. 2046cdf0e10cSrcweir 2047cdf0e10cSrcweir sal_Int32 nFirst = nLength - 2; 2048cdf0e10cSrcweir while ( nFirst >= 0 && aFormatCode.charAt( nFirst ) != '"' ) 2049cdf0e10cSrcweir --nFirst; 2050cdf0e10cSrcweir if ( nFirst >= 0 ) 2051cdf0e10cSrcweir { 2052cdf0e10cSrcweir // remove both quotes from aFormatCode 2053cdf0e10cSrcweir rtl::OUString aOld = aFormatCode.makeStringAndClear(); 2054cdf0e10cSrcweir if ( nFirst > 0 ) 2055cdf0e10cSrcweir aFormatCode.append( aOld.copy( 0, nFirst ) ); 2056cdf0e10cSrcweir if ( nLength > nFirst + 2 ) 2057cdf0e10cSrcweir aFormatCode.append( aOld.copy( nFirst + 1, nLength - nFirst - 2 ) ); 2058cdf0e10cSrcweir } 2059cdf0e10cSrcweir } 2060cdf0e10cSrcweir } 2061cdf0e10cSrcweir 2062cdf0e10cSrcweir if (!bAutomatic) 2063cdf0e10cSrcweir aFormatCode.appendAscii( "[$" ); // intro for "new" currency symbols 2064cdf0e10cSrcweir 2065cdf0e10cSrcweir aFormatCode.append( aSymbol ); 2066cdf0e10cSrcweir 2067cdf0e10cSrcweir if (!bAutomatic) 2068cdf0e10cSrcweir { 2069cdf0e10cSrcweir if ( nLang != LANGUAGE_SYSTEM ) 2070cdf0e10cSrcweir { 2071cdf0e10cSrcweir // '-' sign and language code in hex: 2072cdf0e10cSrcweir aFormatCode.append( (sal_Unicode) '-' ); 2073cdf0e10cSrcweir aFormatCode.append( String::CreateFromInt32( sal_Int32( nLang ), 16 ).ToUpperAscii() ); 2074cdf0e10cSrcweir } 2075cdf0e10cSrcweir 2076cdf0e10cSrcweir aFormatCode.append( (sal_Unicode) ']' ); // end of "new" currency symbol 2077cdf0e10cSrcweir } 2078cdf0e10cSrcweir } 2079cdf0e10cSrcweir 2080cdf0e10cSrcweir void SvXMLNumFormatContext::AddNfKeyword( sal_uInt16 nIndex ) 2081cdf0e10cSrcweir { 2082cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 2083cdf0e10cSrcweir if (!pFormatter) 2084cdf0e10cSrcweir return; 2085cdf0e10cSrcweir 2086cdf0e10cSrcweir if ( nIndex == NF_KEY_G || nIndex == NF_KEY_GG || nIndex == NF_KEY_GGG ) 2087cdf0e10cSrcweir bHasEra = sal_True; 2088cdf0e10cSrcweir 2089cdf0e10cSrcweir if ( nIndex == NF_KEY_NNNN ) 2090cdf0e10cSrcweir { 2091cdf0e10cSrcweir nIndex = NF_KEY_NNN; 2092cdf0e10cSrcweir bHasLongDoW = sal_True; // to remove string constant with separator 2093cdf0e10cSrcweir } 2094cdf0e10cSrcweir 2095cdf0e10cSrcweir String sKeyword = pFormatter->GetKeyword( nFormatLang, nIndex ); 2096cdf0e10cSrcweir 2097cdf0e10cSrcweir if ( nIndex == NF_KEY_H || nIndex == NF_KEY_HH || 2098cdf0e10cSrcweir nIndex == NF_KEY_MI || nIndex == NF_KEY_MMI || 2099cdf0e10cSrcweir nIndex == NF_KEY_S || nIndex == NF_KEY_SS ) 2100cdf0e10cSrcweir { 2101cdf0e10cSrcweir if ( !bTruncate && !bHasDateTime ) 2102cdf0e10cSrcweir { 2103cdf0e10cSrcweir // with truncate-on-overflow = false, add "[]" to first time part 2104cdf0e10cSrcweir 2105cdf0e10cSrcweir sKeyword.Insert( (sal_Unicode) '[', 0 ); 2106cdf0e10cSrcweir sKeyword.Append( (sal_Unicode) ']' ); 2107cdf0e10cSrcweir } 2108cdf0e10cSrcweir bHasDateTime = sal_True; 2109cdf0e10cSrcweir } 2110cdf0e10cSrcweir 2111cdf0e10cSrcweir aFormatCode.append( sKeyword ); 2112cdf0e10cSrcweir 2113cdf0e10cSrcweir // collect the date elements that the format contains, to recognize default date formats 2114cdf0e10cSrcweir switch ( nIndex ) 2115cdf0e10cSrcweir { 2116cdf0e10cSrcweir case NF_KEY_NN: eDateDOW = XML_DEA_SHORT; break; 2117cdf0e10cSrcweir case NF_KEY_NNN: 2118cdf0e10cSrcweir case NF_KEY_NNNN: eDateDOW = XML_DEA_LONG; break; 2119cdf0e10cSrcweir case NF_KEY_D: eDateDay = XML_DEA_SHORT; break; 2120cdf0e10cSrcweir case NF_KEY_DD: eDateDay = XML_DEA_LONG; break; 2121cdf0e10cSrcweir case NF_KEY_M: eDateMonth = XML_DEA_SHORT; break; 2122cdf0e10cSrcweir case NF_KEY_MM: eDateMonth = XML_DEA_LONG; break; 2123cdf0e10cSrcweir case NF_KEY_MMM: eDateMonth = XML_DEA_TEXTSHORT; break; 2124cdf0e10cSrcweir case NF_KEY_MMMM: eDateMonth = XML_DEA_TEXTLONG; break; 2125cdf0e10cSrcweir case NF_KEY_YY: eDateYear = XML_DEA_SHORT; break; 2126cdf0e10cSrcweir case NF_KEY_YYYY: eDateYear = XML_DEA_LONG; break; 2127cdf0e10cSrcweir case NF_KEY_H: eDateHours = XML_DEA_SHORT; break; 2128cdf0e10cSrcweir case NF_KEY_HH: eDateHours = XML_DEA_LONG; break; 2129cdf0e10cSrcweir case NF_KEY_MI: eDateMins = XML_DEA_SHORT; break; 2130cdf0e10cSrcweir case NF_KEY_MMI: eDateMins = XML_DEA_LONG; break; 2131cdf0e10cSrcweir case NF_KEY_S: eDateSecs = XML_DEA_SHORT; break; 2132cdf0e10cSrcweir case NF_KEY_SS: eDateSecs = XML_DEA_LONG; break; 2133cdf0e10cSrcweir case NF_KEY_AP: 2134cdf0e10cSrcweir case NF_KEY_AMPM: break; // AM/PM may or may not be in date/time formats -> ignore by itself 2135cdf0e10cSrcweir default: 2136cdf0e10cSrcweir bDateNoDefault = sal_True; // any other element -> no default format 2137cdf0e10cSrcweir } 2138cdf0e10cSrcweir } 2139cdf0e10cSrcweir 2140cdf0e10cSrcweir sal_Bool lcl_IsAtEnd( rtl::OUStringBuffer& rBuffer, const String& rToken ) 2141cdf0e10cSrcweir { 2142cdf0e10cSrcweir sal_Int32 nBufLen = rBuffer.getLength(); 2143cdf0e10cSrcweir xub_StrLen nTokLen = rToken.Len(); 2144cdf0e10cSrcweir 2145cdf0e10cSrcweir if ( nTokLen > nBufLen ) 2146cdf0e10cSrcweir return sal_False; 2147cdf0e10cSrcweir 2148cdf0e10cSrcweir sal_Int32 nStartPos = nBufLen - nTokLen; 2149cdf0e10cSrcweir for ( xub_StrLen nTokPos = 0; nTokPos < nTokLen; nTokPos++ ) 2150cdf0e10cSrcweir if ( rToken.GetChar( nTokPos ) != rBuffer.charAt( nStartPos + nTokPos ) ) 2151cdf0e10cSrcweir return sal_False; 2152cdf0e10cSrcweir 2153cdf0e10cSrcweir return sal_True; 2154cdf0e10cSrcweir } 2155cdf0e10cSrcweir 2156cdf0e10cSrcweir sal_Bool SvXMLNumFormatContext::ReplaceNfKeyword( sal_uInt16 nOld, sal_uInt16 nNew ) 2157cdf0e10cSrcweir { 2158cdf0e10cSrcweir // replaces one keyword with another if it is found at the end of the code 2159cdf0e10cSrcweir 2160cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 2161cdf0e10cSrcweir if (!pFormatter) 2162cdf0e10cSrcweir return sal_False; 2163cdf0e10cSrcweir 2164cdf0e10cSrcweir String sOldStr = pFormatter->GetKeyword( nFormatLang, nOld ); 2165cdf0e10cSrcweir if ( lcl_IsAtEnd( aFormatCode, sOldStr ) ) 2166cdf0e10cSrcweir { 2167cdf0e10cSrcweir // remove old keyword 2168cdf0e10cSrcweir aFormatCode.setLength( aFormatCode.getLength() - sOldStr.Len() ); 2169cdf0e10cSrcweir 2170cdf0e10cSrcweir // add new keyword 2171cdf0e10cSrcweir String sNewStr = pFormatter->GetKeyword( nFormatLang, nNew ); 2172cdf0e10cSrcweir aFormatCode.append( sNewStr ); 2173cdf0e10cSrcweir 2174cdf0e10cSrcweir return sal_True; // changed 2175cdf0e10cSrcweir } 2176cdf0e10cSrcweir return sal_False; // not found 2177cdf0e10cSrcweir } 2178cdf0e10cSrcweir 2179cdf0e10cSrcweir void SvXMLNumFormatContext::AddCondition( const sal_Int32 nIndex ) 2180cdf0e10cSrcweir { 2181cdf0e10cSrcweir rtl::OUString rApplyName = aMyConditions[nIndex].sMapName; 2182cdf0e10cSrcweir rtl::OUString rCondition = aMyConditions[nIndex].sCondition; 2183cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 2184cdf0e10cSrcweir sal_uInt32 l_nKey = pData->GetKeyForName( rApplyName ); 2185cdf0e10cSrcweir OUString sValue = OUString::createFromAscii( "value()" ); //! define constant 2186cdf0e10cSrcweir sal_Int32 nValLen = sValue.getLength(); 2187cdf0e10cSrcweir 2188cdf0e10cSrcweir if ( pFormatter && l_nKey != NUMBERFORMAT_ENTRY_NOT_FOUND && 2189cdf0e10cSrcweir rCondition.copy( 0, nValLen ) == sValue ) 2190cdf0e10cSrcweir { 2191cdf0e10cSrcweir //! test for valid conditions 2192cdf0e10cSrcweir //! test for default conditions 2193cdf0e10cSrcweir 2194cdf0e10cSrcweir OUString sRealCond = rCondition.copy( nValLen, rCondition.getLength() - nValLen ); 2195cdf0e10cSrcweir sal_Bool bDefaultCond = sal_False; 2196cdf0e10cSrcweir 2197cdf0e10cSrcweir //! collect all conditions first and adjust default to >=0, >0 or <0 depending on count 2198cdf0e10cSrcweir //! allow blanks in conditions 2199cdf0e10cSrcweir sal_Bool bFirstCond = ( aConditions.getLength() == 0 ); 2200cdf0e10cSrcweir if ( bFirstCond && aMyConditions.size() == 1 && sRealCond.compareToAscii( ">=0" ) == 0 ) 2201cdf0e10cSrcweir bDefaultCond = sal_True; 2202cdf0e10cSrcweir 2203cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_TEXT_STYLE && nIndex == 2 ) 2204cdf0e10cSrcweir { 2205cdf0e10cSrcweir // The third condition in a number format with a text part can only be 2206cdf0e10cSrcweir // "all other numbers", the condition string must be empty. 2207cdf0e10cSrcweir bDefaultCond = sal_True; 2208cdf0e10cSrcweir } 2209cdf0e10cSrcweir 2210cdf0e10cSrcweir if (!bDefaultCond) 2211cdf0e10cSrcweir { 2212cdf0e10cSrcweir sal_Int32 nPos = sRealCond.indexOf( '.' ); 2213cdf0e10cSrcweir if ( nPos >= 0 ) 2214cdf0e10cSrcweir { // #i8026# #103991# localize decimal separator 2215cdf0e10cSrcweir const String& rDecSep = GetLocaleData().getNumDecimalSep(); 2216cdf0e10cSrcweir if ( rDecSep.Len() > 1 || rDecSep.GetChar(0) != '.' ) 2217cdf0e10cSrcweir sRealCond = sRealCond.replaceAt( nPos, 1, rDecSep ); 2218cdf0e10cSrcweir } 2219cdf0e10cSrcweir aConditions.append( (sal_Unicode) '[' ); 2220cdf0e10cSrcweir aConditions.append( sRealCond ); 2221cdf0e10cSrcweir aConditions.append( (sal_Unicode) ']' ); 2222cdf0e10cSrcweir } 2223cdf0e10cSrcweir 2224cdf0e10cSrcweir const SvNumberformat* pFormat = pFormatter->GetEntry(l_nKey); 2225cdf0e10cSrcweir if ( pFormat ) 2226cdf0e10cSrcweir aConditions.append( OUString( pFormat->GetFormatstring() ) ); 2227cdf0e10cSrcweir 2228cdf0e10cSrcweir aConditions.append( (sal_Unicode) ';' ); 2229cdf0e10cSrcweir } 2230cdf0e10cSrcweir } 2231cdf0e10cSrcweir 2232cdf0e10cSrcweir void SvXMLNumFormatContext::AddCondition( const sal_Int32 nIndex, const rtl::OUString& rFormat, const LocaleDataWrapper& rData ) 2233cdf0e10cSrcweir { 2234cdf0e10cSrcweir rtl::OUString rCondition = aMyConditions[nIndex].sCondition; 2235cdf0e10cSrcweir OUString sValue = OUString::createFromAscii( "value()" ); //! define constant 2236cdf0e10cSrcweir sal_Int32 nValLen = sValue.getLength(); 2237cdf0e10cSrcweir 2238cdf0e10cSrcweir if ( rCondition.copy( 0, nValLen ) == sValue ) 2239cdf0e10cSrcweir { 2240cdf0e10cSrcweir //! test for valid conditions 2241cdf0e10cSrcweir //! test for default conditions 2242cdf0e10cSrcweir 2243cdf0e10cSrcweir OUString sRealCond = rCondition.copy( nValLen, rCondition.getLength() - nValLen ); 2244cdf0e10cSrcweir sal_Bool bDefaultCond = sal_False; 2245cdf0e10cSrcweir 2246cdf0e10cSrcweir //! collect all conditions first and adjust default to >=0, >0 or <0 depending on count 2247cdf0e10cSrcweir //! allow blanks in conditions 2248cdf0e10cSrcweir sal_Bool bFirstCond = ( aConditions.getLength() == 0 ); 2249cdf0e10cSrcweir if ( bFirstCond && aMyConditions.size() == 1 && sRealCond.compareToAscii( ">=0" ) == 0 ) 2250cdf0e10cSrcweir bDefaultCond = sal_True; 2251cdf0e10cSrcweir 2252cdf0e10cSrcweir if ( nType == XML_TOK_STYLES_TEXT_STYLE && nIndex == 2 ) 2253cdf0e10cSrcweir { 2254cdf0e10cSrcweir // The third condition in a number format with a text part can only be 2255cdf0e10cSrcweir // "all other numbers", the condition string must be empty. 2256cdf0e10cSrcweir bDefaultCond = sal_True; 2257cdf0e10cSrcweir } 2258cdf0e10cSrcweir 2259cdf0e10cSrcweir if (!bDefaultCond) 2260cdf0e10cSrcweir { 2261cdf0e10cSrcweir sal_Int32 nPos = sRealCond.indexOf( '.' ); 2262cdf0e10cSrcweir if ( nPos >= 0 ) 2263cdf0e10cSrcweir { // #i8026# #103991# localize decimal separator 2264cdf0e10cSrcweir const String& rDecSep = rData.getNumDecimalSep(); 2265cdf0e10cSrcweir if ( rDecSep.Len() > 1 || rDecSep.GetChar(0) != '.' ) 2266cdf0e10cSrcweir sRealCond = sRealCond.replaceAt( nPos, 1, rDecSep ); 2267cdf0e10cSrcweir } 2268cdf0e10cSrcweir aConditions.append( (sal_Unicode) '[' ); 2269cdf0e10cSrcweir aConditions.append( sRealCond ); 2270cdf0e10cSrcweir aConditions.append( (sal_Unicode) ']' ); 2271cdf0e10cSrcweir } 2272cdf0e10cSrcweir 2273cdf0e10cSrcweir aConditions.append( rFormat ); 2274cdf0e10cSrcweir 2275cdf0e10cSrcweir aConditions.append( (sal_Unicode) ';' ); 2276cdf0e10cSrcweir } 2277cdf0e10cSrcweir } 2278cdf0e10cSrcweir 2279cdf0e10cSrcweir void SvXMLNumFormatContext::AddCondition( const rtl::OUString& rCondition, const rtl::OUString& rApplyName ) 2280cdf0e10cSrcweir { 2281cdf0e10cSrcweir MyCondition aCondition; 2282cdf0e10cSrcweir aCondition.sCondition = rCondition; 2283cdf0e10cSrcweir aCondition.sMapName = rApplyName; 2284cdf0e10cSrcweir aMyConditions.push_back(aCondition); 2285cdf0e10cSrcweir } 2286cdf0e10cSrcweir 2287cdf0e10cSrcweir void SvXMLNumFormatContext::AddColor( const Color& rColor ) 2288cdf0e10cSrcweir { 2289cdf0e10cSrcweir SvNumberFormatter* pFormatter = pData->GetNumberFormatter(); 2290cdf0e10cSrcweir if (!pFormatter) 2291cdf0e10cSrcweir return; 2292cdf0e10cSrcweir 2293cdf0e10cSrcweir OUStringBuffer aColName; 2294cdf0e10cSrcweir for ( sal_uInt16 i=0; i<XML_NUMF_COLORCOUNT; i++ ) 2295cdf0e10cSrcweir if ( rColor == aNumFmtStdColors[i] ) 2296cdf0e10cSrcweir { 2297cdf0e10cSrcweir aColName = OUString( pFormatter->GetKeyword( nFormatLang, sal::static_int_cast< sal_uInt16 >(NF_KEY_FIRSTCOLOR + i) ) ); 2298cdf0e10cSrcweir break; 2299cdf0e10cSrcweir } 2300cdf0e10cSrcweir 2301cdf0e10cSrcweir if ( aColName.getLength() ) 2302cdf0e10cSrcweir { 2303cdf0e10cSrcweir aColName.insert( 0, (sal_Unicode) '[' ); 2304cdf0e10cSrcweir aColName.append( (sal_Unicode) ']' ); 2305cdf0e10cSrcweir aFormatCode.insert( 0, aColName.makeStringAndClear() ); 2306cdf0e10cSrcweir } 2307cdf0e10cSrcweir } 2308cdf0e10cSrcweir 2309cdf0e10cSrcweir void SvXMLNumFormatContext::UpdateCalendar( const rtl::OUString& rNewCalendar ) 2310cdf0e10cSrcweir { 2311cdf0e10cSrcweir if ( rNewCalendar != sCalendar ) 2312cdf0e10cSrcweir { 2313cdf0e10cSrcweir sCalendar = rNewCalendar; 2314cdf0e10cSrcweir if ( sCalendar.getLength() ) 2315cdf0e10cSrcweir { 2316cdf0e10cSrcweir aFormatCode.appendAscii( "[~" ); // intro for calendar code 2317cdf0e10cSrcweir aFormatCode.append( sCalendar ); 2318cdf0e10cSrcweir aFormatCode.append( (sal_Unicode) ']' ); // end of "new" currency symbolcalendar code 2319cdf0e10cSrcweir } 2320cdf0e10cSrcweir } 2321cdf0e10cSrcweir } 2322cdf0e10cSrcweir 2323cdf0e10cSrcweir sal_Bool SvXMLNumFormatContext::IsSystemLanguage() 2324cdf0e10cSrcweir { 2325cdf0e10cSrcweir return nFormatLang == LANGUAGE_SYSTEM; 2326cdf0e10cSrcweir } 2327cdf0e10cSrcweir 2328cdf0e10cSrcweir //------------------------------------------------------------------------- 2329cdf0e10cSrcweir 2330cdf0e10cSrcweir // 2331cdf0e10cSrcweir // SvXMLNumFmtHelper 2332cdf0e10cSrcweir // 2333cdf0e10cSrcweir 2334cdf0e10cSrcweir // #110680# 2335cdf0e10cSrcweir //SvXMLNumFmtHelper::SvXMLNumFmtHelper( 2336cdf0e10cSrcweir // const uno::Reference<util::XNumberFormatsSupplier>& rSupp ) 2337cdf0e10cSrcweir SvXMLNumFmtHelper::SvXMLNumFmtHelper( 2338cdf0e10cSrcweir const uno::Reference<util::XNumberFormatsSupplier>& rSupp, 2339cdf0e10cSrcweir const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory ) 2340cdf0e10cSrcweir : mxServiceFactory(xServiceFactory) 2341cdf0e10cSrcweir { 2342cdf0e10cSrcweir DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); 2343cdf0e10cSrcweir 2344cdf0e10cSrcweir SvNumberFormatter* pFormatter = NULL; 2345cdf0e10cSrcweir SvNumberFormatsSupplierObj* pObj = 2346cdf0e10cSrcweir SvNumberFormatsSupplierObj::getImplementation( rSupp ); 2347cdf0e10cSrcweir if (pObj) 2348cdf0e10cSrcweir pFormatter = pObj->GetNumberFormatter(); 2349cdf0e10cSrcweir 2350cdf0e10cSrcweir // #110680# 2351cdf0e10cSrcweir // pData = new SvXMLNumImpData( pFormatter ); 2352cdf0e10cSrcweir pData = new SvXMLNumImpData( pFormatter, mxServiceFactory ); 2353cdf0e10cSrcweir } 2354cdf0e10cSrcweir 2355cdf0e10cSrcweir // #110680# 2356cdf0e10cSrcweir // SvXMLNumFmtHelper::SvXMLNumFmtHelper( SvNumberFormatter* pNumberFormatter ) 2357cdf0e10cSrcweir SvXMLNumFmtHelper::SvXMLNumFmtHelper( 2358cdf0e10cSrcweir SvNumberFormatter* pNumberFormatter, 2359cdf0e10cSrcweir const uno::Reference<lang::XMultiServiceFactory>& xServiceFactory ) 2360cdf0e10cSrcweir : mxServiceFactory(xServiceFactory) 2361cdf0e10cSrcweir { 2362cdf0e10cSrcweir DBG_ASSERT( mxServiceFactory.is(), "got no service manager" ); 2363cdf0e10cSrcweir 2364cdf0e10cSrcweir // #110680# 2365cdf0e10cSrcweir // pData = new SvXMLNumImpData( pNumberFormatter ); 2366cdf0e10cSrcweir pData = new SvXMLNumImpData( pNumberFormatter, mxServiceFactory ); 2367cdf0e10cSrcweir } 2368cdf0e10cSrcweir 2369cdf0e10cSrcweir SvXMLNumFmtHelper::~SvXMLNumFmtHelper() 2370cdf0e10cSrcweir { 2371cdf0e10cSrcweir // remove temporary (volatile) formats from NumberFormatter 2372cdf0e10cSrcweir pData->RemoveVolatileFormats(); 2373cdf0e10cSrcweir 2374cdf0e10cSrcweir delete pData; 2375cdf0e10cSrcweir } 2376cdf0e10cSrcweir 2377cdf0e10cSrcweir SvXMLStyleContext* SvXMLNumFmtHelper::CreateChildContext( SvXMLImport& rImport, 2378cdf0e10cSrcweir sal_uInt16 nPrefix, const OUString& rLocalName, 2379cdf0e10cSrcweir const uno::Reference<xml::sax::XAttributeList>& xAttrList, 2380cdf0e10cSrcweir SvXMLStylesContext& rStyles ) 2381cdf0e10cSrcweir { 2382cdf0e10cSrcweir SvXMLStyleContext* pContext = NULL; 2383cdf0e10cSrcweir 2384cdf0e10cSrcweir const SvXMLTokenMap& rTokenMap = pData->GetStylesElemTokenMap(); 2385cdf0e10cSrcweir sal_uInt16 nToken = rTokenMap.Get( nPrefix, rLocalName ); 2386cdf0e10cSrcweir switch (nToken) 2387cdf0e10cSrcweir { 2388cdf0e10cSrcweir case XML_TOK_STYLES_NUMBER_STYLE: 2389cdf0e10cSrcweir case XML_TOK_STYLES_CURRENCY_STYLE: 2390cdf0e10cSrcweir case XML_TOK_STYLES_PERCENTAGE_STYLE: 2391cdf0e10cSrcweir case XML_TOK_STYLES_DATE_STYLE: 2392cdf0e10cSrcweir case XML_TOK_STYLES_TIME_STYLE: 2393cdf0e10cSrcweir case XML_TOK_STYLES_BOOLEAN_STYLE: 2394cdf0e10cSrcweir case XML_TOK_STYLES_TEXT_STYLE: 2395cdf0e10cSrcweir pContext = new SvXMLNumFormatContext( rImport, nPrefix, rLocalName, 2396cdf0e10cSrcweir pData, nToken, xAttrList, rStyles ); 2397cdf0e10cSrcweir break; 2398cdf0e10cSrcweir } 2399cdf0e10cSrcweir 2400cdf0e10cSrcweir // return NULL if not a data style, caller must handle other elements 2401cdf0e10cSrcweir return pContext; 2402cdf0e10cSrcweir } 2403cdf0e10cSrcweir 2404cdf0e10cSrcweir const SvXMLTokenMap& SvXMLNumFmtHelper::GetStylesElemTokenMap() 2405cdf0e10cSrcweir { 2406cdf0e10cSrcweir return pData->GetStylesElemTokenMap(); 2407cdf0e10cSrcweir } 2408cdf0e10cSrcweir 2409cdf0e10cSrcweir /*sal_uInt32 SvXMLNumFmtHelper::GetKeyForName( const rtl::OUString& rName ) 2410cdf0e10cSrcweir { 2411cdf0e10cSrcweir return pData->GetKeyForName( rName ); 2412cdf0e10cSrcweir }*/ 2413cdf0e10cSrcweir 2414cdf0e10cSrcweir 2415