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_EXPFLD_HXX
24 #define SW_EXPFLD_HXX
25
26 #include <svl/svarray.hxx>
27 #include "swdllapi.h"
28 #include <fldbas.hxx>
29 #include <cellfml.hxx>
30
31 class SfxPoolItem;
32 class SwTxtNode;
33 class SwFrm;
34 struct SwPosition;
35 class SwTxtFld;
36 class SwDoc;
37 class SwFmtFld;
38 class _SetGetExpFlds;
39 class SwEditShell;
40
41 // Vorwaertsdeklaration: besorge den "Body-TextNode", fuer Exp.Fld in Fly's
42 // Header/Footers/Footnodes
43 const SwTxtNode* GetBodyTxtNode( const SwDoc& pDoc, SwPosition& rPos,
44 const SwFrm& rFrm );
45 // Wandlung Address -> Adressen
46 void ReplacePoint(String& sTmpName, sal_Bool bWithCommandType = sal_False);
47
48 struct _SeqFldLstElem
49 {
50 String sDlgEntry;
51 sal_uInt16 nSeqNo;
52
_SeqFldLstElem_SeqFldLstElem53 _SeqFldLstElem( const String& rStr, sal_uInt16 nNo )
54 : sDlgEntry( rStr ), nSeqNo( nNo )
55 {}
56 };
57 SV_DECL_PTRARR_DEL( _SwSeqFldList, _SeqFldLstElem*, 10, 10 )
58
59 class SW_DLLPUBLIC SwSeqFldList : public _SwSeqFldList
60 {
61 public:
SwSeqFldList()62 SwSeqFldList() : _SwSeqFldList( 10, 10 ) {}
63
64 sal_Bool InsertSort( _SeqFldLstElem* );
65 sal_Bool SeekEntry( const _SeqFldLstElem& , sal_uInt16* pPos = 0 );
66 };
67
68 /*--------------------------------------------------------------------
69 Beschreibung: Ausdruck
70 --------------------------------------------------------------------*/
71
72 class SwGetExpFieldType : public SwValueFieldType
73 {
74 public:
75 SwGetExpFieldType(SwDoc* pDoc);
76 virtual SwFieldType* Copy() const;
77
78 // ueberlagert, weil das Get-Field nicht veraendert werden kann
79 // und dann auch nicht aktualisiert werden muss. Aktualisierung
80 // erfolgt beim Aendern von Set-Werten !
81 protected:
82 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew );
83 };
84
85 /*--------------------------------------------------------------------
86 Beschreibung: GetExperession
87 --------------------------------------------------------------------*/
88
89 class SW_DLLPUBLIC SwGetExpField : public SwFormulaField
90 {
91 String sExpand;
92 sal_Bool bIsInBodyTxt;
93 sal_uInt16 nSubType;
94
95 bool bLateInitialization; // #i82544#
96
97 virtual String Expand() const;
98 virtual SwField* Copy() const;
99
100 public:
101 SwGetExpField( SwGetExpFieldType*, const String& rFormel,
102 sal_uInt16 nSubType = nsSwGetSetExpType::GSE_EXPR, sal_uLong nFmt = 0);
103
104 virtual void SetValue( const double& rVal );
105 virtual void SetLanguage(sal_uInt16 nLng);
106
107 inline const String& GetExpStr() const;
108 inline void ChgExpStr(const String& rExpand);
109
110 // wird von der Formatierung abgefragt
111 inline sal_Bool IsInBodyTxt() const;
112 // wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
113 inline void ChgBodyTxtFlag( sal_Bool bIsInBody );
114 // fuer Felder in Header/Footer/Footnotes/Flys:
115 // (wird nur von der Formatierung aufgerufen!!)
116 void ChangeExpansion( const SwFrm&, const SwTxtFld& );
117
118 virtual String GetFieldName() const;
119
120 // Die Formel aendern
121 virtual String GetPar2() const;
122 virtual void SetPar2(const String& rStr);
123
124 virtual sal_uInt16 GetSubType() const;
125 virtual void SetSubType(sal_uInt16 nType);
126 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
127 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
128
129 static sal_uInt16 GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc);
130 // #i82544#
SetLateInitialization()131 void SetLateInitialization() { bLateInitialization = true;}
132 };
133
ChgExpStr(const String & rExpand)134 inline void SwGetExpField::ChgExpStr(const String& rExpand)
135 { sExpand = rExpand;}
136
GetExpStr() const137 inline const String& SwGetExpField::GetExpStr() const
138 { return sExpand; }
139
140 // wird von der Formatierung abgefragt
IsInBodyTxt() const141 inline sal_Bool SwGetExpField::IsInBodyTxt() const
142 { return bIsInBodyTxt; }
143
144 // wird von UpdateExpFlds gesetzt (dort ist die Node-Position bekannt)
ChgBodyTxtFlag(sal_Bool bIsInBody)145 inline void SwGetExpField::ChgBodyTxtFlag( sal_Bool bIsInBody )
146 { bIsInBodyTxt = bIsInBody; }
147
148
149 /*--------------------------------------------------------------------
150 Beschreibung: Ausdruck setzen
151 --------------------------------------------------------------------*/
152
153 class SwSetExpField;
154
155 class SW_DLLPUBLIC SwSetExpFieldType : public SwValueFieldType
156 {
157 String sName;
158 const SwNode* pOutlChgNd;
159 String sDelim;
160 sal_uInt16 nType;
161 sal_uInt8 nLevel;
162 sal_Bool bDeleted;
163
164 protected:
165 virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew );
166
167 public:
168 SwSetExpFieldType( SwDoc* pDoc, const String& rName,
169 sal_uInt16 nType = nsSwGetSetExpType::GSE_EXPR );
170 virtual SwFieldType* Copy() const;
171 virtual const String& GetName() const;
172
173 inline void SetType(sal_uInt16 nTyp);
174 inline sal_uInt16 GetType() const;
175
176 void SetSeqFormat(sal_uLong nFormat);
177 sal_uLong GetSeqFormat();
178
IsDeleted() const179 sal_Bool IsDeleted() const { return bDeleted; }
SetDeleted(sal_Bool b)180 void SetDeleted( sal_Bool b ) { bDeleted = b; }
181
182 // ueberlagert, weil das Set-Field selbst dafuer sorgt, das
183 // es aktualisiert wird.
184 inline const String& GetSetRefName() const;
185
186 sal_uInt16 SetSeqRefNo( SwSetExpField& rFld );
187
188 sal_uInt16 GetSeqFldList( SwSeqFldList& rList );
189 String MakeSeqName( sal_uInt16 nSeqNo );
190
191 // Seqencefelder ggfs. Kapitelweise numerieren
192 // sal_Unicode GetDelimiter() const { return cDelim; }
193 // void SetDelimiter( sal_Unicode c ) { cDelim = c; }
GetDelimiter() const194 const String& GetDelimiter() const { return sDelim; }
SetDelimiter(const String & s)195 void SetDelimiter( const String& s ) { sDelim = s; }
GetOutlineLvl() const196 sal_uInt8 GetOutlineLvl() const { return nLevel; }
SetOutlineLvl(sal_uInt8 n)197 void SetOutlineLvl( sal_uInt8 n ) { nLevel = n; }
198 void SetChapter( SwSetExpField& rFld, const SwNode& rNd );
199 // Member nur fuers SwDoc::UpdateExpFld - wird nur waehrend der Laufzeit
200 // von SequencefeldTypen benoetigt!!!
GetOutlineChgNd() const201 const SwNode* GetOutlineChgNd() const { return pOutlChgNd; }
SetOutlineChgNd(const SwNode * p)202 void SetOutlineChgNd( const SwNode* p ) { pOutlChgNd = p; }
203
204 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
205 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
206 };
207
SetType(sal_uInt16 nTyp)208 inline void SwSetExpFieldType::SetType( sal_uInt16 nTyp )
209 {
210 nType = nTyp;
211 EnableFormat( !(nType & (nsSwGetSetExpType::GSE_SEQ|nsSwGetSetExpType::GSE_STRING)));
212 }
213
GetType() const214 inline sal_uInt16 SwSetExpFieldType::GetType() const
215 { return nType; }
216
GetSetRefName() const217 inline const String& SwSetExpFieldType::GetSetRefName() const
218 { return sName; }
219
220
221 /*--------------------------------------------------------------------
222 Beschreibung: Ausdruck
223 --------------------------------------------------------------------*/
224
225 class SW_DLLPUBLIC SwSetExpField : public SwFormulaField
226 {
227 String sExpand;
228 String aPText;
229 String aSeqText;
230 sal_Bool bInput;
231 sal_uInt16 nSeqNo;
232 sal_uInt16 nSubType;
233
234 virtual String Expand() const;
235 virtual SwField* Copy() const;
236
237 public:
238 SwSetExpField(SwSetExpFieldType*, const String& rFormel, sal_uLong nFmt = 0);
239
240 virtual void SetValue( const double& rVal );
241
242 inline const String& GetExpStr() const;
243
244 inline void ChgExpStr( const String& rExpand );
245
246 inline void SetPromptText(const String& rStr);
247 inline const String& GetPromptText() const;
248
249 inline void SetInputFlag(sal_Bool bInp);
250 inline sal_Bool GetInputFlag() const;
251
252 virtual String GetFieldName() const;
253
254 virtual sal_uInt16 GetSubType() const;
255 virtual void SetSubType(sal_uInt16 nType);
256
257 inline sal_Bool IsSequenceFld() const;
258
259 // fuer SequenceFelder - logische Nummer
SetSeqNumber(sal_uInt16 n)260 inline void SetSeqNumber( sal_uInt16 n ) { nSeqNo = n; }
GetSeqNumber() const261 inline sal_uInt16 GetSeqNumber() const { return nSeqNo; }
262
263 // Der Name nur erfragen
264 virtual const String& GetPar1() const;
265
266 // Die Formel
267 virtual String GetPar2() const;
268 virtual void SetPar2(const String& rStr);
269 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
270 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
271 };
272
GetExpStr() const273 inline const String& SwSetExpField::GetExpStr() const
274 { return sExpand; }
275
ChgExpStr(const String & rExpand)276 inline void SwSetExpField::ChgExpStr( const String& rExpand )
277 { sExpand = rExpand; }
278
SetPromptText(const String & rStr)279 inline void SwSetExpField::SetPromptText(const String& rStr)
280 { aPText = rStr; }
281
GetPromptText() const282 inline const String& SwSetExpField::GetPromptText() const
283 { return aPText; }
284
SetInputFlag(sal_Bool bInp)285 inline void SwSetExpField::SetInputFlag(sal_Bool bInp)
286 { bInput = bInp; }
287
GetInputFlag() const288 inline sal_Bool SwSetExpField::GetInputFlag() const
289 { return bInput; }
290
IsSequenceFld() const291 inline sal_Bool SwSetExpField::IsSequenceFld() const
292 { return 0 != (nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType*)GetTyp())->GetType()); }
293
294 /*--------------------------------------------------------------------
295 Beschreibung: Eingabe im Text/Variable setzen
296 --------------------------------------------------------------------*/
297
298 class SwInputFieldType : public SwFieldType
299 {
300 SwDoc* pDoc;
301 public:
302 SwInputFieldType( SwDoc* pDoc );
303
304 virtual SwFieldType* Copy() const;
305
GetDoc() const306 SwDoc* GetDoc() const { return pDoc; }
307 };
308
309 /*--------------------------------------------------------------------
310 Beschreibung: Eingabefeld
311 --------------------------------------------------------------------*/
312
313 class SW_DLLPUBLIC SwInputField : public SwField
314 {
315 mutable String aContent;
316 String aPText;
317 String aHelp;
318 String aToolTip;
319 sal_uInt16 nSubType;
320 bool mbIsFormField;
321
322 SwFmtFld* mpFmtFld; // attribute to which the <SwInputField> belongs to
323
324 virtual String Expand() const;
325 virtual SwField* Copy() const;
326
327 // Accessing Input Field's content
328 const String& getContent() const;
329
330 void LockNotifyContentChange();
331 void UnlockNotifyContentChange();
332
333 public:
334 // Direkte Eingabe ueber Dialog alten Wert loeschen
335 SwInputField(
336 SwInputFieldType* pFieldType,
337 const String& rContent,
338 const String& rPrompt,
339 sal_uInt16 nSubType = 0,
340 sal_uLong nFmt = 0,
341 bool bIsFormField = true );
342 virtual ~SwInputField();
343
344 void SetFmtFld( SwFmtFld& rFmtFld );
345 SwFmtFld* GetFmtFld();
346
347 // Providing new Input Field's content:
348 // Fill Input Field's content depending on <nSupType>.
349 void applyFieldContent( const String& rNewFieldContent );
350
351 bool isFormField() const;
352
353 virtual String GetFieldName() const;
354
355 // Content
356 virtual const String& GetPar1() const;
357 virtual void SetPar1(const String& rStr);
358
359 // aPromptText
360 virtual String GetPar2() const;
361 virtual void SetPar2(const String& rStr);
362
363 virtual String GetHelp() const;
364 virtual void SetHelp(const String & rStr);
365
366 virtual String GetToolTip() const;
367 virtual void SetToolTip(const String & rStr);
368
369 virtual sal_uInt16 GetSubType() const;
370 virtual void SetSubType(sal_uInt16 nSub);
371 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
372 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
373 };
374
375 /*--------------------------------------------------------------------
376 Description: Sorted list of input fields and DropDown fields
377 --------------------------------------------------------------------*/
378
379 class SwInputFieldList
380 {
381 public:
382 SwInputFieldList( SwEditShell* pShell, sal_Bool bBuildTmpLst = sal_False );
383 ~SwInputFieldList();
384
385 sal_uInt16 Count() const;
386 SwField* GetField(sal_uInt16 nId);
387
388 void GotoFieldPos(sal_uInt16 nId);
389 void PushCrsr();
390 void PopCrsr();
391
392 // vergleiche TmpLst mit akt Feldern. Alle neue kommen in die SortLst
393 // damit sie geupdatet werden koennen. Returnt die Anzahl.
394 // (Fuer Textbausteine: nur seine Input-Felder aktualisieren)
395 sal_uInt16 BuildSortLst();
396
397 // Alle unselektierten Felder aus Liste entfernen
398 void RemoveUnselectedFlds();
399
400 private:
401 SwEditShell* pSh;
402 _SetGetExpFlds* pSrtLst;
403 SvPtrarr aTmpLst;
404 };
405
406 /*--------------------------------------------------------------------
407 Beschreibung: Tabellen-Formelfeld
408 (Implementierung steht in tblcalc.cxx)
409 --------------------------------------------------------------------*/
410
411 class SwTblFieldType : public SwValueFieldType
412 {
413 public:
414 SwTblFieldType(SwDoc* pDocPtr);
415 virtual SwFieldType* Copy() const;
416 };
417
418
419 // MSC will den hier nicht
420 //typedef void (SwField:: *FnScanFormel)( const SwTable&, String&,
421 // String&, String* = 0, void* = 0 );
422
423
424 class SwTblField : public SwValueField, public SwTableFormula
425 {
426 String sExpand;
427 sal_uInt16 nSubType;
428
429 virtual String Expand() const;
430 virtual SwField* Copy() const;
431
432 // suche den TextNode, in dem das Feld steht
433 virtual const SwNode* GetNodeOfFormula() const;
434
435 String GetCommand();
436
437 public:
438 SwTblField( SwTblFieldType*, const String& rFormel,
439 sal_uInt16 nSubType = 0, sal_uLong nFmt = 0);
440
441 virtual void SetValue( const double& rVal );
442 virtual sal_uInt16 GetSubType() const;
443 virtual void SetSubType(sal_uInt16 nType);
444
GetExpStr() const445 const String& GetExpStr() const { return sExpand; }
ChgExpStr(const String & rStr)446 void ChgExpStr(const String& rStr) { sExpand = rStr; }
447
448 // berechne sich selbst
449 void CalcField( SwTblCalcPara& rCalcPara );
450
451 virtual String GetFieldName() const;
452
453 // Die Formel
454 virtual String GetPar2() const;
455 virtual void SetPar2(const String& rStr);
456 virtual sal_Bool QueryValue( com::sun::star::uno::Any& rVal, sal_uInt16 nWhich ) const;
457 virtual sal_Bool PutValue( const com::sun::star::uno::Any& rVal, sal_uInt16 nWhich );
458 };
459
460
461 #endif // SW_EXPFLD_HXX
462