Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #ifndef INCLUDED_SW_INC_FLDBAS_HXX
20 : #define INCLUDED_SW_INC_FLDBAS_HXX
21 :
22 : #include <i18nlangtag/lang.h>
23 : #include "swdllapi.h"
24 : #include <calbck.hxx>
25 : #include <com/sun/star/beans/XPropertySet.hpp>
26 : #include <com/sun/star/uno/Any.hxx>
27 : #include <cppuhelper/weakref.hxx>
28 : #include <vector>
29 : #include <toxe.hxx>
30 : class SwDoc;
31 : class SvNumberFormatter;
32 :
33 : enum RES_FIELDS
34 : {
35 : /// For old documents the Field-Which IDs must be preserved !!!
36 : RES_FIELDS_BEGIN,
37 : RES_DBFLD = RES_FIELDS_BEGIN,
38 : RES_USERFLD,
39 : RES_FILENAMEFLD,
40 : RES_DBNAMEFLD,
41 : RES_DATEFLD,
42 : RES_TIMEFLD,
43 : RES_PAGENUMBERFLD,
44 : RES_AUTHORFLD,
45 : RES_CHAPTERFLD,
46 : RES_DOCSTATFLD,
47 : RES_GETEXPFLD,
48 : RES_SETEXPFLD,
49 : RES_GETREFFLD,
50 : RES_HIDDENTXTFLD,
51 : RES_POSTITFLD,
52 : RES_FIXDATEFLD,
53 : RES_FIXTIMEFLD,
54 : RES_REGFLD,
55 : RES_VARREGFLD,
56 : RES_SETREFFLD,
57 : RES_INPUTFLD,
58 : RES_MACROFLD,
59 : RES_DDEFLD,
60 : RES_TABLEFLD,
61 : RES_HIDDENPARAFLD,
62 : RES_DOCINFOFLD,
63 : RES_TEMPLNAMEFLD,
64 : RES_DBNEXTSETFLD,
65 : RES_DBNUMSETFLD,
66 : RES_DBSETNUMBERFLD,
67 : RES_EXTUSERFLD,
68 : RES_REFPAGESETFLD,
69 : RES_REFPAGEGETFLD,
70 : RES_INTERNETFLD,
71 : RES_JUMPEDITFLD,
72 : RES_SCRIPTFLD,
73 : RES_DATETIMEFLD,
74 : RES_AUTHORITY, ///< Table of authorities
75 : RES_COMBINED_CHARS,
76 : RES_DROPDOWN,
77 : RES_FIELDS_END
78 : };
79 :
80 : /// List of FieldTypes at UI.
81 : enum SwFieldTypesEnum
82 : {
83 : TYP_BEGIN,
84 : TYP_DATEFLD = TYP_BEGIN, // 0
85 : TYP_TIMEFLD,
86 : TYP_FILENAMEFLD,
87 : TYP_DBNAMEFLD,
88 : TYP_CHAPTERFLD,
89 : TYP_PAGENUMBERFLD,
90 : TYP_DOCSTATFLD,
91 : TYP_AUTHORFLD,
92 : TYP_SETFLD,
93 : TYP_GETFLD,
94 : TYP_FORMELFLD, // 10
95 : TYP_HIDDENTXTFLD,
96 : TYP_SETREFFLD,
97 : TYP_GETREFFLD,
98 : TYP_DDEFLD,
99 : TYP_MACROFLD,
100 : TYP_INPUTFLD,
101 : TYP_HIDDENPARAFLD,
102 : TYP_DOCINFOFLD,
103 : TYP_DBFLD,
104 : TYP_USERFLD, // 20
105 : TYP_POSTITFLD,
106 : TYP_TEMPLNAMEFLD,
107 : TYP_SEQFLD,
108 : TYP_DBNEXTSETFLD,
109 : TYP_DBNUMSETFLD,
110 : TYP_DBSETNUMBERFLD,
111 : TYP_CONDTXTFLD,
112 : TYP_NEXTPAGEFLD,
113 : TYP_PREVPAGEFLD,
114 : TYP_EXTUSERFLD, // 30
115 : TYP_FIXDATEFLD,
116 : TYP_FIXTIMEFLD,
117 : TYP_SETINPFLD,
118 : TYP_USRINPFLD,
119 : TYP_SETREFPAGEFLD,
120 : TYP_GETREFPAGEFLD,
121 : TYP_INTERNETFLD,
122 : TYP_JUMPEDITFLD,
123 : TYP_SCRIPTFLD,
124 : TYP_AUTHORITY, // 40
125 : TYP_COMBINED_CHARS,
126 : TYP_DROPDOWN,
127 : TYP_END
128 : };
129 : enum SwAttrFieldTYpe
130 : {
131 : ATTR_NONE,
132 : ATTR_DATEFLD,
133 : ATTR_TIMEFLD,
134 : ATTR_PAGENUMBERFLD,
135 : ATTR_PAGECOOUNTFLD,
136 : ATTR_BOOKMARKFLD,
137 : ATTR_SETREFATTRFLD
138 : };
139 : enum SwFileNameFormat
140 : {
141 : FF_BEGIN,
142 : FF_NAME = FF_BEGIN,
143 : FF_PATHNAME,
144 : FF_PATH,
145 : FF_NAME_NOEXT,
146 : FF_UI_NAME,
147 : FF_UI_RANGE,
148 : FF_END,
149 : FF_FIXED = 0x8000
150 : };
151 :
152 : enum SwVarFormat
153 : {
154 : VVF_CMD = 0x0010, ///< Show command.
155 : VVF_INVISIBLE = 0x0040, ///< Invisible.
156 : VVF_XXP = 0x0400, ///< 1234%
157 : VVF_XX_XXP = 0x0800, ///< 1.234,56%
158 : VVF_CLEAR = 0x000f,
159 :
160 : // From here new formats:
161 : VVF_SYS = 0x2000, ///< Format for numbers from system.
162 : VVF_X = 0x2100, ///< 1234
163 : VVF_X_X = 0x2200, ///< 1234.5
164 : VVF_X_XX = 0x2300, ///< 1245.56
165 : VVF_XX_X = 0x2400, ///< 1.234.5
166 : VVF_XX_XX = 0x2500, ///< 1.234.56
167 : VVF_XX_XXX = 0x2600, ///< 1.234.567
168 : VVF_SYS_CUR = 0x2700, ///< Format for currency from system.
169 : VVF_CUR_X = 0x2800, ///< EUR 1234
170 : VVF_CUR_XX_XX = 0x2900, ///< EUR 1234.56 EUR 1234.00
171 : VVF_CUR_XX_X0 = 0x2a00, ///< EUR 1234.56 EUR 1234.--
172 : VVF_X_CUR = 0x2b00, ///< 1234 EUR
173 : VVF_XX_XX_CUR = 0x2c00, ///< 1234.56 EUR 1234.00 EUR
174 : VVF_XX_X0_CUR = 0x2d00, ///< 1234.56 EUR 1234.-- EUR
175 : /// Compatibility:
176 : VF_CMD = VVF_CMD,
177 : VF_INVISIBLE = VVF_INVISIBLE,
178 : VF_XXP = VVF_XXP,
179 : VF_XX_XXP = VVF_XX_XXP,
180 : VF_VISIBLE = VVF_SYS,
181 : VF_XX = VVF_X,
182 : VF_XX_XX = VVF_XX_XX,
183 : VF_XX_XX_CUR = VVF_SYS_CUR,
184 : VF_CLEAR = VVF_CLEAR
185 :
186 : };
187 :
188 : typedef sal_uInt16 SwGetSetExpType;
189 : namespace nsSwGetSetExpType
190 : {
191 : const SwGetSetExpType GSE_STRING = 0x0001; ///< String
192 : const SwGetSetExpType GSE_EXPR = 0x0002; ///< Expression
193 : const SwGetSetExpType GSE_INP = 0x0004; ///< InputField
194 : const SwGetSetExpType GSE_SEQ = 0x0008; ///< Sequence
195 : const SwGetSetExpType GSE_FORMULA = 0x0010; ///< Formula
196 : }
197 :
198 : typedef sal_uInt16 SwExtendedSubType;
199 : namespace nsSwExtendedSubType
200 : {
201 : const SwExtendedSubType SUB_CMD = 0x0100; ///< Show command.
202 : const SwExtendedSubType SUB_INVISIBLE = 0x0200; ///< Invisible.
203 : const SwExtendedSubType SUB_OWN_FMT = 0x0400; ///< SwDBField: Don't accept formatting from database.
204 : }
205 :
206 : enum SwInputFieldSubType
207 : {
208 : INP_TXT = 0x01,
209 : INP_USR = 0x02,
210 : INP_VAR = 0x03
211 : };
212 :
213 : enum SwUserType
214 : {
215 : UF_STRING = 0x01,
216 : UF_EXPR = 0x02
217 : };
218 :
219 : enum SwDateTimeSubType
220 : {
221 : FIXEDFLD = 1,
222 : DATEFLD = 2,
223 : TIMEFLD = 4
224 : };
225 :
226 : /// General tools.
227 : OUString GetResult(double nVal, sal_uInt32 nNumFormat, sal_uInt16 nLang = LANGUAGE_SYSTEM);
228 : void SetErrorStr(const OUString& rStr);
229 : OUString FormatNumber(sal_uInt32 nNum, sal_uInt32 nFormat);
230 :
231 : /** Instances of SwFields and those derived from it occur 0 to n times.
232 : For each class there is one instance of the associated type class.
233 : Base class of all field types is SwFieldType. */
234 :
235 94751 : class SW_DLLPUBLIC SwFieldType : public SwModify
236 : {
237 : ::com::sun::star::uno::WeakReference<
238 : ::com::sun::star::beans::XPropertySet> m_wXFieldMaster;
239 :
240 : sal_uInt16 m_nWhich;
241 :
242 : friend void _FinitUI(); ///< In order to delete pointer!
243 : static std::vector<OUString>* s_pFieldNames;
244 :
245 : static void _GetFieldName(); ///< Sets up FieldNames; fldmgr.cxx!
246 :
247 : protected:
248 : /// Single argument ctors shall be explicit.
249 : explicit SwFieldType( sal_uInt16 nWhichId );
250 :
251 : public:
252 :
253 : SAL_DLLPRIVATE ::com::sun::star::uno::WeakReference<
254 1880 : ::com::sun::star::beans::XPropertySet> const& GetXObject() const
255 1880 : { return m_wXFieldMaster; }
256 1880 : SAL_DLLPRIVATE void SetXObject(::com::sun::star::uno::Reference<
257 : ::com::sun::star::beans::XPropertySet> const& xFieldMaster)
258 1880 : { m_wXFieldMaster = xFieldMaster; }
259 :
260 : static OUString GetTypeStr( sal_uInt16 nTypeId );
261 :
262 : /// Only in derived classes.
263 : virtual OUString GetName() const;
264 : virtual SwFieldType* Copy() const = 0;
265 : virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
266 : virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
267 :
268 674326 : sal_uInt16 Which() const { return m_nWhich; }
269 :
270 : inline void UpdateFields() const;
271 : };
272 :
273 20226 : inline void SwFieldType::UpdateFields() const
274 : {
275 20226 : const_cast<SwFieldType*>(this)->ModifyNotification( 0, 0 );
276 20226 : }
277 :
278 : /** Base class of all fields.
279 : Type of field is queried via Which.
280 : Expanded content of field is queried via Expand(). */
281 4 : class SW_DLLPUBLIC SwField
282 : {
283 : private:
284 : mutable OUString m_Cache; ///< Cached expansion (for clipboard).
285 : bool m_bUseFieldValueCache; /// control the usage of the cached field value
286 :
287 : sal_uInt16 m_nLang; ///< Always change via SetLanguage!
288 : bool m_bIsAutomaticLanguage;
289 : sal_uInt32 m_nFormat;
290 :
291 : SwFieldType* m_pType;
292 :
293 : virtual OUString Expand() const = 0;
294 : virtual SwField* Copy() const = 0;
295 :
296 : protected:
297 256 : void SetFormat(sal_uInt32 const nSet) { m_nFormat = nSet; }
298 :
299 : SwField( SwFieldType* pTyp,
300 : sal_uInt32 nFormat = 0,
301 : sal_uInt16 nLang = LANGUAGE_SYSTEM,
302 : bool m_bUseFieldValueCache = true );
303 :
304 : public:
305 : virtual ~SwField();
306 :
307 : inline SwFieldType* GetTyp() const;
308 :
309 : /// Set new type (used for copying among documents).
310 : virtual SwFieldType* ChgTyp( SwFieldType* );
311 :
312 : /** expand the field.
313 : @param bCached return cached field value.
314 : @remark most callers should use the cached field value.
315 : this is because various fields need special handing
316 : (ChangeExpansion()) to return correct values, and only
317 : SwTextFormatter::NewFieldPortion() sets things up properly.
318 : @return the generated text (suitable for display)
319 : */
320 : OUString ExpandField(bool const bCached, ToxAuthorityField eField = AUTH_FIELD_IDENTIFIER) const;
321 :
322 : OUString ExpandCitation(ToxAuthorityField eField = AUTH_FIELD_IDENTIFIER) const;
323 :
324 : /// @return name or content.
325 : virtual OUString GetFieldName() const;
326 :
327 : SwField * CopyField() const;
328 :
329 : /// ResId
330 2134 : sal_uInt16 Which() const
331 : #ifdef DBG_UTIL
332 : ; // implemented in fldbas.cxx
333 : #else
334 2134 : { return m_pType->Which(); }
335 : #endif
336 :
337 : // TYP_ID
338 : sal_uInt16 GetTypeId() const;
339 : virtual sal_uInt16 GetSubType() const;
340 : virtual void SetSubType(sal_uInt16);
341 :
342 : /// Language at field position.
343 : inline sal_uInt16 GetLanguage() const;
344 : virtual void SetLanguage(sal_uInt16 nLng);
345 :
346 : /// Query parameters for dialog and for BASIC.
347 : inline sal_uInt32 GetFormat() const;
348 : virtual OUString GetPar1() const;
349 : virtual OUString GetPar2() const;
350 :
351 : virtual OUString GetFormula() const;
352 :
353 : void ChangeFormat(sal_uInt32 n);
354 : virtual void SetPar1(const OUString& rStr);
355 : virtual void SetPar2(const OUString& rStr);
356 :
357 : virtual bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId ) const;
358 : virtual bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhichId );
359 :
360 : /// Does the field possess an action on its ClickHandler? (e.g. INetFields, ...).
361 : bool HasClickHdl() const;
362 : bool IsFixed() const;
363 :
364 1294 : bool IsAutomaticLanguage() const { return m_bIsAutomaticLanguage;}
365 1554 : void SetAutomaticLanguage(bool const bSet) {m_bIsAutomaticLanguage = bSet;}
366 :
367 : virtual OUString GetDescription() const;
368 : /// Is this field clickable?
369 : bool IsClickable() const;
370 : };
371 :
372 197896 : inline SwFieldType* SwField::GetTyp() const
373 197896 : { return m_pType; }
374 :
375 15384 : inline sal_uInt32 SwField::GetFormat() const
376 15384 : { return m_nFormat; }
377 :
378 10048 : inline sal_uInt16 SwField::GetLanguage() const
379 10048 : { return m_nLang; }
380 :
381 : /// Fields containing values that have to be formatted via number formatter.
382 23919 : class SwValueFieldType : public SwFieldType
383 : {
384 : private:
385 : SwDoc* m_pDoc;
386 : bool m_bUseFormat; ///< Use number formatter.
387 :
388 : protected:
389 : SwValueFieldType( SwDoc* pDocPtr, sal_uInt16 nWhichId );
390 : SwValueFieldType( const SwValueFieldType& rTyp );
391 :
392 : public:
393 1921 : inline SwDoc* GetDoc() const { return m_pDoc; }
394 167 : inline void SetDoc(SwDoc* pNewDoc) { m_pDoc = pNewDoc; }
395 :
396 129 : inline bool UseFormat() const { return m_bUseFormat; }
397 12308 : inline void EnableFormat(bool bFormat = true) { m_bUseFormat = bFormat; }
398 :
399 : OUString ExpandValue(const double& rVal, sal_uInt32 nFormat, sal_uInt16 nLng=0) const;
400 : OUString DoubleToString(const double &rVal, LanguageType eLng) const;
401 : OUString DoubleToString(const double &rVal, sal_uInt32 nFormat) const;
402 : };
403 :
404 : class SW_DLLPUBLIC SwValueField : public SwField
405 : {
406 : private:
407 : double m_fValue;
408 :
409 : protected:
410 : SwValueField( SwValueFieldType* pFieldType, sal_uInt32 nFormat = 0, sal_uInt16 nLang = LANGUAGE_SYSTEM, const double fVal = 0.0 );
411 : SwValueField( const SwValueField& rField );
412 :
413 : public:
414 : virtual ~SwValueField();
415 :
416 : virtual SwFieldType* ChgTyp( SwFieldType* ) SAL_OVERRIDE;
417 : virtual void SetLanguage(sal_uInt16 nLng) SAL_OVERRIDE;
418 :
419 803 : inline SwDoc* GetDoc() const { return static_cast<const SwValueFieldType*>(GetTyp())->GetDoc(); }
420 :
421 : virtual double GetValue() const;
422 : virtual void SetValue( const double& rVal );
423 :
424 50 : inline OUString ExpandValue(const double& rVal, sal_uInt32 nFormat, sal_uInt16 nLng=0) const
425 50 : { return static_cast<SwValueFieldType*>(GetTyp())->ExpandValue(rVal, nFormat, nLng); }
426 :
427 : static sal_uInt32 GetSystemFormat(SvNumberFormatter* pFormatter, sal_uInt32 nFormat);
428 : };
429 :
430 339 : class SW_DLLPUBLIC SwFormulaField : public SwValueField
431 : {
432 : private:
433 : OUString m_sFormula;
434 :
435 : protected:
436 : SwFormulaField( SwValueFieldType* pFieldType, sal_uInt32 nFormat = 0, const double fVal = 0.0 );
437 : SwFormulaField( const SwFormulaField& rField );
438 :
439 : public:
440 : virtual OUString GetFormula() const SAL_OVERRIDE;
441 : void SetFormula(const OUString& rStr);
442 :
443 : void SetExpandedFormula(const OUString& rStr);
444 : OUString GetExpandedFormula() const;
445 : };
446 :
447 : #endif // INCLUDED_SW_INC_FLDBAS_HXX
448 :
449 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|