xref: /AOO41X/main/sw/source/core/fields/fldbas.cxx (revision 69a743679e823ad8f875be547552acb607b8ada5)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 #include <float.h>
28 #include <rtl/math.hxx>
29 #include <svl/zforlist.hxx>
30 #include <svl/zformat.hxx>
31 #include <editeng/unolingu.hxx>
32 #include <unofldmid.h>
33 #include <doc.hxx>
34 #include <editsh.hxx>
35 #include <frame.hxx>
36 #include <fldbas.hxx>
37 #include <flddat.hxx>
38 #include <ndtxt.hxx>
39 #include <fmtfld.hxx>
40 #include <txtfld.hxx>
41 #include <pam.hxx>
42 #include <docfld.hxx>
43 #include <swtable.hxx>
44 #include <docufld.hxx>
45 #include <expfld.hxx>
46 #include <shellres.hxx>
47 #include <calc.hxx>
48 #include <comcore.hrc>
49 
50 #include <math.h>
51 #include <float.h>
52 
53 using namespace ::com::sun::star;
54 using namespace nsSwDocInfoSubType;
55 
lcl_GetLanguageOfFormat(sal_uInt16 nLng,sal_uLong nFmt,const SvNumberFormatter & rFormatter)56 sal_uInt16 lcl_GetLanguageOfFormat( sal_uInt16 nLng, sal_uLong nFmt,
57                                 const SvNumberFormatter& rFormatter )
58 {
59     if( nLng == LANGUAGE_NONE ) // wegen Bug #60010
60         nLng = LANGUAGE_SYSTEM;
61     else if( nLng == ::GetAppLanguage() )
62         switch( rFormatter.GetIndexTableOffset( nFmt ))
63         {
64         case NF_NUMBER_SYSTEM:
65         case NF_DATE_SYSTEM_SHORT:
66         case NF_DATE_SYSTEM_LONG:
67         case NF_DATETIME_SYSTEM_SHORT_HHMM:
68             nLng = LANGUAGE_SYSTEM;
69             break;
70         default: break;
71         }
72     return nLng;
73 }
74 
75 /*--------------------------------------------------------------------
76     Beschreibung: Globals
77  --------------------------------------------------------------------*/
78 // Array der Feldname
79 
80 SvStringsDtor* SwFieldType::pFldNames = 0;
81 
82 DBG_NAME(SwFieldType)
83 
84     sal_uInt16 __FAR_DATA aTypeTab[] = {
85     /* RES_DBFLD            */      TYP_DBFLD,
86     /* RES_USERFLD          */      TYP_USERFLD,
87     /* RES_FILENAMEFLD      */      TYP_FILENAMEFLD,
88     /* RES_DBNAMEFLD        */      TYP_DBNAMEFLD,
89     /* RES_DATEFLD          */      TYP_DATEFLD,
90     /* RES_TIMEFLD          */      TYP_TIMEFLD,
91     /* RES_PAGENUMBERFLD    */      TYP_PAGENUMBERFLD,  // dynamisch
92     /* RES_AUTHORFLD        */      TYP_AUTHORFLD,
93     /* RES_CHAPTERFLD       */      TYP_CHAPTERFLD,
94     /* RES_DOCSTATFLD       */      TYP_DOCSTATFLD,
95     /* RES_GETEXPFLD        */      TYP_GETFLD,         // dynamisch
96     /* RES_SETEXPFLD        */      TYP_SETFLD,         // dynamisch
97     /* RES_GETREFFLD        */      TYP_GETREFFLD,
98     /* RES_HIDDENTXTFLD     */      TYP_HIDDENTXTFLD,
99     /* RES_POSTITFLD        */      TYP_POSTITFLD,
100     /* RES_FIXDATEFLD       */      TYP_FIXDATEFLD,
101     /* RES_FIXTIMEFLD       */      TYP_FIXTIMEFLD,
102     /* RES_REGFLD           */      0,                  // alt
103     /* RES_VARREGFLD        */      0,                  // alt
104     /* RES_SETREFFLD        */      TYP_SETREFFLD,
105     /* RES_INPUTFLD         */      TYP_INPUTFLD,
106     /* RES_MACROFLD         */      TYP_MACROFLD,
107     /* RES_DDEFLD           */      TYP_DDEFLD,
108     /* RES_TABLEFLD         */      TYP_FORMELFLD,
109     /* RES_HIDDENPARAFLD    */      TYP_HIDDENPARAFLD,
110     /* RES_DOCINFOFLD       */      TYP_DOCINFOFLD,
111     /* RES_TEMPLNAMEFLD     */      TYP_TEMPLNAMEFLD,
112     /* RES_DBNEXTSETFLD     */      TYP_DBNEXTSETFLD,
113     /* RES_DBNUMSETFLD      */      TYP_DBNUMSETFLD,
114     /* RES_DBSETNUMBERFLD   */      TYP_DBSETNUMBERFLD,
115     /* RES_EXTUSERFLD       */      TYP_EXTUSERFLD,
116     /* RES_REFPAGESETFLD    */      TYP_SETREFPAGEFLD,
117     /* RES_REFPAGEGETFLD    */      TYP_GETREFPAGEFLD,
118     /* RES_INTERNETFLD      */      TYP_INTERNETFLD,
119     /* RES_JUMPEDITFLD      */      TYP_JUMPEDITFLD,
120     /* RES_SCRIPTFLD        */      TYP_SCRIPTFLD,
121     /* RES_DATETIMEFLD      */      0,                  // dynamisch
122     /* RES_AUTHORITY        */      TYP_AUTHORITY,
123     /* RES_COMBINED_CHARS   */      TYP_COMBINED_CHARS,
124     /* RES_DROPDOWN         */      TYP_DROPDOWN
125     };
126         // ????? TYP_USRINPFLD,
127 
128 
129 
GetTypeStr(sal_uInt16 nTypeId)130 const String& SwFieldType::GetTypeStr(sal_uInt16 nTypeId)
131 {
132     if( !pFldNames )
133         _GetFldName();
134 
135     if( nTypeId < SwFieldType::pFldNames->Count() )
136         return *SwFieldType::pFldNames->GetObject( nTypeId );
137     else
138         return aEmptyStr;
139 }
140 
141 
142 /*---------------------------------------------------
143  Jedes Feld referenziert einen Feldtypen, der fuer
144  jedes Dokument einmalig ist.
145  --------------------------------------------------*/
146 
SwFieldType(sal_uInt16 nWhichId)147 SwFieldType::SwFieldType( sal_uInt16 nWhichId )
148     : SwModify(0),
149     nWhich( nWhichId )
150 {
151     DBG_CTOR( SwFieldType, 0 );
152 }
153 
154 #ifdef DBG_UTIL
155 
~SwFieldType()156 SwFieldType::~SwFieldType()
157 {
158     DBG_DTOR( SwFieldType, 0 );
159 }
160 
161 #endif
162 
GetName() const163 const String& SwFieldType::GetName() const
164 {
165     return aEmptyStr;
166 }
167 
QueryValue(uno::Any &,sal_uInt16) const168 sal_Bool SwFieldType::QueryValue( uno::Any&, sal_uInt16 ) const
169 {
170     return sal_False;
171 }
PutValue(const uno::Any &,sal_uInt16)172 sal_Bool SwFieldType::PutValue( const uno::Any& , sal_uInt16 )
173 {
174     return sal_False;
175 }
176 
177 /*--------------------------------------------------------------------
178     Beschreibung:   Basisklasse aller Felder
179                     Felder referenzieren einen Feldtyp
180                     Felder sind n-mal vorhanden, Feldtypen nur einmal
181  --------------------------------------------------------------------*/
182 
SwField(SwFieldType * pTyp,sal_uInt32 nFmt,sal_uInt16 nLng,bool bUseFieldValueCache)183 SwField::SwField(
184     SwFieldType* pTyp,
185     sal_uInt32 nFmt,
186     sal_uInt16 nLng,
187     bool bUseFieldValueCache )
188     : m_Cache()
189     , m_bUseFieldValueCache( bUseFieldValueCache )
190     , nLang( nLng )
191     , bIsAutomaticLanguage( sal_True )
192     , nFormat( nFmt )
193     , pType( pTyp )
194 {
195     ASSERT( pTyp, "SwField: ungueltiger SwFieldType" );
196 }
197 
~SwField()198 SwField::~SwField()
199 {
200 }
201 
202 /*--------------------------------------------------------------------
203     Beschreibung: Statt Umweg ueber den Typ
204  --------------------------------------------------------------------*/
205 
206 #ifdef DBG_UTIL
Which() const207 sal_uInt16 SwField::Which() const
208 {
209     ASSERT(pType, "Kein Typ vorhanden");
210     return pType->Which();
211 }
212 #endif
213 
214 /*--------------------------------------------------------------------
215     Beschreibung:
216  --------------------------------------------------------------------*/
217 
GetTypeId() const218 sal_uInt16 SwField::GetTypeId() const
219 {
220 
221     sal_uInt16 nRet;
222     switch( pType->Which() )
223     {
224     case RES_DATETIMEFLD:
225         if (GetSubType() & FIXEDFLD)
226             nRet = static_cast<sal_uInt16>(GetSubType() & DATEFLD ? TYP_FIXDATEFLD : TYP_FIXTIMEFLD);
227         else
228             nRet = static_cast<sal_uInt16>(GetSubType() & DATEFLD ? TYP_DATEFLD : TYP_TIMEFLD);
229         break;
230     case RES_GETEXPFLD:
231         nRet = static_cast<sal_uInt16>(nsSwGetSetExpType::GSE_FORMULA & GetSubType() ? TYP_FORMELFLD : TYP_GETFLD);
232         break;
233 
234     case RES_HIDDENTXTFLD:
235         nRet = GetSubType();
236         break;
237 
238     case RES_SETEXPFLD:
239         if( nsSwGetSetExpType::GSE_SEQ & GetSubType() )
240             nRet = TYP_SEQFLD;
241         else if( ((SwSetExpField*)this)->GetInputFlag() )
242             nRet = TYP_SETINPFLD;
243         else
244             nRet = TYP_SETFLD;
245         break;
246 
247     case RES_PAGENUMBERFLD:
248         nRet = GetSubType();
249         if( PG_NEXT == nRet )
250             nRet = TYP_NEXTPAGEFLD;
251         else if( PG_PREV == nRet )
252             nRet = TYP_PREVPAGEFLD;
253         else
254             nRet = TYP_PAGENUMBERFLD;
255         break;
256 
257     default:
258         nRet = aTypeTab[ pType->Which() ];
259     }
260     return nRet;
261 }
262 
263 
264 /*--------------------------------------------------------------------
265     Beschreibung: liefert den Namen oder den Inhalt
266  --------------------------------------------------------------------*/
267 
GetFieldName() const268 String SwField::GetFieldName() const
269 {
270     sal_uInt16 nTypeId = GetTypeId();
271     if (RES_DATETIMEFLD == GetTyp()->Which())
272     {
273         nTypeId = static_cast<sal_uInt16>(
274             ((GetSubType() & DATEFLD) != 0) ? TYP_DATEFLD : TYP_TIMEFLD);
275     }
276     String sRet = SwFieldType::GetTypeStr( nTypeId );
277     if (IsFixed())
278     {
279         sRet += ' ';
280         sRet += ViewShell::GetShellRes()->aFixedStr;
281     }
282     return sRet;
283 }
284 
285 /*--------------------------------------------------------------------
286     Beschreibung: Parameter setzen auslesen
287  --------------------------------------------------------------------*/
288 
GetPar1() const289 const String& SwField::GetPar1() const
290 {
291     return aEmptyStr;
292 }
293 
GetPar2() const294 String SwField::GetPar2() const
295 {
296     return aEmptyStr;
297 }
298 
GetFormula() const299 String SwField::GetFormula() const
300 {
301     return GetPar2();
302 }
303 
SetPar1(const String &)304 void SwField::SetPar1(const String& )
305 {}
306 
SetPar2(const String &)307 void SwField::SetPar2(const String& )
308 {}
309 
GetSubType() const310 sal_uInt16 SwField::GetSubType() const
311 {
312 //  ASSERT(0, "Sorry Not implemented");
313     return 0;
314 }
315 
SetSubType(sal_uInt16)316 void SwField::SetSubType(sal_uInt16 )
317 {
318 //  ASSERT(0, "Sorry Not implemented");
319 }
320 
QueryValue(uno::Any & rVal,sal_uInt16 nWhichId) const321 sal_Bool  SwField::QueryValue( uno::Any& rVal, sal_uInt16 nWhichId ) const
322 {
323     switch( nWhichId )
324     {
325         case FIELD_PROP_BOOL4:
326         {
327             sal_Bool bFixed = !bIsAutomaticLanguage;
328             rVal.setValue(&bFixed, ::getCppuBooleanType());
329         }
330         break;
331         default:
332             DBG_ERROR("illegal property");
333     }
334     return sal_True;
335 }
PutValue(const uno::Any & rVal,sal_uInt16 nWhichId)336 sal_Bool SwField::PutValue( const uno::Any& rVal, sal_uInt16 nWhichId )
337 {
338     switch( nWhichId )
339     {
340         case FIELD_PROP_BOOL4:
341         {
342             sal_Bool bFixed = sal_False;
343             if(rVal >>= bFixed)
344                 bIsAutomaticLanguage = !bFixed;
345         }
346         break;
347         default:
348             DBG_ERROR("illegal property");
349     }
350     return sal_True;
351 }
352 
353 
354 /*--------------------------------------------------------------------
355     Beschreibung:   neuen Typ setzen
356                     (wird fuer das Kopieren zwischen Dokumenten benutzt)
357                     muss immer vom gleichen Typ sein.
358  --------------------------------------------------------------------*/
359 
ChgTyp(SwFieldType * pNewType)360 SwFieldType* SwField::ChgTyp( SwFieldType* pNewType )
361 {
362     ASSERT( pNewType && pNewType->Which() == pType->Which(),
363             "kein Typ oder ungleiche Typen" );
364 
365     SwFieldType* pOld = pType;
366     pType = pNewType;
367     return pOld;
368 }
369 
370     // hat das Feld eine Action auf dem ClickHandler ? (z.B. INetFelder,..)
HasClickHdl() const371 sal_Bool SwField::HasClickHdl() const
372 {
373     sal_Bool bRet = sal_False;
374     switch( pType->Which() )
375     {
376     case RES_INTERNETFLD:
377     case RES_JUMPEDITFLD:
378     case RES_GETREFFLD:
379     case RES_MACROFLD:
380     case RES_INPUTFLD:
381     case RES_DROPDOWN :
382         bRet = sal_True;
383         break;
384 
385     case RES_SETEXPFLD:
386         bRet = ((SwSetExpField*)this)->GetInputFlag();
387         break;
388     }
389     return bRet;
390 }
391 
SetLanguage(sal_uInt16 nLng)392 void SwField::SetLanguage(sal_uInt16 nLng)
393 {
394     nLang = nLng;
395 }
396 
ChangeFormat(sal_uInt32 n)397 void SwField::ChangeFormat(sal_uInt32 n)
398 {
399     nFormat = n;
400 }
401 
IsFixed() const402 sal_Bool SwField::IsFixed() const
403 {
404     sal_Bool bRet = sal_False;
405     switch( pType->Which() )
406     {
407     case RES_FIXDATEFLD:
408     case RES_FIXTIMEFLD:
409         bRet = sal_True;
410         break;
411 
412     case RES_DATETIMEFLD:
413         bRet = 0 != (GetSubType() & FIXEDFLD);
414         break;
415 
416     case RES_EXTUSERFLD:
417     case RES_AUTHORFLD:
418         bRet = 0 != (GetFormat() & AF_FIXED);
419         break;
420 
421     case RES_FILENAMEFLD:
422         bRet = 0 != (GetFormat() & FF_FIXED);
423         break;
424 
425     case RES_DOCINFOFLD:
426         bRet = 0 != (GetSubType() & DI_SUB_FIXED);
427         break;
428     }
429     return bRet;
430 }
431 
ExpandField(bool const bCached) const432 String SwField::ExpandField(bool const bCached) const
433 {
434     if ( m_bUseFieldValueCache )
435     {
436         if (!bCached) // #i85766# do not expand fields in clipboard documents
437         {
438             m_Cache = Expand();
439         }
440         return m_Cache;
441     }
442 
443     return Expand();
444 }
445 
CopyField() const446 SwField * SwField::CopyField() const
447 {
448     SwField *const pNew = Copy();
449     // #i85766# cache expansion of source (for clipboard)
450     // use this->cache, not this->Expand(): only text formatting calls Expand()
451     pNew->m_Cache = m_Cache;
452     pNew->m_bUseFieldValueCache = m_bUseFieldValueCache;
453 
454     return pNew;
455 }
456 
457 /*--------------------------------------------------------------------
458     Beschreibung: Numerierung expandieren
459  --------------------------------------------------------------------*/
460 
FormatNumber(sal_uInt16 nNum,sal_uInt32 nFormat)461 String FormatNumber(sal_uInt16 nNum, sal_uInt32 nFormat)
462 {
463     if(SVX_NUM_PAGEDESC == nFormat)
464         return  String::CreateFromInt32( nNum );
465     SvxNumberType aNumber;
466 
467     ASSERT(nFormat != SVX_NUM_NUMBER_NONE, "Falsches Nummern-Format" );
468 
469     aNumber.SetNumberingType((sal_Int16)nFormat);
470     return aNumber.GetNumStr(nNum);
471 }
472 
473 /*--------------------------------------------------------------------
474     Beschreibung: CTOR SwValueFieldType
475  --------------------------------------------------------------------*/
476 
SwValueFieldType(SwDoc * pDocPtr,sal_uInt16 nWhichId)477 SwValueFieldType::SwValueFieldType( SwDoc* pDocPtr, sal_uInt16 nWhichId )
478     : SwFieldType(nWhichId),
479     pDoc(pDocPtr),
480     bUseFormat(sal_True)
481 {
482 }
483 
SwValueFieldType(const SwValueFieldType & rTyp)484 SwValueFieldType::SwValueFieldType( const SwValueFieldType& rTyp )
485     : SwFieldType(rTyp.Which()),
486     pDoc(rTyp.GetDoc()),
487     bUseFormat(rTyp.UseFormat())
488 {
489 }
490 
491 /*--------------------------------------------------------------------
492     Beschreibung: Wert formatiert als String zurueckgeben
493  --------------------------------------------------------------------*/
494 
ExpandValue(const double & rVal,sal_uInt32 nFmt,sal_uInt16 nLng) const495 String SwValueFieldType::ExpandValue( const double& rVal,
496                                         sal_uInt32 nFmt, sal_uInt16 nLng) const
497 {
498     if (rVal >= DBL_MAX)        // FehlerString fuer Calculator
499         return ViewShell::GetShellRes()->aCalc_Error;
500 
501     String sExpand;
502     SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter();
503     Color* pCol = 0;
504 
505     // wegen Bug #60010
506     sal_uInt16 nFmtLng = ::lcl_GetLanguageOfFormat( nLng, nFmt, *pFormatter );
507 
508     if( nFmt < SV_COUNTRY_LANGUAGE_OFFSET && LANGUAGE_SYSTEM != nFmtLng )
509     {
510         short nType = NUMBERFORMAT_DEFINED;
511         xub_StrLen nDummy;
512 
513         const SvNumberformat* pEntry = pFormatter->GetEntry(nFmt);
514 
515         if (pEntry && nLng != pEntry->GetLanguage())
516         {
517             sal_uInt32 nNewFormat = pFormatter->GetFormatForLanguageIfBuiltIn(nFmt,
518                                                     (LanguageType)nFmtLng);
519 
520             if (nNewFormat == nFmt)
521             {
522                 // Warscheinlich benutzerdefiniertes Format
523                 String sFmt(pEntry->GetFormatstring());
524 
525                 pFormatter->PutandConvertEntry(sFmt, nDummy, nType, nFmt,
526                                         pEntry->GetLanguage(), nFmtLng );
527             }
528             else
529                 nFmt = nNewFormat;
530         }
531         ASSERT(pEntry, "Unbekanntes Zahlenformat!");
532     }
533 
534     if( pFormatter->IsTextFormat( nFmt ) )
535     {
536         String sValue;
537         DoubleToString(sValue, rVal, nFmtLng);
538         pFormatter->GetOutputString(sValue, nFmt, sExpand, &pCol);
539     }
540     else
541         pFormatter->GetOutputString(rVal, nFmt, sExpand, &pCol);
542 
543     return sExpand;
544 }
545 
546 /*--------------------------------------------------------------------
547     Beschreibung:
548  --------------------------------------------------------------------*/
549 
DoubleToString(String & rValue,const double & rVal,sal_uInt32 nFmt) const550 void SwValueFieldType::DoubleToString( String &rValue, const double &rVal,
551                                         sal_uInt32 nFmt) const
552 {
553     SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter();
554     const SvNumberformat* pEntry = pFormatter->GetEntry(nFmt);
555 
556     if (pEntry)
557         DoubleToString(rValue, rVal, pEntry->GetLanguage());
558 }
559 
560 /*--------------------------------------------------------------------
561     Beschreibung:
562  --------------------------------------------------------------------*/
563 
DoubleToString(String & rValue,const double & rVal,sal_uInt16 nLng) const564 void SwValueFieldType::DoubleToString( String &rValue, const double &rVal,
565                                         sal_uInt16 nLng ) const
566 {
567     SvNumberFormatter* pFormatter = pDoc->GetNumberFormatter();
568 
569     // wegen Bug #60010
570     if( nLng == LANGUAGE_NONE ) // wegen Bug #60010
571         nLng = LANGUAGE_SYSTEM;
572 
573     pFormatter->ChangeIntl( nLng ); // Separator in der richtigen Sprache besorgen
574     rValue = ::rtl::math::doubleToUString( rVal, rtl_math_StringFormat_F, 12,
575                                     pFormatter->GetDecSep(), true );
576 }
577 
578 /*--------------------------------------------------------------------
579     Beschreibung: CTOR SwValueField
580  --------------------------------------------------------------------*/
581 
SwValueField(SwValueFieldType * pFldType,sal_uInt32 nFmt,sal_uInt16 nLng,const double fVal)582 SwValueField::SwValueField( SwValueFieldType* pFldType, sal_uInt32 nFmt,
583                             sal_uInt16 nLng, const double fVal )
584     : SwField(pFldType, nFmt, nLng),
585     fValue(fVal)
586 {
587 }
588 
SwValueField(const SwValueField & rFld)589 SwValueField::SwValueField( const SwValueField& rFld )
590     : SwField(rFld),
591     fValue(rFld.GetValue())
592 {
593 }
594 
~SwValueField()595 SwValueField::~SwValueField()
596 {
597 }
598 /*--------------------------------------------------------------------
599     Beschreibung:   neuen Typ setzen
600                     (wird fuer das Kopieren zwischen Dokumenten benutzt)
601                     muss immer vom gleichen Typ sein.
602  --------------------------------------------------------------------*/
603 
ChgTyp(SwFieldType * pNewType)604 SwFieldType* SwValueField::ChgTyp( SwFieldType* pNewType )
605 {
606     SwDoc* pNewDoc = ((SwValueFieldType *)pNewType)->GetDoc();
607     SwDoc* pDoc    = GetDoc();
608 
609     if( pNewDoc && pDoc && pDoc != pNewDoc)
610     {
611         SvNumberFormatter* pFormatter = pNewDoc->GetNumberFormatter();
612 
613         if( pFormatter && pFormatter->HasMergeFmtTbl() &&
614             ((SwValueFieldType *)GetTyp())->UseFormat() )
615             SetFormat(pFormatter->GetMergeFmtIndex( GetFormat() ));
616     }
617 
618     return SwField::ChgTyp(pNewType);
619 }
620 
621 /*--------------------------------------------------------------------
622     Beschreibung: Format in Office-Sprache ermitteln
623  --------------------------------------------------------------------*/
624 
GetSystemFormat(SvNumberFormatter * pFormatter,sal_uInt32 nFmt)625 sal_uInt32 SwValueField::GetSystemFormat(SvNumberFormatter* pFormatter, sal_uInt32 nFmt)
626 {
627     const SvNumberformat* pEntry = pFormatter->GetEntry(nFmt);
628     sal_uInt16 nLng = SvxLocaleToLanguage( SvtSysLocale().GetLocaleData().getLocale() );
629 
630     if (pEntry && nLng != pEntry->GetLanguage())
631     {
632         sal_uInt32 nNewFormat = pFormatter->GetFormatForLanguageIfBuiltIn(nFmt,
633                                                         (LanguageType)nLng);
634 
635         if (nNewFormat == nFmt)
636         {
637             // Warscheinlich benutzerdefiniertes Format
638             short nType = NUMBERFORMAT_DEFINED;
639             xub_StrLen nDummy;
640 
641             String sFmt(pEntry->GetFormatstring());
642 
643             sal_uInt32 nFormat = nFmt;
644             pFormatter->PutandConvertEntry(sFmt, nDummy, nType,
645                                 nFormat, pEntry->GetLanguage(), nLng);
646             nFmt = nFormat;
647         }
648         else
649             nFmt = nNewFormat;
650     }
651 
652     return nFmt;
653 }
654 
655 /*--------------------------------------------------------------------
656     Beschreibung: Sprache im Format anpassen
657  --------------------------------------------------------------------*/
658 
SetLanguage(sal_uInt16 nLng)659 void SwValueField::SetLanguage( sal_uInt16 nLng )
660 {
661     if( IsAutomaticLanguage() &&
662             ((SwValueFieldType *)GetTyp())->UseFormat() &&
663         GetFormat() != SAL_MAX_UINT32 )
664     {
665         // wegen Bug #60010
666         SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
667         sal_uInt16 nFmtLng = ::lcl_GetLanguageOfFormat( nLng, GetFormat(),
668                                                     *pFormatter );
669 
670         if( (GetFormat() >= SV_COUNTRY_LANGUAGE_OFFSET ||
671              LANGUAGE_SYSTEM != nFmtLng ) &&
672             !(Which() == RES_USERFLD && (GetSubType()&nsSwExtendedSubType::SUB_CMD) ) )
673         {
674             const SvNumberformat* pEntry = pFormatter->GetEntry(GetFormat());
675 
676             if( pEntry && nFmtLng != pEntry->GetLanguage() )
677             {
678                 sal_uInt32 nNewFormat = pFormatter->GetFormatForLanguageIfBuiltIn(
679                                         GetFormat(), (LanguageType)nFmtLng );
680 
681                 if( nNewFormat == GetFormat() )
682                 {
683                     // Warscheinlich benutzerdefiniertes Format
684                     short nType = NUMBERFORMAT_DEFINED;
685                     xub_StrLen nDummy;
686                     String sFmt( pEntry->GetFormatstring() );
687                     pFormatter->PutandConvertEntry( sFmt, nDummy, nType,
688                                                     nNewFormat,
689                                                     pEntry->GetLanguage(),
690                                                     nFmtLng );
691                 }
692                 SetFormat( nNewFormat );
693             }
694             ASSERT(pEntry, "Unbekanntes Zahlenformat!");
695         }
696     }
697 
698     SwField::SetLanguage(nLng);
699 }
700 
701 /*--------------------------------------------------------------------
702     Beschreibung:
703  --------------------------------------------------------------------*/
704 
GetValue() const705 double SwValueField::GetValue() const
706 {
707     return fValue;
708 }
709 
SetValue(const double & rVal)710 void SwValueField::SetValue( const double& rVal )
711 {
712     fValue = rVal;
713 }
714 
715 /*--------------------------------------------------------------------
716     Beschreibung: SwFormulaField
717  --------------------------------------------------------------------*/
718 
SwFormulaField(SwValueFieldType * pFldType,sal_uInt32 nFmt,const double fVal)719 SwFormulaField::SwFormulaField( SwValueFieldType* pFldType, sal_uInt32 nFmt, const double fVal)
720     : SwValueField(pFldType, nFmt, LANGUAGE_SYSTEM, fVal)
721 {
722 }
723 
SwFormulaField(const SwFormulaField & rFld)724 SwFormulaField::SwFormulaField( const SwFormulaField& rFld )
725     : SwValueField((SwValueFieldType *)rFld.GetTyp(), rFld.GetFormat(),
726                     rFld.GetLanguage(), rFld.GetValue())
727 {
728 }
729 
730 /*--------------------------------------------------------------------
731     Beschreibung:
732  --------------------------------------------------------------------*/
733 
GetFormula() const734 String SwFormulaField::GetFormula() const
735 {
736     return sFormula;
737 }
738 
739 /*--------------------------------------------------------------------
740     Beschreibung:
741  --------------------------------------------------------------------*/
742 
SetFormula(const String & rStr)743 void SwFormulaField::SetFormula(const String& rStr)
744 {
745     sFormula = rStr;
746 
747     sal_uLong nFmt(GetFormat());
748 
749     if( nFmt && SAL_MAX_UINT32 != nFmt )
750     {
751         xub_StrLen nPos = 0;
752         double fTmpValue;
753         if( SwCalc::Str2Double( rStr, nPos, fTmpValue, GetDoc() ) )
754             SwValueField::SetValue( fTmpValue );
755     }
756 }
757 
758 /*--------------------------------------------------------------------
759     Beschreibung:
760  --------------------------------------------------------------------*/
761 
SetExpandedFormula(const String & rStr)762 void SwFormulaField::SetExpandedFormula( const String& rStr )
763 {
764     sal_uInt32 nFmt(GetFormat());
765 
766     if (nFmt && nFmt != SAL_MAX_UINT32 && ((SwValueFieldType *)GetTyp())->UseFormat())
767     {
768         double fTmpValue;
769 
770         SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
771 
772         if (pFormatter->IsNumberFormat(rStr, nFmt, fTmpValue))
773         {
774             SwValueField::SetValue(fTmpValue);
775             sFormula.Erase();
776 
777             ((SwValueFieldType *)GetTyp())->DoubleToString(sFormula, fTmpValue, nFmt);
778             return;
779         }
780     }
781     sFormula = rStr;
782 }
783 
784 /*--------------------------------------------------------------------
785     Beschreibung:
786  --------------------------------------------------------------------*/
787 
GetExpandedFormula() const788 String SwFormulaField::GetExpandedFormula() const
789 {
790     sal_uInt32 nFmt(GetFormat());
791 
792     if (nFmt && nFmt != SAL_MAX_UINT32 && ((SwValueFieldType *)GetTyp())->UseFormat())
793     {
794         String sFormattedValue;
795         Color* pCol = 0;
796 
797         SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
798 
799         if (pFormatter->IsTextFormat(nFmt))
800         {
801             String sValue;
802             ((SwValueFieldType *)GetTyp())->DoubleToString(sValue, GetValue(), nFmt);
803             pFormatter->GetOutputString(sValue, nFmt, sFormattedValue, &pCol);
804         }
805         else
806             pFormatter->GetOutputString(GetValue(), nFmt, sFormattedValue, &pCol);
807 
808         return sFormattedValue;
809     }
810     else
811         return GetFormula();
812 }
813 
GetDescription() const814 String SwField::GetDescription() const
815 {
816     return SW_RES(STR_FIELD);
817 }
818