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