xref: /AOO41X/main/sw/source/ui/fldui/fldvar.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29 
30 
31 #include <swtypes.hxx>
32 #include <sfx2/linkmgr.hxx>
33 #include <usrfld.hxx>
34 #include <docufld.hxx>
35 #include <expfld.hxx>
36 #include <ddefld.hxx>
37 #ifndef _VIEW_HXX
38 #include <view.hxx>
39 #endif
40 #include <wrtsh.hxx>
41 #include <doc.hxx>
42 #include <docary.hxx>
43 #include <swmodule.hxx>
44 #ifndef _FLDVAR_HXX
45 #include <fldvar.hxx>
46 #endif
47 #include <calc.hxx>
48 #include <svl/zformat.hxx>
49 #ifndef _GLOBALS_HRC
50 #include <globals.hrc>
51 #endif
52 #ifndef _FLDUI_HRC
53 #include <fldui.hrc>
54 #endif
55 #ifndef _FLDTDLG_HRC
56 #include <fldtdlg.hrc>
57 #endif
58 
59 #define USER_DATA_VERSION_1 "1"
60 #define USER_DATA_VERSION USER_DATA_VERSION_1
61 /*--------------------------------------------------------------------
62     Beschreibung:
63  --------------------------------------------------------------------*/
64 
65 SwFldVarPage::SwFldVarPage(Window* pParent, const SfxItemSet& rCoreSet ) :
66     SwFldPage       ( pParent, SW_RES( TP_FLD_VAR ), rCoreSet ),
67     aTypeFT         (this, SW_RES(FT_VARTYPE)),
68     aTypeLB         (this, SW_RES(LB_VARTYPE)),
69     aSelectionFT    (this, SW_RES(FT_VARSELECTION)),
70     aSelectionLB    (this, SW_RES(LB_VARSELECTION)),
71     aNameFT         (this, SW_RES(FT_VARNAME)),
72     aNameED         (this, SW_RES(ED_VARNAME)),
73     aValueFT        (this, SW_RES(FT_VARVALUE)),
74     aValueED        (this, SW_RES(ED_VARVALUE)),
75     aFormatFT       (this, SW_RES(FT_VARFORMAT)),
76     aNumFormatLB    (this, SW_RES(LB_VARNUMFORMAT)),
77     aFormatLB       (this, SW_RES(LB_VARFORMAT)),
78     aChapterHeaderFT(this, SW_RES(FT_VARCHAPTERHEADER)),
79     aChapterLevelFT (this, SW_RES(FT_VARCHAPTERLEVEL)),
80     aChapterLevelLB (this, SW_RES(LB_VARCHAPTERLEVEL)),
81     aInvisibleCB    (this, SW_RES(CB_VARINVISIBLE)),
82     aSeparatorFT    (this, SW_RES(FT_VARSEPARATOR)),
83     aSeparatorED    (this, SW_RES(ED_VARSEPARATOR)),
84     aNewDelTBX      (this, SW_RES(TBX_VARNEWDEL)),
85     bInit           (sal_True)
86 {
87     FreeResource();
88 
89     aNewDelTBX.SetSizePixel( aNewDelTBX.CalcWindowSizePixel() );
90 
91     long nDelta = ( aValueED.GetSizePixel().Height() -
92                     aNewDelTBX.GetSizePixel().Height() ) / 2;
93     Point aNewPnt = aNewDelTBX.GetPosPixel();
94     aNewPnt.Y() += nDelta;
95     aNewDelTBX.SetPosPixel( aNewPnt );
96 
97     sOldValueFT = aValueFT.GetText();
98     sOldNameFT = aNameFT.GetText();
99 
100     for (sal_uInt16 i = 1; i <= MAXLEVEL; i++)
101         aChapterLevelLB.InsertEntry(String::CreateFromInt32(i));
102 
103     aChapterLevelLB.SelectEntryPos(0);
104     //enable 'active' language selection
105     aNumFormatLB.SetShowLanguageControl(sal_True);
106 }
107 
108 /*--------------------------------------------------------------------
109     Beschreibung:
110  --------------------------------------------------------------------*/
111 
112 SwFldVarPage::~SwFldVarPage()
113 {
114 }
115 
116 /*--------------------------------------------------------------------
117     Beschreibung:
118  --------------------------------------------------------------------*/
119 
120 void SwFldVarPage::Reset(const SfxItemSet& )
121 {
122     SavePos(&aTypeLB);
123 
124     Init(); // Allgemeine initialisierung
125 
126     aTypeLB.SetUpdateMode(sal_False);
127     aTypeLB.Clear();
128 
129     sal_uInt16 nPos, nTypeId;
130 
131     if (!IsFldEdit())
132     {
133         // TypeListBox initialisieren
134         const SwFldGroupRgn& rRg = GetFldMgr().GetGroupRange(IsFldDlgHtmlMode(), GetGroup());
135 
136         for (short i = rRg.nStart; i < rRg.nEnd; ++i)
137         {
138             nTypeId = GetFldMgr().GetTypeId(i);
139             nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(i));
140             aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
141         }
142     }
143     else
144     {
145         SwField* pCurField = GetCurField();
146         nTypeId = pCurField->GetTypeId();
147         if (nTypeId == TYP_SETINPFLD)
148             nTypeId = TYP_INPUTFLD;
149         nPos = aTypeLB.InsertEntry(GetFldMgr().GetTypeStr(GetFldMgr().GetPos(nTypeId)));
150         aTypeLB.SetEntryData(nPos, reinterpret_cast<void*>(nTypeId));
151         aNumFormatLB.SetAutomaticLanguage(pCurField->IsAutomaticLanguage());
152         SwWrtShell *pSh = GetWrtShell();
153         if(!pSh)
154             pSh = ::GetActiveWrtShell();
155         if(pSh)
156         {
157             const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat());
158             if(pFormat)
159                 aNumFormatLB.SetLanguage(pFormat->GetLanguage());
160         }
161     }
162 
163     // alte Pos selektieren
164     RestorePos(&aTypeLB);
165 
166     aTypeLB.SetDoubleClickHdl       (LINK(this, SwFldVarPage, InsertHdl));
167     aTypeLB.SetSelectHdl            (LINK(this, SwFldVarPage, TypeHdl));
168     aSelectionLB.SetSelectHdl       (LINK(this, SwFldVarPage, SubTypeHdl));
169     aSelectionLB.SetDoubleClickHdl  (LINK(this, SwFldVarPage, InsertHdl));
170     aFormatLB.SetDoubleClickHdl     (LINK(this, SwFldVarPage, InsertHdl));
171     aNumFormatLB.SetDoubleClickHdl  (LINK(this, SwFldVarPage, InsertHdl));
172     aNameED.SetModifyHdl            (LINK(this, SwFldVarPage, ModifyHdl));
173     aValueED.SetModifyHdl           (LINK(this, SwFldVarPage, ModifyHdl));
174     aNewDelTBX.SetClickHdl          (LINK(this, SwFldVarPage, TBClickHdl));
175     aChapterLevelLB.SetSelectHdl    (LINK(this, SwFldVarPage, ChapterHdl));
176     aSeparatorED.SetModifyHdl       (LINK(this, SwFldVarPage, SeparatorHdl));
177 
178     if( !IsRefresh() )
179     {
180         String sUserData = GetUserData();
181         if(!IsRefresh() && sUserData.GetToken(0, ';').EqualsIgnoreCaseAscii(USER_DATA_VERSION_1))
182         {
183             String sVal = sUserData.GetToken(1, ';');
184             sal_uInt16 nVal = (sal_uInt16)sVal.ToInt32();
185             if( USHRT_MAX != nVal )
186             {
187                 for(sal_uInt16 i = 0; i < aTypeLB.GetEntryCount(); i++)
188                     if(nVal == (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(i))
189                     {
190                         aTypeLB.SelectEntryPos(i);
191                         break;
192                     }
193             }
194         }
195     }
196     TypeHdl(0);
197 
198     aTypeLB.SetUpdateMode(sal_True);
199 
200     if (IsFldEdit())
201     {
202         aSelectionLB.SaveValue();
203         aFormatLB.SaveValue();
204         nOldFormat = aNumFormatLB.GetFormat();
205         aNameED.SaveValue();
206         aValueED.SaveValue();
207         aInvisibleCB.SaveValue();
208         aChapterLevelLB.SaveValue();
209         aSeparatorED.SaveValue();
210     }
211 }
212 
213 /*--------------------------------------------------------------------
214     Beschreibung:
215  --------------------------------------------------------------------*/
216 
217 IMPL_LINK( SwFldVarPage, TypeHdl, ListBox *, EMPTYARG )
218 {
219     // Alte ListBoxPos sichern
220     const sal_uInt16 nOld = GetTypeSel();
221 
222     // Aktuelle ListBoxPos
223     SetTypeSel(aTypeLB.GetSelectEntryPos());
224 
225     if(GetTypeSel() == LISTBOX_ENTRY_NOTFOUND)
226     {
227         SetTypeSel(0);
228         aTypeLB.SelectEntryPos(0);
229     }
230 
231     if (nOld != GetTypeSel() || nOld == LISTBOX_ENTRY_NOTFOUND)
232     {
233         bInit = sal_True;
234         if (nOld != LISTBOX_ENTRY_NOTFOUND)
235         {
236             aNameED.SetText(aEmptyStr);
237             aValueED.SetText(aEmptyStr);
238         }
239 
240         aValueED.SetDropEnable(sal_False);
241         UpdateSubType();    // Auswahl-Listboxen initialisieren
242     }
243 
244     bInit = sal_False;
245 
246     return 0;
247 }
248 
249 /*--------------------------------------------------------------------
250     Beschreibung:
251  --------------------------------------------------------------------*/
252 
253 IMPL_LINK( SwFldVarPage, SubTypeHdl, ListBox *, pBox )
254 {
255     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
256     sal_uInt16 nSelPos = aSelectionLB.GetSelectEntryPos();
257 
258     if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
259         nSelPos = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nSelPos);
260 
261     if (IsFldEdit() && (!pBox || bInit))
262     {
263         if (nTypeId != TYP_FORMELFLD)
264             aNameED.SetText(GetFldMgr().GetCurFldPar1());
265 
266         aValueED.SetText(GetFldMgr().GetCurFldPar2());
267     }
268 
269     if (aNameFT.GetText() != sOldNameFT)
270         aNameFT.SetText(sOldNameFT);
271     if (aValueFT.GetText() != sOldValueFT)
272         aValueFT.SetText(sOldValueFT);
273 
274     aNumFormatLB.SetUpdateMode(sal_False);
275     aFormatLB.SetUpdateMode(sal_False);
276     FillFormatLB(nTypeId);
277 
278     sal_uInt16 nSize = aFormatLB.GetEntryCount();
279 
280     sal_Bool bValue = sal_False, bName = sal_False, bNumFmt = sal_False,
281             bInvisible = sal_False, bSeparator = sal_False, bChapterLevel = sal_False;
282     sal_Bool bFormat = nSize != 0;
283 
284     switch (nTypeId)
285     {
286         case TYP_USERFLD:
287         {
288             // Benutzertyp aendern oder anlegen
289             SwUserFieldType* pType = (SwUserFieldType*)
290                 GetFldMgr().GetFldType(RES_USERFLD, nSelPos);
291 
292             if (pType)
293             {
294                 if (!IsFldEdit())
295                 {
296                     if (pBox || (bInit && !IsRefresh()))    // Nur bei Interaktion mit Maus
297                     {
298                         aNameED.SetText(pType->GetName());
299 
300                         if (pType->GetType() == UF_STRING)
301                         {
302                             aValueED.SetText(pType->GetContent());
303                             aNumFormatLB.SelectEntryPos(0);
304                         }
305                         else
306                             aValueED.SetText(pType->GetContent());
307 //                          aValueED.SetText(pType->GetContent(aNumFormatLB.GetFormat()));
308                     }
309                 }
310                 else
311                     aValueED.SetText(pType->GetContent());
312             }
313             else
314             {
315                 if (pBox)   // Nur bei Interaktion mit Maus
316                 {
317                     aNameED.SetText(aEmptyStr);
318                     aValueED.SetText(aEmptyStr);
319                 }
320             }
321             bValue = bName = bNumFmt = bInvisible = sal_True;
322 
323             aValueED.SetDropEnable(sal_True);
324             break;
325         }
326 
327         case TYP_SETFLD:
328             bValue = sal_True;
329 
330             bNumFmt = bInvisible = sal_True;
331 
332             if (!IsFldDlgHtmlMode())
333                 bName = sal_True;
334             else
335             {
336                 aNumFormatLB.Clear();
337                 sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_SETVAR_TEXT), 0);
338                 aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
339                 aNumFormatLB.SelectEntryPos(0);
340             }
341             // gibt es ein entprechendes SetField
342             if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
343             {
344                 if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
345                 {
346                     String sName(aSelectionLB.GetSelectEntry());
347                     aNameED.SetText(sName);
348 
349                     if (!IsFldDlgHtmlMode())
350                     {
351                         SwWrtShell *pSh = GetWrtShell();
352                         if(!pSh)
353                             pSh = ::GetActiveWrtShell();
354                         if(pSh)
355                         {
356                             SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
357                                     pSh->GetFldType(RES_SETEXPFLD, sName);
358 
359                             if (pSetTyp && pSetTyp->GetType() == nsSwGetSetExpType::GSE_STRING)
360                                 aNumFormatLB.SelectEntryPos(0); // Textuell
361                         }
362                     }
363                 }
364             }
365             if (IsFldEdit())
366             {
367                 // GetFormula fuehrt bei Datumsformaten zu Problemen,
368                 // da nur der numerische Wert ohne Formatierung returned wird.
369                 // Muss aber verwendet werden, da sonst bei GetPar2 nur der vom
370                 // Kalkulator errechnete Wert angezeigt werden wuerde
371                 // (statt test2 = test + 1)
372                 aValueED.SetText(((SwSetExpField*)GetCurField())->GetFormula());
373             }
374             aValueED.SetDropEnable(sal_True);
375             break;
376 
377         case TYP_FORMELFLD:
378             {
379                 bValue = sal_True;
380                 bNumFmt = sal_True;
381                 aValueFT.SetText(SW_RESSTR(STR_FORMULA));
382                 aValueED.SetDropEnable(sal_True);
383             }
384             break;
385 
386         case TYP_GETFLD:
387             {
388                 if (!IsFldEdit())
389                 {
390                     aNameED.SetText(aEmptyStr);
391                     aValueED.SetText(aEmptyStr);
392                 }
393 
394                 if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
395                 {
396                     String sName(aSelectionLB.GetSelectEntry());
397                     if (!IsFldEdit())
398                         aNameED.SetText(sName);
399 
400                     // gibt es ein entprechendes SetField
401                     SwWrtShell *pSh = GetWrtShell();
402                     if(!pSh)
403                         pSh = ::GetActiveWrtShell();
404                     if(pSh)
405                     {
406                         SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
407                                 pSh->GetFldType(RES_SETEXPFLD, sName);
408 
409                         if(pSetTyp)
410                         {
411                             if (pSetTyp->GetType() & nsSwGetSetExpType::GSE_STRING)    // Textuell?
412                                 bFormat = sal_True;
413                             else                    // Numerisch
414                                 bNumFmt = sal_True;
415                         }
416                     }
417                 }
418                 else
419                     bFormat = sal_False;
420 
421                 EnableInsert(bFormat|bNumFmt);
422             }
423             break;
424 
425         case TYP_INPUTFLD:
426             aValueFT.SetText(SW_RESSTR(STR_PROMPT));
427 
428             if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
429             {
430                 bValue = bNumFmt = sal_True;
431 
432                 String sName;
433 
434                 sName = aSelectionLB.GetSelectEntry();
435                 aNameED.SetText( sName );
436 
437                 // User- oder SetField ?
438                 sal_uInt16 nInpType = 0;
439                 nInpType = static_cast< sal_uInt16 >(GetFldMgr().GetFldType(RES_USERFLD, sName) ? 0 : TYP_SETINPFLD);
440 
441                 if (nInpType)   // SETEXPFLD
442                 {
443                     // gibt es ein entprechendes SetField
444                     SwSetExpFieldType* pSetTyp = (SwSetExpFieldType*)
445                                 GetFldMgr().GetFldType(RES_SETEXPFLD, sName);
446 
447                     if(pSetTyp)
448                     {
449                         if (pSetTyp->GetType() == nsSwGetSetExpType::GSE_STRING)    // Textuell?
450                         {
451                             aNumFormatLB.Clear();
452 
453                             sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_USERVAR_TEXT), 0);
454                             aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
455                             aNumFormatLB.SelectEntryPos(0);
456                         }
457                     }
458                     if (IsFldEdit() && (!pBox || bInit) )
459                         aValueED.SetText(((SwSetExpField*)GetCurField())->GetPromptText());
460                 }
461                 else    // USERFLD
462                     bFormat = bNumFmt = sal_False;
463             }
464             break;
465 
466         case TYP_DDEFLD:
467             aValueFT.SetText(SW_RESSTR(STR_DDE_CMD));
468 
469             if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
470             {
471                 if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
472                 {
473                     SwDDEFieldType* pType =
474                         (SwDDEFieldType*) GetFldMgr().GetFldType(RES_DDEFLD, nSelPos);
475 
476                     if(pType)
477                     {
478                         aNameED.SetText(pType->GetName());
479 
480                         //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
481                         //              Namen haben! Wird hier noch nicht beachtet
482                         String sCmd( pType->GetCmd() );
483                         sal_uInt16 nTmpPos = sCmd.SearchAndReplace( sfx2::cTokenSeperator, ' ' );
484                         sCmd.SearchAndReplace( sfx2::cTokenSeperator, ' ', nTmpPos );
485 
486                         aValueED.SetText( sCmd );
487                         aFormatLB.SelectEntryPos(pType->GetType());
488                     }
489                 }
490             }
491             bName = bValue = sal_True;
492             break;
493 
494         case TYP_SEQFLD:
495             {
496                 // aNumRB.Check(sal_True);
497                 bName = bValue = bSeparator = bChapterLevel = sal_True;
498 
499                 SwFieldType* pFldTyp;
500                 if( IsFldEdit() )
501                     pFldTyp = GetCurField()->GetTyp();
502                 else
503                 {
504                     String sFldTypeName( aSelectionLB.GetEntry( nSelPos ));
505                     if( sFldTypeName.Len() )
506                         pFldTyp = GetFldMgr().GetFldType( RES_SETEXPFLD,
507                                                           sFldTypeName );
508                     else
509                         pFldTyp = 0;
510                 }
511 
512                 if( IsFldEdit() )
513                     aValueED.SetText( ((SwSetExpField*)GetCurField())->
514                                         GetFormula() );
515 
516                 if( IsFldEdit() || pBox )   // Nur bei Interaktion mit Maus
517                     aNameED.SetText( aSelectionLB.GetSelectEntry() );
518 
519                 if( pFldTyp )
520                 {
521                     sal_uInt8 nLevel = ((SwSetExpFieldType*)pFldTyp)->GetOutlineLvl();
522                     if( 0x7f == nLevel )
523                         aChapterLevelLB.SelectEntryPos( 0 );
524                     else
525                         aChapterLevelLB.SelectEntryPos( nLevel + 1 );
526                     String sDelim = ((SwSetExpFieldType*)pFldTyp)->GetDelimiter();
527                     aSeparatorED.SetText( sDelim );
528                     ChapterHdl();
529                 }
530             }
531             break;
532 
533         case TYP_SETREFPAGEFLD:
534             {
535                 bValue = sal_False;
536                 aValueFT.SetText( SW_RESSTR( STR_OFFSET ));
537 
538                 if (IsFldEdit() || pBox)    // Nur bei Interaktion mit Maus
539                     aNameED.SetText(aEmptyStr);
540 
541                 if (nSelPos != 0 && nSelPos != LISTBOX_ENTRY_NOTFOUND)
542                 {
543                     bValue = sal_True;      // SubType OFF - kennt keinen Offset
544                     if (IsFldEdit())
545                         aValueED.SetText(String::CreateFromInt32(((SwRefPageSetField*)GetCurField())->GetOffset()));
546                 }
547             }
548             break;
549 
550         case TYP_GETREFPAGEFLD:
551             aNameED.SetText(aEmptyStr);
552             aValueED.SetText(aEmptyStr);
553             break;
554     }
555 
556     aNumFormatLB.Show(bNumFmt);
557     aFormatLB.Show(!bNumFmt);
558 
559     if (IsFldEdit())
560         bName = sal_False;
561 
562     aFormatLB.Enable(bFormat);
563     aFormatFT.Enable(bFormat|bNumFmt);
564     aNameFT.Enable(bName);
565     aNameED.Enable(bName);
566     aValueFT.Enable(bValue);
567     aValueED.Enable(bValue);
568 
569     Size aSz(aFormatLB.GetSizePixel());
570 
571     if (bChapterLevel)
572         aSz.Height() = aFormatLB.LogicToPixel(Size(1, 94), MAP_APPFONT).Height();
573     else
574         aSz.Height() = aFormatLB.LogicToPixel(Size(1, 123), MAP_APPFONT).Height();
575 
576     aFormatLB.SetSizePixel(aSz);
577 
578     aInvisibleCB.Show(!bSeparator);
579     aSeparatorFT.Show(bSeparator);
580     aSeparatorED.Show(bSeparator);
581     aChapterHeaderFT.Show(bChapterLevel);
582     aChapterLevelFT.Show(bChapterLevel);
583     aChapterLevelLB.Show(bChapterLevel);
584     aInvisibleCB.Enable(bInvisible);
585 
586     ModifyHdl();    // Anwenden/Einfuegen/Loeschen Status update
587 
588     aNumFormatLB.SetUpdateMode(sal_True);
589     aFormatLB.SetUpdateMode(sal_True);
590 
591     if(aSelectionLB.IsCallAddSelection())
592     {
593         nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
594 
595         switch (nTypeId)
596         {
597             case TYP_FORMELFLD:
598                 {
599                     nSelPos = aSelectionLB.GetSelectEntryPos();
600 
601                     if (nSelPos != LISTBOX_ENTRY_NOTFOUND)
602                         nSelPos = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nSelPos);
603 
604                     if (nSelPos != LISTBOX_ENTRY_NOTFOUND && pBox && !bInit)
605                     {
606                         aValueED.ReplaceSelected(aSelectionLB.GetSelectEntry());
607                         ModifyHdl();
608                     }
609                 }
610                 break;
611         }
612         aSelectionLB.ResetCallAddSelection();
613     }
614     return 0;
615 }
616 
617 /*--------------------------------------------------------------------
618      Beschreibung: Typen in der SelectionBox erneuern
619  --------------------------------------------------------------------*/
620 
621 void SwFldVarPage::UpdateSubType()
622 {
623     String sOldSel;
624     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
625 
626     SetSelectionSel(aSelectionLB.GetSelectEntryPos());
627     if(GetSelectionSel() != LISTBOX_ENTRY_NOTFOUND)
628         sOldSel = aSelectionLB.GetEntry(GetSelectionSel());
629 
630     // Auswahl-Listbox fuellen
631     aSelectionLB.SetUpdateMode(sal_False);
632     aSelectionLB.Clear();
633 
634     SvStringsDtor aList;
635     GetFldMgr().GetSubTypes(nTypeId, aList);
636     sal_uInt16 nCount = aList.Count();
637     sal_uInt16 nPos;
638 
639     for (sal_uInt16 i = 0; i < nCount; ++i)
640     {
641         if (nTypeId != TYP_INPUTFLD || i)
642         {
643             if (!IsFldEdit())
644             {
645                 nPos = aSelectionLB.InsertEntry(*aList[i]);
646                 aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
647             }
648             else
649             {
650                 sal_Bool bInsert = sal_False;
651 
652                 switch (nTypeId)
653                 {
654                     case TYP_INPUTFLD:
655                         if (*aList[i] == GetCurField()->GetPar1())
656                             bInsert = sal_True;
657                         break;
658 
659                     case TYP_FORMELFLD:
660                         bInsert = sal_True;
661                         break;
662 
663                     case TYP_GETFLD:
664                         if (*aList[i] == ((SwFormulaField*)GetCurField())->GetFormula())
665                             bInsert = sal_True;
666                         break;
667 
668                     case TYP_SETFLD:
669                     case TYP_USERFLD:
670                         if (*aList[i] == GetCurField()->GetTyp()->GetName())
671                         {
672                             bInsert = sal_True;
673                             if (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE)
674                                 aInvisibleCB.Check();
675                         }
676                         break;
677 
678                     case TYP_SETREFPAGEFLD:
679                         if ((((SwRefPageSetField*)GetCurField())->IsOn() && i) ||
680                             (!((SwRefPageSetField*)GetCurField())->IsOn() && !i))
681                             sOldSel = *aList[i];
682 
683                         // Alle Eintr?ge zur Auswahl zulassen:
684                         nPos = aSelectionLB.InsertEntry(*aList[i]);
685                         aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
686                         break;
687 
688                     default:
689                         if (*aList[i] == GetCurField()->GetPar1())
690                             bInsert = sal_True;
691                         break;
692                 }
693                 if (bInsert)
694                 {
695                     nPos = aSelectionLB.InsertEntry(*aList[i]);
696                     aSelectionLB.SetEntryData(nPos, reinterpret_cast<void*>(i));
697                     if (nTypeId != TYP_FORMELFLD)
698                         break;
699                 }
700             }
701         }
702     }
703 
704     sal_Bool bEnable = aSelectionLB.GetEntryCount() != 0;
705     ListBox *pLB = 0;
706 
707     if (bEnable)
708     {
709         aSelectionLB.SelectEntry(sOldSel);
710         if (!aSelectionLB.GetSelectEntryCount())
711         {
712             aSelectionLB.SelectEntryPos(0);
713             pLB = &aSelectionLB;    // Alle Controls neu initialisieren
714         }
715     }
716 
717     aSelectionLB.Enable( bEnable );
718     aSelectionFT.Enable( bEnable );
719 
720     SubTypeHdl(pLB);
721     aSelectionLB.SetUpdateMode(sal_True);
722 }
723 
724 /*--------------------------------------------------------------------
725     Beschreibung:
726  --------------------------------------------------------------------*/
727 
728 sal_uInt16 SwFldVarPage::FillFormatLB(sal_uInt16 nTypeId)
729 {
730     String sOldSel, sOldNumSel;
731     sal_uLong nOldNumFormat = 0;
732 
733     sal_uInt16 nFormatSel = aFormatLB.GetSelectEntryPos();
734     if (nFormatSel != LISTBOX_ENTRY_NOTFOUND)
735         sOldSel = aFormatLB.GetEntry(nFormatSel);
736 
737     sal_uInt16 nNumFormatSel = aNumFormatLB.GetSelectEntryPos();
738     if (nNumFormatSel != LISTBOX_ENTRY_NOTFOUND)
739     {
740         sOldNumSel = aNumFormatLB.GetEntry(nNumFormatSel);
741         nOldNumFormat = aNumFormatLB.GetFormat();
742     }
743 
744     // Format-Listbox fuellen
745     aFormatLB.Clear();
746     aNumFormatLB.Clear();
747     sal_Bool bSpecialFmt = sal_False;
748 
749     if( TYP_GETREFPAGEFLD != nTypeId )
750     {
751         if (IsFldEdit())
752         {
753             bSpecialFmt = GetCurField()->GetFormat() == SAL_MAX_UINT32;
754 
755             if (!bSpecialFmt)
756             {
757                 aNumFormatLB.SetDefFormat(GetCurField()->GetFormat());
758                 sOldNumSel = aEmptyStr;
759             }
760             else
761                 if (nTypeId == TYP_GETFLD || nTypeId == TYP_FORMELFLD)
762                     aNumFormatLB.SetFormatType(NUMBERFORMAT_NUMBER);
763         }
764         else
765         {
766             if (nOldNumFormat && nOldNumFormat != ULONG_MAX)
767                 aNumFormatLB.SetDefFormat(nOldNumFormat);
768             else
769                 aNumFormatLB.SetFormatType(NUMBERFORMAT_NUMBER);
770         }
771     }
772 
773     switch (nTypeId)
774     {
775         case TYP_USERFLD:
776         {
777             if (!IsFldEdit() || bSpecialFmt)
778             {
779                 sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_MARK_TEXT), 0);
780                 aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
781                 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_USERVAR_CMD), 1);
782                 aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
783             }
784         }
785         break;
786 
787         case TYP_SETFLD:
788         {
789             if (!IsFldEdit() || bSpecialFmt)
790             {
791                 sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_SETVAR_TEXT), 0);
792                 aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
793             }
794         }
795         break;
796 
797         case TYP_FORMELFLD:
798         {
799             sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_GETVAR_NAME), 0);
800             aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
801         }
802         break;
803 
804         case TYP_GETFLD:
805         {
806             sal_uInt16 nPos = aNumFormatLB.InsertEntry(SW_RESSTR(FMT_GETVAR_NAME), 0);
807             aNumFormatLB.SetEntryData(nPos, (void *)ULONG_MAX);
808         }
809         break;
810     }
811 
812     if (IsFldEdit() && bSpecialFmt)
813     {
814         if (nTypeId == TYP_USERFLD && (GetCurField()->GetSubType() & nsSwExtendedSubType::SUB_CMD))
815             aNumFormatLB.SelectEntryPos(1);
816         else
817             aNumFormatLB.SelectEntryPos(0);
818     }
819     else
820     {
821         if (!nOldNumFormat && (nNumFormatSel = aNumFormatLB.GetEntryPos(sOldNumSel)) != LISTBOX_ENTRY_NOTFOUND)
822             aNumFormatLB.SelectEntryPos(nNumFormatSel);
823         else if (nOldNumFormat && nOldNumFormat == ULONG_MAX)
824             aNumFormatLB.SelectEntry(sOldSel);
825     }
826 
827     sal_uInt16 nSize = GetFldMgr().GetFormatCount(nTypeId, sal_False, IsFldDlgHtmlMode());
828 
829     for (sal_uInt16 i = 0; i < nSize; i++)
830     {
831         sal_uInt16 nPos = aFormatLB.InsertEntry(GetFldMgr().GetFormatStr(nTypeId, i));
832         sal_uInt16 nFldId = GetFldMgr().GetFormatId( nTypeId, i );
833         aFormatLB.SetEntryData( nPos, reinterpret_cast<void*>(nFldId) );
834         if (IsFldEdit() && nFldId == GetCurField()->GetFormat())
835             aFormatLB.SelectEntryPos( nPos );
836     }
837 
838     if (nSize && (!IsFldEdit() || !aFormatLB.GetSelectEntryCount()))
839     {
840         aFormatLB.SelectEntry(sOldSel);
841 
842         if (!aFormatLB.GetSelectEntryCount())
843         {
844             aFormatLB.SelectEntry(SW_RESSTR(FMT_NUM_PAGEDESC));
845             if (!aFormatLB.GetSelectEntryCount())
846             {
847                 aFormatLB.SelectEntry(SW_RESSTR(FMT_NUM_ARABIC));
848                 if (!aFormatLB.GetSelectEntryCount())
849                     aFormatLB.SelectEntryPos(0);
850             }
851         }
852     }
853 
854     return nSize;
855 }
856 
857 /*--------------------------------------------------------------------
858     Beschreibung: Modify
859  --------------------------------------------------------------------*/
860 
861 IMPL_LINK( SwFldVarPage, ModifyHdl, Edit *, EMPTYARG )
862 {
863     String sValue(aValueED.GetText());
864     sal_Bool bHasValue = sValue.Len() != 0;
865     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
866     sal_Bool bInsert = sal_False, bApply = sal_False, bDelete = sal_False;
867 
868     String sName( aNameED.GetText() );
869     xub_StrLen nLen = sName.Len();
870 
871     switch( nTypeId )
872     {
873     case TYP_DDEFLD:
874     case TYP_USERFLD:
875     case TYP_SETFLD:
876     case TYP_SEQFLD:
877         SwCalc::IsValidVarName( sName, &sName );
878         if( sName.Len() != nLen )
879         {
880             nLen = sName.Len();
881             Selection aSel(aNameED.GetSelection());
882             aNameED.SetText( sName );
883             aNameED.SetSelection( aSel );   // Cursorpos restaurieren
884         }
885         break;
886     }
887 
888 
889     // Buttons ueberpruefen
890     switch (nTypeId)
891     {
892     case TYP_DDEFLD:
893         if( nLen )
894         {
895             // Gibts schon einen entsprechenden Type
896             bInsert = bApply = sal_True;
897 
898             SwFieldType* pType = GetFldMgr().GetFldType(RES_DDEFLD, sName);
899 
900             SwWrtShell *pSh = GetWrtShell();
901             if(!pSh)
902                 pSh = ::GetActiveWrtShell();
903             if(pSh && pType)
904                 bDelete = !pSh->IsUsed( *pType );
905         }
906         break;
907 
908     case TYP_USERFLD:
909         if( nLen )
910         {
911             // Gibts schon einen entsprechenden Type
912             SwFieldType* pType = GetFldMgr().GetFldType(RES_USERFLD, sName);
913 
914             SwWrtShell *pSh = GetWrtShell();
915             if(!pSh)
916                 pSh = ::GetActiveWrtShell();
917             if(pSh && pType)
918                 bDelete = !pSh->IsUsed( *pType );
919 
920             pType = GetFldMgr().GetFldType(RES_SETEXPFLD, sName);
921             if (!pType) // Kein Namenskonflikt mit Variablen
922             {
923                 // Benutzerfelder duerfen auch ohne Inhalt eingefuegt werden!
924                 // Bug #56845
925                 bInsert = bApply = sal_True;
926             }
927         }
928         break;
929 
930     default:
931         bInsert = sal_True;
932 
933         if (nTypeId == TYP_SETFLD || nTypeId == TYP_SEQFLD)
934         {
935             SwSetExpFieldType* pFldType = (SwSetExpFieldType*)
936                 GetFldMgr().GetFldType(RES_SETEXPFLD, sName);
937 
938             if (pFldType)
939             {
940 
941                 SwWrtShell *pSh = GetWrtShell();
942                 if(!pSh)
943                     pSh = ::GetActiveWrtShell();
944                 if(pSh)
945                 {
946                     const SwFldTypes* p = pSh->GetDoc()->GetFldTypes();
947                     sal_uInt16 i;
948 
949                     for (i = 0; i < INIT_FLDTYPES; i++)
950                     {
951                         SwFieldType* pType = (*p)[ i ];
952                         if (pType == pFldType)
953                             break;
954                     }
955 
956                     if (i >= INIT_FLDTYPES && !pSh->IsUsed(*pFldType))
957                         bDelete = sal_True;
958 
959                     if (nTypeId == TYP_SEQFLD && !(pFldType->GetType() & nsSwGetSetExpType::GSE_SEQ))
960                         bInsert = sal_False;
961 
962                     if (nTypeId == TYP_SETFLD && (pFldType->GetType() & nsSwGetSetExpType::GSE_SEQ))
963                         bInsert = sal_False;
964                 }
965             }
966             if (GetFldMgr().GetFldType(RES_USERFLD, sName))
967                 bInsert = sal_False;
968         }
969 
970         if( !nLen && ( nTypeId == TYP_SETFLD ||
971                         (!IsFldEdit() && nTypeId == TYP_GETFLD ) ) )
972             bInsert = sal_False;
973 
974         if( (nTypeId == TYP_SETFLD || nTypeId == TYP_FORMELFLD) &&
975             !bHasValue )
976             bInsert = sal_False;
977         break;
978     }
979 
980     aNewDelTBX.EnableItem(BT_VARAPPLY, bApply);
981     aNewDelTBX.EnableItem(BT_VARDELETE, bDelete);
982     EnableInsert(bInsert);
983 
984     return 0;
985 }
986 
987 /*--------------------------------------------------------------------
988     Beschreibung:
989  --------------------------------------------------------------------*/
990 
991 IMPL_LINK( SwFldVarPage, TBClickHdl, ToolBox *, pBox )
992 {
993     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
994 
995     switch (pBox->GetCurItemId())
996     {
997         case BT_VARDELETE:
998         {
999             if( nTypeId == TYP_USERFLD )
1000                 GetFldMgr().RemoveFldType(RES_USERFLD, aSelectionLB.GetSelectEntry());
1001             else
1002             {
1003                 sal_uInt16 nWhich;
1004 
1005                 switch(nTypeId)
1006                 {
1007                     case TYP_SETFLD:
1008                     case TYP_SEQFLD:
1009                         nWhich = RES_SETEXPFLD;
1010                         break;
1011                     default:
1012                         nWhich = RES_DDEFLD;
1013                         break;
1014                 }
1015 
1016                 GetFldMgr().RemoveFldType(nWhich, aSelectionLB.GetSelectEntry());
1017             }
1018 
1019             UpdateSubType();
1020             SwWrtShell *pSh = GetWrtShell();
1021             if(!pSh)
1022                 pSh = ::GetActiveWrtShell();
1023             if(pSh)
1024             {
1025                 pSh->SetModified();
1026             }
1027         }
1028         break;
1029 
1030         case BT_VARAPPLY:
1031         {
1032             String sName(aNameED.GetText()), sValue(aValueED.GetText());
1033             SwFieldType* pType = 0;
1034             sal_uInt16 nId = 0;
1035             sal_uInt16 nNumFormatPos = aNumFormatLB.GetSelectEntryPos();
1036 
1037             switch (nTypeId)
1038             {
1039                 case TYP_USERFLD:   nId = RES_USERFLD;  break;
1040                 case TYP_DDEFLD:    nId = RES_DDEFLD;   break;
1041                 case TYP_SETFLD:    nId = RES_SETEXPFLD;break;
1042             }
1043             pType = GetFldMgr().GetFldType(nId, sName);
1044 
1045             sal_uLong nFormat = aFormatLB.GetSelectEntryPos();
1046             if (nFormat != LISTBOX_ENTRY_NOTFOUND)
1047                 nFormat = (sal_uLong)aFormatLB.GetEntryData((sal_uInt16)nFormat);
1048 
1049             if (pType)  // Aendern
1050             {
1051                 SwWrtShell *pSh = GetWrtShell();
1052                 if(!pSh)
1053                     pSh = ::GetActiveWrtShell();
1054                 if(pSh)
1055                 {
1056                     pSh->StartAllAction();
1057 
1058                     if (nTypeId == TYP_USERFLD)
1059                     {
1060                         if (nNumFormatPos != LISTBOX_ENTRY_NOTFOUND)
1061                         {
1062                             sal_uLong nFmt = nNumFormatPos == 0 ? 0 : aNumFormatLB.GetFormat();
1063                             if (nFmt)
1064                             {   // Sprache auf Office-Sprache umstellen, da String im Office
1065                                 // Format vom Kalkulator erwartet wird und so in den Dlg
1066                                 // eingegeben werden sollte
1067                                 nFmt = SwValueField::GetSystemFormat(pSh->GetNumberFormatter(), nFmt);
1068                             }
1069                             ((SwUserFieldType*)pType)->SetContent(aValueED.GetText(), nFmt);
1070                             ((SwUserFieldType*)pType)->SetType(
1071                                 nNumFormatPos == 0 ? nsSwGetSetExpType::GSE_STRING : nsSwGetSetExpType::GSE_EXPR );
1072                         }
1073                     }
1074                     else
1075                     {
1076                         if (nFormat != LISTBOX_ENTRY_NOTFOUND)
1077                         {
1078                             //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
1079                             //              Namen haben! Wird hier noch nicht beachtet.
1080                             sal_uInt16 nTmpPos = sValue.SearchAndReplace( ' ', sfx2::cTokenSeperator );
1081                             sValue.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos );
1082                             ((SwDDEFieldType*)pType)->SetCmd(sValue);
1083                             ((SwDDEFieldType*)pType)->SetType((sal_uInt16)nFormat);
1084                         }
1085                     }
1086                     pType->UpdateFlds();
1087 
1088                     pSh->EndAllAction();
1089                 }
1090             }
1091             else        // Neu
1092             {
1093                 if(nTypeId == TYP_USERFLD)
1094                 {
1095                     SwWrtShell *pSh = GetWrtShell();
1096                     if(!pSh)
1097                         pSh = ::GetActiveWrtShell();
1098                     if(pSh)
1099                     {
1100                         SwUserFieldType aType( pSh->GetDoc(), sName );
1101 
1102                         if (nNumFormatPos != LISTBOX_ENTRY_NOTFOUND)
1103                         {
1104                             aType.SetType(nNumFormatPos == 0 ? nsSwGetSetExpType::GSE_STRING : nsSwGetSetExpType::GSE_EXPR);
1105                             aType.SetContent( sValue, nNumFormatPos == 0 ? 0 : aNumFormatLB.GetFormat() );
1106                             aSelectionLB.InsertEntry(sName);
1107                             aSelectionLB.SelectEntry(sName);
1108                             GetFldMgr().InsertFldType( aType ); // Userfld Neu
1109                         }
1110                     }
1111                 }
1112                 else
1113                 {
1114                     if (nFormat != LISTBOX_ENTRY_NOTFOUND)
1115                     {
1116                         //JP 28.08.95: DDE-Topics/-Items koennen Blanks in ihren
1117                         //              Namen haben! Wird hier noch nicht beachtet.
1118                         sal_uInt16 nTmpPos = sValue.SearchAndReplace( ' ', sfx2::cTokenSeperator );
1119                         sValue.SearchAndReplace( ' ', sfx2::cTokenSeperator, nTmpPos );
1120 
1121                         SwDDEFieldType aType(sName, sValue, (sal_uInt16)nFormat);
1122                         aSelectionLB.InsertEntry(sName);
1123                         aSelectionLB.SelectEntry(sName);
1124                         GetFldMgr().InsertFldType(aType);   // DDE-Feld Neu
1125                     }
1126                 }
1127             }
1128             if (IsFldEdit())
1129                 GetFldMgr().GetCurFld();    // FieldManager Updaten
1130 
1131             UpdateSubType();
1132         }
1133         break;
1134     }
1135 
1136     return sal_True;
1137 }
1138 
1139 /*--------------------------------------------------------------------
1140     Beschreibung:
1141  --------------------------------------------------------------------*/
1142 
1143 IMPL_LINK( SwFldVarPage, ChapterHdl, ListBox *, EMPTYARG )
1144 {
1145     sal_Bool bEnable = aChapterLevelLB.GetSelectEntryPos() != 0;
1146 
1147     aSeparatorED.Enable(bEnable);
1148     aSeparatorFT.Enable(bEnable);
1149     SeparatorHdl();
1150 
1151     return 0;
1152 }
1153 
1154 /*--------------------------------------------------------------------
1155     Beschreibung:
1156  --------------------------------------------------------------------*/
1157 
1158 IMPL_LINK( SwFldVarPage, SeparatorHdl, Edit *, EMPTYARG )
1159 {
1160     sal_Bool bEnable = aSeparatorED.GetText().Len() != 0 ||
1161                     aChapterLevelLB.GetSelectEntryPos() == 0;
1162     EnableInsert(bEnable);
1163 
1164     return 0;
1165 }
1166 
1167 /*--------------------------------------------------------------------
1168     Beschreibung:
1169  --------------------------------------------------------------------*/
1170 
1171 sal_Bool SwFldVarPage::FillItemSet(SfxItemSet& )
1172 {
1173     sal_uInt16 nTypeId = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData(GetTypeSel());
1174 
1175     String aVal(aValueED.GetText());
1176     String aName(aNameED.GetText());
1177 
1178     sal_uInt16 nSubType = aSelectionLB.GetSelectEntryPos();
1179     if(nSubType == LISTBOX_ENTRY_NOTFOUND)
1180         nSubType = 0;
1181     else
1182         nSubType = (sal_uInt16)(sal_uLong)aSelectionLB.GetEntryData(nSubType);
1183 
1184     sal_uLong nFormat;
1185 
1186     if (!aNumFormatLB.IsVisible())
1187     {
1188         nFormat = aFormatLB.GetSelectEntryPos();
1189 
1190         if(nFormat == LISTBOX_ENTRY_NOTFOUND)
1191             nFormat = 0;
1192         else
1193             nFormat = (sal_uLong)aFormatLB.GetEntryData((sal_uInt16)nFormat);
1194     }
1195     else
1196     {
1197         nFormat = aNumFormatLB.GetFormat();
1198 
1199         if (nFormat && nFormat != ULONG_MAX && aNumFormatLB.IsAutomaticLanguage())
1200         {
1201             // Sprache auf Office-Sprache umstellen, da String im Office-
1202             // Format vom Kalkulator erwartet wird und so in den Dlg
1203             // eingegeben werden sollte
1204             SwWrtShell *pSh = GetWrtShell();
1205             if(!pSh)
1206                 pSh = ::GetActiveWrtShell();
1207             if(pSh)
1208             {
1209                 nFormat = SwValueField::GetSystemFormat(pSh->GetNumberFormatter(), nFormat);
1210             }
1211         }
1212     }
1213     sal_Unicode cSeparator = ' ';
1214     switch (nTypeId)
1215     {
1216         case TYP_USERFLD:
1217         {
1218             nSubType = (nFormat == ULONG_MAX) ? nsSwGetSetExpType::GSE_STRING : nsSwGetSetExpType::GSE_EXPR;
1219 
1220             if (nFormat == ULONG_MAX && aNumFormatLB.GetSelectEntry() == SW_RESSTR(FMT_USERVAR_CMD))
1221                 nSubType |= nsSwExtendedSubType::SUB_CMD;
1222 
1223             if (aInvisibleCB.IsChecked())
1224                 nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1225             break;
1226         }
1227         case TYP_FORMELFLD:
1228         {
1229             nSubType = nsSwGetSetExpType::GSE_FORMULA;
1230             if (aNumFormatLB.IsVisible() && nFormat == ULONG_MAX)
1231                 nSubType |= nsSwExtendedSubType::SUB_CMD;
1232             break;
1233         }
1234         case TYP_GETFLD:
1235         {
1236             nSubType &= 0xff00;
1237             if (aNumFormatLB.IsVisible() && nFormat == ULONG_MAX)
1238                 nSubType |= nsSwExtendedSubType::SUB_CMD;
1239             break;
1240         }
1241         case TYP_INPUTFLD:
1242         {
1243             SwFieldType* pType = GetFldMgr().GetFldType(RES_USERFLD, aName);
1244             nSubType = static_cast< sal_uInt16 >((nSubType & 0xff00) | ((pType) ? INP_USR : INP_VAR));
1245             break;
1246         }
1247 
1248         case TYP_SETFLD:
1249         {
1250             if (IsFldDlgHtmlMode())
1251             {
1252                 nSubType = 0x0100;
1253                 nSubType = (nSubType & 0xff00) | nsSwGetSetExpType::GSE_STRING;
1254             }
1255             else
1256                 nSubType = (nSubType & 0xff00) | ((nFormat == ULONG_MAX) ? nsSwGetSetExpType::GSE_STRING : nsSwGetSetExpType::GSE_EXPR);
1257 
1258             if (aInvisibleCB.IsChecked())
1259                 nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1260             break;
1261         }
1262         case TYP_SEQFLD:
1263         {
1264             // nSubType = nsSwGetSetExpType::GSE_SEQ;   // nsSwGetSetExpType::GSE_SEQ wird im Fldmgr fest gesetzt, kann also entfallen
1265             nSubType = aChapterLevelLB.GetSelectEntryPos();
1266             if (nSubType == 0)
1267                 nSubType = 0x7f;
1268             else
1269             {
1270                 nSubType--;
1271                 String sSeparator(aSeparatorED.GetText().GetChar(0));
1272                 cSeparator = sSeparator.Len() ? sSeparator.GetChar(0) : ' ';
1273                 //nSubType |= (sal_uInt16)(((sal_uInt8)) << 8);
1274             }
1275             break;
1276         }
1277         case TYP_GETREFPAGEFLD:
1278             if( SVX_NUM_CHAR_SPECIAL == nFormat )
1279                 aVal = aValueED.GetText();
1280             break;
1281     }
1282 
1283     if (!IsFldEdit() ||
1284         aNameED.GetSavedValue() != aNameED.GetText() ||
1285         aValueED.GetSavedValue() != aValueED.GetText() ||
1286         aSelectionLB.GetSavedValue() != aSelectionLB.GetSelectEntryPos() ||
1287         aFormatLB.GetSavedValue() != aFormatLB.GetSelectEntryPos() ||
1288         nOldFormat != aNumFormatLB.GetFormat() ||
1289         aInvisibleCB.GetState() != aInvisibleCB.GetSavedValue() ||
1290         aChapterLevelLB.GetSavedValue() != aChapterLevelLB.GetSelectEntryPos() ||
1291         aSeparatorED.GetSavedValue() != aSeparatorED.GetText())
1292     {
1293         InsertFld( nTypeId, nSubType, aName, aVal, nFormat,
1294                     cSeparator, aNumFormatLB.IsAutomaticLanguage() );
1295     }
1296 
1297     UpdateSubType();
1298 
1299     return sal_False;
1300 }
1301 
1302 
1303 /*--------------------------------------------------------------------
1304     Beschreibung:
1305  --------------------------------------------------------------------*/
1306 
1307 SfxTabPage* SwFldVarPage::Create(   Window* pParent,
1308                         const SfxItemSet& rAttrSet )
1309 {
1310     return ( new SwFldVarPage( pParent, rAttrSet ) );
1311 }
1312 
1313 /*--------------------------------------------------------------------
1314     Beschreibung:
1315  --------------------------------------------------------------------*/
1316 
1317 sal_uInt16 SwFldVarPage::GetGroup()
1318 {
1319     return GRP_VAR;
1320 }
1321 
1322 /*--------------------------------------------------------------------
1323     Beschreibung:
1324  --------------------------------------------------------------------*/
1325 
1326 SelectionListBox::SelectionListBox( SwFldVarPage* pDialog, const ResId& rResId ) :
1327     ListBox (pDialog, rResId),
1328     pDlg    (pDialog),
1329     bCallAddSelection(sal_False)
1330 {
1331 }
1332 
1333 /*--------------------------------------------------------------------
1334     Beschreibung:
1335  --------------------------------------------------------------------*/
1336 
1337 long SelectionListBox::PreNotify( NotifyEvent& rNEvt )
1338 {
1339     long nHandled = ListBox::PreNotify( rNEvt );
1340     //sal_Bool bAddSel = sal_False;
1341     if ( rNEvt.GetType() == EVENT_KEYUP )
1342     {
1343         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
1344         const KeyCode aKeyCode = pKEvt->GetKeyCode();
1345         const sal_uInt16 nModifier = aKeyCode.GetModifier();
1346         if( aKeyCode.GetCode() == KEY_SPACE && !nModifier)
1347 //          bAddSel = sal_True;
1348             bCallAddSelection = sal_True;
1349     }
1350     if ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN )
1351     {
1352         const MouseEvent* pMEvt = rNEvt.GetMouseEvent();
1353 
1354         if (pMEvt && (pMEvt->IsMod1() || pMEvt->IsMod2()))  // Alt oder Ctrl
1355             //bAddSel = sal_True;
1356             bCallAddSelection = sal_True;
1357     }
1358 
1359 //  if (bAddSel)
1360 //      pDlg->AddSelection(this);
1361 
1362     return nHandled;
1363 }
1364 /* -----------------12.01.99 11:14-------------------
1365  *
1366  * --------------------------------------------------*/
1367 void SwFldVarPage::FillUserData()
1368 {
1369     String sData(String::CreateFromAscii(USER_DATA_VERSION));
1370     sData += ';';
1371     sal_uInt16 nTypeSel = aTypeLB.GetSelectEntryPos();
1372     if( LISTBOX_ENTRY_NOTFOUND == nTypeSel )
1373         nTypeSel = USHRT_MAX;
1374     else
1375         nTypeSel = (sal_uInt16)(sal_uLong)aTypeLB.GetEntryData( nTypeSel );
1376     sData += String::CreateFromInt32( nTypeSel );
1377     SetUserData(sData);
1378 }
1379 
1380