xref: /aoo42x/main/sw/source/core/edit/edfld.cxx (revision dec99bbd)
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 <unotools/charclass.hxx>
29cdf0e10cSrcweir #include <editsh.hxx>
30cdf0e10cSrcweir #include <fldbas.hxx>
31cdf0e10cSrcweir #include <doc.hxx>
32cdf0e10cSrcweir #include <docary.hxx>
33cdf0e10cSrcweir #include <fmtfld.hxx>
34cdf0e10cSrcweir #include <txtfld.hxx>
35cdf0e10cSrcweir #include <edimp.hxx>
36cdf0e10cSrcweir #include <dbfld.hxx>
37cdf0e10cSrcweir #include <expfld.hxx>
38cdf0e10cSrcweir #include <flddat.hxx>
39cdf0e10cSrcweir #include <swundo.hxx>
40cdf0e10cSrcweir #include <dbmgr.hxx>
41cdf0e10cSrcweir #include <swddetbl.hxx>
42cdf0e10cSrcweir #include <hints.hxx>
43cdf0e10cSrcweir #include <switerator.hxx>
44cdf0e10cSrcweir #include <fieldhint.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir /*--------------------------------------------------------------------
47cdf0e10cSrcweir 	Beschreibung: Feldtypen zu einer ResId zaehlen
48cdf0e10cSrcweir 				  wenn 0 alle zaehlen
49cdf0e10cSrcweir  --------------------------------------------------------------------*/
50cdf0e10cSrcweir 
GetFldTypeCount(sal_uInt16 nResId,sal_Bool bUsed) const51cdf0e10cSrcweir sal_uInt16 SwEditShell::GetFldTypeCount(sal_uInt16 nResId, sal_Bool bUsed ) const
52cdf0e10cSrcweir {
53cdf0e10cSrcweir 	const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
54cdf0e10cSrcweir 	const sal_uInt16 nSize = pFldTypes->Count();
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 	if(nResId == USHRT_MAX)
57cdf0e10cSrcweir 	{
58cdf0e10cSrcweir 		if(!bUsed)
59cdf0e10cSrcweir 			return nSize;
60cdf0e10cSrcweir 		else
61cdf0e10cSrcweir 		{
62cdf0e10cSrcweir 			sal_uInt16 nUsed = 0;
63cdf0e10cSrcweir 			for ( sal_uInt16 i = 0; i < nSize; i++ )
64cdf0e10cSrcweir 			{
65cdf0e10cSrcweir 				if(IsUsed(*(*pFldTypes)[i]))
66cdf0e10cSrcweir 					nUsed++;
67cdf0e10cSrcweir 			}
68cdf0e10cSrcweir 			return nUsed;
69cdf0e10cSrcweir 		}
70cdf0e10cSrcweir 	}
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 	// Alle Typen mit gleicher ResId
73cdf0e10cSrcweir 	sal_uInt16 nIdx  = 0;
74cdf0e10cSrcweir 	for(sal_uInt16 i = 0; i < nSize; ++i)
75cdf0e10cSrcweir 	{   // Gleiche ResId -> Index erhoehen
76cdf0e10cSrcweir 		SwFieldType& rFldType = *((*pFldTypes)[i]);
77cdf0e10cSrcweir 		if(rFldType.Which() == nResId)
78cdf0e10cSrcweir 			nIdx++;
79cdf0e10cSrcweir 	}
80cdf0e10cSrcweir 	return nIdx;
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir /*--------------------------------------------------------------------
84cdf0e10cSrcweir 	Beschreibung: Feldtypen zu einer ResId finden
85cdf0e10cSrcweir 				  wenn 0 alle finden
86cdf0e10cSrcweir  --------------------------------------------------------------------*/
GetFldType(sal_uInt16 nFld,sal_uInt16 nResId,sal_Bool bUsed) const87cdf0e10cSrcweir SwFieldType* SwEditShell::GetFldType(sal_uInt16 nFld, sal_uInt16 nResId, sal_Bool bUsed ) const
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
90cdf0e10cSrcweir 	const sal_uInt16 nSize = pFldTypes->Count();
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 	if(nResId == USHRT_MAX && nFld < nSize)
93cdf0e10cSrcweir 	{
94cdf0e10cSrcweir 		if(!bUsed)
95cdf0e10cSrcweir 			return (*pFldTypes)[nFld];
96cdf0e10cSrcweir 		else
97cdf0e10cSrcweir 		{
98cdf0e10cSrcweir 			sal_uInt16 i, nUsed = 0;
99cdf0e10cSrcweir 			for ( i = 0; i < nSize; i++ )
100cdf0e10cSrcweir 			{
101cdf0e10cSrcweir 				if(IsUsed(*(*pFldTypes)[i]))
102cdf0e10cSrcweir 				{
103cdf0e10cSrcweir 					if(nUsed == nFld)
104cdf0e10cSrcweir 						break;
105cdf0e10cSrcweir 					nUsed++;
106cdf0e10cSrcweir 				}
107cdf0e10cSrcweir 			}
108cdf0e10cSrcweir 			return i < nSize ? (*pFldTypes)[i] : 0;
109cdf0e10cSrcweir 		}
110cdf0e10cSrcweir 	}
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	sal_uInt16 nIdx = 0;
113cdf0e10cSrcweir 	for(sal_uInt16 i = 0; i < nSize; ++i)
114cdf0e10cSrcweir 	{   // Gleiche ResId -> Index erhoehen
115cdf0e10cSrcweir 		SwFieldType* pFldType = (*pFldTypes)[i];
116cdf0e10cSrcweir 		if(pFldType->Which() == nResId)
117cdf0e10cSrcweir 		{
118cdf0e10cSrcweir 			if (!bUsed || IsUsed(*pFldType))
119cdf0e10cSrcweir 			{
120cdf0e10cSrcweir 				if(nIdx == nFld)
121cdf0e10cSrcweir 					return pFldType;
122cdf0e10cSrcweir 				nIdx++;
123cdf0e10cSrcweir 			}
124cdf0e10cSrcweir 		}
125cdf0e10cSrcweir 	}
126cdf0e10cSrcweir 	return 0;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
129cdf0e10cSrcweir /*--------------------------------------------------------------------
130cdf0e10cSrcweir 	Beschreibung: Den ersten Typen mit ResId und Namen finden
131cdf0e10cSrcweir  --------------------------------------------------------------------*/
GetFldType(sal_uInt16 nResId,const String & rName) const132cdf0e10cSrcweir SwFieldType* SwEditShell::GetFldType(sal_uInt16 nResId, const String& rName) const
133cdf0e10cSrcweir {
134cdf0e10cSrcweir 	return GetDoc()->GetFldType( nResId, rName, false );
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir /*--------------------------------------------------------------------
138cdf0e10cSrcweir 	Beschreibung: Feldtypen loeschen
139cdf0e10cSrcweir  --------------------------------------------------------------------*/
RemoveFldType(sal_uInt16 nFld,sal_uInt16 nResId)140cdf0e10cSrcweir void SwEditShell::RemoveFldType(sal_uInt16 nFld, sal_uInt16 nResId)
141cdf0e10cSrcweir {
142cdf0e10cSrcweir 	if( USHRT_MAX == nResId )
143cdf0e10cSrcweir 	{
144cdf0e10cSrcweir 		GetDoc()->RemoveFldType(nFld);
145cdf0e10cSrcweir 		return;
146cdf0e10cSrcweir 	}
147cdf0e10cSrcweir 
148cdf0e10cSrcweir 	const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
149cdf0e10cSrcweir 	const sal_uInt16 nSize = pFldTypes->Count();
150cdf0e10cSrcweir 	sal_uInt16 nIdx = 0;
151cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nSize; ++i )
152cdf0e10cSrcweir 		// Gleiche ResId -> Index erhoehen
153cdf0e10cSrcweir 		if( (*pFldTypes)[i]->Which() == nResId &&
154cdf0e10cSrcweir 			nIdx++ == nFld )
155cdf0e10cSrcweir 		{
156cdf0e10cSrcweir 			GetDoc()->RemoveFldType( i );
157cdf0e10cSrcweir 			return;
158cdf0e10cSrcweir 		}
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir /*--------------------------------------------------------------------
162cdf0e10cSrcweir 	Beschreibung: FieldType ueber Name loeschen
163cdf0e10cSrcweir  --------------------------------------------------------------------*/
RemoveFldType(sal_uInt16 nResId,const String & rStr)164cdf0e10cSrcweir void SwEditShell::RemoveFldType(sal_uInt16 nResId, const String& rStr)
165cdf0e10cSrcweir {
166cdf0e10cSrcweir 	const SwFldTypes* pFldTypes = GetDoc()->GetFldTypes();
167cdf0e10cSrcweir 	const sal_uInt16 nSize = pFldTypes->Count();
168cdf0e10cSrcweir 	const CharClass& rCC = GetAppCharClass();
169cdf0e10cSrcweir 
170cdf0e10cSrcweir 	String aTmp( rCC.lower( rStr ));
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 	for(sal_uInt16 i = 0; i < nSize; ++i)
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 		// Gleiche ResId -> Index erhoehen
175cdf0e10cSrcweir 		SwFieldType* pFldType = (*pFldTypes)[i];
176cdf0e10cSrcweir 		if( pFldType->Which() == nResId )
177cdf0e10cSrcweir 		{
178cdf0e10cSrcweir 			if( aTmp.Equals( rCC.lower( pFldType->GetName() ) ))
179cdf0e10cSrcweir 			{
180cdf0e10cSrcweir 				GetDoc()->RemoveFldType(i);
181cdf0e10cSrcweir 				return;
182cdf0e10cSrcweir 			}
183cdf0e10cSrcweir 		}
184cdf0e10cSrcweir 	}
185cdf0e10cSrcweir }
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 
FieldToText(SwFieldType * pType)188cdf0e10cSrcweir void SwEditShell::FieldToText( SwFieldType* pType )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir 	if( !pType->GetDepends() )
191cdf0e10cSrcweir 		return;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 	SET_CURR_SHELL( this );
194cdf0e10cSrcweir 	StartAllAction();
195cdf0e10cSrcweir 	StartUndo( UNDO_DELETE );
196cdf0e10cSrcweir 	Push();
197cdf0e10cSrcweir 	SwPaM* pPaM = GetCrsr();
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     SwFieldHint aHint( pPaM );
200cdf0e10cSrcweir 	SwClientIter aIter( *pType );
2012f121198SMathias Bauer     for ( SwClient* pClient = aIter.GoStart(); pClient; pClient = ++aIter )
202cdf0e10cSrcweir     {
203cdf0e10cSrcweir         pPaM->DeleteMark();
204cdf0e10cSrcweir         pClient->SwClientNotifyCall( *pType, aHint );
205cdf0e10cSrcweir  	}
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 	Pop( sal_False );
208cdf0e10cSrcweir 	EndAllAction();
209cdf0e10cSrcweir 	EndUndo( UNDO_DELETE );
210cdf0e10cSrcweir }
211cdf0e10cSrcweir 
212cdf0e10cSrcweir /*************************************************************************
213cdf0e10cSrcweir |*
214cdf0e10cSrcweir |*					SwEditShell::Insert( SwField )
215cdf0e10cSrcweir |*
216cdf0e10cSrcweir |*	  Beschreibung	an der Cursorposition ein Feld einfuegen
217cdf0e10cSrcweir |*	  Quelle:		vgl. SwEditShell::Insert( String )
218cdf0e10cSrcweir |*
219cdf0e10cSrcweir *************************************************************************/
Insert2(SwField & rFld,const bool bForceExpandHints)220cdf0e10cSrcweir void SwEditShell::Insert2(SwField& rFld, const bool bForceExpandHints)
221cdf0e10cSrcweir {
22269a74367SOliver-Rainer Wittmann     SET_CURR_SHELL( this );
22369a74367SOliver-Rainer Wittmann     StartAllAction();
22469a74367SOliver-Rainer Wittmann     SwFmtFld aFld( rFld );
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     const SetAttrMode nInsertFlags = (bForceExpandHints)
227cdf0e10cSrcweir         ? nsSetAttrMode::SETATTR_FORCEHINTEXPAND
228cdf0e10cSrcweir         : nsSetAttrMode::SETATTR_DEFAULT;
229cdf0e10cSrcweir 
23069a74367SOliver-Rainer Wittmann     FOREACHPAM_START(this)
23169a74367SOliver-Rainer Wittmann         const bool bSuccess(GetDoc()->InsertPoolItem(*PCURCRSR, aFld, nInsertFlags));
232cdf0e10cSrcweir         ASSERT( bSuccess, "Doc->Insert(Field) failed");
233cdf0e10cSrcweir         (void) bSuccess;
23469a74367SOliver-Rainer Wittmann     FOREACHPAM_END()
235cdf0e10cSrcweir 
23669a74367SOliver-Rainer Wittmann     EndAllAction();
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 
241cdf0e10cSrcweir /*************************************************************************
242cdf0e10cSrcweir |*
243cdf0e10cSrcweir |*					SwEditShell::UpdateFlds()
244cdf0e10cSrcweir |*
245cdf0e10cSrcweir |*	  Beschreibung	Stehen die PaMs auf Feldern ?
246cdf0e10cSrcweir |*					BP 12.05.92
247cdf0e10cSrcweir |*
248cdf0e10cSrcweir *************************************************************************/
lcl_FindInputFld(SwDoc * pDoc,SwField & rFld)249cdf0e10cSrcweir SwTxtFld* lcl_FindInputFld( SwDoc* pDoc, SwField& rFld )
250cdf0e10cSrcweir {
25169a74367SOliver-Rainer Wittmann     SwTxtFld* pTFld = 0;
25269a74367SOliver-Rainer Wittmann     if( RES_INPUTFLD == rFld.Which() )
25369a74367SOliver-Rainer Wittmann     {
25469a74367SOliver-Rainer Wittmann         const SfxPoolItem* pItem = NULL;
25569a74367SOliver-Rainer Wittmann         const sal_uInt32 nMaxItems =
25669a74367SOliver-Rainer Wittmann             pDoc->GetAttrPool().GetItemCount2( RES_TXTATR_INPUTFIELD );
25769a74367SOliver-Rainer Wittmann         for( sal_uInt32 n = 0; n < nMaxItems; ++n )
25869a74367SOliver-Rainer Wittmann             if( 0 != (pItem = pDoc->GetAttrPool().GetItem2( RES_TXTATR_INPUTFIELD, n ) )
25969a74367SOliver-Rainer Wittmann                 && ((SwFmtFld*)pItem)->GetField() == &rFld )
26069a74367SOliver-Rainer Wittmann             {
26169a74367SOliver-Rainer Wittmann                 pTFld = ((SwFmtFld*)pItem)->GetTxtFld();
26269a74367SOliver-Rainer Wittmann                 break;
26369a74367SOliver-Rainer Wittmann             }
26469a74367SOliver-Rainer Wittmann     }
26569a74367SOliver-Rainer Wittmann     else if( RES_SETEXPFLD == rFld.Which()
26669a74367SOliver-Rainer Wittmann         && ((SwSetExpField&)rFld).GetInputFlag() )
26769a74367SOliver-Rainer Wittmann     {
26869a74367SOliver-Rainer Wittmann         const SfxPoolItem* pItem = NULL;
26969a74367SOliver-Rainer Wittmann         const sal_uInt32 nMaxItems =
270cdf0e10cSrcweir             pDoc->GetAttrPool().GetItemCount2( RES_TXTATR_FIELD );
27169a74367SOliver-Rainer Wittmann         for( sal_uInt32 n = 0; n < nMaxItems; ++n )
27269a74367SOliver-Rainer Wittmann             if( 0 != (pItem = pDoc->GetAttrPool().GetItem2( RES_TXTATR_FIELD, n ) )
27369a74367SOliver-Rainer Wittmann                 && ((SwFmtFld*)pItem)->GetField() == &rFld )
27469a74367SOliver-Rainer Wittmann             {
27569a74367SOliver-Rainer Wittmann                 pTFld = ((SwFmtFld*)pItem)->GetTxtFld();
27669a74367SOliver-Rainer Wittmann                 break;
27769a74367SOliver-Rainer Wittmann             }
27869a74367SOliver-Rainer Wittmann     }
27969a74367SOliver-Rainer Wittmann     return pTFld;
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
UpdateFlds(SwField & rFld)282cdf0e10cSrcweir void SwEditShell::UpdateFlds( SwField &rFld )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir 	SET_CURR_SHELL( this );
285cdf0e10cSrcweir 	StartAllAction();
286cdf0e10cSrcweir 	{
287cdf0e10cSrcweir 		SwField *pCurFld = 0;
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 		// Wenn es keine Selektionen gibt, gilt der Wert der aktuellen
290cdf0e10cSrcweir 		// Cursor-Position.
291cdf0e10cSrcweir 		SwMsgPoolItem* pMsgHnt = 0;
292cdf0e10cSrcweir 		SwRefMarkFldUpdate aRefMkHt( GetOut() );
293cdf0e10cSrcweir 		sal_uInt16 nFldWhich = rFld.GetTyp()->Which();
294cdf0e10cSrcweir 		if( RES_GETREFFLD == nFldWhich )
295cdf0e10cSrcweir 			pMsgHnt = &aRefMkHt;
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 		SwPaM* pCrsr = GetCrsr();
298cdf0e10cSrcweir 		SwTxtFld *pTxtFld;
299cdf0e10cSrcweir 		SwFmtFld *pFmtFld;
300cdf0e10cSrcweir 
301cdf0e10cSrcweir         if ( pCrsr->GetNext() == pCrsr && !pCrsr->HasMark())
302cdf0e10cSrcweir         {
30369a74367SOliver-Rainer Wittmann             pTxtFld = GetTxtFldAtPos( pCrsr->Start(), true );
304cdf0e10cSrcweir 
305cdf0e10cSrcweir             if (!pTxtFld) // #i30221#
306cdf0e10cSrcweir                 pTxtFld = lcl_FindInputFld( GetDoc(), rFld);
307cdf0e10cSrcweir 
308cdf0e10cSrcweir             if (pTxtFld != 0)
309cdf0e10cSrcweir                 GetDoc()->UpdateFld(pTxtFld, rFld, pMsgHnt, sal_True); // #111840#
310cdf0e10cSrcweir         }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir 		// bOkay (statt return wg. EndAllAction) wird sal_False,
313cdf0e10cSrcweir 		// 1) wenn nur ein Pam mehr als ein Feld enthaelt oder
314cdf0e10cSrcweir 		// 2) bei gemischten Feldtypen
315cdf0e10cSrcweir 		sal_Bool bOkay = sal_True;
316cdf0e10cSrcweir 		sal_Bool bTblSelBreak = sal_False;
317cdf0e10cSrcweir 
31869a74367SOliver-Rainer Wittmann 		SwMsgPoolItem aFldHint( RES_TXTATR_FIELD );
319*dec99bbdSOliver-Rainer Wittmann 		SwMsgPoolItem aAnnotationFldHint( RES_TXTATR_ANNOTATION );
32069a74367SOliver-Rainer Wittmann 		SwMsgPoolItem aInputFldHint( RES_TXTATR_INPUTFIELD );
321cdf0e10cSrcweir 		FOREACHPAM_START(this)						// fuer jeden PaM
322cdf0e10cSrcweir 			if( PCURCRSR->HasMark() && bOkay )		// ... mit Selektion
323cdf0e10cSrcweir 			{
324cdf0e10cSrcweir 				// Kopie des PaM
325cdf0e10cSrcweir 				SwPaM aCurPam( *PCURCRSR->GetMark(), *PCURCRSR->GetPoint() );
326cdf0e10cSrcweir 				SwPaM aPam( *PCURCRSR->GetPoint() );
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 				SwPosition *pCurStt = aCurPam.Start(), *pCurEnd =
329cdf0e10cSrcweir                     aCurPam.End();
330cdf0e10cSrcweir 				/*
331cdf0e10cSrcweir 				 * Fuer den Fall, dass zwei aneinanderliegende Felder in einem
332cdf0e10cSrcweir 				 * PaM liegen, hangelt sich aPam portionsweise bis zum Ende.
333cdf0e10cSrcweir 				 * aCurPam wird dabei nach jeder Schleifenrunde verkuerzt.
334cdf0e10cSrcweir 				 * Wenn aCurPam vollstaendig durchsucht wurde, ist Start = End
335cdf0e10cSrcweir 				 * und die Schleife terminiert.
336cdf0e10cSrcweir 				 */
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 				// Suche nach SwTxtFld ...
339cdf0e10cSrcweir 				while(	bOkay
340cdf0e10cSrcweir 					 && pCurStt->nContent != pCurEnd->nContent
34169a74367SOliver-Rainer Wittmann 					 && ( aPam.Find( aFldHint, sal_False, fnMoveForward, &aCurPam )
342*dec99bbdSOliver-Rainer Wittmann                           || aPam.Find( aAnnotationFldHint, sal_False, fnMoveForward, &aCurPam )
34369a74367SOliver-Rainer Wittmann                           || aPam.Find( aInputFldHint, sal_False, fnMoveForward, &aCurPam ) ) )
344cdf0e10cSrcweir 				{
345cdf0e10cSrcweir 					//	wenn nur ein Pam mehr als ein Feld enthaelt ...
346cdf0e10cSrcweir 					if( aPam.Start()->nContent != pCurStt->nContent )
347cdf0e10cSrcweir 						bOkay = sal_False;
348cdf0e10cSrcweir 
34969a74367SOliver-Rainer Wittmann 					if( 0 != (pTxtFld = GetTxtFldAtPos( pCurStt, true )) )
350cdf0e10cSrcweir 					{
351c0286415SOliver-Rainer Wittmann 						pFmtFld = (SwFmtFld*)&pTxtFld->GetFmtFld();
352c0286415SOliver-Rainer Wittmann 						pCurFld = pFmtFld->GetField();
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 						// bei gemischten Feldtypen
355cdf0e10cSrcweir 						if( pCurFld->GetTyp()->Which() !=
356cdf0e10cSrcweir                             rFld.GetTyp()->Which() )
357cdf0e10cSrcweir 							bOkay = sal_False;
358cdf0e10cSrcweir 
359cdf0e10cSrcweir                         bTblSelBreak = GetDoc()->UpdateFld(pTxtFld, rFld,
360cdf0e10cSrcweir                                                            pMsgHnt, sal_False); // #111840#
361cdf0e10cSrcweir 					}
362cdf0e10cSrcweir 					// Der Suchbereich wird um den gefundenen Bereich
363cdf0e10cSrcweir 					// verkuerzt.
364cdf0e10cSrcweir 					pCurStt->nContent++;
365cdf0e10cSrcweir 				}
366cdf0e10cSrcweir 			}
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 			if( bTblSelBreak )		// wenn Tabellen Selektion und Tabellen-
369cdf0e10cSrcweir 				break;				// Formel aktualisiert wurde -> beenden
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 		FOREACHPAM_END()					  // fuer jeden PaM
372cdf0e10cSrcweir 	}
373cdf0e10cSrcweir 	GetDoc()->SetModified();
374cdf0e10cSrcweir 	EndAllAction();
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir /*-----------------13.05.92 10:54-------------------
378cdf0e10cSrcweir  Liefert den logischen fuer die Datenbank zurueck
379cdf0e10cSrcweir  --------------------------------------------------*/
380cdf0e10cSrcweir 
GetDBData() const381cdf0e10cSrcweir SwDBData SwEditShell::GetDBData() const
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	return GetDoc()->GetDBData();
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
GetDBDesc() const386cdf0e10cSrcweir const SwDBData& SwEditShell::GetDBDesc() const
387cdf0e10cSrcweir {
388cdf0e10cSrcweir 	return GetDoc()->GetDBDesc();
389cdf0e10cSrcweir }
390cdf0e10cSrcweir 
ChgDBData(const SwDBData & rNewData)391cdf0e10cSrcweir void SwEditShell::ChgDBData(const SwDBData& rNewData)
392cdf0e10cSrcweir {
393cdf0e10cSrcweir 	GetDoc()->ChgDBData(rNewData);
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
GetAllUsedDB(SvStringsDtor & rDBNameList,SvStringsDtor * pAllDBNames)396cdf0e10cSrcweir void SwEditShell::GetAllUsedDB( SvStringsDtor& rDBNameList,
397cdf0e10cSrcweir 								SvStringsDtor* pAllDBNames )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir 	GetDoc()->GetAllUsedDB( rDBNameList, pAllDBNames );
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
ChangeDBFields(const SvStringsDtor & rOldNames,const String & rNewName)402cdf0e10cSrcweir void SwEditShell::ChangeDBFields( const SvStringsDtor& rOldNames,
403cdf0e10cSrcweir 									const String& rNewName )
404cdf0e10cSrcweir {
405cdf0e10cSrcweir 	GetDoc()->ChangeDBFields( rOldNames, rNewName );
406cdf0e10cSrcweir }
407cdf0e10cSrcweir 
408cdf0e10cSrcweir /*--------------------------------------------------------------------
409cdf0e10cSrcweir 	Beschreibung:  Alle Expression-Felder erneuern
410cdf0e10cSrcweir  --------------------------------------------------------------------*/
UpdateExpFlds(sal_Bool bCloseDB)411cdf0e10cSrcweir void SwEditShell::UpdateExpFlds(sal_Bool bCloseDB)
412cdf0e10cSrcweir {
413cdf0e10cSrcweir 	SET_CURR_SHELL( this );
414cdf0e10cSrcweir 	StartAllAction();
415cdf0e10cSrcweir 	GetDoc()->UpdateExpFlds(NULL, true);
416cdf0e10cSrcweir 	if (bCloseDB)
417cdf0e10cSrcweir 		GetDoc()->GetNewDBMgr()->CloseAll();	// Alle Datenbankverbindungen dichtmachen
418cdf0e10cSrcweir 	EndAllAction();
419cdf0e10cSrcweir }
420cdf0e10cSrcweir 
GetNewDBMgr() const421cdf0e10cSrcweir SwNewDBMgr* SwEditShell::GetNewDBMgr() const
422cdf0e10cSrcweir {
423cdf0e10cSrcweir 	return GetDoc()->GetNewDBMgr();
424cdf0e10cSrcweir }
425cdf0e10cSrcweir 
426cdf0e10cSrcweir /*--------------------------------------------------------------------
427cdf0e10cSrcweir 	Beschreibung: Feldtypen einfuegen
428cdf0e10cSrcweir  --------------------------------------------------------------------*/
InsertFldType(const SwFieldType & rFldType)429cdf0e10cSrcweir SwFieldType* SwEditShell::InsertFldType(const SwFieldType& rFldType)
430cdf0e10cSrcweir {
431cdf0e10cSrcweir 	return GetDoc()->InsertFldType(rFldType);
432cdf0e10cSrcweir }
433cdf0e10cSrcweir 
LockExpFlds()434cdf0e10cSrcweir void SwEditShell::LockExpFlds()
435cdf0e10cSrcweir {
436cdf0e10cSrcweir 	GetDoc()->LockExpFlds();
437cdf0e10cSrcweir }
438cdf0e10cSrcweir 
UnlockExpFlds()439cdf0e10cSrcweir void SwEditShell::UnlockExpFlds()
440cdf0e10cSrcweir {
441cdf0e10cSrcweir 	GetDoc()->UnlockExpFlds();
442cdf0e10cSrcweir }
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 
SetFldUpdateFlags(SwFldUpdateFlags eFlags)445cdf0e10cSrcweir void SwEditShell::SetFldUpdateFlags( SwFldUpdateFlags eFlags )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir     getIDocumentSettingAccess()->setFieldUpdateFlags( eFlags );
448cdf0e10cSrcweir }
449cdf0e10cSrcweir 
GetFldUpdateFlags(sal_Bool bDocSettings) const450cdf0e10cSrcweir SwFldUpdateFlags SwEditShell::GetFldUpdateFlags(sal_Bool bDocSettings) const
451cdf0e10cSrcweir {
452cdf0e10cSrcweir     return getIDocumentSettingAccess()->getFieldUpdateFlags( !bDocSettings );
453cdf0e10cSrcweir }
454cdf0e10cSrcweir 
SetFixFields(sal_Bool bOnlyTimeDate,const DateTime * pNewDateTime)455cdf0e10cSrcweir void SwEditShell::SetFixFields( sal_Bool bOnlyTimeDate,
456cdf0e10cSrcweir 								const DateTime* pNewDateTime )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir 	SET_CURR_SHELL( this );
459cdf0e10cSrcweir 	sal_Bool bUnLockView = !IsViewLocked();
460cdf0e10cSrcweir 	LockView( sal_True );
461cdf0e10cSrcweir 	StartAllAction();
462cdf0e10cSrcweir 	GetDoc()->SetFixFields( bOnlyTimeDate, pNewDateTime );
463cdf0e10cSrcweir 	EndAllAction();
464cdf0e10cSrcweir 	if( bUnLockView )
465cdf0e10cSrcweir 		LockView( sal_False );
466cdf0e10cSrcweir }
467cdf0e10cSrcweir 
SetLabelDoc(sal_Bool bFlag)468cdf0e10cSrcweir void SwEditShell::SetLabelDoc( sal_Bool bFlag )
469cdf0e10cSrcweir {
470cdf0e10cSrcweir 	GetDoc()->set(IDocumentSettingAccess::LABEL_DOCUMENT, bFlag );
471cdf0e10cSrcweir }
472cdf0e10cSrcweir 
IsLabelDoc() const473cdf0e10cSrcweir sal_Bool SwEditShell::IsLabelDoc() const
474cdf0e10cSrcweir {
475cdf0e10cSrcweir     return getIDocumentSettingAccess()->get(IDocumentSettingAccess::LABEL_DOCUMENT);
476cdf0e10cSrcweir }
477cdf0e10cSrcweir /* -----------------------------21.12.99 12:53--------------------------------
478cdf0e10cSrcweir 
479cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
ChangeAuthorityData(const SwAuthEntry * pNewData)480cdf0e10cSrcweir void SwEditShell::ChangeAuthorityData(const SwAuthEntry* pNewData)
481cdf0e10cSrcweir {
482cdf0e10cSrcweir 	GetDoc()->ChangeAuthorityData(pNewData);
483cdf0e10cSrcweir }
484cdf0e10cSrcweir /* -----------------------------03.08.2001 12:04------------------------------
485cdf0e10cSrcweir 
486cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
IsAnyDatabaseFieldInDoc() const487cdf0e10cSrcweir sal_Bool SwEditShell::IsAnyDatabaseFieldInDoc()const
488cdf0e10cSrcweir {
489cdf0e10cSrcweir     const SwFldTypes * pFldTypes = GetDoc()->GetFldTypes();
490cdf0e10cSrcweir     const sal_uInt16 nSize = pFldTypes->Count();
491cdf0e10cSrcweir     for(sal_uInt16 i = 0; i < nSize; ++i)
492cdf0e10cSrcweir     {
493cdf0e10cSrcweir         SwFieldType& rFldType = *((*pFldTypes)[i]);
494cdf0e10cSrcweir         sal_uInt16 nWhich = rFldType.Which();
495cdf0e10cSrcweir         if(IsUsed(rFldType))
496cdf0e10cSrcweir         {
497cdf0e10cSrcweir             switch(nWhich)
498cdf0e10cSrcweir             {
499cdf0e10cSrcweir                 case RES_DBFLD:
500cdf0e10cSrcweir                 case RES_DBNEXTSETFLD:
501cdf0e10cSrcweir                 case RES_DBNUMSETFLD:
502cdf0e10cSrcweir                 case RES_DBSETNUMBERFLD:
503cdf0e10cSrcweir                 {
504cdf0e10cSrcweir                     SwIterator<SwFmtFld,SwFieldType> aIter( rFldType );
505cdf0e10cSrcweir                     SwFmtFld* pFld = aIter.First();
506cdf0e10cSrcweir                     while(pFld)
507cdf0e10cSrcweir                     {
508cdf0e10cSrcweir                         if(pFld->IsFldInDoc())
509cdf0e10cSrcweir                             return sal_True;
510cdf0e10cSrcweir                         pFld = aIter.Next();
511cdf0e10cSrcweir                     }
512cdf0e10cSrcweir                 }
513cdf0e10cSrcweir                 break;
514cdf0e10cSrcweir             }
515cdf0e10cSrcweir         }
516cdf0e10cSrcweir     }
517cdf0e10cSrcweir     return sal_False;
518cdf0e10cSrcweir }
519