move the SvxBackgroundColorItem<->SvxBrushItem conversion

into the dialog itself

Change-Id: I83db9f02145a4927257dd5691f82dad1a11eaea6
Reviewed-on: https://gerrit.libreoffice.org/41029
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/source/inc/backgrnd.hxx b/cui/source/inc/backgrnd.hxx
index de75d69..d7e71a0 100644
--- a/cui/source/inc/backgrnd.hxx
+++ b/cui/source/inc/backgrnd.hxx
@@ -106,6 +106,7 @@ private:
    bool        bAllowShowSelector  : 1;
    bool        bIsGraphicValid     : 1;
    bool        bHighlighting       : 1;
    bool        bCharBackColor      : 1;
    bool        m_bColorSelected    : 1;
    Graphic     aBgdGraphic;
    OUString    aBgdGraphicPath;
diff --git a/cui/source/tabpages/backgrnd.cxx b/cui/source/tabpages/backgrnd.cxx
index b368463..ffa76d2 100644
--- a/cui/source/tabpages/backgrnd.cxx
+++ b/cui/source/tabpages/backgrnd.cxx
@@ -37,6 +37,7 @@
#include <editeng/eerdll.hxx>

#include <editeng/brushitem.hxx>
#include <editeng/colritem.hxx>
#include "backgrnd.hxx"

#include <svx/xtable.hxx>
@@ -317,6 +318,7 @@ SvxBackgroundTabPage::SvxBackgroundTabPage(vcl::Window* pParent, const SfxItemSe
    , bAllowShowSelector(true)
    , bIsGraphicValid(false)
    , bHighlighting(false)
    , bCharBackColor(false)
    , m_bColorSelected(false)
    , pPageImpl(new SvxBackgroundPage_Impl)
    , pImportDlg(nullptr)
@@ -441,7 +443,7 @@ void SvxBackgroundTabPage::Reset( const SfxItemSet* rSet )


    // get and evaluate Input-BrushItem
    const SvxBrushItem* pBgdAttr = nullptr;
    bool bBrushItemSet = false;
    sal_uInt16 nSlot = SID_ATTR_BRUSH;
    const SfxPoolItem* pItem;
    sal_uInt16 nDestValue = USHRT_MAX;
@@ -469,20 +471,39 @@ void SvxBackgroundTabPage::Reset( const SfxItemSet* rSet )
    {
        nSlot = SID_ATTR_BRUSH_CHAR;
    }
    else if( bCharBackColor )
    {
        nSlot = SID_ATTR_CHAR_BACK_COLOR;
    }

    //#111173# the destination item is missing when the parent style has been changed
    if(USHRT_MAX == nDestValue && m_pTblLBox->IsVisible())
        nDestValue = 0;
    sal_uInt16 nWhich = GetWhich( nSlot );
    sal_uInt16 nWhich = GetWhich(nSlot);
    SvxBrushItem aBgdAttr(nWhich);

    if ( rSet->GetItemState( nWhich, false ) >= SfxItemState::DEFAULT )
        pBgdAttr = static_cast<const SvxBrushItem*>(&( rSet->Get( nWhich ) ));
    if (rSet->GetItemState( nWhich, false ) >= SfxItemState::DEFAULT)
    {
        if (!bCharBackColor)
            aBgdAttr = static_cast<const SvxBrushItem&>(rSet->Get(nWhich));
        else
        {
            // EE_CHAR_BKGCOLOR is SvxBackgroundColorItem, but char background tabpage
            // can only work with SvxBrushItems
            // extract Color out of SvxBackColorItem
            Color aBackColor = static_cast<const SvxBackgroundColorItem&>(rSet->Get(nWhich)).GetValue();
            // make new SvxBrushItem with this Color
            aBgdAttr = SvxBrushItem(aBackColor, SID_ATTR_BRUSH_CHAR);
        }
        bBrushItemSet = true;
    }

    m_pBtnTile->Check();

    if ( pBgdAttr )
    if (bBrushItemSet)
    {
        FillControls_Impl(*pBgdAttr, aUserData);
        aBgdColor = const_cast<SvxBrushItem*>(pBgdAttr)->GetColor();
        FillControls_Impl(aBgdAttr, aUserData);
        aBgdColor = aBgdAttr.GetColor();
    }
    else
    {
@@ -517,22 +538,22 @@ void SvxBackgroundTabPage::Reset( const SfxItemSet* rSet )
            nWhich = GetWhich( SID_ATTR_BRUSH );
            if ( rSet->GetItemState( nWhich, false ) >= SfxItemState::DEFAULT )
            {
                pBgdAttr = static_cast<const SvxBrushItem*>(&( rSet->Get( nWhich ) ));
                pTableBck_Impl->pCellBrush = new SvxBrushItem(*pBgdAttr);
                aBgdAttr = static_cast<const SvxBrushItem&>(rSet->Get(nWhich));
                pTableBck_Impl->pCellBrush = new SvxBrushItem(aBgdAttr);
            }
            pTableBck_Impl->nCellWhich = nWhich;

            if ( rSet->GetItemState( SID_ATTR_BRUSH_ROW, false ) >= SfxItemState::DEFAULT )
            {
                pBgdAttr = static_cast<const SvxBrushItem*>(&( rSet->Get( SID_ATTR_BRUSH_ROW ) ));
                pTableBck_Impl->pRowBrush = new SvxBrushItem(*pBgdAttr);
                aBgdAttr = static_cast<const SvxBrushItem&>(rSet->Get(SID_ATTR_BRUSH_ROW));
                pTableBck_Impl->pRowBrush = new SvxBrushItem(aBgdAttr);
            }
            pTableBck_Impl->nRowWhich = SID_ATTR_BRUSH_ROW;

            if ( rSet->GetItemState( SID_ATTR_BRUSH_TABLE, false ) >= SfxItemState::DEFAULT )
            {
                pBgdAttr = static_cast<const SvxBrushItem*>(&( rSet->Get( SID_ATTR_BRUSH_TABLE ) ));
                pTableBck_Impl->pTableBrush = new SvxBrushItem(*pBgdAttr);
                aBgdAttr = static_cast<const SvxBrushItem&>(rSet->Get(SID_ATTR_BRUSH_TABLE));
                pTableBck_Impl->pTableBrush = new SvxBrushItem(aBgdAttr);
            }
            pTableBck_Impl->nTableWhich = SID_ATTR_BRUSH_TABLE;

@@ -544,8 +565,22 @@ void SvxBackgroundTabPage::Reset( const SfxItemSet* rSet )
            nWhich = GetWhich( SID_ATTR_BRUSH_CHAR );
            if ( rSet->GetItemState( nWhich, false ) >= SfxItemState::DEFAULT )
            {
                pBgdAttr = static_cast<const SvxBrushItem*>(&( rSet->Get( nWhich ) ));
                pHighlighting.reset(new SvxBrushItem(*pBgdAttr));
                aBgdAttr = static_cast<const SvxBrushItem&>(rSet->Get(nWhich));
                pHighlighting.reset(new SvxBrushItem(aBgdAttr));
            }
        }
        else if( bCharBackColor )
        {
            nWhich = GetWhich(SID_ATTR_CHAR_BACK_COLOR);
            if ( rSet->GetItemState( nWhich, false ) >= SfxItemState::DEFAULT )
            {
                // EE_CHAR_BKGCOLOR is SvxBackgroundColorItem, but char background tabpage
                // can only work with SvxBrushItems
                // extract Color out of SvxBackColorItem
                Color aBackColor = static_cast<const SvxBackgroundColorItem&>(rSet->Get(nWhich)).GetValue();
                // make new SvxBrushItem with this Color
                aBgdAttr = SvxBrushItem(aBackColor, SID_ATTR_BRUSH_CHAR);
                pHighlighting.reset(new SvxBrushItem(aBgdAttr));
            }
        }
    }
@@ -570,6 +605,7 @@ bool SvxBackgroundTabPage::FillItemSet( SfxItemSet* rCoreSet )
    }

    bool bModified = false;
    bool bCompareOldBrush = true;
    sal_uInt16 nSlot = SID_ATTR_BRUSH;

    if ( m_pTblLBox->IsVisible() )
@@ -591,15 +627,21 @@ bool SvxBackgroundTabPage::FillItemSet( SfxItemSet* rCoreSet )
    {
        nSlot = SID_ATTR_BRUSH_CHAR;
    }
    else if( bCharBackColor )
    {
        nSlot = SID_ATTR_CHAR_BACK_COLOR;
        bCompareOldBrush = false;
    }

    sal_uInt16 nWhich = GetWhich( nSlot );

    const SfxPoolItem* pOld = GetOldItem( *rCoreSet, nSlot );
    if (pOld)
    const SfxPoolItem* pOld = GetOldItem(*rCoreSet, nSlot);
    if (pOld && bCompareOldBrush)
    {
        SfxItemState eOldItemState = rCoreSet->GetItemState(nSlot, false);
        const SfxItemSet& rOldSet = GetItemSet();

        const SvxBrushItem& rOldItem    = static_cast<const SvxBrushItem&>(*pOld);

        SvxGraphicPosition  eOldPos     = rOldItem.GetGraphicPos();
        const bool          bIsBrush    = ( drawing::FillStyle_SOLID == lcl_getFillStyle(m_pLbSelect) );

@@ -700,6 +742,22 @@ bool SvxBackgroundTabPage::FillItemSet( SfxItemSet* rCoreSet )
            bModified = ( bIsBrush || m_pBtnLink->IsChecked() || bIsGraphicValid );
        }
    }
    else if (pOld && SID_ATTR_CHAR_BACK_COLOR == nSlot)
    {
        SfxItemState eOldItemState = rCoreSet->GetItemState(nSlot, false);
        const SfxItemSet& rOldSet = GetItemSet();
        const SvxBackgroundColorItem& rOldItem = static_cast<const SvxBackgroundColorItem&>(*pOld);

        // Brush-treatment:
        if ( rOldItem.GetValue() != aBgdColor ||
             (SfxItemState::DEFAULT >= eOldItemState && m_bColorSelected))
        {
            bModified = true;
            rCoreSet->Put(SvxBackgroundColorItem(aBgdColor, nWhich));
        }
        else if ( SfxItemState::DEFAULT == rOldSet.GetItemState( nWhich, false ) )
            rCoreSet->ClearItem( nWhich );
    }
    else if ( SID_ATTR_BRUSH_CHAR == nSlot && aBgdColor != Color( COL_WHITE ) )
    {
        rCoreSet->Put( SvxBrushItem( aBgdColor, nWhich ) );
@@ -1373,10 +1431,12 @@ void SvxBackgroundTabPage::PageCreated(const SfxAllItemSet& aSet)
        {
            ShowSelector();
        }
        if ( nFlags & SvxBackgroundTabFlags::SHOW_HIGHLIGHTING )
        if ((nFlags & SvxBackgroundTabFlags::SHOW_HIGHLIGHTING) ||
            (nFlags & SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR))
        {
            m_pBackGroundColorLabelFT->SetText(CuiResId(RID_SVXSTR_CHARNAME_HIGHLIGHTING));
            bHighlighting = true;
            bHighlighting = bool(nFlags & SvxBackgroundTabFlags::SHOW_HIGHLIGHTING);
            bCharBackColor = bool(nFlags & SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR);
        }
    }
}
diff --git a/include/svx/flagsdef.hxx b/include/svx/flagsdef.hxx
index 0207a0e..30b1ff4 100644
--- a/include/svx/flagsdef.hxx
+++ b/include/svx/flagsdef.hxx
@@ -39,14 +39,15 @@ namespace o3tl
// flags for SvxBackgroundTabPage
enum class SvxBackgroundTabFlags
{
    NONE                = 0x00,
    SHOW_SELECTOR       = 0x01,
    SHOW_TBLCTL         = 0x08,
    SHOW_HIGHLIGHTING   = 0x10,
    NONE                 = 0x00,
    SHOW_SELECTOR        = 0x01,
    SHOW_TBLCTL          = 0x08,
    SHOW_HIGHLIGHTING    = 0x10,
    SHOW_CHAR_BKGCOLOR   = 0x20,
};
namespace o3tl
{
    template<> struct typed_flags<SvxBackgroundTabFlags> : is_typed_flags<SvxBackgroundTabFlags, 0x19> {};
    template<> struct typed_flags<SvxBackgroundTabFlags> : is_typed_flags<SvxBackgroundTabFlags, 0x39> {};
}

// flags for SvxBorderTabPage
diff --git a/sd/source/ui/dlg/dlgchar.cxx b/sd/source/ui/dlg/dlgchar.cxx
index 57c7f2d..f605126 100644
--- a/sd/source/ui/dlg/dlgchar.cxx
+++ b/sd/source/ui/dlg/dlgchar.cxx
@@ -65,7 +65,7 @@ void SdCharDlg::PageCreated( sal_uInt16 nId, SfxTabPage &rPage )
    }
    else if (nId == mnCharBackground)
    {
        aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_HIGHLIGHTING)));
        aSet.Put(SfxUInt32Item(SID_FLAG_TYPE,static_cast<sal_uInt32>(SvxBackgroundTabFlags::SHOW_CHAR_BKGCOLOR)));
        rPage.PageCreated(aSet);
    }
}
diff --git a/sd/source/ui/func/fuchar.cxx b/sd/source/ui/func/fuchar.cxx
index 4a8aedd..b5c5a18 100644
--- a/sd/source/ui/func/fuchar.cxx
+++ b/sd/source/ui/func/fuchar.cxx
@@ -68,33 +68,9 @@ void FuChar::DoExecute( SfxRequest& rReq )
        SfxItemSet aEditAttr( mpDoc->GetPool() );
        mpView->GetAttributes( aEditAttr );

        static const sal_uInt16 aRanges[] =
        {
            EE_ITEMS_START, EE_ITEMS_END,
            SID_ATTR_BRUSH_CHAR, SID_ATTR_BRUSH_CHAR,
            0
        };

        SfxItemSet aNewAttr( mpViewShell->GetPool(),
                                aRanges );
        SfxItemSet aNewAttr(mpViewShell->GetPool(), svl::Items<EE_ITEMS_START, EE_ITEMS_END>{});
        aNewAttr.Put( aEditAttr, false );

        // EE_CHAR_BKGCOLOR is SvxBackgroundColorItem, but char background tabpage
        // can only work with SvxBrushItems (it requires major undertaking to have
        // it support anything else). Do the following then:
        const SfxPoolItem* pItem;
        if ( aNewAttr.GetItemState( EE_CHAR_BKGCOLOR, true, &pItem ) == SfxItemState::SET )
        {
            // extract Color outta SvxBackColorItem
            Color aBackColor = static_cast<const SvxBackgroundColorItem*>(pItem)->GetValue();
            // make new SvxBrushItem with this Color
            SvxBrushItem aBrushItem( aBackColor, SID_ATTR_BRUSH_CHAR );

            aNewAttr.ClearItem( EE_CHAR_BKGCOLOR );
            // and stick it into the set
            aNewAttr.Put( aBrushItem );
        }

        SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
        ScopedVclPtr<SfxAbstractTabDialog> pDlg(pFact ? pFact->CreateSdTabCharDialog(mpViewShell->GetActiveWindow(), &aNewAttr, mpDoc->GetDocSh() ) : nullptr);
        sal_uInt16 nResult = RET_CANCEL;