xref: /core/sw/source/ui/fldui/fldvar.cxx (revision d6208216)
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