tdf#90078 Add import bitmap button to Area Panel

Change-Id: I49712f807d38a614fd707d06c9453545360db89f
Reviewed-on: https://gerrit.libreoffice.org/26527
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
diff --git a/include/svx/sidebar/AreaPropertyPanelBase.hxx b/include/svx/sidebar/AreaPropertyPanelBase.hxx
index fc24c92..525199e 100644
--- a/include/svx/sidebar/AreaPropertyPanelBase.hxx
+++ b/include/svx/sidebar/AreaPropertyPanelBase.hxx
@@ -136,6 +136,8 @@ protected:
    VclPtr<ToolBox>                                            mpBTNGradient;
    VclPtr<MetricField>                                        mpMTRAngle;
    VclPtr<ListBox>                                            mpGradientStyle;
    VclPtr<SvxFillAttrBox>                                     mpLbFillBitmap;
    VclPtr<PushButton>                                         mpBmpImport;

    std::unique_ptr< XFillStyleItem >               mpStyleItem;
    std::unique_ptr< XFillColorItem >               mpColorItem;
@@ -165,6 +167,7 @@ protected:
    DECL_LINK_TYPED(ChangeTrgrTypeHdl_Impl, ListBox&, void);
    DECL_LINK_TYPED(ModifyTransparentHdl_Impl, Edit&, void);
    DECL_LINK_TYPED(ModifyTransSliderHdl, Slider*, void);
    DECL_LINK_TYPED(ClickImportBitmapHdl, Button*, void);

    // for transparency gradient
    VclPtr<PopupControl> CreateTransparencyGradientControl (PopupContainer* pParent);
diff --git a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
index 350387b..65be70b 100644
--- a/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
+++ b/svx/source/sidebar/area/AreaPropertyPanelBase.cxx
@@ -39,7 +39,7 @@
#include <vcl/toolbox.hxx>
#include <svtools/toolbarmenu.hxx>
#include <svx/tbcontrl.hxx>

#include "sfx2/opengrf.hxx"

using namespace css;
using namespace css::uno;
@@ -100,6 +100,8 @@ AreaPropertyPanelBase::AreaPropertyPanelBase(
    get(mpLbFillGradFrom, "fillgrad1");
    get(mpLbFillGradTo, "fillgrad2");
    get(mpGradientStyle, "gradientstyle");
    get(mpLbFillBitmap, "fillbitmap");
    get(mpBmpImport, "bmpimport");

    Initialize();
}
@@ -124,6 +126,8 @@ void AreaPropertyPanelBase::dispose()
    mpLbFillGradFrom.clear();
    mpLbFillGradTo.clear();
    mpGradientStyle.clear();
    mpLbFillBitmap.clear();
    mpBmpImport.clear();

    PanelLayout::dispose();
}
@@ -161,6 +165,7 @@ void AreaPropertyPanelBase::Initialize()
    mpGradientStyle->SetSelectHdl( aLink );
    mpLbFillGradFrom->SetSelectHdl( aLink );
    mpLbFillGradTo->SetSelectHdl( aLink );
    mpLbFillBitmap->SetSelectHdl( aLink );
    mpMTRAngle->SetModifyHdl(LINK(this,AreaPropertyPanelBase, ChangeGradientAngle));

    mpLBTransType->SetSelectHdl(LINK(this, AreaPropertyPanelBase, ChangeTrgrTypeHdl_Impl));
@@ -176,6 +181,7 @@ void AreaPropertyPanelBase::Initialize()
    mpBTNGradient->SetSelectHdl( aLink2 );
    mpBTNGradient->SetItemImage(nIdGradient,maImgLinear);
    mpBTNGradient->Hide();
    mpBmpImport->SetClickHdl( LINK(this, AreaPropertyPanelBase, ClickImportBitmapHdl));
    mpSidebarController = sfx2::sidebar::SidebarController::GetSidebarControllerForFrame(mxFrame);
    mpSidebarController->NotifyResize();
}
@@ -186,6 +192,49 @@ void AreaPropertyPanelBase::SetTransparency(sal_uInt16 nVal)
    mpMTRTransparent->SetValue(nVal);
}

IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, ClickImportBitmapHdl, Button*, void)
{
    SvxOpenGraphicDialog aDlg( "Import" );
    aDlg.EnableLink(false);
    if( aDlg.Execute() == GRFILTER_OK )
    {
        Graphic aGraphic;
        EnterWait();
        int nError = aDlg.GetGraphic( aGraphic );
        LeaveWait();
        if( nError == GRFILTER_OK )
        {
            const SvxBitmapListItem aItem( *static_cast<const SvxBitmapListItem*>(SfxObjectShell::Current()->GetItem(SID_BITMAP_LIST)));
            XBitmapListRef pList = aItem.GetBitmapList();
            INetURLObject   aURL( aDlg.GetPath() );
            OUString aFileName =  aURL.GetName().getToken( 0, '.' );
            OUString aName = aFileName;
            long j = 1;
            bool bValidBitmapName = false;
            while( !bValidBitmapName )
            {
                bValidBitmapName = true;
                for( long i = 0; i < pList->Count() && bValidBitmapName; i++ )
                {
                    if( aName == pList->GetBitmap(i)->GetName() )
                    {
                        bValidBitmapName = false;
                        aName = aFileName + OUString::number(j++);
                    }
                }
            }

            XBitmapEntry* pEntry = new XBitmapEntry( aGraphic, aName );
            pList->Insert(pEntry);
            pList->Save();
            mpLbFillBitmap->Clear();
            mpLbFillBitmap->Fill(pList);
            mpLbFillBitmap->SelectEntry(aName);
            SelectFillAttrHdl(*mpLbFillBitmap);
        }
    }
}

IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
{
    const drawing::FillStyle eXFS = (drawing::FillStyle)mpLbFillType->GetSelectEntryPos();
@@ -211,6 +260,8 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
                mpGradientStyle->Hide();
                mpMTRAngle->Hide();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();
                mpLbFillType->Selected();
                mpLbFillAttr->Disable();

@@ -225,6 +276,8 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
                mpLbFillGradTo->Hide();
                mpGradientStyle->Hide();
                mpMTRAngle->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();
                mpToolBoxColor->Show();
                const OUString aTmpStr;
                const Color aColor = mpColorItem ? mpColorItem->GetColorValue() : COL_AUTO;
@@ -242,6 +295,8 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
                mpGradientStyle->Show();
                mpMTRAngle->Show();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();

                const SvxColorListItem* pColorListItem = static_cast<const SvxColorListItem*>(pSh ? pSh->GetItem(SID_COLOR_TABLE) : nullptr);
                if (pColorListItem)
@@ -308,6 +363,8 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
                mpMTRAngle->Hide();
                mpGradientStyle->Hide();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();

                if(pSh && pSh->GetItem(SID_HATCH_LIST))
                {
@@ -344,24 +401,25 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
            }
            case drawing::FillStyle_BITMAP:
            {
                mpLbFillAttr->Show();
                mpLbFillAttr->Hide();
                mpLbFillGradFrom->Hide();
                mpLbFillGradTo->Hide();
                mpMTRAngle->Hide();
                mpGradientStyle->Hide();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Show();
                mpBmpImport->Show();

                if(pSh && pSh->GetItem(SID_BITMAP_LIST))
                {
                    if(!mpLbFillAttr->GetEntryCount())
                    if(!mpLbFillBitmap->GetEntryCount())
                    {
                        const SvxBitmapListItem aItem( *static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
                        mpLbFillAttr->Enable();
                        mpLbFillAttr->Clear();
                        mpLbFillAttr->Fill(aItem.GetBitmapList());
                        mpLbFillBitmap->Clear();
                        mpLbFillBitmap->Fill(aItem.GetBitmapList());
                    }

                    mpLbFillAttr->AdaptDropDownLineCountToMaximum();
                    mpLbFillBitmap->AdaptDropDownLineCountToMaximum();

                    if(LISTBOX_ENTRY_NOTFOUND != mnLastPosBitmap)
                    {
@@ -370,17 +428,17 @@ IMPL_LINK_NOARG_TYPED(AreaPropertyPanelBase, SelectFillTypeHdl, ListBox&, void)
                        if(mnLastPosBitmap < aItem.GetBitmapList()->Count())
                        {
                            const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(mnLastPosBitmap);
                            const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
                            const XFillBitmapItem aXFillBitmapItem(mpLbFillBitmap->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());

                            // #i122676# change FillStyle and Bitmap in one call
                            setFillStyleAndBitmap(&aXFillStyleItem, aXFillBitmapItem);
                            mpLbFillAttr->SelectEntryPos(mnLastPosBitmap);
                            mpLbFillBitmap->SelectEntryPos(mnLastPosBitmap);
                        }
                    }
                }
                else
                {
                    mpLbFillAttr->Disable();
                    mpLbFillBitmap->Hide();
                }
                break;
            }
@@ -488,7 +546,7 @@ void AreaPropertyPanelBase::SelectFillAttrHdl_Impl()
        }
        case drawing::FillStyle_BITMAP:
        {
            sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
            sal_Int32 nPos = mpLbFillBitmap->GetSelectEntryPos();

            if(LISTBOX_ENTRY_NOTFOUND == nPos)
            {
@@ -502,7 +560,7 @@ void AreaPropertyPanelBase::SelectFillAttrHdl_Impl()
                if(nPos < aItem.GetBitmapList()->Count())
                {
                    const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
                    const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
                    const XFillBitmapItem aXFillBitmapItem(mpLbFillBitmap->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());

                    // #i122676# Change FillStyle and Bitmap in one call
                    setFillStyleAndBitmap(bFillStyleChange ? &aXFillStyleItem : nullptr, aXFillBitmapItem);
@@ -840,22 +898,20 @@ void AreaPropertyPanelBase::updateFillBitmap(bool bDisabled, bool bDefault, cons

    if(mpStyleItem && drawing::FillStyle_BITMAP == (drawing::FillStyle)mpStyleItem->GetValue())
    {
        mpLbFillAttr->Show();
        mpLbFillBitmap->Show();
        mpToolBoxColor->Hide();

        if(bDefault)
        {
            mpLbFillAttr->Enable();
            Update();
        }
        else if(bDisabled)
        {
            mpLbFillAttr->Disable();
            mpLbFillAttr->SetNoSelection();
            mpLbFillBitmap->Hide();
        }
        else
        {
            mpLbFillAttr->SetNoSelection();
            mpLbFillBitmap->SetNoSelection();
        }
    }
    mpSidebarController->NotifyResize();
@@ -963,14 +1019,14 @@ void AreaPropertyPanelBase::NotifyItemUpdate(
                        const SfxObjectShell* pSh = SfxObjectShell::Current();
                        const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));

                        mpLbFillAttr->Clear();
                        mpLbFillAttr->Enable();
                        mpLbFillAttr->Fill(aItem.GetBitmapList());
                        mpLbFillAttr->SelectEntry(aString);
                        mpLbFillBitmap->Clear();
                        mpLbFillBitmap->Show();
                        mpLbFillBitmap->Fill(aItem.GetBitmapList());
                        mpLbFillBitmap->SelectEntry(aString);
                    }
                    else
                    {
                        mpLbFillAttr->SetNoSelection();
                        mpLbFillBitmap->SetNoSelection();
                    }
                }
            }
@@ -996,6 +1052,8 @@ void AreaPropertyPanelBase::Update()
                mpMTRAngle->Hide();
                mpGradientStyle->Hide();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();
                break;
            }
            case drawing::FillStyle_SOLID:
@@ -1008,6 +1066,8 @@ void AreaPropertyPanelBase::Update()
                    mpMTRAngle->Hide();
                    mpGradientStyle->Hide();
                    mpToolBoxColor->Show();
                    mpLbFillBitmap->Hide();
                    mpBmpImport->Hide();
                }
                break;
            }
@@ -1020,6 +1080,8 @@ void AreaPropertyPanelBase::Update()
                mpMTRAngle->Show();
                mpGradientStyle->Show();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();

                if(pSh && pSh->GetItem(SID_GRADIENT_LIST))
                {
@@ -1074,6 +1136,10 @@ void AreaPropertyPanelBase::Update()
                mpMTRAngle->Hide();
                mpGradientStyle->Hide();
                mpToolBoxColor->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();
                mpLbFillBitmap->Hide();
                mpBmpImport->Hide();

                if(pSh && pSh->GetItem(SID_HATCH_LIST))
                {
@@ -1101,34 +1167,35 @@ void AreaPropertyPanelBase::Update()
            }
            case drawing::FillStyle_BITMAP:
            {
                mpLbFillAttr->Show();
                mpLbFillAttr->Hide();
                mpToolBoxColor->Hide();
                mpLbFillGradFrom->Hide();
                mpLbFillGradTo->Hide();
                mpMTRAngle->Hide();
                mpGradientStyle->Hide();
                mpLbFillBitmap->Show();
                mpBmpImport->Show();

                if(pSh && pSh->GetItem(SID_BITMAP_LIST))
                {
                    const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
                    mpLbFillAttr->Enable();
                    mpLbFillAttr->Clear();
                    mpLbFillAttr->Fill(aItem.GetBitmapList());
                    mpLbFillBitmap->Clear();
                    mpLbFillBitmap->Fill(aItem.GetBitmapList());

                    if(mpBitmapItem)
                    {
                        const OUString aString(mpBitmapItem->GetName());

                        mpLbFillAttr->SelectEntry(aString);
                        mpLbFillBitmap->SelectEntry(aString);
                    }
                    else
                    {
                        mpLbFillAttr->SetNoSelection();
                        mpLbFillBitmap->SetNoSelection();
                    }
                }
                else
                {
                    mpLbFillAttr->SetNoSelection();
                    mpLbFillBitmap->SetNoSelection();
                }
                break;
            }
@@ -1136,6 +1203,7 @@ void AreaPropertyPanelBase::Update()
                OSL_ENSURE(false, "Non supported FillType (!)");
            break;
        }
        mpSidebarController->NotifyResize();
    }
}

diff --git a/svx/uiconfig/ui/sidebararea.ui b/svx/uiconfig/ui/sidebararea.ui
index 8d03ca3..efd1bcb 100644
--- a/svx/uiconfig/ui/sidebararea.ui
+++ b/svx/uiconfig/ui/sidebararea.ui
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.16.1 -->
<interface>
  <!-- interface-requires LibreOffice 1.0 -->
  <requires lib="gtk+" version="3.0"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkAdjustment" id="adjustment1">
    <property name="upper">100</property>
    <property name="step_increment">1</property>
@@ -46,6 +46,8 @@
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">0</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -118,6 +120,8 @@
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">1</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -141,13 +145,15 @@
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">0</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkToolbar" id="selectgradient">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="halign">end</property>
                <property name="halign">start</property>
                <child>
                  <object class="GtkMenuToolButton" id="gradient">
                    <property name="visible">True</property>
@@ -167,54 +173,9 @@
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">4</property>
              </packing>
            </child>
            <child>
              <object class="GtkComboBoxText" id="transtype">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="has_tooltip">True</property>
                <property name="tooltip_markup" translatable="yes">Select the type of transparency to apply.</property>
                <property name="tooltip_text" translatable="yes">Select the type of transparency to apply.</property>
                <items>
                  <item translatable="yes">None</item>
                  <item translatable="yes">Solid</item>
                  <item translatable="yes">Linear</item>
                  <item translatable="yes">Axial</item>
                  <item translatable="yes">Radial</item>
                  <item translatable="yes">Ellipsoid</item>
                  <item translatable="yes">Quadratic</item>
                  <item translatable="yes">Square</item>
                </items>
                <accessibility>
                  <relation type="labelled-by" target="transparencylabel"/>
                </accessibility>
                <child internal-child="accessible">
                  <object class="AtkObject" id="transtype-atkobject">
                    <property name="AtkObject::accessible-name" translatable="yes">Transparency Type</property>
                  </object>
                </child>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">3</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="transparencylabel">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="has_tooltip">True</property>
                <property name="tooltip_markup" translatable="yes">Transparency</property>
                <property name="tooltip_text" translatable="yes">Transparency</property>
                <property name="xalign">0</property>
                <property name="label" translatable="yes">_Transparency:</property>
                <property name="use_underline">True</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">3</property>
                <property name="top_attach">5</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -228,6 +189,8 @@
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">2</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -246,6 +209,8 @@
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">2</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -271,6 +236,93 @@
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">1</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkComboBoxText" id="transtype">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="has_tooltip">True</property>
                <property name="tooltip_markup" translatable="yes">Select the type of transparency to apply.</property>
                <property name="tooltip_text" translatable="yes">Select the type of transparency to apply.</property>
                <items>
                  <item translatable="yes">None</item>
                  <item translatable="yes">Solid</item>
                  <item translatable="yes">Linear</item>
                  <item translatable="yes">Axial</item>
                  <item translatable="yes">Radial</item>
                  <item translatable="yes">Ellipsoid</item>
                  <item translatable="yes">Quadratic</item>
                  <item translatable="yes">Square</item>
                </items>
                <child internal-child="accessible">
                  <object class="AtkObject" id="transtype-atkobject">
                    <property name="AtkObject::accessible-name" translatable="yes">Transparency Type</property>
                  </object>
                </child>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">4</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkLabel" id="transparencylabel">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="has_tooltip">True</property>
                <property name="tooltip_markup" translatable="yes">Transparency</property>
                <property name="tooltip_text" translatable="yes">Transparency</property>
                <property name="xalign">0</property>
                <property name="label" translatable="yes">_Transparency:</property>
                <property name="use_underline">True</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">4</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="bmpimport">
                <property name="label" translatable="yes">_Import</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_underline">True</property>
              </object>
              <packing>
                <property name="left_attach">0</property>
                <property name="top_attach">3</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
              <object class="svxlo-SvxFillAttrBox" id="fillbitmap">
                <property name="can_focus">False</property>
                <property name="has_tooltip">True</property>
                <property name="tooltip_markup" translatable="yes">Select the effect to apply.</property>
                <property name="tooltip_text" translatable="yes">Select the effect to apply.</property>
                <accessibility>
                  <relation type="labelled-by" target="filllabel"/>
                </accessibility>
                <child internal-child="accessible">
                  <object class="AtkObject" id="fillbitmap-atkobject">
                    <property name="AtkObject::accessible-name" translatable="yes">Hatching/Bitmap</property>
                  </object>
                </child>
              </object>
              <packing>
                <property name="left_attach">1</property>
                <property name="top_attach">3</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -302,6 +354,7 @@
                <property name="left_attach">0</property>
                <property name="top_attach">0</property>
                <property name="width">3</property>
                <property name="height">1</property>
              </packing>
            </child>
            <child>
@@ -326,6 +379,8 @@
              <packing>
                <property name="left_attach">3</property>
                <property name="top_attach">0</property>
                <property name="width">1</property>
                <property name="height">1</property>
              </packing>
            </child>
          </object>
@@ -339,6 +394,8 @@
      <packing>
        <property name="left_attach">0</property>
        <property name="top_attach">0</property>
        <property name="width">1</property>
        <property name="height">1</property>
      </packing>
    </child>
  </object>