[Libreoffice-commits] core.git: cui/source cui/uiconfig include/sfx2 include/svx include/vcl sfx2/source solenv/sanitizers svtools/source svx/source

Caolán McNamara caolanm at redhat.com
Wed Jun 13 19:53:41 UTC 2018


 cui/source/inc/chardlg.hxx          |   97 ++-
 cui/source/tabpages/chardlg.cxx     |  457 +++++++++---------
 cui/uiconfig/ui/positionpage.ui     |   71 ++
 include/sfx2/dialoghelper.hxx       |    2 
 include/svx/fntctrl.hxx             |   58 ++
 include/vcl/weld.hxx                |   14 
 sfx2/source/dialog/dialoghelper.cxx |    4 
 solenv/sanitizers/ui/cui.suppr      |    1 
 svtools/source/control/valueset.cxx |    2 
 svx/source/dialog/dlgctrl.cxx       |    3 
 svx/source/dialog/fntctrl.cxx       |  909 +++++++++++++++++++++++++++++++++++-
 svx/source/dialog/measctrl.cxx      |    2 
 12 files changed, 1331 insertions(+), 289 deletions(-)

New commits:
commit 23fa8a6ed05386ce6e9997747b416279f46ddd5f
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Jun 13 14:40:15 2018 +0100

    weld SvxCharPositionPage
    
    Change-Id: I2084702798e5b01eae5905dc54ad8413e6d5fae6
    Reviewed-on: https://gerrit.libreoffice.org/55759
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/cui/source/inc/chardlg.hxx b/cui/source/inc/chardlg.hxx
index 37b8dae50a99..489ea991b5a4 100644
--- a/cui/source/inc/chardlg.hxx
+++ b/cui/source/inc/chardlg.hxx
@@ -26,6 +26,7 @@
 #include <svx/colorbox.hxx>
 #include <svx/langbox.hxx>
 #include <vcl/layout.hxx>
+#include <vcl/weld.hxx>
 #include <memory>
 
 // forward ---------------------------------------------------------------
@@ -62,6 +63,33 @@ public:
 
 };
 
+class CharBasePage : public SfxTabPage
+{
+protected:
+    FontPrevWindow   m_aPreviewWin;
+    std::unique_ptr<weld::CustomWeld> m_xPreviewWin;
+
+    bool                m_bPreviewBackgroundToCharacter;
+
+    CharBasePage(TabPageParent pParent, const OUString& rUIXMLDescription, const OString& rID, const SfxItemSet& rAttrSet);
+
+    void SetPrevFontWidthScale( const SfxItemSet& rSet );
+    void SetPrevFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc );
+
+    inline SvxFont&     GetPreviewFont();
+    inline SvxFont&     GetPreviewCJKFont();
+    inline SvxFont&     GetPreviewCTLFont();
+
+public:
+    virtual ~CharBasePage() override;
+
+    using SfxTabPage::ActivatePage;
+    using SfxTabPage::DeactivatePage;
+
+    virtual void        ActivatePage( const SfxItemSet& rSet ) override;
+
+};
+
 // class SvxCharNamePage -------------------------------------------------
 
 struct SvxCharNamePage_Impl;
@@ -252,35 +280,12 @@ public:
 // class SvxCharPositionPage ---------------------------------------------
 
 
-class SvxCharPositionPage : public SvxCharBasePage
+class SvxCharPositionPage : public CharBasePage
 {
     friend class VclPtr<SvxCharPositionPage>;
     static const sal_uInt16 pPositionRanges[];
 
 private:
-    VclPtr<RadioButton>        m_pHighPosBtn;
-    VclPtr<RadioButton>        m_pNormalPosBtn;
-    VclPtr<RadioButton>        m_pLowPosBtn;
-    VclPtr<FixedText>          m_pHighLowFT;
-    VclPtr<MetricField>        m_pHighLowMF;
-    VclPtr<CheckBox>           m_pHighLowRB;
-    VclPtr<FixedText>          m_pFontSizeFT;
-    VclPtr<MetricField>        m_pFontSizeMF;
-
-    VclPtr<VclContainer>       m_pRotationContainer;
-
-    VclPtr<FixedText>          m_pScalingFT;
-    VclPtr<FixedText>          m_pScalingAndRotationFT;
-    VclPtr<RadioButton>        m_p0degRB;
-    VclPtr<RadioButton>        m_p90degRB;
-    VclPtr<RadioButton>        m_p270degRB;
-    VclPtr<CheckBox>           m_pFitToLineCB;
-
-    VclPtr<MetricField>        m_pScaleWidthMF;
-
-    VclPtr<MetricField>        m_pKerningMF;
-    VclPtr<CheckBox>           m_pPairKerningBtn;
-
     short               m_nSuperEsc;
     short               m_nSubEsc;
 
@@ -290,25 +295,47 @@ private:
     sal_uInt8                m_nSuperProp;
     sal_uInt8                m_nSubProp;
 
-                        SvxCharPositionPage( vcl::Window* pParent, const SfxItemSet& rSet );
+    std::unique_ptr<weld::RadioButton> m_xHighPosBtn;
+    std::unique_ptr<weld::RadioButton> m_xNormalPosBtn;
+    std::unique_ptr<weld::RadioButton> m_xLowPosBtn;
+    std::unique_ptr<weld::Label> m_xHighLowFT;
+    std::unique_ptr<weld::MetricSpinButton> m_xHighLowMF;
+    std::unique_ptr<weld::CheckButton> m_xHighLowRB;
+    std::unique_ptr<weld::Label> m_xFontSizeFT;
+    std::unique_ptr<weld::MetricSpinButton> m_xFontSizeMF;
+
+    std::unique_ptr<weld::Widget> m_xRotationContainer;
+
+    std::unique_ptr<weld::Label> m_xScalingFT;
+    std::unique_ptr<weld::Label> m_xScalingAndRotationFT;
+    std::unique_ptr<weld::RadioButton> m_x0degRB;
+    std::unique_ptr<weld::RadioButton> m_x90degRB;
+    std::unique_ptr<weld::RadioButton> m_x270degRB;
+    std::unique_ptr<weld::CheckButton> m_xFitToLineCB;
+
+    std::unique_ptr<weld::MetricSpinButton> m_xScaleWidthMF;
+
+    std::unique_ptr<weld::MetricSpinButton> m_xKerningMF;
+    std::unique_ptr<weld::CheckButton> m_xPairKerningBtn;
+
+                        SvxCharPositionPage(TabPageParent pParent, const SfxItemSet& rSet);
 
     void                Initialize();
     void                UpdatePreview_Impl( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc );
     void                SetEscapement_Impl( SvxEscapement nEsc );
 
-    DECL_LINK(    PositionHdl_Impl, Button*, void );
-    DECL_LINK(    RotationHdl_Impl, Button*, void );
-    DECL_LINK(    FontModifyHdl_Impl, Edit&, void );
-    DECL_LINK(    AutoPositionHdl_Impl, Button*, void );
-    DECL_LINK(    FitToLineHdl_Impl, Button*, void );
-    DECL_LINK(    KerningSelectHdl_Impl, ListBox&, void );
-    DECL_LINK(    KerningModifyHdl_Impl, Edit&, void );
-    DECL_LINK(    LoseFocusHdl_Impl, Control&, void );
-    DECL_LINK(    ScaleWidthModifyHdl_Impl, Edit&, void );
+    DECL_LINK(PositionHdl_Impl, weld::ToggleButton&, void);
+    DECL_LINK(RotationHdl_Impl, weld::ToggleButton&, void);
+    DECL_LINK(AutoPositionHdl_Impl, weld::ToggleButton&, void);
+    DECL_LINK(FitToLineHdl_Impl, weld::ToggleButton&, void);
+    DECL_LINK(KerningSelectHdl_Impl, weld::ComboBoxText&, void);
+    DECL_LINK(KerningModifyHdl_Impl, weld::MetricSpinButton&, void);
+    DECL_LINK(ValueChangedHdl_Impl, weld::MetricSpinButton&, void);
+    DECL_LINK(ScaleWidthModifyHdl_Impl, weld::MetricSpinButton&, void);
+    void FontModifyHdl_Impl();
 
 public:
     virtual ~SvxCharPositionPage() override;
-    virtual void dispose() override;
 
     using SfxTabPage::DeactivatePage;
 
diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx
index 4227b50375ea..c2b7a78eda83 100644
--- a/cui/source/tabpages/chardlg.cxx
+++ b/cui/source/tabpages/chardlg.cxx
@@ -216,6 +216,55 @@ void SvxCharBasePage::SetPrevFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp
     m_pPreviewWin->Invalidate();
 }
 
+inline SvxFont& CharBasePage::GetPreviewFont()
+{
+    return m_aPreviewWin.GetFont();
+}
+
+inline SvxFont& CharBasePage::GetPreviewCJKFont()
+{
+    return m_aPreviewWin.GetCJKFont();
+}
+
+inline SvxFont& CharBasePage::GetPreviewCTLFont()
+{
+    return m_aPreviewWin.GetCTLFont();
+}
+
+CharBasePage::CharBasePage(TabPageParent pParent, const OUString& rUIXMLDescription, const OString& rID, const SfxItemSet& rItemset)
+    : SfxTabPage(pParent, rUIXMLDescription, rID, &rItemset)
+    , m_bPreviewBackgroundToCharacter( false )
+{
+}
+
+CharBasePage::~CharBasePage()
+{
+}
+
+void CharBasePage::ActivatePage(const SfxItemSet& rSet)
+{
+    m_aPreviewWin.SetFromItemSet(rSet, m_bPreviewBackgroundToCharacter);
+}
+
+void CharBasePage::SetPrevFontWidthScale( const SfxItemSet& rSet )
+{
+    sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
+    if (rSet.GetItemState(nWhich)>=SfxItemState::DEFAULT)
+    {
+        const SvxCharScaleWidthItem &rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
+        m_aPreviewWin.SetFontWidthScale(rItem.GetValue());
+    }
+}
+
+void CharBasePage::SetPrevFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
+{
+    setPrevFontEscapement(GetPreviewFont(),nProp,nEscProp,nEsc);
+    setPrevFontEscapement(GetPreviewCJKFont(),nProp,nEscProp,nEsc);
+    setPrevFontEscapement(GetPreviewCTLFont(),nProp,nEscProp,nEsc);
+    m_aPreviewWin.Invalidate();
+}
+
+
 // SvxCharNamePage_Impl --------------------------------------------------
 
 struct SvxCharNamePage_Impl
@@ -2475,65 +2524,39 @@ void SvxCharEffectsPage::PageCreated(const SfxAllItemSet& aSet)
 
 // class SvxCharPositionPage ---------------------------------------------
 
-SvxCharPositionPage::SvxCharPositionPage( vcl::Window* pParent, const SfxItemSet& rInSet )
-    : SvxCharBasePage(pParent, "PositionPage", "cui/ui/positionpage.ui", rInSet)
+SvxCharPositionPage::SvxCharPositionPage(TabPageParent pParent, const SfxItemSet& rInSet)
+    : CharBasePage(pParent, "cui/ui/positionpage.ui", "PositionPage", rInSet)
     , m_nSuperEsc(short(DFLT_ESC_SUPER))
     , m_nSubEsc(short(DFLT_ESC_SUB))
     , m_nScaleWidthItemSetVal(100)
     , m_nScaleWidthInitialVal(100)
     , m_nSuperProp(sal_uInt8(DFLT_ESC_PROP))
     , m_nSubProp(sal_uInt8(DFLT_ESC_PROP))
+    , m_xHighPosBtn(m_xBuilder->weld_radio_button("superscript"))
+    , m_xNormalPosBtn(m_xBuilder->weld_radio_button("normal"))
+    , m_xLowPosBtn(m_xBuilder->weld_radio_button("subscript"))
+    , m_xHighLowFT(m_xBuilder->weld_label("raiselower"))
+    , m_xHighLowMF(m_xBuilder->weld_metric_spin_button("raiselowersb", FUNIT_PERCENT))
+    , m_xHighLowRB(m_xBuilder->weld_check_button("automatic"))
+    , m_xFontSizeFT(m_xBuilder->weld_label("relativefontsize"))
+    , m_xFontSizeMF(m_xBuilder->weld_metric_spin_button("fontsizesb", FUNIT_PERCENT))
+    , m_xRotationContainer(m_xBuilder->weld_widget("rotationcontainer"))
+    , m_xScalingFT(m_xBuilder->weld_label("scale"))
+    , m_xScalingAndRotationFT(m_xBuilder->weld_label("rotateandscale"))
+    , m_x0degRB(m_xBuilder->weld_radio_button("0deg"))
+    , m_x90degRB(m_xBuilder->weld_radio_button("90deg"))
+    , m_x270degRB(m_xBuilder->weld_radio_button("270deg"))
+    , m_xFitToLineCB(m_xBuilder->weld_check_button("fittoline"))
+    , m_xScaleWidthMF(m_xBuilder->weld_metric_spin_button("scalewidthsb", FUNIT_PERCENT))
+    , m_xKerningMF(m_xBuilder->weld_metric_spin_button("kerningsb", FUNIT_POINT))
+    , m_xPairKerningBtn(m_xBuilder->weld_check_button("pairkerning"))
 {
-    get(m_pHighPosBtn, "superscript");
-    get(m_pNormalPosBtn, "normal");
-    get(m_pLowPosBtn, "subscript");
-    get(m_pHighLowFT, "raiselower");
-    get(m_pHighLowMF, "raiselowersb");
-    get(m_pHighLowRB, "automatic");
-    get(m_pFontSizeFT, "relativefontsize");
-    get(m_pFontSizeMF, "fontsizesb");
-    get(m_pRotationContainer, "rotationcontainer");
-    get(m_pScalingFT, "scale");
-    get(m_pScalingAndRotationFT, "rotateandscale");
-    get(m_p0degRB, "0deg");
-    get(m_p90degRB, "90deg");
-    get(m_p270degRB, "270deg");
-    get(m_pFitToLineCB, "fittoline");
-    get(m_pScaleWidthMF, "scalewidthsb");
-    get(m_pKerningMF, "kerningsb");
-    get(m_pPairKerningBtn, "pairkerning");
-
-    get(m_pPreviewWin, "preview");
-
+    m_xPreviewWin.reset(new weld::CustomWeld(*m_xBuilder, "preview", m_aPreviewWin));
     Initialize();
 }
 
 SvxCharPositionPage::~SvxCharPositionPage()
 {
-    disposeOnce();
-}
-
-void SvxCharPositionPage::dispose()
-{
-    m_pHighPosBtn.clear();
-    m_pNormalPosBtn.clear();
-    m_pLowPosBtn.clear();
-    m_pHighLowFT.clear();
-    m_pHighLowMF.clear();
-    m_pHighLowRB.clear();
-    m_pFontSizeFT.clear();
-    m_pFontSizeMF.clear();
-    m_pRotationContainer.clear();
-    m_pScalingFT.clear();
-    m_pScalingAndRotationFT.clear();
-    m_p0degRB.clear();
-    m_p90degRB.clear();
-    m_p270degRB.clear();
-    m_pFitToLineCB.clear();
-    m_pScaleWidthMF.clear();
-    m_pKerningMF.clear();
-    m_pPairKerningBtn.clear();
-    SvxCharBasePage::dispose();
 }
 
 
@@ -2546,31 +2569,27 @@ void SvxCharPositionPage::Initialize()
     GetPreviewCJKFont().SetFontSize( Size( 0, 240 ) );
     GetPreviewCTLFont().SetFontSize( Size( 0, 240 ) );
 
-    m_pNormalPosBtn->Check();
-    PositionHdl_Impl( m_pNormalPosBtn );
+    m_xNormalPosBtn->set_active(true);
+    PositionHdl_Impl(*m_xNormalPosBtn);
 
-    Link<Button*,void> aLink2 = LINK( this, SvxCharPositionPage, PositionHdl_Impl );
-    m_pHighPosBtn->SetClickHdl( aLink2 );
-    m_pNormalPosBtn->SetClickHdl( aLink2 );
-    m_pLowPosBtn->SetClickHdl( aLink2 );
+    Link<weld::ToggleButton&,void> aLink2 = LINK(this, SvxCharPositionPage, PositionHdl_Impl);
+    m_xHighPosBtn->connect_toggled(aLink2);
+    m_xNormalPosBtn->connect_toggled(aLink2);
+    m_xLowPosBtn->connect_toggled(aLink2);
 
     aLink2 = LINK( this, SvxCharPositionPage, RotationHdl_Impl );
-    m_p0degRB->SetClickHdl( aLink2 );
-    m_p90degRB->SetClickHdl( aLink2 );
-    m_p270degRB->SetClickHdl( aLink2 );
-
-    Link<Edit&,void> aLink = LINK( this, SvxCharPositionPage, FontModifyHdl_Impl );
-    m_pHighLowMF->SetModifyHdl( aLink );
-    m_pFontSizeMF->SetModifyHdl( aLink );
+    m_x0degRB->connect_toggled(aLink2);
+    m_x90degRB->connect_toggled(aLink2);
+    m_x270degRB->connect_toggled(aLink2);
 
-    Link<Control&,void> aLink3 = LINK( this, SvxCharPositionPage, LoseFocusHdl_Impl );
-    m_pHighLowMF->SetLoseFocusHdl( aLink3 );
-    m_pFontSizeMF->SetLoseFocusHdl( aLink3 );
+    Link<weld::MetricSpinButton&,void> aLink3 = LINK(this, SvxCharPositionPage, ValueChangedHdl_Impl);
+    m_xHighLowMF->connect_value_changed(aLink3);
+    m_xFontSizeMF->connect_value_changed(aLink3);
 
-    m_pHighLowRB->SetClickHdl( LINK( this, SvxCharPositionPage, AutoPositionHdl_Impl ) );
-    m_pFitToLineCB->SetClickHdl( LINK( this, SvxCharPositionPage, FitToLineHdl_Impl ) );
-    m_pKerningMF->SetModifyHdl( LINK( this, SvxCharPositionPage, KerningModifyHdl_Impl ) );
-    m_pScaleWidthMF->SetModifyHdl( LINK( this, SvxCharPositionPage, ScaleWidthModifyHdl_Impl ) );
+    m_xHighLowRB->connect_toggled(LINK(this, SvxCharPositionPage, AutoPositionHdl_Impl));
+    m_xFitToLineCB->connect_toggled(LINK(this, SvxCharPositionPage, FitToLineHdl_Impl));
+    m_xKerningMF->connect_value_changed(LINK(this, SvxCharPositionPage, KerningModifyHdl_Impl));
+    m_xScaleWidthMF->connect_value_changed(LINK(this, SvxCharPositionPage, ScaleWidthModifyHdl_Impl));
 }
 
 void SvxCharPositionPage::UpdatePreview_Impl( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc )
@@ -2596,102 +2615,93 @@ void SvxCharPositionPage::SetEscapement_Impl( SvxEscapement nEsc )
 
     short nFac = aEscItm.GetEsc() < 0 ? -1 : 1;
 
-    m_pHighLowMF->SetValue( aEscItm.GetEsc() * nFac );
-    m_pFontSizeMF->SetValue( aEscItm.GetProportionalHeight() );
+    m_xHighLowMF->set_value(aEscItm.GetEsc() * nFac, FUNIT_PERCENT);
+    m_xFontSizeMF->set_value(aEscItm.GetProportionalHeight(), FUNIT_PERCENT);
 
     if ( SvxEscapement::Off == nEsc )
     {
-        m_pHighLowFT->Disable();
-        m_pHighLowMF->Disable();
-        m_pFontSizeFT->Disable();
-        m_pFontSizeMF->Disable();
-        m_pHighLowRB->Disable();
+        m_xHighLowFT->set_sensitive(false);
+        m_xHighLowMF->set_sensitive(false);
+        m_xFontSizeFT->set_sensitive(false);
+        m_xFontSizeMF->set_sensitive(false);
+        m_xHighLowRB->set_sensitive(false);
     }
     else
     {
-        m_pFontSizeFT->Enable();
-        m_pFontSizeMF->Enable();
-        m_pHighLowRB->Enable();
+        m_xFontSizeFT->set_sensitive(true);
+        m_xFontSizeMF->set_sensitive(true);
+        m_xHighLowRB->set_sensitive(true);
 
-        if ( !m_pHighLowRB->IsChecked() )
+        if (!m_xHighLowRB->get_active())
         {
-            m_pHighLowFT->Enable();
-            m_pHighLowMF->Enable();
+            m_xHighLowFT->set_sensitive(true);
+            m_xHighLowMF->set_sensitive(true);
         }
         else
-            AutoPositionHdl_Impl( m_pHighLowRB );
+            AutoPositionHdl_Impl(*m_xHighLowRB);
     }
 
     UpdatePreview_Impl( 100, aEscItm.GetProportionalHeight(), aEscItm.GetEsc() );
 }
 
 
-IMPL_LINK( SvxCharPositionPage, PositionHdl_Impl, Button*, pBtn, void )
+IMPL_LINK_NOARG(SvxCharPositionPage, PositionHdl_Impl, weld::ToggleButton&, void)
 {
     SvxEscapement nEsc = SvxEscapement::Off;   // also when pBtn == NULL
 
-    if ( m_pHighPosBtn == pBtn )
+    if (m_xHighPosBtn->get_active())
         nEsc = SvxEscapement::Superscript;
-    else if ( m_pLowPosBtn == pBtn )
+    else if (m_xLowPosBtn->get_active())
         nEsc = SvxEscapement::Subscript;
 
     SetEscapement_Impl( nEsc );
 }
 
-
-IMPL_LINK( SvxCharPositionPage, RotationHdl_Impl, Button*, pBtn, void )
+IMPL_LINK_NOARG(SvxCharPositionPage, RotationHdl_Impl, weld::ToggleButton&, void)
 {
     bool bEnable = false;
-    if (m_p90degRB == pBtn  || m_p270degRB == pBtn)
+    if (m_x90degRB->get_active() || m_x270degRB->get_active())
         bEnable = true;
     else
-        OSL_ENSURE( m_p0degRB == pBtn, "unexpected button" );
-    m_pFitToLineCB->Enable( bEnable );
+        OSL_ENSURE(m_x0degRB->get_active(), "unexpected button");
+    m_xFitToLineCB->set_sensitive(bEnable);
 }
 
-
-IMPL_LINK_NOARG(SvxCharPositionPage, FontModifyHdl_Impl, Edit&, void)
+void SvxCharPositionPage::FontModifyHdl_Impl()
 {
-    sal_uInt8 nEscProp = static_cast<sal_uInt8>(m_pFontSizeMF->GetValue());
-    short nEsc  = static_cast<short>(m_pHighLowMF->GetValue());
-    nEsc *= m_pLowPosBtn->IsChecked() ? -1 : 1;
+    sal_uInt8 nEscProp = static_cast<sal_uInt8>(m_xFontSizeMF->get_value(FUNIT_PERCENT));
+    short nEsc  = static_cast<short>(m_xHighLowMF->get_value(FUNIT_PERCENT));
+    nEsc *= m_xLowPosBtn->get_active() ? -1 : 1;
     UpdatePreview_Impl( 100, nEscProp, nEsc );
 }
 
-
-IMPL_LINK( SvxCharPositionPage, AutoPositionHdl_Impl, Button*, pBox, void )
+IMPL_LINK(SvxCharPositionPage, AutoPositionHdl_Impl, weld::ToggleButton&, rBox, void)
 {
-    if ( static_cast<CheckBox*>(pBox)->IsChecked() )
+    if (rBox.get_active())
     {
-        m_pHighLowFT->Disable();
-        m_pHighLowMF->Disable();
+        m_xHighLowFT->set_sensitive(false);
+        m_xHighLowMF->set_sensitive(false);
     }
     else
-        PositionHdl_Impl( m_pHighPosBtn->IsChecked() ? m_pHighPosBtn
-                                                      : m_pLowPosBtn->IsChecked() ? m_pLowPosBtn
-                                                                                   : m_pNormalPosBtn );
+        PositionHdl_Impl(m_xHighPosBtn->get_active() ? *m_xHighPosBtn
+                                                     : m_xLowPosBtn->get_active() ? *m_xLowPosBtn
+                                                                                  : *m_xNormalPosBtn);
 }
 
-
-IMPL_LINK( SvxCharPositionPage, FitToLineHdl_Impl, Button*, pBox, void )
+IMPL_LINK_NOARG(SvxCharPositionPage, FitToLineHdl_Impl, weld::ToggleButton&, void)
 {
-    if (m_pFitToLineCB == pBox)
-    {
-        sal_uInt16 nVal = m_nScaleWidthInitialVal;
-        if (m_pFitToLineCB->IsChecked())
-            nVal = m_nScaleWidthItemSetVal;
-        m_pScaleWidthMF->SetValue( nVal );
-
-        m_pPreviewWin->SetFontWidthScale( nVal );
-    }
+    sal_uInt16 nVal = m_nScaleWidthInitialVal;
+    if (m_xFitToLineCB->get_active())
+        nVal = m_nScaleWidthItemSetVal;
+    m_xScaleWidthMF->set_value(nVal, FUNIT_PERCENT);
+    m_aPreviewWin.SetFontWidthScale( nVal );
 }
 
-
-IMPL_LINK_NOARG(SvxCharPositionPage, KerningModifyHdl_Impl, Edit&, void)
+IMPL_LINK_NOARG(SvxCharPositionPage, KerningModifyHdl_Impl, weld::MetricSpinButton&, void)
 {
-    long nVal = static_cast<long>(m_pKerningMF->GetValue());
+    long nVal = static_cast<long>(m_xKerningMF->get_value(FUNIT_POINT));
     nVal = LogicToLogic( nVal, MapUnit::MapPoint, MapUnit::MapTwip );
-    long nKern = static_cast<short>(m_pKerningMF->Denormalize( nVal ));
+    long nKern = static_cast<short>(m_xKerningMF->denormalize(nVal));
 
     SvxFont& rFont = GetPreviewFont();
     SvxFont& rCJKFont = GetPreviewCJKFont();
@@ -2700,37 +2710,36 @@ IMPL_LINK_NOARG(SvxCharPositionPage, KerningModifyHdl_Impl, Edit&, void)
     rFont.SetFixKerning( static_cast<short>(nKern) );
     rCJKFont.SetFixKerning( static_cast<short>(nKern) );
     rCTLFont.SetFixKerning( static_cast<short>(nKern) );
-    m_pPreviewWin->Invalidate();
+    m_aPreviewWin.Invalidate();
 }
 
-
-IMPL_LINK( SvxCharPositionPage, LoseFocusHdl_Impl, Control&, rControl, void )
+IMPL_LINK(SvxCharPositionPage, ValueChangedHdl_Impl, weld::MetricSpinButton&, rField, void)
 {
-    MetricField* pField = static_cast<MetricField*>(&rControl);
-    bool bHigh = m_pHighPosBtn->IsChecked();
-    bool bLow = m_pLowPosBtn->IsChecked();
+    bool bHigh = m_xHighPosBtn->get_active();
+    bool bLow = m_xLowPosBtn->get_active();
     DBG_ASSERT( bHigh || bLow, "normal position is not valid" );
 
-    if ( m_pHighLowMF == pField )
+    if (m_xHighLowMF.get() == &rField)
     {
         if ( bLow )
-            m_nSubEsc = static_cast<short>(m_pHighLowMF->GetValue()) * -1;
+            m_nSubEsc = static_cast<short>(m_xHighLowMF->get_value(FUNIT_PERCENT)) * -1;
         else
-            m_nSuperEsc = static_cast<short>(m_pHighLowMF->GetValue());
+            m_nSuperEsc = static_cast<short>(m_xHighLowMF->get_value(FUNIT_PERCENT));
     }
-    else if ( m_pFontSizeMF == pField )
+    else if (m_xFontSizeMF.get() == &rField)
     {
         if ( bLow )
-            m_nSubProp = static_cast<sal_uInt8>(m_pFontSizeMF->GetValue());
+            m_nSubProp = static_cast<sal_uInt8>(m_xFontSizeMF->get_value(FUNIT_PERCENT));
         else
-            m_nSuperProp = static_cast<sal_uInt8>(m_pFontSizeMF->GetValue());
+            m_nSuperProp = static_cast<sal_uInt8>(m_xFontSizeMF->get_value(FUNIT_PERCENT));
     }
-}
 
+    FontModifyHdl_Impl();
+}
 
-IMPL_LINK_NOARG(SvxCharPositionPage, ScaleWidthModifyHdl_Impl, Edit&, void)
+IMPL_LINK_NOARG(SvxCharPositionPage, ScaleWidthModifyHdl_Impl, weld::MetricSpinButton&, void)
 {
-    m_pPreviewWin->SetFontWidthScale( sal_uInt16( m_pScaleWidthMF->GetValue() ) );
+    m_aPreviewWin.SetFontWidthScale(sal_uInt16(m_xScaleWidthMF->get_value(FUNIT_PERCENT)));
 }
 
 DeactivateRC SvxCharPositionPage::DeactivatePage( SfxItemSet* _pSet )
@@ -2740,13 +2749,11 @@ DeactivateRC SvxCharPositionPage::DeactivatePage( SfxItemSet* _pSet )
     return DeactivateRC::LeavePage;
 }
 
-
-VclPtr<SfxTabPage> SvxCharPositionPage::Create( TabPageParent pParent, const SfxItemSet* rSet )
+VclPtr<SfxTabPage> SvxCharPositionPage::Create(TabPageParent pParent, const SfxItemSet* rSet)
 {
-    return VclPtr<SvxCharPositionPage>::Create( pParent.pParent, *rSet );
+    return VclPtr<SvxCharPositionPage>::Create(pParent, *rSet);
 }
 
-
 void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
 {
     OUString sUser = GetUserData();
@@ -2761,13 +2768,13 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
         //fdo#75307 validate all the entries and discard all of them if any are
         //out of range
         bool bValid = true;
-        if (m_nSuperEsc < m_pHighLowMF->GetMin() || m_nSuperEsc > m_pHighLowMF->GetMax())
+        if (m_nSuperEsc < m_xHighLowMF->get_min(FUNIT_PERCENT) || m_nSuperEsc > m_xHighLowMF->get_max(FUNIT_PERCENT))
             bValid = false;
-        if (m_nSubEsc*-1 < m_pHighLowMF->GetMin() || m_nSubEsc*-1 > m_pHighLowMF->GetMax())
+        if (m_nSubEsc*-1 < m_xHighLowMF->get_min(FUNIT_PERCENT) || m_nSubEsc*-1 > m_xHighLowMF->get_max(FUNIT_PERCENT))
             bValid = false;
-        if (m_nSuperProp < m_pFontSizeMF->GetMin() || m_nSuperProp > m_pFontSizeMF->GetMax())
+        if (m_nSuperProp < m_xFontSizeMF->get_min(FUNIT_PERCENT) || m_nSuperProp > m_xFontSizeMF->get_max(FUNIT_PERCENT))
             bValid = false;
-        if (m_nSubProp < m_pFontSizeMF->GetMin() || m_nSubProp > m_pFontSizeMF->GetMax())
+        if (m_nSubProp < m_xFontSizeMF->get_min(FUNIT_PERCENT) || m_nSubProp > m_xFontSizeMF->get_max(FUNIT_PERCENT))
             bValid = false;
 
         if (!bValid)
@@ -2782,10 +2789,10 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
     short nEsc = 0;
     sal_uInt8 nEscProp = 100;
 
-    m_pHighLowFT->Disable();
-    m_pHighLowMF->Disable();
-    m_pFontSizeFT->Disable();
-    m_pFontSizeMF->Disable();
+    m_xHighLowFT->set_sensitive(false);
+    m_xHighLowMF->set_sensitive(false);
+    m_xFontSizeFT->set_sensitive(false);
+    m_xFontSizeMF->set_sensitive(false);
 
     SvxFont& rFont = GetPreviewFont();
     SvxFont& rCJKFont = GetPreviewCJKFont();
@@ -2800,10 +2807,10 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
 
         if ( nEsc != 0 )
         {
-            m_pHighLowFT->Enable();
-            m_pHighLowMF->Enable();
-            m_pFontSizeFT->Enable();
-            m_pFontSizeMF->Enable();
+            m_xHighLowFT->set_sensitive(true);
+            m_xHighLowMF->set_sensitive(true);
+            m_xFontSizeFT->set_sensitive(true);
+            m_xFontSizeMF->set_sensitive(true);
 
             short nFac;
             bool bAutomatic(false);
@@ -2811,7 +2818,7 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
             if ( nEsc > 0 )
             {
                 nFac = 1;
-                m_pHighPosBtn->Check();
+                m_xHighPosBtn->set_active(true);
                 if ( nEsc == DFLT_ESC_AUTO_SUPER )
                 {
                     nEsc = DFLT_ESC_SUPER;
@@ -2821,40 +2828,40 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
             else
             {
                 nFac = -1;
-                m_pLowPosBtn->Check();
+                m_xLowPosBtn->set_active(true);
                 if ( nEsc == DFLT_ESC_AUTO_SUB )
                 {
                     nEsc = DFLT_ESC_SUB;
                     bAutomatic = true;
                 }
             }
-            if (!m_pHighLowRB->IsEnabled())
+            if (!m_xHighLowRB->get_sensitive())
             {
-                m_pHighLowRB->Enable();
+                m_xHighLowRB->set_sensitive(true);
             }
-            m_pHighLowRB->Check(bAutomatic);
+            m_xHighLowRB->set_active(bAutomatic);
 
-            if ( m_pHighLowRB->IsChecked() )
+            if (m_xHighLowRB->get_active())
             {
-                m_pHighLowFT->Disable();
-                m_pHighLowMF->Disable();
+                m_xHighLowFT->set_sensitive(false);
+                m_xHighLowMF->set_sensitive(false);
             }
-            m_pHighLowMF->SetValue( m_pHighLowMF->Normalize( nFac * nEsc ) );
+            m_xHighLowMF->set_value(m_xHighLowMF->normalize(nFac * nEsc), FUNIT_PERCENT);
         }
         else
         {
-            m_pNormalPosBtn->Check();
-            m_pHighLowRB->Check();
-            PositionHdl_Impl( nullptr );
+            m_xNormalPosBtn->set_active(true);
+            m_xHighLowRB->set_active(true);
+            PositionHdl_Impl(*m_xNormalPosBtn);
         }
         //the height has to be set after the handler is called to keep the value also if the escapement is zero
-        m_pFontSizeMF->SetValue( m_pFontSizeMF->Normalize( nEscProp ) );
+        m_xFontSizeMF->set_value(m_xFontSizeMF->normalize(nEscProp), FUNIT_PERCENT);
     }
     else
     {
-        m_pHighPosBtn->Check( false );
-        m_pNormalPosBtn->Check( false );
-        m_pLowPosBtn->Check( false );
+        m_xHighPosBtn->set_active(false);
+        m_xNormalPosBtn->set_active(false);
+        m_xLowPosBtn->set_active(false);
     }
 
     // set BspFont
@@ -2867,7 +2874,7 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
     {
         const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>(rSet->Get( nWhich ));
         MapUnit eUnit = rSet->GetPool()->GetMetric( nWhich );
-        long nBig = static_cast<long>(m_pKerningMF->Normalize( static_cast<long>(rItem.GetValue()) ));
+        long nBig = static_cast<long>(m_xKerningMF->normalize( static_cast<long>(rItem.GetValue()) ));
         long nKerning = LogicToLogic( nBig, eUnit, MapUnit::MapPoint );
 
         // set Kerning at the Font, convert into Twips before
@@ -2877,13 +2884,13 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
         rCTLFont.SetFixKerning( static_cast<short>(nKern) );
 
         //the attribute value must be displayed also if it's above the maximum allowed value
-        long nVal = static_cast<long>(m_pKerningMF->GetMax());
+        long nVal = static_cast<long>(m_xKerningMF->get_max(FUNIT_POINT));
         if(nVal < nKerning)
-            m_pKerningMF->SetMax( nKerning );
-        m_pKerningMF->SetValue( nKerning );
+            m_xKerningMF->set_max(nKerning, FUNIT_POINT);
+        m_xKerningMF->set_value(nKerning, FUNIT_POINT);
     }
     else
-        m_pKerningMF->SetText( OUString() );
+        m_xKerningMF->set_text(OUString());
 
     // Pair kerning
     nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
@@ -2891,10 +2898,10 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
     if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
     {
         const SvxAutoKernItem& rItem = static_cast<const SvxAutoKernItem&>(rSet->Get( nWhich ));
-        m_pPairKerningBtn->Check( rItem.GetValue() );
+        m_xPairKerningBtn->set_active(rItem.GetValue());
     }
     else
-        m_pPairKerningBtn->Check( false );
+        m_xPairKerningBtn->set_active(false);
 
     // Scale Width
     nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
@@ -2902,10 +2909,10 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
     {
         const SvxCharScaleWidthItem& rItem = static_cast<const SvxCharScaleWidthItem&>( rSet->Get( nWhich ) );
         m_nScaleWidthInitialVal = rItem.GetValue();
-        m_pScaleWidthMF->SetValue( m_nScaleWidthInitialVal );
+        m_xScaleWidthMF->set_value(m_nScaleWidthInitialVal, FUNIT_PERCENT);
     }
     else
-        m_pScaleWidthMF->SetValue( 100 );
+        m_xScaleWidthMF->set_value(100, FUNIT_PERCENT);
 
     nWhich = GetWhich( SID_ATTR_CHAR_WIDTH_FIT_TO_LINE );
     if ( rSet->GetItemState( nWhich ) >= SfxItemState::DEFAULT )
@@ -2916,73 +2923,69 @@ void SvxCharPositionPage::Reset( const SfxItemSet* rSet )
     SfxItemState eState = rSet->GetItemState( nWhich );
     if( SfxItemState::UNKNOWN == eState )
     {
-        m_pRotationContainer->Hide();
-        m_pScalingAndRotationFT->Hide();
-        m_pScalingFT->Show();
+        m_xRotationContainer->hide();
+        m_xScalingAndRotationFT->hide();
+        m_xScalingFT->show();
     }
     else
     {
-        m_pRotationContainer->Show();
-        m_pScalingAndRotationFT->Show();
-        m_pScalingFT->Hide();
+        m_xRotationContainer->show();
+        m_xScalingAndRotationFT->show();
+        m_xScalingFT->hide();
 
-        Link<Button*,void> aOldLink( m_pFitToLineCB->GetClickHdl() );
-        m_pFitToLineCB->SetClickHdl( Link<Button*,void>() );
         if( eState >= SfxItemState::DEFAULT )
         {
             const SvxCharRotateItem& rItem =
                     static_cast<const SvxCharRotateItem&>( rSet->Get( nWhich ));
             if (rItem.IsBottomToTop())
-                m_p90degRB->Check();
+                m_x90degRB->set_active(true);
             else if (rItem.IsTopToBottom())
-                m_p270degRB->Check();
+                m_x270degRB->set_active(true);
             else
             {
                 DBG_ASSERT( 0 == rItem.GetValue(), "incorrect value" );
-                m_p0degRB->Check();
+                m_x0degRB->set_active(true);
             }
-            m_pFitToLineCB->Check( rItem.IsFitToLine() );
+            m_xFitToLineCB->set_active(rItem.IsFitToLine());
         }
         else
         {
             if( eState == SfxItemState::DONTCARE )
             {
-                m_p0degRB->Check( false );
-                m_p90degRB->Check( false );
-                m_p270degRB->Check( false );
+                m_x0degRB->set_active(false);
+                m_x90degRB->set_active(false);
+                m_x270degRB->set_active(false);
             }
             else
-                m_p0degRB->Check();
+                m_x0degRB->set_active(true);
 
-            m_pFitToLineCB->Check( false );
+            m_xFitToLineCB->set_active(false);
         }
-        m_pFitToLineCB->SetClickHdl( aOldLink );
-        m_pFitToLineCB->Enable( !m_p0degRB->IsChecked() );
+        m_xFitToLineCB->set_sensitive(!m_x0degRB->get_active());
 
         // is this value set?
         if( SfxItemState::UNKNOWN == rSet->GetItemState( GetWhich(
                                         SID_ATTR_CHAR_WIDTH_FIT_TO_LINE ) ))
-            m_pFitToLineCB->Hide();
+            m_xFitToLineCB->hide();
     }
     ChangesApplied();
 }
 
 void SvxCharPositionPage::ChangesApplied()
 {
-    m_pHighPosBtn->SaveValue();
-    m_pNormalPosBtn->SaveValue();
-    m_pLowPosBtn->SaveValue();
-    m_pHighLowRB->SaveValue();
-    m_p0degRB->SaveValue();
-    m_p90degRB->SaveValue();
-    m_p270degRB->SaveValue();
-    m_pFitToLineCB->SaveValue();
-    m_pScaleWidthMF->SaveValue();
-    m_pKerningMF->SaveValue();
-    m_pPairKerningBtn->SaveValue();
+    m_xHighPosBtn->save_state();
+    m_xNormalPosBtn->save_state();
+    m_xLowPosBtn->save_state();
+    m_xHighLowRB->save_state();
+    m_x0degRB->save_state();
+    m_x90degRB->save_state();
+    m_x270degRB->save_state();
+    m_xFitToLineCB->save_state();
+    m_xScaleWidthMF->save_value();
+    m_xKerningMF->save_value();
+    m_xPairKerningBtn->save_state();
 }
 
-
 bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
 {
     //  Position (high, normal or low)
@@ -2990,20 +2993,20 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
     bool bModified = false, bChanged = true;
     sal_uInt16 nWhich = GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
     const SfxPoolItem* pOld = GetOldItem( *rSet, SID_ATTR_CHAR_ESCAPEMENT );
-    const bool bHigh = m_pHighPosBtn->IsChecked();
+    const bool bHigh = m_xHighPosBtn->get_active();
     short nEsc;
     sal_uInt8  nEscProp;
 
-    if ( bHigh || m_pLowPosBtn->IsChecked() )
+    if (bHigh || m_xLowPosBtn->get_active())
     {
-        if ( m_pHighLowRB->IsChecked() )
+        if (m_xHighLowRB->get_active())
             nEsc = bHigh ? DFLT_ESC_AUTO_SUPER : DFLT_ESC_AUTO_SUB;
         else
         {
-            nEsc = static_cast<short>(m_pHighLowMF->Denormalize( m_pHighLowMF->GetValue() ));
+            nEsc = static_cast<short>(m_xHighLowMF->denormalize(m_xHighLowMF->get_value(FUNIT_PERCENT)));
             nEsc *= (bHigh ? 1 : -1);
         }
-        nEscProp = static_cast<sal_uInt8>(m_pFontSizeMF->Denormalize( m_pFontSizeMF->GetValue() ));
+        nEscProp = static_cast<sal_uInt8>(m_xFontSizeMF->denormalize(m_xFontSizeMF->get_value(FUNIT_PERCENT)));
     }
     else
     {
@@ -3018,12 +3021,12 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
             bChanged = false;
     }
 
-    if ( !bChanged && !m_pHighPosBtn->GetSavedValue() &&
-         !m_pNormalPosBtn->GetSavedValue() && !m_pLowPosBtn->GetSavedValue() )
+    if ( !bChanged && !m_xHighPosBtn->get_saved_state() &&
+         !m_xNormalPosBtn->get_saved_state() && !m_xLowPosBtn->get_saved_state() )
         bChanged = true;
 
     if ( bChanged &&
-         ( m_pHighPosBtn->IsChecked() || m_pNormalPosBtn->IsChecked() || m_pLowPosBtn->IsChecked() ) )
+         ( m_xHighPosBtn->get_active() || m_xNormalPosBtn->get_active() || m_xLowPosBtn->get_active() ) )
     {
         rSet->Put( SvxEscapementItem( nEsc, nEscProp, nWhich ) );
         bModified = true;
@@ -3039,15 +3042,15 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
     short nKerning = 0;
     MapUnit eUnit = rSet->GetPool()->GetMetric( nWhich );
 
-    long nTmp = static_cast<long>(m_pKerningMF->GetValue());
+    long nTmp = static_cast<long>(m_xKerningMF->get_value(FUNIT_POINT));
     long nVal = LogicToLogic( nTmp, MapUnit::MapPoint, eUnit );
-    nKerning = static_cast<short>(m_pKerningMF->Denormalize( nVal ));
+    nKerning = static_cast<short>(m_xKerningMF->denormalize( nVal ));
 
     SfxItemState eOldKernState = rOldSet.GetItemState( nWhich, false );
     if ( pOld )
     {
         const SvxKerningItem& rItem = *static_cast<const SvxKerningItem*>(pOld);
-        if ( (eOldKernState >= SfxItemState::DEFAULT || m_pKerningMF->GetText().isEmpty()) && rItem.GetValue() == nKerning )
+        if ( (eOldKernState >= SfxItemState::DEFAULT || m_xKerningMF->get_text().isEmpty()) && rItem.GetValue() == nKerning )
             bChanged = false;
     }
 
@@ -3062,9 +3065,9 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
     // Pair-Kerning
     nWhich = GetWhich( SID_ATTR_CHAR_AUTOKERN );
 
-    if ( m_pPairKerningBtn->IsValueChangedFromSaved() )
+    if (m_xPairKerningBtn->get_state_changed_from_saved())
     {
-        rSet->Put( SvxAutoKernItem( m_pPairKerningBtn->IsChecked(), nWhich ) );
+        rSet->Put( SvxAutoKernItem( m_xPairKerningBtn->get_active(), nWhich ) );
         bModified = true;
     }
     else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
@@ -3072,9 +3075,9 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
 
     // Scale Width
     nWhich = GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
-    if ( m_pScaleWidthMF->IsValueChangedFromSaved() )
+    if (m_xScaleWidthMF->get_value_changed_from_saved())
     {
-        rSet->Put( SvxCharScaleWidthItem( static_cast<sal_uInt16>(m_pScaleWidthMF->GetValue()), nWhich ) );
+        rSet->Put(SvxCharScaleWidthItem(static_cast<sal_uInt16>(m_xScaleWidthMF->get_value(FUNIT_PERCENT)), nWhich));
         bModified = true;
     }
     else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
@@ -3082,15 +3085,15 @@ bool SvxCharPositionPage::FillItemSet( SfxItemSet* rSet )
 
     // Rotation
     nWhich = GetWhich( SID_ATTR_CHAR_ROTATED );
-    if ( m_p0degRB->IsValueChangedFromSaved()  ||
-         m_p90degRB->IsValueChangedFromSaved()  ||
-         m_p270degRB->IsValueChangedFromSaved()  ||
-         m_pFitToLineCB->IsValueChangedFromSaved() )
+    if ( m_x0degRB->get_state_changed_from_saved()  ||
+         m_x90degRB->get_state_changed_from_saved()  ||
+         m_x270degRB->get_state_changed_from_saved()  ||
+         m_xFitToLineCB->get_state_changed_from_saved() )
     {
-        SvxCharRotateItem aItem( 0, m_pFitToLineCB->IsChecked(), nWhich );
-        if (m_p90degRB->IsChecked())
+        SvxCharRotateItem aItem( 0, m_xFitToLineCB->get_active(), nWhich );
+        if (m_x90degRB->get_active())
             aItem.SetBottomToTop();
-        else if (m_p270degRB->IsChecked())
+        else if (m_x270degRB->get_active())
             aItem.SetTopToBottom();
         rSet->Put( aItem );
         bModified = true;
diff --git a/cui/uiconfig/ui/positionpage.ui b/cui/uiconfig/ui/positionpage.ui
index d347bba3fe70..0e0c731d7b67 100644
--- a/cui/uiconfig/ui/positionpage.ui
+++ b/cui/uiconfig/ui/positionpage.ui
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.3 -->
+<!-- Generated with glade 3.20.4 -->
 <interface domain="cui">
   <requires lib="gtk+" version="3.18"/>
-  <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkAdjustment" id="adjustment1">
     <property name="lower">1</property>
     <property name="upper">100</property>
@@ -23,6 +22,12 @@
     <property name="step_increment">0.10000000000000001</property>
     <property name="page_increment">1</property>
   </object>
+  <object class="GtkAdjustment" id="adjustment4">
+    <property name="lower">1</property>
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
   <object class="GtkBox" id="PositionPage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -123,7 +128,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="positionpage|raiselower">Raise/lower by</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">raiselowersb:0%</property>
+                        <property name="mnemonic_widget">raiselowersb</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
@@ -132,7 +137,7 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkSpinButton" id="raiselowersb:0%">
+                      <object class="GtkSpinButton" id="raiselowersb">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="adjustment">adjustment1</property>
@@ -143,10 +148,10 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkSpinButton" id="fontsizesb:0%">
+                      <object class="GtkSpinButton" id="fontsizesb">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="adjustment">adjustment1</property>
+                        <property name="adjustment">adjustment4</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
@@ -174,7 +179,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="positionpage|relativefontsize">Relative font size</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">fontsizesb:0%</property>
+                        <property name="mnemonic_widget">fontsizesb</property>
                         <property name="xalign">0</property>
                       </object>
                       <packing>
@@ -245,7 +250,6 @@
                         <property name="use_underline">True</property>
                         <property name="xalign">0</property>
                         <property name="draw_indicator">True</property>
-                        <property name="group">90deg</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -262,7 +266,7 @@
                         <property name="use_underline">True</property>
                         <property name="xalign">0</property>
                         <property name="draw_indicator">True</property>
-                        <property name="group">270deg</property>
+                        <property name="group">0deg</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -321,7 +325,7 @@
                         <property name="can_focus">False</property>
                         <property name="label" translatable="yes" context="positionpage|label24">Scale width</property>
                         <property name="use_underline">True</property>
-                        <property name="mnemonic_widget">scalewidthsb:0%</property>
+                        <property name="mnemonic_widget">scalewidthsb</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -330,7 +334,7 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkSpinButton" id="scalewidthsb:0%">
+                      <object class="GtkSpinButton" id="scalewidthsb">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                         <property name="adjustment">adjustment2</property>
@@ -415,7 +419,21 @@
                 <property name="can_focus">False</property>
                 <property name="spacing">12</property>
                 <child>
-                  <object class="GtkSpinButton" id="kerningsb:0pt">
+                  <object class="GtkLabel" id="label7">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes" context="positionpage|label7">Character spacing</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">kerningsb</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="kerningsb">
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="adjustment">adjustment3</property>
@@ -424,7 +442,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">0</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
                 <child>
@@ -440,7 +458,7 @@
                   <packing>
                     <property name="expand">False</property>
                     <property name="fill">True</property>
-                    <property name="position">1</property>
+                    <property name="position">2</property>
                   </packing>
                 </child>
               </object>
@@ -473,14 +491,29 @@
         <property name="left_padding">12</property>
         <property name="right_padding">12</property>
         <child>
-          <object class="svxlo-SvxFontPrevWindow" id="preview:border">
+          <object class="GtkScrolledWindow">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can_focus">True</property>
             <property name="hexpand">True</property>
             <property name="vexpand">True</property>
-            <child internal-child="accessible">
-              <object class="AtkObject" id="preview:border-atkobject">
-                <property name="AtkObject::accessible-name" translatable="yes" context="positionpage|preview-atkobject">Preview</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="preview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="hexpand">True</property>
+                    <property name="vexpand">True</property>
+                    <child internal-child="accessible">
+                      <object class="AtkObject" id="preview-atkobject">
+                        <property name="AtkObject::accessible-name" translatable="yes" context="positionpage|preview-atkobject">Preview</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
diff --git a/include/sfx2/dialoghelper.hxx b/include/sfx2/dialoghelper.hxx
index f83c438f76b4..ed06d76b733d 100644
--- a/include/sfx2/dialoghelper.hxx
+++ b/include/sfx2/dialoghelper.hxx
@@ -33,7 +33,7 @@ Size SFX2_DLLPUBLIC getParagraphPreviewOptimalSize(const OutputDevice& rReferenc
 
 Size SFX2_DLLPUBLIC getDrawPreviewOptimalSize(const vcl::Window *pReference);
 
-Size SFX2_DLLPUBLIC getPreviewStripSize(const vcl::Window *pReference);
+Size SFX2_DLLPUBLIC getPreviewStripSize(const OutputDevice& rReference);
 
 Size SFX2_DLLPUBLIC getPreviewOptionsSize(const vcl::Window *pReference);
 
diff --git a/include/svx/fntctrl.hxx b/include/svx/fntctrl.hxx
index ed0828e8cc3b..c65b7e3d92e6 100644
--- a/include/svx/fntctrl.hxx
+++ b/include/svx/fntctrl.hxx
@@ -20,6 +20,7 @@
 #define INCLUDED_SVX_FNTCTRL_HXX
 
 #include <memory>
+#include <vcl/customweld.hxx>
 #include <vcl/window.hxx>
 #include <editeng/svxfont.hxx>
 #include <svx/svxdllapi.h>
@@ -88,6 +89,63 @@ public:
     virtual Size GetOptimalSize() const override;
 };
 
+class SAL_WARN_UNUSED SVX_DLLPUBLIC FontPrevWindow : public weld::CustomWidgetController
+{
+private:
+    std::unique_ptr<FontPrevWin_Impl> pImpl;
+    OUString maText;
+    bool mbResetForeground : 1;
+    bool mbResetBackground : 1;
+
+    SVX_DLLPRIVATE void ResetSettings(bool bForeground, bool bBackground);
+    SVX_DLLPRIVATE void ApplySettings(vcl::RenderContext& rRenderContext);
+    virtual void SetDrawingArea(weld::DrawingArea* pDrawingArea) override;
+    SVX_DLLPRIVATE static void SetFontSize(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont);
+    SVX_DLLPRIVATE static void SetFontLang(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont);
+
+public:
+                        FontPrevWindow();
+    virtual             ~FontPrevWindow() override;
+
+    virtual void        StyleUpdated() override;
+
+    void                Init( const SfxItemSet& rSet );
+
+    // for reasons of efficiency not const
+    SvxFont&            GetFont();
+    const SvxFont&      GetFont() const;
+    void                SetFont( const SvxFont& rNormalFont, const SvxFont& rCJKFont, const SvxFont& rCTLFont );
+    SvxFont&            GetCJKFont();
+    SvxFont&            GetCTLFont();
+    void                SetColor( const Color& rColor );
+    void                ResetColor();
+    void                SetBackColor( const Color& rColor );
+    void                UseResourceText();
+    const OUString&     GetText() const { return maText; }
+    void                SetText(const OUString& rText) { maText = rText; }
+    void                Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& ) override;
+
+    bool                IsTwoLines() const;
+    void                SetTwoLines(bool bSet);
+
+    void                SetBrackets(sal_Unicode cStart, sal_Unicode cEnd);
+
+    void                SetFontWidthScale( sal_uInt16 nScaleInPercent );
+
+    void                AutoCorrectFontColor();
+
+    void                SetPreviewText( const OUString& rString );
+    void                SetFontNameAsPreviewText();
+
+    static void         SetFont( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont );
+    static void         SetFontStyle( const SfxItemSet& rSet, sal_uInt16 nSlotPosture, sal_uInt16 nSlotWeight, SvxFont& rFont ); // posture/weight
+    void                SetFontWidthScale( const SfxItemSet& rSet );
+    void                SetFontEscapement( sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc );
+
+    void                SetFromItemSet( const SfxItemSet &rSet,
+                                        bool bPreviewBackgroundToCharacter );
+};
+
 #endif // INCLUDED_SVX_FNTCTRL_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 485470b25f02..86718d52a642 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -630,6 +630,20 @@ public:
         set_range(min, max, eValueUnit);
     }
 
+    int get_min(FieldUnit eValueUnit)
+    {
+        int min, dummy;
+        get_range(min, dummy, eValueUnit);
+        return min;
+    }
+
+    int get_max(FieldUnit eValueUnit)
+    {
+        int dummy, max;
+        get_range(dummy, max, eValueUnit);
+        return max;
+    }
+
     void set_increments(int step, int page, FieldUnit eValueUnit)
     {
         step = ConvertValue(step, eValueUnit, m_eSrcUnit);
diff --git a/sfx2/source/dialog/dialoghelper.cxx b/sfx2/source/dialog/dialoghelper.cxx
index 48a491d07c78..9e8bcd2f69b2 100644
--- a/sfx2/source/dialog/dialoghelper.cxx
+++ b/sfx2/source/dialog/dialoghelper.cxx
@@ -62,9 +62,9 @@ Size getDrawPreviewOptimalSize(const vcl::Window *pReference)
     return pReference->LogicToPixel(Size(88, 42), MapMode(MapUnit::MapAppFont));
 }
 
-Size getPreviewStripSize(const vcl::Window *pReference)
+Size getPreviewStripSize(const OutputDevice& rReference)
 {
-    return pReference->LogicToPixel(Size(70 , 40), MapMode(MapUnit::MapAppFont));
+    return rReference.LogicToPixel(Size(70 , 40), MapMode(MapUnit::MapAppFont));
 }
 
 Size getPreviewOptionsSize(const vcl::Window *pReference)
diff --git a/solenv/sanitizers/ui/cui.suppr b/solenv/sanitizers/ui/cui.suppr
index d2de43424f25..f5d24ef5b823 100644
--- a/solenv/sanitizers/ui/cui.suppr
+++ b/solenv/sanitizers/ui/cui.suppr
@@ -237,7 +237,6 @@ cui/uiconfig/ui/personalization_tab.ui://GtkButton[@id='default3'] button-no-lab
 cui/uiconfig/ui/personalization_tab.ui://GtkLabel[@id='applied_theme'] orphan-label
 cui/uiconfig/ui/personalization_tab.ui://GtkLabel[@id='extensions_label'] orphan-label
 cui/uiconfig/ui/personalization_tab.ui://GtkButton[@id='persona_preview'] button-no-label
-cui/uiconfig/ui/positionpage.ui://GtkSpinButton[@id='kerningsb:0pt'] no-labelled-by
 cui/uiconfig/ui/select_persona_dialog.ui://GtkEntry[@id='search_term'] no-labelled-by
 cui/uiconfig/ui/select_persona_dialog.ui://GtkButton[@id='suggestion1'] button-no-label
 cui/uiconfig/ui/select_persona_dialog.ui://GtkButton[@id='suggestion2'] button-no-label
diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx
index 7835a7a575ca..39f4913b038b 100644
--- a/svtools/source/control/valueset.cxx
+++ b/svtools/source/control/valueset.cxx
@@ -3442,7 +3442,7 @@ void SvtValueSet::ImplDrawItemText(vcl::RenderContext& rRenderContext, const OUS
 void SvtValueSet::StyleUpdated()
 {
     mbFormat = true;
-    Invalidate();
+    CustomWidgetController::StyleUpdated();
 }
 
 void SvtValueSet::SetColCount( sal_uInt16 nNewCols )
diff --git a/svx/source/dialog/dlgctrl.cxx b/svx/source/dialog/dlgctrl.cxx
index 171faef58906..e482f1f0a494 100644
--- a/svx/source/dialog/dlgctrl.cxx
+++ b/svx/source/dialog/dlgctrl.cxx
@@ -1947,7 +1947,7 @@ VCL_BUILDER_FACTORY(SvxXLinePreview)
 
 Size SvxXLinePreview::GetOptimalSize() const
 {
-    return getPreviewStripSize(this);
+    return getPreviewStripSize(*this);
 }
 
 SvxXLinePreview::~SvxXLinePreview()
@@ -2261,6 +2261,7 @@ void PreviewBase::LocalPostPaint(vcl::RenderContext& rRenderContext)
 void PreviewBase::StyleUpdated()
 {
     InitSettings();
+    CustomWidgetController::StyleUpdated();
 }
 
 XRectPreview::XRectPreview()
diff --git a/svx/source/dialog/fntctrl.cxx b/svx/source/dialog/fntctrl.cxx
index 3e4b2b3f9f51..8b1d978bdfd1 100644
--- a/svx/source/dialog/fntctrl.cxx
+++ b/svx/source/dialog/fntctrl.cxx
@@ -142,6 +142,7 @@ bool CleanAndCheckEmpty(OUString& rText)
 class FontPrevWin_Impl
 {
     friend class SvxFontPrevWindow;
+    friend class FontPrevWindow;
 
     SvxFont maFont;
     VclPtr<Printer> mpPrinter;
@@ -1448,7 +1449,913 @@ void SvxFontPrevWindow::SetFontEscapement(sal_uInt8 nProp, sal_uInt8 nEscProp, s
 
 Size SvxFontPrevWindow::GetOptimalSize() const
 {
-    return getPreviewStripSize(this);
+    return getPreviewStripSize(*this);
+}
+
+void FontPrevWindow::ResetSettings(bool bForeground, bool bBackground)
+{
+    mbResetForeground = bForeground;
+    mbResetBackground = bBackground;
+    Invalidate();
+}
+
+void FontPrevWindow::ApplySettings(vcl::RenderContext& rRenderContext)
+{
+    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+
+    if (mbResetForeground)
+    {
+        svtools::ColorConfig aColorConfig;
+        Color aTextColor(aColorConfig.GetColorValue(svtools::FONTCOLOR).nColor);
+        rRenderContext.SetTextColor(aTextColor);
+        mbResetForeground = false;
+    }
+
+    if (mbResetBackground)
+    {
+        rRenderContext.SetBackground(rStyleSettings.GetWindowColor());
+        mbResetBackground = false;
+    }
+}
+
+void FontPrevWindow::SetDrawingArea(weld::DrawingArea* pDrawingArea)
+{
+    Size aPrefSize(getPreviewStripSize(pDrawingArea->get_ref_device()));
+    pDrawingArea->set_size_request(aPrefSize.Width(), aPrefSize.Height());
+
+    CustomWidgetController::SetDrawingArea(pDrawingArea);
+
+    pImpl.reset(new FontPrevWin_Impl);
+    SfxViewShell* pSh = SfxViewShell::Current();
+
+    if (pSh)
+        pImpl->mpPrinter = pSh->GetPrinter();
+
+    if (!pImpl->mpPrinter)
+    {
+        pImpl->mpPrinter = VclPtr<Printer>::Create();
+        pImpl->mbDelPrinter = true;
+    }
+    initFont(pImpl->maFont);
+    initFont(pImpl->maCJKFont);
+    initFont(pImpl->maCTLFont);
+
+    ResetSettings(true, true);
+}
+
+FontPrevWindow::FontPrevWindow()
+    : mbResetForeground(true)
+    , mbResetBackground(true)
+{
+}
+
+FontPrevWindow::~FontPrevWindow()
+{
+}
+
+SvxFont& FontPrevWindow::GetCTLFont()
+{
+    return pImpl->maCTLFont;
+}
+
+SvxFont& FontPrevWindow::GetCJKFont()
+{
+    return pImpl->maCJKFont;
+}
+
+void FontPrevWindow::StyleUpdated()
+{
+    ResetSettings(true, true);
+    CustomWidgetController::StyleUpdated();
+}
+
+SvxFont& FontPrevWindow::GetFont()
+{
+    pImpl->Invalidate100PercentFontWidth();     // because the user might change the size
+    return pImpl->maFont;
+}
+
+const SvxFont& FontPrevWindow::GetFont() const
+{
+    return pImpl->maFont;
+}
+
+void FontPrevWindow::SetPreviewText( const OUString& rString )
+{
+    pImpl->maText = rString;
+    pImpl->mbTextInited = true;
+}
+
+void FontPrevWindow::SetFontNameAsPreviewText()
+{
+    pImpl->mbUseFontNameAsText = true;
+}
+
+void FontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& rCJKOutFont, const SvxFont& rCTLFont )
+{
+    setFont(rNormalOutFont, pImpl->maFont);
+    setFont(rCJKOutFont, pImpl->maCJKFont);
+    setFont(rCTLFont, pImpl->maCTLFont);
+
+    pImpl->Invalidate100PercentFontWidth();
+    Invalidate();
+}
+
+void FontPrevWindow::SetColor(const Color &rColor)
+{
+    pImpl->mpColor.reset(new Color(rColor));
+    Invalidate();
+}
+
+void FontPrevWindow::ResetColor()
+{
+    pImpl->mpColor.reset();
+    Invalidate();
+}
+
+void FontPrevWindow::SetBackColor(const Color &rColor)
+{
+    pImpl->mpBackColor.reset(new Color(rColor));
+    Invalidate();
+}
+
+void FontPrevWindow::UseResourceText()
+{
+    pImpl->mbUseResText = true;
+}
+
+void FontPrevWindow::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
+{
+    rRenderContext.Push(PushFlags::MAPMODE);
+    rRenderContext.SetMapMode(MapMode(MapUnit::MapTwip));
+
+    ApplySettings(rRenderContext);
+
+    Printer* pPrinter = pImpl->mpPrinter;
+    const SvxFont& rFont = pImpl->maFont;
+    const SvxFont& rCJKFont = pImpl->maCJKFont;
+    const SvxFont& rCTLFont = pImpl->maCTLFont;
+
+    if (!IsEnabled())
+    {
+        const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+        const Size aLogSize(rRenderContext.GetOutputSize());
+
+        tools::Rectangle aRect(Point(0, 0), aLogSize);
+        rRenderContext.SetLineColor();
+        rRenderContext.SetFillColor(rStyleSettings.GetWindowColor());
+        rRenderContext.DrawRect(aRect);
+    }
+    else
+    {
+        if (pImpl->mbUseResText)
+            pImpl->maText = GetText();
+        else if (!pImpl->mbSelection && !pImpl->mbTextInited)
+        {
+            using namespace css::i18n::ScriptType;
+
+            SfxViewShell* pSh = SfxViewShell::Current();
+
+            if (pSh && !pImpl->mbGetSelection && !pImpl->mbUseFontNameAsText)
+            {
+                pImpl->maText = pSh->GetSelectionText();
+                pImpl->mbGetSelection = true;
+                pImpl->mbSelection = !CleanAndCheckEmpty(pImpl->maText);
+            }
+
+            if (!pImpl->mbSelection || pImpl->mbUseFontNameAsText)
+            {
+                //If we're showing multiple sample texts, then they're all
+                //sample texts. If only showing Latin, continue to use
+                //the fontname as the preview
+                if ((pImpl->m_bCJKEnabled) || (pImpl->m_bCTLEnabled))
+                    pImpl->maText = makeRepresentativeTextForFont(LATIN, rFont);
+                else
+                    pImpl->maText = rFont.GetFamilyName();
+
+                if (pImpl->m_bCJKEnabled)
+                {
+                    if (!pImpl->maText.isEmpty())
+                        pImpl->maText += "   ";
+                    pImpl->maText += makeRepresentativeTextForFont(ASIAN, rCJKFont);
+
+                }
+                if (pImpl->m_bCTLEnabled)
+                {
+                    if (!pImpl->maText.isEmpty())
+                        pImpl->maText += "   ";
+                    pImpl->maText += makeRepresentativeTextForFont(COMPLEX, rCTLFont);
+                }
+            }
+
+            if (pImpl->maText.isEmpty())
+                pImpl->maText = GetText();
+
+            if (pImpl->maText.isEmpty())
+            {   // fdo#58427: still no text? let's try that one...
+                pImpl->maText = makeRepresentativeTextForFont(LATIN, rFont);
+            }
+
+            bool bEmpty = CleanAndCheckEmpty(pImpl->maText);
+            if (bEmpty)
+                pImpl->maText = GetText();
+
+            if (pImpl->maText.getLength() > (TEXT_WIDTH - 1))
+            {
+                const sal_Int32 nSpaceIdx = pImpl->maText.indexOf(" ", TEXT_WIDTH);
+                if (nSpaceIdx != -1)
+                    pImpl->maText = pImpl->maText.copy(0, nSpaceIdx);
+                else
+                    pImpl->maText = pImpl->maText.copy(0, (TEXT_WIDTH - 1));
+            }
+        }
+
+        // calculate text width scaling
+        pImpl->ScaleFontWidth(rRenderContext);
+
+        pImpl->CheckScript();
+        Size aTxtSize = pImpl->CalcTextSize(rRenderContext, pPrinter, rFont);
+
+        const Size aLogSize(rRenderContext.GetOutputSize());
+
+        long nX = aLogSize.Width()  / 2 - aTxtSize.Width() / 2;
+        long nY = aLogSize.Height() / 2 - aTxtSize.Height() / 2;
+
+        if (nY + pImpl->mnAscent > aLogSize.Height())
+            nY = aLogSize.Height() - pImpl->mnAscent;
+
+        if (pImpl->mpBackColor)
+        {
+            tools::Rectangle aRect(Point(0, 0), aLogSize);
+            Color aLineCol = rRenderContext.GetLineColor();
+            Color aFillCol = rRenderContext.GetFillColor();
+            rRenderContext.SetLineColor();
+            rRenderContext.SetFillColor(*pImpl->mpBackColor);
+            rRenderContext.DrawRect(aRect);
+            rRenderContext.SetLineColor(aLineCol);
+            rRenderContext.SetFillColor(aFillCol);
+        }
+        if (pImpl->mpColor)
+        {
+            tools::Rectangle aRect(Point(nX, nY), aTxtSize);
+            Color aLineCol = rRenderContext.GetLineColor();
+            Color aFillCol = rRenderContext.GetFillColor();
+            rRenderContext.SetLineColor();
+            rRenderContext.SetFillColor(*pImpl->mpColor);
+            rRenderContext.DrawRect(aRect);
+            rRenderContext.SetLineColor(aLineCol);
+            rRenderContext.SetFillColor(aFillCol);
+        }
+
+        long nStdAscent = pImpl->mnAscent;
+        nY += nStdAscent;
+
+        if (IsTwoLines())
+        {
+            SvxFont aSmallFont(rFont);
+            Size aOldSize = pImpl->maCJKFont.GetFontSize();
+            setFontSize(aSmallFont);
+            setFontSize(pImpl->maCJKFont);
+
+            long nStartBracketWidth = 0;
+            long nEndBracketWidth = 0;
+            long nTextWidth = 0;
+            if (pImpl->mcStartBracket)
+            {
+                OUString sBracket(pImpl->mcStartBracket);
+                nStartBracketWidth = rFont.GetTextSize(pPrinter, sBracket).Width();
+            }
+            if (pImpl->mcEndBracket)
+            {
+                OUString sBracket(pImpl->mcEndBracket);
+                nEndBracketWidth = rFont.GetTextSize(pPrinter, sBracket).Width();
+            }
+            nTextWidth = pImpl->CalcTextSize(rRenderContext, pPrinter, aSmallFont).Width();
+            long nResultWidth = nStartBracketWidth;
+            nResultWidth += nEndBracketWidth;
+            nResultWidth += nTextWidth;
+
+            long _nX = (aLogSize.Width() - nResultWidth) / 2;
+            rRenderContext.DrawLine(Point(0,  nY), Point(_nX, nY));
+            rRenderContext.DrawLine(Point(_nX + nResultWidth, nY), Point(aLogSize.Width(), nY));
+
+            long nSmallAscent = pImpl->mnAscent;
+            long nOffset = (nStdAscent - nSmallAscent) / 2;
+
+            if (pImpl->mcStartBracket)
+            {
+                OUString sBracket(pImpl->mcStartBracket);
+                rFont.DrawPrev(&rRenderContext, pPrinter, Point(_nX, nY - nOffset - 4), sBracket);
+                _nX += nStartBracketWidth;
+            }
+
+            Point aTmpPoint1(_nX, nY - nSmallAscent - 2);
+            Point aTmpPoint2(_nX, nY);
+            pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint1, aSmallFont);
+            pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint2, aSmallFont);
+
+            _nX += nTextWidth;
+            if (pImpl->mcEndBracket)
+            {
+                Point aTmpPoint( _nX + 1, nY - nOffset - 4);
+                OUString sBracket(pImpl->mcEndBracket);
+                rFont.DrawPrev(&rRenderContext, pPrinter, aTmpPoint, sBracket);
+            }
+            pImpl->maCJKFont.SetFontSize(aOldSize);
+        }
+        else
+        {
+
+            Color aLineCol = rRenderContext.GetLineColor();
+
+            rRenderContext.SetLineColor(rFont.GetColor());
+            rRenderContext.DrawLine(Point(0,  nY), Point(nX, nY));
+            rRenderContext.DrawLine(Point(nX + aTxtSize.Width(), nY), Point(aLogSize.Width(), nY));
+            rRenderContext.SetLineColor(aLineCol);
+
+            Point aTmpPoint(nX, nY);
+            pImpl->DrawPrev(rRenderContext, pPrinter, aTmpPoint, rFont);
+        }
+    }
+    rRenderContext.Pop();
+}
+
+bool FontPrevWindow::IsTwoLines() const
+{
+    return pImpl->mbTwoLines;
+}
+
+void FontPrevWindow::SetTwoLines(bool bSet)
+{
+    pImpl->mbTwoLines = bSet;
+}
+
+void FontPrevWindow::SetBrackets(sal_Unicode cStart, sal_Unicode cEnd)
+{
+    pImpl->mcStartBracket = cStart;
+    pImpl->mcEndBracket = cEnd;
+}
+
+void FontPrevWindow::SetFontWidthScale( sal_uInt16 n )
+{
+    if (pImpl->SetFontWidthScale(n))
+        Invalidate();
+}
+
+void FontPrevWindow::AutoCorrectFontColor()
+{
+    const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+    Color aFontColor(rStyleSettings.GetWindowTextColor());
+
+    if (COL_AUTO == pImpl->maFont.GetColor())
+        pImpl->maFont.SetColor(aFontColor);
+
+    if (COL_AUTO == pImpl->maCJKFont.GetColor())
+        pImpl->maCJKFont.SetColor(aFontColor);
+
+    if (COL_AUTO == pImpl->maCTLFont.GetColor())
+        pImpl->maCTLFont.SetColor(aFontColor);
+}
+
+void FontPrevWindow::SetFontSize( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
+{
+    sal_uInt16 nWhich;
+    long nH;
+    if (GetWhich(rSet, nSlot, nWhich))
+    {
+        nH = OutputDevice::LogicToLogic(static_cast<const SvxFontHeightItem&>(rSet.Get(nWhich)).GetHeight(),
+                          rSet.GetPool()->GetMetric(nWhich),
+                          MapUnit::MapTwip);
+    }
+    else
+        nH = 240;// as default 12pt
+
+    rFont.SetFontSize(Size(0, nH));
+}
+
+void FontPrevWindow::SetFontLang(const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont)
+{
+    sal_uInt16 nWhich;
+    LanguageType nLang;
+    if( GetWhich( rSet, nSlot, nWhich ) )
+        nLang = static_cast<const SvxLanguageItem&>(rSet.Get(nWhich)).GetLanguage();
+    else
+        nLang = LANGUAGE_NONE;
+    rFont.SetLanguage(nLang);
+}
+
+void FontPrevWindow::SetFromItemSet(const SfxItemSet &rSet, bool bPreviewBackgroundToCharacter)
+{
+    sal_uInt16 nWhich;
+    SvxFont& rFont = GetFont();
+    SvxFont& rCJKFont = GetCJKFont();
+    SvxFont& rCTLFont = GetCTLFont();
+
+    // Preview string
+    if( GetWhich( rSet, SID_CHAR_DLG_PREVIEW_STRING, nWhich ) )
+    {
+        const SfxStringItem& rItem = static_cast<const SfxStringItem&>( rSet.Get( nWhich ) );
+        const OUString& aString = rItem.GetValue();
+        if( !aString.isEmpty() )
+            SetPreviewText( aString );
+        else
+            SetFontNameAsPreviewText();
+    }
+
+    // Underline
+    FontLineStyle eUnderline;
+    if( GetWhich( rSet, SID_ATTR_CHAR_UNDERLINE, nWhich ) )
+    {
+        const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>( rSet.Get( nWhich ) );
+        eUnderline = rItem.GetValue();
+    }
+    else
+        eUnderline = LINESTYLE_NONE;
+
+    rFont.SetUnderline( eUnderline );
+    rCJKFont.SetUnderline( eUnderline );
+    rCTLFont.SetUnderline( eUnderline );
+
+    // Overline
+    FontLineStyle eOverline;
+    if( GetWhich( rSet, SID_ATTR_CHAR_OVERLINE, nWhich ) )
+    {
+        const SvxOverlineItem& rItem = static_cast<const SvxOverlineItem&>( rSet.Get( nWhich ) );
+        eOverline = rItem.GetValue();
+    }
+    else
+        eOverline = LINESTYLE_NONE;
+
+    rFont.SetOverline( eOverline );
+    rCJKFont.SetOverline( eOverline );
+    rCTLFont.SetOverline( eOverline );
+
+    //  Strikeout
+    FontStrikeout eStrikeout;
+    if( GetWhich( rSet, SID_ATTR_CHAR_STRIKEOUT, nWhich ) )
+    {
+        const SvxCrossedOutItem& rItem = static_cast<const SvxCrossedOutItem&>( rSet.Get( nWhich ) );
+        eStrikeout = rItem.GetValue();
+    }
+    else
+        eStrikeout = STRIKEOUT_NONE;
+
+    rFont.SetStrikeout( eStrikeout );
+    rCJKFont.SetStrikeout( eStrikeout );
+    rCTLFont.SetStrikeout( eStrikeout );
+
+    // WordLineMode
+    if( GetWhich( rSet, SID_ATTR_CHAR_WORDLINEMODE, nWhich ) )
+    {
+        const SvxWordLineModeItem& rItem = static_cast<const SvxWordLineModeItem&>( rSet.Get( nWhich ) );
+        rFont.SetWordLineMode( rItem.GetValue() );
+        rCJKFont.SetWordLineMode( rItem.GetValue() );
+        rCTLFont.SetWordLineMode( rItem.GetValue() );
+    }
+
+    // Emphasis
+    if( GetWhich( rSet, SID_ATTR_CHAR_EMPHASISMARK, nWhich ) )
+    {
+        const SvxEmphasisMarkItem& rItem = static_cast<const SvxEmphasisMarkItem&>( rSet.Get( nWhich ) );
+        FontEmphasisMark eMark = rItem.GetEmphasisMark();
+        rFont.SetEmphasisMark( eMark );
+        rCJKFont.SetEmphasisMark( eMark );
+        rCTLFont.SetEmphasisMark( eMark );
+    }
+
+    // Relief
+    if( GetWhich( rSet, SID_ATTR_CHAR_RELIEF, nWhich ) )
+    {
+        const SvxCharReliefItem& rItem = static_cast<const SvxCharReliefItem&>( rSet.Get( nWhich ) );
+        FontRelief eFontRelief = rItem.GetValue();
+        rFont.SetRelief( eFontRelief );
+        rCJKFont.SetRelief( eFontRelief );
+        rCTLFont.SetRelief( eFontRelief );
+    }
+
+    // Effects
+    if( GetWhich( rSet, SID_ATTR_CHAR_CASEMAP, nWhich ) )
+    {
+        const SvxCaseMapItem& rItem = static_cast<const SvxCaseMapItem&>( rSet.Get( nWhich ) );
+        SvxCaseMap eCaseMap = rItem.GetValue();
+        rFont.SetCaseMap( eCaseMap );
+        rCJKFont.SetCaseMap( eCaseMap );
+        // #i78474# small caps do not exist in CTL fonts
+        rCTLFont.SetCaseMap( eCaseMap == SvxCaseMap::SmallCaps ? SvxCaseMap::NotMapped : eCaseMap );
+    }
+
+    // Outline
+    if( GetWhich( rSet, SID_ATTR_CHAR_CONTOUR, nWhich ) )
+    {
+        const SvxContourItem& rItem = static_cast<const  SvxContourItem&>( rSet.Get( nWhich ) );
+        bool bOutline = rItem.GetValue();
+        rFont.SetOutline( bOutline );
+        rCJKFont.SetOutline( bOutline );
+        rCTLFont.SetOutline( bOutline );
+    }
+
+    // Shadow
+    if( GetWhich( rSet, SID_ATTR_CHAR_SHADOWED, nWhich ) )
+    {
+        const SvxShadowedItem& rItem = static_cast<const  SvxShadowedItem&>( rSet.Get( nWhich ) );
+        bool bShadow = rItem.GetValue();
+        rFont.SetShadow( bShadow );
+        rCJKFont.SetShadow( bShadow );
+        rCTLFont.SetShadow( bShadow );
+    }
+
+    // Background
+    bool bTransparent;
+    if( GetWhich( rSet, bPreviewBackgroundToCharacter ? SID_ATTR_BRUSH : SID_ATTR_BRUSH_CHAR, nWhich ) )
+    {
+         const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>( rSet.Get( nWhich ) );
+         const Color& rColor = rBrush.GetColor();
+         bTransparent = rColor.GetTransparency() > 0;
+         rFont.SetFillColor( rColor );
+         rCJKFont.SetFillColor( rColor );
+         rCTLFont.SetFillColor( rColor );
+    }
+    else
+        bTransparent = TRUE;
+
+    rFont.SetTransparent( bTransparent );
+    rCJKFont.SetTransparent( bTransparent );
+    rCTLFont.SetTransparent( bTransparent );
+
+    Color aBackCol( COL_TRANSPARENT );
+    if( !bPreviewBackgroundToCharacter )
+    {
+        if( GetWhich( rSet, SID_ATTR_BRUSH, nWhich ) )
+        {
+            const SvxBrushItem& rBrush = static_cast<const  SvxBrushItem&>( rSet.Get( nWhich ) );
+            if( GPOS_NONE == rBrush.GetGraphicPos() )
+                aBackCol = rBrush.GetColor();
+        }
+    }
+    SetBackColor( aBackCol );
+
+    // Font
+    SetPrevFont( rSet, SID_ATTR_CHAR_FONT, rFont );
+    SetPrevFont( rSet, SID_ATTR_CHAR_CJK_FONT, rCJKFont );
+    SetPrevFont( rSet, SID_ATTR_CHAR_CTL_FONT, rCTLFont );
+
+    // Style
+    SetPrevFontStyle( rSet, SID_ATTR_CHAR_POSTURE, SID_ATTR_CHAR_WEIGHT, rFont );
+    SetPrevFontStyle( rSet, SID_ATTR_CHAR_CJK_POSTURE, SID_ATTR_CHAR_CJK_WEIGHT, rCJKFont );
+    SetPrevFontStyle( rSet, SID_ATTR_CHAR_CTL_POSTURE, SID_ATTR_CHAR_CTL_WEIGHT, rCTLFont );
+
+    // Size
+    SetFontSize( rSet, SID_ATTR_CHAR_FONTHEIGHT, rFont );
+    SetFontSize( rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont );
+    SetFontSize( rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont );
+
+    // Language
+    SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
+
+    // Color
+    if( GetWhich( rSet, SID_ATTR_CHAR_COLOR, nWhich ) )
+    {
+        const SvxColorItem& rItem = static_cast<const SvxColorItem&>( rSet.Get( nWhich ) );
+        Color aCol( rItem.GetValue() );
+        rFont.SetColor( aCol );
+
+        rCJKFont.SetColor( aCol );
+        rCTLFont.SetColor( aCol );
+
+        AutoCorrectFontColor(); // handle color COL_AUTO
+    }
+
+    // Kerning
+    if( GetWhich( rSet, SID_ATTR_CHAR_KERNING, nWhich ) )
+    {
+        const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>( rSet.Get( nWhich ) );
+        short nKern = static_cast<short>(OutputDevice::LogicToLogic(rItem.GetValue(), rSet.GetPool()->GetMetric(nWhich), MapUnit::MapTwip));
+        rFont.SetFixKerning( nKern );
+        rCJKFont.SetFixKerning( nKern );
+        rCTLFont.SetFixKerning( nKern );
+    }
+
+    // Escapement
+    const sal_uInt8 nProp = 100;
+    short nEsc;
+    sal_uInt8 nEscProp;
+    if( GetWhich( rSet, SID_ATTR_CHAR_ESCAPEMENT, nWhich ) )
+    {
+        const SvxEscapementItem& rItem = static_cast<const SvxEscapementItem&>( rSet.Get( nWhich ) );
+        nEsc = rItem.GetEsc();
+        nEscProp = rItem.GetProportionalHeight();
+
+        if( nEsc == DFLT_ESC_AUTO_SUPER )
+            nEsc = DFLT_ESC_SUPER;
+        else if( nEsc == DFLT_ESC_AUTO_SUB )
+            nEsc = DFLT_ESC_SUB;
+    }
+    else
+    {
+        nEsc  = 0;
+        nEscProp = 100;
+    }
+    SetPrevFontEscapement( rFont, nProp, nEscProp, nEsc );
+    SetPrevFontEscapement( rCJKFont, nProp, nEscProp, nEsc );
+    SetPrevFontEscapement( rCTLFont, nProp, nEscProp, nEsc );
+
+    // Font width scale
+    if( GetWhich( rSet, SID_ATTR_CHAR_SCALEWIDTH, nWhich ) )
+    {
+        const SvxCharScaleWidthItem&rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
+        SetFontWidthScale( rItem.GetValue() );
+    }
+
+    Invalidate();
+}
+
+void FontPrevWindow::Init(const SfxItemSet& rSet)
+{
+    SvxFont& rFont = GetFont();
+    SvxFont& rCJKFont = GetCJKFont();
+    SvxFont& rCTLFont = GetCTLFont();
+
+    initFont(rFont);
+    initFont(rCJKFont);
+    initFont(rCTLFont);
+    ResetSettings(true, true);
+
+    sal_uInt16 nWhich;
+    nWhich = rSet.GetPool()->GetWhich( SID_CHAR_DLG_PREVIEW_STRING );
+    if (ISITEMSET)
+    {
+        const SfxStringItem& rItem = static_cast<const SfxStringItem&>( rSet.Get( nWhich ) );
+        const OUString& aString = rItem.GetValue();
+        if( !aString.isEmpty() )
+            SetPreviewText( aString );
+        else
+            SetFontNameAsPreviewText();
+    }
+
+    // Underline
+    FontLineStyle eUnderline;
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_UNDERLINE );
+    if( ISITEMSET )
+    {
+        const SvxUnderlineItem& rItem = static_cast<const SvxUnderlineItem&>( rSet.Get( nWhich ) );
+        eUnderline = rItem.GetValue();
+    }
+    else
+        eUnderline = LINESTYLE_NONE;
+
+    rFont.SetUnderline( eUnderline );
+    rCJKFont.SetUnderline( eUnderline );
+    rCTLFont.SetUnderline( eUnderline );
+
+    // Overline
+    FontLineStyle eOverline;
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_OVERLINE );
+    if( ISITEMSET )
+    {
+        const SvxOverlineItem& rItem = static_cast<const SvxOverlineItem&>( rSet.Get( nWhich ) );
+        eOverline = rItem.GetValue();
+    }
+    else
+        eOverline = LINESTYLE_NONE;
+
+    rFont.SetOverline( eOverline );
+    rCJKFont.SetOverline( eOverline );
+    rCTLFont.SetOverline( eOverline );
+
+    //  Strikeout
+    FontStrikeout eStrikeout;
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_STRIKEOUT );
+    if( ISITEMSET )
+    {
+        const SvxCrossedOutItem& rItem = static_cast<const SvxCrossedOutItem&>( rSet.Get( nWhich ) );
+        eStrikeout = rItem.GetValue();
+    }
+    else
+        eStrikeout = STRIKEOUT_NONE;
+
+    rFont.SetStrikeout( eStrikeout );
+    rCJKFont.SetStrikeout( eStrikeout );
+    rCTLFont.SetStrikeout( eStrikeout );
+
+    // WordLineMode
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_WORDLINEMODE );
+    if( ISITEMSET )
+    {
+        const SvxWordLineModeItem& rItem = static_cast<const SvxWordLineModeItem&>( rSet.Get( nWhich ) );
+        rFont.SetWordLineMode( rItem.GetValue() );
+        rCJKFont.SetWordLineMode( rItem.GetValue() );
+        rCTLFont.SetWordLineMode( rItem.GetValue() );
+    }
+
+    // Emphasis
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_EMPHASISMARK );
+    if( ISITEMSET )
+    {
+        const SvxEmphasisMarkItem& rItem = static_cast<const SvxEmphasisMarkItem&>( rSet.Get( nWhich ) );
+        FontEmphasisMark eMark = rItem.GetEmphasisMark();
+        rFont.SetEmphasisMark( eMark );
+        rCJKFont.SetEmphasisMark( eMark );
+        rCTLFont.SetEmphasisMark( eMark );
+    }
+
+    // Relief
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_RELIEF );
+    if( ISITEMSET )
+    {
+        const SvxCharReliefItem& rItem = static_cast<const SvxCharReliefItem&>( rSet.Get( nWhich ) );
+        FontRelief eFontRelief = rItem.GetValue();
+        rFont.SetRelief( eFontRelief );
+        rCJKFont.SetRelief( eFontRelief );
+        rCTLFont.SetRelief( eFontRelief );
+    }
+
+    // Effects
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_CASEMAP );
+    if( ISITEMSET )
+    {
+        const SvxCaseMapItem& rItem = static_cast<const SvxCaseMapItem&>( rSet.Get( nWhich ) );
+        SvxCaseMap eCaseMap = rItem.GetValue();
+        rFont.SetCaseMap( eCaseMap );
+        rCJKFont.SetCaseMap( eCaseMap );
+        // #i78474# small caps do not exist in CTL fonts
+        rCTLFont.SetCaseMap( eCaseMap == SvxCaseMap::SmallCaps ? SvxCaseMap::NotMapped : eCaseMap );
+    }
+
+    // Outline
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_CONTOUR );
+    if( ISITEMSET )
+    {
+        const SvxContourItem& rItem = static_cast<const SvxContourItem&>( rSet.Get( nWhich ) );
+        bool bOutline = rItem.GetValue();
+        rFont.SetOutline( bOutline );
+        rCJKFont.SetOutline( bOutline );
+        rCTLFont.SetOutline( bOutline );
+    }
+
+    // Shadow
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_SHADOWED );
+    if( ISITEMSET )
+    {
+        const SvxShadowedItem& rItem = static_cast<const SvxShadowedItem&>( rSet.Get( nWhich ) );
+        bool bShadow = rItem.GetValue();
+        rFont.SetShadow( bShadow );
+        rCJKFont.SetShadow( bShadow );
+        rCTLFont.SetShadow( bShadow );
+    }
+
+    // Background
+    bool bTransparent;
+    nWhich = SID_ATTR_BRUSH_CHAR;
+    if (ISITEMSET)
+    {
+         const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>( rSet.Get( nWhich ) );
+         const Color& rColor = rBrush.GetColor();
+         bTransparent = rColor.GetTransparency() > 0;
+         rFont.SetFillColor(rColor);
+         rCJKFont.SetFillColor(rColor);
+         rCTLFont.SetFillColor(rColor);
+    }
+    else
+        bTransparent = true;
+
+    rFont.SetTransparent( bTransparent );
+    rCJKFont.SetTransparent( bTransparent );
+    rCTLFont.SetTransparent( bTransparent );
+
+    Color aBackCol( COL_TRANSPARENT );
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_BRUSH );
+    if (ISITEMSET)
+    {
+        const SvxBrushItem& rBrush = static_cast<const SvxBrushItem&>(rSet.Get(nWhich));
+        if (GPOS_NONE == rBrush.GetGraphicPos())
+            aBackCol = rBrush.GetColor();
+    }
+    SetBackColor(aBackCol);
+
+    // Font
+    SetFont(rSet, SID_ATTR_CHAR_FONT, rFont);
+    SetFont(rSet, SID_ATTR_CHAR_CJK_FONT, rCJKFont);
+    SetFont(rSet, SID_ATTR_CHAR_CTL_FONT, rCTLFont);
+
+    // Style
+    SetFontStyle(rSet, SID_ATTR_CHAR_POSTURE, SID_ATTR_CHAR_WEIGHT, rFont);
+    SetFontStyle(rSet, SID_ATTR_CHAR_CJK_POSTURE, SID_ATTR_CHAR_CJK_WEIGHT, rCJKFont);
+    SetFontStyle(rSet, SID_ATTR_CHAR_CTL_POSTURE, SID_ATTR_CHAR_CTL_WEIGHT, rCTLFont);
+
+    // Size
+    SetFontSize(rSet, SID_ATTR_CHAR_FONTHEIGHT, rFont);
+    SetFontSize(rSet, SID_ATTR_CHAR_CJK_FONTHEIGHT, rCJKFont);
+    SetFontSize(rSet, SID_ATTR_CHAR_CTL_FONTHEIGHT, rCTLFont);
+
+    // Language
+    SetFontLang( rSet, SID_ATTR_CHAR_LANGUAGE, rFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CJK_LANGUAGE, rCJKFont );
+    SetFontLang( rSet, SID_ATTR_CHAR_CTL_LANGUAGE, rCTLFont );
+
+    // Color
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_COLOR );
+    if( ISITEMSET )
+    {
+        const SvxColorItem& rItem = static_cast<const SvxColorItem&>( rSet.Get( nWhich ) );
+        Color aCol( rItem.GetValue() );
+        rFont.SetColor( aCol );
+        rCJKFont.SetColor( aCol );
+        rCTLFont.SetColor( aCol );
+
+        AutoCorrectFontColor(); // handle color COL_AUTO
+    }
+
+    // Kerning
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_KERNING );
+    if( ISITEMSET )
+    {
+        const SvxKerningItem& rItem = static_cast<const SvxKerningItem&>( rSet.Get( nWhich ) );
+        short nKern = static_cast<short>(OutputDevice::LogicToLogic(rItem.GetValue(), rSet.GetPool()->GetMetric(nWhich), MapUnit::MapTwip));
+        rFont.SetFixKerning( nKern );
+        rCJKFont.SetFixKerning( nKern );
+        rCTLFont.SetFixKerning( nKern );
+    }
+
+    // Escapement
+    nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_ESCAPEMENT );
+    const sal_uInt8 nProp = 100;
+    short nEsc;
+    sal_uInt8 nEscProp;
+    if( ISITEMSET )
+    {
+        const SvxEscapementItem& rItem = static_cast<const SvxEscapementItem&>( rSet.Get( nWhich ) );
+        nEsc = rItem.GetEsc();
+        nEscProp = rItem.GetProportionalHeight();
+
+        if( nEsc == DFLT_ESC_AUTO_SUPER )
+            nEsc = DFLT_ESC_SUPER;
+        else if( nEsc == DFLT_ESC_AUTO_SUB )
+            nEsc = DFLT_ESC_SUB;
+    }
+    else
+    {
+        nEsc  = 0;
+        nEscProp = 100;
+    }
+
+    SetFontEscapement( nProp, nEscProp, nEsc );
+
+    // Font width scale
+    SetFontWidthScale( rSet );
+
+    Invalidate();
+}
+
+void FontPrevWindow::SetFont( const SfxItemSet& rSet, sal_uInt16 nSlot, SvxFont& rFont )
+{
+    sal_uInt16 nWhich = rSet.GetPool()->GetWhich( nSlot );
+    if( ISITEMSET )
+    {
+        const SvxFontItem& rFontItem = static_cast<const SvxFontItem&>( rSet.Get(nWhich) );
+        rFont.SetFamily( rFontItem.GetFamily() );
+        rFont.SetFamilyName( rFontItem.GetFamilyName() );
+        rFont.SetPitch( rFontItem.GetPitch() );
+        rFont.SetCharSet( rFontItem.GetCharSet() );
+        rFont.SetStyleName( rFontItem.GetStyleName() );
+    }
+}
+
+void FontPrevWindow::SetFontStyle( const SfxItemSet& rSet, sal_uInt16 nPosture, sal_uInt16 nWeight, SvxFont& rFont )
+{
+    sal_uInt16 nWhich = rSet.GetPool()->GetWhich( nPosture );
+    if( ISITEMSET )
+    {
+        const SvxPostureItem& rItem = static_cast<const SvxPostureItem&>( rSet.Get( nWhich ) );
+        rFont.SetItalic( rItem.GetValue() != ITALIC_NONE ? ITALIC_NORMAL : ITALIC_NONE );
+    }
+
+    nWhich = rSet.GetPool()->GetWhich( nWeight );
+    if( ISITEMSET )
+    {
+        const SvxWeightItem& rItem = static_cast<const SvxWeightItem&>( rSet.Get( nWhich ) );
+        rFont.SetWeight( rItem.GetValue() != WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL );
+    }
+}
+
+void FontPrevWindow::SetFontWidthScale( const SfxItemSet& rSet )
+{
+    sal_uInt16  nWhich = rSet.GetPool()->GetWhich( SID_ATTR_CHAR_SCALEWIDTH );
+    if( ISITEMSET )
+    {
+        const SvxCharScaleWidthItem&    rItem = static_cast<const SvxCharScaleWidthItem&>( rSet.Get( nWhich ) );
+
+        SetFontWidthScale( rItem.GetValue() );
+    }
+}
+
+void FontPrevWindow::SetFontEscapement(sal_uInt8 nProp, sal_uInt8 nEscProp, short nEsc)
+{
+    setFontEscapement(GetFont(), nProp, nEscProp, nEsc);
+    setFontEscapement(GetCJKFont(), nProp, nEscProp, nEsc);
+    setFontEscapement(GetCTLFont(), nProp, nEscProp, nEsc);
+    Invalidate();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/measctrl.cxx b/svx/source/dialog/measctrl.cxx
index 635802210955..2aa183ecaa1a 100644
--- a/svx/source/dialog/measctrl.cxx
+++ b/svx/source/dialog/measctrl.cxx
@@ -68,7 +68,7 @@ VCL_BUILDER_FACTORY_CONSTRUCTOR(SvxXMeasurePreview, 0)
 
 Size SvxXMeasurePreview::GetOptimalSize() const
 {
-    return getPreviewStripSize(this);
+    return getPreviewStripSize(*this);
 }
 
 SvxXMeasurePreview::~SvxXMeasurePreview()


More information about the Libreoffice-commits mailing list