xref: /trunk/main/sw/source/core/edit/edfld.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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 {
222cdf0e10cSrcweir     SET_CURR_SHELL( this );
223cdf0e10cSrcweir     StartAllAction();
224cdf0e10cSrcweir     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 
236cdf0e10cSrcweir     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 {
251cdf0e10cSrcweir     SwTxtFld* pTFld = 0;
25269a74367SOliver-Rainer Wittmann     if( RES_INPUTFLD == rFld.Which() )
253cdf0e10cSrcweir     {
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 ) )
273c0286415SOliver-Rainer Wittmann                 && ((SwFmtFld*)pItem)->GetField() == &rFld )
274cdf0e10cSrcweir             {
275cdf0e10cSrcweir                 pTFld = ((SwFmtFld*)pItem)->GetTxtFld();
276cdf0e10cSrcweir                 break;
277cdf0e10cSrcweir             }
278cdf0e10cSrcweir     }
279cdf0e10cSrcweir     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