xref: /aoo42x/main/sw/source/core/doc/docfld.cxx (revision 870262e3)
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