xref: /trunk/main/sw/source/ui/fldui/fldmgr.cxx (revision 15ad9f6bc42c7dfc8c0a9bb7fac3e1b2e7a36ef2)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <cmdid.h>
32 #include <hintids.hxx>
33 #include <svl/stritem.hxx>
34 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35 #include <com/sun/star/container/XNameAccess.hpp>
36 #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
37 #include <com/sun/star/text/XNumberingTypeInfo.hpp>
38 #include <com/sun/star/style/NumberingType.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/sdbc/XConnection.hpp>
41 #include <com/sun/star/sdbc/XDataSource.hpp>
42 #include <com/sun/star/uri/XUriReferenceFactory.hpp>
43 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
44 #include <comphelper/processfactory.hxx>
45 #include <editeng/unolingu.hxx>
46 #include <unotools/localedatawrapper.hxx>
47 #include <sfx2/dispatch.hxx>
48 #include <sfx2/objsh.hxx>
49 #include <sfx2/linkmgr.hxx>
50 #include <sfx2/app.hxx>
51 #include <basic/basmgr.hxx>
52 #include <editeng/langitem.hxx>
53 #include <svl/macitem.hxx>
54 #include <basic/sbmod.hxx>
55 #include <fmtrfmrk.hxx>
56 #include <basic/sbmeth.hxx>
57 #include <basic/sbx.hxx>
58 #include <svl/zforlist.hxx>
59 #include <svl/zformat.hxx>
60 #include <vcl/mnemonic.hxx>
61 #include <view.hxx>
62 #include <wrtsh.hxx>        // Actives Fenster
63 #include <doc.hxx>      // Actives Fenster
64 #include <docsh.hxx>        // Actives Fenster
65 #include <swmodule.hxx>
66 #include <charatr.hxx>
67 #include <fmtinfmt.hxx>
68 #include <cellatr.hxx>
69 #include <dbmgr.hxx>
70 #include <shellres.hxx>
71 #include <fldbas.hxx>
72 #include <docufld.hxx>
73 #include <chpfld.hxx>
74 #include <ddefld.hxx>
75 #include <expfld.hxx>
76 #include <reffld.hxx>
77 #include <usrfld.hxx>
78 #include <dbfld.hxx>
79 #include <authfld.hxx>
80 #include <flddat.hxx>
81 #include <fldmgr.hxx>
82 #include <crsskip.hxx>
83 #include <flddropdown.hxx>
84 #include <fldui.hrc>
85 #include <tox.hxx>
86 
87 using rtl::OUString;
88 using namespace com::sun::star::uno;
89 using namespace com::sun::star::container;
90 using namespace com::sun::star::lang;
91 using namespace com::sun::star::beans;
92 using namespace com::sun::star::text;
93 using namespace com::sun::star::style;
94 using namespace com::sun::star::sdbc;
95 using namespace ::com::sun::star;
96 using namespace nsSwDocInfoSubType;
97 
98 /*--------------------------------------------------------------------
99     Beschreibung: Gruppen der Felder
100  --------------------------------------------------------------------*/
101 enum
102 {
103     GRP_DOC_BEGIN   =  0,
104     GRP_DOC_END     =  GRP_DOC_BEGIN + 11,
105 
106     GRP_FKT_BEGIN   =  GRP_DOC_END,
107     GRP_FKT_END     =  GRP_FKT_BEGIN + 8,
108 
109     GRP_REF_BEGIN   =  GRP_FKT_END,
110     GRP_REF_END     =  GRP_REF_BEGIN + 2,
111 
112     GRP_REG_BEGIN   =  GRP_REF_END,
113     GRP_REG_END     =  GRP_REG_BEGIN + 1,
114 
115     GRP_DB_BEGIN    =  GRP_REG_END,
116     GRP_DB_END      =  GRP_DB_BEGIN  + 5,
117 
118     GRP_VAR_BEGIN   =  GRP_DB_END,
119     GRP_VAR_END     =  GRP_VAR_BEGIN + 9
120 };
121 
122 enum
123 {
124     GRP_WEB_DOC_BEGIN   =  0,
125     GRP_WEB_DOC_END     =  GRP_WEB_DOC_BEGIN + 9,
126 
127     GRP_WEB_FKT_BEGIN   =  GRP_WEB_DOC_END + 2,
128     GRP_WEB_FKT_END     =  GRP_WEB_FKT_BEGIN + 0,   // Die Gruppe ist leer!
129 
130     GRP_WEB_REF_BEGIN   =  GRP_WEB_FKT_END + 6,     // Die Gruppe ist leer!
131     GRP_WEB_REF_END     =  GRP_WEB_REF_BEGIN + 0,
132 
133     GRP_WEB_REG_BEGIN   =  GRP_WEB_REF_END + 2,
134     GRP_WEB_REG_END     =  GRP_WEB_REG_BEGIN + 1,
135 
136     GRP_WEB_DB_BEGIN    =  GRP_WEB_REG_END,         // Die Gruppe ist leer!
137     GRP_WEB_DB_END      =  GRP_WEB_DB_BEGIN  + 0,
138 
139     GRP_WEB_VAR_BEGIN   =  GRP_WEB_DB_END + 5,
140     GRP_WEB_VAR_END     =  GRP_WEB_VAR_BEGIN + 1
141 };
142 
143 /*--------------------------------------------------------------------
144     Beschreibung: Formate in der richtigen Reihenfolge
145  --------------------------------------------------------------------*/
146 static const sal_uInt16 __FAR_DATA aSetFmt[] =
147 {
148 // die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_???
149 // uebereinstimmen
150     0,
151     0
152 };
153 
154 static const sal_uInt16 __FAR_DATA aGetFmt[] =
155 {
156 // die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_GETVAR_???
157 // uebereinstimmen
158     0
159 };
160 
161 static const sal_uInt16 __FAR_DATA aUsrFmt[] =
162 {
163 // die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_SETVAR_???
164 // uebereinstimmen
165     0,
166     nsSwExtendedSubType::SUB_CMD
167 };
168 
169 static const sal_uInt16 __FAR_DATA aDBFmt[] =
170 {
171 // die Reihenfolge muss zu Beginn mit den ResourceIds fuer FMT_DBFLD_???
172 // uebereinstimmen
173     nsSwExtendedSubType::SUB_OWN_FMT
174 };
175 
176 static const sal_uInt16 VF_COUNT        = sizeof(aGetFmt) / sizeof(sal_uInt16);
177 static const sal_uInt16 VF_USR_COUNT    = sizeof(aUsrFmt) / sizeof(sal_uInt16);
178 static const sal_uInt16 VF_DB_COUNT     = sizeof(aDBFmt)  / sizeof(sal_uInt16);
179 
180 /*--------------------------------------------------------------------
181     Beschreibung: Feldtypen und Subtypes
182  --------------------------------------------------------------------*/
183 struct SwFldPack
184 {
185     sal_uInt16  nTypeId;
186 
187     sal_uInt16  nSubTypeStart;
188     sal_uInt16  nSubTypeEnd;
189 
190     sal_uLong   nFmtBegin;
191     sal_uLong   nFmtEnd;
192 };
193 
194 /*--------------------------------------------------------------------
195     Beschreibung: Strings und Formate
196  --------------------------------------------------------------------*/
197 static const SwFldPack __FAR_DATA aSwFlds[] =
198 {
199     // Dokument
200     { TYP_EXTUSERFLD,       FLD_EU_BEGIN,       FLD_EU_END,     0,                  0 },
201     { TYP_AUTHORFLD,        0,                  0,              FMT_AUTHOR_BEGIN,   FMT_AUTHOR_END },
202     { TYP_DATEFLD,          FLD_DATE_BEGIN,     FLD_DATE_END,   0,                  0 },
203     { TYP_TIMEFLD,          FLD_TIME_BEGIN,     FLD_TIME_END,   0,                  0 },
204     { TYP_PAGENUMBERFLD,    0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-1 },
205     { TYP_NEXTPAGEFLD,      0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END },
206     { TYP_PREVPAGEFLD,      0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END },
207     { TYP_FILENAMEFLD,      0,                  0,              FMT_FF_BEGIN,       FMT_FF_END },
208     { TYP_DOCSTATFLD,       FLD_STAT_BEGIN,     FLD_STAT_END,   FMT_NUM_BEGIN,      FMT_NUM_END-1 },
209 
210     { TYP_CHAPTERFLD,       0,                  0,              FMT_CHAPTER_BEGIN,  FMT_CHAPTER_END },
211     { TYP_TEMPLNAMEFLD,     0,                  0,              FMT_FF_BEGIN,       FMT_FF_END },
212 
213     // Funktion
214     { TYP_CONDTXTFLD,       0,                  0,              0,                  0 },
215     { TYP_DROPDOWN,         0,                  0,              0,                  0 },
216     { TYP_INPUTFLD,         FLD_INPUT_BEGIN,    FLD_INPUT_END,  0,                  0 },
217     { TYP_MACROFLD,         0,                  0,              0,                  0 },
218     { TYP_JUMPEDITFLD,      0,                  0,              FMT_MARK_BEGIN,     FMT_MARK_END },
219     { TYP_COMBINED_CHARS,   0,                  0,              0,                  0 },
220     { TYP_HIDDENTXTFLD,     0,                  0,              0,                  0 },
221     { TYP_HIDDENPARAFLD,    0,                  0,              0,                  0 },
222 
223     // Referenzen
224     { TYP_SETREFFLD,        0,                  0,              0,                  0 },
225     { TYP_GETREFFLD,        0,                  0,              FMT_REF_BEGIN,      FMT_REF_END },
226 
227     // Ablage
228     { TYP_DOCINFOFLD,       0,                  0,              FMT_REG_BEGIN,      FMT_REG_END },
229 
230     // Datenbank
231     { TYP_DBFLD,            0,                  0,              FMT_DBFLD_BEGIN,    FMT_DBFLD_END },
232     { TYP_DBNEXTSETFLD,     0,                  0,              0,                  0 },
233     { TYP_DBNUMSETFLD,      0,                  0,              0,                  0 },
234     { TYP_DBSETNUMBERFLD,   0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-2 },
235     { TYP_DBNAMEFLD,        0,                  0,              0,                  0 },
236 
237     // Variablen
238     { TYP_SETFLD,           0,                  0,              FMT_SETVAR_BEGIN,   FMT_SETVAR_END },
239 
240     { TYP_GETFLD,           0,                  0,              FMT_GETVAR_BEGIN,   FMT_GETVAR_END },
241     { TYP_DDEFLD,           0,                  0,              FMT_DDE_BEGIN,      FMT_DDE_END },
242     { TYP_FORMELFLD,        0,                  0,              FMT_GETVAR_BEGIN,   FMT_GETVAR_END },
243     { TYP_INPUTFLD,         FLD_INPUT_BEGIN,    FLD_INPUT_END,  0,                  0 },
244     { TYP_SEQFLD,           0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-2 },
245     { TYP_SETREFPAGEFLD,    FLD_PAGEREF_BEGIN,  FLD_PAGEREF_END,0,                  0 },
246     { TYP_GETREFPAGEFLD,    0,                  0,              FMT_NUM_BEGIN,      FMT_NUM_END-1 },
247     { TYP_USERFLD,          0,                  0,              FMT_USERVAR_BEGIN,  FMT_USERVAR_END }
248 };
249 
250 /*--------------------------------------------------------------------
251     Beschreibung: Zugriff auf die Shell
252  --------------------------------------------------------------------*/
253 
254 static SwWrtShell* lcl_GetShell()
255 {
256     SwView* pView;
257     if ( 0 != (pView = ::GetActiveView()) )
258         return pView->GetWrtShellPtr();
259     DBG_ERROR("no current shell found!");
260     return 0;
261 }
262 
263 inline sal_uInt16 GetPackCount() {  return sizeof(aSwFlds) / sizeof(SwFldPack); }
264 
265 /*--------------------------------------------------------------------
266     Beschreibung: FieldManager regelt das Einfuegen und Updaten
267                   von Feldern
268  --------------------------------------------------------------------*/
269 
270 SwFldMgr::SwFldMgr(SwWrtShell* pSh ) :
271     pModule(0),
272     pMacroItem(0),
273     pWrtShell(pSh),
274     bEvalExp(sal_True)
275 {
276     // aktuelles Feld ermitteln falls vorhanden
277     GetCurFld();
278 }
279 
280 
281 SwFldMgr::~SwFldMgr()
282 {
283 }
284 
285 /*--------------------------------------------------------------------
286     Beschreibung: RefMark ueber Namen organisieren
287  --------------------------------------------------------------------*/
288 
289 sal_Bool  SwFldMgr::CanInsertRefMark( const String& rStr )
290 {
291     sal_Bool bRet = sal_False;
292     SwWrtShell *pSh = pWrtShell ? pWrtShell : lcl_GetShell();
293     DBG_ASSERT(pSh, "no SwWrtShell found");
294     if(pSh)
295     {
296         sal_uInt16 nCnt = pSh->GetCrsrCnt();
297 
298         // der letzte Crsr muss keine aufgespannte Selektion
299         if( 1 < nCnt && !pSh->SwCrsrShell::HasSelection() )
300             --nCnt;
301 
302         bRet =  2 > nCnt && 0 == pSh->GetRefMark( rStr );
303     }
304     return bRet;
305 }
306 
307 /*--------------------------------------------------------------------
308     Beschreibung: Zugriff ueber ResIds
309  --------------------------------------------------------------------*/
310 
311 void SwFldMgr::RemoveFldType(sal_uInt16 nResId, const String& rName )
312 {
313     SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell();
314     DBG_ASSERT(pSh, "no SwWrtShell found");
315     if( pSh )
316         pSh->RemoveFldType(nResId, rName);
317 }
318 
319 sal_uInt16 SwFldMgr::GetFldTypeCount(sal_uInt16 nResId) const
320 {
321     SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell();
322     DBG_ASSERT(pSh, "no SwWrtShell found");
323     return pSh ? pSh->GetFldTypeCount(nResId) : 0;
324 }
325 
326 
327 SwFieldType* SwFldMgr::GetFldType(sal_uInt16 nResId, sal_uInt16 nId) const
328 {
329     SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell();
330     DBG_ASSERT(pSh, "no SwWrtShell found");
331     return pSh ? pSh->GetFldType(nId, nResId) : 0;
332 }
333 
334 
335 SwFieldType* SwFldMgr::GetFldType(sal_uInt16 nResId, const String& rName) const
336 {
337     SwWrtShell * pSh = pWrtShell ? pWrtShell : lcl_GetShell();
338     DBG_ASSERT(pSh, "no SwWrtShell found");
339     return pSh ? pSh->GetFldType(nResId, rName) : 0;
340 }
341 
342 
343 /*--------------------------------------------------------------------
344     Beschreibung: Aktuelles Feld ermitteln
345  --------------------------------------------------------------------*/
346 SwField* SwFldMgr::GetCurFld()
347 {
348     SwWrtShell *pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
349     if ( pSh )
350         pCurFld = pSh->GetCurFld();
351     else
352         pCurFld = NULL;
353 
354     // Strings und Format initialisieren
355     //
356     aCurPar1.Erase();
357     aCurPar2.Erase();
358     sCurFrame.Erase();
359     nCurFmt = 0;
360 
361     if(!pCurFld)
362         return 0;
363 
364     // Aktuelle Werte aufbereiten Parameter 1 und Parameter 2
365     // als auch das Format ermitteln
366     //
367     const sal_uInt16 nTypeId = pCurFld->GetTypeId();
368 
369     nCurFmt     = pCurFld->GetFormat();
370     aCurPar1    = pCurFld->GetPar1();
371     aCurPar2    = pCurFld->GetPar2();
372 
373     switch( nTypeId )
374     {
375         case TYP_PAGENUMBERFLD:
376         case TYP_NEXTPAGEFLD:
377         case TYP_PREVPAGEFLD:
378         case TYP_GETREFPAGEFLD:
379             if( nCurFmt == SVX_NUM_PAGEDESC )
380                 nCurFmt -= 2;
381             break;
382     }
383     return pCurFld;
384 }
385 
386 /*--------------------------------------------------------------------
387     Beschreibung: Gruppen-Bereich liefern
388  --------------------------------------------------------------------*/
389 
390 
391 const SwFldGroupRgn& SwFldMgr::GetGroupRange(sal_Bool bHtmlMode, sal_uInt16 nGrpId) const
392 {
393 static SwFldGroupRgn __READONLY_DATA aRanges[] =
394 {
395     { /* Dokument   */  GRP_DOC_BEGIN,  GRP_DOC_END },
396     { /* Funktionen */  GRP_FKT_BEGIN,  GRP_FKT_END },
397     { /* Referenzen */  GRP_REF_BEGIN,  GRP_REF_END },
398     { /* Ablage     */  GRP_REG_BEGIN,  GRP_REG_END },
399     { /* DB         */  GRP_DB_BEGIN,   GRP_DB_END },
400     { /* User       */  GRP_VAR_BEGIN,  GRP_VAR_END }
401 };
402 static SwFldGroupRgn __READONLY_DATA aWebRanges[] =
403 {
404     { /* Dokument   */  GRP_WEB_DOC_BEGIN,  GRP_WEB_DOC_END },
405     { /* Funktionen */  GRP_WEB_FKT_BEGIN,  GRP_WEB_FKT_END },
406     { /* Referenzen */  GRP_WEB_REF_BEGIN,  GRP_WEB_REF_END },
407     { /* Ablage     */  GRP_WEB_REG_BEGIN,  GRP_WEB_REG_END },
408     { /* DB         */  GRP_WEB_DB_BEGIN,   GRP_WEB_DB_END },
409     { /* User       */  GRP_WEB_VAR_BEGIN,  GRP_WEB_VAR_END }
410 };
411 
412     if (bHtmlMode)
413         return aWebRanges[(sal_uInt16)nGrpId];
414     else
415         return aRanges[(sal_uInt16)nGrpId];
416 }
417 
418 /*--------------------------------------------------------------------
419     Beschreibung: GroupId bestimmen
420  --------------------------------------------------------------------*/
421 
422 sal_uInt16 SwFldMgr::GetGroup(sal_Bool bHtmlMode, sal_uInt16 nTypeId, sal_uInt16 nSubType) const
423 {
424     if (nTypeId == TYP_SETINPFLD)
425         nTypeId = TYP_SETFLD;
426 
427     if (nTypeId == TYP_INPUTFLD && (nSubType & INP_USR))
428         nTypeId = TYP_USERFLD;
429 
430     if (nTypeId == TYP_FIXDATEFLD)
431         nTypeId = TYP_DATEFLD;
432 
433     if (nTypeId == TYP_FIXTIMEFLD)
434         nTypeId = TYP_TIMEFLD;
435 
436     for (sal_uInt16 i = GRP_DOC; i <= GRP_VAR; i++)
437     {
438         const SwFldGroupRgn& rRange = GetGroupRange(bHtmlMode, i);
439         for (sal_uInt16 nPos = rRange.nStart; nPos < rRange.nEnd; nPos++)
440         {
441             if (aSwFlds[nPos].nTypeId == nTypeId)
442                 return i;
443         }
444     }
445     return USHRT_MAX;
446 }
447 
448 /*--------------------------------------------------------------------
449     Beschreibung: Namen zur TypeId ermitteln
450                   ZUGRIFF ueber TYP_....
451  --------------------------------------------------------------------*/
452 
453 
454 sal_uInt16 SwFldMgr::GetTypeId(sal_uInt16 nPos)
455 {
456     ASSERT(nPos < ::GetPackCount(), "unzulaessige Pos");
457     return aSwFlds[ nPos ].nTypeId;
458 }
459 
460 
461 const String& SwFldMgr::GetTypeStr(sal_uInt16 nPos)
462 {
463     ASSERT(nPos < ::GetPackCount(), "unzulaessige TypeId");
464 
465     sal_uInt16 nFldWh = aSwFlds[ nPos ].nTypeId;
466 
467     // Sonderbehandlung fuer Datum/Zeit Felder (ohne var/fix)
468     if( TYP_DATEFLD == nFldWh )
469     {
470         static String g_aDate( SW_RES( STR_DATEFLD ) );
471         return g_aDate;
472     }
473     if( TYP_TIMEFLD == nFldWh )
474     {
475         static String g_aTime( SW_RES( STR_TIMEFLD ) );
476         return g_aTime;
477     }
478 
479     return SwFieldType::GetTypeStr( nFldWh );
480 }
481 
482 /*--------------------------------------------------------------------
483     Beschreibung: Pos in der Liste bestimmen
484  --------------------------------------------------------------------*/
485 
486 
487 sal_uInt16 SwFldMgr::GetPos(sal_uInt16 nTypeId)
488 {
489     switch( nTypeId )
490     {
491         case TYP_FIXDATEFLD:        nTypeId = TYP_DATEFLD;      break;
492         case TYP_FIXTIMEFLD:        nTypeId = TYP_TIMEFLD;      break;
493         case TYP_SETINPFLD:         nTypeId = TYP_SETFLD;       break;
494         case TYP_USRINPFLD:         nTypeId = TYP_USERFLD;      break;
495     }
496 
497     for(sal_uInt16 i = 0; i < GetPackCount(); i++)
498         if(aSwFlds[i].nTypeId == nTypeId)
499             return i;
500 
501     return USHRT_MAX;
502 }
503 
504 /*--------------------------------------------------------------------
505     Beschreibung: Subtypen eines Feldes lokalisieren
506  --------------------------------------------------------------------*/
507 
508 sal_Bool SwFldMgr::GetSubTypes(sal_uInt16 nTypeId, SvStringsDtor& rToFill)
509 {
510     sal_Bool bRet = sal_False;
511     SwWrtShell *pSh = pWrtShell ? pWrtShell : lcl_GetShell();
512     DBG_ASSERT(pSh, "no SwWrtShell found");
513     if(pSh)
514     {
515         const sal_uInt16 nPos = GetPos(nTypeId);
516 
517         switch(nTypeId)
518         {
519             case TYP_SETREFFLD:
520             case TYP_GETREFFLD:
521             {
522                 // Referenzen sind keine Felder
523                 pSh->GetRefMarks( &rToFill );
524                 break;
525             }
526             case TYP_MACROFLD:
527             {
528                 break;
529             }
530             case TYP_INPUTFLD:
531             {   String* pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart);
532                 rToFill.Insert(pNew, rToFill.Count());
533                 // Weiter bei generischen Typen
534             }
535             case TYP_DDEFLD:
536             case TYP_SEQFLD:
537             case TYP_FORMELFLD:
538             case TYP_GETFLD:
539             case TYP_SETFLD:
540             case TYP_USERFLD:
541             {
542 
543                 const sal_uInt16 nCount = pSh->GetFldTypeCount();
544                 for(sal_uInt16 i = 0; i < nCount; ++i)
545                 {
546                     SwFieldType* pFldType = pSh->GetFldType( i );
547                     const sal_uInt16 nWhich = pFldType->Which();
548 
549                     if((nTypeId == TYP_DDEFLD && pFldType->Which() == RES_DDEFLD) ||
550 
551                        (nTypeId == TYP_USERFLD && nWhich == RES_USERFLD) ||
552 
553                        (nTypeId == TYP_GETFLD && nWhich == RES_SETEXPFLD &&
554                         !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) ||
555 
556                        (nTypeId == TYP_SETFLD && nWhich == RES_SETEXPFLD &&
557                         !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) ||
558 
559                        (nTypeId == TYP_SEQFLD && nWhich == RES_SETEXPFLD  &&
560                        (((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ)) ||
561 
562                        ((nTypeId == TYP_INPUTFLD || nTypeId == TYP_FORMELFLD) &&
563                          (nWhich == RES_USERFLD ||
564                           (nWhich == RES_SETEXPFLD &&
565                           !(((SwSetExpFieldType*)pFldType)->GetType() & nsSwGetSetExpType::GSE_SEQ))) ) )
566                     {
567                         String* pNew = new String(pFldType->GetName());
568                         rToFill.Insert(pNew, rToFill.Count());
569                     }
570                 }
571                 break;
572             }
573             case TYP_DBNEXTSETFLD:
574             case TYP_DBNUMSETFLD:
575             case TYP_DBNAMEFLD:
576             case TYP_DBSETNUMBERFLD:
577                 break;
578 
579             default:
580             {
581                 // statische SubTypes
582                 if(nPos != USHRT_MAX)
583                 {
584                     sal_uInt16 nCount;
585                     if (nTypeId == TYP_DOCINFOFLD)
586                         nCount = DI_SUBTYPE_END - DI_SUBTYPE_BEGIN;
587                     else
588                         nCount = aSwFlds[nPos].nSubTypeEnd - aSwFlds[nPos].nSubTypeStart;
589 
590                     for(sal_uInt16 i = 0; i < nCount; ++i)
591                     {
592                         String* pNew;
593                         if (nTypeId == TYP_DOCINFOFLD)
594                         {
595                             if ( i == DI_CUSTOM )
596                                 pNew = new String( String(SW_RES( STR_CUSTOM )) );
597                             else
598                                 pNew = new String(*ViewShell::GetShellRes()->aDocInfoLst[i]);
599                         }
600                         else
601                             pNew = new SW_RESSTR(aSwFlds[nPos].nSubTypeStart + i);
602 
603                         rToFill.Insert(pNew, rToFill.Count());
604                     }
605                 }
606             }
607         }
608         bRet = sal_True;
609     }
610     return bRet;
611 }
612 
613 /*--------------------------------------------------------------------
614     Beschreibung: Format ermitteln
615                   ZUGRIFF ueber TYP_....
616  --------------------------------------------------------------------*/
617 
618 
619 sal_uInt16 SwFldMgr::GetFormatCount(sal_uInt16 nTypeId, sal_Bool bIsText, sal_Bool bHtmlMode) const
620 {
621     ASSERT(nTypeId < TYP_END, "unzulaessige TypeId");
622 
623     {
624         const sal_uInt16 nPos = GetPos(nTypeId);
625 
626         if(nPos == USHRT_MAX || (bHtmlMode && nTypeId == TYP_SETFLD))
627             return 0;
628 
629         sal_uLong nStart = aSwFlds[nPos].nFmtBegin;
630         sal_uLong nEnd   = aSwFlds[nPos].nFmtEnd;
631 
632         if (bIsText && nEnd - nStart >= 2)
633             return 2;
634 
635         if (nTypeId == TYP_FILENAMEFLD)
636             nEnd -= 2;  // Kein Bereich oder Vorlage
637 
638         switch(nStart)
639         {
640             case FMT_GETVAR_BEGIN:
641             case FMT_SETVAR_BEGIN:  return VF_COUNT;
642             case FMT_USERVAR_BEGIN: return VF_USR_COUNT;
643             case FMT_DBFLD_BEGIN:   return VF_DB_COUNT;
644             case FMT_NUM_BEGIN:
645             {
646                 sal_uInt16 nCount = (sal_uInt16)(nEnd - nStart);
647                 GetNumberingInfo();
648                 if(xNumberingInfo.is())
649                 {
650                     Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes();
651                     const sal_Int16* pTypes = aTypes.getConstArray();
652                     for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++)
653                     {
654                         sal_Int16 nCurrent = pTypes[nType];
655                         //skip all values below or equal to CHARS_LOWER_LETTER_N
656                         if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N)
657                         {
658                             // #i28073# it's not necessarily a sorted sequence
659                             ++nCount;
660                         }
661                     }
662                 }
663                 return nCount;
664             }
665 
666         }
667         return (sal_uInt16)(nEnd - nStart);
668     }
669 }
670 
671 /*--------------------------------------------------------------------
672     Beschreibung:   FormatString zu einem Typ ermitteln
673  --------------------------------------------------------------------*/
674 
675 
676 String SwFldMgr::GetFormatStr(sal_uInt16 nTypeId, sal_uLong nFormatId) const
677 {
678     String aRet;
679     ASSERT(nTypeId < TYP_END, "unzulaessige TypeId");
680 
681     const sal_uInt16 nPos = GetPos(nTypeId);
682 
683     if(nPos == USHRT_MAX)
684         return aRet;
685 
686     sal_uLong nStart;
687 
688     nStart = aSwFlds[nPos].nFmtBegin;
689 
690     if (TYP_AUTHORFLD == nTypeId|| TYP_FILENAMEFLD == nTypeId)
691         nFormatId &= ~FF_FIXED;     // Fixed-Flag ausmaskieren
692 
693     if((nStart + nFormatId) < aSwFlds[nPos].nFmtEnd)
694         aRet = SW_RESSTR((sal_uInt16)(nStart + nFormatId));
695     else if( FMT_NUM_BEGIN == nStart)
696     {
697         if(xNumberingInfo.is())
698         {
699             Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes();
700             const sal_Int16* pTypes = aTypes.getConstArray();
701             sal_Int32 nOffset = aSwFlds[nPos].nFmtEnd - nStart;
702             sal_Int32 nValidEntry = 0;
703             for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++)
704             {
705                 sal_Int16 nCurrent = pTypes[nType];
706                 if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N)
707                 {
708                     if(nValidEntry == ((sal_Int32)nFormatId) - nOffset)
709                     {
710                         aRet = xNumberingInfo->getNumberingIdentifier( pTypes[nType] );
711                         break;
712                     }
713                     ++nValidEntry;
714                 }
715             }
716         }
717     }
718 
719     return aRet;
720 }
721 
722 /*--------------------------------------------------------------------
723     Beschreibung:   FormatId aus Pseudo-ID ermitteln
724  --------------------------------------------------------------------*/
725 
726 sal_uInt16 SwFldMgr::GetFormatId(sal_uInt16 nTypeId, sal_uLong nFormatId) const
727 {
728     sal_uInt16 nId = (sal_uInt16)nFormatId;
729 
730     switch( nTypeId )
731     {
732     case TYP_DOCINFOFLD:
733         switch( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId )
734         {
735         case FMT_REG_AUTHOR:    nId = DI_SUB_AUTHOR;    break;
736         case FMT_REG_TIME:      nId = DI_SUB_TIME;      break;
737         case FMT_REG_DATE:      nId = DI_SUB_DATE;      break;
738         }
739         break;
740 
741     case TYP_PAGENUMBERFLD:
742     case TYP_NEXTPAGEFLD:
743     case TYP_PREVPAGEFLD:
744     case TYP_DOCSTATFLD:
745     case TYP_DBSETNUMBERFLD:
746     case TYP_SEQFLD:
747     case TYP_GETREFPAGEFLD:
748     {
749         sal_uInt16 nPos = GetPos( nTypeId );
750         sal_uLong nBegin = aSwFlds[ nPos ].nFmtBegin;
751         sal_uLong nEnd = aSwFlds[nPos].nFmtEnd;
752         if((nBegin + nFormatId) < nEnd)
753         {
754             switch( nBegin + nFormatId )
755             {
756             case FMT_NUM_ABC:               nId = SVX_NUM_CHARS_UPPER_LETTER;   break;
757             case FMT_NUM_SABC:              nId = SVX_NUM_CHARS_LOWER_LETTER;   break;
758             case FMT_NUM_ROMAN:             nId = SVX_NUM_ROMAN_UPPER;          break;
759             case FMT_NUM_SROMAN:            nId = SVX_NUM_ROMAN_LOWER;          break;
760             case FMT_NUM_ARABIC:            nId = SVX_NUM_ARABIC;               break;
761             case FMT_NUM_PAGEDESC:          nId = SVX_NUM_PAGEDESC;             break;
762             case FMT_NUM_PAGESPECIAL:       nId = SVX_NUM_CHAR_SPECIAL;         break;
763             case FMT_NUM_ABC_N:             nId = SVX_NUM_CHARS_UPPER_LETTER_N; break;
764             case FMT_NUM_SABC_N:            nId = SVX_NUM_CHARS_LOWER_LETTER_N; break;
765             }
766         }
767         else if(xNumberingInfo.is())
768         {
769             Sequence<sal_Int16> aTypes = xNumberingInfo->getSupportedNumberingTypes();
770             const sal_Int16* pTypes = aTypes.getConstArray();
771             sal_Int32 nOffset = nEnd - nBegin;
772             sal_Int32 nValidEntry = 0;
773             for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++)
774             {
775                 sal_Int16 nCurrent = pTypes[nType];
776                 if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N)
777                 {
778                     if(nValidEntry == ((sal_Int32)nFormatId) - nOffset)
779                     {
780                         nId = pTypes[nType];
781                         break;
782                     }
783                     ++nValidEntry;
784                 }
785             }
786         }
787     }
788     break;
789     case TYP_DDEFLD:
790         switch ( aSwFlds[ GetPos( nTypeId ) ].nFmtBegin + nFormatId )
791         {
792         case FMT_DDE_NORMAL:    nId = sfx2::LINKUPDATE_ONCALL; break;
793         case FMT_DDE_HOT:       nId = sfx2::LINKUPDATE_ALWAYS; break;
794         }
795         break;
796     }
797 
798     return nId;
799 
800 }
801 
802 /*--------------------------------------------------------------------
803     Beschreibung: Traveling
804  --------------------------------------------------------------------*/
805 
806 
807 sal_Bool SwFldMgr::GoNextPrev( sal_Bool bNext, SwFieldType* pTyp )
808 {
809     SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
810     if(!pSh)
811         return sal_False;
812 
813     if( !pTyp && pCurFld )
814     {
815         const sal_uInt16 nTypeId = pCurFld->GetTypeId();
816         if( TYP_SETINPFLD == nTypeId || TYP_USRINPFLD == nTypeId )
817             pTyp = pSh->GetFldType( 0, RES_INPUTFLD );
818         else
819             pTyp = pCurFld->GetTyp();
820     }
821 
822     if (pTyp && pTyp->Which() == RES_DBFLD)
823     {
824         // Fuer Feldbefehl-bearbeiten (alle DB-Felder anspringen)
825         return pSh->MoveFldType( 0, bNext, USHRT_MAX, RES_DBFLD );
826     }
827 
828     return pTyp && pSh ? pSh->MoveFldType( pTyp, bNext ) : sal_False;
829 }
830 
831 /*--------------------------------------------------------------------
832     Beschreibung: Feldtypen einfuegen
833  --------------------------------------------------------------------*/
834 
835 
836 void SwFldMgr::InsertFldType(SwFieldType& rType)
837 {
838     SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
839     DBG_ASSERT(pSh, "no SwWrtShell found");
840     if(pSh)
841         pSh->InsertFldType(rType);
842 }
843 
844 /*--------------------------------------------------------------------
845     Beschreibung: Aktuelle TypeId ermitteln
846  --------------------------------------------------------------------*/
847 
848 
849 sal_uInt16 SwFldMgr::GetCurTypeId() const
850 {
851     return pCurFld ? pCurFld->GetTypeId() : USHRT_MAX;
852 }
853 
854 /*--------------------------------------------------------------------
855     Beschreibung: Ueber String  Feld einfuegen oder Update
856  --------------------------------------------------------------------*/
857 
858 
859 sal_Bool SwFldMgr::InsertFld(  const SwInsertFld_Data& rData )
860 {
861     SwField* pFld   = 0;
862     sal_Bool bExp = sal_False;
863     sal_Bool bTbl = sal_False;
864     sal_Bool bPageVar = sal_False;
865     sal_uLong nFormatId = rData.nFormatId;
866     sal_uInt16 nSubType = rData.nSubType;
867     sal_Unicode cSeparator = rData.cSeparator;
868     SwWrtShell* pCurShell = rData.pSh;
869     if(!pCurShell)
870         pCurShell = pWrtShell ? pWrtShell : ::lcl_GetShell();
871     DBG_ASSERT(pCurShell, "no SwWrtShell found");
872     if(!pCurShell)
873         return sal_False;
874 
875     switch(rData.nTypeId)
876     {   // ACHTUNG dieses Feld wird ueber einen gesonderten Dialog eingefuegt
877         case TYP_POSTITFLD:
878         {
879             SwPostItFieldType* pType = (SwPostItFieldType*)pCurShell->GetFldType(0, RES_POSTITFLD);
880             pFld = new SwPostItField(pType, rData.sPar1, rData.sPar2, DateTime());
881             break;
882         }
883         case TYP_SCRIPTFLD:
884         {
885             SwScriptFieldType* pType =
886                 (SwScriptFieldType*)pCurShell->GetFldType(0, RES_SCRIPTFLD);
887             pFld = new SwScriptField(pType, rData.sPar1, rData.sPar2, (sal_Bool)nFormatId);
888             break;
889         }
890         case TYP_COMBINED_CHARS:
891         {
892             SwCombinedCharFieldType* pType = (SwCombinedCharFieldType*)
893                                 pCurShell->GetFldType( 0, RES_COMBINED_CHARS );
894             pFld = new SwCombinedCharField( pType, rData.sPar1 );
895         }
896         break;
897         case TYP_AUTHORITY:
898         {
899             SwAuthorityFieldType* pType =
900                 (SwAuthorityFieldType*)pCurShell->GetFldType(0, RES_AUTHORITY);
901             if(!pType)
902             {
903                 pType =
904                     (SwAuthorityFieldType*)pCurShell->InsertFldType(
905                                     SwAuthorityFieldType(pCurShell->GetDoc()));
906             }
907             pFld = new SwAuthorityField(pType, rData.sPar1);
908         }
909         break;
910         case TYP_DATEFLD:
911         case TYP_TIMEFLD:
912         {
913             sal_uInt16 nSub = static_cast< sal_uInt16 >(rData.nTypeId == TYP_DATEFLD ? DATEFLD : TIMEFLD);
914             nSub |= nSubType == DATE_VAR ? 0 : FIXEDFLD;
915 
916             SwDateTimeFieldType* pTyp =
917                 (SwDateTimeFieldType*)pCurShell->GetFldType(0, RES_DATETIMEFLD);
918             pFld = new SwDateTimeField(pTyp, nSub, nFormatId);
919             pFld->SetPar2(rData.sPar2);
920             break;
921         }
922         case TYP_FILENAMEFLD:
923         {
924             SwFileNameFieldType* pTyp =
925                 (SwFileNameFieldType*)pCurShell->GetFldType(0, RES_FILENAMEFLD);
926             pFld = new SwFileNameField(pTyp, nFormatId);
927             break;
928         }
929         case TYP_TEMPLNAMEFLD:
930         {
931             SwTemplNameFieldType* pTyp =
932                 (SwTemplNameFieldType*)pCurShell->GetFldType(0, RES_TEMPLNAMEFLD);
933             pFld = new SwTemplNameField(pTyp, nFormatId);
934             break;
935         }
936         case TYP_CHAPTERFLD:
937         {
938             sal_uInt16 nByte = (sal_uInt16)rData.sPar2.ToInt32();
939             SwChapterFieldType* pTyp =
940                 (SwChapterFieldType*)pCurShell->GetFldType(0, RES_CHAPTERFLD);
941             pFld = new SwChapterField(pTyp, nFormatId);
942             nByte = Max(sal_uInt16(1), nByte);
943             nByte = Min(nByte, sal_uInt16(MAXLEVEL));
944             nByte -= 1;
945             ((SwChapterField*)pFld)->SetLevel((sal_uInt8)nByte);
946             break;
947         }
948         case TYP_NEXTPAGEFLD:
949         case TYP_PREVPAGEFLD:
950         case TYP_PAGENUMBERFLD:
951         {
952             short nOff  = (short)rData.sPar2.ToInt32();
953 
954             if(rData.nTypeId == TYP_NEXTPAGEFLD)
955             {
956                 if( SVX_NUM_CHAR_SPECIAL == nFormatId )
957                     nOff = 1;
958                 else
959                     nOff += 1;
960                 nSubType = PG_NEXT;
961             }
962             else if(rData.nTypeId == TYP_PREVPAGEFLD)
963             {
964                 if( SVX_NUM_CHAR_SPECIAL == nFormatId )
965                     nOff = -1;
966                 else
967                     nOff -= 1;
968                 nSubType =  PG_PREV;
969             }
970             else
971                 nSubType = PG_RANDOM;
972 
973             SwPageNumberFieldType* pTyp =
974                 (SwPageNumberFieldType*)pCurShell->GetFldType(0, RES_PAGENUMBERFLD);
975             pFld = new SwPageNumberField(pTyp, nSubType, nFormatId, nOff);
976 
977             if( SVX_NUM_CHAR_SPECIAL == nFormatId &&
978                 ( PG_PREV == nSubType || PG_NEXT == nSubType ) )
979                 ((SwPageNumberField*)pFld)->SetUserString( rData.sPar2 );
980             break;
981         }
982         case TYP_DOCSTATFLD:
983         {   SwDocStatFieldType* pTyp =
984                 (SwDocStatFieldType*)pCurShell->GetFldType(0, RES_DOCSTATFLD);
985             pFld = new SwDocStatField(pTyp, nSubType, nFormatId);
986             break;
987         }
988         case TYP_AUTHORFLD:
989         {   SwAuthorFieldType* pTyp =
990                 (SwAuthorFieldType*)pCurShell->GetFldType(0, RES_AUTHORFLD);
991             pFld = new SwAuthorField(pTyp, nFormatId);
992             break;
993         }
994         case TYP_CONDTXTFLD:
995         case TYP_HIDDENTXTFLD:
996         {
997             SwHiddenTxtFieldType* pTyp =
998                 (SwHiddenTxtFieldType*)pCurShell->GetFldType(0, RES_HIDDENTXTFLD);
999             pFld = new SwHiddenTxtField(pTyp, sal_True, rData.sPar1, rData.sPar2, sal_False, rData.nTypeId);
1000             bExp = sal_True;
1001             break;
1002         }
1003         case TYP_HIDDENPARAFLD:
1004         {
1005             SwHiddenParaFieldType* pTyp =
1006                 (SwHiddenParaFieldType*)pCurShell->GetFldType(0, RES_HIDDENPARAFLD);
1007             pFld = new SwHiddenParaField(pTyp, rData.sPar1);
1008             bExp = sal_True;
1009             break;
1010         }
1011         case TYP_SETREFFLD:
1012         {
1013             if( rData.sPar1.Len() > 0 && CanInsertRefMark( rData.sPar1 ) )
1014             {
1015                 pCurShell->SetAttr( SwFmtRefMark( rData.sPar1 ) );
1016                 return sal_True;
1017             }
1018             return sal_False;
1019         }
1020         case TYP_GETREFFLD:
1021         {
1022             SwGetRefFieldType* pTyp =
1023                 (SwGetRefFieldType*)pCurShell->GetFldType(0, RES_GETREFFLD);
1024             sal_uInt16 nSeqNo = (sal_uInt16)rData.sPar2.ToInt32();
1025             pFld = new SwGetRefField(pTyp, rData.sPar1, nSubType, nSeqNo, nFormatId);
1026             bExp = sal_True;
1027             break;
1028         }
1029         case TYP_DDEFLD:
1030         {
1031             //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
1032             //              Namen haben! Wird hier noch nicht beachtet.
1033             String sCmd( rData.sPar2 );
1034             sal_uInt16 nTmpPos = sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator );
1035             sCmd.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos );
1036 
1037             SwDDEFieldType aType( rData.sPar1, sCmd, (sal_uInt16) nFormatId );
1038             SwDDEFieldType* pTyp = (SwDDEFieldType*) pCurShell->InsertFldType( aType );
1039             pFld = new SwDDEField( pTyp );
1040             break;
1041         }
1042         case TYP_MACROFLD:
1043         {
1044             SwMacroFieldType* pTyp =
1045                 (SwMacroFieldType*)pCurShell->GetFldType(0, RES_MACROFLD);
1046 
1047             pFld = new SwMacroField(pTyp, rData.sPar1, rData.sPar2);
1048 
1049             break;
1050         }
1051         case TYP_INTERNETFLD:
1052         {
1053             SwFmtINetFmt aFmt( rData.sPar1, sCurFrame );
1054             if( pMacroItem )
1055                 aFmt.SetMacroTbl( &pMacroItem->GetMacroTable() );
1056             return pCurShell->InsertURL( aFmt, rData.sPar2 );
1057         }
1058         case TYP_JUMPEDITFLD:
1059         {
1060             SwJumpEditFieldType* pTyp =
1061                 (SwJumpEditFieldType*)pCurShell->GetFldType(0, RES_JUMPEDITFLD);
1062 
1063             pFld = new SwJumpEditField(pTyp, nFormatId, rData.sPar1, rData.sPar2 );
1064             break;
1065         }
1066         case TYP_DOCINFOFLD:
1067         {
1068             SwDocInfoFieldType* pTyp = (SwDocInfoFieldType*)pCurShell->GetFldType(
1069                                             0, RES_DOCINFOFLD );
1070             pFld = new SwDocInfoField(pTyp, nSubType, rData.sPar1, nFormatId);
1071             break;
1072         }
1073         case TYP_EXTUSERFLD:
1074         {
1075             SwExtUserFieldType* pTyp = (SwExtUserFieldType*)pCurShell->GetFldType(
1076                                             0, RES_EXTUSERFLD);
1077             pFld = new SwExtUserField(pTyp, nSubType, nFormatId);
1078             break;
1079         }
1080         case TYP_DBFLD:
1081         {
1082             SwDBData aDBData;
1083             String sPar1;
1084 
1085             if (rData.sPar1.Search(DB_DELIM) == STRING_NOTFOUND)
1086             {
1087                 aDBData = pCurShell->GetDBData();
1088                 sPar1 = rData.sPar1;
1089             }
1090             else
1091             {
1092                 aDBData.sDataSource = rData.sPar1.GetToken(0, DB_DELIM);
1093                 aDBData.sCommand = rData.sPar1.GetToken(1, DB_DELIM);
1094                 aDBData.nCommandType = rData.sPar1.GetToken(2, DB_DELIM).ToInt32();
1095                 sPar1 = rData.sPar1.GetToken(3, DB_DELIM);
1096             }
1097 
1098             if(aDBData.sDataSource.getLength() && pCurShell->GetDBData() != aDBData)
1099                 pCurShell->ChgDBData(aDBData);
1100 
1101             SwDBFieldType* pTyp = (SwDBFieldType*)pCurShell->InsertFldType(
1102                     SwDBFieldType(pCurShell->GetDoc(), sPar1, aDBData) );
1103             pFld = new SwDBField(pTyp);
1104             pFld->SetSubType(nSubType);
1105 
1106             if( !(nSubType & nsSwExtendedSubType::SUB_OWN_FMT) ) // Datenbankformat ermitteln
1107             {
1108                 Reference< XDataSource> xSource;
1109                 rData.aDBDataSource >>= xSource;
1110                 Reference<XConnection> xConnection;
1111                 rData.aDBConnection >>= xConnection;
1112                 Reference<XPropertySet> xColumn;
1113                 rData.aDBColumn >>= xColumn;
1114                 if(xColumn.is())
1115                 {
1116                     nFormatId = pCurShell->GetNewDBMgr()->GetColumnFmt(xSource, xConnection, xColumn,
1117                                         pCurShell->GetNumberFormatter(), GetCurrLanguage() );
1118                 }
1119                 else
1120                     nFormatId = pCurShell->GetNewDBMgr()->GetColumnFmt(
1121                                         aDBData.sDataSource, aDBData.sCommand, sPar1,
1122                                         pCurShell->GetNumberFormatter(), GetCurrLanguage() );
1123             }
1124             pFld->ChangeFormat( nFormatId );
1125 
1126             bExp = sal_True;
1127             break;
1128         }
1129         case TYP_DBSETNUMBERFLD:
1130         case TYP_DBNUMSETFLD:
1131         case TYP_DBNEXTSETFLD:
1132         case TYP_DBNAMEFLD:
1133         {
1134             sal_uInt16 nPos, nTablePos, nCmdTypePos, nExpPos;
1135             String sPar1;
1136             SwDBData aDBData;
1137 
1138             // DBName aus rData.sPar1 extrahieren. Format: DBName.TableName.CommandType.ExpStrg
1139             if ((nTablePos = rData.sPar1.Search(DB_DELIM)) != STRING_NOTFOUND)
1140                 aDBData.sDataSource = rData.sPar1.Copy(0, nTablePos++);
1141             if ((nCmdTypePos = rData.sPar1.Search(DB_DELIM, nTablePos)) != STRING_NOTFOUND)
1142             {
1143                 aDBData.sCommand = rData.sPar1.Copy(nTablePos, nCmdTypePos++ - nTablePos);
1144             }
1145             if ((nExpPos = rData.sPar1.Search(DB_DELIM, nCmdTypePos)) != STRING_NOTFOUND)
1146             {
1147                 aDBData.nCommandType = rData.sPar1.Copy(nCmdTypePos, nExpPos++ - nCmdTypePos).ToInt32();
1148             }
1149             if (nExpPos != STRING_NOTFOUND)
1150                 nPos = nExpPos;
1151             else if (nTablePos != STRING_NOTFOUND)
1152                 nPos = nTablePos;
1153             else
1154                 nPos = 0;
1155             sPar1 = rData.sPar1.Copy(nPos);
1156 
1157             if (aDBData.sDataSource.getLength() && pCurShell->GetDBData() != aDBData)
1158                 pCurShell->ChgDBData(aDBData);
1159 
1160             switch(rData.nTypeId)
1161             {
1162                 case TYP_DBNAMEFLD:
1163                 {
1164                     SwDBNameFieldType* pTyp =
1165                         (SwDBNameFieldType*)pCurShell->GetFldType(0, RES_DBNAMEFLD);
1166                     pFld = new SwDBNameField(pTyp, aDBData);
1167 
1168                     break;
1169                 }
1170                 case TYP_DBNEXTSETFLD:
1171                 {
1172                     SwDBNextSetFieldType* pTyp = (SwDBNextSetFieldType*)pCurShell->GetFldType(
1173                                                     0, RES_DBNEXTSETFLD);
1174                     pFld = new SwDBNextSetField(pTyp, sPar1, rData.sPar2, aDBData);
1175                     bExp = sal_True;
1176                     break;
1177                 }
1178                 case TYP_DBNUMSETFLD:
1179                 {
1180                     SwDBNumSetFieldType* pTyp = (SwDBNumSetFieldType*)pCurShell->GetFldType(
1181                                                     0, RES_DBNUMSETFLD);
1182                     pFld = new SwDBNumSetField( pTyp, sPar1, rData.sPar2, aDBData);
1183                     bExp = sal_True;
1184                     break;
1185                 }
1186                 case TYP_DBSETNUMBERFLD:
1187                 {
1188                     SwDBSetNumberFieldType* pTyp = (SwDBSetNumberFieldType*)
1189                                                 pCurShell->GetFldType(0, RES_DBSETNUMBERFLD);
1190                     pFld = new SwDBSetNumberField( pTyp, aDBData, nFormatId);
1191                     bExp = sal_True;
1192                     break;
1193                 }
1194             }
1195             break;
1196         }
1197         case TYP_USERFLD:
1198         {
1199             SwUserFieldType* pTyp =
1200                 (SwUserFieldType*)pCurShell->GetFldType(RES_USERFLD, rData.sPar1);
1201 
1202             // nur wenn vorhanden
1203             if(!pTyp)
1204             {
1205                 pTyp = (SwUserFieldType*)pCurShell->InsertFldType(
1206                         SwUserFieldType(pCurShell->GetDoc(), rData.sPar1));
1207             }
1208             if (pTyp->GetContent(nFormatId) != rData.sPar2)
1209                 pTyp->SetContent(rData.sPar2, nFormatId);
1210             pFld = new SwUserField(pTyp, 0, nFormatId);
1211             if (pFld->GetSubType() != nSubType)
1212                 pFld->SetSubType(nSubType);
1213             bTbl = sal_True;
1214             break;
1215         }
1216         case TYP_INPUTFLD:
1217         {
1218             if ((nSubType & 0x00ff) == INP_VAR)
1219             {
1220                 SwSetExpFieldType* pTyp = (SwSetExpFieldType*)
1221                                     pCurShell->GetFldType(RES_SETEXPFLD, rData.sPar1);
1222 
1223                 // kein Experssion Type mit dem Namen vorhanden -> anlegen
1224                 if(pTyp)
1225                 {
1226                     SwSetExpField* pExpFld =
1227                         new SwSetExpField(pTyp, aEmptyStr, nFormatId);
1228 
1229                     // Typ vom SwSetExpFieldType nicht veraendern:
1230                     sal_uInt16 nOldSubType = pExpFld->GetSubType();
1231                     pExpFld->SetSubType(nOldSubType | (nSubType & 0xff00));
1232 
1233                     pExpFld->SetPromptText(rData.sPar2);
1234                     pExpFld->SetInputFlag(sal_True) ;
1235                     bExp = sal_True;
1236                     pFld = pExpFld;
1237                 }
1238                 else
1239                     return sal_False;
1240             }
1241             else
1242             {
1243                 SwInputFieldType* pTyp =
1244                     (SwInputFieldType*)pCurShell->GetFldType(0, RES_INPUTFLD);
1245 
1246                 SwInputField* pInpFld =
1247                     new SwInputField(pTyp, rData.sPar1, rData.sPar2, nSubType|nsSwExtendedSubType::SUB_INVISIBLE, nFormatId);
1248                 pFld = pInpFld;
1249             }
1250 
1251             // Dialog starten
1252             //
1253             pCurShell->StartInputFldDlg(pFld, sal_False, rData.pParent);
1254             break;
1255         }
1256         case TYP_SETFLD:
1257         {
1258             if (!rData.sPar2.Len())   // Leere Variablen sind nicht erlaubt
1259                 return sal_False;
1260 
1261             SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pCurShell->InsertFldType(
1262                     SwSetExpFieldType(pCurShell->GetDoc(), rData.sPar1) );
1263 
1264             SwSetExpField* pExpFld = new SwSetExpField( pTyp, rData.sPar2, nFormatId);
1265             pExpFld->SetSubType(nSubType);
1266             pExpFld->SetPar2(rData.sPar2);
1267             bExp = sal_True;
1268             pFld = pExpFld;
1269             break;
1270         }
1271         case TYP_SEQFLD:
1272         {
1273             SwSetExpFieldType* pTyp = (SwSetExpFieldType*)pCurShell->InsertFldType(
1274                     SwSetExpFieldType(pCurShell->GetDoc(), rData.sPar1, nsSwGetSetExpType::GSE_SEQ));
1275 
1276             sal_uInt8 nLevel = static_cast< sal_uInt8 >(nSubType & 0xff);
1277 
1278             pTyp->SetOutlineLvl(nLevel);
1279             if (nLevel != 0x7f && cSeparator == 0)
1280                 cSeparator = '.';
1281 
1282             pTyp->SetDelimiter(cSeparator);
1283             SwSetExpField* pExpFld = new SwSetExpField(pTyp, rData.sPar2, nFormatId);
1284             bExp = sal_True;
1285             pFld = pExpFld;
1286             nSubType = nsSwGetSetExpType::GSE_SEQ;
1287             break;
1288         }
1289         case TYP_GETFLD:
1290         {
1291             // gibt es ein entprechendes SetField
1292             SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
1293                                     pCurShell->GetFldType(RES_SETEXPFLD, rData.sPar1);
1294 
1295             if(pSetTyp)
1296             {
1297                 SwGetExpFieldType* pTyp = (SwGetExpFieldType*)pCurShell->GetFldType(
1298                                                 0, RES_GETEXPFLD);
1299                 pFld = new SwGetExpField(pTyp, rData.sPar1, pSetTyp->GetType(), nFormatId);
1300                 pFld->SetSubType(nSubType | pSetTyp->GetType());
1301                 bExp = sal_True;
1302             }
1303             else
1304                 return sal_False;
1305             break;
1306         }
1307         case TYP_FORMELFLD:
1308         {
1309             if(pCurShell->GetFrmType(0,sal_False) & FRMTYPE_TABLE)
1310             {
1311                 pCurShell->StartAllAction();
1312 
1313                 SvNumberFormatter* pFormatter = pCurShell->GetDoc()->GetNumberFormatter();
1314                 const SvNumberformat* pEntry = pFormatter->GetEntry(nFormatId);
1315 
1316                 if (pEntry)
1317                 {
1318                     SfxStringItem aFormat(FN_NUMBER_FORMAT, pEntry->GetFormatstring());
1319                     pCurShell->GetView().GetViewFrame()->GetDispatcher()->
1320                         Execute(FN_NUMBER_FORMAT, SFX_CALLMODE_SYNCHRON, &aFormat, 0L);
1321                 }
1322 
1323                 SfxItemSet aBoxSet( pCurShell->GetAttrPool(),
1324                                 RES_BOXATR_FORMULA, RES_BOXATR_FORMULA );
1325 
1326                 String sFml( rData.sPar2 );
1327                 if( sFml.EraseLeadingChars().Len() &&
1328                     '=' == sFml.GetChar( 0 ) )
1329                     sFml.Erase( 0, 1 );
1330 
1331                 aBoxSet.Put( SwTblBoxFormula( sFml ));
1332                 pCurShell->SetTblBoxFormulaAttrs( aBoxSet );
1333                 pCurShell->UpdateTable();
1334 
1335                 pCurShell->EndAllAction();
1336                 return sal_True;
1337 
1338 /*              // In der Tabelle Tabellenformeln einfuegen
1339                 SwTblFieldType* pTyp = (SwTblFieldType*)pCurShell->GetFldType(
1340                                                         0, RES_TABLEFLD);
1341                 pFld = new SwTblField(pTyp, rData.sPar2, nsSwGetSetExpType::GSE_EXPR, nFormatId);
1342                 bTbl = sal_True;*/
1343             }
1344             else
1345             {
1346                 SwGetExpFieldType* pTyp = (SwGetExpFieldType*)
1347                                             pCurShell->GetFldType(0, RES_GETEXPFLD);
1348                 pFld = new SwGetExpField(pTyp, rData.sPar2, nsSwGetSetExpType::GSE_FORMULA, nFormatId);
1349                 pFld->SetSubType(nSubType);
1350                 bExp = sal_True;
1351             }
1352             break;
1353         }
1354         case TYP_SETREFPAGEFLD:
1355             pFld = new SwRefPageSetField( (SwRefPageSetFieldType*)
1356                                 pCurShell->GetFldType( 0, RES_REFPAGESETFLD ),
1357                                 (short)rData.sPar2.ToInt32(), 0 != nSubType  );
1358             bPageVar = sal_True;
1359             break;
1360 
1361         case TYP_GETREFPAGEFLD:
1362             pFld = new SwRefPageGetField( (SwRefPageGetFieldType*)
1363                             pCurShell->GetFldType( 0, RES_REFPAGEGETFLD ), nFormatId );
1364             bPageVar = sal_True;
1365             break;
1366         case TYP_DROPDOWN :
1367         {
1368             pFld = new SwDropDownField(pCurShell->GetFldType( 0, RES_DROPDOWN ));
1369             xub_StrLen nTokenCount = rData.sPar2.Len() ? rData.sPar2.GetTokenCount(DB_DELIM) : 0;
1370             Sequence<OUString> aEntries(nTokenCount);
1371             OUString* pArray = aEntries.getArray();
1372             for(xub_StrLen nToken = 0; nToken < nTokenCount; nToken++)
1373                 pArray[nToken] = rData.sPar2.GetToken(nToken, DB_DELIM);
1374             ((SwDropDownField*)pFld)->SetItems(aEntries);
1375             ((SwDropDownField*)pFld)->SetName(rData.sPar1);
1376         }
1377         break;
1378         default:
1379         {   ASSERT(!this, "Falscher Feldtyp");
1380             return sal_False;
1381         }
1382     }
1383     ASSERT(pFld, "Feld nicht vorhanden");
1384 
1385 
1386      //the auto language flag has to be set prior to the language!
1387      pFld->SetAutomaticLanguage(rData.bIsAutomaticLanguage);
1388      sal_uInt16 nLang = GetCurrLanguage();
1389      pFld->SetLanguage(nLang);
1390 
1391     // Einfuegen
1392     pCurShell->StartAllAction();
1393 
1394     pCurShell->Insert(*pFld);
1395 
1396     if(bExp && bEvalExp)
1397         pCurShell->UpdateExpFlds(sal_True);
1398 
1399     if(bTbl)
1400     {
1401         pCurShell->Left(CRSR_SKIP_CHARS, sal_False, 1, sal_False );
1402         pCurShell->UpdateFlds(*pFld);
1403         pCurShell->Right(CRSR_SKIP_CHARS, sal_False, 1, sal_False );
1404     }
1405     else if( bPageVar )
1406         ((SwRefPageGetFieldType*)pCurShell->GetFldType( 0, RES_REFPAGEGETFLD ))->UpdateFlds();
1407     else if( TYP_GETREFFLD == rData.nTypeId )
1408         pFld->GetTyp()->ModifyNotification( 0, 0 );
1409 
1410     // temporaeres Feld loeschen
1411     delete pFld;
1412 
1413     pCurShell->EndAllAction();
1414     return sal_True;
1415 }
1416 
1417 /*--------------------------------------------------------------------
1418     Beschreibung: Felder Update
1419  --------------------------------------------------------------------*/
1420 
1421 
1422 void SwFldMgr::UpdateCurFld(sal_uLong nFormat,
1423                             const String& rPar1,
1424                             const String& rPar2,
1425                             SwField * _pTmpFld) // #111840#
1426 {
1427     // Format aendern
1428     ASSERT(pCurFld, "kein Feld an der CursorPos");
1429 
1430     bool bDelete = false;
1431     SwField *pTmpFld;       // mb: fixed memory leak
1432     if (NULL != _pTmpFld)
1433     {
1434         pTmpFld = _pTmpFld;
1435     }
1436     else
1437     {
1438         pTmpFld = pCurFld->CopyField();
1439         bDelete = true;
1440     }
1441 
1442     SwFieldType* pType   = pTmpFld->GetTyp();
1443     const sal_uInt16 nTypeId = pTmpFld->GetTypeId();
1444 
1445     SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
1446     DBG_ASSERT(pSh, "no SwWrtShell found");
1447     if(!pSh)
1448         return;
1449     pSh->StartAllAction();
1450 
1451     sal_Bool bSetPar2 = sal_True;
1452     sal_Bool bSetPar1 = sal_True;
1453     String sPar1( rPar1 );
1454     String sPar2( rPar2 );
1455 
1456     // Order to Format
1457     switch( nTypeId )
1458     {
1459         case TYP_DDEFLD:
1460         {
1461             //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
1462             //              Namen haben! Wird hier noch nicht beachtet.
1463             sal_uInt16 nTmpPos = sPar2.SearchAndReplace( ' ', sfx2::cTokenSeperator );
1464             sPar2.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos );
1465             break;
1466         }
1467 
1468         case TYP_CHAPTERFLD:
1469         {
1470             sal_uInt16 nByte = (sal_uInt16)rPar2.ToInt32();
1471             nByte = Max(sal_uInt16(1), nByte);
1472             nByte = Min(nByte, sal_uInt16(MAXLEVEL));
1473             nByte -= 1;
1474             ((SwChapterField*)pTmpFld)->SetLevel((sal_uInt8)nByte);
1475             bSetPar2 = sal_False;
1476             break;
1477         }
1478 
1479         case TYP_SCRIPTFLD:
1480             ((SwScriptField*)pTmpFld)->SetCodeURL((sal_Bool)nFormat);
1481             break;
1482 
1483         case TYP_NEXTPAGEFLD:
1484             if( SVX_NUM_CHAR_SPECIAL == nFormat )
1485             {
1486                 ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 );
1487                 sPar2 = '1';
1488             }
1489             else
1490             {
1491                 if( nFormat + 2 == SVX_NUM_PAGEDESC )
1492                     nFormat = SVX_NUM_PAGEDESC;
1493                 short nOff = (short)sPar2.ToInt32();
1494                 nOff += 1;
1495                 sPar2 = String::CreateFromInt32(nOff);
1496             }
1497             break;
1498 
1499         case TYP_PREVPAGEFLD:
1500             if( SVX_NUM_CHAR_SPECIAL == nFormat )
1501             {
1502                 ((SwPageNumberField*)pCurFld)->SetUserString( sPar2 );
1503                 sPar2 = String::CreateFromAscii(
1504                     RTL_CONSTASCII_STRINGPARAM("-1"));
1505             }
1506             else
1507             {
1508                 if( nFormat + 2 == SVX_NUM_PAGEDESC )
1509                     nFormat = SVX_NUM_PAGEDESC;
1510                 short nOff = (short)sPar2.ToInt32();
1511                 nOff -= 1;
1512                 sPar2 = String::CreateFromInt32(nOff);
1513             }
1514             break;
1515 
1516         case TYP_PAGENUMBERFLD:
1517         case TYP_GETREFPAGEFLD:
1518             if( nFormat + 2 == SVX_NUM_PAGEDESC )
1519                 nFormat = SVX_NUM_PAGEDESC;
1520             break;
1521 
1522         case TYP_GETREFFLD:
1523             {
1524                 bSetPar2 = sal_False;
1525                 ((SwGetRefField*)pTmpFld)->SetSubType( (sal_uInt16)rPar2.ToInt32() );
1526                 sal_uInt16 nPos = rPar2.Search( '|' );
1527                 if( STRING_NOTFOUND != nPos )
1528                     ((SwGetRefField*)pTmpFld)->SetSeqNo( (sal_uInt16)rPar2.Copy( nPos + 1 ).ToInt32());
1529             }
1530             break;
1531         case TYP_DROPDOWN:
1532         {
1533             xub_StrLen nTokenCount = sPar2.Len() ? sPar2.GetTokenCount(DB_DELIM) : 0;
1534             Sequence<OUString> aEntries(nTokenCount);
1535             OUString* pArray = aEntries.getArray();
1536             for(xub_StrLen nToken = 0; nToken < nTokenCount; nToken++)
1537                 pArray[nToken] = sPar2.GetToken(nToken, DB_DELIM);
1538             ((SwDropDownField*)pTmpFld)->SetItems(aEntries);
1539             ((SwDropDownField*)pTmpFld)->SetName(sPar1);
1540             bSetPar1 = bSetPar2 = sal_False;
1541         }
1542         break;
1543         case TYP_AUTHORITY :
1544         {
1545             //#i99069# changes to a bibliography field should change the field type
1546             SwAuthorityField* pAuthorityField = static_cast<SwAuthorityField*>(pTmpFld);
1547             SwAuthorityFieldType* pAuthorityType = static_cast<SwAuthorityFieldType*>(pType);
1548             SwAuthEntry aTempEntry;
1549             for( sal_uInt16 i = 0; i < AUTH_FIELD_END; ++i )
1550                 aTempEntry.SetAuthorField( (ToxAuthorityField)i,
1551                                 rPar1.GetToken( i, TOX_STYLE_DELIMITER ));
1552             if( pAuthorityType->ChangeEntryContent( &aTempEntry ) )
1553             {
1554                 pType->UpdateFlds();
1555                 pSh->SetModified();
1556             }
1557 
1558             if( aTempEntry.GetAuthorField( AUTH_FIELD_IDENTIFIER ) ==
1559                 pAuthorityField->GetFieldText( AUTH_FIELD_IDENTIFIER ) )
1560                 bSetPar1 = sal_False; //otherwise it's a new or changed entry, the field needs to be updated
1561             bSetPar2 = sal_False;
1562         }
1563         break;
1564     }
1565 
1566     // Format setzen
1567     // Format wegen NumberFormatter vor SetPar2 einstellen!
1568     pTmpFld->ChangeFormat(nFormat);
1569 
1570     if(bSetPar1)
1571         pTmpFld->SetPar1( sPar1 );
1572     if( bSetPar2 )
1573         pTmpFld->SetPar2( sPar2 );
1574 
1575     // Update anschmeissen
1576     if(nTypeId == TYP_DDEFLD ||
1577        nTypeId == TYP_USERFLD ||
1578        nTypeId == TYP_USRINPFLD)
1579     {
1580         pType->UpdateFlds();
1581         pSh->SetModified();
1582     }
1583     else {
1584         // mb: #32157
1585         pSh->SwEditShell::UpdateFlds(*pTmpFld);
1586         GetCurFld();
1587     }
1588 
1589     if (bDelete)
1590         delete pTmpFld;
1591 
1592     pSh->EndAllAction();
1593 }
1594 
1595 /*--------------------------------------------------------------------
1596     Beschreibung: ExpressionFields explizit evaluieren
1597  --------------------------------------------------------------------*/
1598 void SwFldMgr::EvalExpFlds(SwWrtShell* pSh)
1599 {
1600     if (pSh == NULL)
1601         pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
1602 
1603     if(pSh)
1604     {
1605         pSh->StartAllAction();
1606         pSh->UpdateExpFlds(sal_True);
1607         pSh->EndAllAction();
1608     }
1609 }
1610 sal_uInt16 SwFldMgr::GetCurrLanguage() const
1611 {
1612     SwWrtShell* pSh = pWrtShell ? pWrtShell : ::lcl_GetShell();
1613     if( pSh )
1614         return pSh->GetCurLang();
1615     return SvxLocaleToLanguage( SvtSysLocale().GetLocaleData().getLocale() );
1616 }
1617 
1618 void SwFieldType::_GetFldName()
1619 {
1620     // mba: this is an awful mess; a fix is available, but too much for 3.4 -> applay plaster
1621     static const sal_uInt16 coFldCnt = 43;
1622 
1623     static sal_uInt16 __READONLY_DATA coFldNms[ coFldCnt ] = {
1624         FLD_DATE_STD,
1625         FLD_TIME_STD,
1626         STR_FILENAMEFLD,
1627         STR_DBNAMEFLD,
1628         STR_CHAPTERFLD,
1629         STR_PAGENUMBERFLD,
1630         STR_DOCSTATFLD,
1631         STR_AUTHORFLD,
1632         STR_SETFLD,
1633         STR_GETFLD,
1634         STR_FORMELFLD,
1635         STR_HIDDENTXTFLD,
1636         STR_SETREFFLD,
1637         STR_GETREFFLD,
1638         STR_DDEFLD,
1639         STR_MACROFLD,
1640         STR_INPUTFLD,
1641         STR_HIDDENPARAFLD,
1642         STR_DOCINFOFLD,
1643         STR_DBFLD,
1644         STR_USERFLD,
1645         STR_POSTITFLD,
1646         STR_TEMPLNAMEFLD,
1647         STR_SEQFLD,
1648         STR_DBNEXTSETFLD,
1649         STR_DBNUMSETFLD,
1650         STR_DBSETNUMBERFLD,
1651         STR_CONDTXTFLD,
1652         STR_NEXTPAGEFLD,
1653         STR_PREVPAGEFLD,
1654         STR_EXTUSERFLD,
1655         FLD_DATE_FIX,
1656         FLD_TIME_FIX,
1657         STR_SETINPUTFLD,
1658         STR_USRINPUTFLD,
1659         STR_SETREFPAGEFLD,
1660         STR_GETREFPAGEFLD,
1661         STR_INTERNETFLD,
1662         STR_JUMPEDITFLD,
1663         STR_SCRIPTFLD,
1664         STR_AUTHORITY,
1665         STR_COMBINED_CHARS,
1666         STR_DROPDOWN
1667     };
1668 
1669     // Infos fuer Felder einfuegen
1670     SwFieldType::pFldNames = new SvStringsDtor( (sal_uInt8)coFldCnt, 2 );
1671     for( sal_uInt16 nIdx = 0; nIdx < coFldCnt; ++nIdx )
1672     {
1673         String* pTmp = new SW_RESSTR( coFldNms[ nIdx ] );
1674         pTmp->Assign( MnemonicGenerator::EraseAllMnemonicChars( *pTmp ) );
1675         SwFieldType::pFldNames->Insert(pTmp, nIdx );
1676     }
1677 }
1678 
1679 /*--------------------------------------------------------------------
1680     Beschreibung:
1681  --------------------------------------------------------------------*/
1682 
1683 sal_Bool SwFldMgr::ChooseMacro(const String&)
1684 {
1685     sal_Bool bRet = sal_False;
1686 
1687     // choose script dialog
1688     ::rtl::OUString aScriptURL = SfxApplication::ChooseScript();
1689 
1690     // the script selector dialog returns a valid script URL
1691     if ( aScriptURL.getLength() != 0 )
1692     {
1693         SetMacroPath( aScriptURL );
1694         bRet = sal_True;
1695     }
1696 
1697     return bRet;
1698 }
1699 
1700 void SwFldMgr::SetMacroPath(const String& rPath)
1701 {
1702     sMacroPath = rPath;
1703     sMacroName = rPath;
1704 
1705     // try to set sMacroName member variable by parsing the macro path
1706     // using the new URI parsing services
1707 
1708     Reference< XMultiServiceFactory > xSMgr =
1709         ::comphelper::getProcessServiceFactory();
1710 
1711     Reference< uri::XUriReferenceFactory >
1712         xFactory( xSMgr->createInstance(
1713             ::rtl::OUString::createFromAscii(
1714                 "com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY );
1715 
1716     if ( xFactory.is() )
1717     {
1718         Reference< uri::XVndSunStarScriptUrl >
1719             xUrl( xFactory->parse( sMacroPath ), UNO_QUERY );
1720 
1721         if ( xUrl.is() )
1722         {
1723             sMacroName = xUrl->getName();
1724         }
1725     }
1726 }
1727 
1728 /*--------------------------------------------------------------------
1729     Beschreibung:
1730  --------------------------------------------------------------------*/
1731 
1732 sal_uLong SwFldMgr::GetDefaultFormat(sal_uInt16 nTypeId, sal_Bool bIsText, SvNumberFormatter* pFormatter, double* pVal)
1733 {
1734     double fValue;
1735     short  nDefFormat;
1736 
1737     switch (nTypeId)
1738     {
1739         case TYP_TIMEFLD:
1740         case TYP_DATEFLD:
1741         {
1742             Date aDate;
1743             Date* pNullDate = pFormatter->GetNullDate();
1744 
1745             fValue = aDate - *pNullDate;
1746 
1747             Time aTime;
1748 
1749             sal_uLong nNumFmtTime = (sal_uLong)aTime.GetSec() + (sal_uLong)aTime.GetMin() * 60L +
1750                           (sal_uLong)aTime.GetHour() * 3600L;
1751 
1752             fValue += (double)nNumFmtTime / 86400.0;
1753 
1754             nDefFormat = (nTypeId == TYP_DATEFLD) ? NUMBERFORMAT_DATE : NUMBERFORMAT_TIME;
1755         }
1756         break;
1757 
1758         default:
1759             if (bIsText)
1760             {
1761                 fValue = 0.0;
1762                 nDefFormat = NUMBERFORMAT_TEXT;
1763             }
1764             else
1765             {
1766                 fValue = 0.0;
1767                 nDefFormat = NUMBERFORMAT_ALL;
1768             }
1769             break;
1770     }
1771 
1772     if (pVal)
1773         *pVal = fValue;
1774 
1775     return pFormatter->GetStandardFormat(nDefFormat, GetCurrLanguage());
1776 }
1777 
1778 /* -----------------------------01.03.01 16:46--------------------------------
1779 
1780  ---------------------------------------------------------------------------*/
1781 Reference<XNumberingTypeInfo> SwFldMgr::GetNumberingInfo() const
1782 {
1783     if(!xNumberingInfo.is())
1784     {
1785         Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
1786         Reference < XInterface > xI = xMSF->createInstance(
1787             ::rtl::OUString::createFromAscii(
1788                             "com.sun.star.text.DefaultNumberingProvider" ));
1789         Reference<XDefaultNumberingProvider> xDefNum(xI, UNO_QUERY);
1790         DBG_ASSERT(xDefNum.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\"");
1791         ((SwFldMgr*)this)->xNumberingInfo = Reference<XNumberingTypeInfo>(xDefNum, UNO_QUERY);
1792     }
1793     return xNumberingInfo;
1794 }
1795