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