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