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 #ifndef SW_FLDBAS_HXX 24 #define SW_FLDBAS_HXX 25 26 #include <i18npool/lang.h> 27 #include <tools/debug.hxx> 28 #include <tools/string.hxx> 29 #include "swdllapi.h" 30 #include <calbck.hxx> 31 #include <com/sun/star/uno/Any.hxx> 32 33 class SwDoc; 34 class SvStringsDtor; 35 class SvNumberFormatter; 36 37 38 /*-------------------------------------------------------------------- 39 Beschreibung: die ID's fuer die Feldtypen 40 --------------------------------------------------------------------*/ 41 42 enum RES_FIELDS 43 { 44 // Fuer die alten Dokumente muessen die Field-Which IDS erhalten bleiben !!!! 45 RES_FIELDS_BEGIN, 46 RES_DBFLD = RES_FIELDS_BEGIN, 47 RES_USERFLD, 48 RES_FILENAMEFLD, 49 RES_DBNAMEFLD, 50 RES_DATEFLD, 51 RES_TIMEFLD, 52 RES_PAGENUMBERFLD, 53 RES_AUTHORFLD, 54 RES_CHAPTERFLD, 55 RES_DOCSTATFLD, 56 RES_GETEXPFLD, 57 RES_SETEXPFLD, 58 RES_GETREFFLD, 59 RES_HIDDENTXTFLD, 60 RES_POSTITFLD, 61 RES_FIXDATEFLD, 62 RES_FIXTIMEFLD, 63 RES_REGFLD, 64 RES_VARREGFLD, 65 RES_SETREFFLD, 66 RES_INPUTFLD, 67 RES_MACROFLD, 68 RES_DDEFLD, 69 RES_TABLEFLD, 70 RES_HIDDENPARAFLD, 71 RES_DOCINFOFLD, 72 RES_TEMPLNAMEFLD, 73 RES_DBNEXTSETFLD, 74 RES_DBNUMSETFLD, 75 RES_DBSETNUMBERFLD, 76 RES_EXTUSERFLD, 77 RES_REFPAGESETFLD, 78 RES_REFPAGEGETFLD, 79 RES_INTERNETFLD, 80 RES_JUMPEDITFLD, 81 RES_SCRIPTFLD, 82 RES_DATETIMEFLD, 83 RES_AUTHORITY, //Table of authorities 84 RES_COMBINED_CHARS, 85 RES_DROPDOWN, 86 RES_FIELDS_END 87 }; 88 89 /*-------------------------------------------------------------------- 90 Beschreibung: Liste der FieldTypes am UI 91 --------------------------------------------------------------------*/ 92 93 enum SwFldTypesEnum 94 { 95 TYP_BEGIN, 96 TYP_DATEFLD = TYP_BEGIN, // 0 97 TYP_TIMEFLD, 98 TYP_FILENAMEFLD, 99 TYP_DBNAMEFLD, 100 TYP_CHAPTERFLD, 101 TYP_PAGENUMBERFLD, 102 TYP_DOCSTATFLD, 103 TYP_AUTHORFLD, 104 TYP_SETFLD, 105 TYP_GETFLD, 106 TYP_FORMELFLD, // 10 107 TYP_HIDDENTXTFLD, 108 TYP_SETREFFLD, 109 TYP_GETREFFLD, 110 TYP_DDEFLD, 111 TYP_MACROFLD, 112 TYP_INPUTFLD, 113 TYP_HIDDENPARAFLD, 114 TYP_DOCINFOFLD, 115 TYP_DBFLD, 116 TYP_USERFLD, // 20 117 TYP_POSTITFLD, 118 TYP_TEMPLNAMEFLD, 119 TYP_SEQFLD, 120 TYP_DBNEXTSETFLD, 121 TYP_DBNUMSETFLD, 122 TYP_DBSETNUMBERFLD, 123 TYP_CONDTXTFLD, 124 TYP_NEXTPAGEFLD, 125 TYP_PREVPAGEFLD, 126 TYP_EXTUSERFLD, // 30 127 TYP_FIXDATEFLD, 128 TYP_FIXTIMEFLD, 129 TYP_SETINPFLD, 130 TYP_USRINPFLD, 131 TYP_SETREFPAGEFLD, 132 TYP_GETREFPAGEFLD, 133 TYP_INTERNETFLD, 134 TYP_JUMPEDITFLD, 135 TYP_SCRIPTFLD, // 40 136 TYP_AUTHORITY, 137 TYP_COMBINED_CHARS, 138 TYP_DROPDOWN, 139 TYP_END 140 }; 141 enum SwAttrFieldTYpe 142 { 143 ATTR_NONE, 144 ATTR_DATEFLD, 145 ATTR_TIMEFLD, 146 ATTR_PAGENUMBERFLD, 147 ATTR_PAGECOOUNTFLD, 148 ATTR_BOOKMARKFLD, 149 ATTR_SETREFATTRFLD 150 }; 151 enum SwFileNameFormat 152 { 153 FF_BEGIN, 154 FF_NAME = FF_BEGIN, 155 FF_PATHNAME, 156 FF_PATH, 157 FF_NAME_NOEXT, 158 FF_UI_NAME, 159 FF_UI_RANGE, 160 FF_END, 161 FF_FIXED = 0x8000 162 }; 163 164 enum SwVarFormat 165 { 166 VVF_CMD = 0x0010, // Kommando anzeigen 167 VVF_INVISIBLE = 0x0040, // unsichtbar 168 VVF_XXP = 0x0400, // 1234% 169 VVF_XX_XXP = 0x0800, // 1.234,56% 170 VVF_CLEAR = 0x000f, 171 172 // ab hier neue Formate 173 VVF_SYS = 0x2000, //Zahlenformat aus der Systemeinstellung 174 VVF_X = 0x2100, // 1234 175 VVF_X_X = 0x2200, // 1234,5 176 VVF_X_XX = 0x2300, // 1245,56 177 VVF_XX_X = 0x2400, // 1.234,5 178 VVF_XX_XX = 0x2500, // 1.234,56 179 VVF_XX_XXX = 0x2600, // 1.234,567 180 VVF_SYS_CUR = 0x2700, // W???hrungsformat aus der Systemeinstellung 181 VVF_CUR_X = 0x2800, // DM 1234 182 VVF_CUR_XX_XX = 0x2900, // DM 1234,56 DM 1234,00 183 VVF_CUR_XX_X0 = 0x2a00, // DM 1234,56 DM 1234,-- 184 VVF_X_CUR = 0x2b00, // 1234 DM 185 VVF_XX_XX_CUR = 0x2c00, // 1234,56 DM 1234,00 DM 186 VVF_XX_X0_CUR = 0x2d00, // 1234,56 DM 1234,-- DM 187 // Kompatibilitaet: 188 VF_CMD = VVF_CMD, 189 VF_INVISIBLE = VVF_INVISIBLE, 190 VF_XXP = VVF_XXP, 191 VF_XX_XXP = VVF_XX_XXP, 192 VF_VISIBLE = VVF_SYS, 193 VF_XX = VVF_X, 194 VF_XX_XX = VVF_XX_XX, 195 VF_XX_XX_CUR = VVF_SYS_CUR, 196 VF_CLEAR = VVF_CLEAR 197 198 }; 199 200 typedef sal_uInt16 SwGetSetExpType; 201 namespace nsSwGetSetExpType 202 { 203 const SwGetSetExpType GSE_STRING = 0x0001; // String 204 const SwGetSetExpType GSE_EXPR = 0x0002; // Expression 205 const SwGetSetExpType GSE_INP = 0x0004; // InputField 206 const SwGetSetExpType GSE_SEQ = 0x0008; // Sequence 207 const SwGetSetExpType GSE_FORMULA = 0x0010; // Formel 208 } 209 210 typedef sal_uInt16 SwExtendedSubType; 211 namespace nsSwExtendedSubType 212 { 213 const SwExtendedSubType SUB_CMD = 0x0100; // Kommando anzeigen 214 const SwExtendedSubType SUB_INVISIBLE = 0x0200; // unsichtbar 215 const SwExtendedSubType SUB_OWN_FMT = 0x0400; // SwDBField: Uebernimmt Formatierung nicht 216 // aus Datenbank 217 } 218 219 enum SwInputFieldSubType 220 { 221 INP_TXT = 0x01, 222 INP_USR = 0x02, 223 INP_VAR = 0x03 224 }; 225 226 227 enum SwUserType 228 { 229 UF_STRING = 0x01, 230 UF_EXPR = 0x02 231 }; 232 233 enum SwDateTimeSubType 234 { 235 FIXEDFLD = 1, 236 DATEFLD = 2, 237 TIMEFLD = 4 238 }; 239 240 241 extern sal_uInt16 __FAR_DATA aTypeTab[]; 242 243 /*-------------------------------------------------------------------- 244 Beschreibung: Allgemeine Tools 245 --------------------------------------------------------------------*/ 246 247 String GetResult(double nVal, sal_uInt32 nNumFmt, sal_uInt16 nLang = LANGUAGE_SYSTEM); 248 void SetErrorStr(const String& rStr); 249 //String ExpandDate(const Date& rDate, sal_uLong nFmt, sal_uInt16 nLang); 250 //String ExpandTime(const Time& rTime, sal_uLong nFmt, sal_uInt16 nLang); 251 String FormatNumber(sal_uInt16 nNum, sal_uInt32 nFormat); 252 253 /*-------------------------------------------------------------------- 254 Beschreibung: Instanzen von SwFields und Abgeleiteten kommen 0-n mal vor. 255 Zu jeder Klasse SwFields existiert 256 1 Instanz der zugehoerigen Typenklasse 257 Basisklasse aller Feldtypen ist SwFieldType 258 --------------------------------------------------------------------*/ 259 260 DBG_NAMEEX(SwFieldType) 261 262 class SW_DLLPUBLIC SwFieldType : public SwModify 263 { 264 sal_uInt16 nWhich; 265 266 friend void _FinitUI(); // um den Pointer zu loeschen! 267 static SvStringsDtor* pFldNames; 268 269 static void _GetFldName(); // legt die FldNames an, fldmgr.cxx! 270 271 protected: 272 // single argument ctors shall be explicit. 273 explicit SwFieldType( sal_uInt16 nWhichId ); 274 275 public: 276 277 #ifdef DBG_UTIL 278 virtual ~SwFieldType(); 279 #endif 280 static const String& GetTypeStr( sal_uInt16 nTypeId ); 281 282 // nur in abgeleiteten Klassen 283 virtual const String& GetName() const; 284 virtual SwFieldType* Copy() const = 0; 285 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const; 286 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ); 287 288 sal_uInt16 Which() const { return nWhich; } 289 290 inline void UpdateFlds() const; 291 }; 292 293 inline void SwFieldType::UpdateFlds() const 294 { 295 ((SwFieldType*)this)->ModifyNotification( 0, 0 ); 296 } 297 298 /*-------------------------------------------------------------------- 299 Beschreibung: Basisklasse aller Felder. 300 Ueber Which wird der Typ des Feldes abgefragt. 301 Ueber Expand() wird der expandierte Inhalt 302 des Feldes in Erfahrung gebracht. 303 --------------------------------------------------------------------*/ 304 305 class SW_DLLPUBLIC SwField 306 { 307 private: 308 mutable String m_Cache; /// #i85766# cached expansion (for clipboard) 309 bool m_bUseFieldValueCache; /// control the usage of the cached field value 310 311 sal_uInt16 nLang; // Immer ueber SetLanguage aendern! 312 sal_Bool bIsAutomaticLanguage; 313 sal_uInt32 nFormat; 314 315 SwFieldType* pType; 316 317 virtual String Expand() const = 0; 318 virtual SwField* Copy() const = 0; 319 320 protected: 321 void SetFormat(sal_uInt32 nSet) {nFormat = nSet;} 322 323 SwField( SwFieldType* pTyp, 324 sal_uInt32 nFmt = 0, 325 sal_uInt16 nLang = LANGUAGE_SYSTEM, 326 bool m_bUseFieldValueCache = true ); 327 328 public: 329 virtual ~SwField(); 330 331 // Typ feststellen 332 inline SwFieldType* GetTyp() const; 333 334 // neuen Typ setzen (wird fuer das Kopieren zwischen Dokumenten benutzt) 335 virtual SwFieldType* ChgTyp( SwFieldType* ); 336 337 /** expand the field. 338 @param bCached return cached field value. 339 @remark most callers should use the cached field value. 340 this is because various fields need special handing 341 (ChangeExpansion()) to return correct values, and only 342 SwTxtFormatter::NewFldPortion() sets things up properly. 343 @return the generated text (suitable for display) 344 */ 345 String ExpandField(bool const bCached) const; 346 347 virtual String GetFieldName() const; 348 349 SwField * CopyField() const; 350 351 // ResId 352 sal_uInt16 Which() const 353 #ifndef DBG_UTIL 354 { return pType->Which(); } 355 #else 356 ; // in fldbas.cxx implementiert 357 #endif 358 359 // TYP_ID 360 sal_uInt16 GetTypeId() const; 361 virtual sal_uInt16 GetSubType() const; 362 virtual void SetSubType(sal_uInt16); 363 364 // Sprache an der Feldposition 365 inline sal_uInt16 GetLanguage() const; 366 virtual void SetLanguage(sal_uInt16 nLng); 367 368 // Parameter fuer Dialog und BASIC erfragen 369 inline sal_uInt32 GetFormat() const; 370 virtual const String& GetPar1() const; 371 virtual String GetPar2() const; 372 373 virtual String GetFormula() const; 374 375 virtual void ChangeFormat(sal_uInt32 n); 376 virtual void SetPar1(const String& rStr); 377 virtual void SetPar2(const String& rStr); 378 379 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId ) const; 380 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId ); 381 // hat das Feld eine Action auf dem ClickHandler ? (z.B. INetFelder,..) 382 sal_Bool HasClickHdl() const; 383 // ist es ein Fix-Feld? 384 sal_Bool IsFixed() const; 385 386 sal_Bool IsAutomaticLanguage() const { return bIsAutomaticLanguage;} 387 void SetAutomaticLanguage(sal_Bool bSet){bIsAutomaticLanguage = bSet;} 388 389 virtual String GetDescription() const; 390 }; 391 392 inline SwFieldType* SwField::GetTyp() const 393 { return pType; } 394 395 inline sal_uInt32 SwField::GetFormat() const 396 { return nFormat; } 397 398 inline sal_uInt16 SwField::GetLanguage() const 399 { return nLang; } 400 401 /*-------------------------------------------------------------------- 402 Beschreibung: Felder mit Values, die ueber der Numberformatter 403 formatiert werden muessen 404 --------------------------------------------------------------------*/ 405 406 class SwValueFieldType : public SwFieldType 407 { 408 SwDoc* pDoc; 409 sal_Bool bUseFormat; // Numberformatter verwenden 410 411 protected: 412 SwValueFieldType( SwDoc* pDocPtr, sal_uInt16 nWhichId ); 413 SwValueFieldType( const SwValueFieldType& rTyp ); 414 415 public: 416 inline SwDoc* GetDoc() const { return pDoc; } 417 inline void SetDoc(SwDoc* pNewDoc) { pDoc = pNewDoc; } 418 419 inline sal_Bool UseFormat() const { return bUseFormat; } 420 inline void EnableFormat(sal_Bool bFormat = sal_True) { bUseFormat = bFormat; } 421 422 String ExpandValue(const double& rVal, sal_uInt32 nFmt, sal_uInt16 nLng=0) const; 423 void DoubleToString(String &rValue, const double &rVal, LanguageType eLng) const; 424 void DoubleToString(String &rValue, const double &rVal, sal_uInt32 nFmt) const; 425 }; 426 427 class SW_DLLPUBLIC SwValueField : public SwField 428 { 429 double fValue; 430 // String sExpand; 431 432 protected: 433 SwValueField( SwValueFieldType* pFldType, sal_uInt32 nFmt = 0, sal_uInt16 nLang = LANGUAGE_SYSTEM, const double fVal = 0.0 ); 434 SwValueField( const SwValueField& rFld ); 435 436 public: 437 virtual ~SwValueField(); 438 439 virtual SwFieldType* ChgTyp( SwFieldType* ); 440 virtual void SetLanguage(sal_uInt16 nLng); 441 // os: wozu war das denn da? 442 // virtual void ChangeFormat(sal_uLong n); 443 444 inline SwDoc* GetDoc() const { return ((SwValueFieldType*)GetTyp())->GetDoc(); } 445 446 virtual double GetValue() const; 447 virtual void SetValue( const double& rVal ); 448 449 inline String ExpandValue(const double& rVal, sal_uInt32 nFmt, sal_uInt16 nLng=0) const 450 { return ((SwValueFieldType*)GetTyp())->ExpandValue(rVal, nFmt, nLng); } 451 452 static sal_uInt32 GetSystemFormat(SvNumberFormatter* pFormatter, sal_uInt32 nFmt); 453 }; 454 455 class SW_DLLPUBLIC SwFormulaField : public SwValueField 456 { 457 String sFormula; 458 459 protected: 460 SwFormulaField( SwValueFieldType* pFldType, sal_uInt32 nFmt = 0, const double fVal = 0.0 ); 461 SwFormulaField( const SwFormulaField& rFld ); 462 463 public: 464 virtual String GetFormula() const; 465 void SetFormula(const String& rStr); 466 467 void SetExpandedFormula(const String& rStr); 468 String GetExpandedFormula() const; 469 }; 470 471 #endif // SW_FLDBAS_HXX 472