[Libreoffice-commits] core.git: Branch 'libreoffice-6-1' - cui/source cui/uiconfig include/svx include/vcl solenv/sanitizers svx/source

Caolán McNamara caolanm at redhat.com
Fri Jun 15 08:27:46 UTC 2018


 cui/source/inc/paragrph.hxx          |   60 ++-
 cui/source/tabpages/paragrph.cxx     |  558 ++++++++++++++++-------------------
 cui/uiconfig/ui/paraindentspacing.ui |  143 ++++----
 include/svx/relfld.hxx               |   42 ++
 include/vcl/weld.hxx                 |    4 
 solenv/sanitizers/ui/cui.suppr       |    4 
 svx/source/dialog/relfld.cxx         |   80 +++++
 7 files changed, 500 insertions(+), 391 deletions(-)

New commits:
commit 903e664735b6bb0d58a16e08db8dfcb3fe52ed94
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 14 13:05:26 2018 +0100

    weld SvxStdParagraphTabPage
    
    Change-Id: I02b0f2e4f049b407a3ac0c7f304cbcd0cc652749
    Reviewed-on: https://gerrit.libreoffice.org/55827
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/cui/source/inc/paragrph.hxx b/cui/source/inc/paragrph.hxx
index ed88e4461532..16614656125c 100644
--- a/cui/source/inc/paragrph.hxx
+++ b/cui/source/inc/paragrph.hxx
@@ -51,48 +51,53 @@ class SvxStdParagraphTabPage: public SfxTabPage
     static const sal_uInt16 pStdRanges[];
 
 private:
-    SvxStdParagraphTabPage( vcl::Window* pParent, const SfxItemSet& rSet );
+    SvxStdParagraphTabPage(TabPageParent pParent, const SfxItemSet& rSet);
+
+    long                    nAbst;
+    long                    nWidth;
+    long                    nMinFixDist;
+    bool                    bRelativeMode;
+    OUString                sAbsDist;
+
+    ParaPrevWindow m_aExampleWin;
 
     // indention
-    VclPtr<SvxRelativeField>       m_pLeftIndent;
+    std::unique_ptr<RelativeField> m_xLeftIndent;
 
-    VclPtr<FixedText>              m_pRightLabel;
-    VclPtr<SvxRelativeField>       m_pRightIndent;
+    std::unique_ptr<weld::Label> m_xRightLabel;
+    std::unique_ptr<RelativeField> m_xRightIndent;
 
-    VclPtr<FixedText>              m_pFLineLabel;
-    VclPtr<SvxRelativeField>       m_pFLineIndent;
-    VclPtr<CheckBox>               m_pAutoCB;
+    std::unique_ptr<weld::Label> m_xFLineLabel;
+    std::unique_ptr<RelativeField> m_xFLineIndent;
+    std::unique_ptr<weld::CheckButton> m_xAutoCB;
 
     // distance
-    VclPtr<SvxRelativeField>       m_pTopDist;
-    VclPtr<SvxRelativeField>       m_pBottomDist;
-    VclPtr<CheckBox>               m_pContextualCB;
+    std::unique_ptr<RelativeField> m_xTopDist;
+    std::unique_ptr<RelativeField> m_xBottomDist;
+    std::unique_ptr<weld::CheckButton> m_xContextualCB;
 
     // line spacing
-    VclPtr<ListBox>                m_pLineDist;
-    VclPtr<FixedText>              m_pLineDistAtLabel;
-    VclPtr<MetricField>            m_pLineDistAtPercentBox;
-    VclPtr<MetricField>            m_pLineDistAtMetricBox;
-    VclPtr<FixedText>              m_pAbsDist;
-    OUString                sAbsDist;
-    VclPtr<SvxParaPrevWindow>      m_pExampleWin;
+    std::unique_ptr<weld::ComboBoxText> m_xLineDist;
+    std::unique_ptr<weld::MetricSpinButton> m_xLineDistAtPercentBox;
+    std::unique_ptr<weld::MetricSpinButton> m_xLineDistAtMetricBox;
+    std::unique_ptr<weld::Label> m_xLineDistAtLabel;
+    std::unique_ptr<weld::Label> m_xAbsDist;
 
     // only writer
-    VclPtr<VclFrame>               m_pRegisterFL;
-    VclPtr<CheckBox>               m_pRegisterCB;
+    std::unique_ptr<weld::Widget> m_xRegisterFL;
+    std::unique_ptr<weld::CheckButton> m_xRegisterCB;
 
-    long                    nAbst;
-    long                    nWidth;
-    long                    nMinFixDist;
-    bool                    bRelativeMode;
+    // preview
+    std::unique_ptr<weld::CustomWeld> m_xExampleWin;
 
     void                    SetLineSpacing_Impl( const SvxLineSpacingItem& rAttr );
     void                    Init_Impl();
     void                    UpdateExample_Impl();
+    void                    ELRLoseFocus();
 
-    DECL_LINK( LineDistHdl_Impl, ListBox&, void );
-    DECL_LINK( ModifyHdl_Impl, Edit&, void );
-    DECL_LINK( AutoHdl_Impl, Button*, void );
+    DECL_LINK(LineDistHdl_Impl, weld::ComboBoxText&, void);
+    DECL_LINK(ModifyHdl_Impl, weld::MetricSpinButton&, void);
+    DECL_LINK(AutoHdl_Impl, weld::ToggleButton&, void);
 
 protected:
     virtual void            ActivatePage( const SfxItemSet& rSet ) override;
@@ -101,9 +106,8 @@ protected:
 
 public:
     virtual ~SvxStdParagraphTabPage() override;
-    virtual void dispose() override;
 
-    DECL_LINK(ELRLoseFocusHdl, Control&, void);
+    DECL_LINK(ELRLoseFocusHdl, weld::MetricSpinButton&, void);
 
     static VclPtr<SfxTabPage>      Create( TabPageParent pParent, const SfxItemSet* rSet );
     static const sal_uInt16* GetRanges() { return pStdRanges; }
diff --git a/cui/source/tabpages/paragrph.cxx b/cui/source/tabpages/paragrph.cxx
index 0fdc536823df..5f3af968def6 100644
--- a/cui/source/tabpages/paragrph.cxx
+++ b/cui/source/tabpages/paragrph.cxx
@@ -160,46 +160,53 @@ sal_uInt16 GetHtmlMode_Impl(const SfxItemSet& rSet)
 
 }
 
-IMPL_LINK_NOARG(SvxStdParagraphTabPage, ELRLoseFocusHdl, Control&, void)
+void SvxStdParagraphTabPage::ELRLoseFocus()
 {
     SfxItemPool* pPool = GetItemSet().GetPool();
     DBG_ASSERT( pPool, "Where is the pool?" );
     FieldUnit eUnit =
         MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
 
-    sal_Int64 nL = m_pLeftIndent->Denormalize( m_pLeftIndent->GetValue( eUnit ) );
-    sal_Int64 nR = m_pRightIndent->Denormalize( m_pRightIndent->GetValue( eUnit ) );
-    OUString aTmp = m_pFLineIndent->GetText();
+    sal_Int64 nL = m_xLeftIndent->denormalize(m_xLeftIndent->get_value(eUnit));
+    sal_Int64 nR = m_xRightIndent->denormalize(m_xRightIndent->get_value(eUnit));
+    OUString aTmp = m_xFLineIndent->get_text();
 
-    if( m_pLeftIndent->GetMin() < 0 )
-        m_pFLineIndent->SetMin( -99999, FUNIT_MM );
+    if (m_xLeftIndent->get_min(FUNIT_NONE) < 0)
+        m_xFLineIndent->set_min(-99999, FUNIT_MM);
     else
-        m_pFLineIndent->SetMin( m_pFLineIndent->Normalize( -nL ), eUnit );
+        m_xFLineIndent->set_min(m_xFLineIndent->normalize(-nL), eUnit);
 
     // Check only for concrete width (Shell)
     sal_Int64 nTmp = nWidth - nL - nR - MM50;
-    m_pFLineIndent->SetMax( m_pFLineIndent->Normalize( nTmp ), eUnit );
+    m_xFLineIndent->set_max(m_xFLineIndent->normalize(nTmp), eUnit);
 
-    if ( aTmp.isEmpty() )
-        m_pFLineIndent->SetEmptyFieldValue();
+    if (aTmp.isEmpty())
+        m_xFLineIndent->set_text(OUString());
     // maximum left right
-    aTmp = m_pLeftIndent->GetText();
+    aTmp = m_xLeftIndent->get_text();
     nTmp = nWidth - nR - MM50;
-    m_pLeftIndent->SetMax( m_pLeftIndent->Normalize( nTmp ), eUnit );
+    m_xLeftIndent->set_max(m_xLeftIndent->normalize(nTmp), eUnit);
 
     if ( aTmp.isEmpty() )
-        m_pLeftIndent->SetEmptyFieldValue();
-    aTmp = m_pRightIndent->GetText();
+        m_xLeftIndent->set_text(OUString());
+    aTmp = m_xRightIndent->get_text();
     nTmp = nWidth - nL - MM50;
-    m_pRightIndent->SetMax( m_pRightIndent->Normalize( nTmp ), eUnit );
+    m_xRightIndent->set_max(m_xRightIndent->normalize(nTmp), eUnit);
 
     if ( aTmp.isEmpty() )
-        m_pRightIndent->SetEmptyFieldValue();
+        m_xRightIndent->set_text(OUString());
+
+    UpdateExample_Impl();
+}
+
+IMPL_LINK_NOARG(SvxStdParagraphTabPage, ELRLoseFocusHdl, weld::MetricSpinButton&, void)
+{
+    ELRLoseFocus();
 }
 
 VclPtr<SfxTabPage> SvxStdParagraphTabPage::Create( TabPageParent pParent, const SfxItemSet* rSet)
 {
-    return VclPtr<SvxStdParagraphTabPage>::Create( pParent.pParent, *rSet );
+    return VclPtr<SvxStdParagraphTabPage>::Create(pParent, *rSet);
 }
 
 bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
@@ -211,12 +218,12 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
 
     bool bModified = false;
     sal_uInt16 nWhich;
-    sal_Int32 nPos = m_pLineDist->GetSelectedEntryPos();
+    int nPos = m_xLineDist->get_active();
 
-    if ( LISTBOX_ENTRY_NOTFOUND != nPos &&
-         ( m_pLineDist->IsValueChangedFromSaved() ||
-           m_pLineDistAtPercentBox->IsValueModified() ||
-           m_pLineDistAtMetricBox->IsValueModified() ) )
+    if ( nPos != -1 &&
+         ( m_xLineDist->get_value_changed_from_saved() ||
+           m_xLineDistAtPercentBox->get_value_changed_from_saved() ||
+           m_xLineDistAtMetricBox->get_value_changed_from_saved() ) )
     {
         nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
         MapUnit eUnit = pPool->GetMetric( nWhich );
@@ -234,15 +241,15 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
 
             case LLINESPACE_PROP:
                 SetLineSpace_Impl( aSpacing, nPos,
-                                   static_cast<long>(m_pLineDistAtPercentBox->Denormalize(
-                                   m_pLineDistAtPercentBox->GetValue() )) );
+                                   static_cast<long>(m_xLineDistAtPercentBox->denormalize(
+                                   m_xLineDistAtPercentBox->get_value(FUNIT_NONE) )) );
                 break;
 
             case LLINESPACE_MIN:
             case LLINESPACE_DURCH:
             case LLINESPACE_FIX:
                 SetLineSpace_Impl( aSpacing, nPos,
-                    GetCoreValue( *m_pLineDistAtMetricBox, eUnit ) );
+                    GetCoreValue( *m_xLineDistAtMetricBox, eUnit ) );
             break;
 
             default:
@@ -260,8 +267,8 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
         }
     }
 
-    if ( m_pTopDist->IsValueModified() || m_pBottomDist->IsValueModified()
-         || m_pContextualCB->IsValueChangedFromSaved())
+    if ( m_xTopDist->get_value_changed_from_saved() || m_xBottomDist->get_value_changed_from_saved()
+         || m_xContextualCB->get_state_changed_from_saved())
     {
         nWhich = GetWhich( SID_ATTR_ULSPACE );
         MapUnit eUnit = pPool->GetMetric( nWhich );
@@ -275,25 +282,25 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
             const SvxULSpaceItem& rOldItem =
                 static_cast<const SvxULSpaceItem&>(GetItemSet().GetParent()->Get( nWhich ));
 
-            if ( m_pTopDist->IsRelative() )
+            if ( m_xTopDist->IsRelative() )
                 aMargin.SetUpper( rOldItem.GetUpper(),
-                                  static_cast<sal_uInt16>(m_pTopDist->GetValue()) );
+                                  static_cast<sal_uInt16>(m_xTopDist->get_value(FUNIT_NONE)) );
             else
-                aMargin.SetUpper( static_cast<sal_uInt16>(GetCoreValue( *m_pTopDist, eUnit )) );
+                aMargin.SetUpper( static_cast<sal_uInt16>(m_xTopDist->GetCoreValue(eUnit)) );
 
-            if ( m_pBottomDist->IsRelative() )
+            if ( m_xBottomDist->IsRelative() )
                 aMargin.SetLower( rOldItem.GetLower(),
-                                  static_cast<sal_uInt16>(m_pBottomDist->GetValue()) );
+                                  static_cast<sal_uInt16>(m_xBottomDist->get_value(FUNIT_NONE)) );
             else
-                aMargin.SetLower( static_cast<sal_uInt16>(GetCoreValue( *m_pBottomDist, eUnit )) );
+                aMargin.SetLower( static_cast<sal_uInt16>(m_xBottomDist->GetCoreValue(eUnit)) );
 
         }
         else
         {
-            aMargin.SetUpper( static_cast<sal_uInt16>(GetCoreValue( *m_pTopDist, eUnit )) );
-            aMargin.SetLower( static_cast<sal_uInt16>(GetCoreValue( *m_pBottomDist, eUnit )) );
+            aMargin.SetUpper(static_cast<sal_uInt16>(m_xTopDist->GetCoreValue(eUnit)));
+            aMargin.SetLower(static_cast<sal_uInt16>(m_xBottomDist->GetCoreValue(eUnit)));
         }
-        aMargin.SetContextValue(m_pContextualCB->IsChecked());
+        aMargin.SetContextValue(m_xContextualCB->get_active());
         eState = GetItemSet().GetItemState( nWhich );
 
         if ( !pOld || !( *static_cast<const SvxULSpaceItem*>(pOld) == aMargin ) ||
@@ -305,10 +312,10 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
     }
     bool bNullTab = false;
 
-    if ( m_pLeftIndent->IsValueModified() ||
-         m_pFLineIndent->IsValueModified() ||
-         m_pRightIndent->IsValueModified() ||
-         m_pAutoCB->IsValueChangedFromSaved() )
+    if ( m_xLeftIndent->get_value_changed_from_saved() ||
+         m_xFLineIndent->get_value_changed_from_saved() ||
+         m_xRightIndent->get_value_changed_from_saved() ||
+         m_xAutoCB->get_state_changed_from_saved() )
     {
         nWhich = GetWhich( SID_ATTR_LRSPACE );
         MapUnit eUnit = pPool->GetMetric( nWhich );
@@ -322,33 +329,31 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
             const SvxLRSpaceItem& rOldItem =
                 static_cast<const SvxLRSpaceItem&>(GetItemSet().GetParent()->Get( nWhich ));
 
-            if ( m_pLeftIndent->IsRelative() )
+            if (m_xLeftIndent->IsRelative())
                 aMargin.SetTextLeft( rOldItem.GetTextLeft(),
-                                    static_cast<sal_uInt16>(m_pLeftIndent->GetValue()) );
+                                    static_cast<sal_uInt16>(m_xLeftIndent->get_value(FUNIT_NONE)) );
             else
-                aMargin.SetTextLeft( GetCoreValue( *m_pLeftIndent, eUnit ) );
+                aMargin.SetTextLeft(m_xLeftIndent->GetCoreValue(eUnit));
 
-            if ( m_pRightIndent->IsRelative() )
+            if ( m_xRightIndent->IsRelative() )
                 aMargin.SetRight( rOldItem.GetRight(),
-                                  static_cast<sal_uInt16>(m_pRightIndent->GetValue()) );
+                                  static_cast<sal_uInt16>(m_xRightIndent->get_value(FUNIT_NONE)) );
             else
-                aMargin.SetRight( GetCoreValue( *m_pRightIndent, eUnit ) );
+                aMargin.SetRight(m_xRightIndent->GetCoreValue(eUnit));
 
-            if ( m_pFLineIndent->IsRelative() )
+            if ( m_xFLineIndent->IsRelative() )
                 aMargin.SetTextFirstLineOfst( rOldItem.GetTextFirstLineOfst(),
-                                             static_cast<sal_uInt16>(m_pFLineIndent->GetValue()) );
+                                             static_cast<sal_uInt16>(m_xFLineIndent->get_value(FUNIT_NONE)) );
             else
-                aMargin.SetTextFirstLineOfst(
-                    static_cast<sal_uInt16>(GetCoreValue( *m_pFLineIndent, eUnit )) );
+                aMargin.SetTextFirstLineOfst(static_cast<sal_uInt16>(m_xFLineIndent->GetCoreValue(eUnit)));
         }
         else
         {
-            aMargin.SetTextLeft( GetCoreValue( *m_pLeftIndent, eUnit ) );
-            aMargin.SetRight( GetCoreValue( *m_pRightIndent, eUnit ) );
-            aMargin.SetTextFirstLineOfst(
-                static_cast<sal_uInt16>(GetCoreValue( *m_pFLineIndent, eUnit )) );
+            aMargin.SetTextLeft(m_xLeftIndent->GetCoreValue(eUnit));
+            aMargin.SetRight(m_xRightIndent->GetCoreValue(eUnit));
+            aMargin.SetTextFirstLineOfst(static_cast<sal_uInt16>(m_xFLineIndent->GetCoreValue(eUnit)));
         }
-        aMargin.SetAutoFirst(m_pAutoCB->IsChecked());
+        aMargin.SetAutoFirst(m_xAutoCB->get_active());
         if ( aMargin.GetTextFirstLineOfst() < 0 )
             bNullTab = true;
         eState = GetItemSet().GetItemState( nWhich );
@@ -382,7 +387,7 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
             }
         }
     }
-    if( m_pRegisterCB->IsVisible())
+    if (m_xRegisterCB->get_visible())
     {
         const SfxBoolItem* pBoolItem = static_cast<const SfxBoolItem*>(GetOldItem(
                             *rOutSet, SID_ATTR_PARA_REGISTER));
@@ -392,7 +397,7 @@ bool SvxStdParagraphTabPage::FillItemSet( SfxItemSet* rOutSet )
         sal_uInt16 _nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
         bool bSet = pRegItem->GetValue();
 
-        if(m_pRegisterCB->IsChecked() != bSet )
+        if (m_xRegisterCB->get_active() != bSet)
         {
             pRegItem->SetValue(!bSet);
             rOutSet->Put(*pRegItem);
@@ -419,20 +424,20 @@ void SvxStdParagraphTabPage::Reset( const SfxItemSet* rSet )
     if(aCJKOptions.IsAsianTypographyEnabled() && bApplyCharUnit )
         eFUnit = FUNIT_CHAR;
 
-    SetFieldUnit( *m_pLeftIndent, eFUnit );
-    SetFieldUnit( *m_pRightIndent, eFUnit );
-    SetFieldUnit( *m_pFLineIndent, eFUnit );
+    m_xLeftIndent->SetFieldUnit(eFUnit);
+    m_xRightIndent->SetFieldUnit(eFUnit);
+    m_xFLineIndent->SetFieldUnit(eFUnit);
     if ( eFUnit == FUNIT_CHAR )
     {
-        SetFieldUnit( *m_pTopDist, FUNIT_LINE );
-        SetFieldUnit( *m_pBottomDist, FUNIT_LINE );
-        SetFieldUnit( *m_pLineDistAtMetricBox, FUNIT_POINT );
+        m_xTopDist->SetFieldUnit(FUNIT_LINE);
+        m_xBottomDist->SetFieldUnit(FUNIT_LINE);
+        SetFieldUnit(*m_xLineDistAtMetricBox, FUNIT_POINT);
     }
     else
     {
-        SetFieldUnit( *m_pTopDist, eFUnit );
-        SetFieldUnit( *m_pBottomDist, eFUnit );
-        SetFieldUnit( *m_pLineDistAtMetricBox, eFUnit );
+        m_xTopDist->SetFieldUnit(eFUnit);
+        m_xBottomDist->SetFieldUnit(eFUnit);
+        SetFieldUnit(*m_xLineDistAtMetricBox, eFUnit);
     }
 
     sal_uInt16 _nWhich = GetWhich( SID_ATTR_LRSPACE );
@@ -449,60 +454,59 @@ void SvxStdParagraphTabPage::Reset( const SfxItemSet* rSet )
 
             if ( rOldItem.GetPropLeft() != 100 )
             {
-                m_pLeftIndent->SetRelative( true );
-                m_pLeftIndent->SetValue( rOldItem.GetPropLeft() );
+                m_xLeftIndent->SetRelative( true );
+                m_xLeftIndent->set_value(rOldItem.GetPropLeft(), FUNIT_NONE);
             }
             else
             {
-                m_pLeftIndent->SetRelative(false);
-                SetFieldUnit( *m_pLeftIndent, eFUnit );
-                SetMetricValue( *m_pLeftIndent, rOldItem.GetTextLeft(), eUnit );
+                m_xLeftIndent->SetRelative(false);
+                m_xLeftIndent->SetFieldUnit(eFUnit);
+                m_xLeftIndent->SetMetricValue(rOldItem.GetTextLeft(), eUnit);
             }
 
             if ( rOldItem.GetPropRight() != 100 )
             {
-                m_pRightIndent->SetRelative( true );
-                m_pRightIndent->SetValue( rOldItem.GetPropRight() );
+                m_xRightIndent->SetRelative( true );
+                m_xRightIndent->set_value(rOldItem.GetPropRight(), FUNIT_NONE);
             }
             else
             {
-                m_pRightIndent->SetRelative(false);
-                SetFieldUnit( *m_pRightIndent, eFUnit );
-                SetMetricValue( *m_pRightIndent, rOldItem.GetRight(), eUnit );
+                m_xRightIndent->SetRelative(false);
+                m_xRightIndent->SetFieldUnit(eFUnit);
+                m_xRightIndent->SetMetricValue(rOldItem.GetRight(), eUnit);
             }
 
             if ( rOldItem.GetPropTextFirstLineOfst() != 100 )
             {
-                m_pFLineIndent->SetRelative( true );
-                m_pFLineIndent->SetValue( rOldItem.GetPropTextFirstLineOfst() );
+                m_xFLineIndent->SetRelative(true);
+                m_xFLineIndent->set_value(rOldItem.GetPropTextFirstLineOfst(), FUNIT_NONE);
             }
             else
             {
-                m_pFLineIndent->SetRelative(false);
-                m_pFLineIndent->SetMin(-9999);
-                SetFieldUnit( *m_pFLineIndent, eFUnit );
-                SetMetricValue( *m_pFLineIndent, rOldItem.GetTextFirstLineOfst(),
-                                eUnit );
+                m_xFLineIndent->SetRelative(false);
+                m_xFLineIndent->set_min(-9999, FUNIT_NONE);
+                m_xFLineIndent->SetFieldUnit(eFUnit);
+                m_xFLineIndent->SetMetricValue(rOldItem.GetTextFirstLineOfst(), eUnit);
             }
-            m_pAutoCB->Check(rOldItem.IsAutoFirst());
+            m_xAutoCB->set_active(rOldItem.IsAutoFirst());
         }
         else
         {
             const SvxLRSpaceItem& rSpace =
                 static_cast<const SvxLRSpaceItem&>(rSet->Get( _nWhich ));
 
-            SetMetricValue( *m_pLeftIndent, rSpace.GetTextLeft(), eUnit );
-            SetMetricValue( *m_pRightIndent, rSpace.GetRight(), eUnit );
-            SetMetricValue( *m_pFLineIndent, rSpace.GetTextFirstLineOfst(), eUnit );
-            m_pAutoCB->Check(rSpace.IsAutoFirst());
+            m_xLeftIndent->SetMetricValue(rSpace.GetTextLeft(), eUnit);
+            m_xRightIndent->SetMetricValue(rSpace.GetRight(), eUnit);
+            m_xFLineIndent->SetMetricValue(rSpace.GetTextFirstLineOfst(), eUnit);
+            m_xAutoCB->set_active(rSpace.IsAutoFirst());
         }
-        AutoHdl_Impl(m_pAutoCB);
+        AutoHdl_Impl(*m_xAutoCB);
     }
     else
     {
-        m_pLeftIndent->SetEmptyFieldValue();
-        m_pRightIndent->SetEmptyFieldValue();
-        m_pFLineIndent->SetEmptyFieldValue();
+        m_xLeftIndent->set_text(OUString());
+        m_xRightIndent->set_text(OUString());
+        m_xFLineIndent->set_text(OUString());
     }
 
     _nWhich = GetWhich( SID_ATTR_ULSPACE );
@@ -519,45 +523,45 @@ void SvxStdParagraphTabPage::Reset( const SfxItemSet* rSet )
 
             if ( rOldItem.GetPropUpper() != 100 )
             {
-                m_pTopDist->SetRelative( true );
-                m_pTopDist->SetValue( rOldItem.GetPropUpper() );
+                m_xTopDist->SetRelative( true );
+                m_xTopDist->set_value(rOldItem.GetPropUpper(), FUNIT_NONE);
             }
             else
             {
-                m_pTopDist->SetRelative(false);
-                if ( eFUnit == FUNIT_CHAR )
-                    SetFieldUnit( *m_pTopDist, FUNIT_LINE );
+                m_xTopDist->SetRelative(false);
+                if (eFUnit == FUNIT_CHAR)
+                    m_xTopDist->SetFieldUnit(FUNIT_LINE);
                 else
-                    SetFieldUnit( *m_pTopDist, eFUnit );
-                SetMetricValue( *m_pTopDist, rOldItem.GetUpper(), eUnit );
+                    m_xTopDist->SetFieldUnit(eFUnit);
+                m_xTopDist->SetMetricValue(rOldItem.GetUpper(), eUnit);
             }
 
             if ( rOldItem.GetPropLower() != 100 )
             {
-                m_pBottomDist->SetRelative( true );
-                m_pBottomDist->SetValue( rOldItem.GetPropLower() );
+                m_xBottomDist->SetRelative( true );
+                m_xBottomDist->set_value(rOldItem.GetPropLower(), FUNIT_NONE);
             }
             else
             {
-                m_pBottomDist->SetRelative(false);
-                if ( eFUnit == FUNIT_CHAR )
-                    SetFieldUnit( *m_pBottomDist, FUNIT_LINE );
+                m_xBottomDist->SetRelative(false);
+                if (eFUnit == FUNIT_CHAR)
+                    m_xBottomDist->SetFieldUnit(FUNIT_LINE);
                 else
-                    SetFieldUnit( *m_pBottomDist, eFUnit );
-                SetMetricValue( *m_pBottomDist, rOldItem.GetLower(), eUnit );
+                    m_xBottomDist->SetFieldUnit(eFUnit);
+                m_xBottomDist->SetMetricValue(rOldItem.GetLower(), eUnit);
             }
         }
         else
         {
-            SetMetricValue( *m_pTopDist, rOldItem.GetUpper(), eUnit );
-            SetMetricValue( *m_pBottomDist, rOldItem.GetLower(), eUnit );
+            m_xTopDist->SetMetricValue(rOldItem.GetUpper(), eUnit);
+            m_xBottomDist->SetMetricValue(rOldItem.GetLower(), eUnit);
         }
-        m_pContextualCB->Check(rOldItem.GetContext());
+        m_xContextualCB->set_active(rOldItem.GetContext());
     }
     else
     {
-        m_pTopDist->SetEmptyFieldValue();
-        m_pBottomDist->SetEmptyFieldValue();
+        m_xTopDist->set_text(OUString());
+        m_xBottomDist->set_text(OUString());
     }
 
     _nWhich = GetWhich( SID_ATTR_PARA_LINESPACE );
@@ -566,54 +570,55 @@ void SvxStdParagraphTabPage::Reset( const SfxItemSet* rSet )
     if ( eItemState >= SfxItemState::DEFAULT )
         SetLineSpacing_Impl( static_cast<const SvxLineSpacingItem &>(rSet->Get( _nWhich )) );
     else
-        m_pLineDist->SetNoSelection();
+        m_xLineDist->set_active(-1);
 
     _nWhich = GetWhich( SID_ATTR_PARA_REGISTER );
     eItemState = rSet->GetItemState( _nWhich );
 
     if ( eItemState >= SfxItemState::DEFAULT )
-        m_pRegisterCB->Check( static_cast<const SfxBoolItem &>(rSet->Get( _nWhich )).GetValue());
-    m_pRegisterCB->SaveValue();
+        m_xRegisterCB->set_active( static_cast<const SfxBoolItem &>(rSet->Get( _nWhich )).GetValue());
+    m_xRegisterCB->save_state();
     sal_uInt16 nHtmlMode = GetHtmlMode_Impl(*rSet);
     if(nHtmlMode & HTMLMODE_ON)
     {
-        m_pRegisterFL->Hide();
-        m_pRegisterCB->Hide();
-        m_pAutoCB->Hide();
+        m_xRegisterFL->hide();
+        m_xRegisterCB->hide();
+        m_xAutoCB->hide();
     }
 
     // this sets the min/max limits; do this _after_ setting the values,
     // because for Impress the min of first-line indent depends on value of
     // left-indent!
-    ELRLoseFocusHdl( *m_pFLineIndent );
-    m_pAutoCB->SaveValue();
-    m_pContextualCB->SaveValue();
-    m_pLineDist->SaveValue();
+    ELRLoseFocus();
+    m_xAutoCB->save_state();
+    m_xContextualCB->save_state();
+    m_xLineDist->save_value();
 }
+
 void SvxStdParagraphTabPage::ChangesApplied()
 {
-    m_pLeftIndent->SetValue(m_pLeftIndent->GetValue());
-    m_pRightIndent->SetValue(m_pRightIndent->GetValue());
-    m_pFLineIndent->SetValue(m_pFLineIndent->GetValue());
-    m_pLineDist->SaveValue();
-    m_pLineDistAtPercentBox->SaveValue();
-    m_pLineDistAtMetricBox->SaveValue();
-    m_pRegisterCB->SaveValue();
-    m_pTopDist->SetValue(m_pTopDist->GetValue());
-    m_pBottomDist->SetValue(m_pBottomDist->GetValue());
-    m_pContextualCB->SaveValue();
-    m_pAutoCB->SaveValue();
+    m_xLeftIndent->save_value();
+    m_xRightIndent->save_value();
+    m_xFLineIndent->save_value();
+    m_xLineDist->save_value();
+    m_xLineDistAtPercentBox->save_value();
+    m_xLineDistAtMetricBox->save_value();
+    m_xRegisterCB->save_state();
+    m_xTopDist->save_value();
+    m_xBottomDist->save_value();
+    m_xContextualCB->save_state();
+    m_xAutoCB->save_state();
 }
 
 void SvxStdParagraphTabPage::EnableRelativeMode()
 {
     DBG_ASSERT( GetItemSet().GetParent(), "RelativeMode, but no parent-set!" );
 
-    m_pLeftIndent->EnableRelativeMode( 0, 999 );
-    m_pFLineIndent->EnableRelativeMode( 0, 999 );
-    m_pRightIndent->EnableRelativeMode( 0, 999 );
-    m_pTopDist->EnableRelativeMode( 0, 999 );
-    m_pBottomDist->EnableRelativeMode( 0, 999 );
+    m_xLeftIndent->EnableRelativeMode( 0, 999 );
+    m_xFLineIndent->EnableRelativeMode( 0, 999 );
+    m_xRightIndent->EnableRelativeMode( 0, 999 );
+    m_xTopDist->EnableRelativeMode( 0, 999 );
+    m_xBottomDist->EnableRelativeMode( 0, 999 );
     bRelativeMode = true;
 }
 
@@ -636,19 +641,19 @@ void SvxStdParagraphTabPage::ActivatePage( const SfxItemSet& rSet )
                 const SvxFrameDirectionItem& rFrameDirItem = static_cast<const SvxFrameDirectionItem&>( rSet.Get( _nWhich ) );
                 SvxFrameDirection eFrameDirection = rFrameDirItem.GetValue();
 
-                m_pExampleWin->EnableRTL( SvxFrameDirection::Horizontal_RL_TB == eFrameDirection );
+                m_aExampleWin.EnableRTL( SvxFrameDirection::Horizontal_RL_TB == eFrameDirection );
 
                 if ( eAdjust == SvxAdjust::Block )
-                    m_pExampleWin->SetLastLine( rAdj.GetLastBlock() );
+                    m_aExampleWin.SetLastLine( rAdj.GetLastBlock() );
             }
         }
         else
         {
-            m_pExampleWin->EnableRTL( eAdjust == SvxAdjust::Right );
+            m_aExampleWin.EnableRTL( eAdjust == SvxAdjust::Right );
             eAdjust = SvxAdjust::Left; //required for correct preview display
-            m_pExampleWin->SetLastLine( eAdjust );
+            m_aExampleWin.SetLastLine( eAdjust );
         }
-        m_pExampleWin->SetAdjust( eAdjust );
+        m_aExampleWin.SetAdjust( eAdjust );
 
         UpdateExample_Impl();
     }
@@ -656,91 +661,58 @@ void SvxStdParagraphTabPage::ActivatePage( const SfxItemSet& rSet )
 
 DeactivateRC SvxStdParagraphTabPage::DeactivatePage( SfxItemSet* _pSet )
 {
-    ELRLoseFocusHdl( *m_pFLineIndent );
+    ELRLoseFocus();
 
     if ( _pSet )
         FillItemSet( _pSet );
     return DeactivateRC::LeavePage;
 }
 
-SvxStdParagraphTabPage::SvxStdParagraphTabPage( vcl::Window* pParent,  const SfxItemSet& rAttr ) :
-    SfxTabPage( pParent, "ParaIndentSpacing","cui/ui/paraindentspacing.ui", &rAttr ),
-
-    nAbst           ( MAX_DURCH ),
-    nWidth          ( 11905 /*567 * 50*/ ),
-    nMinFixDist(0),
-
-    bRelativeMode   ( false )
-
+SvxStdParagraphTabPage::SvxStdParagraphTabPage(TabPageParent pParent,  const SfxItemSet& rAttr)
+    : SfxTabPage(pParent, "cui/ui/paraindentspacing.ui", "ParaIndentSpacing", &rAttr)
+    , nAbst(MAX_DURCH)
+    , nWidth(11905 /*567 * 50*/)
+    , nMinFixDist(0)
+    , bRelativeMode(false)
+    , m_xLeftIndent(new RelativeField(m_xBuilder->weld_metric_spin_button("spinED_LEFTINDENT", FUNIT_CM)))
+    , m_xRightLabel(m_xBuilder->weld_label("labelFT_RIGHTINDENT"))
+    , m_xRightIndent(new RelativeField(m_xBuilder->weld_metric_spin_button("spinED_RIGHTINDENT", FUNIT_CM)))
+    , m_xFLineLabel(m_xBuilder->weld_label("labelFT_FLINEINDENT"))
+    , m_xFLineIndent(new RelativeField(m_xBuilder->weld_metric_spin_button("spinED_FLINEINDENT", FUNIT_CM)))
+    , m_xAutoCB(m_xBuilder->weld_check_button("checkCB_AUTO"))
+    , m_xTopDist(new RelativeField(m_xBuilder->weld_metric_spin_button("spinED_TOPDIST", FUNIT_CM)))
+    , m_xBottomDist(new RelativeField(m_xBuilder->weld_metric_spin_button("spinED_BOTTOMDIST", FUNIT_CM)))
+    , m_xContextualCB(m_xBuilder->weld_check_button("checkCB_CONTEXTUALSPACING"))
+    , m_xLineDist(m_xBuilder->weld_combo_box_text("comboLB_LINEDIST"))
+    , m_xLineDistAtPercentBox(m_xBuilder->weld_metric_spin_button("spinED_LINEDISTPERCENT", FUNIT_PERCENT))
+    , m_xLineDistAtMetricBox(m_xBuilder->weld_metric_spin_button("spinED_LINEDISTMETRIC", FUNIT_CM))
+    , m_xLineDistAtLabel(m_xBuilder->weld_label("labelFT_LINEDIST"))
+    , m_xAbsDist(m_xBuilder->weld_label("labelST_LINEDIST_ABS"))
+    , m_xRegisterFL(m_xBuilder->weld_widget("frameFL_REGISTER"))
+    , m_xRegisterCB(m_xBuilder->weld_check_button("checkCB_REGISTER"))
+    , m_xExampleWin(new weld::CustomWeld(*m_xBuilder, "drawingareaWN_EXAMPLE", m_aExampleWin))
 {
-    get(m_pLeftIndent,"spinED_LEFTINDENT");
-    get(m_pRightIndent,"spinED_RIGHTINDENT");
-    get(m_pRightLabel,"labelFT_RIGHTINDENT");
-    get(m_pFLineLabel,"labelFT_FLINEINDENT");
-    get(m_pFLineIndent,"spinED_FLINEINDENT");
-    get(m_pAutoCB,"checkCB_AUTO");
-
-    get(m_pTopDist,"spinED_TOPDIST");
-    get(m_pBottomDist,"spinED_BOTTOMDIST");
-    get(m_pContextualCB,"checkCB_CONTEXTUALSPACING");
-
-    get(m_pLineDist,"comboLB_LINEDIST");
-    get(m_pLineDistAtPercentBox,"spinED_LINEDISTPERCENT");
-    get(m_pLineDistAtMetricBox,"spinED_LINEDISTMETRIC");
-    get(m_pLineDistAtLabel,"labelFT_LINEDIST");
-
-    get(m_pAbsDist,"labelST_LINEDIST_ABS");
-    sAbsDist = m_pAbsDist->GetText();
-
-    get(m_pRegisterFL,"frameFL_REGISTER");
-    get(m_pRegisterCB,"checkCB_REGISTER");
-
-    get(m_pExampleWin,"drawingareaWN_EXAMPLE");
+    sAbsDist = m_xAbsDist->get_label();
 
     // this page needs ExchangeSupport
     SetExchangeSupport();
 
-    m_pLineDistAtMetricBox->Hide();
+    m_xLineDistAtMetricBox->hide();
 
     Init_Impl();
-    m_pFLineIndent->SetMin(-9999);    // is set to 0 on default
-
-    setPreviewsToSamePlace(pParent, this);
+    m_xFLineIndent->set_min(-9999, FUNIT_NONE);    // is set to 0 on default
 }
 
 SvxStdParagraphTabPage::~SvxStdParagraphTabPage()
 {
-    disposeOnce();
-}
-
-void SvxStdParagraphTabPage::dispose()
-{
-    m_pLeftIndent.clear();
-    m_pRightLabel.clear();
-    m_pRightIndent.clear();
-    m_pFLineLabel.clear();
-    m_pFLineIndent.clear();
-    m_pAutoCB.clear();
-    m_pTopDist.clear();
-    m_pBottomDist.clear();
-    m_pContextualCB.clear();
-    m_pLineDist.clear();
-    m_pLineDistAtLabel.clear();
-    m_pLineDistAtPercentBox.clear();
-    m_pLineDistAtMetricBox.clear();
-    m_pAbsDist.clear();
-    m_pExampleWin.clear();
-    m_pRegisterFL.clear();
-    m_pRegisterCB.clear();
-    SfxTabPage::dispose();
 }
 
 void SvxStdParagraphTabPage::EnableNegativeMode()
 {
-    m_pLeftIndent->SetMin(-9999);
-    m_pRightIndent->SetMin(-9999);
-    m_pRightIndent->EnableNegativeMode();
-    m_pLeftIndent->EnableNegativeMode();
+    m_xLeftIndent->set_min(-9999, FUNIT_NONE);
+    m_xRightIndent->set_min(-9999, FUNIT_NONE);
+    m_xRightIndent->EnableNegativeMode();
+    m_xLeftIndent->EnableNegativeMode();
 }
 
 void SvxStdParagraphTabPage::SetLineSpacing_Impl
@@ -760,169 +732,171 @@ void SvxStdParagraphTabPage::SetLineSpacing_Impl
             {
                 // Default single line spacing
                 case SvxInterLineSpaceRule::Off:
-                    m_pLineDist->SelectEntryPos( LLINESPACE_1 );
+                    m_xLineDist->set_active( LLINESPACE_1 );
                     break;
 
                 // Default single line spacing
                 case SvxInterLineSpaceRule::Prop:
                     if ( 100 == rAttr.GetPropLineSpace() )
                     {
-                        m_pLineDist->SelectEntryPos( LLINESPACE_1 );
+                        m_xLineDist->set_active( LLINESPACE_1 );
                         break;
                     }
                     // 1.15 line spacing
                     if ( 115 == rAttr.GetPropLineSpace() )
                     {
-                        m_pLineDist->SelectEntryPos( LLINESPACE_115 );
+                        m_xLineDist->set_active( LLINESPACE_115 );
                         break;
                     }
                     // 1.5 line spacing
                     if ( 150 == rAttr.GetPropLineSpace() )
                     {
-                        m_pLineDist->SelectEntryPos( LLINESPACE_15 );
+                        m_xLineDist->set_active( LLINESPACE_15 );
                         break;
                     }
                     // double line spacing
                     if ( 200 == rAttr.GetPropLineSpace() )
                     {
-                        m_pLineDist->SelectEntryPos( LLINESPACE_2 );
+                        m_xLineDist->set_active( LLINESPACE_2 );
                         break;
                     }
                     // the set per cent value
-                    m_pLineDistAtPercentBox->SetValue( m_pLineDistAtPercentBox->Normalize(rAttr.GetPropLineSpace() ) );
-                    m_pLineDist->SelectEntryPos( LLINESPACE_PROP );
+                    m_xLineDistAtPercentBox->set_value(m_xLineDistAtPercentBox->normalize(rAttr.GetPropLineSpace()), FUNIT_NONE);
+                    m_xLineDist->set_active( LLINESPACE_PROP );
                     break;
 
                 case SvxInterLineSpaceRule::Fix:
-                    SetMetricValue( *m_pLineDistAtMetricBox, rAttr.GetInterLineSpace(), eUnit );
-                    m_pLineDist->SelectEntryPos( LLINESPACE_DURCH );
+                    SetMetricValue( *m_xLineDistAtMetricBox, rAttr.GetInterLineSpace(), eUnit );
+                    m_xLineDist->set_active( LLINESPACE_DURCH );
                     break;
                 default: ;//prevent warning
             }
         }
         break;
         case SvxLineSpaceRule::Fix:
-            SetMetricValue(*m_pLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
-            m_pLineDist->SelectEntryPos( LLINESPACE_FIX );
+            SetMetricValue(*m_xLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
+            m_xLineDist->set_active( LLINESPACE_FIX );
         break;
 
         case SvxLineSpaceRule::Min:
-            SetMetricValue(*m_pLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
-            m_pLineDist->SelectEntryPos( LLINESPACE_MIN );
+            SetMetricValue(*m_xLineDistAtMetricBox, rAttr.GetLineHeight(), eUnit);
+            m_xLineDist->set_active( LLINESPACE_MIN );
             break;
         default: ;//prevent warning
     }
-    LineDistHdl_Impl( *m_pLineDist );
+    LineDistHdl_Impl( *m_xLineDist );
 }
 
-IMPL_LINK( SvxStdParagraphTabPage, LineDistHdl_Impl, ListBox&, rBox, void )
+IMPL_LINK(SvxStdParagraphTabPage, LineDistHdl_Impl, weld::ComboBoxText&, rBox, void)
 {
-    switch( rBox.GetSelectedEntryPos() )
+    switch (rBox.get_active())
     {
         case LLINESPACE_1:
         case LLINESPACE_115:
         case LLINESPACE_15:
         case LLINESPACE_2:
-            m_pLineDistAtLabel->Enable(false);
-            m_pLineDistAtPercentBox->Enable(false);
-            m_pLineDistAtPercentBox->SetText( OUString() );
-            m_pLineDistAtMetricBox->Enable(false);
-            m_pLineDistAtMetricBox->SetText( OUString() );
+            m_xLineDistAtLabel->set_sensitive(false);
+            m_xLineDistAtPercentBox->set_sensitive(false);
+            m_xLineDistAtPercentBox->set_text(OUString());
+            m_xLineDistAtMetricBox->set_sensitive(false);
+            m_xLineDistAtMetricBox->set_text(OUString());
             break;
 
         case LLINESPACE_DURCH:
             // setting a sensible default?
             // limit MS min(10, aPageSize)
-            m_pLineDistAtMetricBox->SetMin(0);
-
-            if ( m_pLineDistAtMetricBox->GetText().isEmpty() )
-                m_pLineDistAtMetricBox->SetValue( m_pLineDistAtMetricBox->Normalize( 1 ) );
-            m_pLineDistAtPercentBox->Hide();
-            m_pLineDistAtMetricBox->Show();
-            m_pLineDistAtMetricBox->Enable();
-            m_pLineDistAtLabel->Enable();
+            m_xLineDistAtMetricBox->set_min(0, FUNIT_NONE);
+
+            if (m_xLineDistAtMetricBox->get_text().isEmpty())
+                m_xLineDistAtMetricBox->set_value(m_xLineDistAtMetricBox->normalize(1), FUNIT_NONE);
+            m_xLineDistAtPercentBox->hide();
+            m_xLineDistAtMetricBox->show();
+            m_xLineDistAtMetricBox->set_sensitive(true);
+            m_xLineDistAtLabel->set_sensitive(true);
             break;
 
         case LLINESPACE_MIN:
-            m_pLineDistAtMetricBox->SetMin(0);
-
-            if ( m_pLineDistAtMetricBox->GetText().isEmpty() )
-                m_pLineDistAtMetricBox->SetValue( m_pLineDistAtMetricBox->Normalize( 10 ), FUNIT_TWIP );
-            m_pLineDistAtPercentBox->Hide();
-            m_pLineDistAtMetricBox->Show();
-            m_pLineDistAtMetricBox->Enable();
-            m_pLineDistAtLabel->Enable();
+            m_xLineDistAtMetricBox->set_min(0, FUNIT_NONE);
+
+            if (m_xLineDistAtMetricBox->get_text().isEmpty())
+                m_xLineDistAtMetricBox->set_value(m_xLineDistAtMetricBox->normalize(10), FUNIT_TWIP);
+            m_xLineDistAtPercentBox->hide();
+            m_xLineDistAtMetricBox->show();
+            m_xLineDistAtMetricBox->set_sensitive(true);
+            m_xLineDistAtLabel->set_sensitive(true);
             break;
 
         case LLINESPACE_PROP:
 
-            if ( m_pLineDistAtPercentBox->GetText().isEmpty() )
-                m_pLineDistAtPercentBox->SetValue( m_pLineDistAtPercentBox->Normalize( 100 ), FUNIT_TWIP );
-            m_pLineDistAtMetricBox->Hide();
-            m_pLineDistAtPercentBox->Show();
-            m_pLineDistAtPercentBox->Enable();
-            m_pLineDistAtLabel->Enable();
+            if (m_xLineDistAtPercentBox->get_text().isEmpty())
+                m_xLineDistAtPercentBox->set_value(m_xLineDistAtPercentBox->normalize(100), FUNIT_TWIP);
+            m_xLineDistAtMetricBox->hide();
+            m_xLineDistAtPercentBox->show();
+            m_xLineDistAtPercentBox->set_sensitive(true);
+            m_xLineDistAtLabel->set_sensitive(true);
             break;
         case LLINESPACE_FIX:
         {
-            sal_Int64 nTemp = m_pLineDistAtMetricBox->GetValue();
-            m_pLineDistAtMetricBox->SetMin(m_pLineDistAtMetricBox->Normalize(nMinFixDist), FUNIT_TWIP);
+            auto nTemp = m_xLineDistAtMetricBox->get_value(FUNIT_NONE);
+            m_xLineDistAtMetricBox->set_min(m_xLineDistAtMetricBox->normalize(nMinFixDist), FUNIT_TWIP);
 
             // if the value has been changed at SetMin,
             // it is time for the default
-            if ( m_pLineDistAtMetricBox->GetValue() != nTemp )
-                SetMetricValue( *m_pLineDistAtMetricBox, FIX_DIST_DEF, MapUnit::MapTwip ); // fix is only in Writer
-            m_pLineDistAtPercentBox->Hide();
-            m_pLineDistAtMetricBox->Show();
-            m_pLineDistAtMetricBox->Enable();
-            m_pLineDistAtLabel->Enable();
+            if (m_xLineDistAtMetricBox->get_value(FUNIT_NONE) != nTemp)
+                SetMetricValue( *m_xLineDistAtMetricBox, FIX_DIST_DEF, MapUnit::MapTwip ); // fix is only in Writer
+            m_xLineDistAtPercentBox->hide();
+            m_xLineDistAtMetricBox->show();
+            m_xLineDistAtMetricBox->set_sensitive(true);
+            m_xLineDistAtLabel->set_sensitive(true);
         }
         break;
     }
     UpdateExample_Impl();
 }
 
-IMPL_LINK_NOARG(SvxStdParagraphTabPage, ModifyHdl_Impl, Edit&, void)
+IMPL_LINK_NOARG(SvxStdParagraphTabPage, ModifyHdl_Impl, weld::MetricSpinButton&, void)
 {
     UpdateExample_Impl();
 }
 
 void SvxStdParagraphTabPage::Init_Impl()
 {
-    m_pLineDist->SetSelectHdl(
-        LINK( this, SvxStdParagraphTabPage, LineDistHdl_Impl ) );
+    m_xLineDist->connect_changed(LINK(this, SvxStdParagraphTabPage, LineDistHdl_Impl));
 
-    Link<Control&,void> aLink2 = LINK( this, SvxStdParagraphTabPage, ELRLoseFocusHdl );
-    m_pFLineIndent->SetLoseFocusHdl( aLink2 );
-    m_pLeftIndent->SetLoseFocusHdl( aLink2 );
-    m_pRightIndent->SetLoseFocusHdl( aLink2 );
+    Link<weld::MetricSpinButton&,void> aLink2 = LINK(this, SvxStdParagraphTabPage, ELRLoseFocusHdl);
+    m_xFLineIndent->connect_value_changed(aLink2);
+    m_xLeftIndent->connect_value_changed(aLink2);
+    m_xRightIndent->connect_value_changed(aLink2);
 
-    Link<Edit&,void> aLink = LINK( this, SvxStdParagraphTabPage, ModifyHdl_Impl );
-    m_pFLineIndent->SetModifyHdl( aLink );
-    m_pLeftIndent->SetModifyHdl( aLink );
-    m_pRightIndent->SetModifyHdl( aLink );
-    m_pTopDist->SetModifyHdl( aLink );
-    m_pBottomDist->SetModifyHdl( aLink );
+    Link<weld::MetricSpinButton&,void> aLink = LINK(this, SvxStdParagraphTabPage, ModifyHdl_Impl);
+#if 0
+    //TO DO
+    m_xFLineIndent->SetModifyHdl( aLink );
+    m_xLeftIndent->SetModifyHdl( aLink );
+    m_xRightIndent->SetModifyHdl( aLink );
+#endif
+    m_xTopDist->connect_value_changed(aLink);
+    m_xBottomDist->connect_value_changed(aLink);
 
-    m_pAutoCB->SetClickHdl( LINK( this, SvxStdParagraphTabPage, AutoHdl_Impl ));
+    m_xAutoCB->connect_toggled(LINK(this, SvxStdParagraphTabPage, AutoHdl_Impl));
     SfxItemPool* pPool = GetItemSet().GetPool();
     DBG_ASSERT( pPool, "Where is the pool?" );
     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( GetWhich( SID_ATTR_LRSPACE ) ) );
 
-    m_pTopDist->SetMax( m_pTopDist->Normalize( nAbst ), eUnit );
-    m_pBottomDist->SetMax( m_pBottomDist->Normalize( nAbst ), eUnit );
-    m_pLineDistAtMetricBox->SetMax( m_pLineDistAtMetricBox->Normalize( nAbst ), eUnit );
+    m_xTopDist->set_max( m_xTopDist->normalize( nAbst ), eUnit );
+    m_xBottomDist->set_max( m_xBottomDist->normalize( nAbst ), eUnit );
+    m_xLineDistAtMetricBox->set_max( m_xLineDistAtMetricBox->normalize( nAbst ), eUnit );
 }
 
 void SvxStdParagraphTabPage::UpdateExample_Impl()
 {
-    m_pExampleWin->SetFirstLineOfst( static_cast<short>(m_pFLineIndent->Denormalize( m_pFLineIndent->GetValue( FUNIT_TWIP ) )) );
-    m_pExampleWin->SetLeftMargin( static_cast<long>(m_pLeftIndent->Denormalize( m_pLeftIndent->GetValue( FUNIT_TWIP ) ) ) );
-    m_pExampleWin->SetRightMargin( static_cast<long>(m_pRightIndent->Denormalize( m_pRightIndent->GetValue( FUNIT_TWIP ) ) ) );
-    m_pExampleWin->SetUpper( static_cast<sal_uInt16>(m_pTopDist->Denormalize( m_pTopDist->GetValue( FUNIT_TWIP ) )) );
-    m_pExampleWin->SetLower( static_cast<sal_uInt16>(m_pBottomDist->Denormalize( m_pBottomDist->GetValue( FUNIT_TWIP ) )) );
+    m_aExampleWin.SetFirstLineOfst( static_cast<short>(m_xFLineIndent->denormalize( m_xFLineIndent->get_value( FUNIT_TWIP ) )) );
+    m_aExampleWin.SetLeftMargin( static_cast<long>(m_xLeftIndent->denormalize( m_xLeftIndent->get_value( FUNIT_TWIP ) ) ) );
+    m_aExampleWin.SetRightMargin( static_cast<long>(m_xRightIndent->denormalize( m_xRightIndent->get_value( FUNIT_TWIP ) ) ) );
+    m_aExampleWin.SetUpper( static_cast<sal_uInt16>(m_xTopDist->denormalize( m_xTopDist->get_value( FUNIT_TWIP ) )) );
+    m_aExampleWin.SetLower( static_cast<sal_uInt16>(m_xBottomDist->denormalize( m_xBottomDist->get_value( FUNIT_TWIP ) )) );
 
-    sal_Int32 nPos = m_pLineDist->GetSelectedEntryPos();
+    int nPos = m_xLineDist->get_active();
 
     switch ( nPos )
     {
@@ -934,38 +908,38 @@ void SvxStdParagraphTabPage::UpdateExample_Impl()
         case LLINESPACE_MIN:
         case LLINESPACE_DURCH:
         case LLINESPACE_FIX:
-            m_pExampleWin->SetLineSpace( static_cast<SvxPrevLineSpace>(nPos) );
+            m_aExampleWin.SetLineSpace( static_cast<SvxPrevLineSpace>(nPos) );
             break;
     }
-    m_pExampleWin->Invalidate();
+    m_aExampleWin.Invalidate();
 }
 
 void SvxStdParagraphTabPage::EnableRegisterMode()
 {
-    m_pRegisterCB->Show();
-    m_pRegisterFL->Show();
+    m_xRegisterCB->show();
+    m_xRegisterFL->show();
 }
 
 void SvxStdParagraphTabPage::EnableContextualMode()
 {
-    m_pContextualCB->Show();
+    m_xContextualCB->show();
 }
 
-IMPL_LINK( SvxStdParagraphTabPage, AutoHdl_Impl, Button*, pBox, void )
+IMPL_LINK(SvxStdParagraphTabPage, AutoHdl_Impl, weld::ToggleButton&, rBox, void)
 {
-    bool bEnable = !static_cast<CheckBox*>(pBox)->IsChecked();
-    m_pFLineLabel->Enable(bEnable);
-    m_pFLineIndent->Enable(bEnable);
+    bool bEnable = !rBox.get_active();
+    m_xFLineLabel->set_sensitive(bEnable);
+    m_xFLineIndent->set_sensitive(bEnable);
 }
 
 void SvxStdParagraphTabPage::EnableAutoFirstLine()
 {
-    m_pAutoCB->Show();
+    m_xAutoCB->show();
 }
 
-void    SvxStdParagraphTabPage::EnableAbsLineDist(long nMinTwip)
+void SvxStdParagraphTabPage::EnableAbsLineDist(long nMinTwip)
 {
-    m_pLineDist->InsertEntry(sAbsDist);
+    m_xLineDist->append_text(sAbsDist);
     nMinFixDist = nMinTwip;
 }
 
diff --git a/cui/uiconfig/ui/paraindentspacing.ui b/cui/uiconfig/ui/paraindentspacing.ui
index 0538da747477..318bfa853d99 100644
--- a/cui/uiconfig/ui/paraindentspacing.ui
+++ b/cui/uiconfig/ui/paraindentspacing.ui
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.3 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="cui">
   <requires lib="gtk+" version="3.18"/>
   <requires lib="LibreOffice" version="1.0"/>
@@ -8,6 +8,11 @@
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
+  <object class="GtkAdjustment" id="adjustmentED_DIST1">
+    <property name="upper">9999</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
   <object class="GtkAdjustment" id="adjustmentED_LINEDISTMETRIC">
     <property name="upper">9999</property>
     <property name="step_increment">10</property>
@@ -25,43 +30,15 @@
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
-  <object class="GtkListStore" id="liststoreLB_LINEDIST">
-    <columns>
-      <!-- column-name gchararray1 -->
-      <column type="gchararray"/>
-      <!-- column-name guint1 -->
-      <column type="guint"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Single</col>
-        <col id="1">0</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">1.15 Lines</col>
-        <col id="1">1</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">1.5 Lines</col>
-        <col id="1">2</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Double</col>
-        <col id="1">3</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Proportional</col>
-        <col id="1">4</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">At least</col>
-        <col id="1">5</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Leading</col>
-        <col id="1">6</col>
-      </row>
-    </data>
+  <object class="GtkAdjustment" id="adjustmentspinED_INDENT1">
+    <property name="upper">9999</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustmentspinED_INDENT2">
+    <property name="upper">9999</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
   </object>
   <object class="GtkGrid" id="ParaIndentSpacing">
     <property name="visible">True</property>
@@ -79,16 +56,33 @@
         <property name="vexpand">True</property>
         <property name="top_padding">24</property>
         <child>
-          <object class="svxlo-SvxParaPrevWindow" id="drawingareaWN_EXAMPLE">
+          <object class="GtkScrolledWindow">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can_focus">True</property>
             <property name="halign">center</property>
             <property name="valign">start</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
-            <child internal-child="accessible">
-              <object class="AtkObject" id="drawingareaWN_EXAMPLE-atkobject">
-                <property name="AtkObject::accessible-name" translatable="yes" context="paraindentspacing|drawingareaWN_EXAMPLE-atkobject">Example</property>
+            <property name="hscrollbar_policy">never</property>
+            <property name="vscrollbar_policy">never</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkViewport">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkDrawingArea" id="drawingareaWN_EXAMPLE">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="halign">center</property>
+                    <property name="valign">start</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <child internal-child="accessible">
+                      <object class="AtkObject" id="drawingareaWN_EXAMPLE-atkobject">
+                        <property name="AtkObject::accessible-name" translatable="yes" context="paraindentspacing|drawingareaWN_EXAMPLE-atkobject">Example</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -128,7 +122,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="paraindentspacing|labelFT_LEFTINDENT">_Before text:</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">spinED_LEFTINDENT:0cm</property>
+                        <property name="mnemonic_widget">spinED_LEFTINDENT</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
@@ -142,7 +136,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="paraindentspacing|labelFT_RIGHTINDENT">After _text:</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">spinED_RIGHTINDENT:0cm</property>
+                        <property name="mnemonic_widget">spinED_RIGHTINDENT</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
@@ -156,7 +150,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="paraindentspacing|labelFT_FLINEINDENT">_First line:</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">spinED_FLINEINDENT:0cm</property>
+                        <property name="mnemonic_widget">spinED_FLINEINDENT</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
@@ -180,9 +174,10 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="svxlo-SvxRelativeField" id="spinED_LEFTINDENT:0cm">
+                      <object class="GtkSpinButton" id="spinED_LEFTINDENT">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
+                        <property name="activates_default">True</property>
                         <property name="adjustment">adjustmentspinED_INDENT</property>
                       </object>
                       <packing>
@@ -191,10 +186,11 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="svxlo-SvxRelativeField" id="spinED_RIGHTINDENT:0cm">
+                      <object class="GtkSpinButton" id="spinED_RIGHTINDENT">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="adjustment">adjustmentspinED_INDENT</property>
+                        <property name="activates_default">True</property>
+                        <property name="adjustment">adjustmentspinED_INDENT1</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
@@ -202,10 +198,11 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="svxlo-SvxRelativeField" id="spinED_FLINEINDENT:0cm">
+                      <object class="GtkSpinButton" id="spinED_FLINEINDENT">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="adjustment">adjustmentspinED_INDENT</property>
+                        <property name="activates_default">True</property>
+                        <property name="adjustment">adjustmentspinED_INDENT2</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
@@ -272,7 +269,7 @@
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes" context="paraindentspacing|labelFT_TOPDIST">Ab_ove paragraph:</property>
                             <property name="use_underline">True</property>
-                            <property name="mnemonic_widget">spinED_TOPDIST:0cm</property>
+                            <property name="mnemonic_widget">spinED_TOPDIST</property>
                             <property name="xalign">0</property>
                           </object>
                           <packing>
@@ -286,7 +283,7 @@
                             <property name="can_focus">False</property>
                             <property name="label" translatable="yes" context="paraindentspacing|labelFT_BOTTOMDIST">Below _paragraph:</property>
                             <property name="use_underline">True</property>
-                            <property name="mnemonic_widget">spinED_BOTTOMDIST:0cm</property>
+                            <property name="mnemonic_widget">spinED_BOTTOMDIST</property>
                             <property name="xalign">0</property>
                           </object>
                           <packing>
@@ -295,9 +292,10 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="svxlo-SvxRelativeField" id="spinED_TOPDIST:0cm">
+                          <object class="GtkSpinButton" id="spinED_TOPDIST">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
+                            <property name="activates_default">True</property>
                             <property name="adjustment">adjustmentED_DIST</property>
                           </object>
                           <packing>
@@ -306,10 +304,11 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="svxlo-SvxRelativeField" id="spinED_BOTTOMDIST:0cm">
+                          <object class="GtkSpinButton" id="spinED_BOTTOMDIST">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="adjustment">adjustmentED_DIST</property>
+                            <property name="activates_default">True</property>
+                            <property name="adjustment">adjustmentED_DIST1</property>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
@@ -382,10 +381,18 @@
                         <property name="can_focus">False</property>
                         <property name="spacing">12</property>
                         <child>
-                          <object class="GtkComboBox" id="comboLB_LINEDIST">
+                          <object class="GtkComboBoxText" id="comboLB_LINEDIST">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="model">liststoreLB_LINEDIST</property>
+                            <items>
+                              <item id="0" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Single</item>
+                              <item id="1" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">1.15 Lines</item>
+                              <item id="2" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">1.5 Lines</item>
+                              <item id="3" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Double</item>
+                              <item id="4" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Proportional</item>
+                              <item id="5" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">At least</item>
+                              <item id="6" translatable="yes" context="paraindentspacing|liststoreLB_LINEDIST">Leading</item>
+                            </items>
                           </object>
                           <packing>
                             <property name="expand">False</property>
@@ -417,9 +424,10 @@
                         <property name="can_focus">False</property>
                         <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkSpinButton" id="spinED_LINEDISTPERCENT:0%">
+                          <object class="GtkSpinButton" id="spinED_LINEDISTPERCENT">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
+                            <property name="activates_default">True</property>
                             <property name="adjustment">adjustmentLINEDISTPERCENT</property>
                           </object>
                           <packing>
@@ -429,9 +437,10 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkSpinButton" id="spinED_LINEDISTMETRIC:0cm">
+                          <object class="GtkSpinButton" id="spinED_LINEDISTMETRIC">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
+                            <property name="activates_default">True</property>
                             <property name="adjustment">adjustmentED_LINEDISTMETRIC</property>
                             <property name="digits">1</property>
                           </object>
@@ -527,11 +536,11 @@
   <object class="GtkSizeGroup" id="sizegroup2">
     <widgets>
       <widget name="box1"/>
-      <widget name="spinED_LEFTINDENT:0cm"/>
-      <widget name="spinED_RIGHTINDENT:0cm"/>
-      <widget name="spinED_FLINEINDENT:0cm"/>
-      <widget name="spinED_TOPDIST:0cm"/>
-      <widget name="spinED_BOTTOMDIST:0cm"/>
+      <widget name="spinED_LEFTINDENT"/>
+      <widget name="spinED_RIGHTINDENT"/>
+      <widget name="spinED_FLINEINDENT"/>
+      <widget name="spinED_TOPDIST"/>
+      <widget name="spinED_BOTTOMDIST"/>
     </widgets>
   </object>
 </interface>
diff --git a/include/svx/relfld.hxx b/include/svx/relfld.hxx
index 867c975e7005..f5206a534c74 100644
--- a/include/svx/relfld.hxx
+++ b/include/svx/relfld.hxx
@@ -20,7 +20,9 @@
 #define INCLUDED_SVX_RELFLD_HXX
 
 #include <tools/fldunit.hxx>
+#include <svtools/unitconv.hxx>
 #include <vcl/field.hxx>
+#include <vcl/weld.hxx>
 #include <svx/svxdllapi.h>
 
 class SVX_DLLPUBLIC SvxRelativeField : public MetricField
@@ -44,6 +46,46 @@ public:
     void            EnableNegativeMode() {bNegativeEnabled = true;}
 };
 
+class SVX_DLLPUBLIC RelativeField
+{
+private:
+    std::unique_ptr<weld::MetricSpinButton> m_xSpinButton;
+
+    sal_uInt16          nRelMin;
+    sal_uInt16          nRelMax;
+    bool                bRelativeMode;
+    bool                bRelative;
+    bool                bNegativeEnabled;
+
+    DECL_LINK(ModifyHdl, weld::Entry&, void);
+
+public:
+    RelativeField(weld::MetricSpinButton* pControl);
+
+    void            EnableRelativeMode( sal_uInt16 nMin, sal_uInt16 nMax );
+    void            SetRelative( bool bRelative );
+    bool            IsRelative() const { return bRelative; }
+    void            EnableNegativeMode() {bNegativeEnabled = true;}
+
+    void set_sensitive(bool sensitive) { m_xSpinButton->set_sensitive(sensitive); }
+    void set_value(int nValue, FieldUnit eValueUnit) { m_xSpinButton->set_value(nValue, eValueUnit); }
+    int get_value(FieldUnit eDestUnit) const { return m_xSpinButton->get_value(eDestUnit); }
+    int get_min(FieldUnit eValueUnit) const { return m_xSpinButton->get_min(eValueUnit); }
+    void set_min(int min, FieldUnit eValueUnit) { m_xSpinButton->set_min(min, eValueUnit); }
+    void set_max(int max, FieldUnit eValueUnit) { m_xSpinButton->set_max(max, eValueUnit); }
+    int normalize(int nValue) const { return m_xSpinButton->normalize(nValue); }
+    int denormalize(int nValue) const { return m_xSpinButton->denormalize(nValue); }
+    void connect_value_changed(const Link<weld::MetricSpinButton&, void>& rLink) { m_xSpinButton->connect_value_changed(rLink); }
+    OUString get_text() const { return m_xSpinButton->get_text(); }
+    void set_text(const OUString& rText) { m_xSpinButton->set_text(rText); }
+    void save_value() { m_xSpinButton->save_value(); }
+    bool get_value_changed_from_saved() const { return m_xSpinButton->get_value_changed_from_saved(); }
+
+    int GetCoreValue(MapUnit eUnit) const { return ::GetCoreValue(*m_xSpinButton, eUnit); }
+    void SetFieldUnit(FieldUnit eUnit, bool bAll = false) { ::SetFieldUnit(*m_xSpinButton, eUnit, bAll); }
+    void SetMetricValue(int lCoreValue, MapUnit eUnit) { ::SetMetricValue(*m_xSpinButton, lCoreValue, eUnit); }
+};
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index d0c5c220f375..8092b426f925 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -630,14 +630,14 @@ public:
         set_range(min, max, eValueUnit);
     }
 
-    int get_min(FieldUnit eValueUnit)
+    int get_min(FieldUnit eValueUnit) const
     {
         int min, dummy;
         get_range(min, dummy, eValueUnit);
         return min;
     }
 
-    int get_max(FieldUnit eValueUnit)
+    int get_max(FieldUnit eValueUnit) const
     {
         int dummy, max;
         get_range(dummy, max, eValueUnit);
diff --git a/solenv/sanitizers/ui/cui.suppr b/solenv/sanitizers/ui/cui.suppr
index 9d872c73803f..1cfc2935979d 100644
--- a/solenv/sanitizers/ui/cui.suppr
+++ b/solenv/sanitizers/ui/cui.suppr
@@ -102,8 +102,8 @@ cui/uiconfig/ui/optviewpage.ui://GtkComboBoxText[@id='iconsize'] duplicate-mnemo
 cui/uiconfig/ui/pageformatpage.ui://GtkSpinButton[@id='spinMargLeft:0.00cm'] duplicate-mnemonic
 cui/uiconfig/ui/pageformatpage.ui://GtkSpinButton[@id='spinMargRight:0.00cm'] duplicate-mnemonic
 cui/uiconfig/ui/paraindentspacing.ui://GtkLabel[@id='labelFT_LINEDIST'] orphan-label
-cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTPERCENT:0%'] no-labelled-by
-cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTMETRIC:0cm'] no-labelled-by
+cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTPERCENT'] no-labelled-by
+cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTMETRIC'] no-labelled-by
 cui/uiconfig/ui/percentdialog.ui://GtkSpinButton[@id='margin'] no-labelled-by
 cui/uiconfig/ui/personalization_tab.ui://GtkButton[@id='default1'] button-no-label
 cui/uiconfig/ui/personalization_tab.ui://GtkButton[@id='default2'] button-no-label
diff --git a/svx/source/dialog/relfld.cxx b/svx/source/dialog/relfld.cxx
index b218be89d07d..2b7ad87c1fa9 100644
--- a/svx/source/dialog/relfld.cxx
+++ b/svx/source/dialog/relfld.cxx
@@ -119,5 +119,85 @@ void SvxRelativeField::SetRelative( bool bNewRelative )
     SetSelection( aSelection );
 }
 
+RelativeField::RelativeField(weld::MetricSpinButton* pControl)
+    : m_xSpinButton(pControl)
+    , nRelMin(0)
+    , nRelMax(0)
+    , bRelativeMode(false)
+    , bRelative(false)
+    , bNegativeEnabled(false)
+
+{
+    weld::SpinButton& rSpinButton = m_xSpinButton->get_widget();
+    rSpinButton.connect_changed(LINK(this, RelativeField, ModifyHdl));
+}
+
+IMPL_LINK_NOARG(RelativeField, ModifyHdl, weld::Entry&, void)
+{
+    if (bRelativeMode)
+    {
+        OUString  aStr = m_xSpinButton->get_text();
+        bool      bNewMode = bRelative;
+
+        if ( bRelative )
+        {
+            const sal_Unicode* pStr = aStr.getStr();
+
+            while ( *pStr )
+            {
+                if( ( ( *pStr < '0' ) || ( *pStr > '9' ) ) &&
+                    ( *pStr != '%' ) )
+                {
+                    bNewMode = false;
+                    break;
+                }
+                pStr++;
+            }
+        }
+        else
+        {
+            if ( aStr.indexOf( "%" ) != -1 )
+                bNewMode = true;
+        }
+
+        if ( bNewMode != bRelative )
+            SetRelative( bNewMode );
+    }
+}
+
+void RelativeField::EnableRelativeMode(sal_uInt16 nMin, sal_uInt16 nMax)
+{
+    bRelativeMode = true;
+    nRelMin       = nMin;
+    nRelMax       = nMax;
+    m_xSpinButton->set_unit(FUNIT_CM);
+}
+
+void RelativeField::SetRelative( bool bNewRelative )
+{
+    weld::SpinButton& rSpinButton = m_xSpinButton->get_widget();
+
+    int nStartPos, nEndPos;
+    rSpinButton.get_selection_bounds(nStartPos, nEndPos);
+    OUString aStr = rSpinButton.get_text();
+
+    if ( bNewRelative )
+    {
+        bRelative = true;
+        m_xSpinButton->set_digits(0);
+        m_xSpinButton->set_range(nRelMin, nRelMax, FUNIT_NONE);
+        m_xSpinButton->set_unit(FUNIT_PERCENT);
+    }
+    else
+    {
+        bRelative = false;
+        m_xSpinButton->set_digits(2);
+        m_xSpinButton->set_range(bNegativeEnabled ? -9999 : 0, 9999, FUNIT_NONE);
+        m_xSpinButton->set_unit(FUNIT_CM);
+    }
+
+    rSpinButton.set_text(aStr);
+    rSpinButton.select_region(nStartPos, nEndPos);
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list