Kaydet (Commit) 5b63c12a authored tarafından Michael Stahl's avatar Michael Stahl

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 e955433c)

Change-Id: Ie563d5ee5c2040aeb6ca5c8bb25b195e15ea964e
üst f582d978
......@@ -50,6 +50,8 @@
#include <com/sun/star/chart2/data/XDataSequence.hpp>
#include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
#include <stlpool.hxx>
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);
......
......@@ -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<SfxStyleSheetIterator> aSSSI = boost::make_shared<SfxStyleSheetIterator>(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<SdStyleSheet*>(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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment