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