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