xref: /aoo4110/main/sw/inc/fldbas.hxx (revision b1cdbd2c)
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 
Which() const288 			sal_uInt16 			Which() const { return nWhich; }
289 
290 	inline  void 			UpdateFlds() const;
291 };
292 
UpdateFlds() const293 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:
SetFormat(sal_uInt32 nSet)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
Which() const352 	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 
IsAutomaticLanguage() const386     sal_Bool                IsAutomaticLanguage() const { return bIsAutomaticLanguage;}
SetAutomaticLanguage(sal_Bool bSet)387     void                SetAutomaticLanguage(sal_Bool bSet){bIsAutomaticLanguage = bSet;}
388 
389     virtual String      GetDescription() const;
390 };
391 
GetTyp() const392 inline SwFieldType*	SwField::GetTyp() const
393 	{ return pType; 	}
394 
GetFormat() const395 inline sal_uInt32 SwField::GetFormat() const
396 	{ return nFormat; 	}
397 
GetLanguage() const398 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:
GetDoc() const416 	inline SwDoc*	GetDoc() const						{ return pDoc; }
SetDoc(SwDoc * pNewDoc)417 	inline void		SetDoc(SwDoc* pNewDoc)				{ pDoc = pNewDoc; }
418 
UseFormat() const419 	inline sal_Bool		UseFormat() const					{ return bUseFormat; }
EnableFormat(sal_Bool bFormat=sal_True)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 
GetDoc() const444 	inline SwDoc*			GetDoc() const			{ return ((SwValueFieldType*)GetTyp())->GetDoc(); }
445 
446 	virtual double			GetValue() const;
447 	virtual void 			SetValue( const double& rVal );
448 
ExpandValue(const double & rVal,sal_uInt32 nFmt,sal_uInt16 nLng=0) const449 	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