1*63bba73cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*63bba73cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*63bba73cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*63bba73cSAndrew Rist * distributed with this work for additional information 6*63bba73cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*63bba73cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*63bba73cSAndrew Rist * "License"); you may not use this file except in compliance 9*63bba73cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*63bba73cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*63bba73cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*63bba73cSAndrew Rist * software distributed under the License is distributed on an 15*63bba73cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*63bba73cSAndrew Rist * KIND, either express or implied. See the License for the 17*63bba73cSAndrew Rist * specific language governing permissions and limitations 18*63bba73cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*63bba73cSAndrew Rist *************************************************************/ 21*63bba73cSAndrew Rist 22*63bba73cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #define _SVSTDARR_ULONGS 28cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <svl/svstdarr.hxx> 31cdf0e10cSrcweir #include <svl/zforlist.hxx> 32cdf0e10cSrcweir #include <svl/zformat.hxx> 33cdf0e10cSrcweir #include <svl/numuno.hxx> 34cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 35cdf0e10cSrcweir #include <tools/debug.hxx> 36cdf0e10cSrcweir #include <rtl/math.hxx> 37cdf0e10cSrcweir #include <unotools/calendarwrapper.hxx> 38cdf0e10cSrcweir #include <unotools/charclass.hxx> 39cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 40cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 41cdf0e10cSrcweir 42cdf0e10cSrcweir // #110680# 43cdf0e10cSrcweir //#include <comphelper/processfactory.hxx> 44cdf0e10cSrcweir 45cdf0e10cSrcweir #include <com/sun/star/i18n/NativeNumberXmlAttributes.hpp> 46cdf0e10cSrcweir 47cdf0e10cSrcweir #include <xmloff/xmlnumfe.hxx> 48cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 49cdf0e10cSrcweir #include <xmloff/xmluconv.hxx> 50cdf0e10cSrcweir #include <xmloff/attrlist.hxx> 51cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 52cdf0e10cSrcweir #include <xmloff/families.hxx> 53cdf0e10cSrcweir #include <xmloff/xmlnumfi.hxx> // SvXMLNumFmtDefaults 54cdf0e10cSrcweir 55cdf0e10cSrcweir #define _SVSTDARR_USHORTS 56cdf0e10cSrcweir #include <svl/svstdarr.hxx> 57cdf0e10cSrcweir #include <svl/nfsymbol.hxx> 58cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 59cdf0e10cSrcweir #include <xmloff/xmlexp.hxx> 60cdf0e10cSrcweir 61cdf0e10cSrcweir #include <set> 62cdf0e10cSrcweir 63cdf0e10cSrcweir using ::rtl::OUString; 64cdf0e10cSrcweir using ::rtl::OUStringBuffer; 65cdf0e10cSrcweir 66cdf0e10cSrcweir using namespace ::com::sun::star; 67cdf0e10cSrcweir using namespace ::xmloff::token; 68cdf0e10cSrcweir using namespace ::svt; 69cdf0e10cSrcweir 70cdf0e10cSrcweir //------------------------------------------------------------------------- 71cdf0e10cSrcweir 72cdf0e10cSrcweir // 4th condition for text formats doesn't work 73cdf0e10cSrcweir //#define XMLNUM_MAX_PARTS 4 74cdf0e10cSrcweir #define XMLNUM_MAX_PARTS 3 75cdf0e10cSrcweir 76cdf0e10cSrcweir //------------------------------------------------------------------------- 77cdf0e10cSrcweir 78cdf0e10cSrcweir struct LessuInt32 79cdf0e10cSrcweir { 80cdf0e10cSrcweir sal_Bool operator() (const sal_uInt32 rValue1, const sal_uInt32 rValue2) const 81cdf0e10cSrcweir { 82cdf0e10cSrcweir return rValue1 < rValue2; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir }; 85cdf0e10cSrcweir 86cdf0e10cSrcweir typedef std::set< sal_uInt32, LessuInt32 > SvXMLuInt32Set; 87cdf0e10cSrcweir 88cdf0e10cSrcweir class SvXMLNumUsedList_Impl 89cdf0e10cSrcweir { 90cdf0e10cSrcweir SvXMLuInt32Set aUsed; 91cdf0e10cSrcweir SvXMLuInt32Set aWasUsed; 92cdf0e10cSrcweir SvXMLuInt32Set::iterator aCurrentUsedPos; 93cdf0e10cSrcweir sal_uInt32 nUsedCount; 94cdf0e10cSrcweir sal_uInt32 nWasUsedCount; 95cdf0e10cSrcweir 96cdf0e10cSrcweir public: 97cdf0e10cSrcweir SvXMLNumUsedList_Impl(); 98cdf0e10cSrcweir ~SvXMLNumUsedList_Impl(); 99cdf0e10cSrcweir 100cdf0e10cSrcweir void SetUsed( sal_uInt32 nKey ); 101cdf0e10cSrcweir sal_Bool IsUsed( sal_uInt32 nKey ) const; 102cdf0e10cSrcweir sal_Bool IsWasUsed( sal_uInt32 nKey ) const; 103cdf0e10cSrcweir void Export(); 104cdf0e10cSrcweir 105cdf0e10cSrcweir sal_Bool GetFirstUsed(sal_uInt32& nKey); 106cdf0e10cSrcweir sal_Bool GetNextUsed(sal_uInt32& nKey); 107cdf0e10cSrcweir 108cdf0e10cSrcweir void GetWasUsed(uno::Sequence<sal_Int32>& rWasUsed); 109cdf0e10cSrcweir void SetWasUsed(const uno::Sequence<sal_Int32>& rWasUsed); 110cdf0e10cSrcweir }; 111cdf0e10cSrcweir 112cdf0e10cSrcweir //------------------------------------------------------------------------- 113cdf0e10cSrcweir 114cdf0e10cSrcweir struct SvXMLEmbeddedTextEntry 115cdf0e10cSrcweir { 116cdf0e10cSrcweir sal_uInt16 nSourcePos; // position in NumberFormat (to skip later) 117cdf0e10cSrcweir sal_Int32 nFormatPos; // resulting position in embedded-text element 118cdf0e10cSrcweir rtl::OUString aText; 119cdf0e10cSrcweir 120cdf0e10cSrcweir SvXMLEmbeddedTextEntry( sal_uInt16 nSP, sal_Int32 nFP, const rtl::OUString& rT ) : 121cdf0e10cSrcweir nSourcePos(nSP), nFormatPos(nFP), aText(rT) {} 122cdf0e10cSrcweir }; 123cdf0e10cSrcweir 124cdf0e10cSrcweir typedef SvXMLEmbeddedTextEntry* SvXMLEmbeddedTextEntryPtr; 125cdf0e10cSrcweir SV_DECL_PTRARR_DEL( SvXMLEmbeddedTextEntryArr, SvXMLEmbeddedTextEntryPtr, 4, 4 ) 126cdf0e10cSrcweir 127cdf0e10cSrcweir //------------------------------------------------------------------------- 128cdf0e10cSrcweir 129cdf0e10cSrcweir SV_IMPL_PTRARR( SvXMLEmbeddedTextEntryArr, SvXMLEmbeddedTextEntryPtr ); 130cdf0e10cSrcweir 131cdf0e10cSrcweir //------------------------------------------------------------------------- 132cdf0e10cSrcweir 133cdf0e10cSrcweir // 134cdf0e10cSrcweir //! SvXMLNumUsedList_Impl should be optimized! 135cdf0e10cSrcweir // 136cdf0e10cSrcweir 137cdf0e10cSrcweir SvXMLNumUsedList_Impl::SvXMLNumUsedList_Impl() : 138cdf0e10cSrcweir nUsedCount(0), 139cdf0e10cSrcweir nWasUsedCount(0) 140cdf0e10cSrcweir { 141cdf0e10cSrcweir } 142cdf0e10cSrcweir 143cdf0e10cSrcweir SvXMLNumUsedList_Impl::~SvXMLNumUsedList_Impl() 144cdf0e10cSrcweir { 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir void SvXMLNumUsedList_Impl::SetUsed( sal_uInt32 nKey ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir if ( !IsWasUsed(nKey) ) 150cdf0e10cSrcweir { 151cdf0e10cSrcweir std::pair<SvXMLuInt32Set::iterator, bool> aPair = aUsed.insert( nKey ); 152cdf0e10cSrcweir if (aPair.second) 153cdf0e10cSrcweir nUsedCount++; 154cdf0e10cSrcweir } 155cdf0e10cSrcweir } 156cdf0e10cSrcweir 157cdf0e10cSrcweir sal_Bool SvXMLNumUsedList_Impl::IsUsed( sal_uInt32 nKey ) const 158cdf0e10cSrcweir { 159cdf0e10cSrcweir SvXMLuInt32Set::iterator aItr = aUsed.find(nKey); 160cdf0e10cSrcweir return (aItr != aUsed.end()); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir sal_Bool SvXMLNumUsedList_Impl::IsWasUsed( sal_uInt32 nKey ) const 164cdf0e10cSrcweir { 165cdf0e10cSrcweir SvXMLuInt32Set::iterator aItr = aWasUsed.find(nKey); 166cdf0e10cSrcweir return (aItr != aWasUsed.end()); 167cdf0e10cSrcweir } 168cdf0e10cSrcweir 169cdf0e10cSrcweir void SvXMLNumUsedList_Impl::Export() 170cdf0e10cSrcweir { 171cdf0e10cSrcweir SvXMLuInt32Set::iterator aItr = aUsed.begin(); 172cdf0e10cSrcweir while (aItr != aUsed.end()) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir std::pair<SvXMLuInt32Set::iterator, bool> aPair = aWasUsed.insert( *aItr ); 175cdf0e10cSrcweir if (aPair.second) 176cdf0e10cSrcweir nWasUsedCount++; 177cdf0e10cSrcweir aItr++; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir aUsed.clear(); 180cdf0e10cSrcweir nUsedCount = 0; 181cdf0e10cSrcweir } 182cdf0e10cSrcweir 183cdf0e10cSrcweir sal_Bool SvXMLNumUsedList_Impl::GetFirstUsed(sal_uInt32& nKey) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir sal_Bool bRet(sal_False); 186cdf0e10cSrcweir aCurrentUsedPos = aUsed.begin(); 187cdf0e10cSrcweir if(nUsedCount) 188cdf0e10cSrcweir { 189cdf0e10cSrcweir DBG_ASSERT(aCurrentUsedPos != aUsed.end(), "something went wrong"); 190cdf0e10cSrcweir nKey = *aCurrentUsedPos; 191cdf0e10cSrcweir bRet = sal_True; 192cdf0e10cSrcweir } 193cdf0e10cSrcweir return bRet; 194cdf0e10cSrcweir } 195cdf0e10cSrcweir 196cdf0e10cSrcweir sal_Bool SvXMLNumUsedList_Impl::GetNextUsed(sal_uInt32& nKey) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir sal_Bool bRet(sal_False); 199cdf0e10cSrcweir if (aCurrentUsedPos != aUsed.end()) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir aCurrentUsedPos++; 202cdf0e10cSrcweir if (aCurrentUsedPos != aUsed.end()) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir nKey = *aCurrentUsedPos; 205cdf0e10cSrcweir bRet = sal_True; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir } 208cdf0e10cSrcweir return bRet; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir void SvXMLNumUsedList_Impl::GetWasUsed(uno::Sequence<sal_Int32>& rWasUsed) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir rWasUsed.realloc(nWasUsedCount); 214cdf0e10cSrcweir sal_Int32* pWasUsed = rWasUsed.getArray(); 215cdf0e10cSrcweir if (pWasUsed) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir SvXMLuInt32Set::iterator aItr = aWasUsed.begin(); 218cdf0e10cSrcweir while (aItr != aWasUsed.end()) 219cdf0e10cSrcweir { 220cdf0e10cSrcweir *pWasUsed = *aItr; 221cdf0e10cSrcweir aItr++; 222cdf0e10cSrcweir pWasUsed++; 223cdf0e10cSrcweir } 224cdf0e10cSrcweir } 225cdf0e10cSrcweir } 226cdf0e10cSrcweir 227cdf0e10cSrcweir void SvXMLNumUsedList_Impl::SetWasUsed(const uno::Sequence<sal_Int32>& rWasUsed) 228cdf0e10cSrcweir { 229cdf0e10cSrcweir DBG_ASSERT(nWasUsedCount == 0, "WasUsed should be empty"); 230cdf0e10cSrcweir sal_Int32 nCount(rWasUsed.getLength()); 231cdf0e10cSrcweir const sal_Int32* pWasUsed = rWasUsed.getConstArray(); 232cdf0e10cSrcweir for (sal_uInt16 i = 0; i < nCount; i++, pWasUsed++) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir std::pair<SvXMLuInt32Set::iterator, bool> aPair = aWasUsed.insert( *pWasUsed ); 235cdf0e10cSrcweir if (aPair.second) 236cdf0e10cSrcweir nWasUsedCount++; 237cdf0e10cSrcweir } 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir //------------------------------------------------------------------------- 241cdf0e10cSrcweir 242cdf0e10cSrcweir SvXMLNumFmtExport::SvXMLNumFmtExport( 243cdf0e10cSrcweir SvXMLExport& rExp, 244cdf0e10cSrcweir const uno::Reference< util::XNumberFormatsSupplier >& rSupp ) : 245cdf0e10cSrcweir rExport( rExp ), 246cdf0e10cSrcweir sPrefix( OUString::createFromAscii( "N" ) ), 247cdf0e10cSrcweir pFormatter( NULL ), 248cdf0e10cSrcweir pCharClass( NULL ), 249cdf0e10cSrcweir pLocaleData( NULL ) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir // supplier must be SvNumberFormatsSupplierObj 252cdf0e10cSrcweir SvNumberFormatsSupplierObj* pObj = 253cdf0e10cSrcweir SvNumberFormatsSupplierObj::getImplementation( rSupp ); 254cdf0e10cSrcweir if (pObj) 255cdf0e10cSrcweir pFormatter = pObj->GetNumberFormatter(); 256cdf0e10cSrcweir 257cdf0e10cSrcweir if ( pFormatter ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir pCharClass = new CharClass( pFormatter->GetServiceManager(), 260cdf0e10cSrcweir pFormatter->GetLocale() ); 261cdf0e10cSrcweir pLocaleData = new LocaleDataWrapper( pFormatter->GetServiceManager(), 262cdf0e10cSrcweir pFormatter->GetLocale() ); 263cdf0e10cSrcweir } 264cdf0e10cSrcweir else 265cdf0e10cSrcweir { 266cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( MsLangId::getSystemLanguage() ) ); 267cdf0e10cSrcweir 268cdf0e10cSrcweir // #110680# 269cdf0e10cSrcweir // pCharClass = new CharClass( ::comphelper::getProcessServiceFactory(), aLocale ); 270cdf0e10cSrcweir // pLocaleData = new LocaleDataWrapper( ::comphelper::getProcessServiceFactory(), aLocale ); 271cdf0e10cSrcweir pCharClass = new CharClass( rExport.getServiceFactory(), aLocale ); 272cdf0e10cSrcweir pLocaleData = new LocaleDataWrapper( rExport.getServiceFactory(), aLocale ); 273cdf0e10cSrcweir } 274cdf0e10cSrcweir 275cdf0e10cSrcweir pUsedList = new SvXMLNumUsedList_Impl; 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir SvXMLNumFmtExport::SvXMLNumFmtExport( 279cdf0e10cSrcweir SvXMLExport& rExp, 280cdf0e10cSrcweir const ::com::sun::star::uno::Reference< 281cdf0e10cSrcweir ::com::sun::star::util::XNumberFormatsSupplier >& rSupp, 282cdf0e10cSrcweir const rtl::OUString& rPrefix ) : 283cdf0e10cSrcweir rExport( rExp ), 284cdf0e10cSrcweir sPrefix( rPrefix ), 285cdf0e10cSrcweir pFormatter( NULL ), 286cdf0e10cSrcweir pCharClass( NULL ), 287cdf0e10cSrcweir pLocaleData( NULL ) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir // supplier must be SvNumberFormatsSupplierObj 290cdf0e10cSrcweir SvNumberFormatsSupplierObj* pObj = 291cdf0e10cSrcweir SvNumberFormatsSupplierObj::getImplementation( rSupp ); 292cdf0e10cSrcweir if (pObj) 293cdf0e10cSrcweir pFormatter = pObj->GetNumberFormatter(); 294cdf0e10cSrcweir 295cdf0e10cSrcweir if ( pFormatter ) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir pCharClass = new CharClass( pFormatter->GetServiceManager(), 298cdf0e10cSrcweir pFormatter->GetLocale() ); 299cdf0e10cSrcweir pLocaleData = new LocaleDataWrapper( pFormatter->GetServiceManager(), 300cdf0e10cSrcweir pFormatter->GetLocale() ); 301cdf0e10cSrcweir } 302cdf0e10cSrcweir else 303cdf0e10cSrcweir { 304cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( MsLangId::getSystemLanguage() ) ); 305cdf0e10cSrcweir 306cdf0e10cSrcweir // #110680# 307cdf0e10cSrcweir // pCharClass = new CharClass( ::comphelper::getProcessServiceFactory(), aLocale ); 308cdf0e10cSrcweir // pLocaleData = new LocaleDataWrapper( ::comphelper::getProcessServiceFactory(), aLocale ); 309cdf0e10cSrcweir pCharClass = new CharClass( rExport.getServiceFactory(), aLocale ); 310cdf0e10cSrcweir pLocaleData = new LocaleDataWrapper( rExport.getServiceFactory(), aLocale ); 311cdf0e10cSrcweir } 312cdf0e10cSrcweir 313cdf0e10cSrcweir pUsedList = new SvXMLNumUsedList_Impl; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir SvXMLNumFmtExport::~SvXMLNumFmtExport() 317cdf0e10cSrcweir { 318cdf0e10cSrcweir delete pUsedList; 319cdf0e10cSrcweir delete pLocaleData; 320cdf0e10cSrcweir delete pCharClass; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir 323cdf0e10cSrcweir //------------------------------------------------------------------------- 324cdf0e10cSrcweir 325cdf0e10cSrcweir // 326cdf0e10cSrcweir // helper methods 327cdf0e10cSrcweir // 328cdf0e10cSrcweir 329cdf0e10cSrcweir OUString lcl_CreateStyleName( sal_Int32 nKey, sal_Int32 nPart, sal_Bool bDefPart, const rtl::OUString& rPrefix ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir OUStringBuffer aFmtName( 10L ); 332cdf0e10cSrcweir aFmtName.append( rPrefix ); 333cdf0e10cSrcweir aFmtName.append( nKey ); 334cdf0e10cSrcweir if (!bDefPart) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir aFmtName.append( (sal_Unicode)'P' ); 337cdf0e10cSrcweir aFmtName.append( nPart ); 338cdf0e10cSrcweir } 339cdf0e10cSrcweir return aFmtName.makeStringAndClear(); 340cdf0e10cSrcweir } 341cdf0e10cSrcweir 342cdf0e10cSrcweir void SvXMLNumFmtExport::AddCalendarAttr_Impl( const OUString& rCalendar ) 343cdf0e10cSrcweir { 344cdf0e10cSrcweir if ( rCalendar.getLength() ) 345cdf0e10cSrcweir { 346cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_CALENDAR, rCalendar ); 347cdf0e10cSrcweir } 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir void SvXMLNumFmtExport::AddTextualAttr_Impl( sal_Bool bText ) 351cdf0e10cSrcweir { 352cdf0e10cSrcweir if ( bText ) // non-textual 353cdf0e10cSrcweir { 354cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TEXTUAL, XML_TRUE ); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir } 357cdf0e10cSrcweir 358cdf0e10cSrcweir void SvXMLNumFmtExport::AddStyleAttr_Impl( sal_Bool bLong ) 359cdf0e10cSrcweir { 360cdf0e10cSrcweir if ( bLong ) // short is default 361cdf0e10cSrcweir { 362cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_STYLE, XML_LONG ); 363cdf0e10cSrcweir } 364cdf0e10cSrcweir } 365cdf0e10cSrcweir 366cdf0e10cSrcweir void SvXMLNumFmtExport::AddLanguageAttr_Impl( sal_Int32 nLang ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir if ( nLang != LANGUAGE_SYSTEM ) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir OUString aLangStr, aCountryStr; 371cdf0e10cSrcweir MsLangId::convertLanguageToIsoNames( (LanguageType)nLang, aLangStr, aCountryStr ); 372cdf0e10cSrcweir 373cdf0e10cSrcweir if (aLangStr.getLength()) 374cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_LANGUAGE, aLangStr ); 375cdf0e10cSrcweir if (aCountryStr.getLength()) 376cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_COUNTRY, aCountryStr ); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir } 379cdf0e10cSrcweir 380cdf0e10cSrcweir //------------------------------------------------------------------------- 381cdf0e10cSrcweir 382cdf0e10cSrcweir // 383cdf0e10cSrcweir // methods to write individual elements within a format 384cdf0e10cSrcweir // 385cdf0e10cSrcweir 386cdf0e10cSrcweir void SvXMLNumFmtExport::AddToTextElement_Impl( const OUString& rString ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir // append to sTextContent, write element in FinishTextElement_Impl 389cdf0e10cSrcweir // to avoid several text elements following each other 390cdf0e10cSrcweir 391cdf0e10cSrcweir sTextContent.append( rString ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir void SvXMLNumFmtExport::FinishTextElement_Impl() 395cdf0e10cSrcweir { 396cdf0e10cSrcweir if ( sTextContent.getLength() ) 397cdf0e10cSrcweir { 398cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_TEXT, 399cdf0e10cSrcweir sal_True, sal_False ); 400cdf0e10cSrcweir rExport.Characters( sTextContent.makeStringAndClear() ); 401cdf0e10cSrcweir } 402cdf0e10cSrcweir } 403cdf0e10cSrcweir 404cdf0e10cSrcweir void SvXMLNumFmtExport::WriteColorElement_Impl( const Color& rColor ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir FinishTextElement_Impl(); 407cdf0e10cSrcweir 408cdf0e10cSrcweir OUStringBuffer aColStr( 7 ); 409cdf0e10cSrcweir SvXMLUnitConverter::convertColor( aColStr, rColor ); 410cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_FO, XML_COLOR, 411cdf0e10cSrcweir aColStr.makeStringAndClear() ); 412cdf0e10cSrcweir 413cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_STYLE, XML_TEXT_PROPERTIES, 414cdf0e10cSrcweir sal_True, sal_False ); 415cdf0e10cSrcweir } 416cdf0e10cSrcweir 417cdf0e10cSrcweir void SvXMLNumFmtExport::WriteCurrencyElement_Impl( const OUString& rString, 418cdf0e10cSrcweir const OUString& rExt ) 419cdf0e10cSrcweir { 420cdf0e10cSrcweir FinishTextElement_Impl(); 421cdf0e10cSrcweir 422cdf0e10cSrcweir if ( rExt.getLength() ) 423cdf0e10cSrcweir { 424cdf0e10cSrcweir sal_Int32 nLang = rExt.toInt32(16); // hex 425cdf0e10cSrcweir if ( nLang < 0 ) // extension string may contain "-" separator 426cdf0e10cSrcweir nLang = -nLang; 427cdf0e10cSrcweir AddLanguageAttr_Impl( nLang ); // adds to pAttrList 428cdf0e10cSrcweir } 429cdf0e10cSrcweir 430cdf0e10cSrcweir SvXMLElementExport aElem( rExport, 431cdf0e10cSrcweir XML_NAMESPACE_NUMBER, XML_CURRENCY_SYMBOL, 432cdf0e10cSrcweir sal_True, sal_False ); 433cdf0e10cSrcweir rExport.Characters( rString ); 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir void SvXMLNumFmtExport::WriteBooleanElement_Impl() 437cdf0e10cSrcweir { 438cdf0e10cSrcweir FinishTextElement_Impl(); 439cdf0e10cSrcweir 440cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_BOOLEAN, 441cdf0e10cSrcweir sal_True, sal_False ); 442cdf0e10cSrcweir } 443cdf0e10cSrcweir 444cdf0e10cSrcweir void SvXMLNumFmtExport::WriteTextContentElement_Impl() 445cdf0e10cSrcweir { 446cdf0e10cSrcweir FinishTextElement_Impl(); 447cdf0e10cSrcweir 448cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_TEXT_CONTENT, 449cdf0e10cSrcweir sal_True, sal_False ); 450cdf0e10cSrcweir } 451cdf0e10cSrcweir 452cdf0e10cSrcweir // date elements 453cdf0e10cSrcweir 454cdf0e10cSrcweir void SvXMLNumFmtExport::WriteDayElement_Impl( const OUString& rCalendar, sal_Bool bLong ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir FinishTextElement_Impl(); 457cdf0e10cSrcweir 458cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 459cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 460cdf0e10cSrcweir 461cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_DAY, 462cdf0e10cSrcweir sal_True, sal_False ); 463cdf0e10cSrcweir } 464cdf0e10cSrcweir 465cdf0e10cSrcweir void SvXMLNumFmtExport::WriteMonthElement_Impl( const OUString& rCalendar, sal_Bool bLong, sal_Bool bText ) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir FinishTextElement_Impl(); 468cdf0e10cSrcweir 469cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 470cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 471cdf0e10cSrcweir AddTextualAttr_Impl( bText ); // adds to pAttrList 472cdf0e10cSrcweir 473cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_MONTH, 474cdf0e10cSrcweir sal_True, sal_False ); 475cdf0e10cSrcweir } 476cdf0e10cSrcweir 477cdf0e10cSrcweir void SvXMLNumFmtExport::WriteYearElement_Impl( const OUString& rCalendar, sal_Bool bLong ) 478cdf0e10cSrcweir { 479cdf0e10cSrcweir FinishTextElement_Impl(); 480cdf0e10cSrcweir 481cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 482cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 483cdf0e10cSrcweir 484cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_YEAR, 485cdf0e10cSrcweir sal_True, sal_False ); 486cdf0e10cSrcweir } 487cdf0e10cSrcweir 488cdf0e10cSrcweir void SvXMLNumFmtExport::WriteEraElement_Impl( const OUString& rCalendar, sal_Bool bLong ) 489cdf0e10cSrcweir { 490cdf0e10cSrcweir FinishTextElement_Impl(); 491cdf0e10cSrcweir 492cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 493cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 494cdf0e10cSrcweir 495cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_ERA, 496cdf0e10cSrcweir sal_True, sal_False ); 497cdf0e10cSrcweir } 498cdf0e10cSrcweir 499cdf0e10cSrcweir void SvXMLNumFmtExport::WriteDayOfWeekElement_Impl( const OUString& rCalendar, sal_Bool bLong ) 500cdf0e10cSrcweir { 501cdf0e10cSrcweir FinishTextElement_Impl(); 502cdf0e10cSrcweir 503cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 504cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 505cdf0e10cSrcweir 506cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_DAY_OF_WEEK, 507cdf0e10cSrcweir sal_True, sal_False ); 508cdf0e10cSrcweir } 509cdf0e10cSrcweir 510cdf0e10cSrcweir void SvXMLNumFmtExport::WriteWeekElement_Impl( const OUString& rCalendar ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir FinishTextElement_Impl(); 513cdf0e10cSrcweir 514cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 515cdf0e10cSrcweir 516cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_WEEK_OF_YEAR, 517cdf0e10cSrcweir sal_True, sal_False ); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir 520cdf0e10cSrcweir void SvXMLNumFmtExport::WriteQuarterElement_Impl( const OUString& rCalendar, sal_Bool bLong ) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir FinishTextElement_Impl(); 523cdf0e10cSrcweir 524cdf0e10cSrcweir AddCalendarAttr_Impl( rCalendar ); // adds to pAttrList 525cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 526cdf0e10cSrcweir 527cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_QUARTER, 528cdf0e10cSrcweir sal_True, sal_False ); 529cdf0e10cSrcweir } 530cdf0e10cSrcweir 531cdf0e10cSrcweir // time elements 532cdf0e10cSrcweir 533cdf0e10cSrcweir void SvXMLNumFmtExport::WriteHoursElement_Impl( sal_Bool bLong ) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir FinishTextElement_Impl(); 536cdf0e10cSrcweir 537cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 538cdf0e10cSrcweir 539cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_HOURS, 540cdf0e10cSrcweir sal_True, sal_False ); 541cdf0e10cSrcweir } 542cdf0e10cSrcweir 543cdf0e10cSrcweir void SvXMLNumFmtExport::WriteMinutesElement_Impl( sal_Bool bLong ) 544cdf0e10cSrcweir { 545cdf0e10cSrcweir FinishTextElement_Impl(); 546cdf0e10cSrcweir 547cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 548cdf0e10cSrcweir 549cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_MINUTES, 550cdf0e10cSrcweir sal_True, sal_False ); 551cdf0e10cSrcweir } 552cdf0e10cSrcweir 553cdf0e10cSrcweir void SvXMLNumFmtExport::WriteSecondsElement_Impl( sal_Bool bLong, sal_uInt16 nDecimals ) 554cdf0e10cSrcweir { 555cdf0e10cSrcweir FinishTextElement_Impl(); 556cdf0e10cSrcweir 557cdf0e10cSrcweir AddStyleAttr_Impl( bLong ); // adds to pAttrList 558cdf0e10cSrcweir if ( nDecimals > 0 ) 559cdf0e10cSrcweir { 560cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, 561cdf0e10cSrcweir OUString::valueOf( (sal_Int32) nDecimals ) ); 562cdf0e10cSrcweir } 563cdf0e10cSrcweir 564cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_SECONDS, 565cdf0e10cSrcweir sal_True, sal_False ); 566cdf0e10cSrcweir } 567cdf0e10cSrcweir 568cdf0e10cSrcweir void SvXMLNumFmtExport::WriteAMPMElement_Impl() 569cdf0e10cSrcweir { 570cdf0e10cSrcweir FinishTextElement_Impl(); 571cdf0e10cSrcweir 572cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_AM_PM, 573cdf0e10cSrcweir sal_True, sal_False ); 574cdf0e10cSrcweir } 575cdf0e10cSrcweir 576cdf0e10cSrcweir // numbers 577cdf0e10cSrcweir 578cdf0e10cSrcweir void SvXMLNumFmtExport::WriteNumberElement_Impl( 579cdf0e10cSrcweir sal_Int32 nDecimals, sal_Int32 nInteger, 580cdf0e10cSrcweir const OUString& rDashStr, sal_Bool bVarDecimals, 581cdf0e10cSrcweir sal_Bool bGrouping, sal_Int32 nTrailingThousands, 582cdf0e10cSrcweir const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries ) 583cdf0e10cSrcweir { 584cdf0e10cSrcweir FinishTextElement_Impl(); 585cdf0e10cSrcweir 586cdf0e10cSrcweir // decimals 587cdf0e10cSrcweir if ( nDecimals >= 0 ) // negative = automatic 588cdf0e10cSrcweir { 589cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, 590cdf0e10cSrcweir OUString::valueOf( nDecimals ) ); 591cdf0e10cSrcweir } 592cdf0e10cSrcweir 593cdf0e10cSrcweir // integer digits 594cdf0e10cSrcweir if ( nInteger >= 0 ) // negative = automatic 595cdf0e10cSrcweir { 596cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS, 597cdf0e10cSrcweir OUString::valueOf( nInteger ) ); 598cdf0e10cSrcweir } 599cdf0e10cSrcweir 600cdf0e10cSrcweir // decimal replacement (dashes) or variable decimals (#) 601cdf0e10cSrcweir if ( rDashStr.getLength() || bVarDecimals ) 602cdf0e10cSrcweir { 603cdf0e10cSrcweir // variable decimals means an empty replacement string 604cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_REPLACEMENT, 605cdf0e10cSrcweir rDashStr ); 606cdf0e10cSrcweir } 607cdf0e10cSrcweir 608cdf0e10cSrcweir // (automatic) grouping separator 609cdf0e10cSrcweir if ( bGrouping ) 610cdf0e10cSrcweir { 611cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TRUE ); 612cdf0e10cSrcweir } 613cdf0e10cSrcweir 614cdf0e10cSrcweir // display-factor if there are trailing thousands separators 615cdf0e10cSrcweir if ( nTrailingThousands ) 616cdf0e10cSrcweir { 617cdf0e10cSrcweir // each separator character removes three digits 618cdf0e10cSrcweir double fFactor = ::rtl::math::pow10Exp( 1.0, 3 * nTrailingThousands ); 619cdf0e10cSrcweir 620cdf0e10cSrcweir OUStringBuffer aFactStr; 621cdf0e10cSrcweir SvXMLUnitConverter::convertDouble( aFactStr, fFactor ); 622cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DISPLAY_FACTOR, aFactStr.makeStringAndClear() ); 623cdf0e10cSrcweir } 624cdf0e10cSrcweir 625cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_NUMBER, 626cdf0e10cSrcweir sal_True, sal_True ); 627cdf0e10cSrcweir 628cdf0e10cSrcweir // number:embedded-text as child elements 629cdf0e10cSrcweir 630cdf0e10cSrcweir sal_uInt16 nEntryCount = rEmbeddedEntries.Count(); 631cdf0e10cSrcweir for (sal_uInt16 nEntry=0; nEntry<nEntryCount; nEntry++) 632cdf0e10cSrcweir { 633cdf0e10cSrcweir SvXMLEmbeddedTextEntry* pObj = rEmbeddedEntries[nEntry]; 634cdf0e10cSrcweir 635cdf0e10cSrcweir // position attribute 636cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_POSITION, 637cdf0e10cSrcweir OUString::valueOf( pObj->nFormatPos ) ); 638cdf0e10cSrcweir SvXMLElementExport aChildElem( rExport, XML_NAMESPACE_NUMBER, XML_EMBEDDED_TEXT, 639cdf0e10cSrcweir sal_True, sal_False ); 640cdf0e10cSrcweir 641cdf0e10cSrcweir // text as element content 642cdf0e10cSrcweir rtl::OUString aContent( pObj->aText ); 643cdf0e10cSrcweir while ( nEntry+1 < nEntryCount && rEmbeddedEntries[nEntry+1]->nFormatPos == pObj->nFormatPos ) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir // The array can contain several elements for the same position in the number 646cdf0e10cSrcweir // (for example, literal text and space from underscores). They must be merged 647cdf0e10cSrcweir // into a single embedded-text element. 648cdf0e10cSrcweir aContent += rEmbeddedEntries[nEntry+1]->aText; 649cdf0e10cSrcweir ++nEntry; 650cdf0e10cSrcweir } 651cdf0e10cSrcweir rExport.Characters( aContent ); 652cdf0e10cSrcweir } 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir void SvXMLNumFmtExport::WriteScientificElement_Impl( 656cdf0e10cSrcweir sal_Int32 nDecimals, sal_Int32 nInteger, 657cdf0e10cSrcweir sal_Bool bGrouping, sal_Int32 nExp ) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir FinishTextElement_Impl(); 660cdf0e10cSrcweir 661cdf0e10cSrcweir // decimals 662cdf0e10cSrcweir if ( nDecimals >= 0 ) // negative = automatic 663cdf0e10cSrcweir { 664cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_DECIMAL_PLACES, 665cdf0e10cSrcweir OUString::valueOf( nDecimals ) ); 666cdf0e10cSrcweir } 667cdf0e10cSrcweir 668cdf0e10cSrcweir // integer digits 669cdf0e10cSrcweir if ( nInteger >= 0 ) // negative = automatic 670cdf0e10cSrcweir { 671cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS, 672cdf0e10cSrcweir OUString::valueOf( nInteger ) ); 673cdf0e10cSrcweir } 674cdf0e10cSrcweir 675cdf0e10cSrcweir // (automatic) grouping separator 676cdf0e10cSrcweir if ( bGrouping ) 677cdf0e10cSrcweir { 678cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TRUE ); 679cdf0e10cSrcweir } 680cdf0e10cSrcweir 681cdf0e10cSrcweir // exponent digits 682cdf0e10cSrcweir if ( nExp >= 0 ) 683cdf0e10cSrcweir { 684cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_EXPONENT_DIGITS, 685cdf0e10cSrcweir OUString::valueOf( nExp ) ); 686cdf0e10cSrcweir } 687cdf0e10cSrcweir 688cdf0e10cSrcweir SvXMLElementExport aElem( rExport, 689cdf0e10cSrcweir XML_NAMESPACE_NUMBER, XML_SCIENTIFIC_NUMBER, 690cdf0e10cSrcweir sal_True, sal_False ); 691cdf0e10cSrcweir } 692cdf0e10cSrcweir 693cdf0e10cSrcweir void SvXMLNumFmtExport::WriteFractionElement_Impl( 694cdf0e10cSrcweir sal_Int32 nInteger, sal_Bool bGrouping, 695cdf0e10cSrcweir sal_Int32 nNumerator, sal_Int32 nDenominator ) 696cdf0e10cSrcweir { 697cdf0e10cSrcweir FinishTextElement_Impl(); 698cdf0e10cSrcweir 699cdf0e10cSrcweir // integer digits 700cdf0e10cSrcweir if ( nInteger >= 0 ) // negative = default (no integer part) 701cdf0e10cSrcweir { 702cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_INTEGER_DIGITS, 703cdf0e10cSrcweir OUString::valueOf( nInteger ) ); 704cdf0e10cSrcweir } 705cdf0e10cSrcweir 706cdf0e10cSrcweir // (automatic) grouping separator 707cdf0e10cSrcweir if ( bGrouping ) 708cdf0e10cSrcweir { 709cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_GROUPING, XML_TRUE ); 710cdf0e10cSrcweir } 711cdf0e10cSrcweir 712cdf0e10cSrcweir // numerator digits 713cdf0e10cSrcweir if ( nNumerator >= 0 ) 714cdf0e10cSrcweir { 715cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_NUMERATOR_DIGITS, 716cdf0e10cSrcweir OUString::valueOf( nNumerator ) ); 717cdf0e10cSrcweir } 718cdf0e10cSrcweir 719cdf0e10cSrcweir // denominator digits 720cdf0e10cSrcweir if ( nDenominator >= 0 ) 721cdf0e10cSrcweir { 722cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_MIN_DENOMINATOR_DIGITS, 723cdf0e10cSrcweir OUString::valueOf( nDenominator ) ); 724cdf0e10cSrcweir } 725cdf0e10cSrcweir 726cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, XML_FRACTION, 727cdf0e10cSrcweir sal_True, sal_False ); 728cdf0e10cSrcweir } 729cdf0e10cSrcweir 730cdf0e10cSrcweir // mapping (condition) 731cdf0e10cSrcweir 732cdf0e10cSrcweir void SvXMLNumFmtExport::WriteMapElement_Impl( sal_Int32 nOp, double fLimit, 733cdf0e10cSrcweir sal_Int32 nKey, sal_Int32 nPart ) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir FinishTextElement_Impl(); 736cdf0e10cSrcweir 737cdf0e10cSrcweir if ( nOp != NUMBERFORMAT_OP_NO ) 738cdf0e10cSrcweir { 739cdf0e10cSrcweir // style namespace 740cdf0e10cSrcweir 741cdf0e10cSrcweir OUStringBuffer aCondStr( 20L ); 742cdf0e10cSrcweir aCondStr.appendAscii( "value()" ); //! define constant 743cdf0e10cSrcweir switch ( nOp ) 744cdf0e10cSrcweir { 745cdf0e10cSrcweir case NUMBERFORMAT_OP_EQ: aCondStr.append( (sal_Unicode) '=' ); break; 746cdf0e10cSrcweir case NUMBERFORMAT_OP_NE: aCondStr.appendAscii( "<>" ); break; 747cdf0e10cSrcweir case NUMBERFORMAT_OP_LT: aCondStr.append( (sal_Unicode) '<' ); break; 748cdf0e10cSrcweir case NUMBERFORMAT_OP_LE: aCondStr.appendAscii( "<=" ); break; 749cdf0e10cSrcweir case NUMBERFORMAT_OP_GT: aCondStr.append( (sal_Unicode) '>' ); break; 750cdf0e10cSrcweir case NUMBERFORMAT_OP_GE: aCondStr.appendAscii( ">=" ); break; 751cdf0e10cSrcweir default: 752cdf0e10cSrcweir DBG_ERROR("unknown operator"); 753cdf0e10cSrcweir } 754cdf0e10cSrcweir ::rtl::math::doubleToUStringBuffer( aCondStr, fLimit, 755cdf0e10cSrcweir rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, 756cdf0e10cSrcweir '.', true ); 757cdf0e10cSrcweir 758cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_CONDITION, 759cdf0e10cSrcweir aCondStr.makeStringAndClear() ); 760cdf0e10cSrcweir 761cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_APPLY_STYLE_NAME, 762cdf0e10cSrcweir rExport.EncodeStyleName( lcl_CreateStyleName( nKey, nPart, sal_False, 763cdf0e10cSrcweir sPrefix ) ) ); 764cdf0e10cSrcweir 765cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_STYLE, XML_MAP, 766cdf0e10cSrcweir sal_True, sal_False ); 767cdf0e10cSrcweir } 768cdf0e10cSrcweir } 769cdf0e10cSrcweir 770cdf0e10cSrcweir //------------------------------------------------------------------------- 771cdf0e10cSrcweir // for old (automatic) currency formats: parse currency symbol from text 772cdf0e10cSrcweir 773cdf0e10cSrcweir xub_StrLen lcl_FindSymbol( const String& sUpperStr, const String& sCurString ) 774cdf0e10cSrcweir { 775cdf0e10cSrcweir // search for currency symbol 776cdf0e10cSrcweir // Quoting as in ImpSvNumberformatScan::Symbol_Division 777cdf0e10cSrcweir 778cdf0e10cSrcweir xub_StrLen nCPos = 0; 779cdf0e10cSrcweir while (nCPos != STRING_NOTFOUND) 780cdf0e10cSrcweir { 781cdf0e10cSrcweir nCPos = sUpperStr.Search( sCurString, nCPos ); 782cdf0e10cSrcweir if (nCPos != STRING_NOTFOUND) 783cdf0e10cSrcweir { 784cdf0e10cSrcweir // in Quotes? 785cdf0e10cSrcweir xub_StrLen nQ = SvNumberformat::GetQuoteEnd( sUpperStr, nCPos ); 786cdf0e10cSrcweir if ( nQ == STRING_NOTFOUND ) 787cdf0e10cSrcweir { 788cdf0e10cSrcweir // dm can be escaped as "dm or \d 789cdf0e10cSrcweir sal_Unicode c; 790cdf0e10cSrcweir if ( nCPos == 0 || 791cdf0e10cSrcweir ((c = sUpperStr.GetChar(xub_StrLen(nCPos-1))) != '"' 792cdf0e10cSrcweir && c != '\\') ) 793cdf0e10cSrcweir { 794cdf0e10cSrcweir return nCPos; // found 795cdf0e10cSrcweir } 796cdf0e10cSrcweir else 797cdf0e10cSrcweir nCPos++; // continue 798cdf0e10cSrcweir } 799cdf0e10cSrcweir else 800cdf0e10cSrcweir nCPos = nQ + 1; // continue after quote end 801cdf0e10cSrcweir } 802cdf0e10cSrcweir } 803cdf0e10cSrcweir return STRING_NOTFOUND; // not found 804cdf0e10cSrcweir } 805cdf0e10cSrcweir 806cdf0e10cSrcweir sal_Bool SvXMLNumFmtExport::WriteTextWithCurrency_Impl( const OUString& rString, 807cdf0e10cSrcweir const ::com::sun::star::lang::Locale& rLocale ) 808cdf0e10cSrcweir { 809cdf0e10cSrcweir // returns sal_True if currency element was written 810cdf0e10cSrcweir 811cdf0e10cSrcweir sal_Bool bRet = sal_False; 812cdf0e10cSrcweir 813cdf0e10cSrcweir // pLocaleData->setLocale( rLocale ); 814cdf0e10cSrcweir // String sCurString = pLocaleData->getCurrSymbol(); 815cdf0e10cSrcweir 816cdf0e10cSrcweir LanguageType nLang = MsLangId::convertLocaleToLanguage( rLocale ); 817cdf0e10cSrcweir pFormatter->ChangeIntl( nLang ); 818cdf0e10cSrcweir String sCurString, sDummy; 819cdf0e10cSrcweir pFormatter->GetCompatibilityCurrency( sCurString, sDummy ); 820cdf0e10cSrcweir 821cdf0e10cSrcweir pCharClass->setLocale( rLocale ); 822cdf0e10cSrcweir String sUpperStr = pCharClass->upper(rString); 823cdf0e10cSrcweir xub_StrLen nPos = lcl_FindSymbol( sUpperStr, sCurString ); 824cdf0e10cSrcweir if ( nPos != STRING_NOTFOUND ) 825cdf0e10cSrcweir { 826cdf0e10cSrcweir sal_Int32 nLength = rString.getLength(); 827cdf0e10cSrcweir sal_Int32 nCurLen = sCurString.Len(); 828cdf0e10cSrcweir sal_Int32 nCont = nPos + nCurLen; 829cdf0e10cSrcweir 830cdf0e10cSrcweir // text before currency symbol 831cdf0e10cSrcweir if ( nPos > 0 ) 832cdf0e10cSrcweir AddToTextElement_Impl( rString.copy( 0, nPos ) ); 833cdf0e10cSrcweir 834cdf0e10cSrcweir // currency symbol (empty string -> default) 835cdf0e10cSrcweir OUString sEmpty; 836cdf0e10cSrcweir WriteCurrencyElement_Impl( sEmpty, sEmpty ); 837cdf0e10cSrcweir bRet = sal_True; 838cdf0e10cSrcweir 839cdf0e10cSrcweir // text after currency symbol 840cdf0e10cSrcweir if ( nCont < nLength ) 841cdf0e10cSrcweir AddToTextElement_Impl( rString.copy( nCont, nLength-nCont ) ); 842cdf0e10cSrcweir } 843cdf0e10cSrcweir else 844cdf0e10cSrcweir AddToTextElement_Impl( rString ); // simple text 845cdf0e10cSrcweir 846cdf0e10cSrcweir return bRet; // sal_True: currency element written 847cdf0e10cSrcweir } 848cdf0e10cSrcweir 849cdf0e10cSrcweir //------------------------------------------------------------------------- 850cdf0e10cSrcweir 851cdf0e10cSrcweir OUString lcl_GetDefaultCalendar( SvNumberFormatter* pFormatter, LanguageType nLang ) 852cdf0e10cSrcweir { 853cdf0e10cSrcweir // get name of first non-gregorian calendar for the language 854cdf0e10cSrcweir 855cdf0e10cSrcweir OUString aCalendar; 856cdf0e10cSrcweir CalendarWrapper* pCalendar = pFormatter->GetCalendar(); 857cdf0e10cSrcweir if (pCalendar) 858cdf0e10cSrcweir { 859cdf0e10cSrcweir lang::Locale aLocale( MsLangId::convertLanguageToLocale( nLang ) ); 860cdf0e10cSrcweir 861cdf0e10cSrcweir uno::Sequence<OUString> aCals = pCalendar->getAllCalendars( aLocale ); 862cdf0e10cSrcweir sal_Int32 nCnt = aCals.getLength(); 863cdf0e10cSrcweir sal_Bool bFound = sal_False; 864cdf0e10cSrcweir for ( sal_Int32 j=0; j < nCnt && !bFound; j++ ) 865cdf0e10cSrcweir { 866cdf0e10cSrcweir if ( !aCals[j].equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("gregorian") ) ) 867cdf0e10cSrcweir { 868cdf0e10cSrcweir aCalendar = aCals[j]; 869cdf0e10cSrcweir bFound = sal_True; 870cdf0e10cSrcweir } 871cdf0e10cSrcweir } 872cdf0e10cSrcweir } 873cdf0e10cSrcweir return aCalendar; 874cdf0e10cSrcweir } 875cdf0e10cSrcweir 876cdf0e10cSrcweir //------------------------------------------------------------------------- 877cdf0e10cSrcweir 878cdf0e10cSrcweir sal_Bool lcl_IsInEmbedded( const SvXMLEmbeddedTextEntryArr& rEmbeddedEntries, sal_uInt16 nPos ) 879cdf0e10cSrcweir { 880cdf0e10cSrcweir sal_uInt16 nCount = rEmbeddedEntries.Count(); 881cdf0e10cSrcweir for (sal_uInt16 i=0; i<nCount; i++) 882cdf0e10cSrcweir if ( rEmbeddedEntries[i]->nSourcePos == nPos ) 883cdf0e10cSrcweir return sal_True; 884cdf0e10cSrcweir 885cdf0e10cSrcweir return sal_False; // not found 886cdf0e10cSrcweir } 887cdf0e10cSrcweir 888cdf0e10cSrcweir sal_Bool lcl_IsDefaultDateFormat( const SvNumberformat& rFormat, sal_Bool bSystemDate, NfIndexTableOffset eBuiltIn ) 889cdf0e10cSrcweir { 890cdf0e10cSrcweir // make an extra loop to collect date elements, to check if it is a default format 891cdf0e10cSrcweir // before adding the automatic-order attribute 892cdf0e10cSrcweir 893cdf0e10cSrcweir SvXMLDateElementAttributes eDateDOW = XML_DEA_NONE; 894cdf0e10cSrcweir SvXMLDateElementAttributes eDateDay = XML_DEA_NONE; 895cdf0e10cSrcweir SvXMLDateElementAttributes eDateMonth = XML_DEA_NONE; 896cdf0e10cSrcweir SvXMLDateElementAttributes eDateYear = XML_DEA_NONE; 897cdf0e10cSrcweir SvXMLDateElementAttributes eDateHours = XML_DEA_NONE; 898cdf0e10cSrcweir SvXMLDateElementAttributes eDateMins = XML_DEA_NONE; 899cdf0e10cSrcweir SvXMLDateElementAttributes eDateSecs = XML_DEA_NONE; 900cdf0e10cSrcweir sal_Bool bDateNoDefault = sal_False; 901cdf0e10cSrcweir 902cdf0e10cSrcweir sal_uInt16 nPos = 0; 903cdf0e10cSrcweir sal_Bool bEnd = sal_False; 904cdf0e10cSrcweir short nLastType = 0; 905cdf0e10cSrcweir while (!bEnd) 906cdf0e10cSrcweir { 907cdf0e10cSrcweir short nElemType = rFormat.GetNumForType( 0, nPos, sal_False ); 908cdf0e10cSrcweir switch ( nElemType ) 909cdf0e10cSrcweir { 910cdf0e10cSrcweir case 0: 911cdf0e10cSrcweir if ( nLastType == NF_SYMBOLTYPE_STRING ) 912cdf0e10cSrcweir bDateNoDefault = sal_True; // text at the end -> no default date format 913cdf0e10cSrcweir bEnd = sal_True; // end of format reached 914cdf0e10cSrcweir break; 915cdf0e10cSrcweir case NF_SYMBOLTYPE_STRING: 916cdf0e10cSrcweir case NF_SYMBOLTYPE_DATESEP: 917cdf0e10cSrcweir case NF_SYMBOLTYPE_TIMESEP: 918cdf0e10cSrcweir case NF_SYMBOLTYPE_TIME100SECSEP: 919cdf0e10cSrcweir // text is ignored, except at the end 920cdf0e10cSrcweir break; 921cdf0e10cSrcweir // same mapping as in SvXMLNumFormatContext::AddNfKeyword: 922cdf0e10cSrcweir case NF_KEY_NN: eDateDOW = XML_DEA_SHORT; break; 923cdf0e10cSrcweir case NF_KEY_NNN: 924cdf0e10cSrcweir case NF_KEY_NNNN: eDateDOW = XML_DEA_LONG; break; 925cdf0e10cSrcweir case NF_KEY_D: eDateDay = XML_DEA_SHORT; break; 926cdf0e10cSrcweir case NF_KEY_DD: eDateDay = XML_DEA_LONG; break; 927cdf0e10cSrcweir case NF_KEY_M: eDateMonth = XML_DEA_SHORT; break; 928cdf0e10cSrcweir case NF_KEY_MM: eDateMonth = XML_DEA_LONG; break; 929cdf0e10cSrcweir case NF_KEY_MMM: eDateMonth = XML_DEA_TEXTSHORT; break; 930cdf0e10cSrcweir case NF_KEY_MMMM: eDateMonth = XML_DEA_TEXTLONG; break; 931cdf0e10cSrcweir case NF_KEY_YY: eDateYear = XML_DEA_SHORT; break; 932cdf0e10cSrcweir case NF_KEY_YYYY: eDateYear = XML_DEA_LONG; break; 933cdf0e10cSrcweir case NF_KEY_H: eDateHours = XML_DEA_SHORT; break; 934cdf0e10cSrcweir case NF_KEY_HH: eDateHours = XML_DEA_LONG; break; 935cdf0e10cSrcweir case NF_KEY_MI: eDateMins = XML_DEA_SHORT; break; 936cdf0e10cSrcweir case NF_KEY_MMI: eDateMins = XML_DEA_LONG; break; 937cdf0e10cSrcweir case NF_KEY_S: eDateSecs = XML_DEA_SHORT; break; 938cdf0e10cSrcweir case NF_KEY_SS: eDateSecs = XML_DEA_LONG; break; 939cdf0e10cSrcweir case NF_KEY_AP: 940cdf0e10cSrcweir case NF_KEY_AMPM: break; // AM/PM may or may not be in date/time formats -> ignore by itself 941cdf0e10cSrcweir default: 942cdf0e10cSrcweir bDateNoDefault = sal_True; // any other element -> no default format 943cdf0e10cSrcweir } 944cdf0e10cSrcweir nLastType = nElemType; 945cdf0e10cSrcweir ++nPos; 946cdf0e10cSrcweir } 947cdf0e10cSrcweir 948cdf0e10cSrcweir if ( bDateNoDefault ) 949cdf0e10cSrcweir return sal_False; // additional elements 950cdf0e10cSrcweir else 951cdf0e10cSrcweir { 952cdf0e10cSrcweir NfIndexTableOffset eFound = (NfIndexTableOffset) SvXMLNumFmtDefaults::GetDefaultDateFormat( 953cdf0e10cSrcweir eDateDOW, eDateDay, eDateMonth, eDateYear, eDateHours, eDateMins, eDateSecs, bSystemDate ); 954cdf0e10cSrcweir 955cdf0e10cSrcweir return ( eFound == eBuiltIn ); 956cdf0e10cSrcweir } 957cdf0e10cSrcweir } 958cdf0e10cSrcweir 959cdf0e10cSrcweir // 960cdf0e10cSrcweir // export one part (condition) 961cdf0e10cSrcweir // 962cdf0e10cSrcweir 963cdf0e10cSrcweir void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt32 nKey, 964cdf0e10cSrcweir sal_uInt16 nPart, sal_Bool bDefPart ) 965cdf0e10cSrcweir { 966cdf0e10cSrcweir //! for the default part, pass the coditions from the other parts! 967cdf0e10cSrcweir 968cdf0e10cSrcweir // 969cdf0e10cSrcweir // element name 970cdf0e10cSrcweir // 971cdf0e10cSrcweir 972cdf0e10cSrcweir NfIndexTableOffset eBuiltIn = pFormatter->GetIndexTableOffset( nKey ); 973cdf0e10cSrcweir 974cdf0e10cSrcweir short nFmtType = 0; 975cdf0e10cSrcweir sal_Bool bThousand = sal_False; 976cdf0e10cSrcweir sal_uInt16 nPrecision = 0; 977cdf0e10cSrcweir sal_uInt16 nLeading = 0; 978cdf0e10cSrcweir rFormat.GetNumForInfo( nPart, nFmtType, bThousand, nPrecision, nLeading); 979cdf0e10cSrcweir nFmtType &= ~NUMBERFORMAT_DEFINED; 980cdf0e10cSrcweir 981cdf0e10cSrcweir // special treatment of builtin formats that aren't detected by normal parsing 982cdf0e10cSrcweir // (the same formats that get the type set in SvNumberFormatter::ImpGenerateFormats) 983cdf0e10cSrcweir if ( eBuiltIn == NF_NUMBER_STANDARD ) 984cdf0e10cSrcweir nFmtType = NUMBERFORMAT_NUMBER; 985cdf0e10cSrcweir else if ( eBuiltIn == NF_BOOLEAN ) 986cdf0e10cSrcweir nFmtType = NUMBERFORMAT_LOGICAL; 987cdf0e10cSrcweir else if ( eBuiltIn == NF_TEXT ) 988cdf0e10cSrcweir nFmtType = NUMBERFORMAT_TEXT; 989cdf0e10cSrcweir 990cdf0e10cSrcweir // #101606# An empty subformat is a valid number-style resulting in an 991cdf0e10cSrcweir // empty display string for the condition of the subformat. 992cdf0e10cSrcweir if ( nFmtType == NUMBERFORMAT_UNDEFINED && rFormat.GetNumForType( nPart, 993cdf0e10cSrcweir 0, sal_False ) == 0 ) 994cdf0e10cSrcweir nFmtType = 0; 995cdf0e10cSrcweir 996cdf0e10cSrcweir XMLTokenEnum eType = XML_TOKEN_INVALID; 997cdf0e10cSrcweir switch ( nFmtType ) 998cdf0e10cSrcweir { 999cdf0e10cSrcweir // type is 0 if a format contains no recognized elements 1000cdf0e10cSrcweir // (like text only) - this is handled as a number-style. 1001cdf0e10cSrcweir case 0: 1002cdf0e10cSrcweir case NUMBERFORMAT_NUMBER: 1003cdf0e10cSrcweir case NUMBERFORMAT_SCIENTIFIC: 1004cdf0e10cSrcweir case NUMBERFORMAT_FRACTION: 1005cdf0e10cSrcweir eType = XML_NUMBER_STYLE; 1006cdf0e10cSrcweir break; 1007cdf0e10cSrcweir case NUMBERFORMAT_PERCENT: 1008cdf0e10cSrcweir eType = XML_PERCENTAGE_STYLE; 1009cdf0e10cSrcweir break; 1010cdf0e10cSrcweir case NUMBERFORMAT_CURRENCY: 1011cdf0e10cSrcweir eType = XML_CURRENCY_STYLE; 1012cdf0e10cSrcweir break; 1013cdf0e10cSrcweir case NUMBERFORMAT_DATE: 1014cdf0e10cSrcweir case NUMBERFORMAT_DATETIME: 1015cdf0e10cSrcweir eType = XML_DATE_STYLE; 1016cdf0e10cSrcweir break; 1017cdf0e10cSrcweir case NUMBERFORMAT_TIME: 1018cdf0e10cSrcweir eType = XML_TIME_STYLE; 1019cdf0e10cSrcweir break; 1020cdf0e10cSrcweir case NUMBERFORMAT_TEXT: 1021cdf0e10cSrcweir eType = XML_TEXT_STYLE; 1022cdf0e10cSrcweir break; 1023cdf0e10cSrcweir case NUMBERFORMAT_LOGICAL: 1024cdf0e10cSrcweir eType = XML_BOOLEAN_STYLE; 1025cdf0e10cSrcweir break; 1026cdf0e10cSrcweir } 1027cdf0e10cSrcweir DBG_ASSERT( eType != XML_TOKEN_INVALID, "unknown format type" ); 1028cdf0e10cSrcweir 1029cdf0e10cSrcweir OUString sAttrValue; 1030cdf0e10cSrcweir sal_Bool bUserDef = ( ( rFormat.GetType() & NUMBERFORMAT_DEFINED ) != 0 ); 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir // 1033cdf0e10cSrcweir // common attributes for format 1034cdf0e10cSrcweir // 1035cdf0e10cSrcweir 1036cdf0e10cSrcweir // format name (generated from key) - style namespace 1037cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_NAME, 1038cdf0e10cSrcweir lcl_CreateStyleName( nKey, nPart, bDefPart, sPrefix ) ); 1039cdf0e10cSrcweir 1040cdf0e10cSrcweir // "volatile" attribute for styles used only in maps 1041cdf0e10cSrcweir if ( !bDefPart ) 1042cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_STYLE, XML_VOLATILE, XML_TRUE ); 1043cdf0e10cSrcweir 1044cdf0e10cSrcweir // language / country 1045cdf0e10cSrcweir LanguageType nLang = rFormat.GetLanguage(); 1046cdf0e10cSrcweir AddLanguageAttr_Impl( nLang ); // adds to pAttrList 1047cdf0e10cSrcweir 1048cdf0e10cSrcweir // title (comment) 1049cdf0e10cSrcweir // titles for builtin formats are not written 1050cdf0e10cSrcweir sAttrValue = rFormat.GetComment(); 1051cdf0e10cSrcweir if ( sAttrValue.getLength() && bUserDef && bDefPart ) 1052cdf0e10cSrcweir { 1053cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TITLE, sAttrValue ); 1054cdf0e10cSrcweir } 1055cdf0e10cSrcweir 1056cdf0e10cSrcweir // automatic ordering for currency and date formats 1057cdf0e10cSrcweir // only used for some built-in formats 1058cdf0e10cSrcweir sal_Bool bAutoOrder = ( eBuiltIn == NF_CURRENCY_1000INT || eBuiltIn == NF_CURRENCY_1000DEC2 || 1059cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000INT_RED || eBuiltIn == NF_CURRENCY_1000DEC2_RED || 1060cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000DEC2_DASHED || 1061cdf0e10cSrcweir eBuiltIn == NF_DATE_SYSTEM_SHORT || eBuiltIn == NF_DATE_SYSTEM_LONG || 1062cdf0e10cSrcweir eBuiltIn == NF_DATE_SYS_MMYY || eBuiltIn == NF_DATE_SYS_DDMMM || 1063cdf0e10cSrcweir eBuiltIn == NF_DATE_SYS_DDMMYYYY || eBuiltIn == NF_DATE_SYS_DDMMYY || 1064cdf0e10cSrcweir eBuiltIn == NF_DATE_SYS_DMMMYY || eBuiltIn == NF_DATE_SYS_DMMMYYYY || 1065cdf0e10cSrcweir eBuiltIn == NF_DATE_SYS_DMMMMYYYY || eBuiltIn == NF_DATE_SYS_NNDMMMYY || 1066cdf0e10cSrcweir eBuiltIn == NF_DATE_SYS_NNDMMMMYYYY || eBuiltIn == NF_DATE_SYS_NNNNDMMMMYYYY || 1067cdf0e10cSrcweir eBuiltIn == NF_DATETIME_SYSTEM_SHORT_HHMM || eBuiltIn == NF_DATETIME_SYS_DDMMYYYY_HHMMSS ); 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir // format source (for date and time formats) 1070cdf0e10cSrcweir // only used for some built-in formats 1071cdf0e10cSrcweir sal_Bool bSystemDate = ( eBuiltIn == NF_DATE_SYSTEM_SHORT || 1072cdf0e10cSrcweir eBuiltIn == NF_DATE_SYSTEM_LONG || 1073cdf0e10cSrcweir eBuiltIn == NF_DATETIME_SYSTEM_SHORT_HHMM ); 1074cdf0e10cSrcweir sal_Bool bLongSysDate = ( eBuiltIn == NF_DATE_SYSTEM_LONG ); 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir // check if the format definition matches the key 1077cdf0e10cSrcweir if ( bAutoOrder && ( nFmtType == NUMBERFORMAT_DATE || nFmtType == NUMBERFORMAT_DATETIME ) && 1078cdf0e10cSrcweir !lcl_IsDefaultDateFormat( rFormat, bSystemDate, eBuiltIn ) ) 1079cdf0e10cSrcweir { 1080cdf0e10cSrcweir bAutoOrder = bSystemDate = bLongSysDate = sal_False; // don't write automatic-order attribute then 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir if ( bAutoOrder && 1084cdf0e10cSrcweir ( nFmtType == NUMBERFORMAT_CURRENCY || nFmtType == NUMBERFORMAT_DATE || nFmtType == NUMBERFORMAT_DATETIME ) ) 1085cdf0e10cSrcweir { 1086cdf0e10cSrcweir // #85109# format type must be checked to avoid dtd errors if 1087cdf0e10cSrcweir // locale data contains other format types at the built-in positions 1088cdf0e10cSrcweir 1089cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_AUTOMATIC_ORDER, 1090cdf0e10cSrcweir XML_TRUE ); 1091cdf0e10cSrcweir } 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir if ( bSystemDate && bAutoOrder && 1094cdf0e10cSrcweir ( nFmtType == NUMBERFORMAT_DATE || nFmtType == NUMBERFORMAT_DATETIME ) ) 1095cdf0e10cSrcweir { 1096cdf0e10cSrcweir // #85109# format type must be checked to avoid dtd errors if 1097cdf0e10cSrcweir // locale data contains other format types at the built-in positions 1098cdf0e10cSrcweir 1099cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_FORMAT_SOURCE, 1100cdf0e10cSrcweir XML_LANGUAGE ); 1101cdf0e10cSrcweir } 1102cdf0e10cSrcweir 1103cdf0e10cSrcweir // overflow for time formats as in [hh]:mm 1104cdf0e10cSrcweir // controlled by bThousand from number format info 1105cdf0e10cSrcweir // default for truncate-on-overflow is true 1106cdf0e10cSrcweir if ( nFmtType == NUMBERFORMAT_TIME && bThousand ) 1107cdf0e10cSrcweir { 1108cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TRUNCATE_ON_OVERFLOW, 1109cdf0e10cSrcweir XML_FALSE ); 1110cdf0e10cSrcweir } 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir // 1113cdf0e10cSrcweir // Native number transliteration 1114cdf0e10cSrcweir // 1115cdf0e10cSrcweir ::com::sun::star::i18n::NativeNumberXmlAttributes aAttr; 1116cdf0e10cSrcweir rFormat.GetNatNumXml( aAttr, nPart ); 1117cdf0e10cSrcweir if ( aAttr.Format.getLength() ) 1118cdf0e10cSrcweir { 1119cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_FORMAT, 1120cdf0e10cSrcweir aAttr.Format ); 1121cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_LANGUAGE, 1122cdf0e10cSrcweir aAttr.Locale.Language ); 1123cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_COUNTRY, 1124cdf0e10cSrcweir aAttr.Locale.Country ); 1125cdf0e10cSrcweir rExport.AddAttribute( XML_NAMESPACE_NUMBER, XML_TRANSLITERATION_STYLE, 1126cdf0e10cSrcweir aAttr.Style ); 1127cdf0e10cSrcweir } 1128cdf0e10cSrcweir 1129cdf0e10cSrcweir // 1130cdf0e10cSrcweir // The element 1131cdf0e10cSrcweir // 1132cdf0e10cSrcweir SvXMLElementExport aElem( rExport, XML_NAMESPACE_NUMBER, eType, 1133cdf0e10cSrcweir sal_True, sal_True ); 1134cdf0e10cSrcweir 1135cdf0e10cSrcweir // 1136cdf0e10cSrcweir // color (properties element) 1137cdf0e10cSrcweir // 1138cdf0e10cSrcweir 1139cdf0e10cSrcweir const Color* pCol = rFormat.GetColor( nPart ); 1140cdf0e10cSrcweir if (pCol) 1141cdf0e10cSrcweir WriteColorElement_Impl(*pCol); 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir 1144cdf0e10cSrcweir // detect if there is "real" content, excluding color and maps 1145cdf0e10cSrcweir //! move to implementation of Write... methods? 1146cdf0e10cSrcweir sal_Bool bAnyContent = sal_False; 1147cdf0e10cSrcweir 1148cdf0e10cSrcweir // 1149cdf0e10cSrcweir // format elements 1150cdf0e10cSrcweir // 1151cdf0e10cSrcweir 1152cdf0e10cSrcweir SvXMLEmbeddedTextEntryArr aEmbeddedEntries(0); 1153cdf0e10cSrcweir if ( eBuiltIn == NF_NUMBER_STANDARD ) 1154cdf0e10cSrcweir { 1155cdf0e10cSrcweir // default number format contains just one number element 1156cdf0e10cSrcweir WriteNumberElement_Impl( -1, 1, OUString(), sal_False, sal_False, 0, aEmbeddedEntries ); 1157cdf0e10cSrcweir bAnyContent = sal_True; 1158cdf0e10cSrcweir } 1159cdf0e10cSrcweir else if ( eBuiltIn == NF_BOOLEAN ) 1160cdf0e10cSrcweir { 1161cdf0e10cSrcweir // boolean format contains just one boolean element 1162cdf0e10cSrcweir WriteBooleanElement_Impl(); 1163cdf0e10cSrcweir bAnyContent = sal_True; 1164cdf0e10cSrcweir } 1165cdf0e10cSrcweir else 1166cdf0e10cSrcweir { 1167cdf0e10cSrcweir // first loop to collect attributes 1168cdf0e10cSrcweir 1169cdf0e10cSrcweir sal_Bool bDecDashes = sal_False; 1170cdf0e10cSrcweir sal_Bool bVarDecimals = sal_False; 1171cdf0e10cSrcweir sal_Bool bExpFound = sal_False; 1172cdf0e10cSrcweir sal_Bool bCurrFound = sal_False; 1173cdf0e10cSrcweir sal_Bool bInInteger = sal_True; 1174cdf0e10cSrcweir sal_Int32 nExpDigits = 0; 1175cdf0e10cSrcweir sal_Int32 nIntegerSymbols = 0; // for embedded-text, including "#" 1176cdf0e10cSrcweir sal_Int32 nTrailingThousands = 0; // thousands-separators after all digits 1177cdf0e10cSrcweir OUString sCurrExt; 1178cdf0e10cSrcweir OUString aCalendar; 1179cdf0e10cSrcweir sal_uInt16 nPos = 0; 1180cdf0e10cSrcweir sal_Bool bEnd = sal_False; 1181cdf0e10cSrcweir while (!bEnd) 1182cdf0e10cSrcweir { 1183cdf0e10cSrcweir short nElemType = rFormat.GetNumForType( nPart, nPos, sal_False ); 1184cdf0e10cSrcweir const XubString* pElemStr = rFormat.GetNumForString( nPart, nPos, sal_False ); 1185cdf0e10cSrcweir 1186cdf0e10cSrcweir switch ( nElemType ) 1187cdf0e10cSrcweir { 1188cdf0e10cSrcweir case 0: 1189cdf0e10cSrcweir bEnd = sal_True; // end of format reached 1190cdf0e10cSrcweir break; 1191cdf0e10cSrcweir case NF_SYMBOLTYPE_DIGIT: 1192cdf0e10cSrcweir if ( bExpFound && pElemStr ) 1193cdf0e10cSrcweir nExpDigits += pElemStr->Len(); 1194cdf0e10cSrcweir else if ( !bDecDashes && pElemStr && pElemStr->GetChar(0) == '-' ) 1195cdf0e10cSrcweir bDecDashes = sal_True; 1196cdf0e10cSrcweir else if ( !bVarDecimals && !bInInteger && pElemStr && pElemStr->GetChar(0) == '#' ) 1197cdf0e10cSrcweir { 1198cdf0e10cSrcweir // If the decimal digits string starts with a '#', variable 1199cdf0e10cSrcweir // decimals is assumed (for 0.###, but not 0.0##). 1200cdf0e10cSrcweir bVarDecimals = sal_True; 1201cdf0e10cSrcweir } 1202cdf0e10cSrcweir if ( bInInteger && pElemStr ) 1203cdf0e10cSrcweir nIntegerSymbols += pElemStr->Len(); 1204cdf0e10cSrcweir nTrailingThousands = 0; 1205cdf0e10cSrcweir break; 1206cdf0e10cSrcweir case NF_SYMBOLTYPE_DECSEP: 1207cdf0e10cSrcweir bInInteger = sal_False; 1208cdf0e10cSrcweir break; 1209cdf0e10cSrcweir case NF_SYMBOLTYPE_THSEP: 1210cdf0e10cSrcweir if (pElemStr) 1211cdf0e10cSrcweir nTrailingThousands += pElemStr->Len(); // is reset to 0 if digits follow 1212cdf0e10cSrcweir break; 1213cdf0e10cSrcweir case NF_SYMBOLTYPE_EXP: 1214cdf0e10cSrcweir bExpFound = sal_True; // following digits are exponent digits 1215cdf0e10cSrcweir bInInteger = sal_False; 1216cdf0e10cSrcweir break; 1217cdf0e10cSrcweir case NF_SYMBOLTYPE_CURRENCY: 1218cdf0e10cSrcweir bCurrFound = sal_True; 1219cdf0e10cSrcweir break; 1220cdf0e10cSrcweir case NF_SYMBOLTYPE_CURREXT: 1221cdf0e10cSrcweir if (pElemStr) 1222cdf0e10cSrcweir sCurrExt = *pElemStr; 1223cdf0e10cSrcweir break; 1224cdf0e10cSrcweir 1225cdf0e10cSrcweir // E, EE, R, RR: select non-gregorian calendar 1226cdf0e10cSrcweir // AAA, AAAA: calendar is switched at the position of the element 1227cdf0e10cSrcweir case NF_KEY_EC: 1228cdf0e10cSrcweir case NF_KEY_EEC: 1229cdf0e10cSrcweir case NF_KEY_R: 1230cdf0e10cSrcweir case NF_KEY_RR: 1231cdf0e10cSrcweir if (!aCalendar.getLength()) 1232cdf0e10cSrcweir aCalendar = lcl_GetDefaultCalendar( pFormatter, nLang ); 1233cdf0e10cSrcweir break; 1234cdf0e10cSrcweir } 1235cdf0e10cSrcweir ++nPos; 1236cdf0e10cSrcweir } 1237cdf0e10cSrcweir 1238cdf0e10cSrcweir // collect strings for embedded-text (must be known before number element is written) 1239cdf0e10cSrcweir 1240cdf0e10cSrcweir sal_Bool bAllowEmbedded = ( nFmtType == 0 || nFmtType == NUMBERFORMAT_NUMBER || 1241cdf0e10cSrcweir nFmtType == NUMBERFORMAT_CURRENCY || 1242cdf0e10cSrcweir nFmtType == NUMBERFORMAT_PERCENT ); 1243cdf0e10cSrcweir if ( bAllowEmbedded ) 1244cdf0e10cSrcweir { 1245cdf0e10cSrcweir sal_Int32 nDigitsPassed = 0; 1246cdf0e10cSrcweir nPos = 0; 1247cdf0e10cSrcweir bEnd = sal_False; 1248cdf0e10cSrcweir while (!bEnd) 1249cdf0e10cSrcweir { 1250cdf0e10cSrcweir short nElemType = rFormat.GetNumForType( nPart, nPos, sal_False ); 1251cdf0e10cSrcweir const XubString* pElemStr = rFormat.GetNumForString( nPart, nPos, sal_False ); 1252cdf0e10cSrcweir 1253cdf0e10cSrcweir switch ( nElemType ) 1254cdf0e10cSrcweir { 1255cdf0e10cSrcweir case 0: 1256cdf0e10cSrcweir bEnd = sal_True; // end of format reached 1257cdf0e10cSrcweir break; 1258cdf0e10cSrcweir case NF_SYMBOLTYPE_DIGIT: 1259cdf0e10cSrcweir if ( pElemStr ) 1260cdf0e10cSrcweir nDigitsPassed += pElemStr->Len(); 1261cdf0e10cSrcweir break; 1262cdf0e10cSrcweir case NF_SYMBOLTYPE_STRING: 1263cdf0e10cSrcweir case NF_SYMBOLTYPE_BLANK: 1264cdf0e10cSrcweir case NF_SYMBOLTYPE_PERCENT: 1265cdf0e10cSrcweir if ( nDigitsPassed > 0 && nDigitsPassed < nIntegerSymbols && pElemStr ) 1266cdf0e10cSrcweir { 1267cdf0e10cSrcweir // text (literal or underscore) within the integer part of a number:number element 1268cdf0e10cSrcweir 1269cdf0e10cSrcweir String aEmbeddedStr; 1270cdf0e10cSrcweir if ( nElemType == NF_SYMBOLTYPE_STRING || nElemType == NF_SYMBOLTYPE_PERCENT ) 1271cdf0e10cSrcweir aEmbeddedStr = *pElemStr; 1272cdf0e10cSrcweir else 1273cdf0e10cSrcweir SvNumberformat::InsertBlanks( aEmbeddedStr, 0, pElemStr->GetChar(1) ); 1274cdf0e10cSrcweir 1275cdf0e10cSrcweir sal_Int32 nEmbedPos = nIntegerSymbols - nDigitsPassed; 1276cdf0e10cSrcweir 1277cdf0e10cSrcweir SvXMLEmbeddedTextEntry* pObj = new SvXMLEmbeddedTextEntry( nPos, nEmbedPos, aEmbeddedStr ); 1278cdf0e10cSrcweir aEmbeddedEntries.Insert( pObj, aEmbeddedEntries.Count() ); 1279cdf0e10cSrcweir } 1280cdf0e10cSrcweir break; 1281cdf0e10cSrcweir } 1282cdf0e10cSrcweir ++nPos; 1283cdf0e10cSrcweir } 1284cdf0e10cSrcweir } 1285cdf0e10cSrcweir 1286cdf0e10cSrcweir // final loop to write elements 1287cdf0e10cSrcweir 1288cdf0e10cSrcweir sal_Bool bNumWritten = sal_False; 1289cdf0e10cSrcweir sal_Bool bCurrencyWritten = sal_False; 1290cdf0e10cSrcweir short nPrevType = 0; 1291cdf0e10cSrcweir nPos = 0; 1292cdf0e10cSrcweir bEnd = sal_False; 1293cdf0e10cSrcweir while (!bEnd) 1294cdf0e10cSrcweir { 1295cdf0e10cSrcweir short nElemType = rFormat.GetNumForType( nPart, nPos, sal_False ); 1296cdf0e10cSrcweir const XubString* pElemStr = rFormat.GetNumForString( nPart, nPos, sal_False ); 1297cdf0e10cSrcweir 1298cdf0e10cSrcweir switch ( nElemType ) 1299cdf0e10cSrcweir { 1300cdf0e10cSrcweir case 0: 1301cdf0e10cSrcweir bEnd = sal_True; // end of format reached 1302cdf0e10cSrcweir break; 1303cdf0e10cSrcweir case NF_SYMBOLTYPE_STRING: 1304cdf0e10cSrcweir case NF_SYMBOLTYPE_DATESEP: 1305cdf0e10cSrcweir case NF_SYMBOLTYPE_TIMESEP: 1306cdf0e10cSrcweir case NF_SYMBOLTYPE_TIME100SECSEP: 1307cdf0e10cSrcweir case NF_SYMBOLTYPE_PERCENT: 1308cdf0e10cSrcweir if (pElemStr) 1309cdf0e10cSrcweir { 1310cdf0e10cSrcweir if ( ( nPrevType == NF_KEY_S || nPrevType == NF_KEY_SS ) && 1311cdf0e10cSrcweir ( nElemType == NF_SYMBOLTYPE_TIME100SECSEP ) && 1312cdf0e10cSrcweir nPrecision > 0 ) 1313cdf0e10cSrcweir { 1314cdf0e10cSrcweir // decimal separator after seconds is implied by 1315cdf0e10cSrcweir // "decimal-places" attribute and must not be written 1316cdf0e10cSrcweir // as text element 1317cdf0e10cSrcweir //! difference between '.' and ',' is lost here 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir else if ( lcl_IsInEmbedded( aEmbeddedEntries, nPos ) ) 1320cdf0e10cSrcweir { 1321cdf0e10cSrcweir // text is written as embedded-text child of the number, 1322cdf0e10cSrcweir // don't create a text element 1323cdf0e10cSrcweir } 1324cdf0e10cSrcweir else if ( nFmtType == NUMBERFORMAT_CURRENCY && !bCurrFound && !bCurrencyWritten ) 1325cdf0e10cSrcweir { 1326cdf0e10cSrcweir // automatic currency symbol is implemented as part of 1327cdf0e10cSrcweir // normal text -> search for the symbol 1328cdf0e10cSrcweir bCurrencyWritten = WriteTextWithCurrency_Impl( *pElemStr, 1329cdf0e10cSrcweir MsLangId::convertLanguageToLocale( nLang ) ); 1330cdf0e10cSrcweir bAnyContent = sal_True; 1331cdf0e10cSrcweir } 1332cdf0e10cSrcweir else 1333cdf0e10cSrcweir AddToTextElement_Impl( *pElemStr ); 1334cdf0e10cSrcweir } 1335cdf0e10cSrcweir break; 1336cdf0e10cSrcweir case NF_SYMBOLTYPE_BLANK: 1337cdf0e10cSrcweir if ( pElemStr && !lcl_IsInEmbedded( aEmbeddedEntries, nPos ) ) 1338cdf0e10cSrcweir { 1339cdf0e10cSrcweir // turn "_x" into the number of spaces used for x in InsertBlanks in the NumberFormat 1340cdf0e10cSrcweir // (#i20396# the spaces may also be in embedded-text elements) 1341cdf0e10cSrcweir 1342cdf0e10cSrcweir String aBlanks; 1343cdf0e10cSrcweir SvNumberformat::InsertBlanks( aBlanks, 0, pElemStr->GetChar(1) ); 1344cdf0e10cSrcweir AddToTextElement_Impl( aBlanks ); 1345cdf0e10cSrcweir } 1346cdf0e10cSrcweir break; 1347cdf0e10cSrcweir case NF_KEY_GENERAL : 1348cdf0e10cSrcweir WriteNumberElement_Impl( -1, 1, OUString(), sal_False, sal_False, 0, aEmbeddedEntries ); 1349cdf0e10cSrcweir break; 1350cdf0e10cSrcweir case NF_KEY_CCC: 1351cdf0e10cSrcweir if (pElemStr) 1352cdf0e10cSrcweir { 1353cdf0e10cSrcweir if ( bCurrencyWritten ) 1354cdf0e10cSrcweir AddToTextElement_Impl( *pElemStr ); // never more than one currency element 1355cdf0e10cSrcweir else 1356cdf0e10cSrcweir { 1357cdf0e10cSrcweir //! must be different from short automatic format 1358cdf0e10cSrcweir //! but should still be empty (meaning automatic) 1359cdf0e10cSrcweir // pElemStr is "CCC" 1360cdf0e10cSrcweir 1361cdf0e10cSrcweir WriteCurrencyElement_Impl( *pElemStr, OUString() ); 1362cdf0e10cSrcweir bAnyContent = sal_True; 1363cdf0e10cSrcweir bCurrencyWritten = sal_True; 1364cdf0e10cSrcweir } 1365cdf0e10cSrcweir } 1366cdf0e10cSrcweir break; 1367cdf0e10cSrcweir case NF_SYMBOLTYPE_CURRENCY: 1368cdf0e10cSrcweir if (pElemStr) 1369cdf0e10cSrcweir { 1370cdf0e10cSrcweir if ( bCurrencyWritten ) 1371cdf0e10cSrcweir AddToTextElement_Impl( *pElemStr ); // never more than one currency element 1372cdf0e10cSrcweir else 1373cdf0e10cSrcweir { 1374cdf0e10cSrcweir WriteCurrencyElement_Impl( *pElemStr, sCurrExt ); 1375cdf0e10cSrcweir bAnyContent = sal_True; 1376cdf0e10cSrcweir bCurrencyWritten = sal_True; 1377cdf0e10cSrcweir } 1378cdf0e10cSrcweir } 1379cdf0e10cSrcweir break; 1380cdf0e10cSrcweir case NF_SYMBOLTYPE_DIGIT: 1381cdf0e10cSrcweir if (!bNumWritten) // write number part 1382cdf0e10cSrcweir { 1383cdf0e10cSrcweir switch ( nFmtType ) 1384cdf0e10cSrcweir { 1385cdf0e10cSrcweir // for type 0 (not recognized as a special type), 1386cdf0e10cSrcweir // write a "normal" number 1387cdf0e10cSrcweir case 0: 1388cdf0e10cSrcweir case NUMBERFORMAT_NUMBER: 1389cdf0e10cSrcweir case NUMBERFORMAT_CURRENCY: 1390cdf0e10cSrcweir case NUMBERFORMAT_PERCENT: 1391cdf0e10cSrcweir { 1392cdf0e10cSrcweir // decimals 1393cdf0e10cSrcweir // only some built-in formats have automatic decimals 1394cdf0e10cSrcweir sal_Int32 nDecimals = nPrecision; // from GetFormatSpecialInfo 1395cdf0e10cSrcweir if ( eBuiltIn == NF_NUMBER_STANDARD || 1396cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000DEC2 || 1397cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000DEC2_RED || 1398cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000DEC2_CCC || 1399cdf0e10cSrcweir eBuiltIn == NF_CURRENCY_1000DEC2_DASHED ) 1400cdf0e10cSrcweir nDecimals = -1; 1401cdf0e10cSrcweir 1402cdf0e10cSrcweir // integer digits 1403cdf0e10cSrcweir // only one built-in format has automatic integer digits 1404cdf0e10cSrcweir sal_Int32 nInteger = nLeading; 1405cdf0e10cSrcweir if ( eBuiltIn == NF_NUMBER_SYSTEM ) 1406cdf0e10cSrcweir nInteger = -1; 1407cdf0e10cSrcweir 1408cdf0e10cSrcweir // string for decimal replacement 1409cdf0e10cSrcweir // has to be taken from nPrecision 1410cdf0e10cSrcweir // (positive number even for automatic decimals) 1411cdf0e10cSrcweir String sDashStr; 1412cdf0e10cSrcweir if ( bDecDashes && nPrecision > 0 ) 1413cdf0e10cSrcweir sDashStr.Fill( nPrecision, '-' ); 1414cdf0e10cSrcweir 1415cdf0e10cSrcweir WriteNumberElement_Impl( nDecimals, nInteger, sDashStr, bVarDecimals, 1416cdf0e10cSrcweir bThousand, nTrailingThousands, aEmbeddedEntries ); 1417cdf0e10cSrcweir bAnyContent = sal_True; 1418cdf0e10cSrcweir } 1419cdf0e10cSrcweir break; 1420cdf0e10cSrcweir case NUMBERFORMAT_SCIENTIFIC: 1421cdf0e10cSrcweir // #i43959# for scientific numbers, count all integer symbols ("0" and "#") 1422cdf0e10cSrcweir // as integer digits: use nIntegerSymbols instead of nLeading 1423cdf0e10cSrcweir // (use of '#' to select multiples in exponent might be added later) 1424cdf0e10cSrcweir WriteScientificElement_Impl( nPrecision, nIntegerSymbols, bThousand, nExpDigits ); 1425cdf0e10cSrcweir bAnyContent = sal_True; 1426cdf0e10cSrcweir break; 1427cdf0e10cSrcweir case NUMBERFORMAT_FRACTION: 1428cdf0e10cSrcweir { 1429cdf0e10cSrcweir sal_Int32 nInteger = nLeading; 1430cdf0e10cSrcweir if ( pElemStr && pElemStr->GetChar(0) == '?' ) 1431cdf0e10cSrcweir { 1432cdf0e10cSrcweir // If the first digit character is a question mark, 1433cdf0e10cSrcweir // the fraction doesn't have an integer part, and no 1434cdf0e10cSrcweir // min-integer-digits attribute must be written. 1435cdf0e10cSrcweir nInteger = -1; 1436cdf0e10cSrcweir } 1437cdf0e10cSrcweir WriteFractionElement_Impl( nInteger, bThousand, nPrecision, nPrecision ); 1438cdf0e10cSrcweir bAnyContent = sal_True; 1439cdf0e10cSrcweir } 1440cdf0e10cSrcweir break; 1441cdf0e10cSrcweir } 1442cdf0e10cSrcweir 1443cdf0e10cSrcweir bNumWritten = sal_True; 1444cdf0e10cSrcweir } 1445cdf0e10cSrcweir break; 1446cdf0e10cSrcweir case NF_SYMBOLTYPE_DECSEP: 1447cdf0e10cSrcweir if ( pElemStr && nPrecision == 0 ) 1448cdf0e10cSrcweir { 1449cdf0e10cSrcweir // A decimal separator after the number, without following decimal digits, 1450cdf0e10cSrcweir // isn't modelled as part of the number element, so it's written as text 1451cdf0e10cSrcweir // (the distinction between a quoted and non-quoted, locale-dependent 1452cdf0e10cSrcweir // character is lost here). 1453cdf0e10cSrcweir 1454cdf0e10cSrcweir AddToTextElement_Impl( *pElemStr ); 1455cdf0e10cSrcweir } 1456cdf0e10cSrcweir break; 1457cdf0e10cSrcweir case NF_SYMBOLTYPE_DEL: 1458cdf0e10cSrcweir if ( pElemStr && *pElemStr == XubString('@') ) 1459cdf0e10cSrcweir { 1460cdf0e10cSrcweir WriteTextContentElement_Impl(); 1461cdf0e10cSrcweir bAnyContent = sal_True; 1462cdf0e10cSrcweir } 1463cdf0e10cSrcweir break; 1464cdf0e10cSrcweir 1465cdf0e10cSrcweir case NF_SYMBOLTYPE_CALENDAR: 1466cdf0e10cSrcweir if ( pElemStr ) 1467cdf0e10cSrcweir aCalendar = *pElemStr; 1468cdf0e10cSrcweir break; 1469cdf0e10cSrcweir 1470cdf0e10cSrcweir // date elements: 1471cdf0e10cSrcweir 1472cdf0e10cSrcweir case NF_KEY_D: 1473cdf0e10cSrcweir case NF_KEY_DD: 1474cdf0e10cSrcweir { 1475cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_DD ); 1476cdf0e10cSrcweir WriteDayElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : bLong ) ); 1477cdf0e10cSrcweir bAnyContent = sal_True; 1478cdf0e10cSrcweir } 1479cdf0e10cSrcweir break; 1480cdf0e10cSrcweir case NF_KEY_DDD: 1481cdf0e10cSrcweir case NF_KEY_DDDD: 1482cdf0e10cSrcweir case NF_KEY_NN: 1483cdf0e10cSrcweir case NF_KEY_NNN: 1484cdf0e10cSrcweir case NF_KEY_NNNN: 1485cdf0e10cSrcweir case NF_KEY_AAA: 1486cdf0e10cSrcweir case NF_KEY_AAAA: 1487cdf0e10cSrcweir { 1488cdf0e10cSrcweir OUString aCalAttr = aCalendar; 1489cdf0e10cSrcweir if ( nElemType == NF_KEY_AAA || nElemType == NF_KEY_AAAA ) 1490cdf0e10cSrcweir { 1491cdf0e10cSrcweir // calendar attribute for AAA and AAAA is switched only for this element 1492cdf0e10cSrcweir if (!aCalAttr.getLength()) 1493cdf0e10cSrcweir aCalAttr = lcl_GetDefaultCalendar( pFormatter, nLang ); 1494cdf0e10cSrcweir } 1495cdf0e10cSrcweir 1496cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_NNN || nElemType == NF_KEY_NNNN || 1497cdf0e10cSrcweir nElemType == NF_KEY_DDDD || nElemType == NF_KEY_AAAA ); 1498cdf0e10cSrcweir WriteDayOfWeekElement_Impl( aCalAttr, ( bSystemDate ? bLongSysDate : bLong ) ); 1499cdf0e10cSrcweir bAnyContent = sal_True; 1500cdf0e10cSrcweir if ( nElemType == NF_KEY_NNNN ) 1501cdf0e10cSrcweir { 1502cdf0e10cSrcweir // write additional text element for separator 1503cdf0e10cSrcweir pLocaleData->setLocale( MsLangId::convertLanguageToLocale( nLang ) ); 1504cdf0e10cSrcweir AddToTextElement_Impl( pLocaleData->getLongDateDayOfWeekSep() ); 1505cdf0e10cSrcweir } 1506cdf0e10cSrcweir } 1507cdf0e10cSrcweir break; 1508cdf0e10cSrcweir case NF_KEY_M: 1509cdf0e10cSrcweir case NF_KEY_MM: 1510cdf0e10cSrcweir case NF_KEY_MMM: 1511cdf0e10cSrcweir case NF_KEY_MMMM: 1512cdf0e10cSrcweir case NF_KEY_MMMMM: //! first letter of month name, no attribute available 1513cdf0e10cSrcweir { 1514cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_MM || nElemType == NF_KEY_MMMM ); 1515cdf0e10cSrcweir sal_Bool bText = ( nElemType == NF_KEY_MMM || nElemType == NF_KEY_MMMM || 1516cdf0e10cSrcweir nElemType == NF_KEY_MMMMM ); 1517cdf0e10cSrcweir WriteMonthElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : bLong ), bText ); 1518cdf0e10cSrcweir bAnyContent = sal_True; 1519cdf0e10cSrcweir } 1520cdf0e10cSrcweir break; 1521cdf0e10cSrcweir case NF_KEY_YY: 1522cdf0e10cSrcweir case NF_KEY_YYYY: 1523cdf0e10cSrcweir case NF_KEY_EC: 1524cdf0e10cSrcweir case NF_KEY_EEC: 1525cdf0e10cSrcweir case NF_KEY_R: //! R acts as EE, no attribute available 1526cdf0e10cSrcweir { 1527cdf0e10cSrcweir //! distinguish EE and R 1528cdf0e10cSrcweir // calendar attribute for E and EE and R is set in first loop 1529cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_YYYY || nElemType == NF_KEY_EEC || 1530cdf0e10cSrcweir nElemType == NF_KEY_R ); 1531cdf0e10cSrcweir WriteYearElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : bLong ) ); 1532cdf0e10cSrcweir bAnyContent = sal_True; 1533cdf0e10cSrcweir } 1534cdf0e10cSrcweir break; 1535cdf0e10cSrcweir case NF_KEY_G: 1536cdf0e10cSrcweir case NF_KEY_GG: 1537cdf0e10cSrcweir case NF_KEY_GGG: 1538cdf0e10cSrcweir case NF_KEY_RR: //! RR acts as GGGEE, no attribute available 1539cdf0e10cSrcweir { 1540cdf0e10cSrcweir //! distinguish GG and GGG and RR 1541cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_GGG || nElemType == NF_KEY_RR ); 1542cdf0e10cSrcweir WriteEraElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : bLong ) ); 1543cdf0e10cSrcweir bAnyContent = sal_True; 1544cdf0e10cSrcweir if ( nElemType == NF_KEY_RR ) 1545cdf0e10cSrcweir { 1546cdf0e10cSrcweir // calendar attribute for RR is set in first loop 1547cdf0e10cSrcweir WriteYearElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : sal_True ) ); 1548cdf0e10cSrcweir } 1549cdf0e10cSrcweir } 1550cdf0e10cSrcweir break; 1551cdf0e10cSrcweir case NF_KEY_Q: 1552cdf0e10cSrcweir case NF_KEY_QQ: 1553cdf0e10cSrcweir { 1554cdf0e10cSrcweir sal_Bool bLong = ( nElemType == NF_KEY_QQ ); 1555cdf0e10cSrcweir WriteQuarterElement_Impl( aCalendar, ( bSystemDate ? bLongSysDate : bLong ) ); 1556cdf0e10cSrcweir bAnyContent = sal_True; 1557cdf0e10cSrcweir } 1558cdf0e10cSrcweir break; 1559cdf0e10cSrcweir case NF_KEY_WW: 1560cdf0e10cSrcweir WriteWeekElement_Impl( aCalendar ); 1561cdf0e10cSrcweir bAnyContent = sal_True; 1562cdf0e10cSrcweir break; 1563cdf0e10cSrcweir 1564cdf0e10cSrcweir // time elements (bSystemDate is not used): 1565cdf0e10cSrcweir 1566cdf0e10cSrcweir case NF_KEY_H: 1567cdf0e10cSrcweir case NF_KEY_HH: 1568cdf0e10cSrcweir WriteHoursElement_Impl( nElemType == NF_KEY_HH ); 1569cdf0e10cSrcweir bAnyContent = sal_True; 1570cdf0e10cSrcweir break; 1571cdf0e10cSrcweir case NF_KEY_MI: 1572cdf0e10cSrcweir case NF_KEY_MMI: 1573cdf0e10cSrcweir WriteMinutesElement_Impl( nElemType == NF_KEY_MMI ); 1574cdf0e10cSrcweir bAnyContent = sal_True; 1575cdf0e10cSrcweir break; 1576cdf0e10cSrcweir case NF_KEY_S: 1577cdf0e10cSrcweir case NF_KEY_SS: 1578cdf0e10cSrcweir WriteSecondsElement_Impl( ( nElemType == NF_KEY_SS ), nPrecision ); 1579cdf0e10cSrcweir bAnyContent = sal_True; 1580cdf0e10cSrcweir break; 1581cdf0e10cSrcweir case NF_KEY_AMPM: 1582cdf0e10cSrcweir case NF_KEY_AP: 1583cdf0e10cSrcweir WriteAMPMElement_Impl(); // short/long? 1584cdf0e10cSrcweir bAnyContent = sal_True; 1585cdf0e10cSrcweir break; 1586cdf0e10cSrcweir } 1587cdf0e10cSrcweir nPrevType = nElemType; 1588cdf0e10cSrcweir ++nPos; 1589cdf0e10cSrcweir } 1590cdf0e10cSrcweir } 1591cdf0e10cSrcweir 1592cdf0e10cSrcweir if ( sTextContent.getLength() ) 1593cdf0e10cSrcweir bAnyContent = sal_True; // element written in FinishTextElement_Impl 1594cdf0e10cSrcweir 1595cdf0e10cSrcweir FinishTextElement_Impl(); // final text element - before maps 1596cdf0e10cSrcweir 1597cdf0e10cSrcweir if ( !bAnyContent ) 1598cdf0e10cSrcweir { 1599cdf0e10cSrcweir // for an empty format, write an empty text element 1600cdf0e10cSrcweir SvXMLElementExport aTElem( rExport, XML_NAMESPACE_NUMBER, XML_TEXT, 1601cdf0e10cSrcweir sal_True, sal_False ); 1602cdf0e10cSrcweir } 1603cdf0e10cSrcweir 1604cdf0e10cSrcweir // 1605cdf0e10cSrcweir // mapping (conditions) must be last elements 1606cdf0e10cSrcweir // 1607cdf0e10cSrcweir 1608cdf0e10cSrcweir if (bDefPart) 1609cdf0e10cSrcweir { 1610cdf0e10cSrcweir SvNumberformatLimitOps eOp1, eOp2; 1611cdf0e10cSrcweir double fLimit1, fLimit2; 1612cdf0e10cSrcweir rFormat.GetConditions( eOp1, fLimit1, eOp2, fLimit2 ); 1613cdf0e10cSrcweir 1614cdf0e10cSrcweir WriteMapElement_Impl( eOp1, fLimit1, nKey, 0 ); 1615cdf0e10cSrcweir WriteMapElement_Impl( eOp2, fLimit2, nKey, 1 ); 1616cdf0e10cSrcweir 1617cdf0e10cSrcweir if ( rFormat.HasTextFormat() ) 1618cdf0e10cSrcweir { 1619cdf0e10cSrcweir // 4th part is for text -> make an "all other numbers" condition for the 3rd part 1620cdf0e10cSrcweir // by reversing the 2nd condition 1621cdf0e10cSrcweir 1622cdf0e10cSrcweir SvNumberformatLimitOps eOp3 = NUMBERFORMAT_OP_NO; 1623cdf0e10cSrcweir double fLimit3 = fLimit2; 1624cdf0e10cSrcweir switch ( eOp2 ) 1625cdf0e10cSrcweir { 1626cdf0e10cSrcweir case NUMBERFORMAT_OP_EQ: eOp3 = NUMBERFORMAT_OP_NE; break; 1627cdf0e10cSrcweir case NUMBERFORMAT_OP_NE: eOp3 = NUMBERFORMAT_OP_EQ; break; 1628cdf0e10cSrcweir case NUMBERFORMAT_OP_LT: eOp3 = NUMBERFORMAT_OP_GE; break; 1629cdf0e10cSrcweir case NUMBERFORMAT_OP_LE: eOp3 = NUMBERFORMAT_OP_GT; break; 1630cdf0e10cSrcweir case NUMBERFORMAT_OP_GT: eOp3 = NUMBERFORMAT_OP_LE; break; 1631cdf0e10cSrcweir case NUMBERFORMAT_OP_GE: eOp3 = NUMBERFORMAT_OP_LT; break; 1632cdf0e10cSrcweir default: 1633cdf0e10cSrcweir break; 1634cdf0e10cSrcweir } 1635cdf0e10cSrcweir 1636cdf0e10cSrcweir if ( fLimit1 == fLimit2 && 1637cdf0e10cSrcweir ( ( eOp1 == NUMBERFORMAT_OP_LT && eOp2 == NUMBERFORMAT_OP_GT ) || 1638cdf0e10cSrcweir ( eOp1 == NUMBERFORMAT_OP_GT && eOp2 == NUMBERFORMAT_OP_LT ) ) ) 1639cdf0e10cSrcweir { 1640cdf0e10cSrcweir // For <x and >x, add =x as last condition 1641cdf0e10cSrcweir // (just for readability, <=x would be valid, too) 1642cdf0e10cSrcweir 1643cdf0e10cSrcweir eOp3 = NUMBERFORMAT_OP_EQ; 1644cdf0e10cSrcweir } 1645cdf0e10cSrcweir 1646cdf0e10cSrcweir WriteMapElement_Impl( eOp3, fLimit3, nKey, 2 ); 1647cdf0e10cSrcweir } 1648cdf0e10cSrcweir } 1649cdf0e10cSrcweir } 1650cdf0e10cSrcweir 1651cdf0e10cSrcweir //------------------------------------------------------------------------- 1652cdf0e10cSrcweir 1653cdf0e10cSrcweir // 1654cdf0e10cSrcweir // export one format 1655cdf0e10cSrcweir // 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir void SvXMLNumFmtExport::ExportFormat_Impl( const SvNumberformat& rFormat, sal_uInt32 nKey ) 1658cdf0e10cSrcweir { 1659cdf0e10cSrcweir sal_uInt16 nUsedParts = 0; 1660cdf0e10cSrcweir sal_uInt16 nPart; 1661cdf0e10cSrcweir for (nPart=0; nPart<XMLNUM_MAX_PARTS; nPart++) 1662cdf0e10cSrcweir if (rFormat.GetNumForType( nPart, 0, sal_False ) != 0) 1663cdf0e10cSrcweir nUsedParts = nPart+1; 1664cdf0e10cSrcweir 1665cdf0e10cSrcweir SvNumberformatLimitOps eOp1, eOp2; 1666cdf0e10cSrcweir double fLimit1, fLimit2; 1667cdf0e10cSrcweir rFormat.GetConditions( eOp1, fLimit1, eOp2, fLimit2 ); 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir // if conditions are set, even empty formats must be written 1670cdf0e10cSrcweir 1671cdf0e10cSrcweir if ( eOp1 != NUMBERFORMAT_OP_NO && nUsedParts < 2 ) 1672cdf0e10cSrcweir nUsedParts = 2; 1673cdf0e10cSrcweir if ( eOp2 != NUMBERFORMAT_OP_NO && nUsedParts < 3 ) 1674cdf0e10cSrcweir nUsedParts = 3; 1675cdf0e10cSrcweir if ( rFormat.HasTextFormat() && nUsedParts < 4 ) 1676cdf0e10cSrcweir nUsedParts = 4; 1677cdf0e10cSrcweir 1678cdf0e10cSrcweir for (nPart=0; nPart<nUsedParts; nPart++) 1679cdf0e10cSrcweir { 1680cdf0e10cSrcweir sal_Bool bDefault = ( nPart+1 == nUsedParts ); // last = default 1681cdf0e10cSrcweir ExportPart_Impl( rFormat, nKey, nPart, bDefault ); 1682cdf0e10cSrcweir } 1683cdf0e10cSrcweir } 1684cdf0e10cSrcweir 1685cdf0e10cSrcweir //------------------------------------------------------------------------- 1686cdf0e10cSrcweir 1687cdf0e10cSrcweir // 1688cdf0e10cSrcweir // export method called by application 1689cdf0e10cSrcweir // 1690cdf0e10cSrcweir 1691cdf0e10cSrcweir void SvXMLNumFmtExport::Export( sal_Bool bIsAutoStyle ) 1692cdf0e10cSrcweir { 1693cdf0e10cSrcweir if ( !pFormatter ) 1694cdf0e10cSrcweir return; // no formatter -> no entries 1695cdf0e10cSrcweir 1696cdf0e10cSrcweir sal_uInt32 nKey; 1697cdf0e10cSrcweir const SvNumberformat* pFormat = NULL; 1698cdf0e10cSrcweir sal_Bool bNext(pUsedList->GetFirstUsed(nKey)); 1699cdf0e10cSrcweir while(bNext) 1700cdf0e10cSrcweir { 1701cdf0e10cSrcweir pFormat = pFormatter->GetEntry(nKey); 1702cdf0e10cSrcweir if(pFormat) 1703cdf0e10cSrcweir ExportFormat_Impl( *pFormat, nKey ); 1704cdf0e10cSrcweir bNext = pUsedList->GetNextUsed(nKey); 1705cdf0e10cSrcweir } 1706cdf0e10cSrcweir if (!bIsAutoStyle) 1707cdf0e10cSrcweir { 1708cdf0e10cSrcweir SvUShorts aLanguages; 1709cdf0e10cSrcweir pFormatter->GetUsedLanguages( aLanguages ); 1710cdf0e10cSrcweir sal_uInt16 nLangCount = aLanguages.Count(); 1711cdf0e10cSrcweir for (sal_uInt16 nLangPos=0; nLangPos<nLangCount; nLangPos++) 1712cdf0e10cSrcweir { 1713cdf0e10cSrcweir LanguageType nLang = aLanguages[nLangPos]; 1714cdf0e10cSrcweir 1715cdf0e10cSrcweir sal_uInt32 nDefaultIndex = 0; 1716cdf0e10cSrcweir SvNumberFormatTable& rTable = pFormatter->GetEntryTable( 1717cdf0e10cSrcweir NUMBERFORMAT_DEFINED, nDefaultIndex, nLang ); 1718cdf0e10cSrcweir pFormat = rTable.First(); 1719cdf0e10cSrcweir while (pFormat) 1720cdf0e10cSrcweir { 1721cdf0e10cSrcweir nKey = rTable.GetCurKey(); 1722cdf0e10cSrcweir if (!pUsedList->IsUsed(nKey)) 1723cdf0e10cSrcweir { 1724cdf0e10cSrcweir DBG_ASSERT((pFormat->GetType() & NUMBERFORMAT_DEFINED) != 0, "a not user defined numberformat found"); 1725cdf0e10cSrcweir // user-defined and used formats are exported 1726cdf0e10cSrcweir ExportFormat_Impl( *pFormat, nKey ); 1727cdf0e10cSrcweir // if it is a user-defined Format it will be added else nothing will hapen 1728cdf0e10cSrcweir pUsedList->SetUsed(nKey); 1729cdf0e10cSrcweir } 1730cdf0e10cSrcweir 1731cdf0e10cSrcweir pFormat = rTable.Next(); 1732cdf0e10cSrcweir } 1733cdf0e10cSrcweir } 1734cdf0e10cSrcweir } 1735cdf0e10cSrcweir pUsedList->Export(); 1736cdf0e10cSrcweir } 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir OUString SvXMLNumFmtExport::GetStyleName( sal_uInt32 nKey ) 1739cdf0e10cSrcweir { 1740cdf0e10cSrcweir if(pUsedList->IsUsed(nKey) || pUsedList->IsWasUsed(nKey)) 1741cdf0e10cSrcweir return lcl_CreateStyleName( nKey, 0, sal_True, sPrefix ); 1742cdf0e10cSrcweir else 1743cdf0e10cSrcweir { 1744cdf0e10cSrcweir DBG_ERROR("There is no written Data-Style"); 1745cdf0e10cSrcweir return rtl::OUString(); 1746cdf0e10cSrcweir } 1747cdf0e10cSrcweir } 1748cdf0e10cSrcweir 1749cdf0e10cSrcweir void SvXMLNumFmtExport::SetUsed( sal_uInt32 nKey ) 1750cdf0e10cSrcweir { 1751cdf0e10cSrcweir DBG_ASSERT( pFormatter != NULL, "missing formatter" ); 1752cdf0e10cSrcweir if( !pFormatter ) 1753cdf0e10cSrcweir return; 1754cdf0e10cSrcweir 1755cdf0e10cSrcweir if (pFormatter->GetEntry(nKey)) 1756cdf0e10cSrcweir pUsedList->SetUsed( nKey ); 1757cdf0e10cSrcweir else { 1758cdf0e10cSrcweir DBG_ERROR("no existing Numberformat found with this key"); 1759cdf0e10cSrcweir } 1760cdf0e10cSrcweir } 1761cdf0e10cSrcweir 1762cdf0e10cSrcweir void SvXMLNumFmtExport::GetWasUsed(uno::Sequence<sal_Int32>& rWasUsed) 1763cdf0e10cSrcweir { 1764cdf0e10cSrcweir if (pUsedList) 1765cdf0e10cSrcweir pUsedList->GetWasUsed(rWasUsed); 1766cdf0e10cSrcweir } 1767cdf0e10cSrcweir 1768cdf0e10cSrcweir void SvXMLNumFmtExport::SetWasUsed(const uno::Sequence<sal_Int32>& rWasUsed) 1769cdf0e10cSrcweir { 1770cdf0e10cSrcweir if (pUsedList) 1771cdf0e10cSrcweir pUsedList->SetWasUsed(rWasUsed); 1772cdf0e10cSrcweir } 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir 1775cdf0e10cSrcweir 1776cdf0e10cSrcweir const SvNumberformat* lcl_GetFormat( SvNumberFormatter* pFormatter, 1777cdf0e10cSrcweir sal_uInt32 nKey ) 1778cdf0e10cSrcweir { 1779cdf0e10cSrcweir return ( pFormatter != NULL ) ? pFormatter->GetEntry( nKey ) : NULL; 1780cdf0e10cSrcweir } 1781cdf0e10cSrcweir 1782cdf0e10cSrcweir sal_uInt32 SvXMLNumFmtExport::ForceSystemLanguage( sal_uInt32 nKey ) 1783cdf0e10cSrcweir { 1784cdf0e10cSrcweir sal_uInt32 nRet = nKey; 1785cdf0e10cSrcweir 1786cdf0e10cSrcweir const SvNumberformat* pFormat = lcl_GetFormat( pFormatter, nKey ); 1787cdf0e10cSrcweir if( pFormat != NULL ) 1788cdf0e10cSrcweir { 1789cdf0e10cSrcweir DBG_ASSERT( pFormatter != NULL, "format without formatter?" ); 1790cdf0e10cSrcweir 1791cdf0e10cSrcweir xub_StrLen nErrorPos; 1792cdf0e10cSrcweir short nType = pFormat->GetType(); 1793cdf0e10cSrcweir 1794cdf0e10cSrcweir sal_uInt32 nNewKey = pFormatter->GetFormatForLanguageIfBuiltIn( 1795cdf0e10cSrcweir nKey, LANGUAGE_SYSTEM ); 1796cdf0e10cSrcweir 1797cdf0e10cSrcweir if( nNewKey != nKey ) 1798cdf0e10cSrcweir { 1799cdf0e10cSrcweir nRet = nNewKey; 1800cdf0e10cSrcweir } 1801cdf0e10cSrcweir else 1802cdf0e10cSrcweir { 1803cdf0e10cSrcweir String aFormatString( pFormat->GetFormatstring() ); 1804cdf0e10cSrcweir pFormatter->PutandConvertEntry( 1805cdf0e10cSrcweir aFormatString, 1806cdf0e10cSrcweir nErrorPos, nType, nNewKey, 1807cdf0e10cSrcweir pFormat->GetLanguage(), LANGUAGE_SYSTEM ); 1808cdf0e10cSrcweir 1809cdf0e10cSrcweir // success? Then use new key. 1810cdf0e10cSrcweir if( nErrorPos == 0 ) 1811cdf0e10cSrcweir nRet = nNewKey; 1812cdf0e10cSrcweir } 1813cdf0e10cSrcweir } 1814cdf0e10cSrcweir 1815cdf0e10cSrcweir return nRet; 1816cdf0e10cSrcweir } 1817