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