[libreoffice/f18] Resolves: rhbz#760765 impress doesn't copy custom styles from one file to another

David Tardon dtardon at fedoraproject.org
Tue Jan 22 13:12:19 UTC 2013


commit c9b8c5578c1ecde7f6f55f4cdc0ccc51786fb6cc
Author: David Tardon <dtardon at redhat.com>
Date:   Tue Jan 22 14:03:26 2013 +0100

    Resolves: rhbz#760765 impress doesn't copy custom styles from one file to another
    
    Conflicts:
    	libreoffice.spec

 ...z-760765-copy-custom-styles-on-copy-paste.patch |  198 ++++++++++++++++++++
 libreoffice.spec                                   |    6 +-
 2 files changed, 203 insertions(+), 1 deletions(-)
---
diff --git a/0001-rhbz-760765-copy-custom-styles-on-copy-paste.patch b/0001-rhbz-760765-copy-custom-styles-on-copy-paste.patch
new file mode 100644
index 0000000..c6a9ef3
--- /dev/null
+++ b/0001-rhbz-760765-copy-custom-styles-on-copy-paste.patch
@@ -0,0 +1,198 @@
+From 24578b804007d8c3201e5ed32b8485e1725c33c1 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Thu, 17 Jan 2013 15:01:32 +0100
+Subject: [PATCH] rhbz#760765 copy custom styles on copy & paste
+
+Change-Id: Icaacf3bc1a02a017692432aec36aba06d3f5dde5
+---
+ sd/inc/stlpool.hxx          |  3 +++
+ sd/source/core/drawdoc3.cxx | 49 ++++++++++++++++++++++++++++++++++++++++++---
+ sd/source/core/stlpool.cxx  | 18 +++++++++++++++++
+ sd/source/core/stlsheet.cxx | 16 +++++++++------
+ 4 files changed, 77 insertions(+), 9 deletions(-)
+
+diff --git a/sd/inc/stlpool.hxx b/sd/inc/stlpool.hxx
+index 9e76c2a..4833dd8 100644
+--- a/sd/inc/stlpool.hxx
++++ b/sd/inc/stlpool.hxx
+@@ -80,6 +80,8 @@ public:
+     void                CopyGraphicSheets(SdStyleSheetPool& rSourcePool);
+     void                CopyCellSheets(SdStyleSheetPool& rSourcePool);
+     void                CopyTableStyles(SdStyleSheetPool& rSourcePool);
++    void                CopyGraphicSheets(SdStyleSheetPool& rSourcePool, SdStyleSheetVector& rCreatedSheets);
++    void                CopyCellSheets(SdStyleSheetPool& rSourcePool, SdStyleSheetVector& rCreatedSheets);
+ 
+     void                CreatePseudosIfNecessary();
+     void                UpdateStdNames();
+@@ -121,6 +123,7 @@ public:
+     virtual void SAL_CALL release (void) throw ();
+ protected:
+     void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily );
++    void CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, SdStyleSheetVector& rCreatedSheets );
+ 
+     virtual SfxStyleSheetBase* Create(const String& rName, SfxStyleFamily eFamily, sal_uInt16 nMask);
+     virtual SfxStyleSheetBase* Create(const SdStyleSheet& rStyle);
+diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx
+index e7ac380..b18c254 100644
+--- a/sd/source/core/drawdoc3.cxx
++++ b/sd/source/core/drawdoc3.cxx
+@@ -357,6 +357,26 @@ sal_Bool SdDrawDocument::InsertBookmark(
+     return bOK;
+ }
+ 
++namespace
++{
++
++void
++lcl_removeUnusedStyles(SfxStyleSheetBasePool* const pStyleSheetPool, SdStyleSheetVector& rStyles)
++{
++    SdStyleSheetVector aUsedStyles;
++    aUsedStyles.reserve(rStyles.size());
++    for (SdStyleSheetVector::const_iterator aIt(rStyles.begin()), aLast(rStyles.end()); aIt != aLast; ++aIt)
++    {
++        if ((*aIt)->IsUsed())
++            aUsedStyles.push_back(*aIt);
++        else
++            pStyleSheetPool->Remove((*aIt).get());
++    }
++    rStyles = aUsedStyles;
++}
++
++}
++
+ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
+     const std::vector<rtl::OUString> &rBookmarkList,
+     std::vector<rtl::OUString> *pExchangeList,            // Liste der zu verwendenen Namen
+@@ -484,8 +504,8 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
+     /**************************************************************************
+     * Die tatsaechlich benoetigten Vorlagen kopieren
+     **************************************************************************/
+-    SdStyleSheetPool* pBookmarkStyleSheetPool =
+-    (SdStyleSheetPool*) pBookmarkDoc->GetStyleSheetPool();
++    SdStyleSheetPool* pBookmarkStyleSheetPool = dynamic_cast<SdStyleSheetPool*>(pBookmarkDoc->GetStyleSheetPool());
++    SdStyleSheetPool* pStyleSheetPool = dynamic_cast<SdStyleSheetPool*>(GetStyleSheetPool());
+ 
+     // Wenn Vorlagen kopiert werden muessen, dann muessen auch die
+     // MasterPages kopiert werden!
+@@ -498,7 +518,7 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
+         SdStyleSheetVector aCreatedStyles;
+         String layoutName = *pIter;
+ 
+-        ((SdStyleSheetPool*)GetStyleSheetPool())->CopyLayoutSheets(layoutName, *pBookmarkStyleSheetPool,aCreatedStyles);
++        pStyleSheetPool->CopyLayoutSheets(layoutName, *pBookmarkStyleSheetPool,aCreatedStyles);
+ 
+         if(!aCreatedStyles.empty())
+         {
+@@ -510,6 +530,18 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
+         }
+     }
+ 
++    // Copy styles. This unconditionally copies all styles, even those
++    // that are not used in any of the inserted pages. The unused styles
++    // are then removed at the end of the function, where we also create
++    // undo records for the inserted styles.
++    SdStyleSheetVector aNewGraphicStyles;
++    pStyleSheetPool->CopyGraphicSheets(*pBookmarkStyleSheetPool, aNewGraphicStyles);
++    SdStyleSheetVector aNewCellStyles;
++    pStyleSheetPool->CopyCellSheets(*pBookmarkStyleSheetPool, aNewCellStyles);
++
++    // TODO handle undo of table styles too
++    pStyleSheetPool->CopyTableStyles(*pBookmarkStyleSheetPool);
++
+     /**************************************************************************
+     * Dokument einfuegen
+     **************************************************************************/
+@@ -910,6 +942,17 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
+     // Make absolutely sure no double masterpages are there
+     RemoveUnnecessaryMasterPages(NULL, sal_True, sal_True);
+ 
++    // remove copied styles not used on any inserted page and create
++    // undo records
++    // WARNING: SdMoveStyleSheetsUndoAction clears the passed list of
++    // styles, so it cannot be used after this point
++    lcl_removeUnusedStyles(GetStyleSheetPool(), aNewGraphicStyles);
++    if (!aNewGraphicStyles.empty() && pUndoMgr)
++        pUndoMgr->AddUndoAction(new SdMoveStyleSheetsUndoAction(this, aNewGraphicStyles, sal_True));
++    lcl_removeUnusedStyles(GetStyleSheetPool(), aNewCellStyles);
++    if (!aNewCellStyles.empty() && pUndoMgr)
++        pUndoMgr->AddUndoAction(new SdMoveStyleSheetsUndoAction(this, aNewCellStyles, sal_True));
++
+     if( bUndo )
+         EndUndo();
+     pUndoMgr->LeaveListAction();
+diff --git a/sd/source/core/stlpool.cxx b/sd/source/core/stlpool.cxx
+index 078a64d..cfe6c82 100644
+--- a/sd/source/core/stlpool.cxx
++++ b/sd/source/core/stlpool.cxx
+@@ -582,8 +582,24 @@ void SdStyleSheetPool::CopyTableStyles(SdStyleSheetPool& rSourcePool)
+     }
+ }
+ 
++void SdStyleSheetPool::CopyGraphicSheets(SdStyleSheetPool& rSourcePool, SdStyleSheetVector& rCreatedSheets)
++{
++    CopySheets( rSourcePool, SD_STYLE_FAMILY_GRAPHICS, rCreatedSheets );
++}
++
++void SdStyleSheetPool::CopyCellSheets(SdStyleSheetPool& rSourcePool, SdStyleSheetVector& rCreatedSheets)
++{
++    CopySheets( rSourcePool, SD_STYLE_FAMILY_CELL, rCreatedSheets );
++}
++
+ void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily )
+ {
++    SdStyleSheetVector aTmpSheets;
++    CopySheets(rSourcePool, eFamily, aTmpSheets);
++}
++
++void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily eFamily, SdStyleSheetVector& rCreatedSheets)
++{
+     String aHelpFile;
+ 
+     sal_uInt32 nCount = rSourcePool.aStyles.size();
+@@ -610,6 +626,8 @@ void SdStyleSheetPool::CopySheets(SdStyleSheetPool& rSourcePool, SfxStyleFamily
+ 
+                 xNewSheet->SetHelpId( aHelpFile, xSheet->GetHelpId( aHelpFile ) );
+                 xNewSheet->GetItemSet().Put( xSheet->GetItemSet() );
++
++                rCreatedSheets.push_back( SdStyleSheetRef( static_cast< SdStyleSheet* >( xNewSheet.get() ) ) );
+             }
+         }
+     }
+diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx
+index ecd84d7..f013739 100644
+--- a/sd/source/core/stlsheet.cxx
++++ b/sd/source/core/stlsheet.cxx
+@@ -35,6 +35,7 @@
+ #include <svl/smplhint.hxx>
+ #include <svl/itemset.hxx>
+ 
++#include <svx/sdr/properties/attributeproperties.hxx>
+ #include <svx/xflbmtit.hxx>
+ #include <svx/xflbstit.hxx>
+ #include <editeng/bulitem.hxx>
+@@ -349,13 +350,16 @@ bool SdStyleSheet::IsUsed() const
+                 continue;
+ 
+             // NULL-Pointer ist im Listener-Array erlaubt
+-            if (pListener && pListener->ISA(SdrAttrObj))
++            if (pListener)
+             {
+-                bResult = ((SdrAttrObj*)pListener)->IsInserted();
+-            }
+-            else if (pListener && pListener->ISA(SfxStyleSheet))
+-            {
+-                bResult = ((SfxStyleSheet*)pListener)->IsUsed();
++                if (pListener->ISA(sdr::properties::AttributeProperties))
++                {
++                    bResult = true;
++                }
++                else if (pListener->ISA(SfxStyleSheet))
++                {
++                    bResult = ((SfxStyleSheet*)pListener)->IsUsed();
++                }
+             }
+             if (bResult)
+                 break;
+-- 
+1.8.0.2
+
diff --git a/libreoffice.spec b/libreoffice.spec
index e4a45fb..559345b 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -254,6 +254,7 @@ Patch33: libreoffice-rhel6langs.patch
 Patch34: 0001-rhbz-891082-CMXDocument-isSupported-catch-exceptions.patch
 %endif
 Patch35: 0001-Resolves-fdo-58730-workaround-UL-LR-Space-100-proble.patch
+Patch36: 0001-rhbz-760765-copy-custom-styles-on-copy-paste.patch
 
 %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 %define instdir %{_libdir}
@@ -1001,6 +1002,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
 %patch34 -p1 -b .rhbz-891082-CMXDocument-isSupported-catch-exceptions.patch
 %endif
 %patch35 -p1 -b .Resolves-fdo-58730-workaround-UL-LR-Space-100-proble.patch
+%patch36 -p1 -b .rhbz-760765-copy-custom-styles-on-copy-paste.patch
 
 # TODO: check this
 # these are horribly incomplete--empty translations and copied english
@@ -2269,8 +2271,10 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
 %endif
 
 %changelog
-* Mon Jan 21 2013 David Tardon <dtardon at redhat.com> - 1:3.6.4.3-4-UNBUILT
+* Tue Jan 22 2013 David Tardon <dtardon at redhat.com> - 1:3.6.4.3-4
 - Resolves: rhbz#901346 do not install 512x512 icons
+- Resolves: rhbz#760765 Impress doesn't copy custom styles from one file
+  to another
 
 * Fri Jan 18 2013 Michael Stahl <mstahl at redhat.com> - 1:3.6.4.3-3
 - Resolves: fdo#58730 ODF fo:margin 100% bug


More information about the scm-commits mailing list