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 <svtools/ruler.hxx>
21 #include <svtools/unitconv.hxx>
22 #include <svx/svxids.hrc>
23 #include <vcl/settings.hxx>
24 #include <vcl/svapp.hxx>
25 
26 #include <editeng/lrspitem.hxx>
27 #include <tabstpge.hxx>
28 #include <svx/dlgutil.hxx>
29 #include <svl/cjkoptions.hxx>
30 #include <unotools/localedatawrapper.hxx>
31 #include <svl/intitem.hxx>
32 
33 constexpr FieldUnit eDefUnit = FieldUnit::MM_100TH;
34 
35 const sal_uInt16 SvxTabulatorTabPage::pRanges[] =
36 {
37     SID_ATTR_TABSTOP,
38     SID_ATTR_TABSTOP_OFFSET,
39     0
40 };
41 
FillUpWithDefTabs_Impl(tools::Long nDefDist,SvxTabStopItem & rTabs)42 static void FillUpWithDefTabs_Impl( tools::Long nDefDist, SvxTabStopItem& rTabs )
43 {
44     if( rTabs.Count() )
45         return;
46     {
47         SvxTabStop aSwTabStop( nDefDist, SvxTabAdjust::Default );
48         rTabs.Insert( aSwTabStop );
49     }
50 }
51 
Paint(vcl::RenderContext & rRenderContext,const::tools::Rectangle &)52 void TabWin_Impl::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle&)
53 {
54     // Paint tabulators
55     Point aPoint;
56     Size aSize(GetOutputSizePixel());
57     aPoint.setX( aSize.Width() / 2 );
58     aPoint.setY( aSize.Height() / 2 );
59     Ruler::DrawTab(rRenderContext, rRenderContext.GetSettings().GetStyleSettings().GetFontColor(), aPoint, nTabStyle);
60 }
61 
SvxTabulatorTabPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rAttr)62 SvxTabulatorTabPage::SvxTabulatorTabPage(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet& rAttr)
63     : SfxTabPage(pPage, pController, "cui/ui/paratabspage.ui", "ParagraphTabsPage", &rAttr)
64     , aCurrentTab(0)
65     , aNewTabs(std::make_unique<SvxTabStopItem>(0, 0, SvxTabAdjust::Left, GetWhich(SID_ATTR_TABSTOP)))
66     , nDefDist(0)
67     , m_xTabSpin(m_xBuilder->weld_metric_spin_button("SP_TABPOS", FieldUnit::CM))
68     , m_xTabBox(m_xBuilder->weld_entry_tree_view("tabgrid", "ED_TABPOS", "LB_TABPOS"))
69     , m_xCenterTab(m_xBuilder->weld_radio_button("radiobuttonBTN_TABTYPE_CENTER"))
70     , m_xDezTab(m_xBuilder->weld_radio_button("radiobuttonBTN_TABTYPE_DECIMAL"))
71     , m_xDezChar(m_xBuilder->weld_entry("entryED_TABTYPE_DECCHAR"))
72     , m_xDezCharLabel(m_xBuilder->weld_label("labelFT_TABTYPE_DECCHAR"))
73     // lower radio buttons
74     , m_xNoFillChar(m_xBuilder->weld_radio_button("radiobuttonBTN_FILLCHAR_NO"))
75     , m_xFillPoints(m_xBuilder->weld_radio_button("radiobuttonBTN_FILLCHAR_POINTS"))
76     , m_xFillDashLine(m_xBuilder->weld_radio_button("radiobuttonBTN_FILLCHAR_DASHLINE"))
77     , m_xFillSolidLine(m_xBuilder->weld_radio_button("radiobuttonBTN_FILLCHAR_UNDERSCORE"))
78     , m_xFillSpecial(m_xBuilder->weld_radio_button("radiobuttonBTN_FILLCHAR_OTHER"))
79     , m_xFillChar(m_xBuilder->weld_entry("entryED_FILLCHAR_OTHER"))
80     // button bar
81     , m_xNewBtn(m_xBuilder->weld_button("buttonBTN_NEW"))
82     , m_xDelAllBtn(m_xBuilder->weld_button("buttonBTN_DELALL"))
83     , m_xDelBtn(m_xBuilder->weld_button("buttonBTN_DEL"))
84     , m_xTypeFrame(m_xBuilder->weld_container("frameFL_TABTYPE"))
85     , m_xFillFrame(m_xBuilder->weld_container("frameFL_FILLCHAR"))
86     // the tab images
87     , m_xLeftWin(new weld::CustomWeld(*m_xBuilder, "drawingareaWIN_TABLEFT", m_aLeftWin))
88     , m_xRightWin(new weld::CustomWeld(*m_xBuilder, "drawingareaWIN_TABRIGHT", m_aRightWin))
89     , m_xCenterWin(new weld::CustomWeld(*m_xBuilder, "drawingareaWIN_TABCENTER", m_aCenterWin))
90     , m_xDezWin(new weld::CustomWeld(*m_xBuilder, "drawingareaWIN_TABDECIMAL", m_aDezWin))
91 {
92     m_aLeftWin.SetTabStyle(sal_uInt16(RULER_TAB_LEFT|WB_HORZ));
93     m_aRightWin.SetTabStyle(sal_uInt16(RULER_TAB_RIGHT|WB_HORZ));
94     m_aCenterWin.SetTabStyle(sal_uInt16(RULER_TAB_CENTER|WB_HORZ));
95     m_aDezWin.SetTabStyle(sal_uInt16(RULER_TAB_DECIMAL|WB_HORZ));
96     //upper radiobuttons
97     SvtCJKOptions aCJKOptions;
98     m_xLeftTab = m_xBuilder->weld_radio_button(aCJKOptions.IsAsianTypographyEnabled() ? "radiobuttonST_LEFTTAB_ASIAN" : "radiobuttonBTN_TABTYPE_LEFT");
99     m_xRightTab = m_xBuilder->weld_radio_button(aCJKOptions.IsAsianTypographyEnabled() ? "radiobuttonST_RIGHTTAB_ASIAN" : "radiobuttonBTN_TABTYPE_RIGHT");
100     m_xLeftTab->show();
101     m_xRightTab->show();
102 
103     // This page needs ExchangeSupport
104     SetExchangeSupport();
105 
106     // Set metric
107     FieldUnit eFUnit = GetModuleFieldUnit( rAttr );
108     SetFieldUnit(*m_xTabSpin, eFUnit);
109 
110     // Initialize buttons
111     m_xNewBtn->connect_clicked(LINK(this,SvxTabulatorTabPage, NewHdl_Impl));
112     m_xDelBtn->connect_clicked(LINK(this,SvxTabulatorTabPage, DelHdl_Impl));
113     m_xDelAllBtn->connect_clicked(LINK(this,SvxTabulatorTabPage, DelAllHdl_Impl));
114 
115     Link<weld::Toggleable&,void> aLink = LINK(this, SvxTabulatorTabPage, TabTypeCheckHdl_Impl);
116     m_xLeftTab->connect_toggled(aLink);
117     m_xRightTab->connect_toggled(aLink);
118     m_xDezTab->connect_toggled(aLink);
119     m_xCenterTab->connect_toggled(aLink);
120 
121     m_xDezChar->connect_focus_out(LINK(this,  SvxTabulatorTabPage, GetDezCharHdl_Impl));
122     m_xDezChar->set_sensitive(false);
123     m_xDezCharLabel->set_sensitive(false);
124 
125     aLink = LINK(this, SvxTabulatorTabPage, FillTypeCheckHdl_Impl);
126     m_xNoFillChar->connect_toggled(aLink);
127     m_xFillPoints->connect_toggled(aLink);
128     m_xFillDashLine->connect_toggled(aLink);
129     m_xFillSolidLine->connect_toggled(aLink);
130     m_xFillSpecial->connect_toggled(aLink);
131     m_xFillChar->connect_focus_out(LINK(this,  SvxTabulatorTabPage, GetFillCharHdl_Impl));
132     m_xFillChar->set_sensitive(false);
133 
134     m_xTabBox->connect_row_activated(LINK(this, SvxTabulatorTabPage, SelectHdl_Impl));
135     m_xTabBox->connect_changed(LINK(this, SvxTabulatorTabPage, ModifyHdl_Impl));
136     m_xTabBox->connect_focus_out(LINK(this,  SvxTabulatorTabPage, ReformatHdl_Impl));
137 
138     // Get the default decimal char from the system
139     const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
140     aCurrentTab.GetDecimal() = rLocaleWrapper.getNumDecimalSep()[0];
141 }
142 
~SvxTabulatorTabPage()143 SvxTabulatorTabPage::~SvxTabulatorTabPage()
144 {
145     m_xDezWin.reset();
146     m_xCenterWin.reset();
147     m_xRightWin.reset();
148     m_xLeftWin.reset();
149     m_xFillChar.reset();
150     m_xDezChar.reset();
151     m_xTabBox.reset();
152 }
153 
FillItemSet(SfxItemSet * rSet)154 bool SvxTabulatorTabPage::FillItemSet(SfxItemSet* rSet)
155 {
156     bool bModified = false;
157 
158     // Put the controls' values in here
159     if (m_xNewBtn->get_sensitive())
160         NewHdl_Impl(nullptr);
161 
162     // Call the LoseFocus-Handler first
163     GetDezCharHdl_Impl(*m_xDezChar);
164     GetFillCharHdl_Impl(*m_xFillChar);
165 
166     FillUpWithDefTabs_Impl(nDefDist, *aNewTabs);
167     SfxItemPool* pPool = rSet->GetPool();
168     MapUnit eUnit = pPool->GetMetric(GetWhich(SID_ATTR_TABSTOP));
169     const SfxPoolItem* pOld = GetOldItem(*rSet, SID_ATTR_TABSTOP);
170 
171     if (MapUnit::Map100thMM != eUnit)
172     {
173         // If the ItemSet contains a LRSpaceItem with negative first line indent,
174         // the TabStopItem needs to have a DefTab at position 0.
175         const SfxPoolItem* pLRSpace;
176         // If not in the new set, then maybe in the old one
177         if (SfxItemState::SET != rSet->GetItemState(GetWhich(SID_ATTR_LRSPACE), true, &pLRSpace))
178             pLRSpace = GetOldItem(*rSet, SID_ATTR_LRSPACE);
179 
180         if (pLRSpace && static_cast<const SvxLRSpaceItem*>(pLRSpace)->GetTextFirstLineOffset() < 0)
181         {
182             SvxTabStop aNull(0, SvxTabAdjust::Default);
183             aNewTabs->Insert(aNull);
184         }
185 
186         std::unique_ptr<SvxTabStopItem> aTmp(aNewTabs->Clone());
187         aTmp->Remove(0, aTmp->Count());
188 
189         for (sal_uInt16 i = 0; i < aNewTabs->Count(); ++i)
190         {
191             SvxTabStop aTmpStop = (*aNewTabs)[i];
192             aTmpStop.GetTabPos() = OutputDevice::LogicToLogic(aTmpStop.GetTabPos(), MapUnit::Map100thMM, eUnit);
193             aTmp->Insert(aTmpStop);
194         }
195 
196         if (!pOld || *static_cast<const SvxTabStopItem*>(pOld) != *aTmp)
197         {
198             rSet->Put(*aTmp);
199             bModified = true;
200         }
201     }
202     else if (!pOld || *static_cast<const SvxTabStopItem*>(pOld) != *aNewTabs)
203     {
204         rSet->Put(*aNewTabs);
205         bModified = true;
206     }
207 
208     return bModified;
209 }
210 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rSet)211 std::unique_ptr<SfxTabPage> SvxTabulatorTabPage::Create(weld::Container* pPage, weld::DialogController* pController, const SfxItemSet* rSet)
212 {
213     return std::make_unique<SvxTabulatorTabPage>(pPage, pController, *rSet);
214 }
215 
Reset(const SfxItemSet * rSet)216 void SvxTabulatorTabPage::Reset(const SfxItemSet* rSet)
217 {
218     SfxItemPool* pPool = rSet->GetPool();
219     MapUnit eUnit = pPool->GetMetric(GetWhich(SID_ATTR_TABSTOP));
220 
221     // Current tabs
222     const SfxPoolItem* pItem = GetItem(*rSet, SID_ATTR_TABSTOP);
223 
224     if (pItem)
225     {
226         if (MapUnit::Map100thMM != eUnit)
227         {
228             std::unique_ptr<SvxTabStopItem> aTmp(static_cast<SvxTabStopItem*>(pItem->Clone()));
229             aNewTabs->Remove(0, aNewTabs->Count());
230 
231             for (sal_uInt16 i = 0; i < aTmp->Count(); ++i)
232             {
233                 SvxTabStop aTmpStop = (*aTmp)[i];
234                 aTmpStop.GetTabPos() = OutputDevice::LogicToLogic(aTmpStop.GetTabPos(), eUnit, MapUnit::Map100thMM);
235                 aNewTabs->Insert(aTmpStop);
236             }
237         }
238         else
239         {
240             aNewTabs.reset(static_cast<SvxTabStopItem*>(pItem->Clone()));
241         }
242     }
243     else
244     {
245         aNewTabs->Remove(0, aNewTabs->Count());
246     }
247 
248     // Default tab distance
249     nDefDist = SVX_TAB_DEFDIST;
250     pItem = GetItem(*rSet, SID_ATTR_TABSTOP_DEFAULTS);
251 
252     if (pItem)
253         nDefDist = OutputDevice::LogicToLogic(tools::Long(static_cast<const SfxUInt16Item*>(pItem)->GetValue()), eUnit, MapUnit::Map100thMM);
254 
255     // Tab pos currently selected
256     sal_uInt16 nTabPos = 0;
257     pItem = GetItem(*rSet, SID_ATTR_TABSTOP_POS);
258 
259     if (pItem)
260         nTabPos = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
261 
262     InitTabPos_Impl(nTabPos);
263 }
264 
DisableControls(const TabulatorDisableFlags nFlag)265 void SvxTabulatorTabPage::DisableControls(const TabulatorDisableFlags nFlag)
266 {
267     if (TabulatorDisableFlags::TypeLeft & nFlag)
268     {
269         m_xLeftTab->set_sensitive(false);
270         m_xLeftWin->set_sensitive(false);
271     }
272     if (TabulatorDisableFlags::TypeRight & nFlag)
273     {
274         m_xRightTab->set_sensitive(false);
275         m_xRightWin->set_sensitive(false);
276     }
277     if (TabulatorDisableFlags::TypeCenter & nFlag)
278     {
279         m_xCenterTab->set_sensitive(false);
280         m_xCenterWin->set_sensitive(false);
281     }
282     if (TabulatorDisableFlags::TypeDecimal & nFlag)
283     {
284         m_xDezTab->set_sensitive(false);
285         m_xDezWin->set_sensitive(false);
286         m_xDezCharLabel->set_sensitive(false);
287         m_xDezChar->set_sensitive(false);
288     }
289     if (TabulatorDisableFlags::TypeMask & nFlag)
290         m_xTypeFrame->set_sensitive(false);
291     if (TabulatorDisableFlags::FillNone & nFlag)
292         m_xNoFillChar->set_sensitive(false);
293     if (TabulatorDisableFlags::FillPoint & nFlag)
294         m_xFillPoints->set_sensitive(false);
295     if (TabulatorDisableFlags::FillDashLine & nFlag)
296         m_xFillDashLine->set_sensitive(false);
297     if (TabulatorDisableFlags::FillSolidLine & nFlag)
298         m_xFillSolidLine->set_sensitive(false);
299     if (TabulatorDisableFlags::FillSpecial & nFlag)
300     {
301         m_xFillSpecial->set_sensitive(false);
302         m_xFillChar->set_sensitive(false);
303     }
304     if (TabulatorDisableFlags::FillMask & nFlag)
305         m_xFillFrame->set_sensitive(false);
306 }
307 
DeactivatePage(SfxItemSet * _pSet)308 DeactivateRC SvxTabulatorTabPage::DeactivatePage( SfxItemSet* _pSet )
309 {
310     if ( _pSet )
311         FillItemSet( _pSet );
312     return DeactivateRC::LeavePage;
313 }
314 
InitTabPos_Impl(sal_uInt16 nTabPos)315 void SvxTabulatorTabPage::InitTabPos_Impl( sal_uInt16 nTabPos )
316 {
317     m_xTabBox->clear();
318 
319     tools::Long nOffset = 0;
320     const SfxPoolItem* pItem = nullptr;
321     if (GetItemSet().GetItemState(SID_ATTR_TABSTOP_OFFSET, true, &pItem) == SfxItemState::SET)
322     {
323         nOffset = static_cast<const SfxInt32Item*>(pItem)->GetValue();
324         MapUnit eUnit = GetItemSet().GetPool()->GetMetric(GetWhich(SID_ATTR_TABSTOP));
325         nOffset = OutputDevice::LogicToLogic(nOffset, eUnit, MapUnit::Map100thMM);
326     }
327 
328     // Correct current TabPos and default tabs
329     for ( sal_uInt16 i = 0; i < aNewTabs->Count(); i++ )
330     {
331         if ( (*aNewTabs)[i].GetAdjustment() != SvxTabAdjust::Default )
332         {
333             m_xTabSpin->set_value(m_xTabSpin->normalize((*aNewTabs)[i].GetTabPos() + nOffset ), eDefUnit);
334             m_xTabBox->append_text(m_xTabSpin->get_text());
335         }
336         else
337         {
338             aNewTabs->Remove( i-- );
339         }
340     }
341 
342     // Select current tabulator
343     const sal_uInt16 nSize = aNewTabs->Count();
344 
345     if ( nTabPos >= nSize )
346         nTabPos = 0;
347 
348     // Switch off all RadioButtons for a start
349     m_xLeftTab->set_active(true);
350     m_xNoFillChar->set_active(true);
351 
352     if (m_xTabBox->get_count() > 0)
353     {
354         m_xTabBox->set_active(nTabPos);
355         aCurrentTab = (*aNewTabs)[nTabPos];
356 
357         SetFillAndTabType_Impl();
358         m_xNewBtn->set_sensitive(false);
359         m_xDelBtn->set_sensitive(true);
360     }
361     else
362     {   // If no entry, 0 is the default value
363         m_xTabSpin->set_value(0, eDefUnit);
364         m_xTabBox->set_entry_text(m_xTabSpin->get_text());
365 
366         m_xNewBtn->set_sensitive(true);
367         m_xDelBtn->set_sensitive(false);
368     }
369 }
370 
SetFillAndTabType_Impl()371 void SvxTabulatorTabPage::SetFillAndTabType_Impl()
372 {
373     weld::RadioButton* pTypeBtn = nullptr;
374     weld::RadioButton* pFillBtn = nullptr;
375 
376     m_xDezChar->set_sensitive(false);
377     m_xDezCharLabel->set_sensitive(false);
378 
379     if ( aCurrentTab.GetAdjustment() == SvxTabAdjust::Left )
380         pTypeBtn = m_xLeftTab.get();
381     else if ( aCurrentTab.GetAdjustment() == SvxTabAdjust::Right )
382         pTypeBtn = m_xRightTab.get();
383     else if ( aCurrentTab.GetAdjustment() == SvxTabAdjust::Decimal )
384     {
385         pTypeBtn = m_xDezTab.get();
386         m_xDezChar->set_sensitive(true);
387         m_xDezCharLabel->set_sensitive(true);
388         m_xDezChar->set_text(OUString(aCurrentTab.GetDecimal()));
389     }
390     else if ( aCurrentTab.GetAdjustment() == SvxTabAdjust::Center )
391         pTypeBtn = m_xCenterTab.get();
392 
393     if (pTypeBtn)
394         pTypeBtn->set_active(true);
395 
396     m_xFillChar->set_sensitive(false);
397     m_xFillChar->set_text("");
398 
399     if ( aCurrentTab.GetFill() == ' ' )
400         pFillBtn = m_xNoFillChar.get();
401     else if ( aCurrentTab.GetFill() == '-' )
402         pFillBtn = m_xFillDashLine.get();
403     else if ( aCurrentTab.GetFill() == '_' )
404         pFillBtn = m_xFillSolidLine.get();
405     else if ( aCurrentTab.GetFill() == '.' )
406         pFillBtn = m_xFillPoints.get();
407     else
408     {
409         pFillBtn = m_xFillSpecial.get();
410         m_xFillChar->set_sensitive(true);
411         m_xFillChar->set_text(OUString(aCurrentTab.GetFill()));
412     }
413     pFillBtn->set_active(true);
414 }
415 
IMPL_LINK(SvxTabulatorTabPage,NewHdl_Impl,weld::Button &,rBtn,void)416 IMPL_LINK(SvxTabulatorTabPage, NewHdl_Impl, weld::Button&, rBtn, void)
417 {
418     NewHdl_Impl(&rBtn);
419 }
420 
NewHdl_Impl(const weld::Button * pBtn)421 void SvxTabulatorTabPage::NewHdl_Impl(const weld::Button* pBtn)
422 {
423     // Add a new one and select it
424     // Get the value from the display
425     ReformatHdl_Impl(*m_xTabBox);
426     m_xTabSpin->set_text(m_xTabBox->get_active_text());
427     auto nVal = m_xTabSpin->denormalize(m_xTabSpin->get_value(eDefUnit));
428 
429     // If the pBtn == 0 && the value == 0 then do not create a tab, because we create via OK
430     if (nVal == 0 && pBtn == nullptr)
431         return;
432 
433     tools::Long nOffset = 0;
434     const SfxPoolItem* pItem = nullptr;
435 
436     if ( GetItemSet().GetItemState( SID_ATTR_TABSTOP_OFFSET, true, &pItem ) ==
437          SfxItemState::SET )
438     {
439         nOffset = static_cast<const SfxInt32Item*>(pItem)->GetValue();
440         MapUnit eUnit = GetItemSet().GetPool()->GetMetric( GetWhich( SID_ATTR_TABSTOP ) );
441         nOffset = OutputDevice::LogicToLogic( nOffset, eUnit, MapUnit::Map100thMM  );
442     }
443     const tools::Long nReal = nVal - nOffset;
444     sal_Int32 nSize = m_xTabBox->get_count();
445 
446     sal_Int32 i;
447     for( i = 0; i < nSize; i++ )
448     {
449         if ( nReal < (*aNewTabs)[i].GetTabPos() )
450             break;
451     }
452 
453     // Make ListBox entry
454     m_xTabSpin->set_value(m_xTabSpin->normalize(nVal), eDefUnit);
455     m_xTabBox->insert_text(i, m_xTabSpin->get_text());
456 
457     aCurrentTab.GetTabPos() = nReal;
458     SvxTabAdjust eAdj = SvxTabAdjust::Left;
459 
460     if (m_xRightTab->get_active())
461         eAdj = SvxTabAdjust::Right;
462     else if (m_xCenterTab->get_active())
463         eAdj = SvxTabAdjust::Center;
464     else if (m_xDezTab->get_active())
465         eAdj = SvxTabAdjust::Decimal;
466 
467     aCurrentTab.GetAdjustment() = eAdj;
468     aNewTabs->Insert( aCurrentTab );
469 
470     m_xNewBtn->set_sensitive(false);
471     m_xDelBtn->set_sensitive(true);
472     m_xTabBox->grab_focus();
473 
474     // Set the selection into the position Edit
475     m_xTabBox->select_entry_region(0, -1);
476 }
477 
FindCurrentTab()478 int SvxTabulatorTabPage::FindCurrentTab()
479 {
480     return m_xTabBox->find_text(FormatTab());
481 }
482 
IMPL_LINK_NOARG(SvxTabulatorTabPage,DelHdl_Impl,weld::Button &,void)483 IMPL_LINK_NOARG(SvxTabulatorTabPage, DelHdl_Impl, weld::Button&, void)
484 {
485     int nPos = FindCurrentTab();
486     if (nPos == -1)
487         return;
488 
489     if (m_xTabBox->get_count() == 1)
490     {
491         DelAllHdl_Impl(*m_xDelAllBtn);
492         return;
493     }
494 
495     // Delete Tab
496     m_xTabBox->remove(nPos);
497     aNewTabs->Remove( nPos );
498 
499     // Reset aCurrentTab
500     const sal_uInt16 nSize = aNewTabs->Count();
501 
502     if ( nSize > 0 )
503     {
504         // Correct Pos
505         nPos = ( ( nSize - 1 ) >= nPos) ? nPos : nPos - 1;
506         m_xTabBox->set_active(nPos);
507         aCurrentTab = (*aNewTabs)[nPos];
508     }
509 
510     // If no Tabs Enable Disable Controls
511     if (m_xTabBox->get_count() == 0)
512     {
513         m_xDelBtn->set_sensitive(false);
514         m_xNewBtn->set_sensitive(true);
515         m_xTabBox->grab_focus();
516     }
517 }
518 
IMPL_LINK_NOARG(SvxTabulatorTabPage,DelAllHdl_Impl,weld::Button &,void)519 IMPL_LINK_NOARG(SvxTabulatorTabPage, DelAllHdl_Impl, weld::Button&, void)
520 {
521     if ( aNewTabs->Count() )
522     {
523         aNewTabs = std::make_unique<SvxTabStopItem>(GetWhich(SID_ATTR_TABSTOP));
524         InitTabPos_Impl();
525     }
526 }
527 
IMPL_LINK(SvxTabulatorTabPage,TabTypeCheckHdl_Impl,weld::Toggleable &,rBox,void)528 IMPL_LINK(SvxTabulatorTabPage, TabTypeCheckHdl_Impl, weld::Toggleable&, rBox, void)
529 {
530     if (!rBox.get_active())
531         return;
532 
533     SvxTabAdjust eAdj;
534     m_xDezChar->set_sensitive(false);
535     m_xDezCharLabel->set_sensitive(false);
536     m_xDezChar->set_text("");
537 
538     if (&rBox == m_xLeftTab.get())
539         eAdj = SvxTabAdjust::Left;
540     else if (&rBox == m_xRightTab.get())
541         eAdj = SvxTabAdjust::Right;
542     else if (&rBox == m_xCenterTab.get())
543         eAdj = SvxTabAdjust::Center;
544     else
545     {
546         eAdj = SvxTabAdjust::Decimal;
547         m_xDezChar->set_sensitive(true);
548         m_xDezCharLabel->set_sensitive(true);
549         m_xDezChar->set_text(OUString(aCurrentTab.GetDecimal()));
550     }
551 
552     aCurrentTab.GetAdjustment() = eAdj;
553     int nPos = FindCurrentTab();
554     if (nPos != -1)
555     {
556         aNewTabs->Remove( nPos );
557         aNewTabs->Insert( aCurrentTab );
558     }
559 }
560 
IMPL_LINK(SvxTabulatorTabPage,FillTypeCheckHdl_Impl,weld::Toggleable &,rBox,void)561 IMPL_LINK(SvxTabulatorTabPage, FillTypeCheckHdl_Impl, weld::Toggleable&, rBox, void)
562 {
563     if (!rBox.get_active())
564         return;
565 
566     sal_uInt8 cFill = ' ';
567     m_xFillChar->set_text( "" );
568     m_xFillChar->set_sensitive(false);
569 
570     if (&rBox == m_xFillSpecial.get())
571         m_xFillChar->set_sensitive(true);
572     else if (&rBox == m_xNoFillChar.get())
573         cFill = ' ';
574     else if (&rBox == m_xFillSolidLine.get())
575         cFill = '_';
576     else if (&rBox == m_xFillPoints.get())
577         cFill = '.';
578     else if (&rBox == m_xFillDashLine.get())
579         cFill = '-';
580 
581     aCurrentTab.GetFill() = cFill;
582     int nPos = FindCurrentTab();
583     if (nPos != -1)
584     {
585         aNewTabs->Remove( nPos );
586         aNewTabs->Insert( aCurrentTab );
587     }
588 }
589 
IMPL_LINK_NOARG(SvxTabulatorTabPage,GetFillCharHdl_Impl,weld::Widget &,void)590 IMPL_LINK_NOARG(SvxTabulatorTabPage, GetFillCharHdl_Impl, weld::Widget&, void)
591 {
592     OUString aChar(m_xFillChar->get_text());
593     if ( !aChar.isEmpty() )
594         aCurrentTab.GetFill() = aChar[0];
595 
596     const int nPos = FindCurrentTab();
597     if (nPos != -1)
598     {
599         aNewTabs->Remove( nPos );
600         aNewTabs->Insert( aCurrentTab );
601     }
602 }
603 
IMPL_LINK_NOARG(SvxTabulatorTabPage,GetDezCharHdl_Impl,weld::Widget &,void)604 IMPL_LINK_NOARG(SvxTabulatorTabPage, GetDezCharHdl_Impl, weld::Widget&, void)
605 {
606     OUString aChar(m_xDezChar->get_text());
607     if ( !aChar.isEmpty() && ( aChar[0] >= ' '))
608         aCurrentTab.GetDecimal() = aChar[0];
609 
610     const int nPos = FindCurrentTab();
611     if (nPos != -1)
612     {
613         aNewTabs->Remove( nPos );
614         aNewTabs->Insert( aCurrentTab );
615     }
616 }
617 
IMPL_LINK_NOARG(SvxTabulatorTabPage,SelectHdl_Impl,weld::TreeView &,bool)618 IMPL_LINK_NOARG(SvxTabulatorTabPage, SelectHdl_Impl, weld::TreeView&, bool)
619 {
620     const int nPos = FindCurrentTab();
621     if (nPos != -1)
622     {
623         aCurrentTab = (*aNewTabs)[nPos];
624         m_xNewBtn->set_sensitive(false);
625         SetFillAndTabType_Impl();
626     }
627     return true;
628 }
629 
FormatTab()630 OUString SvxTabulatorTabPage::FormatTab()
631 {
632     m_xTabSpin->set_text(m_xTabBox->get_active_text());
633     m_xTabSpin->reformat();
634     return m_xTabSpin->get_text();
635 }
636 
IMPL_LINK_NOARG(SvxTabulatorTabPage,ReformatHdl_Impl,weld::Widget &,void)637 IMPL_LINK_NOARG(SvxTabulatorTabPage, ReformatHdl_Impl, weld::Widget&, void)
638 {
639     m_xTabBox->set_entry_text(FormatTab());
640 }
641 
IMPL_LINK_NOARG(SvxTabulatorTabPage,ModifyHdl_Impl,weld::ComboBox &,void)642 IMPL_LINK_NOARG(SvxTabulatorTabPage, ModifyHdl_Impl, weld::ComboBox&, void)
643 {
644     const int nPos = FindCurrentTab();
645     if (nPos != -1)
646     {
647         aCurrentTab = (*aNewTabs)[nPos];
648         SetFillAndTabType_Impl();
649 
650         m_xTabSpin->set_text(m_xTabBox->get_active_text());
651         aCurrentTab.GetTabPos() = m_xTabSpin->denormalize(m_xTabSpin->get_value(eDefUnit));
652         m_xNewBtn->set_sensitive(false);
653         m_xDelBtn->set_sensitive(true);
654         return;
655     }
656     m_xNewBtn->set_sensitive(true);
657     m_xDelBtn->set_sensitive(false);
658 }
659 
PageCreated(const SfxAllItemSet & aSet)660 void SvxTabulatorTabPage::PageCreated(const SfxAllItemSet& aSet)
661 {
662     const SfxUInt16Item* pControlItem = aSet.GetItem<SfxUInt16Item>(SID_SVXTABULATORTABPAGE_DISABLEFLAGS, false);
663     if (pControlItem)
664         DisableControls(static_cast<TabulatorDisableFlags>(pControlItem->GetValue()));
665 }
666 
667 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
668