xref: /trunk/main/sw/source/ui/fldui/flddok.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 #ifdef SW_DLLIMPLEMENTATION
31 #undef SW_DLLIMPLEMENTATION
32 #endif
33 
34 
35 #include <vcl/svapp.hxx>
36 #include <flddat.hxx>
37 #include <docufld.hxx>
38 #ifndef _GLOBALS_HRC
39 #include <globals.hrc>
40 #endif
41 #include <chpfld.hxx>
42 #ifndef _FLDTDLG_HRC
43 #include <fldtdlg.hrc>
44 #endif
45 #ifndef _FLDUI_HRC
46 #include <fldui.hrc>
47 #endif
48 #ifndef _FLDDOK_HXX
49 #include <flddok.hxx>
50 #endif
51 #include <swmodule.hxx>
52 #ifndef _VIEW_HXX
53 #include <view.hxx>
54 #endif
55 #include <wrtsh.hxx>
56 #include <svl/zformat.hxx>
57 
58 #include <index.hrc>
59 
60 #define USER_DATA_VERSION_1 "1"
61 #define USER_DATA_VERSION USER_DATA_VERSION_1
62 
63 /*--------------------------------------------------------------------
64     Beschreibung:
65  --------------------------------------------------------------------*/
66 
67 SwFldDokPage::SwFldDokPage(Window* pWindow, const SfxItemSet& rCoreSet ) :
68     SwFldPage( pWindow, SW_RES( TP_FLD_DOK ), rCoreSet ),
69 
70     aTypeFT         (this, SW_RES(FT_DOKTYPE)),
71     aTypeLB         (this, SW_RES(LB_DOKTYPE)),
72     aSelectionFT    (this, SW_RES(FT_DOKSELECTION)),
73     aSelectionLB    (this, SW_RES(LB_DOKSELECTION)),
74     aValueFT        (this, SW_RES(FT_DOKVALUE)),
75     aValueED        (this, SW_RES(ED_DOKVALUE)),
76     aLevelED        (this, SW_RES(ED_DOKLEVEL)),
77     aDateOffsetED   (this, SW_RES(ED_DOKDATEOFF)),
78 
79     aFormatFT       (this, SW_RES(FT_DOKFORMAT)),
80     aFormatLB       (this, SW_RES(LB_DOKFORMAT)),
81     aNumFormatLB    (this, SW_RES(LB_DOKNUMFORMAT)),
82     aFixedCB        (this, SW_RES(CB_DOKFIXEDCONTENT)),
83 
84     sDateOffset     (SW_RES(STR_DOKDATEOFF)),
85     sTimeOffset     (SW_RES(STR_DOKTIMEOFF)),
86     aRootOpened     (SW_RES(BMP_DOKROOT_OPENED)),
87     aRootClosed     (SW_RES(BMP_DOKROOT_CLOSED))
88 {
89     FreeResource();
90 
91     aSelectionLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
92     aFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
93     aNumFormatLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, NumFormatHdl));
94 
95     aLevelED.SetMax(MAXLEVEL);
96     aDateOffsetED.SetMin(LONG_MIN);
97     aDateOffsetED.SetMax(LONG_MAX);
98     //enable 'active' language selection
99     aNumFormatLB.SetShowLanguageControl(sal_True);
100 }
101 
102 /*--------------------------------------------------------------------
103     Beschreibung:
104  --------------------------------------------------------------------*/
105 
106 __EXPORT SwFldDokPage::~SwFldDokPage()
107 {
108 }
109 
110 /*--------------------------------------------------------------------
111     Beschreibung:
112  --------------------------------------------------------------------*/
113 
114 void __EXPORT SwFldDokPage::Reset(const SfxItemSet& )
115 {
116     SavePos(&aTypeLB);
117     Init(); // Allgemeine initialisierung
118 
119     // TypeListBox initialisieren
120     const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
121 
122     aTypeLB.SetUpdateMode(sal_False);
123     aTypeLB.Clear();
124 
125     sal_uInt16 nPos, nTypeId;
126     sal_Bool bPage = sal_False;
127 
128     if (!IsFldEdit())
129     {
130         // Typ-Listbox fuellen
131         for(short i = rRg.nStart; i < rRg.nEnd; ++i)
132         {
133             nTypeId = GetFldMgr().GetTypeId(i);
134 
135             switch (nTypeId)
136             {
137                 case TYP_PREVPAGEFLD:
138                 case TYP_NEXTPAGEFLD:
139                 case TYP_PAGENUMBERFLD:
140                     if (!bPage)
141                     {
142                         nPos = aTypeLB.InsertEntry(SW_RESSTR(FMT_REF_PAGE));
143                         aTypeLB.SetEntryData(nPos, (void*)USHRT_MAX);
144                         bPage = sal_True;
145                     }
146                     break;
147 
148                 default:
149                     nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
150                     aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
151                     break;
152             }
153         }
154     }
155     else
156     {
157         const SwField* pCurField = GetCurField();
158         nTypeId = pCurField->GetTypeId();
159         if (nTypeId == TYP_FIXDATEFLD)
160             nTypeId = TYP_DATEFLD;
161         if (nTypeId == TYP_FIXTIMEFLD)
162             nTypeId = TYP_TIMEFLD;
163         nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
164         aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
165         aNumFormatLB.SetAutomaticLanguage(pCurField->IsAutomaticLanguage());
166         SwWrtShell *pSh = GetWrtShell();
167         if(!pSh)
168             pSh = ::GetActiveWrtShell();
169         if(pSh)
170         {
171             const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat());
172             if(pFormat)
173                 aNumFormatLB.SetLanguage(pFormat->GetLanguage());
174         }
175     }
176 
177     // alte Pos selektieren
178     RestorePos(&aTypeLB);
179 
180     aTypeLB.SetUpdateMode(sal_True);
181     aTypeLB.SetDoubleClickHdl(LINK(this, SwFldDokPage, InsertHdl));
182     aTypeLB.SetSelectHdl(LINK(this, SwFldDokPage, TypeHdl));
183     aFormatLB.SetSelectHdl(LINK(this, SwFldDokPage, FormatHdl));
184 
185     if( !IsRefresh() )
186     {
187         String sUserData = GetUserData();
188         if( sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1 ))
189         {
190             String sVal = sUserData.GetToken(1, ';');
191             sal_uInt16 nVal = static_cast< sal_uInt16 >(sVal.ToInt32());
192             if(nVal != USHRT_MAX)
193             {
194                 for(sal_uInt16 i = 0; i < aTypeLB.GetEntryCount(); i++)
195                     if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
196                     {
197                         aTypeLB.SelectEntryPos(i);
198                         break;
199                     }
200             }
201         }
202     }
203     TypeHdl(0);
204 
205     if (IsFldEdit())
206     {
207         nOldSel = aSelectionLB.GetSelectEntryPos();
208         nOldFormat = GetCurField()->GetFormat();
209         aFixedCB.SaveValue();
210         aValueED.SaveValue();
211         aLevelED.SaveValue();
212         aDateOffsetED.SaveValue();
213     }
214 }
215 
216 /*--------------------------------------------------------------------
217     Beschreibung:
218  --------------------------------------------------------------------*/
219 
220 IMPL_LINK( SwFldDokPage, TypeHdl, ListBox *, EMPTYARG )
221 {
222     // Alte ListBoxPos sichern
223     const sal_uInt16 nOld = GetTypeSel();
224 
225     // Aktuelle ListBoxPos
226     SetTypeSel(aTypeLB.GetSelectEntryPos());
227 
228     if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
229     {
230         SetTypeSel(0);
231         aTypeLB.SelectEntryPos(0);
232     }
233 
234     sal_uInt16 nCount;
235 
236     if (nOld != GetTypeSel())
237     {
238         sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
239 
240         // Auswahl-Listbox fuellen
241         aSelectionLB.Clear();
242 
243         if (nTypeId != USHRT_MAX)
244         {
245             SvStringsDtor aLst;
246             GetFldMgr().GetSubTypes(nTypeId, aLst);
247 
248             if (nTypeId != TYP_AUTHORFLD)
249                 nCount = aLst.Count();
250             else
251                 nCount = GetFldMgr().GetFormatCount(nTypeId, sal_False, IsFldDlgHtmlMode());
252 
253             sal_uInt16 nPos;
254 
255             for (sal_uInt16 i = 0; i < nCount; ++i)
256             {
257                 if (!IsFldEdit())
258                 {
259                     if (nTypeId != TYP_AUTHORFLD)
260                         nPos = aSelectionLB.InsertEntry(*aLst[i]);
261                     else
262                         nPos = aSelectionLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
263 
264                     aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
265                 }
266                 else
267                 {
268                     sal_Bool bInsert = sal_False;
269 
270                     switch (nTypeId)
271                     {
272                         case TYP_DATEFLD:
273                         case TYP_TIMEFLD:
274                             nPos = aSelectionLB.InsertEntry(*aLst[i]);
275                             aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
276                             if (((SwDateTimeField*)GetCurField())->IsFixed() && !i)
277                                 aSelectionLB.SelectEntryPos(nPos);
278                             if (!((SwDateTimeField*)GetCurField())->IsFixed() && i)
279                                 aSelectionLB.SelectEntryPos(nPos);
280                             break;
281 
282                         case TYP_EXTUSERFLD:
283                         case TYP_DOCSTATFLD:
284                             nPos = aSelectionLB.InsertEntry(*aLst[i]);
285                             aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
286                             if (GetCurField()->GetSubType() == i)
287                                 aSelectionLB.SelectEntryPos(nPos);
288                             break;
289 
290                         case TYP_AUTHORFLD:
291                         {
292                             String sFmt(GetFldMgr().GetFormatStr(nTypeId, i));
293                             nPos = aSelectionLB.InsertEntry(sFmt);
294                             aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
295                             aSelectionLB.SelectEntry(GetFldMgr().GetFormatStr(nTypeId, GetCurField()->GetFormat()));
296                             break;
297                         }
298 
299                         default:
300                             if (*aLst[i] == GetCurField()->GetPar1())
301                                 bInsert = sal_True;
302                             break;
303                     }
304                     if (bInsert)
305                     {
306                         nPos = aSelectionLB.InsertEntry(*aLst[i]);
307                         aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
308                         break;
309                     }
310                 }
311             }
312             aSelectionLB.SetSelectHdl(Link());
313         }
314         else
315         {
316             AddSubType(TYP_PAGENUMBERFLD);
317             AddSubType(TYP_PREVPAGEFLD);
318             AddSubType(TYP_NEXTPAGEFLD);
319             nTypeId = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(0);
320             nCount = 3;
321             aSelectionLB.SetSelectHdl(LINK(this, SwFldDokPage, SubTypeHdl));
322         }
323 
324         sal_Bool bEnable = nCount != 0;
325 
326         if (bEnable && !aSelectionLB.GetSelectEntryCount())
327             aSelectionLB.SelectEntryPos(0);
328 
329         aSelectionLB.Enable( bEnable );
330         aSelectionFT.Enable( bEnable );
331 
332         // Format-Listbox fuellen
333         sal_uInt16 nSize = FillFormatLB(nTypeId);
334 
335         sal_Bool bValue = sal_False, bLevel = sal_False, bNumFmt = sal_False, bOffset = sal_False;
336         sal_Bool bFormat = nSize != 0;
337         sal_Bool bOneArea = sal_False;
338         sal_Bool bFixed = sal_False;
339         sal_uInt16 nFmtType = 0;
340 
341         switch (nTypeId)
342         {
343             case TYP_DATEFLD:
344                 bFormat = bNumFmt = bOneArea = bOffset = sal_True;
345 
346                 nFmtType = NUMBERFORMAT_DATE;
347                 aValueFT.SetText(sDateOffset);
348                 aDateOffsetED.SetFirst(-31);    // Ein Monat
349                 aDateOffsetED.SetLast(31);
350 
351                 if (IsFldEdit())
352                     aDateOffsetED.SetValue( ((SwDateTimeField*)GetCurField())->GetOffset() / 24 / 60);
353                 break;
354 
355             case TYP_TIMEFLD:
356                 bFormat = bNumFmt = bOneArea = bOffset = sal_True;
357 
358                 nFmtType = NUMBERFORMAT_TIME;
359                 aValueFT.SetText(sTimeOffset);
360                 aDateOffsetED.SetFirst(-1440);  // Ein Tag
361                 aDateOffsetED.SetLast(1440);
362 
363                 if (IsFldEdit())
364                     aDateOffsetED.SetValue( ((SwDateTimeField*)GetCurField())->GetOffset() );
365                 break;
366 
367             case TYP_PREVPAGEFLD:
368             case TYP_NEXTPAGEFLD:
369                 if (IsFldEdit())
370                 {
371                     sal_uInt16 nTmp = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(
372                                             aFormatLB.GetSelectEntryPos() );
373                     String sOldTxt(aValueFT.GetText());
374 
375                     if(SVX_NUM_CHAR_SPECIAL != nTmp)
376                     {
377                         sal_Int32 nOff = GetCurField()->GetPar2().ToInt32();
378                         if( TYP_NEXTPAGEFLD == nTypeId && 1 != nOff )
379                             aValueED.SetText(
380                                 String::CreateFromInt32(nOff - 1) );
381                         else if( TYP_PREVPAGEFLD == nTypeId && -1 != nOff )
382                             aValueED.SetText(
383                                 String::CreateFromInt32(nOff + 1) );
384                         else
385                             aValueED.SetText(aEmptyStr);
386                     }
387                     else
388                         aValueED.SetText(((SwPageNumberField*)GetCurField())->GetUserString());
389                 }
390                 bValue = sal_True;
391                 break;
392 
393             case TYP_CHAPTERFLD:
394                 aValueFT.SetText(SW_RESSTR(STR_LEVEL));
395                 if (IsFldEdit())
396                     aLevelED.SetText(String::CreateFromInt32(((SwChapterField*)GetCurField())->GetLevel() + 1));
397                 bLevel = sal_True;
398                 break;
399 
400             case TYP_PAGENUMBERFLD:
401                 aValueFT.SetText( SW_RESSTR( STR_OFFSET ));
402                 if (IsFldEdit())
403                     aValueED.SetText(GetCurField()->GetPar2());
404                 bValue = sal_True;
405                 break;
406 
407             case TYP_EXTUSERFLD:
408             case TYP_AUTHORFLD:
409             case TYP_FILENAMEFLD:
410                 bFixed = sal_True;
411                 break;
412 
413             default:
414                 break;
415         }
416 
417         if (bNumFmt)
418         {
419             if (IsFldEdit())
420             {
421                 aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
422 
423                 if (aNumFormatLB.GetFormatType() == (NUMBERFORMAT_DATE|NUMBERFORMAT_TIME))
424                 {
425                     // Format-Typ immer einstellen, da sonst bei kombinierten Datum/Zeitformaten
426                     // beide Formate gleichzeitig angezeigt werden wuerden
427                     aNumFormatLB.SetFormatType(0);
428                     aNumFormatLB.SetFormatType(nFmtType);
429                     // Nochmal richtiges Format einstellen
430                     aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
431                 }
432             }
433             else
434                 aNumFormatLB.SetFormatType(nFmtType);
435 
436             aNumFormatLB.SetOneArea(bOneArea);
437         }
438 
439         aFormatLB.Show(!bNumFmt);
440         aNumFormatLB.Show(bNumFmt);
441 
442         Size aSz(aFormatLB.GetSizePixel());
443 
444         if (bValue | bLevel | bOffset)
445             aSz.Height() = aFormatLB.LogicToPixel(Size(1, 137), MAP_APPFONT).Height();
446         else
447             aSz.Height() = aFormatLB.LogicToPixel(Size(1, 152), MAP_APPFONT).Height();
448 
449         aValueFT.Show(bValue | bLevel | bOffset);
450         aValueED.Show(bValue);
451         aLevelED.Show(bLevel);
452         aDateOffsetED.Show(bOffset);
453         aFixedCB.Show(!bValue && !bLevel && !bOffset);
454 
455         aFormatLB.SetSizePixel(aSz);
456         aNumFormatLB.SetSizePixel(aSz);
457 
458         aFormatLB.Enable(bFormat);
459         aFormatFT.Enable(bFormat);
460         aFixedCB.Enable(bFixed);
461 
462         if (IsFldEdit())
463             aFixedCB.Check( static_cast< sal_Bool >(((GetCurField()->GetFormat() & AF_FIXED) != 0) & bFixed));
464 
465         if (aNumFormatLB.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND)
466             aNumFormatLB.SelectEntryPos(0);
467         aValueFT.Enable(bValue | bLevel | bOffset);
468         aValueED.Enable(bValue);
469     }
470 
471     return 0;
472 }
473 
474 /*--------------------------------------------------------------------
475     Beschreibung:
476  --------------------------------------------------------------------*/
477 
478 void SwFldDokPage::AddSubType(sal_uInt16 nTypeId)
479 {
480     sal_uInt16 nPos = aSelectionLB.InsertEntry(SwFieldType::GetTypeStr(nTypeId));
481     aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
482 }
483 
484 /*--------------------------------------------------------------------
485     Beschreibung:
486  --------------------------------------------------------------------*/
487 
488 IMPL_LINK( SwFldDokPage, SubTypeHdl, ListBox *, EMPTYARG )
489 {
490     sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
491     if(nPos == LISTBOX_ENTRY_NOTFOUND)
492         nPos = 0;
493 
494     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos);
495     FillFormatLB(nTypeId);
496 
497     sal_uInt16 nTextRes = 0;
498     switch (nTypeId)
499     {
500     case TYP_CHAPTERFLD:
501         nTextRes = STR_LEVEL;
502         break;
503 
504     case TYP_PREVPAGEFLD:
505     case TYP_NEXTPAGEFLD:
506         nTextRes = SVX_NUM_CHAR_SPECIAL == (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(
507                                         aFormatLB.GetSelectEntryPos() )
508                         ? STR_VALUE : STR_OFFSET;
509         break;
510 
511     case TYP_PAGENUMBERFLD:
512         nTextRes = STR_OFFSET;
513         break;
514     }
515 
516     if( nTextRes )
517         aValueFT.SetText( SW_RESSTR( nTextRes ));
518 
519     return 0;
520 }
521 
522 /*--------------------------------------------------------------------
523     Beschreibung:
524  --------------------------------------------------------------------*/
525 
526 sal_uInt16 SwFldDokPage::FillFormatLB(sal_uInt16 nTypeId)
527 {
528     // Format-Listbox fuellen
529     aFormatLB.Clear();
530 
531     if (nTypeId == TYP_AUTHORFLD)
532         return aFormatLB.GetEntryCount();
533 
534     sal_uInt16 nSize = GetFldMgr().GetFormatCount(nTypeId, sal_False, IsFldDlgHtmlMode());
535 
536     for( sal_uInt16 i = 0; i < nSize; ++i )
537     {
538         sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
539         sal_uInt16 nFmtId = GetFldMgr().GetFormatId( nTypeId, i );
540         aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>( nFmtId ));
541         if (IsFldEdit() && nFmtId == (GetCurField()->GetFormat() & ~AF_FIXED))
542             aFormatLB.SelectEntryPos( nPos );
543     }
544 
545     if( nSize && !aFormatLB.GetSelectEntryCount() )
546     {
547         aFormatLB.SelectEntry( SW_RESSTR(FMT_NUM_PAGEDESC) );
548         if( !aFormatLB.GetSelectEntryCount() )
549         {
550             aFormatLB.SelectEntry( SW_RESSTR(FMT_NUM_ARABIC) );
551             if( !aFormatLB.GetSelectEntryCount() )
552                 aFormatLB.SelectEntryPos( 0 );
553         }
554     }
555 
556     FormatHdl();
557 
558     return nSize;
559 }
560 
561 /*--------------------------------------------------------------------
562     Beschreibung:
563  --------------------------------------------------------------------*/
564 
565 IMPL_LINK( SwFldDokPage, FormatHdl, ListBox *, EMPTYARG )
566 {
567     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
568 
569     if (nTypeId == USHRT_MAX)
570     {
571         sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
572         if(nPos == LISTBOX_ENTRY_NOTFOUND)
573             nPos = 0;
574 
575         nTypeId = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos);
576     }
577 
578     if (nTypeId == TYP_NEXTPAGEFLD || nTypeId == TYP_PREVPAGEFLD)
579     {
580         // Prev/Next - PageNumFelder Sonderbehandlung:
581         sal_uInt16 nTmp = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(
582                                         aFormatLB.GetSelectEntryPos() );
583         String sOldTxt( aValueFT.GetText() );
584         String sNewTxt( SW_RES( SVX_NUM_CHAR_SPECIAL == nTmp  ? STR_VALUE
585                                                          : STR_OFFSET ));
586 
587         if( sOldTxt != sNewTxt )
588             aValueFT.SetText( sNewTxt );
589 
590         if (sOldTxt != aValueFT.GetText())
591             aValueED.SetText( aEmptyStr );
592     }
593 
594     return 0;
595 }
596 
597 /*--------------------------------------------------------------------
598     Beschreibung:
599  --------------------------------------------------------------------*/
600 
601 sal_Bool __EXPORT SwFldDokPage::FillItemSet(SfxItemSet& )
602 {
603     sal_Bool bPage = sal_False;
604     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
605 
606     if (nTypeId == USHRT_MAX)
607     {
608         sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
609         if(nPos == LISTBOX_ENTRY_NOTFOUND)
610             nPos = 0;
611         nTypeId = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos);
612         bPage = sal_True;
613     }
614 
615     String aVal(aValueED.GetText());
616     sal_uLong nFormat = 0;
617     sal_uInt16 nSubType = 0;
618 
619     if (aFormatLB.IsEnabled())
620     {
621         sal_uInt16 nPos = aFormatLB.GetSelectEntryPos();
622         if(nPos != LISTBOX_ENTRY_NOTFOUND)
623             nFormat = (sal_uInt16)(sal_uLong)aFormatLB.GetEntryData(nPos);
624     }
625 
626     if (aSelectionLB.IsEnabled())
627     {
628         sal_uInt16 nPos = aSelectionLB.GetSelectEntryPos();
629         if(nPos != LISTBOX_ENTRY_NOTFOUND)
630             nSubType = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nPos);
631     }
632 
633     switch (nTypeId)
634     {
635         case TYP_AUTHORFLD:
636             nFormat = nSubType;
637             nSubType = 0;
638             // kein break!
639         case TYP_EXTUSERFLD:
640             nFormat |= aFixedCB.IsChecked() ? AF_FIXED : 0;
641             break;
642 
643         case TYP_FILENAMEFLD:
644             nFormat |= aFixedCB.IsChecked() ? FF_FIXED : 0;
645             break;
646 
647         case TYP_DATEFLD:
648         case TYP_TIMEFLD:
649         {
650             nFormat = aNumFormatLB.GetFormat();
651             long nVal = static_cast< long >(aDateOffsetED.GetValue());
652             if (nTypeId == TYP_DATEFLD)
653                 aVal = String::CreateFromInt32(nVal * 60 * 24);
654             else
655                 aVal = String::CreateFromInt32(nVal);
656             break;
657         }
658 
659         case TYP_NEXTPAGEFLD:
660         case TYP_PREVPAGEFLD:
661         case TYP_PAGENUMBERFLD:
662         case TYP_GETREFPAGEFLD:
663         {
664             if( SVX_NUM_CHAR_SPECIAL != nFormat &&
665                 (TYP_PREVPAGEFLD == nTypeId || TYP_NEXTPAGEFLD == nTypeId))
666             {
667                 sal_Int32 nVal = aValueED.GetText().ToInt32();
668                 aVal = String::CreateFromInt32(nVal);
669             }
670             break;
671         }
672 
673         case TYP_CHAPTERFLD:
674             aVal = aLevelED.GetText();
675             break;
676 
677         default:
678             break;
679     }
680 
681     if (!IsFldEdit() ||
682         nOldSel != aSelectionLB.GetSelectEntryPos() ||
683         nOldFormat != nFormat ||
684         aFixedCB.GetState() != aFixedCB.GetSavedValue() ||
685         aValueED.GetText() != aValueED.GetSavedValue() ||
686         aLevelED.GetText() != aLevelED.GetSavedValue() ||
687         aDateOffsetED.GetText() != aDateOffsetED.GetSavedValue())
688     {
689         InsertFld( nTypeId, nSubType, aEmptyStr, aVal, nFormat, ' ', aNumFormatLB.IsAutomaticLanguage() );
690     }
691 
692     return sal_False;
693 }
694 
695 /*--------------------------------------------------------------------
696     Beschreibung:
697  --------------------------------------------------------------------*/
698 
699 SfxTabPage* __EXPORT SwFldDokPage::Create(  Window* pParent,
700                         const SfxItemSet& rAttrSet )
701 {
702     return ( new SwFldDokPage( pParent, rAttrSet ) );
703 }
704 
705 /*--------------------------------------------------------------------
706     Beschreibung:
707  --------------------------------------------------------------------*/
708 
709 sal_uInt16 SwFldDokPage::GetGroup()
710 {
711     return GRP_DOC;
712 }
713 
714 /* -----------------12.01.99 10:09-------------------
715  *
716  * --------------------------------------------------*/
717 void    SwFldDokPage::FillUserData()
718 {
719     String sData( String::CreateFromAscii(
720                         RTL_CONSTASCII_STRINGPARAM( USER_DATA_VERSION )));
721     sData += ';';
722     sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
723     if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
724         nTypeSel = USHRT_MAX;
725     else
726         nTypeSel = sal::static_int_cast< sal_uInt16 >(reinterpret_cast< sal_uIntPtr >(aTypeLB.GetEntryData( nTypeSel )));
727     sData += String::CreateFromInt32( nTypeSel );
728     SetUserData(sData);
729 }
730 
731 
732