1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5efeef26fSAndrew Rist * distributed with this work for additional information
6efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at
10efeef26fSAndrew Rist *
11efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist *
13efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist * software distributed under the License is distributed on an
15efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist * KIND, either express or implied. See the License for the
17efeef26fSAndrew Rist * specific language governing permissions and limitations
18efeef26fSAndrew Rist * under the License.
19efeef26fSAndrew Rist *
20efeef26fSAndrew Rist *************************************************************/
21efeef26fSAndrew Rist
22efeef26fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include <hintids.hxx>
29cdf0e10cSrcweir
30cdf0e10cSrcweir #include <string.h>
31cdf0e10cSrcweir #include <float.h>
32cdf0e10cSrcweir #include <tools/datetime.hxx>
33cdf0e10cSrcweir #ifndef _SVSTDARR_HXX
34cdf0e10cSrcweir #define _SVSTDARR_ULONGS
35cdf0e10cSrcweir #include <svl/svarray.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir #include <vcl/svapp.hxx>
38cdf0e10cSrcweir #include <vcl/svapp.hxx>
39cdf0e10cSrcweir #include <unotools/charclass.hxx>
40cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
41cdf0e10cSrcweir #include <doc.hxx>
42cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
43cdf0e10cSrcweir #include <cntfrm.hxx>
44cdf0e10cSrcweir #include <pam.hxx>
45cdf0e10cSrcweir #include <ndtxt.hxx>
46cdf0e10cSrcweir #include <swtable.hxx>
47cdf0e10cSrcweir #include <calc.hxx>
48cdf0e10cSrcweir #include <txtfld.hxx>
49cdf0e10cSrcweir #include <fmtfld.hxx>
50cdf0e10cSrcweir #include <tox.hxx>
51cdf0e10cSrcweir #include <txttxmrk.hxx>
52cdf0e10cSrcweir #include <docfld.hxx> // fuer Expression-Felder
53cdf0e10cSrcweir #include <docufld.hxx>
54cdf0e10cSrcweir #include <ddefld.hxx>
55cdf0e10cSrcweir #include <usrfld.hxx>
56cdf0e10cSrcweir #include <expfld.hxx>
57cdf0e10cSrcweir #include <dbfld.hxx>
58cdf0e10cSrcweir #include <flddat.hxx>
59cdf0e10cSrcweir #include <chpfld.hxx>
60cdf0e10cSrcweir #include <reffld.hxx>
61cdf0e10cSrcweir #include <flddropdown.hxx>
62cdf0e10cSrcweir #include <dbmgr.hxx>
63cdf0e10cSrcweir #include <section.hxx>
64cdf0e10cSrcweir #include <cellatr.hxx>
65cdf0e10cSrcweir #include <docary.hxx>
66cdf0e10cSrcweir #include <authfld.hxx>
67cdf0e10cSrcweir #include <txtinet.hxx>
68cdf0e10cSrcweir #include <fmtcntnt.hxx>
69cdf0e10cSrcweir #include <poolfmt.hrc> // fuer InitFldTypes
70cdf0e10cSrcweir
71cdf0e10cSrcweir #include <SwUndoField.hxx>
72cdf0e10cSrcweir #include "switerator.hxx"
73cdf0e10cSrcweir
74cdf0e10cSrcweir using namespace ::com::sun::star::uno;
75cdf0e10cSrcweir
76cdf0e10cSrcweir extern sal_Bool IsFrameBehind( const SwTxtNode& rMyNd, sal_uInt16 nMySttPos,
77cdf0e10cSrcweir const SwTxtNode& rBehindNd, sal_uInt16 nSttPos );
78cdf0e10cSrcweir
SV_IMPL_OP_PTRARR_SORT(_SetGetExpFlds,_SetGetExpFldPtr)79cdf0e10cSrcweir SV_IMPL_OP_PTRARR_SORT( _SetGetExpFlds, _SetGetExpFldPtr )
80cdf0e10cSrcweir
81cdf0e10cSrcweir
82cdf0e10cSrcweir /*--------------------------------------------------------------------
83cdf0e10cSrcweir Beschreibung: Feldtypen einfuegen
84cdf0e10cSrcweir --------------------------------------------------------------------*/
85cdf0e10cSrcweir /*
86cdf0e10cSrcweir * Implementierung der Feldfunktionen am Doc
87cdf0e10cSrcweir * Return immer einen gueltigen Pointer auf den Typ. Wenn er also neu
88cdf0e10cSrcweir * zugefuegt oder schon vorhanden ist.
89cdf0e10cSrcweir */
90cdf0e10cSrcweir
91cdf0e10cSrcweir SwFieldType* SwDoc::InsertFldType(const SwFieldType &rFldTyp)
92cdf0e10cSrcweir {
93cdf0e10cSrcweir sal_uInt16 nSize = pFldTypes->Count(),
94cdf0e10cSrcweir nFldWhich = rFldTyp.Which();
95cdf0e10cSrcweir
96cdf0e10cSrcweir sal_uInt16 i = INIT_FLDTYPES;
97cdf0e10cSrcweir
98cdf0e10cSrcweir switch( nFldWhich )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir case RES_SETEXPFLD:
101cdf0e10cSrcweir //JP 29.01.96: SequenceFelder beginnen aber bei INIT_FLDTYPES - 3!!
102cdf0e10cSrcweir // Sonst gibt es doppelte Nummernkreise!!
103cdf0e10cSrcweir //MIB 14.03.95: Ab sofort verlaesst sich auch der SW3-Reader
104cdf0e10cSrcweir //beim Aufbau der String-Pools und beim Einlesen von SetExp-Feldern
105cdf0e10cSrcweir //hierauf
106cdf0e10cSrcweir if( nsSwGetSetExpType::GSE_SEQ & ((SwSetExpFieldType&)rFldTyp).GetType() )
107cdf0e10cSrcweir i -= INIT_SEQ_FLDTYPES;
108cdf0e10cSrcweir // kein break;
109cdf0e10cSrcweir case RES_DBFLD:
110cdf0e10cSrcweir case RES_USERFLD:
111cdf0e10cSrcweir case RES_DDEFLD:
112cdf0e10cSrcweir {
113cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
114cdf0e10cSrcweir String sFldNm( rFldTyp.GetName() );
115cdf0e10cSrcweir for( ; i < nSize; ++i )
116cdf0e10cSrcweir if( nFldWhich == (*pFldTypes)[i]->Which() &&
117cdf0e10cSrcweir rSCmp.isEqual( sFldNm, (*pFldTypes)[i]->GetName() ))
118cdf0e10cSrcweir return (*pFldTypes)[i];
119cdf0e10cSrcweir }
120cdf0e10cSrcweir break;
121cdf0e10cSrcweir
122cdf0e10cSrcweir case RES_AUTHORITY:
123cdf0e10cSrcweir for( ; i < nSize; ++i )
124cdf0e10cSrcweir if( nFldWhich == (*pFldTypes)[i]->Which() )
125cdf0e10cSrcweir return (*pFldTypes)[i];
126cdf0e10cSrcweir break;
127cdf0e10cSrcweir
128cdf0e10cSrcweir default:
129cdf0e10cSrcweir for( i = 0; i < nSize; ++i )
130cdf0e10cSrcweir if( nFldWhich == (*pFldTypes)[i]->Which() )
131cdf0e10cSrcweir return (*pFldTypes)[i];
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
134cdf0e10cSrcweir SwFieldType* pNew = rFldTyp.Copy();
135cdf0e10cSrcweir switch( nFldWhich )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir case RES_DDEFLD:
138cdf0e10cSrcweir ((SwDDEFieldType*)pNew)->SetDoc( this );
139cdf0e10cSrcweir break;
140cdf0e10cSrcweir
141cdf0e10cSrcweir case RES_DBFLD:
142cdf0e10cSrcweir case RES_TABLEFLD:
143cdf0e10cSrcweir case RES_DATETIMEFLD:
144cdf0e10cSrcweir case RES_GETEXPFLD:
145cdf0e10cSrcweir ((SwValueFieldType*)pNew)->SetDoc( this );
146cdf0e10cSrcweir break;
147cdf0e10cSrcweir
148cdf0e10cSrcweir case RES_USERFLD:
149cdf0e10cSrcweir case RES_SETEXPFLD:
150cdf0e10cSrcweir ((SwValueFieldType*)pNew)->SetDoc( this );
151cdf0e10cSrcweir // JP 29.07.96: opt. FeldListe fuer den Calculator vorbereiten:
152cdf0e10cSrcweir pUpdtFlds->InsertFldType( *pNew );
153cdf0e10cSrcweir break;
154cdf0e10cSrcweir case RES_AUTHORITY :
155cdf0e10cSrcweir ((SwAuthorityFieldType*)pNew)->SetDoc( this );
156cdf0e10cSrcweir break;
157cdf0e10cSrcweir }
158cdf0e10cSrcweir
159cdf0e10cSrcweir pFldTypes->Insert( pNew, nSize );
160cdf0e10cSrcweir SetModified();
161cdf0e10cSrcweir
162cdf0e10cSrcweir return (*pFldTypes)[ nSize ];
163cdf0e10cSrcweir }
164cdf0e10cSrcweir
InsDeletedFldType(SwFieldType & rFldTyp)165cdf0e10cSrcweir void SwDoc::InsDeletedFldType( SwFieldType& rFldTyp )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir // der FeldTyp wurde als geloescht gekennzeichnet und aus dem
168cdf0e10cSrcweir // Array entfernt. Nun muss man nach diesem wieder suchen.
169cdf0e10cSrcweir // - Ist der nicht vorhanden, dann kann er eingefuegt werden.
170cdf0e10cSrcweir // - Wird genau der gleiche Typ gefunden, dann muss der geloeschte
171cdf0e10cSrcweir // einen anderen Namen erhalten.
172cdf0e10cSrcweir
173cdf0e10cSrcweir sal_uInt16 nSize = pFldTypes->Count(), nFldWhich = rFldTyp.Which();
174cdf0e10cSrcweir sal_uInt16 i = INIT_FLDTYPES;
175cdf0e10cSrcweir
176cdf0e10cSrcweir ASSERT( RES_SETEXPFLD == nFldWhich ||
177cdf0e10cSrcweir RES_USERFLD == nFldWhich ||
178cdf0e10cSrcweir RES_DDEFLD == nFldWhich, "Falscher FeldTyp" );
179cdf0e10cSrcweir
180cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
181cdf0e10cSrcweir const String& rFldNm = rFldTyp.GetName();
182cdf0e10cSrcweir SwFieldType* pFnd;
183cdf0e10cSrcweir
184cdf0e10cSrcweir for( ; i < nSize; ++i )
185cdf0e10cSrcweir if( nFldWhich == (pFnd = (*pFldTypes)[i])->Which() &&
186cdf0e10cSrcweir rSCmp.isEqual( rFldNm, pFnd->GetName() ) )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir // neuen Namen suchen
189cdf0e10cSrcweir sal_uInt16 nNum = 1;
190cdf0e10cSrcweir do {
191cdf0e10cSrcweir String sSrch( rFldNm );
192cdf0e10cSrcweir sSrch.Append( String::CreateFromInt32( nNum ));
193cdf0e10cSrcweir for( i = INIT_FLDTYPES; i < nSize; ++i )
194cdf0e10cSrcweir if( nFldWhich == (pFnd = (*pFldTypes)[i])->Which() &&
195cdf0e10cSrcweir rSCmp.isEqual( sSrch, pFnd->GetName() ) )
196cdf0e10cSrcweir break;
197cdf0e10cSrcweir
198cdf0e10cSrcweir if( i >= nSize ) // nicht gefunden
199cdf0e10cSrcweir {
200cdf0e10cSrcweir ((String&)rFldNm) = sSrch;
201cdf0e10cSrcweir break; // raus aus der While-Schleife
202cdf0e10cSrcweir }
203cdf0e10cSrcweir ++nNum;
204cdf0e10cSrcweir } while( sal_True );
205cdf0e10cSrcweir break;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir
208cdf0e10cSrcweir // nicht gefunden, also eintragen und Flag loeschen
209cdf0e10cSrcweir pFldTypes->Insert( &rFldTyp, nSize );
210cdf0e10cSrcweir switch( nFldWhich )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir case RES_SETEXPFLD:
213cdf0e10cSrcweir ((SwSetExpFieldType&)rFldTyp).SetDeleted( sal_False );
214cdf0e10cSrcweir break;
215cdf0e10cSrcweir case RES_USERFLD:
216cdf0e10cSrcweir ((SwUserFieldType&)rFldTyp).SetDeleted( sal_False );
217cdf0e10cSrcweir break;
218cdf0e10cSrcweir case RES_DDEFLD:
219cdf0e10cSrcweir ((SwDDEFieldType&)rFldTyp).SetDeleted( sal_False );
220cdf0e10cSrcweir break;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir }
223cdf0e10cSrcweir
224cdf0e10cSrcweir /*--------------------------------------------------------------------
225cdf0e10cSrcweir Beschreibung: Feldtypen loeschen
226cdf0e10cSrcweir --------------------------------------------------------------------*/
227cdf0e10cSrcweir
RemoveFldType(sal_uInt16 nFld)228cdf0e10cSrcweir void SwDoc::RemoveFldType(sal_uInt16 nFld)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir ASSERT( INIT_FLDTYPES <= nFld, "keine InitFields loeschen" );
231cdf0e10cSrcweir /*
232cdf0e10cSrcweir * Abheangige Felder vorhanden -> ErrRaise
233cdf0e10cSrcweir */
234cdf0e10cSrcweir sal_uInt16 nSize = pFldTypes->Count();
235cdf0e10cSrcweir if(nFld < nSize)
236cdf0e10cSrcweir {
237cdf0e10cSrcweir SwFieldType* pTmp = (*pFldTypes)[nFld];
238cdf0e10cSrcweir
239cdf0e10cSrcweir // JP 29.07.96: opt. FeldListe fuer den Calculator vorbereiten:
240cdf0e10cSrcweir sal_uInt16 nWhich = pTmp->Which();
241cdf0e10cSrcweir switch( nWhich )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir case RES_SETEXPFLD:
244cdf0e10cSrcweir case RES_USERFLD:
245cdf0e10cSrcweir pUpdtFlds->RemoveFldType( *pTmp );
246cdf0e10cSrcweir // kein break;
247cdf0e10cSrcweir case RES_DDEFLD:
248cdf0e10cSrcweir if( pTmp->GetDepends() && !IsUsed( *pTmp ) )
249cdf0e10cSrcweir {
250cdf0e10cSrcweir if( RES_SETEXPFLD == nWhich )
251cdf0e10cSrcweir ((SwSetExpFieldType*)pTmp)->SetDeleted( sal_True );
252cdf0e10cSrcweir else if( RES_USERFLD == nWhich )
253cdf0e10cSrcweir ((SwUserFieldType*)pTmp)->SetDeleted( sal_True );
254cdf0e10cSrcweir else
255cdf0e10cSrcweir ((SwDDEFieldType*)pTmp)->SetDeleted( sal_True );
256cdf0e10cSrcweir nWhich = 0;
257cdf0e10cSrcweir }
258cdf0e10cSrcweir break;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir
261cdf0e10cSrcweir if( nWhich )
262cdf0e10cSrcweir {
263cdf0e10cSrcweir ASSERT( !pTmp->GetDepends(), "Abhaengige vorh.!" );
264cdf0e10cSrcweir // Feldtype loschen
265cdf0e10cSrcweir delete pTmp;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir pFldTypes->Remove( nFld );
268cdf0e10cSrcweir SetModified();
269cdf0e10cSrcweir }
270cdf0e10cSrcweir }
271cdf0e10cSrcweir
GetFldTypes() const272cdf0e10cSrcweir const SwFldTypes* SwDoc::GetFldTypes() const
273cdf0e10cSrcweir {
274cdf0e10cSrcweir return pFldTypes;
275cdf0e10cSrcweir }
276cdf0e10cSrcweir
277cdf0e10cSrcweir /*--------------------------------------------------------------------
278cdf0e10cSrcweir Beschreibung: Den ersten Typen mit ResId und Namen finden
279cdf0e10cSrcweir --------------------------------------------------------------------*/
280cdf0e10cSrcweir
GetFldType(sal_uInt16 nResId,const String & rName,bool bDbFieldMatching) const281dec99bbdSOliver-Rainer Wittmann SwFieldType* SwDoc::GetFldType(
282dec99bbdSOliver-Rainer Wittmann sal_uInt16 nResId,
283dec99bbdSOliver-Rainer Wittmann const String& rName,
284dec99bbdSOliver-Rainer Wittmann bool bDbFieldMatching // used in some UNO calls for RES_DBFLD to use different string matching code #i51815#
285dec99bbdSOliver-Rainer Wittmann ) const
286cdf0e10cSrcweir {
287cdf0e10cSrcweir sal_uInt16 nSize = pFldTypes->Count(), i = 0;
288cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
289cdf0e10cSrcweir
290cdf0e10cSrcweir switch( nResId )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir case RES_SETEXPFLD:
293cdf0e10cSrcweir //JP 29.01.96: SequenceFelder beginnen aber bei INIT_FLDTYPES - 3!!
294cdf0e10cSrcweir // Sonst gibt es doppelte Nummernkreise!!
295cdf0e10cSrcweir //MIB 14.03.95: Ab sofort verlaesst sich auch der SW3-Reader
296cdf0e10cSrcweir //beim Aufbau der String-Pools und beim Einlesen von SetExp-Feldern
297cdf0e10cSrcweir //hierauf
298cdf0e10cSrcweir i = INIT_FLDTYPES - INIT_SEQ_FLDTYPES;
299cdf0e10cSrcweir break;
300cdf0e10cSrcweir
301cdf0e10cSrcweir case RES_DBFLD:
302cdf0e10cSrcweir case RES_USERFLD:
303cdf0e10cSrcweir case RES_DDEFLD:
304cdf0e10cSrcweir case RES_AUTHORITY:
305cdf0e10cSrcweir i = INIT_FLDTYPES;
306cdf0e10cSrcweir break;
307cdf0e10cSrcweir }
308cdf0e10cSrcweir
309cdf0e10cSrcweir SwFieldType* pRet = 0;
310cdf0e10cSrcweir for( ; i < nSize; ++i )
311cdf0e10cSrcweir {
312cdf0e10cSrcweir SwFieldType* pFldType = (*pFldTypes)[i];
313cdf0e10cSrcweir
314cdf0e10cSrcweir String aFldName( pFldType->GetName() );
315cdf0e10cSrcweir if (bDbFieldMatching && nResId == RES_DBFLD) // #i51815#
316cdf0e10cSrcweir aFldName.SearchAndReplaceAll(DB_DELIM, '.');
317cdf0e10cSrcweir
318cdf0e10cSrcweir if( nResId == pFldType->Which() &&
319cdf0e10cSrcweir rSCmp.isEqual( rName, aFldName ))
320cdf0e10cSrcweir {
321cdf0e10cSrcweir pRet = pFldType;
322cdf0e10cSrcweir break;
323cdf0e10cSrcweir }
324cdf0e10cSrcweir }
325cdf0e10cSrcweir return pRet;
326cdf0e10cSrcweir }
327cdf0e10cSrcweir
328cdf0e10cSrcweir
329cdf0e10cSrcweir /*************************************************************************
330cdf0e10cSrcweir |* SwDoc::UpdateFlds()
331cdf0e10cSrcweir |* Beschreibung Felder updaten
332cdf0e10cSrcweir *************************************************************************/
333cdf0e10cSrcweir /*
334cdf0e10cSrcweir * Alle sollen neu evaluiert werden.
335cdf0e10cSrcweir */
336cdf0e10cSrcweir
UpdateFlds(SfxPoolItem * pNewHt,bool bCloseDB)337cdf0e10cSrcweir void SwDoc::UpdateFlds( SfxPoolItem *pNewHt, bool bCloseDB )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir // Modify() fuer jeden Feldtypen rufen,
340cdf0e10cSrcweir // abhaengige SwTxtFld werden benachrichtigt ...
341cdf0e10cSrcweir
342cdf0e10cSrcweir for( sal_uInt16 i=0; i < pFldTypes->Count(); ++i)
343cdf0e10cSrcweir {
344cdf0e10cSrcweir switch( (*pFldTypes)[i]->Which() )
345cdf0e10cSrcweir {
346cdf0e10cSrcweir // Tabellen-Felder als vorletztes Updaten
347cdf0e10cSrcweir // Referenzen als letztes Updaten
348cdf0e10cSrcweir case RES_GETREFFLD:
349cdf0e10cSrcweir case RES_TABLEFLD:
350cdf0e10cSrcweir case RES_DBFLD:
351cdf0e10cSrcweir case RES_JUMPEDITFLD:
352cdf0e10cSrcweir case RES_REFPAGESETFLD: // werden nie expandiert!
353cdf0e10cSrcweir break;
354cdf0e10cSrcweir
355cdf0e10cSrcweir case RES_DDEFLD:
356cdf0e10cSrcweir {
357cdf0e10cSrcweir if( !pNewHt )
358cdf0e10cSrcweir {
359cdf0e10cSrcweir SwMsgPoolItem aUpdateDDE( RES_UPDATEDDETBL );
360cdf0e10cSrcweir (*pFldTypes)[i]->ModifyNotification( 0, &aUpdateDDE );
361cdf0e10cSrcweir }
362cdf0e10cSrcweir else
363cdf0e10cSrcweir (*pFldTypes)[i]->ModifyNotification( 0, pNewHt );
364cdf0e10cSrcweir break;
365cdf0e10cSrcweir }
366cdf0e10cSrcweir case RES_GETEXPFLD:
367cdf0e10cSrcweir case RES_SETEXPFLD:
368cdf0e10cSrcweir case RES_HIDDENTXTFLD:
369cdf0e10cSrcweir case RES_HIDDENPARAFLD:
370cdf0e10cSrcweir // Expression-Felder werden gesondert behandelt
371cdf0e10cSrcweir if( !pNewHt )
372cdf0e10cSrcweir break;
373cdf0e10cSrcweir default:
374cdf0e10cSrcweir (*pFldTypes)[i]->ModifyNotification ( 0, pNewHt );
375cdf0e10cSrcweir }
376cdf0e10cSrcweir }
377cdf0e10cSrcweir
378cdf0e10cSrcweir if( !IsExpFldsLocked() )
379cdf0e10cSrcweir UpdateExpFlds( 0, sal_False ); // Expression-Felder Updaten
380cdf0e10cSrcweir
381cdf0e10cSrcweir // Tabellen
382cdf0e10cSrcweir UpdateTblFlds(pNewHt);
383cdf0e10cSrcweir
384cdf0e10cSrcweir // Referenzen
385cdf0e10cSrcweir UpdateRefFlds(pNewHt);
386cdf0e10cSrcweir
387cdf0e10cSrcweir if( bCloseDB )
388cdf0e10cSrcweir GetNewDBMgr()->CloseAll();
389cdf0e10cSrcweir
390cdf0e10cSrcweir // Nur bei KomplettUpdate evaluieren
391cdf0e10cSrcweir SetModified();
392cdf0e10cSrcweir }
393cdf0e10cSrcweir
394cdf0e10cSrcweir /******************************************************************************
395cdf0e10cSrcweir * void SwDoc::UpdateUsrFlds()
396cdf0e10cSrcweir ******************************************************************************/
397cdf0e10cSrcweir
UpdateUsrFlds()398cdf0e10cSrcweir void SwDoc::UpdateUsrFlds()
399cdf0e10cSrcweir {
400cdf0e10cSrcweir SwCalc* pCalc = 0;
401cdf0e10cSrcweir const SwFieldType* pFldType;
402cdf0e10cSrcweir for( sal_uInt16 i = INIT_FLDTYPES; i < pFldTypes->Count(); ++i )
403cdf0e10cSrcweir if( RES_USERFLD == ( pFldType = (*pFldTypes)[i] )->Which() )
404cdf0e10cSrcweir {
405cdf0e10cSrcweir if( !pCalc )
406cdf0e10cSrcweir pCalc = new SwCalc( *this );
407cdf0e10cSrcweir ((SwUserFieldType*)pFldType)->GetValue( *pCalc );
408cdf0e10cSrcweir }
409cdf0e10cSrcweir
410cdf0e10cSrcweir if( pCalc )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir delete pCalc;
413cdf0e10cSrcweir SetModified();
414cdf0e10cSrcweir }
415cdf0e10cSrcweir }
416cdf0e10cSrcweir
417cdf0e10cSrcweir /*--------------------------------------------------------------------
418cdf0e10cSrcweir Beschreibung: Referenzfelder und TableFelder erneuern
419cdf0e10cSrcweir --------------------------------------------------------------------*/
420cdf0e10cSrcweir
UpdateRefFlds(SfxPoolItem * pHt)421cdf0e10cSrcweir void SwDoc::UpdateRefFlds( SfxPoolItem* pHt )
422cdf0e10cSrcweir {
423cdf0e10cSrcweir SwFieldType* pFldType;
424cdf0e10cSrcweir for( sal_uInt16 i = 0; i < pFldTypes->Count(); ++i )
425cdf0e10cSrcweir if( RES_GETREFFLD == ( pFldType = (*pFldTypes)[i] )->Which() )
426cdf0e10cSrcweir pFldType->ModifyNotification( 0, pHt );
427cdf0e10cSrcweir }
428cdf0e10cSrcweir
UpdateTblFlds(SfxPoolItem * pHt)429cdf0e10cSrcweir void SwDoc::UpdateTblFlds( SfxPoolItem* pHt )
430cdf0e10cSrcweir {
431cdf0e10cSrcweir ASSERT( !pHt || RES_TABLEFML_UPDATE == pHt->Which(),
432cdf0e10cSrcweir "Was ist das fuer ein MessageItem?" );
433cdf0e10cSrcweir
434cdf0e10cSrcweir SwFieldType* pFldType(0);
435cdf0e10cSrcweir
436cdf0e10cSrcweir for (sal_uInt16 i = 0; i < pFldTypes->Count(); ++i)
437cdf0e10cSrcweir {
438cdf0e10cSrcweir if( RES_TABLEFLD == ( pFldType = (*pFldTypes)[i] )->Which() )
439cdf0e10cSrcweir {
440cdf0e10cSrcweir SwTableFmlUpdate* pUpdtFld = 0;
441cdf0e10cSrcweir if( pHt && RES_TABLEFML_UPDATE == pHt->Which() )
442cdf0e10cSrcweir pUpdtFld = (SwTableFmlUpdate*)pHt;
443cdf0e10cSrcweir
444cdf0e10cSrcweir SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
445cdf0e10cSrcweir for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir if( pFmtFld->GetTxtFld() )
448cdf0e10cSrcweir {
449c0286415SOliver-Rainer Wittmann SwTblField* pFld = (SwTblField*)pFmtFld->GetField();
450cdf0e10cSrcweir
451cdf0e10cSrcweir if( pUpdtFld )
452cdf0e10cSrcweir {
453cdf0e10cSrcweir // bestimme Tabelle, in der das Feld steht
454cdf0e10cSrcweir const SwTableNode* pTblNd;
455cdf0e10cSrcweir const SwTxtNode& rTxtNd = pFmtFld->GetTxtFld()->GetTxtNode();
456cdf0e10cSrcweir if( !rTxtNd.GetNodes().IsDocNodes() ||
457cdf0e10cSrcweir 0 == ( pTblNd = rTxtNd.FindTableNode() ) )
458cdf0e10cSrcweir continue;
459cdf0e10cSrcweir
460cdf0e10cSrcweir switch( pUpdtFld->eFlags )
461cdf0e10cSrcweir {
462cdf0e10cSrcweir case TBL_CALC:
463cdf0e10cSrcweir // setze das Value-Flag zurueck
464cdf0e10cSrcweir // JP 17.06.96: interne Darstellung auf alle Formeln
465cdf0e10cSrcweir // (Referenzen auf andere Tabellen!!!)
466cdf0e10cSrcweir if( nsSwExtendedSubType::SUB_CMD & pFld->GetSubType() )
467cdf0e10cSrcweir pFld->PtrToBoxNm( pUpdtFld->pTbl );
468cdf0e10cSrcweir else
469cdf0e10cSrcweir pFld->ChgValid( sal_False );
470cdf0e10cSrcweir break;
471cdf0e10cSrcweir case TBL_BOXNAME:
472cdf0e10cSrcweir // ist es die gesuchte Tabelle ??
473cdf0e10cSrcweir if( &pTblNd->GetTable() == pUpdtFld->pTbl )
474cdf0e10cSrcweir // zur externen Darstellung
475cdf0e10cSrcweir pFld->PtrToBoxNm( pUpdtFld->pTbl );
476cdf0e10cSrcweir break;
477cdf0e10cSrcweir case TBL_BOXPTR:
478cdf0e10cSrcweir // zur internen Darstellung
479cdf0e10cSrcweir // JP 17.06.96: interne Darstellung auf alle Formeln
480cdf0e10cSrcweir // (Referenzen auf andere Tabellen!!!)
481cdf0e10cSrcweir pFld->BoxNmToPtr( pUpdtFld->pTbl );
482cdf0e10cSrcweir break;
483cdf0e10cSrcweir case TBL_RELBOXNAME:
484cdf0e10cSrcweir // ist es die gesuchte Tabelle ??
485cdf0e10cSrcweir if( &pTblNd->GetTable() == pUpdtFld->pTbl )
486cdf0e10cSrcweir // zur relativen Darstellung
487cdf0e10cSrcweir pFld->ToRelBoxNm( pUpdtFld->pTbl );
488cdf0e10cSrcweir break;
489cdf0e10cSrcweir default:
490cdf0e10cSrcweir break;
491cdf0e10cSrcweir }
492cdf0e10cSrcweir }
493cdf0e10cSrcweir else
494cdf0e10cSrcweir // setze bei allen das Value-Flag zurueck
495cdf0e10cSrcweir pFld->ChgValid( sal_False );
496cdf0e10cSrcweir }
497cdf0e10cSrcweir }
498cdf0e10cSrcweir
499cdf0e10cSrcweir break;
500cdf0e10cSrcweir }
501cdf0e10cSrcweir pFldType = 0;
502cdf0e10cSrcweir }
503cdf0e10cSrcweir
504cdf0e10cSrcweir // und dann noch alle Tabellen Box Formeln abklappern
505cdf0e10cSrcweir const SfxPoolItem* pItem;
506cdf0e10cSrcweir sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_BOXATR_FORMULA );
507cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nMaxItems; ++i)
508cdf0e10cSrcweir {
509cdf0e10cSrcweir if( 0 != (pItem = GetAttrPool().GetItem2( RES_BOXATR_FORMULA, i ) ) &&
510cdf0e10cSrcweir ((SwTblBoxFormula*)pItem)->GetDefinedIn() )
511cdf0e10cSrcweir {
512cdf0e10cSrcweir ((SwTblBoxFormula*)pItem)->ChangeState( pHt );
513cdf0e10cSrcweir }
514cdf0e10cSrcweir }
515cdf0e10cSrcweir
516cdf0e10cSrcweir
517cdf0e10cSrcweir // alle Felder/Boxen sind jetzt invalide, also kann das Rechnen anfangen
518cdf0e10cSrcweir if( pHt && ( RES_TABLEFML_UPDATE != pHt->Which() ||
519cdf0e10cSrcweir TBL_CALC != ((SwTableFmlUpdate*)pHt)->eFlags ))
520cdf0e10cSrcweir return ;
521cdf0e10cSrcweir
522cdf0e10cSrcweir SwCalc* pCalc = 0;
523cdf0e10cSrcweir
524cdf0e10cSrcweir if( pFldType )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
527cdf0e10cSrcweir for( SwFmtFld* pFmtFld = aIter.Last(); pFmtFld; pFmtFld = aIter.Previous() )
528cdf0e10cSrcweir {
529cdf0e10cSrcweir // start calculation at the end
530cdf0e10cSrcweir // new fields are inserted at the beginning of the modify chain
531cdf0e10cSrcweir // that gives faster calculation on import
532cdf0e10cSrcweir // mba: do we really need this "optimization"? Is it still valid?
533cdf0e10cSrcweir SwTblField* pFld;
534cdf0e10cSrcweir if( !pFmtFld->GetTxtFld() || (nsSwExtendedSubType::SUB_CMD &
535c0286415SOliver-Rainer Wittmann (pFld = (SwTblField*)pFmtFld->GetField())->GetSubType() ))
536cdf0e10cSrcweir continue;
537cdf0e10cSrcweir
538cdf0e10cSrcweir // muss neu berechnet werden (und ist keine textuelle Anzeige)
539cdf0e10cSrcweir if( !pFld->IsValid() )
540cdf0e10cSrcweir {
541cdf0e10cSrcweir // bestimme Tabelle, in der das Feld steht
542cdf0e10cSrcweir const SwTxtNode& rTxtNd = pFmtFld->GetTxtFld()->GetTxtNode();
543cdf0e10cSrcweir if( !rTxtNd.GetNodes().IsDocNodes() )
544cdf0e10cSrcweir continue;
545cdf0e10cSrcweir const SwTableNode* pTblNd = rTxtNd.FindTableNode();
546cdf0e10cSrcweir if( !pTblNd )
547cdf0e10cSrcweir continue;
548cdf0e10cSrcweir
549cdf0e10cSrcweir // falls dieses Feld nicht in der zu updatenden
550cdf0e10cSrcweir // Tabelle steht, ueberspringen !!
551cdf0e10cSrcweir if( pHt && &pTblNd->GetTable() !=
552cdf0e10cSrcweir ((SwTableFmlUpdate*)pHt)->pTbl )
553cdf0e10cSrcweir continue;
554cdf0e10cSrcweir
555cdf0e10cSrcweir if( !pCalc )
556cdf0e10cSrcweir pCalc = new SwCalc( *this );
557cdf0e10cSrcweir
558cdf0e10cSrcweir // bestimme die Werte aller SetExpresion Felder, die
559cdf0e10cSrcweir // bis zur Tabelle gueltig sind
560cdf0e10cSrcweir SwFrm* pFrm = 0;
561cdf0e10cSrcweir if( pTblNd->GetIndex() < GetNodes().GetEndOfExtras().GetIndex() )
562cdf0e10cSrcweir {
563cdf0e10cSrcweir // steht im Sonderbereich, wird teuer !!
564cdf0e10cSrcweir Point aPt; // den im Layout 1. Frame returnen - Tab.Kopfzeile !!
565cdf0e10cSrcweir pFrm = rTxtNd.getLayoutFrm( GetCurrentLayout(), &aPt );
566cdf0e10cSrcweir if( pFrm )
567cdf0e10cSrcweir {
568cdf0e10cSrcweir SwPosition aPos( *pTblNd );
569cdf0e10cSrcweir if( GetBodyTxtNode( *this, aPos, *pFrm ) )
570cdf0e10cSrcweir FldsToCalc( *pCalc, _SetGetExpFld(
571cdf0e10cSrcweir aPos.nNode, pFmtFld->GetTxtFld(),
572cdf0e10cSrcweir &aPos.nContent ));
573cdf0e10cSrcweir else
574cdf0e10cSrcweir pFrm = 0;
575cdf0e10cSrcweir }
576cdf0e10cSrcweir }
577cdf0e10cSrcweir if( !pFrm )
578cdf0e10cSrcweir {
579cdf0e10cSrcweir // einen Index fuers bestimmen vom TextNode anlegen
580cdf0e10cSrcweir SwNodeIndex aIdx( rTxtNd );
581cdf0e10cSrcweir FldsToCalc( *pCalc,
582cdf0e10cSrcweir _SetGetExpFld( aIdx, pFmtFld->GetTxtFld() ));
583cdf0e10cSrcweir }
584cdf0e10cSrcweir
585cdf0e10cSrcweir SwTblCalcPara aPara( *pCalc, pTblNd->GetTable() );
586cdf0e10cSrcweir pFld->CalcField( aPara );
587cdf0e10cSrcweir if( aPara.IsStackOverFlow() )
588cdf0e10cSrcweir {
589cdf0e10cSrcweir if( aPara.CalcWithStackOverflow() )
590cdf0e10cSrcweir pFld->CalcField( aPara );
591cdf0e10cSrcweir #ifdef DBG_UTIL
592cdf0e10cSrcweir else
593cdf0e10cSrcweir {
594cdf0e10cSrcweir // mind. ein ASSERT
595*870262e3SDon Lewis ASSERT( sal_False, "the chain formula could not be calculated" );
596cdf0e10cSrcweir }
597cdf0e10cSrcweir #endif
598cdf0e10cSrcweir }
599cdf0e10cSrcweir pCalc->SetCalcError( CALC_NOERR );
600cdf0e10cSrcweir }
601cdf0e10cSrcweir pFmtFld->ModifyNotification( 0, pHt );
602cdf0e10cSrcweir }
603cdf0e10cSrcweir }
604cdf0e10cSrcweir
605cdf0e10cSrcweir // dann berechene noch die Formeln an den Boxen
606cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nMaxItems; ++i )
607cdf0e10cSrcweir {
608cdf0e10cSrcweir if( 0 != (pItem = GetAttrPool().GetItem2( RES_BOXATR_FORMULA, i ) ) &&
609cdf0e10cSrcweir ((SwTblBoxFormula*)pItem)->GetDefinedIn() &&
610cdf0e10cSrcweir !((SwTblBoxFormula*)pItem)->IsValid() )
611cdf0e10cSrcweir {
612cdf0e10cSrcweir SwTblBoxFormula* pFml = (SwTblBoxFormula*)pItem;
613cdf0e10cSrcweir SwTableBox* pBox = pFml->GetTableBox();
614cdf0e10cSrcweir if( pBox && pBox->GetSttNd() &&
615cdf0e10cSrcweir pBox->GetSttNd()->GetNodes().IsDocNodes() )
616cdf0e10cSrcweir {
617cdf0e10cSrcweir const SwTableNode* pTblNd = pBox->GetSttNd()->FindTableNode();
618cdf0e10cSrcweir if( !pHt || &pTblNd->GetTable() ==
619cdf0e10cSrcweir ((SwTableFmlUpdate*)pHt)->pTbl )
620cdf0e10cSrcweir {
621cdf0e10cSrcweir double nValue;
622cdf0e10cSrcweir if( !pCalc )
623cdf0e10cSrcweir pCalc = new SwCalc( *this );
624cdf0e10cSrcweir
625cdf0e10cSrcweir // bestimme die Werte aller SetExpresion Felder, die
626cdf0e10cSrcweir // bis zur Tabelle gueltig sind
627cdf0e10cSrcweir SwFrm* pFrm = 0;
628cdf0e10cSrcweir if( pTblNd->GetIndex() < GetNodes().GetEndOfExtras().GetIndex() )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir // steht im Sonderbereich, wird teuer !!
631cdf0e10cSrcweir Point aPt; // den im Layout 1. Frame returnen - Tab.Kopfzeile !!
632cdf0e10cSrcweir SwNodeIndex aCNdIdx( *pTblNd, +2 );
633cdf0e10cSrcweir SwCntntNode* pCNd = aCNdIdx.GetNode().GetCntntNode();
634cdf0e10cSrcweir if( !pCNd )
635cdf0e10cSrcweir pCNd = GetNodes().GoNext( &aCNdIdx );
636cdf0e10cSrcweir
637cdf0e10cSrcweir if( pCNd && 0 != (pFrm = pCNd->getLayoutFrm( GetCurrentLayout(), &aPt )) )
638cdf0e10cSrcweir {
639cdf0e10cSrcweir SwPosition aPos( *pCNd );
640cdf0e10cSrcweir if( GetBodyTxtNode( *this, aPos, *pFrm ) )
641cdf0e10cSrcweir FldsToCalc( *pCalc, _SetGetExpFld( aPos.nNode ));
642cdf0e10cSrcweir else
643cdf0e10cSrcweir pFrm = 0;
644cdf0e10cSrcweir }
645cdf0e10cSrcweir }
646cdf0e10cSrcweir if( !pFrm )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir // einen Index fuers bestimmen vom TextNode anlegen
649cdf0e10cSrcweir SwNodeIndex aIdx( *pTblNd );
650cdf0e10cSrcweir FldsToCalc( *pCalc, _SetGetExpFld( aIdx ));
651cdf0e10cSrcweir }
652cdf0e10cSrcweir
653cdf0e10cSrcweir SwTblCalcPara aPara( *pCalc, pTblNd->GetTable() );
654cdf0e10cSrcweir pFml->Calc( aPara, nValue );
655cdf0e10cSrcweir
656cdf0e10cSrcweir if( aPara.IsStackOverFlow() )
657cdf0e10cSrcweir {
658cdf0e10cSrcweir if( aPara.CalcWithStackOverflow() )
659cdf0e10cSrcweir pFml->Calc( aPara, nValue );
660cdf0e10cSrcweir #ifdef DBG_UTIL
661cdf0e10cSrcweir else
662cdf0e10cSrcweir {
663cdf0e10cSrcweir // mind. ein ASSERT
664*870262e3SDon Lewis ASSERT( sal_False, "the chain formula could not be calculated" );
665cdf0e10cSrcweir }
666cdf0e10cSrcweir #endif
667cdf0e10cSrcweir }
668cdf0e10cSrcweir
669cdf0e10cSrcweir SwFrmFmt* pFmt = pBox->ClaimFrmFmt();
670cdf0e10cSrcweir SfxItemSet aTmp( GetAttrPool(),
671cdf0e10cSrcweir RES_BOXATR_BEGIN,RES_BOXATR_END-1 );
672cdf0e10cSrcweir
673cdf0e10cSrcweir if( pCalc->IsCalcError() )
674cdf0e10cSrcweir nValue = DBL_MAX;
675cdf0e10cSrcweir aTmp.Put( SwTblBoxValue( nValue ));
676cdf0e10cSrcweir if( SFX_ITEM_SET != pFmt->GetItemState( RES_BOXATR_FORMAT ))
677cdf0e10cSrcweir aTmp.Put( SwTblBoxNumFormat( 0 ));
678cdf0e10cSrcweir pFmt->SetFmtAttr( aTmp );
679cdf0e10cSrcweir
680cdf0e10cSrcweir pCalc->SetCalcError( CALC_NOERR );
681cdf0e10cSrcweir }
682cdf0e10cSrcweir }
683cdf0e10cSrcweir }
684cdf0e10cSrcweir }
685cdf0e10cSrcweir
686cdf0e10cSrcweir if( pCalc )
687cdf0e10cSrcweir delete pCalc;
688cdf0e10cSrcweir }
689cdf0e10cSrcweir
UpdatePageFlds(SfxPoolItem * pMsgHnt)690cdf0e10cSrcweir void SwDoc::UpdatePageFlds( SfxPoolItem* pMsgHnt )
691cdf0e10cSrcweir {
692cdf0e10cSrcweir SwFieldType* pFldType;
693cdf0e10cSrcweir for( sal_uInt16 i = 0; i < INIT_FLDTYPES; ++i )
694cdf0e10cSrcweir switch( ( pFldType = (*pFldTypes)[ i ] )->Which() )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir case RES_PAGENUMBERFLD:
697cdf0e10cSrcweir case RES_CHAPTERFLD:
698cdf0e10cSrcweir case RES_GETEXPFLD:
699cdf0e10cSrcweir case RES_REFPAGEGETFLD:
700cdf0e10cSrcweir pFldType->ModifyNotification( 0, pMsgHnt );
701cdf0e10cSrcweir break;
702cdf0e10cSrcweir case RES_DOCSTATFLD:
703cdf0e10cSrcweir pFldType->ModifyNotification( 0, 0 );
704cdf0e10cSrcweir break;
705cdf0e10cSrcweir }
706cdf0e10cSrcweir SetNewFldLst(true);
707cdf0e10cSrcweir }
708cdf0e10cSrcweir
709cdf0e10cSrcweir /*--------------------------------------------------------------------
710cdf0e10cSrcweir Beschreibung:
711cdf0e10cSrcweir --------------------------------------------------------------------*/
712cdf0e10cSrcweir
713cdf0e10cSrcweir // ---- Loesche alle nicht referenzierten FeldTypen eines Dokumentes --
GCFieldTypes()714cdf0e10cSrcweir void SwDoc::GCFieldTypes()
715cdf0e10cSrcweir {
716cdf0e10cSrcweir for( sal_uInt16 n = pFldTypes->Count(); n > INIT_FLDTYPES; )
717cdf0e10cSrcweir if( !(*pFldTypes)[ --n ]->GetDepends() )
718cdf0e10cSrcweir RemoveFldType( n );
719cdf0e10cSrcweir }
720cdf0e10cSrcweir
LockExpFlds()721cdf0e10cSrcweir void SwDoc::LockExpFlds()
722cdf0e10cSrcweir {
723cdf0e10cSrcweir ++nLockExpFld;
724cdf0e10cSrcweir }
725cdf0e10cSrcweir
UnlockExpFlds()726cdf0e10cSrcweir void SwDoc::UnlockExpFlds()
727cdf0e10cSrcweir {
728cdf0e10cSrcweir if( nLockExpFld )
729cdf0e10cSrcweir --nLockExpFld;
730cdf0e10cSrcweir }
731cdf0e10cSrcweir
IsExpFldsLocked() const732cdf0e10cSrcweir bool SwDoc::IsExpFldsLocked() const
733cdf0e10cSrcweir {
734cdf0e10cSrcweir return 0 != nLockExpFld;
735cdf0e10cSrcweir }
736cdf0e10cSrcweir
GetUpdtFlds() const737cdf0e10cSrcweir SwDocUpdtFld& SwDoc::GetUpdtFlds() const
738cdf0e10cSrcweir {
739cdf0e10cSrcweir return *pUpdtFlds;
740cdf0e10cSrcweir }
741cdf0e10cSrcweir
IsNewFldLst() const742cdf0e10cSrcweir bool SwDoc::IsNewFldLst() const
743cdf0e10cSrcweir {
744cdf0e10cSrcweir return mbNewFldLst;
745cdf0e10cSrcweir }
746cdf0e10cSrcweir
SetNewFldLst(bool bFlag)747cdf0e10cSrcweir void SwDoc::SetNewFldLst(bool bFlag)
748cdf0e10cSrcweir {
749cdf0e10cSrcweir mbNewFldLst = bFlag;
750cdf0e10cSrcweir }
751cdf0e10cSrcweir
752cdf0e10cSrcweir
753cdf0e10cSrcweir //----------------------------------------------------------------------
754cdf0e10cSrcweir
755cdf0e10cSrcweir // der StartIndex kann optional mit angegeben werden (z.B. wenn dieser
756cdf0e10cSrcweir // zuvor schon mal erfragt wurde - ist sonst eine virtuelle Methode !!)
757cdf0e10cSrcweir
_SetGetExpFld(const SwNodeIndex & rNdIdx,const SwTxtFld * pFld,const SwIndex * pIdx)75869a74367SOliver-Rainer Wittmann _SetGetExpFld::_SetGetExpFld(
75969a74367SOliver-Rainer Wittmann const SwNodeIndex& rNdIdx,
76069a74367SOliver-Rainer Wittmann const SwTxtFld* pFld,
76169a74367SOliver-Rainer Wittmann const SwIndex* pIdx )
76269a74367SOliver-Rainer Wittmann {
76369a74367SOliver-Rainer Wittmann eSetGetExpFldType = TEXTFIELD;
76469a74367SOliver-Rainer Wittmann CNTNT.pTxtFld = pFld;
76569a74367SOliver-Rainer Wittmann nNode = rNdIdx.GetIndex();
76669a74367SOliver-Rainer Wittmann if( pIdx )
76769a74367SOliver-Rainer Wittmann nCntnt = pIdx->GetIndex();
76869a74367SOliver-Rainer Wittmann else if( pFld )
76969a74367SOliver-Rainer Wittmann nCntnt = *pFld->GetStart();
77069a74367SOliver-Rainer Wittmann else
77169a74367SOliver-Rainer Wittmann nCntnt = 0;
772cdf0e10cSrcweir }
773cdf0e10cSrcweir
_SetGetExpFld(const SwNodeIndex & rNdIdx,const SwTxtINetFmt & rINet,const SwIndex * pIdx)774cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwNodeIndex& rNdIdx,
775cdf0e10cSrcweir const SwTxtINetFmt& rINet, const SwIndex* pIdx )
776cdf0e10cSrcweir {
777cdf0e10cSrcweir eSetGetExpFldType = TEXTINET;
778cdf0e10cSrcweir CNTNT.pTxtINet = &rINet;
779cdf0e10cSrcweir nNode = rNdIdx.GetIndex();
780cdf0e10cSrcweir if( pIdx )
781cdf0e10cSrcweir nCntnt = pIdx->GetIndex();
782cdf0e10cSrcweir else
783cdf0e10cSrcweir nCntnt = *rINet.GetStart();
784cdf0e10cSrcweir }
785cdf0e10cSrcweir
786cdf0e10cSrcweir //Erweiterung fuer Sections:
787cdf0e10cSrcweir // diese haben immer als Content-Position 0xffff !!
788cdf0e10cSrcweir // Auf dieser steht nie ein Feld, maximal bis STRING_MAXLEN moeglich
_SetGetExpFld(const SwSectionNode & rSectNd,const SwPosition * pPos)789cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwSectionNode& rSectNd,
790cdf0e10cSrcweir const SwPosition* pPos )
791cdf0e10cSrcweir {
792cdf0e10cSrcweir eSetGetExpFldType = SECTIONNODE;
793cdf0e10cSrcweir CNTNT.pSection = &rSectNd.GetSection();
794cdf0e10cSrcweir
795cdf0e10cSrcweir if( pPos )
796cdf0e10cSrcweir {
797cdf0e10cSrcweir nNode = pPos->nNode.GetIndex();
798cdf0e10cSrcweir nCntnt = pPos->nContent.GetIndex();
799cdf0e10cSrcweir }
800cdf0e10cSrcweir else
801cdf0e10cSrcweir {
802cdf0e10cSrcweir nNode = rSectNd.GetIndex();
803cdf0e10cSrcweir nCntnt = 0;
804cdf0e10cSrcweir }
805cdf0e10cSrcweir }
806cdf0e10cSrcweir
_SetGetExpFld(const SwTableBox & rTBox,const SwPosition * pPos)807cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwTableBox& rTBox, const SwPosition* pPos )
808cdf0e10cSrcweir {
809cdf0e10cSrcweir eSetGetExpFldType = TABLEBOX;
810cdf0e10cSrcweir CNTNT.pTBox = &rTBox;
811cdf0e10cSrcweir
812cdf0e10cSrcweir if( pPos )
813cdf0e10cSrcweir {
814cdf0e10cSrcweir nNode = pPos->nNode.GetIndex();
815cdf0e10cSrcweir nCntnt = pPos->nContent.GetIndex();
816cdf0e10cSrcweir }
817cdf0e10cSrcweir else
818cdf0e10cSrcweir {
819cdf0e10cSrcweir nNode = 0;
820cdf0e10cSrcweir nCntnt = 0;
821cdf0e10cSrcweir if( rTBox.GetSttNd() )
822cdf0e10cSrcweir {
823cdf0e10cSrcweir SwNodeIndex aIdx( *rTBox.GetSttNd() );
824cdf0e10cSrcweir const SwCntntNode* pNd = aIdx.GetNode().GetNodes().GoNext( &aIdx );
825cdf0e10cSrcweir if( pNd )
826cdf0e10cSrcweir nNode = pNd->GetIndex();
827cdf0e10cSrcweir }
828cdf0e10cSrcweir }
829cdf0e10cSrcweir }
830cdf0e10cSrcweir
_SetGetExpFld(const SwNodeIndex & rNdIdx,const SwTxtTOXMark & rTOX,const SwIndex * pIdx)831cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwNodeIndex& rNdIdx,
832cdf0e10cSrcweir const SwTxtTOXMark& rTOX,
833cdf0e10cSrcweir const SwIndex* pIdx )
834cdf0e10cSrcweir {
835cdf0e10cSrcweir eSetGetExpFldType = TEXTTOXMARK;
836cdf0e10cSrcweir CNTNT.pTxtTOX = &rTOX;
837cdf0e10cSrcweir nNode = rNdIdx.GetIndex();
838cdf0e10cSrcweir if( pIdx )
839cdf0e10cSrcweir nCntnt = pIdx->GetIndex();
840cdf0e10cSrcweir else
841cdf0e10cSrcweir nCntnt = *rTOX.GetStart();
842cdf0e10cSrcweir }
843cdf0e10cSrcweir
_SetGetExpFld(const SwPosition & rPos)844cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwPosition& rPos )
845cdf0e10cSrcweir {
846cdf0e10cSrcweir eSetGetExpFldType = CRSRPOS;
847cdf0e10cSrcweir CNTNT.pPos = &rPos;
848cdf0e10cSrcweir nNode = rPos.nNode.GetIndex();
849cdf0e10cSrcweir nCntnt = rPos.nContent.GetIndex();
850cdf0e10cSrcweir }
851cdf0e10cSrcweir
_SetGetExpFld(const SwFlyFrmFmt & rFlyFmt,const SwPosition * pPos)852cdf0e10cSrcweir _SetGetExpFld::_SetGetExpFld( const SwFlyFrmFmt& rFlyFmt,
853cdf0e10cSrcweir const SwPosition* pPos )
854cdf0e10cSrcweir {
855cdf0e10cSrcweir eSetGetExpFldType = FLYFRAME;
856cdf0e10cSrcweir CNTNT.pFlyFmt = &rFlyFmt;
857cdf0e10cSrcweir if( pPos )
858cdf0e10cSrcweir {
859cdf0e10cSrcweir nNode = pPos->nNode.GetIndex();
860cdf0e10cSrcweir nCntnt = pPos->nContent.GetIndex();
861cdf0e10cSrcweir }
862cdf0e10cSrcweir else
863cdf0e10cSrcweir {
864cdf0e10cSrcweir const SwFmtCntnt& rCntnt = rFlyFmt.GetCntnt();
865cdf0e10cSrcweir nNode = rCntnt.GetCntntIdx()->GetIndex() + 1;
866cdf0e10cSrcweir nCntnt = 0;
867cdf0e10cSrcweir }
868cdf0e10cSrcweir }
869cdf0e10cSrcweir
GetPos(SwPosition & rPos) const870cdf0e10cSrcweir void _SetGetExpFld::GetPos( SwPosition& rPos ) const
871cdf0e10cSrcweir {
872cdf0e10cSrcweir rPos.nNode = nNode;
873cdf0e10cSrcweir rPos.nContent.Assign( rPos.nNode.GetNode().GetCntntNode(), nCntnt );
874cdf0e10cSrcweir }
875cdf0e10cSrcweir
GetPosOfContent(SwPosition & rPos) const876cdf0e10cSrcweir void _SetGetExpFld::GetPosOfContent( SwPosition& rPos ) const
877cdf0e10cSrcweir {
878cdf0e10cSrcweir const SwNode* pNd = GetNodeFromCntnt();
879cdf0e10cSrcweir if( pNd )
880cdf0e10cSrcweir pNd = pNd->GetCntntNode();
881cdf0e10cSrcweir
882cdf0e10cSrcweir if( pNd )
883cdf0e10cSrcweir {
884cdf0e10cSrcweir rPos.nNode = *pNd;
885cdf0e10cSrcweir rPos.nContent.Assign( (SwCntntNode*)pNd,GetCntPosFromCntnt() );
886cdf0e10cSrcweir }
887cdf0e10cSrcweir else
888cdf0e10cSrcweir {
889cdf0e10cSrcweir rPos.nNode = nNode;
890cdf0e10cSrcweir rPos.nContent.Assign( rPos.nNode.GetNode().GetCntntNode(), nCntnt );
891cdf0e10cSrcweir }
892cdf0e10cSrcweir }
893cdf0e10cSrcweir
SetBodyPos(const SwCntntFrm & rFrm)894cdf0e10cSrcweir void _SetGetExpFld::SetBodyPos( const SwCntntFrm& rFrm )
895cdf0e10cSrcweir {
896cdf0e10cSrcweir if( !rFrm.IsInDocBody() )
897cdf0e10cSrcweir {
898cdf0e10cSrcweir SwNodeIndex aIdx( *rFrm.GetNode() );
899cdf0e10cSrcweir SwDoc& rDoc = *aIdx.GetNodes().GetDoc();
900cdf0e10cSrcweir SwPosition aPos( aIdx );
901cdf0e10cSrcweir #ifdef DBG_UTIL
902cdf0e10cSrcweir ASSERT( ::GetBodyTxtNode( rDoc, aPos, rFrm ), "wo steht das Feld" );
903cdf0e10cSrcweir #else
904cdf0e10cSrcweir ::GetBodyTxtNode( rDoc, aPos, rFrm );
905cdf0e10cSrcweir #endif
906cdf0e10cSrcweir nNode = aPos.nNode.GetIndex();
907cdf0e10cSrcweir nCntnt = aPos.nContent.GetIndex();
908cdf0e10cSrcweir }
909cdf0e10cSrcweir }
910cdf0e10cSrcweir
operator ==(const _SetGetExpFld & rFld) const91169a74367SOliver-Rainer Wittmann sal_Bool _SetGetExpFld::operator==( const _SetGetExpFld& rFld ) const
91269a74367SOliver-Rainer Wittmann {
91369a74367SOliver-Rainer Wittmann return nNode == rFld.nNode
91469a74367SOliver-Rainer Wittmann && nCntnt == rFld.nCntnt
91569a74367SOliver-Rainer Wittmann && ( !CNTNT.pTxtFld
91669a74367SOliver-Rainer Wittmann || !rFld.CNTNT.pTxtFld
91769a74367SOliver-Rainer Wittmann || CNTNT.pTxtFld == rFld.CNTNT.pTxtFld );
91869a74367SOliver-Rainer Wittmann }
91969a74367SOliver-Rainer Wittmann
operator <(const _SetGetExpFld & rFld) const920cdf0e10cSrcweir sal_Bool _SetGetExpFld::operator<( const _SetGetExpFld& rFld ) const
921cdf0e10cSrcweir {
922cdf0e10cSrcweir if( nNode < rFld.nNode || ( nNode == rFld.nNode && nCntnt < rFld.nCntnt ))
923cdf0e10cSrcweir return sal_True;
924cdf0e10cSrcweir else if( nNode != rFld.nNode || nCntnt != rFld.nCntnt )
925cdf0e10cSrcweir return sal_False;
926cdf0e10cSrcweir
927cdf0e10cSrcweir const SwNode *pFirst = GetNodeFromCntnt(),
928cdf0e10cSrcweir *pNext = rFld.GetNodeFromCntnt();
929cdf0e10cSrcweir
930cdf0e10cSrcweir // Position gleich: nur weiter wenn beide FeldPointer besetzt sind !!
931cdf0e10cSrcweir if( !pFirst || !pNext )
932cdf0e10cSrcweir return sal_False;
933cdf0e10cSrcweir
934cdf0e10cSrcweir // gleiche Section ??
935cdf0e10cSrcweir if( pFirst->StartOfSectionNode() != pNext->StartOfSectionNode() )
936cdf0e10cSrcweir {
937cdf0e10cSrcweir // sollte einer in der Tabelle stehen ?
938cdf0e10cSrcweir const SwNode *pFirstStt, *pNextStt;
939cdf0e10cSrcweir const SwTableNode* pTblNd = pFirst->FindTableNode();
940cdf0e10cSrcweir if( pTblNd )
941cdf0e10cSrcweir pFirstStt = pTblNd->StartOfSectionNode();
942cdf0e10cSrcweir else
943cdf0e10cSrcweir pFirstStt = pFirst->StartOfSectionNode();
944cdf0e10cSrcweir
945cdf0e10cSrcweir if( 0 != ( pTblNd = pNext->FindTableNode() ) )
946cdf0e10cSrcweir pNextStt = pTblNd->StartOfSectionNode();
947cdf0e10cSrcweir else
948cdf0e10cSrcweir pNextStt = pNext->StartOfSectionNode();
949cdf0e10cSrcweir
950cdf0e10cSrcweir if( pFirstStt != pNextStt )
951cdf0e10cSrcweir {
952cdf0e10cSrcweir if( pFirst->IsTxtNode() && pNext->IsTxtNode() &&
953cdf0e10cSrcweir ( pFirst->FindFlyStartNode() || pNext->FindFlyStartNode() ))
954cdf0e10cSrcweir {
955cdf0e10cSrcweir return ::IsFrameBehind( *(SwTxtNode*)pNext, nCntnt,
956cdf0e10cSrcweir *(SwTxtNode*)pFirst, nCntnt );
957cdf0e10cSrcweir }
958cdf0e10cSrcweir return pFirstStt->GetIndex() < pNextStt->GetIndex();
959cdf0e10cSrcweir }
960cdf0e10cSrcweir }
961cdf0e10cSrcweir
962cdf0e10cSrcweir // ist gleiche Section, dann Feld im gleichen Node ?
963cdf0e10cSrcweir if( pFirst != pNext )
964cdf0e10cSrcweir return pFirst->GetIndex() < pNext->GetIndex();
965cdf0e10cSrcweir
966cdf0e10cSrcweir // gleicher Node in der Section, dann Position im Node
967cdf0e10cSrcweir return GetCntPosFromCntnt() < rFld.GetCntPosFromCntnt();
968cdf0e10cSrcweir }
969cdf0e10cSrcweir
GetNodeFromCntnt() const970cdf0e10cSrcweir const SwNode* _SetGetExpFld::GetNodeFromCntnt() const
971cdf0e10cSrcweir {
972cdf0e10cSrcweir const SwNode* pRet = 0;
973cdf0e10cSrcweir if( CNTNT.pTxtFld )
974cdf0e10cSrcweir switch( eSetGetExpFldType )
975cdf0e10cSrcweir {
976cdf0e10cSrcweir case TEXTFIELD:
977cdf0e10cSrcweir pRet = &CNTNT.pTxtFld->GetTxtNode();
978cdf0e10cSrcweir break;
979cdf0e10cSrcweir
980cdf0e10cSrcweir case TEXTINET:
981cdf0e10cSrcweir pRet = &CNTNT.pTxtINet->GetTxtNode();
982cdf0e10cSrcweir break;
983cdf0e10cSrcweir
984cdf0e10cSrcweir case SECTIONNODE:
985cdf0e10cSrcweir pRet = CNTNT.pSection->GetFmt()->GetSectionNode();
986cdf0e10cSrcweir break;
987cdf0e10cSrcweir
988cdf0e10cSrcweir case CRSRPOS:
989cdf0e10cSrcweir pRet = &CNTNT.pPos->nNode.GetNode();
990cdf0e10cSrcweir break;
991cdf0e10cSrcweir
992cdf0e10cSrcweir case TEXTTOXMARK:
993cdf0e10cSrcweir pRet = &CNTNT.pTxtTOX->GetTxtNode();
994cdf0e10cSrcweir break;
995cdf0e10cSrcweir
996cdf0e10cSrcweir case TABLEBOX:
997cdf0e10cSrcweir if( CNTNT.pTBox->GetSttNd() )
998cdf0e10cSrcweir {
999cdf0e10cSrcweir SwNodeIndex aIdx( *CNTNT.pTBox->GetSttNd() );
1000cdf0e10cSrcweir pRet = aIdx.GetNode().GetNodes().GoNext( &aIdx );
1001cdf0e10cSrcweir }
1002cdf0e10cSrcweir break;
1003cdf0e10cSrcweir
1004cdf0e10cSrcweir case FLYFRAME:
1005cdf0e10cSrcweir {
1006cdf0e10cSrcweir SwNodeIndex aIdx( *CNTNT.pFlyFmt->GetCntnt().GetCntntIdx() );
1007cdf0e10cSrcweir pRet = aIdx.GetNode().GetNodes().GoNext( &aIdx );
1008cdf0e10cSrcweir }
1009cdf0e10cSrcweir break;
1010cdf0e10cSrcweir }
1011cdf0e10cSrcweir return pRet;
1012cdf0e10cSrcweir }
1013cdf0e10cSrcweir
GetCntPosFromCntnt() const1014cdf0e10cSrcweir xub_StrLen _SetGetExpFld::GetCntPosFromCntnt() const
1015cdf0e10cSrcweir {
1016cdf0e10cSrcweir sal_uInt16 nRet = 0;
1017cdf0e10cSrcweir if( CNTNT.pTxtFld )
1018cdf0e10cSrcweir switch( eSetGetExpFldType )
1019cdf0e10cSrcweir {
1020cdf0e10cSrcweir case TEXTFIELD:
1021cdf0e10cSrcweir case TEXTINET:
1022cdf0e10cSrcweir case TEXTTOXMARK:
1023cdf0e10cSrcweir nRet = *CNTNT.pTxtFld->GetStart();
1024cdf0e10cSrcweir break;
1025cdf0e10cSrcweir case CRSRPOS:
1026cdf0e10cSrcweir nRet = CNTNT.pPos->nContent.GetIndex();
1027cdf0e10cSrcweir break;
1028cdf0e10cSrcweir default:
1029cdf0e10cSrcweir break;
1030cdf0e10cSrcweir }
1031cdf0e10cSrcweir return nRet;
1032cdf0e10cSrcweir }
1033cdf0e10cSrcweir
_HashStr(const String & rName,const String & rText,_HashStr * pNxt)1034cdf0e10cSrcweir _HashStr::_HashStr( const String& rName, const String& rText,
1035cdf0e10cSrcweir _HashStr* pNxt )
1036cdf0e10cSrcweir : SwHash( rName ), aSetStr( rText )
1037cdf0e10cSrcweir {
1038cdf0e10cSrcweir pNext = pNxt;
1039cdf0e10cSrcweir }
1040cdf0e10cSrcweir
1041cdf0e10cSrcweir // suche nach dem Namen, ist er vorhanden, returne seinen String, sonst
1042cdf0e10cSrcweir // einen LeerString
LookString(SwHash ** ppTbl,sal_uInt16 nSize,const String & rName,String & rRet,sal_uInt16 * pPos)1043cdf0e10cSrcweir void LookString( SwHash** ppTbl, sal_uInt16 nSize, const String& rName,
1044cdf0e10cSrcweir String& rRet, sal_uInt16* pPos )
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir rRet = rName;
1047cdf0e10cSrcweir rRet.EraseLeadingChars().EraseTrailingChars();
1048cdf0e10cSrcweir SwHash* pFnd = Find( rRet, ppTbl, nSize, pPos );
1049cdf0e10cSrcweir if( pFnd )
1050cdf0e10cSrcweir rRet = ((_HashStr*)pFnd)->aSetStr;
1051cdf0e10cSrcweir else
1052cdf0e10cSrcweir rRet.Erase();
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir
1055cdf0e10cSrcweir /*--------------------------------------------------------------------
1056cdf0e10cSrcweir Beschreibung:
1057cdf0e10cSrcweir --------------------------------------------------------------------*/
1058cdf0e10cSrcweir
lcl_GetDBVarName(SwDoc & rDoc,SwDBNameInfField & rDBFld)1059cdf0e10cSrcweir String lcl_GetDBVarName( SwDoc& rDoc, SwDBNameInfField& rDBFld )
1060cdf0e10cSrcweir {
1061cdf0e10cSrcweir SwDBData aDBData( rDBFld.GetDBData( &rDoc ));
1062cdf0e10cSrcweir String sDBNumNm;
1063cdf0e10cSrcweir SwDBData aDocData = rDoc.GetDBData();
1064cdf0e10cSrcweir
1065cdf0e10cSrcweir if( aDBData != aDocData )
1066cdf0e10cSrcweir {
1067cdf0e10cSrcweir sDBNumNm = aDBData.sDataSource;
1068cdf0e10cSrcweir sDBNumNm += DB_DELIM;
1069cdf0e10cSrcweir sDBNumNm += String(aDBData.sCommand);
1070cdf0e10cSrcweir sDBNumNm += DB_DELIM;
1071cdf0e10cSrcweir }
1072cdf0e10cSrcweir sDBNumNm += SwFieldType::GetTypeStr(TYP_DBSETNUMBERFLD);
1073cdf0e10cSrcweir
1074cdf0e10cSrcweir return sDBNumNm;
1075cdf0e10cSrcweir }
1076cdf0e10cSrcweir
1077cdf0e10cSrcweir /*--------------------------------------------------------------------
1078cdf0e10cSrcweir Beschreibung:
1079cdf0e10cSrcweir --------------------------------------------------------------------*/
1080cdf0e10cSrcweir
lcl_CalcFld(SwDoc & rDoc,SwCalc & rCalc,const _SetGetExpFld & rSGEFld,SwNewDBMgr * pMgr)1081cdf0e10cSrcweir void lcl_CalcFld( SwDoc& rDoc, SwCalc& rCalc, const _SetGetExpFld& rSGEFld,
1082cdf0e10cSrcweir SwNewDBMgr* pMgr )
1083cdf0e10cSrcweir {
1084c0286415SOliver-Rainer Wittmann const SwTxtFld* pTxtFld = rSGEFld.GetTxtFld();
1085cdf0e10cSrcweir if( !pTxtFld )
1086cdf0e10cSrcweir return ;
1087cdf0e10cSrcweir
1088c0286415SOliver-Rainer Wittmann const SwField* pFld = pTxtFld->GetFmtFld().GetField();
1089cdf0e10cSrcweir const sal_uInt16 nFldWhich = pFld->GetTyp()->Which();
1090cdf0e10cSrcweir
1091cdf0e10cSrcweir if( RES_SETEXPFLD == nFldWhich )
1092cdf0e10cSrcweir {
1093cdf0e10cSrcweir SwSbxValue aValue;
1094cdf0e10cSrcweir if( nsSwGetSetExpType::GSE_EXPR & pFld->GetSubType() )
1095cdf0e10cSrcweir aValue.PutDouble( ((SwSetExpField*)pFld)->GetValue() );
1096cdf0e10cSrcweir else
1097cdf0e10cSrcweir // Erweiterung fuers Rechnen mit Strings
1098cdf0e10cSrcweir aValue.PutString( ((SwSetExpField*)pFld)->GetExpStr() );
1099cdf0e10cSrcweir
1100cdf0e10cSrcweir // setze im Calculator den neuen Wert
1101cdf0e10cSrcweir rCalc.VarChange( pFld->GetTyp()->GetName(), aValue );
1102cdf0e10cSrcweir }
1103cdf0e10cSrcweir else if( pMgr )
1104cdf0e10cSrcweir {
1105cdf0e10cSrcweir switch( nFldWhich )
1106cdf0e10cSrcweir {
1107cdf0e10cSrcweir case RES_DBNUMSETFLD:
1108cdf0e10cSrcweir {
1109cdf0e10cSrcweir SwDBNumSetField* pDBFld = (SwDBNumSetField*)pFld;
1110cdf0e10cSrcweir
1111cdf0e10cSrcweir SwDBData aDBData(pDBFld->GetDBData(&rDoc));
1112cdf0e10cSrcweir
1113cdf0e10cSrcweir if( pDBFld->IsCondValid() &&
1114cdf0e10cSrcweir pMgr->OpenDataSource( aDBData.sDataSource, aDBData.sCommand ))
1115cdf0e10cSrcweir rCalc.VarChange( lcl_GetDBVarName( rDoc, *pDBFld),
1116cdf0e10cSrcweir pDBFld->GetFormat() );
1117cdf0e10cSrcweir }
1118cdf0e10cSrcweir break;
1119cdf0e10cSrcweir case RES_DBNEXTSETFLD:
1120cdf0e10cSrcweir {
1121cdf0e10cSrcweir SwDBNextSetField* pDBFld = (SwDBNextSetField*)pFld;
1122cdf0e10cSrcweir SwDBData aDBData(pDBFld->GetDBData(&rDoc));
1123cdf0e10cSrcweir if( !pDBFld->IsCondValid() ||
1124cdf0e10cSrcweir !pMgr->OpenDataSource( aDBData.sDataSource, aDBData.sCommand ))
1125cdf0e10cSrcweir break;
1126cdf0e10cSrcweir
1127cdf0e10cSrcweir String sDBNumNm(lcl_GetDBVarName( rDoc, *pDBFld));
1128cdf0e10cSrcweir SwCalcExp* pExp = rCalc.VarLook( sDBNumNm );
1129cdf0e10cSrcweir if( pExp )
1130cdf0e10cSrcweir rCalc.VarChange( sDBNumNm, pExp->nValue.GetLong() + 1 );
1131cdf0e10cSrcweir }
1132cdf0e10cSrcweir break;
1133cdf0e10cSrcweir
1134cdf0e10cSrcweir }
1135cdf0e10cSrcweir }
1136cdf0e10cSrcweir }
1137cdf0e10cSrcweir
FldsToCalc(SwCalc & rCalc,const _SetGetExpFld & rToThisFld)1138cdf0e10cSrcweir void SwDoc::FldsToCalc( SwCalc& rCalc, const _SetGetExpFld& rToThisFld )
1139cdf0e10cSrcweir {
1140cdf0e10cSrcweir // erzeuge die Sortierteliste aller SetFelder
1141cdf0e10cSrcweir pUpdtFlds->MakeFldList( *this, mbNewFldLst, GETFLD_CALC );
1142cdf0e10cSrcweir mbNewFldLst = sal_False;
1143cdf0e10cSrcweir
1144cdf0e10cSrcweir SwNewDBMgr* pMgr = GetNewDBMgr();
1145cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1146cdf0e10cSrcweir
1147cdf0e10cSrcweir if( pUpdtFlds->GetSortLst()->Count() )
1148cdf0e10cSrcweir {
1149cdf0e10cSrcweir sal_uInt16 nLast;
1150cdf0e10cSrcweir _SetGetExpFld* pFld = (_SetGetExpFld*)&rToThisFld;
1151cdf0e10cSrcweir if( pUpdtFlds->GetSortLst()->Seek_Entry( pFld, &nLast ) )
1152cdf0e10cSrcweir ++nLast;
1153cdf0e10cSrcweir
1154cdf0e10cSrcweir const _SetGetExpFldPtr* ppSortLst = pUpdtFlds->GetSortLst()->GetData();
1155cdf0e10cSrcweir for( sal_uInt16 n = 0; n < nLast; ++n, ++ppSortLst )
1156cdf0e10cSrcweir lcl_CalcFld( *this, rCalc, **ppSortLst, pMgr );
1157cdf0e10cSrcweir }
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1160cdf0e10cSrcweir }
1161cdf0e10cSrcweir
FldsToCalc(SwCalc & rCalc,sal_uLong nLastNd,sal_uInt16 nLastCnt)1162cdf0e10cSrcweir void SwDoc::FldsToCalc( SwCalc& rCalc, sal_uLong nLastNd, sal_uInt16 nLastCnt )
1163cdf0e10cSrcweir {
1164cdf0e10cSrcweir // erzeuge die Sortierteliste aller SetFelder
1165cdf0e10cSrcweir pUpdtFlds->MakeFldList( *this, mbNewFldLst, GETFLD_CALC );
1166cdf0e10cSrcweir mbNewFldLst = sal_False;
1167cdf0e10cSrcweir
1168cdf0e10cSrcweir SwNewDBMgr* pMgr = GetNewDBMgr();
1169cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1170cdf0e10cSrcweir
1171cdf0e10cSrcweir const _SetGetExpFldPtr* ppSortLst = pUpdtFlds->GetSortLst()->GetData();
1172cdf0e10cSrcweir
1173cdf0e10cSrcweir for( sal_uInt16 n = pUpdtFlds->GetSortLst()->Count();
1174cdf0e10cSrcweir n &&
1175cdf0e10cSrcweir ( (*ppSortLst)->GetNode() < nLastNd ||
1176cdf0e10cSrcweir ( (*ppSortLst)->GetNode() == nLastNd && (*ppSortLst)->GetCntnt() <= nLastCnt )
1177cdf0e10cSrcweir );
1178cdf0e10cSrcweir --n, ++ppSortLst )
1179cdf0e10cSrcweir lcl_CalcFld( *this, rCalc, **ppSortLst, pMgr );
1180cdf0e10cSrcweir
1181cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1182cdf0e10cSrcweir }
1183cdf0e10cSrcweir
FldsToExpand(SwHash ** & ppHashTbl,sal_uInt16 & rTblSize,const _SetGetExpFld & rToThisFld)1184cdf0e10cSrcweir void SwDoc::FldsToExpand( SwHash**& ppHashTbl, sal_uInt16& rTblSize,
1185cdf0e10cSrcweir const _SetGetExpFld& rToThisFld )
1186cdf0e10cSrcweir {
1187cdf0e10cSrcweir // erzeuge die Sortierteliste aller SetFelder
1188cdf0e10cSrcweir pUpdtFlds->MakeFldList( *this, mbNewFldLst, GETFLD_EXPAND );
1189cdf0e10cSrcweir mbNewFldLst = sal_False;
1190cdf0e10cSrcweir
1191cdf0e10cSrcweir // HashTabelle fuer alle String Ersetzungen, wird "one the fly" gefuellt
1192cdf0e10cSrcweir // (versuche eine "ungerade"-Zahl zu erzeugen)
1193cdf0e10cSrcweir rTblSize = (( pUpdtFlds->GetSortLst()->Count() / 7 ) + 1 ) * 7;
1194cdf0e10cSrcweir ppHashTbl = new SwHash*[ rTblSize ];
1195cdf0e10cSrcweir memset( ppHashTbl, 0, sizeof( _HashStr* ) * rTblSize );
1196cdf0e10cSrcweir
1197cdf0e10cSrcweir sal_uInt16 nLast;
1198cdf0e10cSrcweir {
1199cdf0e10cSrcweir _SetGetExpFld* pTmp = (_SetGetExpFld*)&rToThisFld;
1200cdf0e10cSrcweir if( pUpdtFlds->GetSortLst()->Seek_Entry( pTmp, &nLast ) )
1201cdf0e10cSrcweir ++nLast;
1202cdf0e10cSrcweir }
1203cdf0e10cSrcweir
1204cdf0e10cSrcweir sal_uInt16 nPos;
1205cdf0e10cSrcweir SwHash* pFnd;
1206cdf0e10cSrcweir String aNew;
1207cdf0e10cSrcweir const _SetGetExpFldPtr* ppSortLst = pUpdtFlds->GetSortLst()->GetData();
1208cdf0e10cSrcweir for( ; nLast; --nLast, ++ppSortLst )
1209cdf0e10cSrcweir {
1210c0286415SOliver-Rainer Wittmann const SwTxtFld* pTxtFld = (*ppSortLst)->GetTxtFld();
1211cdf0e10cSrcweir if( !pTxtFld )
1212cdf0e10cSrcweir continue;
1213cdf0e10cSrcweir
1214c0286415SOliver-Rainer Wittmann const SwField* pFld = pTxtFld->GetFmtFld().GetField();
1215cdf0e10cSrcweir switch( pFld->GetTyp()->Which() )
1216cdf0e10cSrcweir {
1217cdf0e10cSrcweir case RES_SETEXPFLD:
1218cdf0e10cSrcweir if( nsSwGetSetExpType::GSE_STRING & pFld->GetSubType() )
1219cdf0e10cSrcweir {
1220cdf0e10cSrcweir // setze in der HashTabelle den neuen Wert
1221cdf0e10cSrcweir // ist die "Formel" ein Feld ??
1222cdf0e10cSrcweir SwSetExpField* pSFld = (SwSetExpField*)pFld;
1223cdf0e10cSrcweir LookString( ppHashTbl, rTblSize, pSFld->GetFormula(), aNew );
1224cdf0e10cSrcweir
1225cdf0e10cSrcweir if( !aNew.Len() ) // nichts gefunden, dann ist
1226cdf0e10cSrcweir aNew = pSFld->GetFormula(); // die Formel der neue Wert
1227cdf0e10cSrcweir
1228cdf0e10cSrcweir // OD 11.02.2003 #i3141# - update expression of field as in
1229cdf0e10cSrcweir // method <SwDoc::UpdateExpFlds(..)> for string/text fields
1230cdf0e10cSrcweir pSFld->ChgExpStr( aNew );
1231cdf0e10cSrcweir
1232cdf0e10cSrcweir // suche den Namen vom Feld
1233cdf0e10cSrcweir aNew = ((SwSetExpFieldType*)pSFld->GetTyp())->GetSetRefName();
1234cdf0e10cSrcweir // Eintrag vorhanden ?
1235cdf0e10cSrcweir pFnd = Find( aNew, ppHashTbl, rTblSize, &nPos );
1236cdf0e10cSrcweir if( pFnd )
1237cdf0e10cSrcweir // Eintrag in der HashTabelle aendern
1238cdf0e10cSrcweir ((_HashStr*)pFnd)->aSetStr = pSFld->GetExpStr();
1239cdf0e10cSrcweir else
1240cdf0e10cSrcweir // neuen Eintrag einfuegen
1241cdf0e10cSrcweir *(ppHashTbl + nPos ) = new _HashStr( aNew,
1242cdf0e10cSrcweir pSFld->GetExpStr(), (_HashStr*)*(ppHashTbl + nPos) );
1243cdf0e10cSrcweir }
1244cdf0e10cSrcweir break;
1245cdf0e10cSrcweir case RES_DBFLD:
1246cdf0e10cSrcweir {
1247cdf0e10cSrcweir const String& rName = pFld->GetTyp()->GetName();
1248cdf0e10cSrcweir
1249cdf0e10cSrcweir // Eintrag in den HashTable eintragen
1250cdf0e10cSrcweir // Eintrag vorhanden ?
1251cdf0e10cSrcweir pFnd = Find( rName, ppHashTbl, rTblSize, &nPos );
1252cdf0e10cSrcweir String const value(pFld->ExpandField(IsClipBoard()));
1253cdf0e10cSrcweir if( pFnd )
1254cdf0e10cSrcweir {
1255cdf0e10cSrcweir // Eintrag in der HashTabelle aendern
1256cdf0e10cSrcweir static_cast<_HashStr*>(pFnd)->aSetStr = value;
1257cdf0e10cSrcweir }
1258cdf0e10cSrcweir else
1259cdf0e10cSrcweir {
1260cdf0e10cSrcweir // neuen Eintrag einfuegen
1261cdf0e10cSrcweir *(ppHashTbl + nPos ) = new _HashStr( rName,
1262cdf0e10cSrcweir value, static_cast<_HashStr *>(*(ppHashTbl + nPos)));
1263cdf0e10cSrcweir }
1264cdf0e10cSrcweir }
1265cdf0e10cSrcweir break;
1266cdf0e10cSrcweir }
1267cdf0e10cSrcweir }
1268cdf0e10cSrcweir }
1269cdf0e10cSrcweir
1270cdf0e10cSrcweir
UpdateExpFlds(SwTxtFld * pUpdtFld,bool bUpdRefFlds)1271cdf0e10cSrcweir void SwDoc::UpdateExpFlds( SwTxtFld* pUpdtFld, bool bUpdRefFlds )
1272cdf0e10cSrcweir {
1273cdf0e10cSrcweir if( IsExpFldsLocked() || IsInReading() )
1274cdf0e10cSrcweir return;
1275cdf0e10cSrcweir
1276cdf0e10cSrcweir sal_Bool bOldInUpdateFlds = pUpdtFlds->IsInUpdateFlds();
1277cdf0e10cSrcweir pUpdtFlds->SetInUpdateFlds( sal_True );
1278cdf0e10cSrcweir
1279cdf0e10cSrcweir pUpdtFlds->MakeFldList( *this, sal_True, GETFLD_ALL );
1280cdf0e10cSrcweir mbNewFldLst = sal_False;
1281cdf0e10cSrcweir
1282cdf0e10cSrcweir if( !pUpdtFlds->GetSortLst()->Count() )
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir if( bUpdRefFlds )
1285cdf0e10cSrcweir UpdateRefFlds(NULL);
1286cdf0e10cSrcweir
1287cdf0e10cSrcweir pUpdtFlds->SetInUpdateFlds( bOldInUpdateFlds );
1288cdf0e10cSrcweir pUpdtFlds->SetFieldsDirty( sal_False );
1289cdf0e10cSrcweir return ;
1290cdf0e10cSrcweir }
1291cdf0e10cSrcweir
1292cdf0e10cSrcweir sal_uInt16 nWhich, n;
1293cdf0e10cSrcweir
1294cdf0e10cSrcweir // HashTabelle fuer alle String Ersetzungen, wird "one the fly" gefuellt
1295cdf0e10cSrcweir // (versuche eine "ungerade"-Zahl zu erzeugen)
1296cdf0e10cSrcweir sal_uInt16 nStrFmtCnt = (( pFldTypes->Count() / 7 ) + 1 ) * 7;
1297cdf0e10cSrcweir SwHash** pHashStrTbl = new SwHash*[ nStrFmtCnt ];
1298cdf0e10cSrcweir memset( pHashStrTbl, 0, sizeof( _HashStr* ) * nStrFmtCnt );
1299cdf0e10cSrcweir
1300cdf0e10cSrcweir {
1301cdf0e10cSrcweir const SwFieldType* pFldType;
1302cdf0e10cSrcweir // gesondert behandeln:
1303cdf0e10cSrcweir for( n = pFldTypes->Count(); n; )
1304cdf0e10cSrcweir switch( ( pFldType = (*pFldTypes)[ --n ] )->Which() )
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir case RES_USERFLD:
1307cdf0e10cSrcweir {
1308cdf0e10cSrcweir // Eintrag vorhanden ?
1309cdf0e10cSrcweir sal_uInt16 nPos;
1310cdf0e10cSrcweir const String& rNm = pFldType->GetName();
1311cdf0e10cSrcweir String sExpand(((SwUserFieldType*)pFldType)->Expand(nsSwGetSetExpType::GSE_STRING, 0, 0));
1312cdf0e10cSrcweir SwHash* pFnd = Find( rNm, pHashStrTbl, nStrFmtCnt, &nPos );
1313cdf0e10cSrcweir if( pFnd )
1314cdf0e10cSrcweir // Eintrag in der HashTabelle aendern ??
1315cdf0e10cSrcweir ((_HashStr*)pFnd)->aSetStr = sExpand;
1316cdf0e10cSrcweir else
1317cdf0e10cSrcweir // neuen Eintrag einfuegen
1318cdf0e10cSrcweir *(pHashStrTbl + nPos ) = new _HashStr( rNm, sExpand,
1319cdf0e10cSrcweir (_HashStr*)*(pHashStrTbl + nPos) );
1320cdf0e10cSrcweir }
1321cdf0e10cSrcweir break;
1322cdf0e10cSrcweir case RES_SETEXPFLD:
1323cdf0e10cSrcweir ((SwSetExpFieldType*)pFldType)->SetOutlineChgNd( 0 );
1324cdf0e10cSrcweir break;
1325cdf0e10cSrcweir }
1326cdf0e10cSrcweir }
1327cdf0e10cSrcweir
1328cdf0e10cSrcweir // Ok, das Array ist soweit mit allen Feldern gefuellt, dann rechne mal
1329cdf0e10cSrcweir SwCalc aCalc( *this );
1330cdf0e10cSrcweir
1331cdf0e10cSrcweir String sDBNumNm( SwFieldType::GetTypeStr( TYP_DBSETNUMBERFLD ) );
1332cdf0e10cSrcweir
1333cdf0e10cSrcweir // aktuelle Datensatznummer schon vorher einstellen
1334cdf0e10cSrcweir SwNewDBMgr* pMgr = GetNewDBMgr();
1335cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1336cdf0e10cSrcweir /*
1337cdf0e10cSrcweir if(pMgr && pMgr->OpenDB(DBMGR_STD, GetDBDesc(), sal_False))
1338cdf0e10cSrcweir {
1339cdf0e10cSrcweir if(!pMgr->IsInMerge() )
1340cdf0e10cSrcweir pMgr->ToFirstSelectedRecord(DBMGR_STD);
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir aCalc.VarChange( sDBNumNm, pMgr->GetCurSelectedRecordId(DBMGR_STD));
1343cdf0e10cSrcweir }
1344cdf0e10cSrcweir */
1345cdf0e10cSrcweir
1346cdf0e10cSrcweir String aNew;
1347cdf0e10cSrcweir const _SetGetExpFldPtr* ppSortLst = pUpdtFlds->GetSortLst()->GetData();
1348cdf0e10cSrcweir for( n = pUpdtFlds->GetSortLst()->Count(); n; --n, ++ppSortLst )
1349cdf0e10cSrcweir {
1350cdf0e10cSrcweir SwSection* pSect = (SwSection*)(*ppSortLst)->GetSection();
1351cdf0e10cSrcweir if( pSect )
1352cdf0e10cSrcweir {
1353cdf0e10cSrcweir //!SECTION
1354cdf0e10cSrcweir
1355cdf0e10cSrcweir SwSbxValue aValue = aCalc.Calculate(
1356cdf0e10cSrcweir pSect->GetCondition() );
1357cdf0e10cSrcweir if(!aValue.IsVoidValue())
1358cdf0e10cSrcweir pSect->SetCondHidden( aValue.GetBool() );
1359c0286415SOliver-Rainer Wittmann continue;
1360c0286415SOliver-Rainer Wittmann }
1361cdf0e10cSrcweir
1362c0286415SOliver-Rainer Wittmann SwTxtFld* pTxtFld = (SwTxtFld*)(*ppSortLst)->GetTxtFld();
1363c0286415SOliver-Rainer Wittmann if( !pTxtFld )
1364c0286415SOliver-Rainer Wittmann {
1365*870262e3SDon Lewis ASSERT( sal_False, "what is it now?" );
1366c0286415SOliver-Rainer Wittmann continue;
1367c0286415SOliver-Rainer Wittmann }
1368cdf0e10cSrcweir
1369c0286415SOliver-Rainer Wittmann SwFmtFld* pFmtFld = (SwFmtFld*)&pTxtFld->GetFmtFld();
1370c0286415SOliver-Rainer Wittmann const SwField* pFld = pFmtFld->GetField();
1371cdf0e10cSrcweir
1372c0286415SOliver-Rainer Wittmann switch( nWhich = pFld->GetTyp()->Which() )
1373c0286415SOliver-Rainer Wittmann {
1374c0286415SOliver-Rainer Wittmann case RES_HIDDENTXTFLD:
1375c0286415SOliver-Rainer Wittmann {
1376c0286415SOliver-Rainer Wittmann SwHiddenTxtField* pHFld = (SwHiddenTxtField*)pFld;
1377cdf0e10cSrcweir SwSbxValue aValue = aCalc.Calculate( pHFld->GetPar1() );
1378cdf0e10cSrcweir sal_Bool bValue = !aValue.GetBool();
1379cdf0e10cSrcweir if(!aValue.IsVoidValue())
1380cdf0e10cSrcweir {
1381cdf0e10cSrcweir pHFld->SetValue( bValue );
1382cdf0e10cSrcweir // Feld Evaluieren
1383cdf0e10cSrcweir pHFld->Evaluate(this);
1384cdf0e10cSrcweir }
1385c0286415SOliver-Rainer Wittmann }
1386c0286415SOliver-Rainer Wittmann break;
1387c0286415SOliver-Rainer Wittmann case RES_HIDDENPARAFLD:
1388c0286415SOliver-Rainer Wittmann {
1389c0286415SOliver-Rainer Wittmann SwHiddenParaField* pHPFld = (SwHiddenParaField*)pFld;
1390cdf0e10cSrcweir SwSbxValue aValue = aCalc.Calculate( pHPFld->GetPar1() );
1391cdf0e10cSrcweir sal_Bool bValue = aValue.GetBool();
1392cdf0e10cSrcweir if(!aValue.IsVoidValue())
1393cdf0e10cSrcweir pHPFld->SetHidden( bValue );
1394cdf0e10cSrcweir }
1395cdf0e10cSrcweir break;
1396cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
1397cdf0e10cSrcweir {
1398cdf0e10cSrcweir ((SwDBSetNumberField*)pFld)->Evaluate(this);
1399cdf0e10cSrcweir aCalc.VarChange( sDBNumNm, ((SwDBSetNumberField*)pFld)->GetSetNumber());
1400cdf0e10cSrcweir }
1401cdf0e10cSrcweir break;
1402cdf0e10cSrcweir case RES_DBNEXTSETFLD:
1403cdf0e10cSrcweir case RES_DBNUMSETFLD:
1404cdf0e10cSrcweir UpdateDBNumFlds( *(SwDBNameInfField*)pFld, aCalc );
1405cdf0e10cSrcweir break;
1406cdf0e10cSrcweir case RES_DBFLD:
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir // Feld Evaluieren
1409cdf0e10cSrcweir ((SwDBField*)pFld)->Evaluate();
1410cdf0e10cSrcweir
1411cdf0e10cSrcweir SwDBData aTmpDBData(((SwDBField*)pFld)->GetDBData());
1412cdf0e10cSrcweir
1413cdf0e10cSrcweir if( pMgr->IsDataSourceOpen(aTmpDBData.sDataSource, aTmpDBData.sCommand, sal_False))
1414cdf0e10cSrcweir aCalc.VarChange( sDBNumNm, pMgr->GetSelectedRecordId(aTmpDBData.sDataSource, aTmpDBData.sCommand, aTmpDBData.nCommandType));
1415cdf0e10cSrcweir
1416cdf0e10cSrcweir const String& rName = pFld->GetTyp()->GetName();
1417cdf0e10cSrcweir
1418cdf0e10cSrcweir // Wert fuer den Calculator setzen
1419cdf0e10cSrcweir //JP 10.02.96: GetValue macht hier doch keinen Sinn
1420cdf0e10cSrcweir // ((SwDBField*)pFld)->GetValue();
1421cdf0e10cSrcweir
1422cdf0e10cSrcweir //!OK aCalc.VarChange(aName, ((SwDBField*)pFld)->GetValue(aCalc));
1423cdf0e10cSrcweir
1424cdf0e10cSrcweir // Eintrag in den HashTable eintragen
1425cdf0e10cSrcweir // Eintrag vorhanden ?
1426cdf0e10cSrcweir sal_uInt16 nPos;
1427cdf0e10cSrcweir SwHash* pFnd = Find( rName, pHashStrTbl, nStrFmtCnt, &nPos );
1428cdf0e10cSrcweir String const value(pFld->ExpandField(IsClipBoard()));
1429cdf0e10cSrcweir if( pFnd )
1430cdf0e10cSrcweir {
1431cdf0e10cSrcweir // Eintrag in der HashTabelle aendern
1432cdf0e10cSrcweir static_cast<_HashStr*>(pFnd)->aSetStr = value;
1433cdf0e10cSrcweir }
1434cdf0e10cSrcweir else
1435cdf0e10cSrcweir {
1436cdf0e10cSrcweir // neuen Eintrag einfuegen
1437cdf0e10cSrcweir *(pHashStrTbl + nPos ) = new _HashStr( rName,
1438cdf0e10cSrcweir value, static_cast<_HashStr *>(*(pHashStrTbl + nPos)));
1439cdf0e10cSrcweir }
1440cdf0e10cSrcweir }
1441cdf0e10cSrcweir break;
1442cdf0e10cSrcweir case RES_GETEXPFLD:
1443cdf0e10cSrcweir case RES_SETEXPFLD:
1444cdf0e10cSrcweir {
1445cdf0e10cSrcweir if( nsSwGetSetExpType::GSE_STRING & pFld->GetSubType() ) // String Ersetzung
1446cdf0e10cSrcweir {
1447cdf0e10cSrcweir if( RES_GETEXPFLD == nWhich )
1448cdf0e10cSrcweir {
1449cdf0e10cSrcweir SwGetExpField* pGFld = (SwGetExpField*)pFld;
1450cdf0e10cSrcweir
1451cdf0e10cSrcweir if( (!pUpdtFld || pUpdtFld == pTxtFld )
1452cdf0e10cSrcweir && pGFld->IsInBodyTxt() )
1453cdf0e10cSrcweir {
1454cdf0e10cSrcweir LookString( pHashStrTbl, nStrFmtCnt,
1455cdf0e10cSrcweir pGFld->GetFormula(), aNew );
1456cdf0e10cSrcweir pGFld->ChgExpStr( aNew );
1457cdf0e10cSrcweir }
1458cdf0e10cSrcweir }
1459cdf0e10cSrcweir else
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir SwSetExpField* pSFld = (SwSetExpField*)pFld;
1462cdf0e10cSrcweir // ist die "Formel" ein Feld ??
1463cdf0e10cSrcweir LookString( pHashStrTbl, nStrFmtCnt,
1464cdf0e10cSrcweir pSFld->GetFormula(), aNew );
1465cdf0e10cSrcweir
1466cdf0e10cSrcweir if( !aNew.Len() ) // nichts gefunden, dann ist die
1467cdf0e10cSrcweir aNew = pSFld->GetFormula(); // Formel der neue Wert
1468cdf0e10cSrcweir
1469cdf0e10cSrcweir // nur ein spezielles FeldUpdaten ?
1470cdf0e10cSrcweir if( !pUpdtFld || pUpdtFld == pTxtFld )
1471cdf0e10cSrcweir pSFld->ChgExpStr( aNew );
1472cdf0e10cSrcweir
1473cdf0e10cSrcweir // suche den Namen vom Feld
1474cdf0e10cSrcweir aNew = ((SwSetExpFieldType*)pSFld->GetTyp())->GetSetRefName();
1475cdf0e10cSrcweir // Eintrag vorhanden ?
1476cdf0e10cSrcweir sal_uInt16 nPos;
1477cdf0e10cSrcweir SwHash* pFnd = Find( aNew, pHashStrTbl, nStrFmtCnt, &nPos );
1478cdf0e10cSrcweir if( pFnd )
1479cdf0e10cSrcweir // Eintrag in der HashTabelle aendern
1480cdf0e10cSrcweir ((_HashStr*)pFnd)->aSetStr = pSFld->GetExpStr();
1481cdf0e10cSrcweir else
1482cdf0e10cSrcweir // neuen Eintrag einfuegen
1483cdf0e10cSrcweir *(pHashStrTbl + nPos ) = pFnd = new _HashStr( aNew,
1484cdf0e10cSrcweir pSFld->GetExpStr(),
1485cdf0e10cSrcweir (_HashStr*)*(pHashStrTbl + nPos) );
1486cdf0e10cSrcweir
1487cdf0e10cSrcweir // Erweiterung fuers Rechnen mit Strings
1488cdf0e10cSrcweir SwSbxValue aValue;
1489cdf0e10cSrcweir aValue.PutString( ((_HashStr*)pFnd)->aSetStr );
1490cdf0e10cSrcweir aCalc.VarChange( aNew, aValue );
1491cdf0e10cSrcweir }
1492cdf0e10cSrcweir }
1493cdf0e10cSrcweir else // Formel neu berechnen
1494cdf0e10cSrcweir {
1495cdf0e10cSrcweir if( RES_GETEXPFLD == nWhich )
1496cdf0e10cSrcweir {
1497cdf0e10cSrcweir SwGetExpField* pGFld = (SwGetExpField*)pFld;
1498cdf0e10cSrcweir
1499cdf0e10cSrcweir if( (!pUpdtFld || pUpdtFld == pTxtFld )
1500cdf0e10cSrcweir && pGFld->IsInBodyTxt() )
1501cdf0e10cSrcweir {
1502cdf0e10cSrcweir SwSbxValue aValue = aCalc.Calculate(
1503cdf0e10cSrcweir pGFld->GetFormula());
1504cdf0e10cSrcweir if(!aValue.IsVoidValue())
1505cdf0e10cSrcweir pGFld->SetValue(aValue.GetDouble() );
1506cdf0e10cSrcweir }
1507cdf0e10cSrcweir }
1508cdf0e10cSrcweir else
1509cdf0e10cSrcweir {
1510cdf0e10cSrcweir SwSetExpField* pSFld = (SwSetExpField*)pFld;
1511cdf0e10cSrcweir SwSetExpFieldType* pSFldTyp = (SwSetExpFieldType*)pFld->GetTyp();
1512cdf0e10cSrcweir aNew = pSFldTyp->GetName();
1513cdf0e10cSrcweir
1514cdf0e10cSrcweir SwNode* pSeqNd = 0;
1515cdf0e10cSrcweir
1516cdf0e10cSrcweir if( pSFld->IsSequenceFld() )
1517cdf0e10cSrcweir {
1518cdf0e10cSrcweir const sal_uInt8 nLvl = pSFldTyp->GetOutlineLvl();
1519cdf0e10cSrcweir if( MAXLEVEL > nLvl )
1520cdf0e10cSrcweir {
1521cdf0e10cSrcweir // dann teste, ob die Nummer neu aufsetzen muss
1522cdf0e10cSrcweir pSeqNd = GetNodes()[ (*ppSortLst)->GetNode() ];
1523cdf0e10cSrcweir
1524cdf0e10cSrcweir const SwTxtNode* pOutlNd = pSeqNd->
1525cdf0e10cSrcweir FindOutlineNodeOfLevel( nLvl );
1526cdf0e10cSrcweir if( pSFldTyp->GetOutlineChgNd() != pOutlNd )
1527cdf0e10cSrcweir {
1528cdf0e10cSrcweir pSFldTyp->SetOutlineChgNd( pOutlNd );
1529cdf0e10cSrcweir aCalc.VarChange( aNew, 0 );
1530cdf0e10cSrcweir }
1531cdf0e10cSrcweir }
1532cdf0e10cSrcweir }
1533cdf0e10cSrcweir
1534cdf0e10cSrcweir aNew += '=';
1535cdf0e10cSrcweir aNew += pSFld->GetFormula();
1536cdf0e10cSrcweir
1537cdf0e10cSrcweir SwSbxValue aValue = aCalc.Calculate( aNew );
1538cdf0e10cSrcweir double nErg = aValue.GetDouble();
1539cdf0e10cSrcweir // nur ein spezielles Feld updaten ?
1540cdf0e10cSrcweir if( !aValue.IsVoidValue() && (!pUpdtFld || pUpdtFld == pTxtFld) )
1541cdf0e10cSrcweir {
1542cdf0e10cSrcweir pSFld->SetValue( nErg );
1543cdf0e10cSrcweir
1544cdf0e10cSrcweir if( pSeqNd )
1545cdf0e10cSrcweir pSFldTyp->SetChapter( *pSFld, *pSeqNd );
1546cdf0e10cSrcweir }
1547cdf0e10cSrcweir }
1548cdf0e10cSrcweir }
1549cdf0e10cSrcweir }
1550cdf0e10cSrcweir } // switch
1551cdf0e10cSrcweir
1552cdf0e10cSrcweir pFmtFld->ModifyNotification( 0, 0 ); // Formatierung anstossen
1553cdf0e10cSrcweir
1554cdf0e10cSrcweir if( pUpdtFld == pTxtFld ) // sollte nur dieses geupdatet werden
1555cdf0e10cSrcweir {
1556cdf0e10cSrcweir if( RES_GETEXPFLD == nWhich || // nur GetFeld oder
1557cdf0e10cSrcweir RES_HIDDENTXTFLD == nWhich || // HiddenTxt?
1558cdf0e10cSrcweir RES_HIDDENPARAFLD == nWhich) // HiddenParaFld?
1559cdf0e10cSrcweir break; // beenden
1560cdf0e10cSrcweir pUpdtFld = 0; // ab jetzt alle Updaten
1561cdf0e10cSrcweir }
1562cdf0e10cSrcweir }
1563cdf0e10cSrcweir
1564cdf0e10cSrcweir pMgr->CloseAll(sal_False);
1565cdf0e10cSrcweir // HashTabelle wieder loeschen
1566cdf0e10cSrcweir ::DeleteHashTable( pHashStrTbl, nStrFmtCnt );
1567cdf0e10cSrcweir
1568cdf0e10cSrcweir // Referenzfelder updaten
1569cdf0e10cSrcweir if( bUpdRefFlds )
1570cdf0e10cSrcweir UpdateRefFlds(NULL);
1571cdf0e10cSrcweir
1572cdf0e10cSrcweir pUpdtFlds->SetInUpdateFlds( bOldInUpdateFlds );
1573cdf0e10cSrcweir pUpdtFlds->SetFieldsDirty( sal_False );
1574cdf0e10cSrcweir }
1575cdf0e10cSrcweir
1576cdf0e10cSrcweir /*--------------------------------------------------------------------
1577cdf0e10cSrcweir Beschreibung:
1578cdf0e10cSrcweir --------------------------------------------------------------------*/
1579cdf0e10cSrcweir
UpdateDBNumFlds(SwDBNameInfField & rDBFld,SwCalc & rCalc)1580cdf0e10cSrcweir void SwDoc::UpdateDBNumFlds( SwDBNameInfField& rDBFld, SwCalc& rCalc )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir SwNewDBMgr* pMgr = GetNewDBMgr();
1583cdf0e10cSrcweir
1584cdf0e10cSrcweir sal_uInt16 nFldType = rDBFld.Which();
1585cdf0e10cSrcweir
1586cdf0e10cSrcweir sal_Bool bPar1 = rCalc.Calculate( rDBFld.GetPar1() ).GetBool();
1587cdf0e10cSrcweir
1588cdf0e10cSrcweir if( RES_DBNEXTSETFLD == nFldType )
1589cdf0e10cSrcweir ((SwDBNextSetField&)rDBFld).SetCondValid( bPar1 );
1590cdf0e10cSrcweir else
1591cdf0e10cSrcweir ((SwDBNumSetField&)rDBFld).SetCondValid( bPar1 );
1592cdf0e10cSrcweir
1593cdf0e10cSrcweir if( rDBFld.GetRealDBData().sDataSource.getLength() )
1594cdf0e10cSrcweir {
1595cdf0e10cSrcweir // Eine bestimmte Datenbank bearbeiten
1596cdf0e10cSrcweir if( RES_DBNEXTSETFLD == nFldType )
1597cdf0e10cSrcweir ((SwDBNextSetField&)rDBFld).Evaluate(this);
1598cdf0e10cSrcweir else
1599cdf0e10cSrcweir ((SwDBNumSetField&)rDBFld).Evaluate(this);
1600cdf0e10cSrcweir
1601cdf0e10cSrcweir SwDBData aTmpDBData( rDBFld.GetDBData(this) );
1602cdf0e10cSrcweir
1603cdf0e10cSrcweir if( pMgr->OpenDataSource( aTmpDBData.sDataSource, aTmpDBData.sCommand, -1, false ))
1604cdf0e10cSrcweir rCalc.VarChange( lcl_GetDBVarName( *this, rDBFld),
1605cdf0e10cSrcweir pMgr->GetSelectedRecordId(aTmpDBData.sDataSource, aTmpDBData.sCommand, aTmpDBData.nCommandType) );
1606cdf0e10cSrcweir }
1607cdf0e10cSrcweir else
1608cdf0e10cSrcweir {
1609cdf0e10cSrcweir DBG_ERROR("TODO: what should happen with unnamed DBFields?");
1610cdf0e10cSrcweir }
1611cdf0e10cSrcweir }
1612cdf0e10cSrcweir
1613cdf0e10cSrcweir /*--------------------------------------------------------------------
1614cdf0e10cSrcweir Beschreibung:
1615cdf0e10cSrcweir --------------------------------------------------------------------*/
1616cdf0e10cSrcweir
_InitFieldTypes()1617cdf0e10cSrcweir void SwDoc::_InitFieldTypes() // wird vom CTOR gerufen!!
1618cdf0e10cSrcweir {
1619cdf0e10cSrcweir // Feldtypen
1620cdf0e10cSrcweir sal_uInt16 nFldType = 0;
1621cdf0e10cSrcweir pFldTypes->Insert( new SwDateTimeFieldType(this), nFldType++ );
1622cdf0e10cSrcweir pFldTypes->Insert( new SwChapterFieldType, nFldType++ );
1623cdf0e10cSrcweir pFldTypes->Insert( new SwPageNumberFieldType, nFldType++ );
1624cdf0e10cSrcweir pFldTypes->Insert( new SwAuthorFieldType, nFldType++ );
1625cdf0e10cSrcweir pFldTypes->Insert( new SwFileNameFieldType(this), nFldType++ );
1626cdf0e10cSrcweir pFldTypes->Insert( new SwDBNameFieldType(this), nFldType++);
1627cdf0e10cSrcweir pFldTypes->Insert( new SwGetExpFieldType(this), nFldType++ );
1628cdf0e10cSrcweir pFldTypes->Insert( new SwGetRefFieldType( this ), nFldType++ );
1629cdf0e10cSrcweir pFldTypes->Insert( new SwHiddenTxtFieldType, nFldType++ );
1630cdf0e10cSrcweir pFldTypes->Insert( new SwPostItFieldType(this), nFldType++ );
1631cdf0e10cSrcweir pFldTypes->Insert( new SwDocStatFieldType(this), nFldType++);
1632cdf0e10cSrcweir pFldTypes->Insert( new SwDocInfoFieldType(this), nFldType++);
1633cdf0e10cSrcweir pFldTypes->Insert( new SwInputFieldType( this ), nFldType++ );
1634cdf0e10cSrcweir pFldTypes->Insert( new SwTblFieldType( this ), nFldType++);
1635cdf0e10cSrcweir pFldTypes->Insert( new SwMacroFieldType(this), nFldType++ );
1636cdf0e10cSrcweir pFldTypes->Insert( new SwHiddenParaFieldType, nFldType++ );
1637cdf0e10cSrcweir pFldTypes->Insert( new SwDBNextSetFieldType, nFldType++ );
1638cdf0e10cSrcweir pFldTypes->Insert( new SwDBNumSetFieldType, nFldType++ );
1639cdf0e10cSrcweir pFldTypes->Insert( new SwDBSetNumberFieldType, nFldType++ );
1640cdf0e10cSrcweir pFldTypes->Insert( new SwTemplNameFieldType(this), nFldType++);
1641cdf0e10cSrcweir pFldTypes->Insert( new SwTemplNameFieldType(this),nFldType++);
1642cdf0e10cSrcweir pFldTypes->Insert( new SwExtUserFieldType, nFldType++ );
1643cdf0e10cSrcweir pFldTypes->Insert( new SwRefPageSetFieldType, nFldType++ );
1644cdf0e10cSrcweir pFldTypes->Insert( new SwRefPageGetFieldType( this ), nFldType++ );
1645cdf0e10cSrcweir pFldTypes->Insert( new SwJumpEditFieldType( this ), nFldType++ );
1646cdf0e10cSrcweir pFldTypes->Insert( new SwScriptFieldType( this ), nFldType++ );
1647cdf0e10cSrcweir pFldTypes->Insert( new SwCombinedCharFieldType, nFldType++ );
1648cdf0e10cSrcweir pFldTypes->Insert( new SwDropDownFieldType, nFldType++ );
1649cdf0e10cSrcweir
1650cdf0e10cSrcweir // Types muessen am Ende stehen !!
1651cdf0e10cSrcweir // Im InsertFldType wird davon ausgegangen !!!!
1652cdf0e10cSrcweir // MIB 14.04.95: Im Sw3StringPool::Setup (sw3imp.cxx) und
1653cdf0e10cSrcweir // lcl_sw3io_InSetExpField (sw3field.cxx) jetzt auch
1654cdf0e10cSrcweir pFldTypes->Insert( new SwSetExpFieldType(this,
1655cdf0e10cSrcweir SW_RESSTR(STR_POOLCOLL_LABEL_ABB), nsSwGetSetExpType::GSE_SEQ), nFldType++);
1656cdf0e10cSrcweir pFldTypes->Insert( new SwSetExpFieldType(this,
1657cdf0e10cSrcweir SW_RESSTR(STR_POOLCOLL_LABEL_TABLE), nsSwGetSetExpType::GSE_SEQ),nFldType++);
1658cdf0e10cSrcweir pFldTypes->Insert( new SwSetExpFieldType(this,
1659cdf0e10cSrcweir SW_RESSTR(STR_POOLCOLL_LABEL_FRAME), nsSwGetSetExpType::GSE_SEQ),nFldType++);
1660cdf0e10cSrcweir pFldTypes->Insert( new SwSetExpFieldType(this,
1661cdf0e10cSrcweir SW_RESSTR(STR_POOLCOLL_LABEL_DRAWING), nsSwGetSetExpType::GSE_SEQ),nFldType++);
1662cdf0e10cSrcweir
1663cdf0e10cSrcweir ASSERT( nFldType == INIT_FLDTYPES, "Bad initsize: SwFldTypes" );
1664cdf0e10cSrcweir }
1665cdf0e10cSrcweir
InsDelFldInFldLst(bool bIns,const SwTxtFld & rFld)1666cdf0e10cSrcweir void SwDoc::InsDelFldInFldLst( bool bIns, const SwTxtFld& rFld )
1667cdf0e10cSrcweir {
1668cdf0e10cSrcweir if( !mbNewFldLst || !IsInDtor() )
1669cdf0e10cSrcweir pUpdtFlds->InsDelFldInFldLst( bIns, rFld );
1670cdf0e10cSrcweir }
1671cdf0e10cSrcweir
GetDBData()1672cdf0e10cSrcweir SwDBData SwDoc::GetDBData()
1673cdf0e10cSrcweir {
1674cdf0e10cSrcweir return GetDBDesc();
1675cdf0e10cSrcweir }
1676cdf0e10cSrcweir
GetDBDesc()1677cdf0e10cSrcweir const SwDBData& SwDoc::GetDBDesc()
1678cdf0e10cSrcweir {
1679cdf0e10cSrcweir if(!aDBData.sDataSource.getLength())
1680cdf0e10cSrcweir {
1681cdf0e10cSrcweir const sal_uInt16 nSize = pFldTypes->Count();
1682cdf0e10cSrcweir for(sal_uInt16 i = 0; i < nSize && !aDBData.sDataSource.getLength(); ++i)
1683cdf0e10cSrcweir {
1684cdf0e10cSrcweir SwFieldType& rFldType = *((*pFldTypes)[i]);
1685cdf0e10cSrcweir sal_uInt16 nWhich = rFldType.Which();
1686cdf0e10cSrcweir if(IsUsed(rFldType))
1687cdf0e10cSrcweir {
1688cdf0e10cSrcweir switch(nWhich)
1689cdf0e10cSrcweir {
1690cdf0e10cSrcweir case RES_DBFLD:
1691cdf0e10cSrcweir case RES_DBNEXTSETFLD:
1692cdf0e10cSrcweir case RES_DBNUMSETFLD:
1693cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
1694cdf0e10cSrcweir {
1695c0286415SOliver-Rainer Wittmann SwIterator<SwFmtFld,SwFieldType> aIter( rFldType );
1696c0286415SOliver-Rainer Wittmann for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
1697cdf0e10cSrcweir {
1698cdf0e10cSrcweir if(pFld->IsFldInDoc())
1699cdf0e10cSrcweir {
1700cdf0e10cSrcweir if(RES_DBFLD == nWhich)
1701c0286415SOliver-Rainer Wittmann aDBData = (static_cast < SwDBFieldType * > (pFld->GetField()->GetTyp()))->GetDBData();
1702cdf0e10cSrcweir else
1703c0286415SOliver-Rainer Wittmann aDBData = (static_cast < SwDBNameInfField* > (pFld->GetField()))->GetRealDBData();
1704cdf0e10cSrcweir break;
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir }
1707cdf0e10cSrcweir }
1708cdf0e10cSrcweir break;
1709cdf0e10cSrcweir }
1710cdf0e10cSrcweir }
1711cdf0e10cSrcweir }
1712cdf0e10cSrcweir }
1713cdf0e10cSrcweir if(!aDBData.sDataSource.getLength())
1714cdf0e10cSrcweir aDBData = GetNewDBMgr()->GetAddressDBName();
1715c0286415SOliver-Rainer Wittmann return aDBData;
1716cdf0e10cSrcweir }
1717cdf0e10cSrcweir
SetInitDBFields(sal_Bool b)1718cdf0e10cSrcweir void SwDoc::SetInitDBFields( sal_Bool b )
1719cdf0e10cSrcweir {
1720cdf0e10cSrcweir GetNewDBMgr()->SetInitDBFields( b );
1721cdf0e10cSrcweir }
1722cdf0e10cSrcweir
1723cdf0e10cSrcweir /*--------------------------------------------------------------------
1724cdf0e10cSrcweir Beschreibung: Alle von Feldern verwendete Datenbanken herausfinden
1725cdf0e10cSrcweir --------------------------------------------------------------------*/
lcl_DBDataToString(const SwDBData & rData)1726cdf0e10cSrcweir String lcl_DBDataToString(const SwDBData& rData)
1727cdf0e10cSrcweir {
1728cdf0e10cSrcweir String sRet = rData.sDataSource;
1729cdf0e10cSrcweir sRet += DB_DELIM;
1730cdf0e10cSrcweir sRet += (String)rData.sCommand;
1731cdf0e10cSrcweir sRet += DB_DELIM;
1732cdf0e10cSrcweir sRet += String::CreateFromInt32(rData.nCommandType);
1733cdf0e10cSrcweir return sRet;
1734cdf0e10cSrcweir }
GetAllUsedDB(SvStringsDtor & rDBNameList,const SvStringsDtor * pAllDBNames)1735cdf0e10cSrcweir void SwDoc::GetAllUsedDB( SvStringsDtor& rDBNameList,
1736cdf0e10cSrcweir const SvStringsDtor* pAllDBNames )
1737cdf0e10cSrcweir {
1738cdf0e10cSrcweir SvStringsDtor aUsedDBNames;
1739cdf0e10cSrcweir SvStringsDtor aAllDBNames;
1740cdf0e10cSrcweir
1741cdf0e10cSrcweir if( !pAllDBNames )
1742cdf0e10cSrcweir {
1743cdf0e10cSrcweir GetAllDBNames( aAllDBNames );
1744cdf0e10cSrcweir pAllDBNames = &aAllDBNames;
1745cdf0e10cSrcweir }
1746cdf0e10cSrcweir
1747cdf0e10cSrcweir SwSectionFmts& rArr = GetSections();
1748cdf0e10cSrcweir for (sal_uInt16 n = rArr.Count(); n; )
1749cdf0e10cSrcweir {
1750cdf0e10cSrcweir SwSection* pSect = rArr[ --n ]->GetSection();
1751cdf0e10cSrcweir
1752cdf0e10cSrcweir if( pSect )
1753cdf0e10cSrcweir {
1754cdf0e10cSrcweir String aCond( pSect->GetCondition() );
1755cdf0e10cSrcweir AddUsedDBToList( rDBNameList, FindUsedDBs( *pAllDBNames,
1756cdf0e10cSrcweir aCond, aUsedDBNames ) );
1757cdf0e10cSrcweir aUsedDBNames.DeleteAndDestroy( 0, aUsedDBNames.Count() );
1758cdf0e10cSrcweir }
1759cdf0e10cSrcweir }
1760cdf0e10cSrcweir
1761cdf0e10cSrcweir const SfxPoolItem* pItem;
1762cdf0e10cSrcweir sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_FIELD );
1763cdf0e10cSrcweir for (sal_uInt32 n = 0; n < nMaxItems; ++n)
1764cdf0e10cSrcweir {
1765cdf0e10cSrcweir if( 0 == (pItem = GetAttrPool().GetItem2( RES_TXTATR_FIELD, n ) ))
1766cdf0e10cSrcweir continue;
1767cdf0e10cSrcweir
1768cdf0e10cSrcweir const SwFmtFld* pFmtFld = (SwFmtFld*)pItem;
1769cdf0e10cSrcweir const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1770cdf0e10cSrcweir if( !pTxtFld || !pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
1771cdf0e10cSrcweir continue;
1772cdf0e10cSrcweir
1773c0286415SOliver-Rainer Wittmann const SwField* pFld = pFmtFld->GetField();
1774cdf0e10cSrcweir switch( pFld->GetTyp()->Which() )
1775cdf0e10cSrcweir {
1776cdf0e10cSrcweir case RES_DBFLD:
1777cdf0e10cSrcweir AddUsedDBToList( rDBNameList,
1778cdf0e10cSrcweir lcl_DBDataToString(((SwDBField*)pFld)->GetDBData() ));
1779cdf0e10cSrcweir break;
1780cdf0e10cSrcweir
1781cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
1782cdf0e10cSrcweir case RES_DBNAMEFLD:
1783cdf0e10cSrcweir AddUsedDBToList( rDBNameList,
1784cdf0e10cSrcweir lcl_DBDataToString(((SwDBNameInfField*)pFld)->GetRealDBData() ));
1785cdf0e10cSrcweir break;
1786cdf0e10cSrcweir
1787cdf0e10cSrcweir case RES_DBNUMSETFLD:
1788cdf0e10cSrcweir case RES_DBNEXTSETFLD:
1789cdf0e10cSrcweir AddUsedDBToList( rDBNameList,
1790cdf0e10cSrcweir lcl_DBDataToString(((SwDBNameInfField*)pFld)->GetRealDBData() ));
1791cdf0e10cSrcweir // kein break // JP: ist das so richtig ??
1792cdf0e10cSrcweir
1793cdf0e10cSrcweir case RES_HIDDENTXTFLD:
1794cdf0e10cSrcweir case RES_HIDDENPARAFLD:
1795cdf0e10cSrcweir AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames,
1796cdf0e10cSrcweir pFld->GetPar1(), aUsedDBNames ));
1797cdf0e10cSrcweir aUsedDBNames.DeleteAndDestroy( 0, aUsedDBNames.Count() );
1798cdf0e10cSrcweir break;
1799cdf0e10cSrcweir
1800cdf0e10cSrcweir case RES_SETEXPFLD:
1801cdf0e10cSrcweir case RES_GETEXPFLD:
1802cdf0e10cSrcweir case RES_TABLEFLD:
1803cdf0e10cSrcweir AddUsedDBToList(rDBNameList, FindUsedDBs( *pAllDBNames,
1804cdf0e10cSrcweir pFld->GetFormula(), aUsedDBNames ));
1805cdf0e10cSrcweir aUsedDBNames.DeleteAndDestroy( 0, aUsedDBNames.Count() );
1806cdf0e10cSrcweir break;
1807cdf0e10cSrcweir }
1808cdf0e10cSrcweir }
1809cdf0e10cSrcweir }
1810cdf0e10cSrcweir
1811cdf0e10cSrcweir /*--------------------------------------------------------------------
1812cdf0e10cSrcweir Beschreibung:
1813cdf0e10cSrcweir --------------------------------------------------------------------*/
1814cdf0e10cSrcweir
GetAllDBNames(SvStringsDtor & rAllDBNames)1815cdf0e10cSrcweir void SwDoc::GetAllDBNames( SvStringsDtor& rAllDBNames )
1816cdf0e10cSrcweir {
1817cdf0e10cSrcweir SwNewDBMgr* pMgr = GetNewDBMgr();
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir const SwDSParamArr& rArr = pMgr->GetDSParamArray();
1820cdf0e10cSrcweir for(sal_uInt16 i = 0; i < rArr.Count(); i++)
1821cdf0e10cSrcweir {
1822cdf0e10cSrcweir SwDSParam* pParam = rArr[i];
1823cdf0e10cSrcweir String* pStr = new String( pParam->sDataSource );
1824cdf0e10cSrcweir (*pStr) += DB_DELIM;
1825cdf0e10cSrcweir (*pStr) += (String)pParam->sCommand;
1826cdf0e10cSrcweir rAllDBNames.Insert( pStr, rAllDBNames.Count() );
1827cdf0e10cSrcweir }
1828cdf0e10cSrcweir }
1829cdf0e10cSrcweir
1830cdf0e10cSrcweir /*--------------------------------------------------------------------
1831cdf0e10cSrcweir Beschreibung:
1832cdf0e10cSrcweir --------------------------------------------------------------------*/
1833cdf0e10cSrcweir
FindUsedDBs(const SvStringsDtor & rAllDBNames,const String & rFormel,SvStringsDtor & rUsedDBNames)1834cdf0e10cSrcweir SvStringsDtor& SwDoc::FindUsedDBs( const SvStringsDtor& rAllDBNames,
1835cdf0e10cSrcweir const String& rFormel,
1836cdf0e10cSrcweir SvStringsDtor& rUsedDBNames )
1837cdf0e10cSrcweir {
1838cdf0e10cSrcweir const CharClass& rCC = GetAppCharClass();
1839cdf0e10cSrcweir String sFormel( rFormel);
1840cdf0e10cSrcweir #ifndef UNX
1841cdf0e10cSrcweir rCC.toUpper( sFormel );
1842cdf0e10cSrcweir #endif
1843cdf0e10cSrcweir
1844cdf0e10cSrcweir xub_StrLen nPos;
1845cdf0e10cSrcweir for (sal_uInt16 i = 0; i < rAllDBNames.Count(); ++i )
1846cdf0e10cSrcweir {
1847cdf0e10cSrcweir const String* pStr = rAllDBNames.GetObject(i);
1848cdf0e10cSrcweir
1849cdf0e10cSrcweir if( STRING_NOTFOUND != (nPos = sFormel.Search( *pStr )) &&
1850cdf0e10cSrcweir sFormel.GetChar( nPos + pStr->Len() ) == '.' &&
1851cdf0e10cSrcweir (!nPos || !rCC.isLetterNumeric( sFormel, nPos - 1 )))
1852cdf0e10cSrcweir {
1853cdf0e10cSrcweir // Tabellenname suchen
1854cdf0e10cSrcweir xub_StrLen nEndPos;
1855cdf0e10cSrcweir nPos += pStr->Len() + 1;
1856cdf0e10cSrcweir if( STRING_NOTFOUND != (nEndPos = sFormel.Search('.', nPos)) )
1857cdf0e10cSrcweir {
1858cdf0e10cSrcweir String* pDBNm = new String( *pStr );
1859cdf0e10cSrcweir pDBNm->Append( DB_DELIM );
1860cdf0e10cSrcweir pDBNm->Append( sFormel.Copy( nPos, nEndPos - nPos ));
1861cdf0e10cSrcweir rUsedDBNames.Insert( pDBNm, rUsedDBNames.Count() );
1862cdf0e10cSrcweir }
1863cdf0e10cSrcweir }
1864cdf0e10cSrcweir }
1865cdf0e10cSrcweir return rUsedDBNames;
1866cdf0e10cSrcweir }
1867cdf0e10cSrcweir
1868cdf0e10cSrcweir /*--------------------------------------------------------------------
1869cdf0e10cSrcweir Beschreibung:
1870cdf0e10cSrcweir --------------------------------------------------------------------*/
1871cdf0e10cSrcweir
AddUsedDBToList(SvStringsDtor & rDBNameList,const SvStringsDtor & rUsedDBNames)1872cdf0e10cSrcweir void SwDoc::AddUsedDBToList( SvStringsDtor& rDBNameList,
1873cdf0e10cSrcweir const SvStringsDtor& rUsedDBNames )
1874cdf0e10cSrcweir {
1875cdf0e10cSrcweir for (sal_uInt16 i = 0; i < rUsedDBNames.Count(); i++)
1876cdf0e10cSrcweir AddUsedDBToList( rDBNameList, *rUsedDBNames.GetObject(i) );
1877cdf0e10cSrcweir }
1878cdf0e10cSrcweir
1879cdf0e10cSrcweir /*--------------------------------------------------------------------
1880cdf0e10cSrcweir Beschreibung:
1881cdf0e10cSrcweir --------------------------------------------------------------------*/
1882cdf0e10cSrcweir
AddUsedDBToList(SvStringsDtor & rDBNameList,const String & rDBName)1883cdf0e10cSrcweir void SwDoc::AddUsedDBToList( SvStringsDtor& rDBNameList, const String& rDBName)
1884cdf0e10cSrcweir {
1885cdf0e10cSrcweir if( !rDBName.Len() )
1886cdf0e10cSrcweir return;
1887cdf0e10cSrcweir
1888cdf0e10cSrcweir #ifdef UNX
1889cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rDBNameList.Count(); ++i )
1890cdf0e10cSrcweir if( rDBName == rDBNameList.GetObject(i)->GetToken(0) )
1891cdf0e10cSrcweir return;
1892cdf0e10cSrcweir #else
1893cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
1894cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rDBNameList.Count(); ++i )
1895cdf0e10cSrcweir if( rSCmp.isEqual( rDBName, rDBNameList.GetObject(i)->GetToken(0) ) )
1896cdf0e10cSrcweir return;
1897cdf0e10cSrcweir #endif
1898cdf0e10cSrcweir
1899cdf0e10cSrcweir SwDBData aData;
1900cdf0e10cSrcweir aData.sDataSource = rDBName.GetToken(0, DB_DELIM);
1901cdf0e10cSrcweir aData.sCommand = rDBName.GetToken(1, DB_DELIM);
1902cdf0e10cSrcweir aData.nCommandType = -1;
1903cdf0e10cSrcweir GetNewDBMgr()->CreateDSData(aData);
1904cdf0e10cSrcweir String* pNew = new String( rDBName );
1905cdf0e10cSrcweir rDBNameList.Insert( pNew, rDBNameList.Count() );
1906cdf0e10cSrcweir }
1907cdf0e10cSrcweir
1908cdf0e10cSrcweir /*--------------------------------------------------------------------
1909cdf0e10cSrcweir Beschreibung:
1910cdf0e10cSrcweir --------------------------------------------------------------------*/
1911cdf0e10cSrcweir
ChangeDBFields(const SvStringsDtor & rOldNames,const String & rNewName)1912cdf0e10cSrcweir void SwDoc::ChangeDBFields( const SvStringsDtor& rOldNames,
1913cdf0e10cSrcweir const String& rNewName )
1914cdf0e10cSrcweir {
1915cdf0e10cSrcweir SwDBData aNewDBData;
1916cdf0e10cSrcweir aNewDBData.sDataSource = rNewName.GetToken(0, DB_DELIM);
1917cdf0e10cSrcweir aNewDBData.sCommand = rNewName.GetToken(1, DB_DELIM);
1918cdf0e10cSrcweir aNewDBData.nCommandType = (short)rNewName.GetToken(2, DB_DELIM).ToInt32();
1919cdf0e10cSrcweir
1920cdf0e10cSrcweir String sFormel;
1921cdf0e10cSrcweir
1922cdf0e10cSrcweir SwSectionFmts& rArr = GetSections();
1923cdf0e10cSrcweir for (sal_uInt16 n = rArr.Count(); n; )
1924cdf0e10cSrcweir {
1925cdf0e10cSrcweir SwSection* pSect = rArr[ --n ]->GetSection();
1926cdf0e10cSrcweir
1927cdf0e10cSrcweir if( pSect )
1928cdf0e10cSrcweir {
1929cdf0e10cSrcweir sFormel = pSect->GetCondition();
1930cdf0e10cSrcweir ReplaceUsedDBs( rOldNames, rNewName, sFormel);
1931cdf0e10cSrcweir pSect->SetCondition(sFormel);
1932cdf0e10cSrcweir }
1933cdf0e10cSrcweir }
1934cdf0e10cSrcweir
1935cdf0e10cSrcweir const SfxPoolItem* pItem;
1936cdf0e10cSrcweir sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_FIELD );
1937cdf0e10cSrcweir
1938cdf0e10cSrcweir for (sal_uInt32 n = 0; n < nMaxItems; ++n )
1939cdf0e10cSrcweir {
1940cdf0e10cSrcweir if( 0 == (pItem = GetAttrPool().GetItem2( RES_TXTATR_FIELD, n ) ))
1941cdf0e10cSrcweir continue;
1942cdf0e10cSrcweir
1943cdf0e10cSrcweir SwFmtFld* pFmtFld = (SwFmtFld*)pItem;
1944cdf0e10cSrcweir SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
1945cdf0e10cSrcweir if( !pTxtFld || !pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
1946cdf0e10cSrcweir continue;
1947cdf0e10cSrcweir
1948c0286415SOliver-Rainer Wittmann SwField* pFld = pFmtFld->GetField();
1949cdf0e10cSrcweir sal_Bool bExpand = sal_False;
1950cdf0e10cSrcweir
1951cdf0e10cSrcweir switch( pFld->GetTyp()->Which() )
1952cdf0e10cSrcweir {
1953cdf0e10cSrcweir case RES_DBFLD:
1954cdf0e10cSrcweir if( IsNameInArray( rOldNames, lcl_DBDataToString(((SwDBField*)pFld)->GetDBData())))
1955cdf0e10cSrcweir {
1956cdf0e10cSrcweir SwDBFieldType* pOldTyp = (SwDBFieldType*)pFld->GetTyp();
1957cdf0e10cSrcweir
1958cdf0e10cSrcweir SwDBFieldType* pTyp = (SwDBFieldType*)InsertFldType(
1959cdf0e10cSrcweir SwDBFieldType(this, pOldTyp->GetColumnName(), aNewDBData));
1960cdf0e10cSrcweir
1961cdf0e10cSrcweir pFmtFld->RegisterToFieldType( *pTyp );
1962cdf0e10cSrcweir pFld->ChgTyp(pTyp);
1963cdf0e10cSrcweir
1964cdf0e10cSrcweir ((SwDBField*)pFld)->ClearInitialized();
1965cdf0e10cSrcweir ((SwDBField*)pFld)->InitContent();
1966cdf0e10cSrcweir
1967cdf0e10cSrcweir bExpand = sal_True;
1968cdf0e10cSrcweir }
1969cdf0e10cSrcweir break;
1970cdf0e10cSrcweir
1971cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
1972cdf0e10cSrcweir case RES_DBNAMEFLD:
1973cdf0e10cSrcweir if( IsNameInArray( rOldNames,
1974cdf0e10cSrcweir lcl_DBDataToString(((SwDBNameInfField*)pFld)->GetRealDBData())))
1975cdf0e10cSrcweir {
1976cdf0e10cSrcweir ((SwDBNameInfField*)pFld)->SetDBData(aNewDBData);
1977cdf0e10cSrcweir bExpand = sal_True;
1978cdf0e10cSrcweir }
1979cdf0e10cSrcweir break;
1980cdf0e10cSrcweir
1981cdf0e10cSrcweir case RES_DBNUMSETFLD:
1982cdf0e10cSrcweir case RES_DBNEXTSETFLD:
1983cdf0e10cSrcweir if( IsNameInArray( rOldNames,
1984cdf0e10cSrcweir lcl_DBDataToString(((SwDBNameInfField*)pFld)->GetRealDBData())))
1985cdf0e10cSrcweir {
1986cdf0e10cSrcweir ((SwDBNameInfField*)pFld)->SetDBData(aNewDBData);
1987cdf0e10cSrcweir bExpand = sal_True;
1988cdf0e10cSrcweir }
1989cdf0e10cSrcweir // kein break;
1990cdf0e10cSrcweir case RES_HIDDENTXTFLD:
1991cdf0e10cSrcweir case RES_HIDDENPARAFLD:
1992cdf0e10cSrcweir sFormel = pFld->GetPar1();
1993cdf0e10cSrcweir ReplaceUsedDBs( rOldNames, rNewName, sFormel);
1994cdf0e10cSrcweir pFld->SetPar1( sFormel );
1995cdf0e10cSrcweir bExpand = sal_True;
1996cdf0e10cSrcweir break;
1997cdf0e10cSrcweir
1998cdf0e10cSrcweir case RES_SETEXPFLD:
1999cdf0e10cSrcweir case RES_GETEXPFLD:
2000cdf0e10cSrcweir case RES_TABLEFLD:
2001cdf0e10cSrcweir sFormel = pFld->GetFormula();
2002cdf0e10cSrcweir ReplaceUsedDBs( rOldNames, rNewName, sFormel);
2003cdf0e10cSrcweir pFld->SetPar2( sFormel );
2004cdf0e10cSrcweir bExpand = sal_True;
2005cdf0e10cSrcweir break;
2006cdf0e10cSrcweir }
2007cdf0e10cSrcweir
2008cdf0e10cSrcweir if (bExpand)
20097887cc2eSOliver-Rainer Wittmann pTxtFld->ExpandTxtFld( true );
2010cdf0e10cSrcweir }
2011cdf0e10cSrcweir SetModified();
2012cdf0e10cSrcweir }
2013cdf0e10cSrcweir
2014cdf0e10cSrcweir /*--------------------------------------------------------------------
2015cdf0e10cSrcweir Beschreibung:
2016cdf0e10cSrcweir --------------------------------------------------------------------*/
2017cdf0e10cSrcweir
ReplaceUsedDBs(const SvStringsDtor & rUsedDBNames,const String & rNewName,String & rFormel)2018cdf0e10cSrcweir void SwDoc::ReplaceUsedDBs( const SvStringsDtor& rUsedDBNames,
2019cdf0e10cSrcweir const String& rNewName, String& rFormel )
2020cdf0e10cSrcweir {
2021cdf0e10cSrcweir const CharClass& rCC = GetAppCharClass();
2022cdf0e10cSrcweir String sFormel(rFormel);
2023cdf0e10cSrcweir String sNewName( rNewName );
2024cdf0e10cSrcweir sNewName.SearchAndReplace( DB_DELIM, '.');
2025cdf0e10cSrcweir //the command type is not part of the condition
2026cdf0e10cSrcweir sNewName = sNewName.GetToken(0, DB_DELIM);
2027cdf0e10cSrcweir String sUpperNewNm( sNewName );
2028cdf0e10cSrcweir
2029cdf0e10cSrcweir
2030cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rUsedDBNames.Count(); ++i )
2031cdf0e10cSrcweir {
2032cdf0e10cSrcweir String sDBName( *rUsedDBNames.GetObject( i ) );
2033cdf0e10cSrcweir
2034cdf0e10cSrcweir sDBName.SearchAndReplace( DB_DELIM, '.');
2035cdf0e10cSrcweir //cut off command type
2036cdf0e10cSrcweir sDBName = sDBName.GetToken(0, DB_DELIM);
2037cdf0e10cSrcweir if( !sDBName.Equals( sUpperNewNm ))
2038cdf0e10cSrcweir {
2039cdf0e10cSrcweir xub_StrLen nPos = 0;
2040cdf0e10cSrcweir
2041cdf0e10cSrcweir while ((nPos = sFormel.Search(sDBName, nPos)) != STRING_NOTFOUND)
2042cdf0e10cSrcweir {
2043cdf0e10cSrcweir if( sFormel.GetChar( nPos + sDBName.Len() ) == '.' &&
2044cdf0e10cSrcweir (!nPos || !rCC.isLetterNumeric( sFormel, nPos - 1 )))
2045cdf0e10cSrcweir {
2046cdf0e10cSrcweir rFormel.Erase( nPos, sDBName.Len() );
2047cdf0e10cSrcweir rFormel.Insert( sNewName, nPos );
2048cdf0e10cSrcweir //prevent re-searching - this is useless and provokes
2049cdf0e10cSrcweir //endless loops when names containing each other and numbers are exchanged
2050cdf0e10cSrcweir //e.g.: old ?12345.12345 new: i12345.12345
2051cdf0e10cSrcweir nPos = nPos + sNewName.Len();
2052cdf0e10cSrcweir sFormel = rFormel;
2053cdf0e10cSrcweir }
2054cdf0e10cSrcweir }
2055cdf0e10cSrcweir }
2056cdf0e10cSrcweir }
2057cdf0e10cSrcweir }
2058cdf0e10cSrcweir
2059cdf0e10cSrcweir /*--------------------------------------------------------------------
2060cdf0e10cSrcweir Beschreibung:
2061cdf0e10cSrcweir --------------------------------------------------------------------*/
2062cdf0e10cSrcweir
IsNameInArray(const SvStringsDtor & rArr,const String & rName)2063cdf0e10cSrcweir sal_Bool SwDoc::IsNameInArray( const SvStringsDtor& rArr, const String& rName )
2064cdf0e10cSrcweir {
2065cdf0e10cSrcweir #ifdef UNX
2066cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rArr.Count(); ++i )
2067cdf0e10cSrcweir if( rName == *rArr[ i ] )
2068cdf0e10cSrcweir return sal_True;
2069cdf0e10cSrcweir #else
2070cdf0e10cSrcweir const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
2071cdf0e10cSrcweir for( sal_uInt16 i = 0; i < rArr.Count(); ++i )
2072cdf0e10cSrcweir if( rSCmp.isEqual( rName, *rArr[ i] ))
2073cdf0e10cSrcweir return sal_True;
2074cdf0e10cSrcweir #endif
2075cdf0e10cSrcweir return sal_False;
2076cdf0e10cSrcweir }
2077cdf0e10cSrcweir
SetFixFields(bool bOnlyTimeDate,const DateTime * pNewDateTime)2078cdf0e10cSrcweir void SwDoc::SetFixFields( bool bOnlyTimeDate, const DateTime* pNewDateTime )
2079cdf0e10cSrcweir {
2080cdf0e10cSrcweir sal_Bool bIsModified = IsModified();
2081cdf0e10cSrcweir
2082cdf0e10cSrcweir sal_uLong nDate, nTime;
2083cdf0e10cSrcweir if( pNewDateTime )
2084cdf0e10cSrcweir {
2085cdf0e10cSrcweir nDate = pNewDateTime->GetDate();
2086cdf0e10cSrcweir nTime = pNewDateTime->GetTime();
2087cdf0e10cSrcweir }
2088cdf0e10cSrcweir else
2089cdf0e10cSrcweir {
2090cdf0e10cSrcweir nDate = Date().GetDate();
2091cdf0e10cSrcweir nTime = Time().GetTime();
2092cdf0e10cSrcweir }
2093cdf0e10cSrcweir
2094cdf0e10cSrcweir sal_uInt16 aTypes[5] = {
2095cdf0e10cSrcweir /*0*/ RES_DOCINFOFLD,
2096cdf0e10cSrcweir /*1*/ RES_AUTHORFLD,
2097cdf0e10cSrcweir /*2*/ RES_EXTUSERFLD,
2098cdf0e10cSrcweir /*3*/ RES_FILENAMEFLD,
2099cdf0e10cSrcweir /*4*/ RES_DATETIMEFLD }; // MUSS am Ende stehen!!
2100cdf0e10cSrcweir
2101cdf0e10cSrcweir sal_uInt16 nStt = bOnlyTimeDate ? 4 : 0;
2102cdf0e10cSrcweir
2103cdf0e10cSrcweir for( ; nStt < 5; ++nStt )
2104cdf0e10cSrcweir {
2105cdf0e10cSrcweir SwFieldType* pFldType = GetSysFldType( aTypes[ nStt ] );
2106cdf0e10cSrcweir SwIterator<SwFmtFld,SwFieldType> aIter( *pFldType );
2107c0286415SOliver-Rainer Wittmann for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
2108cdf0e10cSrcweir {
2109c0286415SOliver-Rainer Wittmann if( pFmtFld && pFmtFld->GetTxtFld() )
2110cdf0e10cSrcweir {
2111cdf0e10cSrcweir sal_Bool bChgd = sal_False;
2112cdf0e10cSrcweir switch( aTypes[ nStt ] )
2113cdf0e10cSrcweir {
2114cdf0e10cSrcweir case RES_DOCINFOFLD:
2115c0286415SOliver-Rainer Wittmann if( ((SwDocInfoField*)pFmtFld->GetField())->IsFixed() )
2116cdf0e10cSrcweir {
2117cdf0e10cSrcweir bChgd = sal_True;
2118c0286415SOliver-Rainer Wittmann SwDocInfoField* pDocInfFld = (SwDocInfoField*)pFmtFld->GetField();
2119cdf0e10cSrcweir pDocInfFld->SetExpansion( ((SwDocInfoFieldType*)
2120cdf0e10cSrcweir pDocInfFld->GetTyp())->Expand(
2121cdf0e10cSrcweir pDocInfFld->GetSubType(),
2122cdf0e10cSrcweir pDocInfFld->GetFormat(),
2123cdf0e10cSrcweir pDocInfFld->GetLanguage(),
2124cdf0e10cSrcweir pDocInfFld->GetName() ) );
2125cdf0e10cSrcweir }
2126cdf0e10cSrcweir break;
2127cdf0e10cSrcweir
2128cdf0e10cSrcweir case RES_AUTHORFLD:
2129c0286415SOliver-Rainer Wittmann if( ((SwAuthorField*)pFmtFld->GetField())->IsFixed() )
2130cdf0e10cSrcweir {
2131cdf0e10cSrcweir bChgd = sal_True;
2132c0286415SOliver-Rainer Wittmann SwAuthorField* pAuthorFld = (SwAuthorField*)pFmtFld->GetField();
2133cdf0e10cSrcweir pAuthorFld->SetExpansion( ((SwAuthorFieldType*)
2134cdf0e10cSrcweir pAuthorFld->GetTyp())->Expand(
2135cdf0e10cSrcweir pAuthorFld->GetFormat() ) );
2136cdf0e10cSrcweir }
2137cdf0e10cSrcweir break;
2138cdf0e10cSrcweir
2139cdf0e10cSrcweir case RES_EXTUSERFLD:
2140c0286415SOliver-Rainer Wittmann if( ((SwExtUserField*)pFmtFld->GetField())->IsFixed() )
2141cdf0e10cSrcweir {
2142cdf0e10cSrcweir bChgd = sal_True;
2143c0286415SOliver-Rainer Wittmann SwExtUserField* pExtUserFld = (SwExtUserField*)pFmtFld->GetField();
2144cdf0e10cSrcweir pExtUserFld->SetExpansion( ((SwExtUserFieldType*)
2145cdf0e10cSrcweir pExtUserFld->GetTyp())->Expand(
2146cdf0e10cSrcweir pExtUserFld->GetSubType(),
2147cdf0e10cSrcweir pExtUserFld->GetFormat()));
2148cdf0e10cSrcweir }
2149cdf0e10cSrcweir break;
2150cdf0e10cSrcweir
2151cdf0e10cSrcweir case RES_DATETIMEFLD:
2152c0286415SOliver-Rainer Wittmann if( ((SwDateTimeField*)pFmtFld->GetField())->IsFixed() )
2153cdf0e10cSrcweir {
2154cdf0e10cSrcweir bChgd = sal_True;
2155c0286415SOliver-Rainer Wittmann ((SwDateTimeField*)pFmtFld->GetField())->SetDateTime(
2156cdf0e10cSrcweir DateTime(Date(nDate), Time(nTime)) );
2157cdf0e10cSrcweir }
2158cdf0e10cSrcweir break;
2159cdf0e10cSrcweir
2160cdf0e10cSrcweir case RES_FILENAMEFLD:
2161c0286415SOliver-Rainer Wittmann if( ((SwFileNameField*)pFmtFld->GetField())->IsFixed() )
2162cdf0e10cSrcweir {
2163cdf0e10cSrcweir bChgd = sal_True;
2164cdf0e10cSrcweir SwFileNameField* pFileNameFld =
2165c0286415SOliver-Rainer Wittmann (SwFileNameField*)pFmtFld->GetField();
2166cdf0e10cSrcweir pFileNameFld->SetExpansion( ((SwFileNameFieldType*)
2167cdf0e10cSrcweir pFileNameFld->GetTyp())->Expand(
2168cdf0e10cSrcweir pFileNameFld->GetFormat() ) );
2169cdf0e10cSrcweir }
2170cdf0e10cSrcweir break;
2171cdf0e10cSrcweir }
2172cdf0e10cSrcweir
2173cdf0e10cSrcweir // Formatierung anstossen
2174cdf0e10cSrcweir if( bChgd )
2175c0286415SOliver-Rainer Wittmann pFmtFld->ModifyNotification( 0, 0 );
2176cdf0e10cSrcweir }
2177cdf0e10cSrcweir }
2178cdf0e10cSrcweir }
2179cdf0e10cSrcweir
2180cdf0e10cSrcweir if( !bIsModified )
2181cdf0e10cSrcweir ResetModified();
2182cdf0e10cSrcweir }
2183cdf0e10cSrcweir
SetFieldsDirty(bool b,const SwNode * pChk,sal_uLong nLen)2184cdf0e10cSrcweir bool SwDoc::SetFieldsDirty( bool b, const SwNode* pChk, sal_uLong nLen )
2185cdf0e10cSrcweir {
2186cdf0e10cSrcweir // teste ggfs. mal, ob die angegbenen Nodes ueberhaupt Felder beinhalten.
2187cdf0e10cSrcweir // wenn nicht, braucht das Flag nicht veraendert werden.
2188cdf0e10cSrcweir sal_Bool bFldsFnd = sal_False;
2189cdf0e10cSrcweir if( b && pChk && !GetUpdtFlds().IsFieldsDirty() && !IsInDtor()
2190cdf0e10cSrcweir // ?? was ist mit Undo, da will man es doch auch haben !!
2191cdf0e10cSrcweir /*&& &pChk->GetNodes() == &GetNodes()*/ )
2192cdf0e10cSrcweir {
2193cdf0e10cSrcweir b = sal_False;
2194cdf0e10cSrcweir if( !nLen )
2195cdf0e10cSrcweir ++nLen;
2196cdf0e10cSrcweir sal_uLong nStt = pChk->GetIndex();
2197cdf0e10cSrcweir const SwNodes& rNds = pChk->GetNodes();
2198cdf0e10cSrcweir while( nLen-- )
2199cdf0e10cSrcweir {
2200cdf0e10cSrcweir const SwTxtNode* pTNd = rNds[ nStt++ ]->GetTxtNode();
2201cdf0e10cSrcweir if( pTNd )
2202cdf0e10cSrcweir {
2203cdf0e10cSrcweir if( //pTNd->GetFmtColl() && //#outline level,zhaojianwei
2204cdf0e10cSrcweir // MAXLEVEL > pTNd->GetTxtColl()->GetOutlineLevel() )
2205cdf0e10cSrcweir pTNd->GetAttrOutlineLevel() != 0 )//<-end,zhaojianwei
2206cdf0e10cSrcweir // Kapitelfelder aktualisieren
2207cdf0e10cSrcweir b = sal_True;
2208cdf0e10cSrcweir else if( pTNd->GetpSwpHints() && pTNd->GetSwpHints().Count() )
2209cdf0e10cSrcweir for( sal_uInt16 n = 0, nEnd = pTNd->GetSwpHints().Count();
2210cdf0e10cSrcweir n < nEnd; ++n )
2211cdf0e10cSrcweir {
2212cdf0e10cSrcweir const SwTxtAttr* pAttr = pTNd->GetSwpHints()[ n ];
2213dec99bbdSOliver-Rainer Wittmann if ( pAttr->Which() == RES_TXTATR_FIELD )
2214cdf0e10cSrcweir {
2215cdf0e10cSrcweir b = sal_True;
2216cdf0e10cSrcweir break;
2217cdf0e10cSrcweir }
2218cdf0e10cSrcweir }
2219cdf0e10cSrcweir
2220cdf0e10cSrcweir if( b )
2221cdf0e10cSrcweir break;
2222cdf0e10cSrcweir }
2223cdf0e10cSrcweir }
2224cdf0e10cSrcweir bFldsFnd = b;
2225cdf0e10cSrcweir }
2226cdf0e10cSrcweir GetUpdtFlds().SetFieldsDirty( b );
2227cdf0e10cSrcweir return bFldsFnd;
2228cdf0e10cSrcweir }
2229cdf0e10cSrcweir /* -----------------------------21.12.99 12:55--------------------------------
2230cdf0e10cSrcweir
2231cdf0e10cSrcweir ---------------------------------------------------------------------------*/
ChangeAuthorityData(const SwAuthEntry * pNewData)2232cdf0e10cSrcweir void SwDoc::ChangeAuthorityData( const SwAuthEntry* pNewData )
2233cdf0e10cSrcweir {
2234cdf0e10cSrcweir const sal_uInt16 nSize = pFldTypes->Count();
2235cdf0e10cSrcweir
2236cdf0e10cSrcweir for( sal_uInt16 i = INIT_FLDTYPES; i < nSize; ++i )
2237cdf0e10cSrcweir {
2238cdf0e10cSrcweir SwFieldType* pFldType = (*pFldTypes)[i];
2239cdf0e10cSrcweir if( RES_AUTHORITY == pFldType->Which() )
2240cdf0e10cSrcweir {
2241cdf0e10cSrcweir SwAuthorityFieldType* pAuthType = (SwAuthorityFieldType*)pFldType;
2242cdf0e10cSrcweir pAuthType->ChangeEntryContent(pNewData);
2243cdf0e10cSrcweir break;
2244cdf0e10cSrcweir }
2245cdf0e10cSrcweir }
2246cdf0e10cSrcweir
2247cdf0e10cSrcweir }
2248cdf0e10cSrcweir /*--------------------------------------------------------------------
2249cdf0e10cSrcweir Beschreibung:
2250cdf0e10cSrcweir --------------------------------------------------------------------*/
2251cdf0e10cSrcweir
InsDelFldInFldLst(sal_Bool bIns,const SwTxtFld & rFld)2252cdf0e10cSrcweir void SwDocUpdtFld::InsDelFldInFldLst( sal_Bool bIns, const SwTxtFld& rFld )
2253cdf0e10cSrcweir {
2254c0286415SOliver-Rainer Wittmann const sal_uInt16 nWhich = rFld.GetFmtFld().GetField()->GetTyp()->Which();
2255cdf0e10cSrcweir switch( nWhich )
2256cdf0e10cSrcweir {
2257cdf0e10cSrcweir case RES_DBFLD:
2258cdf0e10cSrcweir case RES_SETEXPFLD:
2259cdf0e10cSrcweir case RES_HIDDENPARAFLD:
2260cdf0e10cSrcweir case RES_HIDDENTXTFLD:
2261cdf0e10cSrcweir case RES_DBNUMSETFLD:
2262cdf0e10cSrcweir case RES_DBNEXTSETFLD:
2263cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
2264cdf0e10cSrcweir case RES_GETEXPFLD:
2265cdf0e10cSrcweir break; // diese muessen ein-/ausgetragen werden!
2266cdf0e10cSrcweir
2267cdf0e10cSrcweir default:
2268cdf0e10cSrcweir return;
2269cdf0e10cSrcweir }
2270cdf0e10cSrcweir
2271cdf0e10cSrcweir SetFieldsDirty( sal_True );
2272cdf0e10cSrcweir if( !pFldSortLst )
2273cdf0e10cSrcweir {
2274cdf0e10cSrcweir if( !bIns ) // keine Liste vorhanden und loeschen
2275cdf0e10cSrcweir return; // dann nichts tun
2276cdf0e10cSrcweir pFldSortLst = new _SetGetExpFlds( 64, 16 );
2277cdf0e10cSrcweir }
2278cdf0e10cSrcweir
2279cdf0e10cSrcweir if( bIns ) // neu einfuegen:
2280cdf0e10cSrcweir GetBodyNode( rFld, nWhich );
2281cdf0e10cSrcweir else
2282cdf0e10cSrcweir {
2283cdf0e10cSrcweir // ueber den pTxtFld Pointer suchen. Ist zwar eine Sortierte
2284cdf0e10cSrcweir // Liste, aber nach Node-Positionen sortiert. Bis dieser
2285cdf0e10cSrcweir // bestimmt ist, ist das Suchen nach dem Pointer schon fertig
2286cdf0e10cSrcweir for( sal_uInt16 n = 0; n < pFldSortLst->Count(); ++n )
2287cdf0e10cSrcweir if( &rFld == (*pFldSortLst)[ n ]->GetPointer() )
2288cdf0e10cSrcweir pFldSortLst->DeleteAndDestroy( n--, 1 );
2289cdf0e10cSrcweir // ein Feld kann mehrfach vorhanden sein!
2290cdf0e10cSrcweir }
2291cdf0e10cSrcweir }
2292cdf0e10cSrcweir
MakeFldList(SwDoc & rDoc,int bAll,int eGetMode)2293cdf0e10cSrcweir void SwDocUpdtFld::MakeFldList( SwDoc& rDoc, int bAll, int eGetMode )
2294cdf0e10cSrcweir {
2295cdf0e10cSrcweir if( !pFldSortLst || bAll || !( eGetMode & nFldLstGetMode ) ||
2296cdf0e10cSrcweir rDoc.GetNodes().Count() != nNodes )
2297cdf0e10cSrcweir _MakeFldList( rDoc, eGetMode );
2298cdf0e10cSrcweir }
2299cdf0e10cSrcweir
_MakeFldList(SwDoc & rDoc,int eGetMode)2300cdf0e10cSrcweir void SwDocUpdtFld::_MakeFldList( SwDoc& rDoc, int eGetMode )
2301cdf0e10cSrcweir {
2302cdf0e10cSrcweir // neue Version: gehe ueber alle Felder vom Attribut-Pool
2303cdf0e10cSrcweir if( pFldSortLst )
2304cdf0e10cSrcweir delete pFldSortLst;
2305cdf0e10cSrcweir pFldSortLst = new _SetGetExpFlds( 64, 16 );
2306cdf0e10cSrcweir
2307cdf0e10cSrcweir /// OD 09.08.2002 [#101207#,#101216#,#101778#] - consider and unhide sections
2308cdf0e10cSrcweir /// with hide condition, only in mode GETFLD_ALL (<eGetMode == GETFLD_ALL>)
2309cdf0e10cSrcweir /// notes by OD:
2310cdf0e10cSrcweir /// eGetMode == GETFLD_CALC in call from methods SwDoc::FldsToCalc
2311cdf0e10cSrcweir /// eGetMode == GETFLD_EXPAND in call from method SwDoc::FldsToExpand
2312cdf0e10cSrcweir /// eGetMode == GETFLD_ALL in call from method SwDoc::UpdateExpFlds
2313cdf0e10cSrcweir /// I figured out that hidden section only have to be shown,
2314cdf0e10cSrcweir /// if fields have updated (call by SwDoc::UpdateExpFlds) and thus
2315cdf0e10cSrcweir /// the hide conditions of section have to be updated.
2316cdf0e10cSrcweir /// For correct updating the hide condition of a section, its position
2317cdf0e10cSrcweir /// have to be known in order to insert the hide condition as a new
2318cdf0e10cSrcweir /// expression field into the sorted field list (<pFldSortLst>).
2319cdf0e10cSrcweir if ( eGetMode == GETFLD_ALL )
2320cdf0e10cSrcweir // zuerst die Bereiche einsammeln. Alle die ueber Bedingung
2321cdf0e10cSrcweir // gehiddet sind, wieder mit Frames versorgen, damit die darin
2322cdf0e10cSrcweir // enthaltenen Felder richtig einsortiert werden!!!
2323cdf0e10cSrcweir {
2324cdf0e10cSrcweir // damit die Frames richtig angelegt werden, muessen sie in der
2325cdf0e10cSrcweir // Reihenfolgen von oben nach unten expandiert werden
2326cdf0e10cSrcweir SvULongs aTmpArr;
2327cdf0e10cSrcweir SwSectionFmts& rArr = rDoc.GetSections();
2328cdf0e10cSrcweir SwSectionNode* pSectNd;
2329cdf0e10cSrcweir sal_uInt16 nArrStt = 0;
2330cdf0e10cSrcweir sal_uLong nSttCntnt = rDoc.GetNodes().GetEndOfExtras().GetIndex();
2331cdf0e10cSrcweir
2332cdf0e10cSrcweir for (sal_uInt16 n = rArr.Count(); n; )
2333cdf0e10cSrcweir {
2334cdf0e10cSrcweir SwSection* pSect = rArr[ --n ]->GetSection();
2335cdf0e10cSrcweir if( pSect && pSect->IsHidden() && pSect->GetCondition().Len() &&
2336cdf0e10cSrcweir 0 != ( pSectNd = pSect->GetFmt()->GetSectionNode() ))
2337cdf0e10cSrcweir {
2338cdf0e10cSrcweir sal_uLong nIdx = pSectNd->GetIndex();
2339cdf0e10cSrcweir sal_uInt16 i;
2340cdf0e10cSrcweir
2341cdf0e10cSrcweir for( i = 0; i < aTmpArr.Count() && aTmpArr[ i ] < nIdx; ++i )
2342cdf0e10cSrcweir ;
2343cdf0e10cSrcweir aTmpArr.Insert( nIdx, i );
2344cdf0e10cSrcweir if( nIdx < nSttCntnt )
2345cdf0e10cSrcweir ++nArrStt;
2346cdf0e10cSrcweir }
2347cdf0e10cSrcweir }
2348cdf0e10cSrcweir
2349cdf0e10cSrcweir // erst alle anzeigen, damit die Frames vorhanden sind. Mit deren
2350cdf0e10cSrcweir // Position wird das BodyAnchor ermittelt.
2351cdf0e10cSrcweir // Dafuer erst den ContentBereich, dann die Sonderbereiche!!!
2352cdf0e10cSrcweir for (sal_uInt16 n = nArrStt; n < aTmpArr.Count(); ++n)
2353cdf0e10cSrcweir {
2354cdf0e10cSrcweir pSectNd = rDoc.GetNodes()[ aTmpArr[ n ] ]->GetSectionNode();
2355cdf0e10cSrcweir ASSERT( pSectNd, "Wo ist mein SectionNode" );
2356cdf0e10cSrcweir pSectNd->GetSection().SetCondHidden( sal_False );
2357cdf0e10cSrcweir }
2358cdf0e10cSrcweir for (sal_uInt16 n = 0; n < nArrStt; ++n)
2359cdf0e10cSrcweir {
2360cdf0e10cSrcweir pSectNd = rDoc.GetNodes()[ aTmpArr[ n ] ]->GetSectionNode();
2361cdf0e10cSrcweir ASSERT( pSectNd, "Wo ist mein SectionNode" );
2362cdf0e10cSrcweir pSectNd->GetSection().SetCondHidden( sal_False );
2363cdf0e10cSrcweir }
2364cdf0e10cSrcweir
2365cdf0e10cSrcweir // so, erst jetzt alle sortiert in die Liste eintragen
2366cdf0e10cSrcweir for (sal_uInt16 n = 0; n < aTmpArr.Count(); ++n)
2367cdf0e10cSrcweir {
2368cdf0e10cSrcweir GetBodyNode( *rDoc.GetNodes()[ aTmpArr[ n ] ]->GetSectionNode() );
2369cdf0e10cSrcweir }
2370cdf0e10cSrcweir }
2371cdf0e10cSrcweir
2372cdf0e10cSrcweir String sTrue( String::CreateFromAscii(
2373cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "sal_True" ))),
2374cdf0e10cSrcweir sFalse( String::CreateFromAscii(
2375cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "sal_False" )));
2376cdf0e10cSrcweir
2377cdf0e10cSrcweir sal_Bool bIsDBMgr = 0 != rDoc.GetNewDBMgr();
2378cdf0e10cSrcweir sal_uInt16 nWhich, n;
2379cdf0e10cSrcweir const String* pFormel = 0;
2380cdf0e10cSrcweir const SfxPoolItem* pItem;
2381cdf0e10cSrcweir sal_uInt32 nMaxItems = rDoc.GetAttrPool().GetItemCount2( RES_TXTATR_FIELD );
2382cdf0e10cSrcweir for( n = 0; n < nMaxItems; ++n )
2383cdf0e10cSrcweir {
2384cdf0e10cSrcweir if( 0 == (pItem = rDoc.GetAttrPool().GetItem2( RES_TXTATR_FIELD, n )) )
2385cdf0e10cSrcweir continue;
2386cdf0e10cSrcweir
2387cdf0e10cSrcweir const SwFmtFld* pFmtFld = (SwFmtFld*)pItem;
2388cdf0e10cSrcweir const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
2389cdf0e10cSrcweir if( !pTxtFld || !pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
2390cdf0e10cSrcweir continue;
2391cdf0e10cSrcweir
2392c0286415SOliver-Rainer Wittmann const SwField* pFld = pFmtFld->GetField();
2393cdf0e10cSrcweir switch( nWhich = pFld->GetTyp()->Which() )
2394cdf0e10cSrcweir {
2395cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
2396cdf0e10cSrcweir case RES_GETEXPFLD:
2397cdf0e10cSrcweir if( GETFLD_ALL == eGetMode )
2398cdf0e10cSrcweir pFormel = &sTrue;
2399cdf0e10cSrcweir break;
2400cdf0e10cSrcweir
2401cdf0e10cSrcweir case RES_DBFLD:
2402cdf0e10cSrcweir if( GETFLD_EXPAND & eGetMode )
2403cdf0e10cSrcweir pFormel = &sTrue;
2404cdf0e10cSrcweir break;
2405cdf0e10cSrcweir
2406cdf0e10cSrcweir case RES_SETEXPFLD:
2407cdf0e10cSrcweir /// fields of subtype <string> have also been add
2408cdf0e10cSrcweir /// for calculation (eGetMode == GETFLD_CALC).
2409cdf0e10cSrcweir /// Thus, add fields of subtype <string> in all modes
2410cdf0e10cSrcweir /// (eGetMode == GETFLD_EXPAND||GETFLD_CALC||GETFLD_ALL)
2411cdf0e10cSrcweir /// and fields of other subtypes only in the modes
2412cdf0e10cSrcweir /// (eGetMode == GETFLD_CALC||GETFLD_ALL)
2413cdf0e10cSrcweir /* "old" if construct - not deleted for history and code review
2414cdf0e10cSrcweir if( ( nsSwGetSetExpType::GSE_STRING & pFld->GetSubType()
2415cdf0e10cSrcweir ? GETFLD_EXPAND : GETFLD_CALC )
2416cdf0e10cSrcweir & eGetMode )
2417cdf0e10cSrcweir */
2418cdf0e10cSrcweir if ( !(eGetMode == GETFLD_EXPAND) ||
2419cdf0e10cSrcweir (nsSwGetSetExpType::GSE_STRING & pFld->GetSubType()) )
2420cdf0e10cSrcweir {
2421cdf0e10cSrcweir pFormel = &sTrue;
2422cdf0e10cSrcweir }
2423cdf0e10cSrcweir break;
2424cdf0e10cSrcweir
2425cdf0e10cSrcweir case RES_HIDDENPARAFLD:
2426cdf0e10cSrcweir if( GETFLD_ALL == eGetMode )
2427cdf0e10cSrcweir {
2428cdf0e10cSrcweir pFormel = &pFld->GetPar1();
2429cdf0e10cSrcweir if( !pFormel->Len() || pFormel->Equals( sFalse ))
2430cdf0e10cSrcweir ((SwHiddenParaField*)pFld)->SetHidden( sal_False );
2431cdf0e10cSrcweir else if( pFormel->Equals( sTrue ))
2432cdf0e10cSrcweir ((SwHiddenParaField*)pFld)->SetHidden( sal_True );
2433cdf0e10cSrcweir else
2434cdf0e10cSrcweir break;
2435cdf0e10cSrcweir
2436cdf0e10cSrcweir pFormel = 0;
2437cdf0e10cSrcweir // Formatierung anstossen
2438cdf0e10cSrcweir ((SwFmtFld*)pFmtFld)->ModifyNotification( 0, 0 );
2439cdf0e10cSrcweir }
2440cdf0e10cSrcweir break;
2441cdf0e10cSrcweir
2442cdf0e10cSrcweir case RES_HIDDENTXTFLD:
2443cdf0e10cSrcweir if( GETFLD_ALL == eGetMode )
2444cdf0e10cSrcweir {
2445cdf0e10cSrcweir pFormel = &pFld->GetPar1();
2446cdf0e10cSrcweir if( !pFormel->Len() || pFormel->Equals( sFalse ))
2447cdf0e10cSrcweir ((SwHiddenTxtField*)pFld)->SetValue( sal_True );
2448cdf0e10cSrcweir else if( pFormel->Equals( sTrue ))
2449cdf0e10cSrcweir ((SwHiddenTxtField*)pFld)->SetValue( sal_False );
2450cdf0e10cSrcweir else
2451cdf0e10cSrcweir break;
2452cdf0e10cSrcweir
2453cdf0e10cSrcweir pFormel = 0;
2454cdf0e10cSrcweir
2455cdf0e10cSrcweir // Feld Evaluieren
2456cdf0e10cSrcweir ((SwHiddenTxtField*)pFld)->Evaluate(&rDoc);
2457cdf0e10cSrcweir // Formatierung anstossen
2458cdf0e10cSrcweir ((SwFmtFld*)pFmtFld)->ModifyNotification( 0, 0 );
2459cdf0e10cSrcweir }
2460cdf0e10cSrcweir break;
2461cdf0e10cSrcweir
2462cdf0e10cSrcweir case RES_DBNUMSETFLD:
2463cdf0e10cSrcweir {
2464cdf0e10cSrcweir SwDBData aDBData(((SwDBNumSetField*)pFld)->GetDBData(&rDoc));
2465cdf0e10cSrcweir
2466cdf0e10cSrcweir if (
2467cdf0e10cSrcweir (bIsDBMgr && rDoc.GetNewDBMgr()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) &&
2468cdf0e10cSrcweir (GETFLD_ALL == eGetMode || (GETFLD_CALC & eGetMode && ((SwDBNumSetField*)pFld)->IsCondValid()))
2469cdf0e10cSrcweir )
2470cdf0e10cSrcweir {
2471cdf0e10cSrcweir pFormel = &pFld->GetPar1();
2472cdf0e10cSrcweir }
2473cdf0e10cSrcweir }
2474cdf0e10cSrcweir break;
2475cdf0e10cSrcweir case RES_DBNEXTSETFLD:
2476cdf0e10cSrcweir {
2477cdf0e10cSrcweir SwDBData aDBData(((SwDBNextSetField*)pFld)->GetDBData(&rDoc));
2478cdf0e10cSrcweir
2479cdf0e10cSrcweir if (
2480cdf0e10cSrcweir (bIsDBMgr && rDoc.GetNewDBMgr()->OpenDataSource(aDBData.sDataSource, aDBData.sCommand)) &&
2481cdf0e10cSrcweir (GETFLD_ALL == eGetMode || (GETFLD_CALC & eGetMode && ((SwDBNextSetField*)pFld)->IsCondValid()))
2482cdf0e10cSrcweir )
2483cdf0e10cSrcweir {
2484cdf0e10cSrcweir pFormel = &pFld->GetPar1();
2485cdf0e10cSrcweir }
2486cdf0e10cSrcweir }
2487cdf0e10cSrcweir break;
2488cdf0e10cSrcweir }
2489cdf0e10cSrcweir
2490cdf0e10cSrcweir if( pFormel && pFormel->Len() )
2491cdf0e10cSrcweir {
2492cdf0e10cSrcweir GetBodyNode( *pTxtFld, nWhich );
2493cdf0e10cSrcweir pFormel = 0;
2494cdf0e10cSrcweir }
2495cdf0e10cSrcweir }
2496cdf0e10cSrcweir nFldLstGetMode = static_cast<sal_uInt8>( eGetMode );
2497cdf0e10cSrcweir nNodes = rDoc.GetNodes().Count();
2498cdf0e10cSrcweir
2499cdf0e10cSrcweir #ifdef JP_DEBUG
2500cdf0e10cSrcweir {
2501cdf0e10cSrcweir SvFileStream sOut( "f:\\x.x", STREAM_STD_WRITE );
2502cdf0e10cSrcweir sOut.Seek( STREAM_SEEK_TO_END );
2503cdf0e10cSrcweir sOut << "------------------" << endl;
2504cdf0e10cSrcweir const _SetGetExpFldPtr* pSortLst = pFldSortLst->GetData();
2505cdf0e10cSrcweir for( sal_uInt16 n = pFldSortLst->Count(); n; --n, ++pSortLst )
2506cdf0e10cSrcweir {
2507cdf0e10cSrcweir String sStr( (*pSortLst)->GetNode() );
2508cdf0e10cSrcweir sStr += "\t, ";
2509cdf0e10cSrcweir sStr += (*pSortLst)->GetCntnt();
2510cdf0e10cSrcweir sStr += "\tNode: ";
2511cdf0e10cSrcweir sStr += (*pSortLst)->GetFld()->GetTxtNode().StartOfSectionIndex();
2512cdf0e10cSrcweir sStr += "\tPos: ";
2513cdf0e10cSrcweir sStr += *(*pSortLst)->GetFld()->GetStart();
2514cdf0e10cSrcweir sStr += "\tType: ";
2515cdf0e10cSrcweir sStr += (*pSortLst)->GetFld()->GetFld().GetFld()->GetTyp()->Which();
2516cdf0e10cSrcweir
2517cdf0e10cSrcweir sOut << sStr.GetStr() << endl;
2518cdf0e10cSrcweir }
2519cdf0e10cSrcweir }
2520cdf0e10cSrcweir #endif
2521cdf0e10cSrcweir // JP_DEBUG
2522cdf0e10cSrcweir }
2523cdf0e10cSrcweir
2524cdf0e10cSrcweir /*--------------------------------------------------------------------
2525cdf0e10cSrcweir Beschreibung:
2526cdf0e10cSrcweir --------------------------------------------------------------------*/
2527cdf0e10cSrcweir
GetBodyNode(const SwTxtFld & rTFld,sal_uInt16 nFldWhich)2528cdf0e10cSrcweir void SwDocUpdtFld::GetBodyNode( const SwTxtFld& rTFld, sal_uInt16 nFldWhich )
2529cdf0e10cSrcweir {
2530cdf0e10cSrcweir const SwTxtNode& rTxtNd = rTFld.GetTxtNode();
2531cdf0e10cSrcweir const SwDoc& rDoc = *rTxtNd.GetDoc();
2532cdf0e10cSrcweir
2533cdf0e10cSrcweir // immer den ersten !! (in Tab-Headline, Kopf-/Fuss )
2534cdf0e10cSrcweir Point aPt;
2535cdf0e10cSrcweir const SwCntntFrm* pFrm = rTxtNd.getLayoutFrm( rDoc.GetCurrentLayout(), &aPt, 0, sal_False );
2536cdf0e10cSrcweir
2537cdf0e10cSrcweir _SetGetExpFld* pNew = NULL;
2538cdf0e10cSrcweir sal_Bool bIsInBody = sal_False;
2539cdf0e10cSrcweir
2540cdf0e10cSrcweir if( !pFrm || pFrm->IsInDocBody() )
2541cdf0e10cSrcweir {
2542cdf0e10cSrcweir // einen Index fuers bestimmen vom TextNode anlegen
2543cdf0e10cSrcweir SwNodeIndex aIdx( rTxtNd );
2544cdf0e10cSrcweir bIsInBody = rDoc.GetNodes().GetEndOfExtras().GetIndex() < aIdx.GetIndex();
2545cdf0e10cSrcweir
2546cdf0e10cSrcweir // #104291# dvo: We don't want to update fields in redlines, or those
2547cdf0e10cSrcweir // in frames whose anchor is in redline. However, we do want to update
2548cdf0e10cSrcweir // fields in hidden sections. So: In order to be updated, a field 1)
2549cdf0e10cSrcweir // must have a frame, or 2) it must be in the document body.
2550cdf0e10cSrcweir if( (pFrm != NULL) || bIsInBody )
2551cdf0e10cSrcweir pNew = new _SetGetExpFld( aIdx, &rTFld );
2552cdf0e10cSrcweir }
2553cdf0e10cSrcweir else
2554cdf0e10cSrcweir {
2555cdf0e10cSrcweir // einen Index fuers bestimmen vom TextNode anlegen
2556cdf0e10cSrcweir SwPosition aPos( rDoc.GetNodes().GetEndOfPostIts() );
2557cdf0e10cSrcweir #ifdef DBG_UTIL
2558cdf0e10cSrcweir ASSERT( GetBodyTxtNode( rDoc, aPos, *pFrm ), "wo steht das Feld" );
2559cdf0e10cSrcweir #else
2560cdf0e10cSrcweir GetBodyTxtNode( rDoc, aPos, *pFrm );
2561cdf0e10cSrcweir #endif
2562cdf0e10cSrcweir pNew = new _SetGetExpFld( aPos.nNode, &rTFld, &aPos.nContent );
2563cdf0e10cSrcweir }
2564cdf0e10cSrcweir
2565cdf0e10cSrcweir // bei GetExp.-/DB.-Felder immer das BodyTxtFlag setzen
2566cdf0e10cSrcweir if( RES_GETEXPFLD == nFldWhich )
2567cdf0e10cSrcweir {
2568c0286415SOliver-Rainer Wittmann SwGetExpField* pGetFld = (SwGetExpField*)rTFld.GetFmtFld().GetField();
2569cdf0e10cSrcweir pGetFld->ChgBodyTxtFlag( bIsInBody );
2570cdf0e10cSrcweir }
2571cdf0e10cSrcweir else if( RES_DBFLD == nFldWhich )
2572cdf0e10cSrcweir {
2573c0286415SOliver-Rainer Wittmann SwDBField* pDBFld = (SwDBField*)rTFld.GetFmtFld().GetField();
2574cdf0e10cSrcweir pDBFld->ChgBodyTxtFlag( bIsInBody );
2575cdf0e10cSrcweir }
2576cdf0e10cSrcweir
2577cdf0e10cSrcweir if( pNew != NULL )
2578cdf0e10cSrcweir if( !pFldSortLst->Insert( pNew ))
2579cdf0e10cSrcweir delete pNew;
2580cdf0e10cSrcweir }
2581cdf0e10cSrcweir
GetBodyNode(const SwSectionNode & rSectNd)2582cdf0e10cSrcweir void SwDocUpdtFld::GetBodyNode( const SwSectionNode& rSectNd )
2583cdf0e10cSrcweir {
2584cdf0e10cSrcweir const SwDoc& rDoc = *rSectNd.GetDoc();
2585cdf0e10cSrcweir _SetGetExpFld* pNew = 0;
2586cdf0e10cSrcweir
2587cdf0e10cSrcweir if( rSectNd.GetIndex() < rDoc.GetNodes().GetEndOfExtras().GetIndex() )
2588cdf0e10cSrcweir {
2589cdf0e10cSrcweir do { // middle check loop
2590cdf0e10cSrcweir
2591cdf0e10cSrcweir // dann muessen wir uns mal den Anker besorgen!
2592cdf0e10cSrcweir // einen Index fuers bestimmen vom TextNode anlegen
2593cdf0e10cSrcweir SwPosition aPos( rSectNd );
2594cdf0e10cSrcweir SwCntntNode* pCNd = rDoc.GetNodes().GoNext( &aPos.nNode ); // zum naechsten ContentNode
2595cdf0e10cSrcweir
2596cdf0e10cSrcweir if( !pCNd || !pCNd->IsTxtNode() )
2597cdf0e10cSrcweir break;
2598cdf0e10cSrcweir
2599cdf0e10cSrcweir // immer den ersten !! (in Tab-Headline, Kopf-/Fuss )
2600cdf0e10cSrcweir Point aPt;
2601cdf0e10cSrcweir const SwCntntFrm* pFrm = pCNd->getLayoutFrm( rDoc.GetCurrentLayout(), &aPt, 0, sal_False );
2602cdf0e10cSrcweir if( !pFrm )
2603cdf0e10cSrcweir break;
2604cdf0e10cSrcweir
2605cdf0e10cSrcweir #ifdef DBG_UTIL
2606cdf0e10cSrcweir ASSERT( GetBodyTxtNode( rDoc, aPos, *pFrm ), "wo steht das Feld" );
2607cdf0e10cSrcweir #else
2608cdf0e10cSrcweir GetBodyTxtNode( rDoc, aPos, *pFrm );
2609cdf0e10cSrcweir #endif
2610cdf0e10cSrcweir pNew = new _SetGetExpFld( rSectNd, &aPos );
2611cdf0e10cSrcweir
2612cdf0e10cSrcweir } while( sal_False );
2613cdf0e10cSrcweir }
2614cdf0e10cSrcweir
2615cdf0e10cSrcweir if( !pNew )
2616cdf0e10cSrcweir pNew = new _SetGetExpFld( rSectNd );
2617cdf0e10cSrcweir
2618cdf0e10cSrcweir if( !pFldSortLst->Insert( pNew ))
2619cdf0e10cSrcweir delete pNew;
2620cdf0e10cSrcweir }
2621cdf0e10cSrcweir
InsertFldType(const SwFieldType & rType)2622cdf0e10cSrcweir void SwDocUpdtFld::InsertFldType( const SwFieldType& rType )
2623cdf0e10cSrcweir {
2624cdf0e10cSrcweir String sFldName;
2625cdf0e10cSrcweir switch( rType.Which() )
2626cdf0e10cSrcweir {
2627cdf0e10cSrcweir case RES_USERFLD :
2628cdf0e10cSrcweir sFldName = ((SwUserFieldType&)rType).GetName();
2629cdf0e10cSrcweir break;
2630cdf0e10cSrcweir case RES_SETEXPFLD:
2631cdf0e10cSrcweir sFldName = ((SwSetExpFieldType&)rType).GetName();
2632cdf0e10cSrcweir break;
2633cdf0e10cSrcweir default:
2634*870262e3SDon Lewis ASSERT( sal_False, "no valid field type" );
2635cdf0e10cSrcweir }
2636cdf0e10cSrcweir
2637cdf0e10cSrcweir if( sFldName.Len() )
2638cdf0e10cSrcweir {
2639cdf0e10cSrcweir SetFieldsDirty( sal_True );
2640cdf0e10cSrcweir // suchen und aus der HashTabelle entfernen
2641cdf0e10cSrcweir GetAppCharClass().toLower( sFldName );
2642cdf0e10cSrcweir sal_uInt16 n;
2643cdf0e10cSrcweir
2644cdf0e10cSrcweir SwHash* pFnd = Find( sFldName, GetFldTypeTable(), TBLSZ, &n );
2645cdf0e10cSrcweir
2646cdf0e10cSrcweir if( !pFnd )
2647cdf0e10cSrcweir {
2648cdf0e10cSrcweir SwCalcFldType* pNew = new SwCalcFldType( sFldName, &rType );
2649cdf0e10cSrcweir pNew->pNext = aFldTypeTable[ n ];
2650cdf0e10cSrcweir aFldTypeTable[ n ] = pNew;
2651cdf0e10cSrcweir }
2652cdf0e10cSrcweir }
2653cdf0e10cSrcweir }
2654cdf0e10cSrcweir
RemoveFldType(const SwFieldType & rType)2655cdf0e10cSrcweir void SwDocUpdtFld::RemoveFldType( const SwFieldType& rType )
2656cdf0e10cSrcweir {
2657cdf0e10cSrcweir String sFldName;
2658cdf0e10cSrcweir switch( rType.Which() )
2659cdf0e10cSrcweir {
2660cdf0e10cSrcweir case RES_USERFLD :
2661cdf0e10cSrcweir sFldName = ((SwUserFieldType&)rType).GetName();
2662cdf0e10cSrcweir break;
2663cdf0e10cSrcweir case RES_SETEXPFLD:
2664cdf0e10cSrcweir sFldName = ((SwSetExpFieldType&)rType).GetName();
2665cdf0e10cSrcweir break;
2666cdf0e10cSrcweir }
2667cdf0e10cSrcweir
2668cdf0e10cSrcweir if( sFldName.Len() )
2669cdf0e10cSrcweir {
2670cdf0e10cSrcweir SetFieldsDirty( sal_True );
2671cdf0e10cSrcweir // suchen und aus der HashTabelle entfernen
2672cdf0e10cSrcweir GetAppCharClass().toLower( sFldName );
2673cdf0e10cSrcweir sal_uInt16 n;
2674cdf0e10cSrcweir
2675cdf0e10cSrcweir SwHash* pFnd = Find( sFldName, GetFldTypeTable(), TBLSZ, &n );
2676cdf0e10cSrcweir if( pFnd )
2677cdf0e10cSrcweir {
2678cdf0e10cSrcweir if( aFldTypeTable[ n ] == pFnd )
2679cdf0e10cSrcweir aFldTypeTable[ n ] = (SwCalcFldType*)pFnd->pNext;
2680cdf0e10cSrcweir else
2681cdf0e10cSrcweir {
2682cdf0e10cSrcweir SwHash* pPrev = aFldTypeTable[ n ];
2683cdf0e10cSrcweir while( pPrev->pNext != pFnd )
2684cdf0e10cSrcweir pPrev = pPrev->pNext;
2685cdf0e10cSrcweir pPrev->pNext = pFnd->pNext;
2686cdf0e10cSrcweir }
2687cdf0e10cSrcweir pFnd->pNext = 0;
2688cdf0e10cSrcweir delete pFnd;
2689cdf0e10cSrcweir }
2690cdf0e10cSrcweir }
2691cdf0e10cSrcweir }
2692cdf0e10cSrcweir
SwDocUpdtFld()2693cdf0e10cSrcweir SwDocUpdtFld::SwDocUpdtFld()
2694cdf0e10cSrcweir : pFldSortLst(0), nFldUpdtPos(LONG_MAX), nFldLstGetMode(0)
2695cdf0e10cSrcweir {
2696cdf0e10cSrcweir bInUpdateFlds = bFldsDirty = sal_False;
2697cdf0e10cSrcweir memset( aFldTypeTable, 0, sizeof( aFldTypeTable ) );
2698cdf0e10cSrcweir }
2699cdf0e10cSrcweir
~SwDocUpdtFld()2700cdf0e10cSrcweir SwDocUpdtFld::~SwDocUpdtFld()
2701cdf0e10cSrcweir {
2702cdf0e10cSrcweir delete pFldSortLst;
2703cdf0e10cSrcweir
2704cdf0e10cSrcweir for( sal_uInt16 n = 0; n < TBLSZ; ++n )
2705cdf0e10cSrcweir delete aFldTypeTable[n];
2706cdf0e10cSrcweir }
2707cdf0e10cSrcweir
2708cdf0e10cSrcweir // #111840#
UpdateFld(SwTxtFld * pDstTxtFld,SwField & rSrcFld,SwMsgPoolItem * pMsgHnt,bool bUpdateFlds)2709cdf0e10cSrcweir bool SwDoc::UpdateFld(SwTxtFld * pDstTxtFld, SwField & rSrcFld,
2710cdf0e10cSrcweir SwMsgPoolItem * pMsgHnt,
2711cdf0e10cSrcweir bool bUpdateFlds)
2712cdf0e10cSrcweir {
2713cdf0e10cSrcweir ASSERT(pDstTxtFld, "no field to update!");
2714cdf0e10cSrcweir
2715cdf0e10cSrcweir sal_Bool bTblSelBreak = sal_False;
2716cdf0e10cSrcweir
2717c0286415SOliver-Rainer Wittmann SwFmtFld * pDstFmtFld = (SwFmtFld*)&pDstTxtFld->GetFmtFld();
2718c0286415SOliver-Rainer Wittmann SwField * pDstFld = pDstFmtFld->GetField();
2719cdf0e10cSrcweir sal_uInt16 nFldWhich = rSrcFld.GetTyp()->Which();
2720cdf0e10cSrcweir SwNodeIndex aTblNdIdx(pDstTxtFld->GetTxtNode());
2721cdf0e10cSrcweir
2722cdf0e10cSrcweir if (pDstFld->GetTyp()->Which() ==
2723cdf0e10cSrcweir rSrcFld.GetTyp()->Which())
2724cdf0e10cSrcweir {
2725cdf0e10cSrcweir if (GetIDocumentUndoRedo().DoesUndo())
2726cdf0e10cSrcweir {
2727cdf0e10cSrcweir SwPosition aPosition( pDstTxtFld->GetTxtNode() );
2728cdf0e10cSrcweir aPosition.nContent = *pDstTxtFld->GetStart();
2729cdf0e10cSrcweir
273069a74367SOliver-Rainer Wittmann SwUndo *const pUndo( new SwUndoFieldFromDoc( aPosition, *pDstFld, rSrcFld, pMsgHnt, bUpdateFlds) );
2731cdf0e10cSrcweir GetIDocumentUndoRedo().AppendUndo(pUndo);
2732cdf0e10cSrcweir }
2733cdf0e10cSrcweir
2734cdf0e10cSrcweir SwField * pNewFld = rSrcFld.CopyField();
273569a74367SOliver-Rainer Wittmann pDstFmtFld->SetField(pNewFld);
2736cdf0e10cSrcweir
2737cdf0e10cSrcweir switch( nFldWhich )
2738cdf0e10cSrcweir {
2739cdf0e10cSrcweir case RES_SETEXPFLD:
2740cdf0e10cSrcweir case RES_GETEXPFLD:
2741cdf0e10cSrcweir case RES_HIDDENTXTFLD:
2742cdf0e10cSrcweir case RES_HIDDENPARAFLD:
2743cdf0e10cSrcweir UpdateExpFlds( pDstTxtFld, true );
2744cdf0e10cSrcweir break;
2745cdf0e10cSrcweir
2746cdf0e10cSrcweir case RES_TABLEFLD:
2747cdf0e10cSrcweir {
2748cdf0e10cSrcweir const SwTableNode* pTblNd =
2749cdf0e10cSrcweir IsIdxInTbl(aTblNdIdx);
2750cdf0e10cSrcweir if( pTblNd )
2751cdf0e10cSrcweir {
2752cdf0e10cSrcweir SwTableFmlUpdate aTblUpdate( &pTblNd->
2753cdf0e10cSrcweir GetTable() );
2754cdf0e10cSrcweir if (bUpdateFlds)
2755cdf0e10cSrcweir UpdateTblFlds( &aTblUpdate );
2756cdf0e10cSrcweir else
2757cdf0e10cSrcweir pNewFld->GetTyp()->ModifyNotification(0, &aTblUpdate);
2758cdf0e10cSrcweir
2759cdf0e10cSrcweir if (! bUpdateFlds)
2760cdf0e10cSrcweir bTblSelBreak = sal_True;
2761cdf0e10cSrcweir }
2762cdf0e10cSrcweir }
2763cdf0e10cSrcweir break;
2764cdf0e10cSrcweir
2765cdf0e10cSrcweir case RES_MACROFLD:
2766cdf0e10cSrcweir if( bUpdateFlds && pDstTxtFld->GetpTxtNode() )
2767cdf0e10cSrcweir (pDstTxtFld->GetpTxtNode())->
2768cdf0e10cSrcweir ModifyNotification( 0, pDstFmtFld );
2769cdf0e10cSrcweir break;
2770cdf0e10cSrcweir
2771cdf0e10cSrcweir case RES_DBNAMEFLD:
2772cdf0e10cSrcweir case RES_DBNEXTSETFLD:
2773cdf0e10cSrcweir case RES_DBNUMSETFLD:
2774cdf0e10cSrcweir case RES_DBSETNUMBERFLD:
2775cdf0e10cSrcweir ChgDBData(((SwDBNameInfField*) pNewFld)->GetRealDBData());
2776cdf0e10cSrcweir pNewFld->GetTyp()->UpdateFlds();
2777cdf0e10cSrcweir
2778cdf0e10cSrcweir break;
2779cdf0e10cSrcweir
2780cdf0e10cSrcweir case RES_DBFLD:
2781cdf0e10cSrcweir {
2782cdf0e10cSrcweir // JP 10.02.96: ChgValue aufrufen, damit
2783cdf0e10cSrcweir //die Format- aenderung den ContentString
2784cdf0e10cSrcweir //richtig setzt
2785cdf0e10cSrcweir SwDBField* pDBFld = (SwDBField*)pNewFld;
2786cdf0e10cSrcweir if (pDBFld->IsInitialized())
2787cdf0e10cSrcweir pDBFld->ChgValue( pDBFld->GetValue(), sal_True );
2788cdf0e10cSrcweir
2789cdf0e10cSrcweir pDBFld->ClearInitialized();
2790cdf0e10cSrcweir pDBFld->InitContent();
2791cdf0e10cSrcweir }
2792cdf0e10cSrcweir // kein break;
2793cdf0e10cSrcweir
2794cdf0e10cSrcweir default:
2795cdf0e10cSrcweir pDstFmtFld->ModifyNotification( 0, pMsgHnt );
2796cdf0e10cSrcweir }
2797cdf0e10cSrcweir
2798cdf0e10cSrcweir // Die Felder die wir berechnen koennen werden hier expli.
2799cdf0e10cSrcweir // zum Update angestossen.
2800cdf0e10cSrcweir if( nFldWhich == RES_USERFLD )
2801cdf0e10cSrcweir UpdateUsrFlds();
2802cdf0e10cSrcweir }
2803cdf0e10cSrcweir
2804cdf0e10cSrcweir return bTblSelBreak;
2805cdf0e10cSrcweir }
2806cdf0e10cSrcweir
PutValueToField(const SwPosition & rPos,const Any & rVal,sal_uInt16 nWhich)2807cdf0e10cSrcweir bool SwDoc::PutValueToField(const SwPosition & rPos,
2808cdf0e10cSrcweir const Any& rVal, sal_uInt16 nWhich)
2809cdf0e10cSrcweir {
2810cdf0e10cSrcweir Any aOldVal;
281169a74367SOliver-Rainer Wittmann SwField * pField = GetFieldAtPos(rPos);
2812cdf0e10cSrcweir
2813cdf0e10cSrcweir
2814cdf0e10cSrcweir if (GetIDocumentUndoRedo().DoesUndo() &&
2815cdf0e10cSrcweir pField->QueryValue(aOldVal, nWhich))
2816cdf0e10cSrcweir {
2817cdf0e10cSrcweir SwUndo *const pUndo(new SwUndoFieldFromAPI(rPos, aOldVal, rVal, nWhich));
2818cdf0e10cSrcweir GetIDocumentUndoRedo().AppendUndo(pUndo);
2819cdf0e10cSrcweir }
2820cdf0e10cSrcweir
2821cdf0e10cSrcweir return pField->PutValue(rVal, nWhich);
2822cdf0e10cSrcweir }
2823