[Libreoffice-commits] .: Branch 'libreoffice-3-6' - sd/inc sd/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Jan 23 11:48:54 PST 2013
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(-)
New commits:
commit df27ce04e76177d0885ffb1ffe632f044b8ea27d
Author: David Tardon <dtardon at redhat.com>
Date: Thu Jan 17 15:01:32 2013 +0100
rhbz#760765 copy custom styles on copy & paste
Change-Id: Icaacf3bc1a02a017692432aec36aba06d3f5dde5
(cherry picked from commit 24578b804007d8c3201e5ed32b8485e1725c33c1)
Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
diff --git a/sd/inc/stlpool.hxx b/sd/inc/stlpool.hxx
index 2a7f82a..76ec285 100644
--- a/sd/inc/stlpool.hxx
+++ b/sd/inc/stlpool.hxx
@@ -89,6 +89,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();
@@ -130,6 +132,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 a1d0f7b..34fcbcb 100644
--- a/sd/source/core/drawdoc3.cxx
+++ b/sd/source/core/drawdoc3.cxx
@@ -367,6 +367,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
@@ -494,8 +514,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!
@@ -508,7 +528,7 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
SdStyleSheetVector aCreatedStyles;
String layoutName = *pIter;
- ((SdStyleSheetPool*)GetStyleSheetPool())->CopyLayoutSheets(layoutName, *pBookmarkStyleSheetPool,aCreatedStyles);
+ pStyleSheetPool->CopyLayoutSheets(layoutName, *pBookmarkStyleSheetPool,aCreatedStyles);
if(!aCreatedStyles.empty())
{
@@ -520,6 +540,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
**************************************************************************/
@@ -920,6 +952,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 7801da5..125d069 100644
--- a/sd/source/core/stlpool.cxx
+++ b/sd/source/core/stlpool.cxx
@@ -594,8 +594,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();
@@ -622,6 +638,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 08fe4dc..435e181 100644
--- a/sd/source/core/stlsheet.cxx
+++ b/sd/source/core/stlsheet.cxx
@@ -44,6 +44,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>
@@ -356,13 +357,16 @@ sal_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;
More information about the Libreoffice-commits
mailing list