Blame SOURCES/0001-implement-save-slide-background-for-impress.patch

a9add1
From 402f64fc8464366015259d44e238a77cb7d9d776 Mon Sep 17 00:00:00 2001
a9add1
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
a9add1
Date: Wed, 30 Sep 2015 13:30:36 +0100
a9add1
Subject: [PATCH] implement save slide background for impress
a9add1
a9add1
to go along with the existing "set background",
a9add1
same sort of thing as the competitor's effort
a9add1
a9add1
(cherry picked from commit ed25a000ab67324075e68d9a7f3ca657b4e6a573)
a9add1
a9add1
Change-Id: I2a1106771ead2cd926f3d631850447499340697c
a9add1
---
a9add1
 sd/inc/app.hrc                     |  3 +-
a9add1
 sd/inc/sdcommands.h                |  1 +
a9add1
 sd/sdi/_drvwsh.sdi                 |  5 +++
a9add1
 sd/sdi/sdraw.sdi                   | 24 +++++++++++
a9add1
 sd/source/ui/app/menuids_tmpl.src  | 11 ++++-
a9add1
 sd/source/ui/func/fupage.cxx       | 85 +++++++++++++++++++++++---------------
a9add1
 sd/source/ui/inc/DrawViewShell.hxx |  4 ++
a9add1
 sd/source/ui/view/drviews2.cxx     |  1 +
a9add1
 sd/source/ui/view/drviews7.cxx     | 25 ++++++++++-
a9add1
 9 files changed, 122 insertions(+), 37 deletions(-)
a9add1
a9add1
diff --git a/sd/inc/app.hrc b/sd/inc/app.hrc
a9add1
index 4f3d82e..956c7d4 100644
a9add1
--- a/sd/inc/app.hrc
a9add1
+++ b/sd/inc/app.hrc
a9add1
@@ -421,7 +421,8 @@
a9add1
 #define SID_SLIDE_SORTER_MULTI_PANE_GUI     (SID_SD_START+421)
a9add1
 
a9add1
 #define SID_SELECT_BACKGROUND               (SID_SD_START+422)
a9add1
-
a9add1
+#define SID_SAVE_BACKGROUND                 (SID_SD_START+423)
a9add1
+        // FREE
a9add1
 // Slots for the tool pane popup
a9add1
 #define SID_TP_APPLY_TO_ALL_SLIDES          (SID_SD_START+425)
a9add1
 #define SID_TP_APPLY_TO_SELECTED_SLIDES     (SID_SD_START+426)
a9add1
diff --git a/sd/inc/sdcommands.h b/sd/inc/sdcommands.h
a9add1
index 2f4bf56..1d3502f 100644
a9add1
--- a/sd/inc/sdcommands.h
a9add1
+++ b/sd/inc/sdcommands.h
a9add1
@@ -90,6 +90,7 @@
a9add1
 #define CMD_SID_DELETE_MASTER_PAGE                  ".uno:DeleteMasterPage"
a9add1
 #define CMD_SID_RENAME_MASTER_PAGE                  ".uno:RenameMasterPage"
a9add1
 #define CMD_SID_SELECT_BACKGROUND                   ".uno:SelectBackground"
a9add1
+#define CMD_SID_SAVE_BACKGROUND                     ".uno:SaveBackground"
a9add1
 #define CMD_SID_DISPLAY_MASTER_BACKGROUND           ".uno:DisplayMasterBackground"
a9add1
 #define CMD_SID_DISPLAY_MASTER_OBJECTS              ".uno:DisplayMasterObjects"
a9add1
 #define CMD_SID_TABLE_DISTRIBUTE_COLUMNS            ".uno:DistributeColumns"
a9add1
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
a9add1
index 263a8ed..28ee22c 100644
a9add1
--- a/sd/sdi/_drvwsh.sdi
a9add1
+++ b/sd/sdi/_drvwsh.sdi
a9add1
@@ -2662,6 +2662,11 @@ interface DrawView
a9add1
         ExecMethod = FuTemporary ;
a9add1
         StateMethod = GetMenuState ;
a9add1
     ]
a9add1
+    SID_SAVE_BACKGROUND
a9add1
+    [
a9add1
+        ExecMethod = FuTemporary ;
a9add1
+        StateMethod = GetMenuState ;
a9add1
+    ]
a9add1
     SID_DISPLAY_MASTER_BACKGROUND
a9add1
     [
a9add1
         ExecMethod = FuTemporary ;
a9add1
diff --git a/sd/sdi/sdraw.sdi b/sd/sdi/sdraw.sdi
a9add1
index 7297c1f..d2d5d28 100644
a9add1
--- a/sd/sdi/sdraw.sdi
a9add1
+++ b/sd/sdi/sdraw.sdi
a9add1
@@ -6439,6 +6439,30 @@ SfxVoidItem SelectBackground SID_SELECT_BACKGROUND
a9add1
     GroupId = GID_OPTIONS;
a9add1
 ]
a9add1
 
a9add1
+SfxVoidItem SaveBackground SID_SAVE_BACKGROUND
a9add1
+()
a9add1
+[
a9add1
+    /* flags: */
a9add1
+    AutoUpdate = FALSE,
a9add1
+    Cachable = Cachable,
a9add1
+    FastCall = FALSE,
a9add1
+    HasCoreId = FALSE,
a9add1
+    HasDialog = TRUE,
a9add1
+    ReadOnlyDoc = TRUE,
a9add1
+    Toggle = FALSE,
a9add1
+    Container = FALSE,
a9add1
+    RecordAbsolute = FALSE,
a9add1
+    RecordPerSet;
a9add1
+    Synchron;
a9add1
+
a9add1
+    /* config: */
a9add1
+    AccelConfig = FALSE,
a9add1
+    MenuConfig = FALSE,
a9add1
+    StatusBarConfig = FALSE,
a9add1
+    ToolBoxConfig = FALSE,
a9add1
+    GroupId = GID_OPTIONS;
a9add1
+]
a9add1
+
a9add1
 SfxBoolItem DisplayMasterBackground SID_DISPLAY_MASTER_BACKGROUND
a9add1
 [
a9add1
     /* flags: */
a9add1
diff --git a/sd/source/ui/app/menuids_tmpl.src b/sd/source/ui/app/menuids_tmpl.src
a9add1
index bf30830..6917de2 100644
a9add1
--- a/sd/source/ui/app/menuids_tmpl.src
a9add1
+++ b/sd/source/ui/app/menuids_tmpl.src
a9add1
@@ -138,6 +138,13 @@
a9add1
         HelpId = CMD_SID_SELECT_BACKGROUND ; \
a9add1
         Text [ en-US ] = "Set Background Image..." ; \
a9add1
     };
a9add1
+#define MN_SAVE_BACKGROUND \
a9add1
+    MenuItem\
a9add1
+    {\
a9add1
+        Identifier = SID_SAVE_BACKGROUND ; \
a9add1
+        HelpId = CMD_SID_SAVE_BACKGROUND ; \
a9add1
+        Text [ en-US ] = "Save Background Image..." ; \
a9add1
+    };
a9add1
 #define MN_DISPLAY_MASTER_BACKGROUND \
a9add1
     MenuItem\
a9add1
     {\
a9add1
@@ -169,6 +176,7 @@
a9add1
                 MN_SELECT_BACKGROUND\
a9add1
                 MN_PAGE_DESIGN\
a9add1
                 MN_RENAME_PAGE\
a9add1
+                MN_SAVE_BACKGROUND\
a9add1
             };\
a9add1
         };\
a9add1
         Text [ en-US ] = "Pag~e" ; \
a9add1
@@ -200,7 +208,8 @@
a9add1
                 MN_DISPLAY_MASTER_OBJECTS\
a9add1
             };\
a9add1
         };\
a9add1
-    };
a9add1
+    }; \
a9add1
+    MN_SAVE_BACKGROUND
a9add1
 
a9add1
  // Layer
a9add1
 #define MN_RENAME_LAYER \
a9add1
diff --git a/sd/source/ui/func/fupage.cxx b/sd/source/ui/func/fupage.cxx
a9add1
index 83146e4..d3a053f 100644
a9add1
--- a/sd/source/ui/func/fupage.cxx
a9add1
+++ b/sd/source/ui/func/fupage.cxx
a9add1
@@ -36,6 +36,7 @@
a9add1
 #include <svx/svdundo.hxx>
a9add1
 #include <editeng/eeitem.hxx>
a9add1
 #include <editeng/frmdiritem.hxx>
a9add1
+#include <svx/graphichelper.hxx>
a9add1
 #include <svx/xbtmpit.hxx>
a9add1
 #include <svx/xsetit.hxx>
a9add1
 #include <editeng/ulspitem.hxx>
a9add1
@@ -164,6 +165,41 @@ void FuPage::Deactivate()
a9add1
 {
a9add1
 }
a9add1
 
a9add1
+void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr)
a9add1
+{
a9add1
+    if (bMasterPage)
a9add1
+    {
a9add1
+        if (pStyleSheet)
a9add1
+            mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
a9add1
+    }
a9add1
+    else
a9add1
+    {
a9add1
+        // Only this page, get attributes for background fill
a9add1
+        const SfxItemSet& rBackgroundAttributes = pPage->getSdrPageProperties().GetItemSet();
a9add1
+
a9add1
+        if(drawing::FillStyle_NONE != static_cast<const XFillStyleItem&>(rBackgroundAttributes.Get(XATTR_FILLSTYLE)).GetValue())
a9add1
+        {
a9add1
+            // page attributes are used, take them
a9add1
+            rMergedAttr.Put(rBackgroundAttributes);
a9add1
+        }
a9add1
+        else
a9add1
+        {
a9add1
+            if(pStyleSheet
a9add1
+                && drawing::FillStyle_NONE != static_cast<const XFillStyleItem&>(pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE)).GetValue())
a9add1
+            {
a9add1
+                // if the page has no fill style, use the settings from the
a9add1
+                // background stylesheet (if used)
a9add1
+                mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
a9add1
+            }
a9add1
+            else
a9add1
+            {
a9add1
+                // no fill style from page, start with no fill style
a9add1
+                rMergedAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
a9add1
+            }
a9add1
+        }
a9add1
+    }
a9add1
+}
a9add1
+
a9add1
 const SfxItemSet* FuPage::ExecuteDialog( vcl::Window* pParent )
a9add1
 {
a9add1
     if (!mpDrawViewShell)
a9add1
@@ -247,44 +283,27 @@ const SfxItemSet* FuPage::ExecuteDialog( vcl::Window* pParent )
a9add1
     // merge page background filling to the dialogs input set
a9add1
     if( mbDisplayBackgroundTabPage )
a9add1
     {
a9add1
-        if( mbMasterPage )
a9add1
-        {
a9add1
-            if(pStyleSheet)
a9add1
-                mergeItemSetsImpl( aMergedAttr, pStyleSheet->GetItemSet() );
a9add1
-        }
a9add1
-        else
a9add1
-        {
a9add1
-            // Only this page, get attributes for background fill
a9add1
-            const SfxItemSet& rBackgroundAttributes = mpPage->getSdrPageProperties().GetItemSet();
a9add1
-
a9add1
-            if(drawing::FillStyle_NONE != static_cast<const XFillStyleItem&>(rBackgroundAttributes.Get(XATTR_FILLSTYLE)).GetValue())
a9add1
-            {
a9add1
-                // page attributes are used, take them
a9add1
-                aMergedAttr.Put(rBackgroundAttributes);
a9add1
-            }
a9add1
-            else
a9add1
-            {
a9add1
-                if(pStyleSheet
a9add1
-                    && drawing::FillStyle_NONE != static_cast<const XFillStyleItem&>(pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE)).GetValue())
a9add1
-                {
a9add1
-                    // if the page has no fill style, use the settings from the
a9add1
-                    // background stylesheet (if used)
a9add1
-                    mergeItemSetsImpl(aMergedAttr, pStyleSheet->GetItemSet());
a9add1
-                }
a9add1
-                else
a9add1
-                {
a9add1
-                    // no fill style from page, start with no fill style
a9add1
-                    aMergedAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
a9add1
-                }
a9add1
-            }
a9add1
-        }
a9add1
+        MergePageBackgroundFilling(mpPage, pStyleSheet, mbMasterPage, aMergedAttr);
a9add1
     }
a9add1
 
a9add1
     boost::scoped_ptr< SfxItemSet > pTempSet;
a9add1
 
a9add1
-    if( GetSlotID() == SID_SELECT_BACKGROUND )
a9add1
+    const sal_uInt16 nId = GetSlotID();
a9add1
+    if (nId == SID_SAVE_BACKGROUND)
a9add1
+    {
a9add1
+        const XFillStyleItem& rStyleItem =
a9add1
+            static_cast<const XFillStyleItem&>(aMergedAttr.Get(XATTR_FILLSTYLE));
a9add1
+        if (drawing::FillStyle_BITMAP == (drawing::FillStyle)rStyleItem.GetValue())
a9add1
+        {
a9add1
+            const XFillBitmapItem& rBitmap =
a9add1
+                static_cast<const XFillBitmapItem&>(aMergedAttr.Get(XATTR_FILLBITMAP));
a9add1
+            const GraphicObject& rGraphicObj = rBitmap.GetGraphicObject();
a9add1
+            GraphicHelper::ExportGraphic(rGraphicObj.GetGraphic(), "");
a9add1
+        }
a9add1
+    }
a9add1
+    else if (nId == SID_SELECT_BACKGROUND)
a9add1
     {
a9add1
-        SvxOpenGraphicDialog    aDlg(SdResId(STR_SET_BACKGROUND_PICTURE));
a9add1
+        SvxOpenGraphicDialog aDlg(SdResId(STR_SET_BACKGROUND_PICTURE));
a9add1
 
a9add1
         if( aDlg.Execute() == GRFILTER_OK )
a9add1
         {
a9add1
diff --git a/sd/source/ui/inc/DrawViewShell.hxx b/sd/source/ui/inc/DrawViewShell.hxx
a9add1
index 405e7af..5ec628c 100644
a9add1
--- a/sd/source/ui/inc/DrawViewShell.hxx
a9add1
+++ b/sd/source/ui/inc/DrawViewShell.hxx
a9add1
@@ -33,6 +33,7 @@
a9add1
 
a9add1
 class Outliner;
a9add1
 class SdPage;
a9add1
+class SdStyleSheet;
a9add1
 class SdrExternalToolEdit;
a9add1
 class DrawDocShell;
a9add1
 class TabBar;
a9add1
@@ -509,6 +510,9 @@ private:
a9add1
     std::vector<std::unique_ptr<SdrExternalToolEdit>> m_ExternalEdits;
a9add1
 };
a9add1
 
a9add1
+    /// Merge the background properties together and deposit the result in rMergeAttr
a9add1
+    void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr);
a9add1
+
a9add1
 } // end of namespace sd
a9add1
 
a9add1
 #endif
a9add1
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
a9add1
index e9c5f00..5c26c55 100644
a9add1
--- a/sd/source/ui/view/drviews2.cxx
a9add1
+++ b/sd/source/ui/view/drviews2.cxx
a9add1
@@ -1190,6 +1190,7 @@ void DrawViewShell::FuTemporary(SfxRequest& rReq)
a9add1
         break;
a9add1
 
a9add1
         case SID_SELECT_BACKGROUND:
a9add1
+        case SID_SAVE_BACKGROUND:
a9add1
         case SID_PAGESETUP:  // BASIC ??
a9add1
         {
a9add1
             SetCurrentFunction( FuPage::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) );
a9add1
diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
a9add1
index 8b6d968..fba8bc1 100644
a9add1
--- a/sd/source/ui/view/drviews7.cxx
a9add1
+++ b/sd/source/ui/view/drviews7.cxx
a9add1
@@ -83,6 +83,7 @@
a9add1
 #include "fuediglu.hxx"
a9add1
 #include "fubullet.hxx"
a9add1
 #include "fuformatpaintbrush.hxx"
a9add1
+#include "stlsheet.hxx"
a9add1
 
a9add1
 #include <config_features.h>
a9add1
 
a9add1
@@ -714,6 +715,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
a9add1
     {
a9add1
         rSet.DisableItem(SID_PRESENTATION_LAYOUT);
a9add1
         rSet.DisableItem(SID_SELECT_BACKGROUND);
a9add1
+        rSet.DisableItem(SID_SAVE_BACKGROUND);
a9add1
     }
a9add1
 
a9add1
     if (mePageKind == PK_NOTES)
a9add1
@@ -730,6 +732,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
a9add1
             rSet.DisableItem(SID_MODIFYPAGE);
a9add1
 
a9add1
         rSet.DisableItem(SID_SELECT_BACKGROUND);
a9add1
+        rSet.DisableItem(SID_SAVE_BACKGROUND);
a9add1
         rSet.DisableItem(SID_INSERTLAYER);
a9add1
         rSet.DisableItem(SID_LAYERMODE);
a9add1
         rSet.DisableItem(SID_INSERTFILE);
a9add1
@@ -750,6 +753,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
a9add1
         rSet.DisableItem(SID_INSERTFILE);
a9add1
         rSet.DisableItem(SID_PAGEMODE);
a9add1
         rSet.DisableItem(SID_SELECT_BACKGROUND);
a9add1
+        rSet.DisableItem(SID_SAVE_BACKGROUND);
a9add1
     }
a9add1
     else
a9add1
     {
a9add1
@@ -1646,8 +1650,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
a9add1
         || rSet.GetItemState(SID_DISPLAY_MASTER_OBJECTS) == SfxItemState::DEFAULT)
a9add1
     {
a9add1
         SdPage* pPage = GetActualPage();
a9add1
-        if (pPage != NULL
a9add1
-            && GetDoc() != NULL)
a9add1
+        if (pPage != NULL && GetDoc() != NULL)
a9add1
         {
a9add1
             SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
a9add1
             SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
a9add1
@@ -1668,6 +1671,24 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
a9add1
     }
a9add1
 #endif
a9add1
 
a9add1
+    if (rSet.GetItemState(SID_SAVE_BACKGROUND) == SfxItemState::DEFAULT)
a9add1
+    {
a9add1
+        bool bDisableSaveBackground = true;
a9add1
+        SdPage* pPage = GetActualPage();
a9add1
+        if (pPage != NULL && GetDoc() != NULL)
a9add1
+        {
a9add1
+            SfxItemSet aMergedAttr(GetDoc()->GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST, 0);
a9add1
+            SdStyleSheet* pStyleSheet = pPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
a9add1
+            MergePageBackgroundFilling(pPage, pStyleSheet, meEditMode == EM_MASTERPAGE, aMergedAttr);
a9add1
+            if (drawing::FillStyle_BITMAP == static_cast<const XFillStyleItem&>(aMergedAttr.Get(XATTR_FILLSTYLE)).GetValue())
a9add1
+            {
a9add1
+                bDisableSaveBackground = false;
a9add1
+            }
a9add1
+        }
a9add1
+        if (bDisableSaveBackground)
a9add1
+            rSet.DisableItem(SID_SAVE_BACKGROUND);
a9add1
+    }
a9add1
+
a9add1
     GetModeSwitchingMenuState (rSet);
a9add1
 }
a9add1
 
a9add1
-- 
a9add1
2.4.3
a9add1