Simplify color status handling

(cherry picked from commit eb5b353b523ec4d7d6588e2fae5b8b4117bfc2b1)

Rename BorderColorStatus to ColorStatus

(cherry picked from commit 57f33bfd0c69a4568d1d5840391ab9901d4f4f66)

Change-Id: I9335fa2ab94f69853b45f070499d7e18aac458c3
Reviewed-on: https://gerrit.libreoffice.org/63607
Tested-by: Jenkins
Reviewed-by: Maxim Monastirsky <momonasmon@gmail.com>
diff --git a/include/svx/colorbox.hxx b/include/svx/colorbox.hxx
index 67e26e6..0a62faf 100644
--- a/include/svx/colorbox.hxx
+++ b/include/svx/colorbox.hxx
@@ -42,7 +42,7 @@ private:
    sal_uInt16 m_nSlotId;
    bool m_bShowNoneButton;
    std::shared_ptr<PaletteManager> m_xPaletteManager;
    BorderColorStatus m_aBorderColorStatus;
    ColorStatus m_aColorStatus;

    DECL_LINK(MenuActivateHdl, MenuButton *, void);
    void Selected(const NamedColor& rNamedColor);
@@ -104,7 +104,7 @@ private:
    sal_uInt16 m_nSlotId;
    bool m_bShowNoneButton;
    std::shared_ptr<PaletteManager> m_xPaletteManager;
    BorderColorStatus m_aBorderColorStatus;
    ColorStatus m_aColorStatus;

    void Selected(const NamedColor& rNamedColor);
    void createColorWindow();
diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx
index f5de49f..53605eb 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -32,15 +32,15 @@

#include <functional>

class SVX_DLLPUBLIC BorderColorStatus
class SVX_DLLPUBLIC ColorStatus
{
    Color maColor;
    Color maTLBRColor;
    Color maBLTRColor;
public:
    BorderColorStatus();
    ~BorderColorStatus();
    bool statusChanged( const css::frame::FeatureStateEvent& rEvent );
    ColorStatus();
    ~ColorStatus();
    void statusChanged( const css::frame::FeatureStateEvent& rEvent );
    Color GetColor();
};

@@ -66,7 +66,7 @@ private:

    VclPtr<vcl::Window> mxParentWindow;
    std::shared_ptr<PaletteManager> mxPaletteManager;
    BorderColorStatus&  mrBorderColorStatus;
    ColorStatus&  mrColorStatus;

    ColorSelectFunction const maColorSelectFunction;
    bool const mbReuseParentForPicker;
@@ -83,7 +83,7 @@ private:
public:
    SvxColorWindow(const OUString& rCommand,
                   std::shared_ptr<PaletteManager> const & rPaletteManager,
                   BorderColorStatus& rBorderColorStatus,
                   ColorStatus& rColorStatus,
                   sal_uInt16 nSlotId,
                   const css::uno::Reference< css::frame::XFrame >& rFrame,
                   vcl::Window* pParentWindow,
@@ -118,7 +118,7 @@ private:
    weld::Window* const mpParentWindow;
    weld::MenuButton* mpMenuButton;
    std::shared_ptr<PaletteManager> mxPaletteManager;
    BorderColorStatus&  mrBorderColorStatus;
    ColorStatus&  mrColorStatus;
    ColorSelectFunction const maColorSelectFunction;

    std::unique_ptr<ColorValueSet> mxColorSet;
@@ -144,7 +144,7 @@ private:

public:
    ColorWindow(std::shared_ptr<PaletteManager> const & rPaletteManager,
                BorderColorStatus& rBorderColorStatus,
                ColorStatus& rColorStatus,
                sal_uInt16 nSlotId,
                const css::uno::Reference< css::frame::XFrame >& rFrame,
                weld::Window* pParentWindow, weld::MenuButton* pMenuButton,
diff --git a/include/svx/tbcontrl.hxx b/include/svx/tbcontrl.hxx
index ded66498..afa61b9 100644
--- a/include/svx/tbcontrl.hxx
+++ b/include/svx/tbcontrl.hxx
@@ -210,7 +210,7 @@ class SVX_DLLPUBLIC SvxColorToolBoxControl : public cppu::ImplInheritanceHelper<
{
    std::unique_ptr<svx::ToolboxButtonColorUpdater> m_xBtnUpdater;
    std::shared_ptr<PaletteManager> m_xPaletteManager;
    BorderColorStatus m_aBorderColorStatus;
    ColorStatus m_aColorStatus;
    bool m_bSplitButton;
    sal_uInt16 m_nSlotId;
    ColorSelectFunction m_aColorSelectFunction;
diff --git a/reportdesign/source/ui/dlg/Condition.cxx b/reportdesign/source/ui/dlg/Condition.cxx
index 5e8194f..48f2a5c 100644
--- a/reportdesign/source/ui/dlg/Condition.cxx
+++ b/reportdesign/source/ui/dlg/Condition.cxx
@@ -227,7 +227,7 @@ IMPL_LINK(Condition, DropdownClick, ToolBox*, pToolBox, void)
    m_pColorFloat = VclPtr<SvxColorWindow>::Create(
                           OUString() /*m_aCommandURL*/,
                           m_xPaletteManager,
                           m_aBorderColorStatus,
                           m_aColorStatus,
                           nSlotId,
                           nullptr,
                           pToolBox,
diff --git a/reportdesign/source/ui/dlg/Condition.hxx b/reportdesign/source/ui/dlg/Condition.hxx
index ceca032..d94804d 100644
--- a/reportdesign/source/ui/dlg/Condition.hxx
+++ b/reportdesign/source/ui/dlg/Condition.hxx
@@ -88,7 +88,7 @@ namespace rptui
        sal_uInt16                  m_nFontColorId;
        sal_uInt16                  m_nFontDialogId;
        std::shared_ptr<PaletteManager> m_xPaletteManager;
        BorderColorStatus           m_aBorderColorStatus;
        ColorStatus                 m_aColorStatus;
        ConditionColorWrapper       m_aColorWrapper;

        ::rptui::OReportController& m_rController;
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index f4d85d7..a379d91 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -1255,7 +1255,7 @@ void SvxFontNameBox_Impl::Select()

SvxColorWindow::SvxColorWindow(const OUString&            rCommand,
                               std::shared_ptr<PaletteManager> const & rPaletteManager,
                               BorderColorStatus&         rBorderColorStatus,
                               ColorStatus&               rColorStatus,
                               sal_uInt16                 nSlotId,
                               const Reference< XFrame >& rFrame,
                               vcl::Window*               pParentWindow,
@@ -1267,7 +1267,7 @@ SvxColorWindow::SvxColorWindow(const OUString&            rCommand,
    maCommand( rCommand ),
    mxParentWindow(pParentWindow),
    mxPaletteManager( rPaletteManager ),
    mrBorderColorStatus( rBorderColorStatus ),
    mrColorStatus( rColorStatus ),
    maColorSelectFunction(aFunction),
    mbReuseParentForPicker(bReuseParentForPicker)
{
@@ -1367,7 +1367,7 @@ SvxColorWindow::SvxColorWindow(const OUString&            rCommand,
}

ColorWindow::ColorWindow(std::shared_ptr<PaletteManager> const & rPaletteManager,
                         BorderColorStatus&         rBorderColorStatus,
                         ColorStatus&               rColorStatus,
                         sal_uInt16                 nSlotId,
                         const Reference< XFrame >& rFrame,
                         weld::Window*              pParentWindow,
@@ -1381,7 +1381,7 @@ ColorWindow::ColorWindow(std::shared_ptr<PaletteManager> const & rPaletteManager
    , mpParentWindow(pParentWindow)
    , mpMenuButton(pMenuButton)
    , mxPaletteManager(rPaletteManager)
    , mrBorderColorStatus(rBorderColorStatus)
    , mrColorStatus(rColorStatus)
    , maColorSelectFunction(aFunction)
    , mxColorSet(new ColorValueSet(m_xBuilder->weld_scrolled_window("colorsetwin")))
    , mxRecentColorSet(new ColorValueSet(nullptr))
@@ -1772,20 +1772,8 @@ void SvxColorWindow::statusChanged( const css::frame::FeatureStateEvent& rEvent 
    }
    else
    {
        Color aColor(COL_TRANSPARENT);

        if (mrBorderColorStatus.statusChanged(rEvent))
        {
            aColor = mrBorderColorStatus.GetColor();
        }
        else if (rEvent.IsEnabled)
        {
            sal_Int32 nValue;
            if (rEvent.State >>= nValue)
                aColor = Color(nValue);
        }

        SelectEntry(aColor);
        mrColorStatus.statusChanged(rEvent);
        SelectEntry(mrColorStatus.GetColor());
    }
}

@@ -1801,20 +1789,8 @@ void ColorWindow::statusChanged( const css::frame::FeatureStateEvent& rEvent )
    }
    else
    {
        Color aColor(COL_TRANSPARENT);

        if (mrBorderColorStatus.statusChanged(rEvent))
        {
            aColor = mrBorderColorStatus.GetColor();
        }
        else if (rEvent.IsEnabled)
        {
            sal_Int32 nValue;
            if (rEvent.State >>= nValue)
                aColor = Color(nValue);
        }

        SelectEntry(aColor);
        mrColorStatus.statusChanged(rEvent);
        SelectEntry(mrColorStatus.GetColor());
    }
}

@@ -1926,94 +1902,59 @@ void ColorWindow::SelectEntry(const Color& rColor)
    ColorWindow::SelectEntry(std::make_pair(rColor, sColorName));
}

BorderColorStatus::BorderColorStatus() :
ColorStatus::ColorStatus() :
    maColor( COL_TRANSPARENT ),
    maTLBRColor( COL_TRANSPARENT ),
    maBLTRColor( COL_TRANSPARENT )
{
}

BorderColorStatus::~BorderColorStatus()
ColorStatus::~ColorStatus()
{
}

bool BorderColorStatus::statusChanged( const css::frame::FeatureStateEvent& rEvent )
void ColorStatus::statusChanged( const css::frame::FeatureStateEvent& rEvent )
{
    Color aColor( COL_TRANSPARENT );
    css::table::BorderLine2 aTable;

    if ( rEvent.FeatureURL.Complete == ".uno:FrameLineColor" )
    if ( rEvent.State >>= aTable )
    {
        if ( rEvent.IsEnabled )
            rEvent.State >>= aColor;

        maColor = aColor;
        return true;
    }
    else
    {
        css::table::BorderLine2 aTable;
        if ( rEvent.IsEnabled )
            rEvent.State >>= aTable;

        SvxBorderLine aLine;
        SvxBoxItem::LineToSvxLine( aTable, aLine, false );
        if ( !aLine.isEmpty() )
            aColor = aLine.GetColor();

        if ( rEvent.FeatureURL.Complete == ".uno:BorderTLBR" )
        {
            maTLBRColor = aColor;
            return true;
        }
        else if ( rEvent.FeatureURL.Complete == ".uno:BorderBLTR" )
        {
            maBLTRColor = aColor;
            return true;
        }
    }
    else
        rEvent.State >>= aColor;

    return false;
    if ( rEvent.FeatureURL.Path == "BorderTLBR" )
        maTLBRColor = aColor;
    else if ( rEvent.FeatureURL.Path == "BorderBLTR" )
        maBLTRColor = aColor;
    else
        maColor = aColor;
}

Color BorderColorStatus::GetColor()
Color ColorStatus::GetColor()
{
    bool bHasColor = maColor != COL_TRANSPARENT;
    bool bHasTLBRColor = maTLBRColor != COL_TRANSPARENT;
    bool bHasBLTRColor = maBLTRColor != COL_TRANSPARENT;
    Color aColor( maColor );

    if ( !bHasColor && bHasTLBRColor && !bHasBLTRColor )
        return maTLBRColor;
    else if ( !bHasColor && !bHasTLBRColor && bHasBLTRColor )
        return maBLTRColor;
    else if ( bHasColor && bHasTLBRColor && !bHasBLTRColor )
    if ( maTLBRColor != COL_TRANSPARENT )
    {
        if ( maColor == maTLBRColor )
            return maColor;
        else
            return maBLTRColor;
    }
    else if ( bHasColor && !bHasTLBRColor && bHasBLTRColor )
    {
        if ( maColor == maBLTRColor )
            return maColor;
        else
            return maTLBRColor;
    }
    else if ( !bHasColor && bHasTLBRColor && bHasBLTRColor )
    {
        if ( maTLBRColor == maBLTRColor )
            return maTLBRColor;
        else
            return maColor;
    }
    else if ( bHasColor && bHasTLBRColor && bHasBLTRColor )
    {
        if ( maColor == maTLBRColor && maColor == maBLTRColor )
            return maColor;
        else
        if ( aColor != maTLBRColor && aColor != COL_TRANSPARENT )
            return COL_TRANSPARENT;
        aColor = maTLBRColor;
    }
    return maColor;

    if ( maBLTRColor != COL_TRANSPARENT )
    {
        if ( aColor != maBLTRColor && aColor != COL_TRANSPARENT )
            return COL_TRANSPARENT;
        return maBLTRColor;
    }

    return aColor;
}


@@ -3172,7 +3113,7 @@ VclPtr<vcl::Window> SvxColorToolBoxControl::createPopupWindow( vcl::Window* pPar
    VclPtrInstance<SvxColorWindow> pColorWin(
                            m_aCommandURL,
                            m_xPaletteManager,
                            m_aBorderColorStatus,
                            m_aColorStatus,
                            m_nSlotId,
                            m_xFrame,
                            pParent,
@@ -3205,17 +3146,8 @@ void SvxColorToolBoxControl::statusChanged( const css::frame::FeatureStateEvent&
    bool bValue;
    if ( !m_bSplitButton )
    {
        Color aColor( COL_TRANSPARENT );

        if ( m_aBorderColorStatus.statusChanged( rEvent ) )
        {
            aColor = m_aBorderColorStatus.GetColor();
        }
        else if ( rEvent.IsEnabled )
        {
            rEvent.State >>= aColor;
        }
        m_xBtnUpdater->Update( aColor );
        m_aColorStatus.statusChanged( rEvent );
        m_xBtnUpdater->Update( m_aColorStatus.GetColor() );
    }
    else if ( rEvent.State >>= bValue )
        pToolBox->CheckItem( nId, bValue );
@@ -3710,7 +3642,7 @@ void SvxColorListBox::createColorWindow()
    m_xColorWindow = VclPtr<SvxColorWindow>::Create(
                            OUString() /*m_aCommandURL*/,
                            m_xPaletteManager,
                            m_aBorderColorStatus,
                            m_aColorStatus,
                            m_nSlotId,
                            xFrame,
                            this,
@@ -3810,7 +3742,7 @@ void ColorListBox::createColorWindow()

    m_xColorWindow.reset(new ColorWindow(
                            m_xPaletteManager,
                            m_aBorderColorStatus,
                            m_aColorStatus,
                            m_nSlotId,
                            xFrame,
                            m_pTopLevel,