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