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