From 5b63c12ace2aec9a659e4b9125f6aa9ff204ed09 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 29 Aug 2014 19:09:29 +0200 Subject: n#708518: sd: check that master page matches when setting parent style In ODF import it happened that the parent style of "outline2" etc. was always set to the "outline1" style of the first master page in the document, but it should be the "outline1" style of the same master page as the "outline2". (regression from e955433c3574cb602dedba96bc645898f97858bf) Change-Id: Ie563d5ee5c2040aeb6ca5c8bb25b195e15ea964e --- sd/qa/unit/data/odp/masterpage_style_parent.odp | Bin 0 -> 17790 bytes sd/qa/unit/import-tests.cxx | 43 ++++++++++++++++++++++++ sd/source/core/stlsheet.cxx | 13 +++++-- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 sd/qa/unit/data/odp/masterpage_style_parent.odp diff --git a/sd/qa/unit/data/odp/masterpage_style_parent.odp b/sd/qa/unit/data/odp/masterpage_style_parent.odp new file mode 100644 index 000000000000..e9f63784905e Binary files /dev/null and b/sd/qa/unit/data/odp/masterpage_style_parent.odp differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 3131937f26af..33c52398dbac 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -50,6 +50,8 @@ #include #include +#include + using namespace ::com::sun::star; /// Impress import filters tests. @@ -60,6 +62,7 @@ public: void testSmoketest(); void testN759180(); void testN778859(); + void testMasterPageStyleParent(); void testFdo64512(); void testFdo71075(); void testN828390_2(); @@ -80,6 +83,7 @@ public: CPPUNIT_TEST(testSmoketest); CPPUNIT_TEST(testN759180); CPPUNIT_TEST(testN778859); + CPPUNIT_TEST(testMasterPageStyleParent); CPPUNIT_TEST(testFdo64512); CPPUNIT_TEST(testFdo71075); CPPUNIT_TEST(testN828390_2); @@ -344,6 +348,45 @@ void SdFiltersTest::testN828390_3() xDocShRef->DoClose(); } +void SdFiltersTest::testMasterPageStyleParent() +{ + ::sd::DrawDocShellRef xDocShRef = loadURL( getURLFromSrc("/sd/qa/unit/data/odp/masterpage_style_parent.odp"), ODP ); + + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL ); + const SdrPage *pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL ); + + SdStyleSheetPool *const pPool(pDoc->GetSdStyleSheetPool()); + + int parents(0); + SfxStyleSheetIterator iter(pPool, SD_STYLE_FAMILY_MASTERPAGE); + for (SfxStyleSheetBase * pStyle = iter.First(); pStyle; pStyle = iter.Next()) + { + OUString const name(pStyle->GetName()); + OUString const parent(pStyle->GetParent()); + if (!parent.isEmpty()) + { + ++parents; + // check that parent exists + SfxStyleSheetBase *const pParentStyle( + pPool->Find(parent, SD_STYLE_FAMILY_MASTERPAGE)); + CPPUNIT_ASSERT(pParentStyle); + CPPUNIT_ASSERT_EQUAL(pParentStyle->GetName(), parent); + // check that parent has the same master page as pStyle + CPPUNIT_ASSERT(parent.indexOf(SD_LT_SEPARATOR) != -1); + CPPUNIT_ASSERT(name.indexOf(SD_LT_SEPARATOR) != -1); + CPPUNIT_ASSERT_EQUAL( + parent.copy(0, parent.indexOf(SD_LT_SEPARATOR)), + name.copy(0, name.indexOf(SD_LT_SEPARATOR))); + } + } + // check that there are actually parents... + CPPUNIT_ASSERT_EQUAL(16, parents); + + xDocShRef->DoClose(); +} + void SdFiltersTest::testN778859() { ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("/sd/qa/unit/data/pptx/n778859.pptx"), PPTX); diff --git a/sd/source/core/stlsheet.cxx b/sd/source/core/stlsheet.cxx index 4246e31b12ff..68075de2f872 100644 --- a/sd/source/core/stlsheet.cxx +++ b/sd/source/core/stlsheet.cxx @@ -921,16 +921,25 @@ void SAL_CALL SdStyleSheet::setParentStyle( const OUString& rParentName ) throw if( !rParentName.isEmpty() ) { + OUString const name(GetName()); + sal_Int32 const sep(name.indexOf(SD_LT_SEPARATOR)); + OUString const master((sep == -1) ? OUString() : name.copy(0, sep)); boost::shared_ptr aSSSI = boost::make_shared(mxPool.get(), nFamily); for (SfxStyleSheetBase *pStyle = aSSSI->First(); pStyle; pStyle = aSSSI->Next()) { // we hope that we have only sd style sheets SdStyleSheet* pSdStyleSheet = static_cast(pStyle); - if (pSdStyleSheet->msApiName == rParentName) + OUString const curName(pStyle->GetName()); + sal_Int32 const curSep(curName.indexOf(SD_LT_SEPARATOR)); + OUString const curMaster((curSep == -1) + ? OUString() : curName.copy(0, sep)); + // check that the master matches, as msApiName exists once per + // master page + if (pSdStyleSheet->msApiName == rParentName && master == curMaster) { if( pStyle != this ) { - SetParent( pStyle->GetName() ); + SetParent(curName); } return; } -- cgit v1.2.3