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 <flddat.hxx>
21 #include <docufld.hxx>
22 #include <strings.hrc>
23 #include <chpfld.hxx>
24 #include "flddok.hxx"
25 #include <swmodule.hxx>
26 #include <wrtsh.hxx>
27 #include <svl/zformat.hxx>
28 
29 #define USER_DATA_VERSION_1 "1"
30 #define USER_DATA_VERSION USER_DATA_VERSION_1
31 
SwFieldDokPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * const pCoreSet)32 SwFieldDokPage::SwFieldDokPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet *const pCoreSet)
33     : SwFieldPage(pPage, pController, "modules/swriter/ui/flddocumentpage.ui",
34                   "FieldDocumentPage", pCoreSet)
35     , nOldSel(0)
36     , nOldFormat(0)
37     , m_xTypeLB(m_xBuilder->weld_tree_view("type"))
38     , m_xSelection(m_xBuilder->weld_widget("selectframe"))
39     , m_xSelectionLB(m_xBuilder->weld_tree_view("select"))
40     , m_xValueFT(m_xBuilder->weld_label("valueft"))
41     , m_xValueED(m_xBuilder->weld_entry("value"))
42     , m_xLevelFT(m_xBuilder->weld_label("levelft"))
43     , m_xLevelED(m_xBuilder->weld_spin_button("level"))
44     , m_xDateFT(m_xBuilder->weld_label("daysft"))
45     , m_xTimeFT(m_xBuilder->weld_label("minutesft"))
46     , m_xDateOffsetED(m_xBuilder->weld_spin_button("offset"))
47     , m_xFormat(m_xBuilder->weld_widget("formatframe"))
48     , m_xFormatLB(m_xBuilder->weld_tree_view("format"))
49     , m_xNumFormatLB(new SwNumFormatTreeView(m_xBuilder->weld_tree_view("numformat")))
50     , m_xFixedCB(m_xBuilder->weld_check_button("fixed"))
51 {
52     m_xTypeLB->make_sorted();
53     m_xFormatLB->make_sorted();
54 
55     auto nWidth = m_xTypeLB->get_approximate_digit_width() * FIELD_COLUMN_WIDTH;
56     auto nHeight = m_xTypeLB->get_height_rows(10);
57 
58     m_xTypeLB->set_size_request(nWidth, nHeight);
59     m_xSelectionLB->set_size_request(nWidth, nHeight);
60     m_xFormatLB->set_size_request(nWidth * 2, nHeight);
61 
62     m_xSelectionLB->connect_row_activated(LINK(this, SwFieldDokPage, TreeViewInsertHdl));
63     m_xFormatLB->connect_row_activated(LINK(this, SwFieldDokPage, TreeViewInsertHdl));
64     m_xNumFormatLB->connect_row_activated(LINK(this, SwFieldDokPage, NumFormatHdl));
65 
66     m_xLevelED->set_max(MAXLEVEL);
67     m_xDateOffsetED->set_range(INT_MIN, INT_MAX);
68     //enable 'active' language selection
69     m_xNumFormatLB->SetShowLanguageControl(true);
70 }
71 
~SwFieldDokPage()72 SwFieldDokPage::~SwFieldDokPage()
73 {
74 }
75 
Reset(const SfxItemSet *)76 void SwFieldDokPage::Reset(const SfxItemSet* )
77 {
78     SavePos(*m_xTypeLB);
79     Init(); // general initialisation
80 
81     // initialise TypeListBox
82     const SwFieldGroupRgn& rRg = SwFieldMgr::GetGroupRange(IsFieldDlgHtmlMode(), GetGroup());
83 
84     m_xTypeLB->freeze();
85     m_xTypeLB->clear();
86 
87     if (!IsFieldEdit())
88     {
89         bool bPage = false;
90         // fill Type-Listbox
91         for(sal_uInt16 i = rRg.nStart; i < rRg.nEnd; ++i)
92         {
93             const SwFieldTypesEnum nTypeId = SwFieldMgr::GetTypeId(i);
94 
95             switch (nTypeId)
96             {
97                 case SwFieldTypesEnum::PreviousPage:
98                 case SwFieldTypesEnum::NextPage:
99                 case SwFieldTypesEnum::PageNumber:
100                     if (!bPage)
101                     {
102                         m_xTypeLB->append(OUString::number(USHRT_MAX), SwResId(FMT_REF_PAGE));
103                         bPage = true;
104                     }
105                     break;
106 
107                 default:
108                     m_xTypeLB->append(OUString::number(static_cast<sal_uInt16>(nTypeId)), SwFieldMgr::GetTypeStr(i));
109                     break;
110             }
111         }
112     }
113     else
114     {
115         const SwField* pCurField = GetCurField();
116         SwFieldTypesEnum nTypeId = pCurField->GetTypeId();
117         if (nTypeId == SwFieldTypesEnum::FixedDate)
118             nTypeId = SwFieldTypesEnum::Date;
119         if (nTypeId == SwFieldTypesEnum::FixedTime)
120             nTypeId = SwFieldTypesEnum::Time;
121         m_xTypeLB->append(OUString::number(static_cast<sal_uInt16>(nTypeId)), SwFieldMgr::GetTypeStr(SwFieldMgr::GetPos(nTypeId)));
122         m_xNumFormatLB->SetAutomaticLanguage(pCurField->IsAutomaticLanguage());
123         SwWrtShell *pSh = GetWrtShell();
124         if(!pSh)
125             pSh = ::GetActiveWrtShell();
126         if(pSh)
127         {
128             const SvNumberformat* pFormat = pSh->GetNumberFormatter()->GetEntry(pCurField->GetFormat());
129             if(pFormat)
130                 m_xNumFormatLB->SetLanguage(pFormat->GetLanguage());
131         }
132     }
133 
134 
135     m_xTypeLB->thaw();
136 
137     // select old Pos
138     RestorePos(*m_xTypeLB);
139 
140     m_xTypeLB->connect_row_activated(LINK(this, SwFieldDokPage, TreeViewInsertHdl));
141     m_xTypeLB->connect_changed(LINK(this, SwFieldDokPage, TypeHdl));
142     m_xFormatLB->connect_changed(LINK(this, SwFieldDokPage, FormatHdl));
143 
144     if( !IsRefresh() )
145     {
146         const OUString sUserData = GetUserData();
147         sal_Int32 nIdx{ 0 };
148         if (sUserData.getToken(0, ';', nIdx).equalsIgnoreAsciiCase(USER_DATA_VERSION_1))
149         {
150             const sal_uInt16 nVal = static_cast< sal_uInt16 >(sUserData.getToken(0, ';', nIdx).toInt32());
151             if(nVal != USHRT_MAX)
152             {
153                 for (int i = 0, nEntryCount = m_xTypeLB->n_children(); i < nEntryCount; i++)
154                 {
155                     if (nVal == m_xTypeLB->get_id(i).toUInt32())
156                     {
157                         m_xTypeLB->select(i);
158                         break;
159                     }
160                 }
161             }
162         }
163     }
164     TypeHdl(*m_xTypeLB);
165 
166     if (IsFieldEdit())
167     {
168         nOldSel = m_xSelectionLB->get_selected_index();
169         nOldFormat = GetCurField()->GetFormat();
170         m_xFixedCB->save_state();
171         m_xValueED->save_value();
172         m_xLevelED->save_value();
173         m_xDateOffsetED->save_value();
174     }
175 }
176 
IMPL_LINK_NOARG(SwFieldDokPage,TypeHdl,weld::TreeView &,void)177 IMPL_LINK_NOARG(SwFieldDokPage, TypeHdl, weld::TreeView&, void)
178 {
179     // save old ListBoxPos
180     const sal_Int32 nOld = GetTypeSel();
181 
182     // current ListBoxPos
183     SetTypeSel(m_xTypeLB->get_selected_index());
184 
185     if(GetTypeSel() == -1)
186     {
187         SetTypeSel(0);
188         m_xTypeLB->select(0);
189     }
190 
191     if (nOld == GetTypeSel())
192         return;
193 
194     size_t nCount;
195 
196     m_xDateFT->hide();
197     m_xTimeFT->hide();
198 
199     SwFieldTypesEnum nTypeId = static_cast<SwFieldTypesEnum>(m_xTypeLB->get_id(GetTypeSel()).toUInt32());
200 
201     // fill Selection-Listbox
202     m_xSelectionLB->clear();
203 
204     if (nTypeId != SwFieldTypesEnum::Unknown)
205     {
206         std::vector<OUString> aLst;
207         GetFieldMgr().GetSubTypes(nTypeId, aLst);
208 
209         if (nTypeId != SwFieldTypesEnum::Author)
210             nCount = aLst.size();
211         else
212             nCount = GetFieldMgr().GetFormatCount(nTypeId, IsFieldDlgHtmlMode());
213 
214         for (size_t i = 0; i < nCount; ++i)
215         {
216             if (!IsFieldEdit())
217             {
218                 OUString sId(OUString::number(i));
219                 if (nTypeId != SwFieldTypesEnum::Author)
220                     m_xSelectionLB->append(sId, aLst[i]);
221                 else
222                     m_xSelectionLB->append(sId, GetFieldMgr().GetFormatStr(nTypeId, i));
223             }
224             else
225             {
226                 bool bInsert = false;
227 
228                 OUString sId(OUString::number(i));
229 
230                 switch (nTypeId)
231                 {
232                     case SwFieldTypesEnum::Date:
233                     case SwFieldTypesEnum::Time:
234                         m_xSelectionLB->append(sId, aLst[i]);
235                         if (static_cast<SwDateTimeField*>(GetCurField())->IsFixed() && !i)
236                             m_xSelectionLB->select_id(sId);
237                         if (!static_cast<SwDateTimeField*>(GetCurField())->IsFixed() && i)
238                             m_xSelectionLB->select_id(sId);
239                         break;
240                     case SwFieldTypesEnum::ExtendedUser:
241                     case SwFieldTypesEnum::DocumentStatistics:
242                         m_xSelectionLB->append(sId, aLst[i]);
243                         if (GetCurField()->GetSubType() == i)
244                             m_xSelectionLB->select_id(sId);
245                         break;
246 
247                     case SwFieldTypesEnum::Author:
248                     {
249                         const OUString sFormat(GetFieldMgr().GetFormatStr(nTypeId, i));
250                         m_xSelectionLB->append(sId, sFormat);
251                         m_xSelectionLB->select_text(GetFieldMgr().GetFormatStr(nTypeId, GetCurField()->GetFormat()));
252                         break;
253                     }
254 
255                     default:
256                         if (aLst[i] == GetCurField()->GetPar1())
257                             bInsert = true;
258                         break;
259                 }
260                 if (bInsert)
261                 {
262                     m_xSelectionLB->append(sId, aLst[i]);
263                     break;
264                 }
265             }
266         }
267         m_xSelectionLB->connect_changed(Link<weld::TreeView&,void>());
268     }
269     else
270     {
271         AddSubType(SwFieldTypesEnum::PageNumber);
272         AddSubType(SwFieldTypesEnum::PreviousPage);
273         AddSubType(SwFieldTypesEnum::NextPage);
274         nTypeId = static_cast<SwFieldTypesEnum>(m_xSelectionLB->get_id(0).toUInt32());
275         nCount = 3;
276         m_xSelectionLB->connect_changed(LINK(this, SwFieldDokPage, SubTypeHdl));
277     }
278 
279     bool bEnable = nCount != 0;
280 
281     if (bEnable && m_xSelectionLB->get_selected_index() == -1)
282         m_xSelectionLB->select(0);
283 
284     m_xSelection->set_sensitive( bEnable );
285 
286     // fill Format-Listbox
287     sal_Int32 nSize = FillFormatLB(nTypeId);
288 
289     bool bValue = false, bLevel = false, bNumFormat = false, bOffset = false;
290     bool bFormat = nSize != 0;
291     bool bOneArea = false;
292     bool bFixed = false;
293     SvNumFormatType nFormatType = SvNumFormatType::ALL;
294 
295     switch (nTypeId)
296     {
297         case SwFieldTypesEnum::Date:
298             bFormat = bNumFormat = bOneArea = bOffset = true;
299 
300             nFormatType = SvNumFormatType::DATE;
301 
302             m_xDateFT->show();
303 
304             m_xDateOffsetED->set_range(INT_MIN, INT_MAX);    // no limit
305 
306             if (IsFieldEdit())
307                 m_xDateOffsetED->set_value( static_cast<SwDateTimeField*>(GetCurField())->GetOffset() / 24 / 60);
308             break;
309 
310         case SwFieldTypesEnum::Time:
311             bFormat = bNumFormat = bOneArea = bOffset = true;
312 
313             nFormatType = SvNumFormatType::TIME;
314 
315             m_xTimeFT->show();
316 
317             m_xDateOffsetED->set_range(-1440, 1440);  // one day
318 
319             if (IsFieldEdit())
320                 m_xDateOffsetED->set_value( static_cast<SwDateTimeField*>(GetCurField())->GetOffset() );
321             break;
322 
323         case SwFieldTypesEnum::PreviousPage:
324         case SwFieldTypesEnum::NextPage:
325             if (IsFieldEdit())
326             {
327                 const sal_uInt16 nTmp = m_xFormatLB->get_selected_id().toUInt32();
328 
329                 if(SVX_NUM_CHAR_SPECIAL != nTmp)
330                 {
331                     sal_Int32 nOff = GetCurField()->GetPar2().toInt32();
332                     if( SwFieldTypesEnum::NextPage == nTypeId && 1 != nOff )
333                         m_xValueED->set_text(
334                             OUString::number(nOff - 1) );
335                     else if( SwFieldTypesEnum::PreviousPage == nTypeId && -1 != nOff )
336                         m_xValueED->set_text(
337                             OUString::number(nOff + 1) );
338                     else
339                         m_xValueED->set_text(OUString());
340                 }
341                 else
342                     m_xValueED->set_text(static_cast<SwPageNumberField*>(GetCurField())->GetUserString());
343             }
344             bValue = true;
345             break;
346 
347         case SwFieldTypesEnum::Chapter:
348             m_xValueFT->set_label(SwResId(STR_LEVEL));
349             if (IsFieldEdit())
350                 m_xLevelED->set_text(OUString::number(static_cast<SwChapterField*>(GetCurField())->GetLevel(GetWrtShell()->GetLayout()) + 1));
351             bLevel = true;
352             break;
353 
354         case SwFieldTypesEnum::PageNumber:
355             m_xValueFT->set_label( SwResId( STR_OFFSET ));
356             if (IsFieldEdit())
357                 m_xValueED->set_text(GetCurField()->GetPar2());
358             bValue = true;
359             break;
360 
361         case SwFieldTypesEnum::ExtendedUser:
362         case SwFieldTypesEnum::Author:
363         case SwFieldTypesEnum::Filename:
364             bFixed = true;
365             break;
366 
367         default:
368             break;
369     }
370 
371     if (bNumFormat)
372     {
373         if (IsFieldEdit())
374         {
375             m_xNumFormatLB->SetDefFormat(GetCurField()->GetFormat());
376 
377             if (m_xNumFormatLB->GetFormatType() == (SvNumFormatType::DATE|SvNumFormatType::TIME))
378             {
379                 // always set Format-Type because otherwise when date/time formats are combined,
380                 // both formats would be displayed at the same time
381                 m_xNumFormatLB->SetFormatType(SvNumFormatType::ALL);
382                 m_xNumFormatLB->SetFormatType(nFormatType);
383                 // set correct format once again
384                 m_xNumFormatLB->SetDefFormat(GetCurField()->GetFormat());
385             }
386         }
387         else
388             m_xNumFormatLB->SetFormatType(nFormatType);
389 
390         m_xNumFormatLB->SetOneArea(bOneArea);
391     }
392 
393     m_xFormatLB->set_visible(!bNumFormat);
394     m_xNumFormatLB->set_visible(bNumFormat);
395 
396     m_xValueFT->set_visible(bValue);
397     m_xValueED->set_visible(bValue);
398     m_xLevelFT->set_visible(bLevel);
399     m_xLevelED->set_visible(bLevel);
400     m_xDateOffsetED->set_visible(bOffset);
401     m_xFixedCB->set_visible(!bValue && !bLevel && !bOffset);
402 
403     m_xFormat->set_sensitive(bFormat);
404     m_xFixedCB->set_sensitive(bFixed);
405 
406     if (IsFieldEdit())
407         m_xFixedCB->set_active((GetCurField()->GetFormat() & AF_FIXED) != 0 && bFixed);
408 
409     if (m_xNumFormatLB->get_selected_index() == -1)
410         m_xNumFormatLB->select(0);
411     m_xValueFT->set_sensitive(bValue || bLevel || bOffset);
412     m_xValueED->set_sensitive(bValue);
413 }
414 
AddSubType(SwFieldTypesEnum nTypeId)415 void SwFieldDokPage::AddSubType(SwFieldTypesEnum nTypeId)
416 {
417     m_xSelectionLB->append(OUString::number(static_cast<sal_uInt16>(nTypeId)), SwFieldType::GetTypeStr(nTypeId));
418 }
419 
IMPL_LINK_NOARG(SwFieldDokPage,SubTypeHdl,weld::TreeView &,void)420 IMPL_LINK_NOARG(SwFieldDokPage, SubTypeHdl, weld::TreeView&, void)
421 {
422     sal_Int32 nPos = m_xSelectionLB->get_selected_index();
423     if(nPos == -1)
424         nPos = 0;
425 
426     const SwFieldTypesEnum nTypeId = static_cast<SwFieldTypesEnum>(m_xSelectionLB->get_id(nPos).toUInt32());
427     FillFormatLB(nTypeId);
428 
429     const char* pTextRes = nullptr;
430     switch (nTypeId)
431     {
432     case SwFieldTypesEnum::Chapter:
433         pTextRes = STR_LEVEL;
434         break;
435 
436     case SwFieldTypesEnum::PreviousPage:
437     case SwFieldTypesEnum::NextPage:
438         pTextRes = SVX_NUM_CHAR_SPECIAL == m_xFormatLB->get_selected_id().toUInt32()
439                         ? STR_VALUE : STR_OFFSET;
440         break;
441 
442     case SwFieldTypesEnum::PageNumber:
443         pTextRes = STR_OFFSET;
444         break;
445     default: break;
446     }
447 
448     if (pTextRes)
449         m_xValueFT->set_label(SwResId(pTextRes));
450 }
451 
FillFormatLB(SwFieldTypesEnum nTypeId)452 sal_Int32 SwFieldDokPage::FillFormatLB(SwFieldTypesEnum nTypeId)
453 {
454     // fill Format-Listbox
455     m_xFormatLB->clear();
456 
457     if (nTypeId == SwFieldTypesEnum::Author)
458         return m_xFormatLB->n_children();
459 
460     const sal_uInt16 nSize = GetFieldMgr().GetFormatCount(nTypeId, IsFieldDlgHtmlMode());
461 
462     for( sal_uInt16 i = 0; i < nSize; ++i )
463     {
464         const sal_uInt16 nFormatId = GetFieldMgr().GetFormatId( nTypeId, i );
465         OUString sId(OUString::number(nFormatId));
466         m_xFormatLB->append(sId, GetFieldMgr().GetFormatStr(nTypeId, i));
467         if (IsFieldEdit() && nFormatId == (GetCurField()->GetFormat() & ~AF_FIXED))
468             m_xFormatLB->select_id(sId);
469     }
470 
471     if (nSize && m_xFormatLB->get_selected_index() == -1)
472     {
473         m_xFormatLB->select_text( SwResId(FMT_NUM_PAGEDESC) );
474         if (m_xFormatLB->get_selected_index() == -1)
475         {
476             m_xFormatLB->select_text( SwResId(FMT_NUM_ARABIC) );
477             if (m_xFormatLB->get_selected_index() == -1)
478                 m_xFormatLB->select( 0 );
479         }
480     }
481 
482     FormatHdl(*m_xFormatLB);
483 
484     return nSize;
485 }
486 
IMPL_LINK_NOARG(SwFieldDokPage,FormatHdl,weld::TreeView &,void)487 IMPL_LINK_NOARG(SwFieldDokPage, FormatHdl, weld::TreeView&, void)
488 {
489     SwFieldTypesEnum nTypeId = static_cast<SwFieldTypesEnum>(m_xTypeLB->get_id(GetTypeSel()).toUInt32());
490 
491     if (nTypeId == SwFieldTypesEnum::Unknown)
492     {
493         sal_Int32 nPos = m_xSelectionLB->get_selected_index();
494         if(nPos == -1)
495             nPos = 0;
496 
497         nTypeId = static_cast<SwFieldTypesEnum>(m_xSelectionLB->get_id(nPos).toUInt32());
498     }
499 
500     if (nTypeId != SwFieldTypesEnum::NextPage && nTypeId != SwFieldTypesEnum::PreviousPage)
501         return;
502 
503     // Prev/Next - PageNumFields special treatment:
504     sal_uInt16 nTmp = m_xFormatLB->get_selected_id().toUInt32();
505     const OUString sOldText( m_xValueFT->get_label() );
506     const OUString sNewText( SwResId( SVX_NUM_CHAR_SPECIAL == nTmp  ? STR_VALUE
507                                                      : STR_OFFSET ));
508 
509     if (sOldText != sNewText)
510         m_xValueFT->set_label(sNewText);
511 
512     if (sOldText != m_xValueFT->get_label())
513         m_xValueED->set_text(OUString());
514 }
515 
FillItemSet(SfxItemSet *)516 bool SwFieldDokPage::FillItemSet(SfxItemSet* )
517 {
518     SwFieldTypesEnum nTypeId = static_cast<SwFieldTypesEnum>(m_xTypeLB->get_id(GetTypeSel()).toUInt32());
519 
520     if (nTypeId == SwFieldTypesEnum::Unknown)
521     {
522         sal_Int32 nPos = m_xSelectionLB->get_selected_index();
523         if(nPos == -1)
524             nPos = 0;
525         nTypeId = static_cast<SwFieldTypesEnum>(m_xSelectionLB->get_id(nPos).toUInt32());
526     }
527 
528     OUString aVal(m_xValueED->get_text());
529     sal_uLong nFormat = 0;
530     sal_uInt16 nSubType = 0;
531 
532     if (m_xFormatLB->get_sensitive())
533     {
534         sal_Int32 nPos = m_xFormatLB->get_selected_index();
535         if(nPos != -1)
536             nFormat = m_xFormatLB->get_id(nPos).toUInt32();
537     }
538 
539     if (m_xSelectionLB->get_sensitive())
540     {
541         sal_Int32 nPos = m_xSelectionLB->get_selected_index();
542         if(nPos != -1)
543             nSubType = m_xSelectionLB->get_id(nPos).toUInt32();
544     }
545 
546     switch (nTypeId)
547     {
548         case SwFieldTypesEnum::Author:
549             nFormat = nSubType;
550             nSubType = 0;
551             [[fallthrough]];
552         case SwFieldTypesEnum::ExtendedUser:
553             nFormat |= m_xFixedCB->get_active() ? AF_FIXED : 0;
554             break;
555 
556         case SwFieldTypesEnum::Filename:
557             nFormat |= m_xFixedCB->get_active() ? FF_FIXED : 0;
558             break;
559 
560         case SwFieldTypesEnum::Date:
561         case SwFieldTypesEnum::Time:
562         {
563             nFormat = m_xNumFormatLB->GetFormat();
564             tools::Long nVal = static_cast< tools::Long >(m_xDateOffsetED->get_value());
565             if (nTypeId == SwFieldTypesEnum::Date)
566                 aVal = OUString::number(nVal * 60 * 24);
567             else
568                 aVal = OUString::number(nVal);
569             break;
570         }
571 
572         case SwFieldTypesEnum::NextPage:
573         case SwFieldTypesEnum::PreviousPage:
574         case SwFieldTypesEnum::PageNumber:
575         case SwFieldTypesEnum::GetRefPage:
576         {
577             if( SVX_NUM_CHAR_SPECIAL != nFormat &&
578                 (SwFieldTypesEnum::PreviousPage == nTypeId || SwFieldTypesEnum::NextPage == nTypeId))
579             {
580                 sal_Int32 nVal = m_xValueED->get_text().toInt32();
581                 aVal = OUString::number(nVal);
582             }
583             break;
584         }
585 
586         case SwFieldTypesEnum::Chapter:
587             aVal = m_xLevelED->get_text();
588             break;
589 
590         default:
591             break;
592     }
593 
594     if (!IsFieldEdit() ||
595         nOldSel != m_xSelectionLB->get_selected_index() ||
596         nOldFormat != nFormat ||
597         m_xFixedCB->get_state_changed_from_saved() ||
598         m_xValueED->get_value_changed_from_saved() ||
599         m_xLevelED->get_value_changed_from_saved() ||
600         m_xDateOffsetED->get_value_changed_from_saved())
601     {
602         InsertField(nTypeId, nSubType, OUString(), aVal, nFormat, ' ', m_xNumFormatLB->IsAutomaticLanguage());
603     }
604 
605     return false;
606 }
607 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * const pAttrSet)608 std::unique_ptr<SfxTabPage> SwFieldDokPage::Create(weld::Container* pPage, weld::DialogController* pController,
609                                           const SfxItemSet *const pAttrSet)
610 {
611     return std::make_unique<SwFieldDokPage>(pPage, pController, pAttrSet);
612 }
613 
GetGroup()614 sal_uInt16 SwFieldDokPage::GetGroup()
615 {
616     return GRP_DOC;
617 }
618 
FillUserData()619 void    SwFieldDokPage::FillUserData()
620 {
621     const sal_Int32 nEntryPos = m_xTypeLB->get_selected_index();
622     const sal_uInt16 nTypeSel = ( -1 == nEntryPos )
623         ? USHRT_MAX : m_xTypeLB->get_id(nEntryPos).toUInt32();
624     SetUserData(USER_DATA_VERSION ";" + OUString::number( nTypeSel ));
625 }
626 
627 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
628