summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-11-19 13:44:40 +0100
committerMiklos Vajna <vmiklos@collabora.com>2021-11-19 15:28:42 +0100
commit32ae1ed7504d58f9216593cb87f25c480a0e623b (patch)
treec5f5907e1dd6a072e7be3473d4c0cb7cd114cc5a
parent13aa5081793f133077610cd01b7f01ee765b4add (diff)
PPTX import: handle <a:clrScheme name="...">
We had doc model for this, but the UNO API and the PPTX import was missing. Change-Id: I199e9cc235a783d91700ce74f17d442f41d3c3f8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125532 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
-rw-r--r--editeng/source/editeng/editobj.cxx4
-rw-r--r--include/oox/drawingml/clrscheme.hxx4
-rw-r--r--include/svx/svdpage.hxx4
-rw-r--r--oox/qa/unit/data/theme.pptxbin0 -> 32660 bytes
-rw-r--r--oox/qa/unit/drawingml.cxx35
-rw-r--r--oox/source/drawingml/theme.cxx1
-rw-r--r--oox/source/drawingml/themeelementscontext.cxx4
-rw-r--r--sd/qa/unit/tiledrendering/tiledrendering.cxx8
-rw-r--r--svx/source/styles/ColorSets.cxx21
-rw-r--r--svx/source/svdraw/svdmodel.cxx19
-rw-r--r--svx/source/svdraw/svdpage.cxx26
11 files changed, 115 insertions, 11 deletions
diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx
index 6e0982b27dc0..62ed45b20988 100644
--- a/editeng/source/editeng/editobj.cxx
+++ b/editeng/source/editeng/editobj.cxx
@@ -147,7 +147,9 @@ void ContentInfo::dumpAsXml(xmlTextWriterPtr pWriter) const
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("ContentInfo"));
(void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("style"), BAD_CAST(aStyle.toUtf8().getStr()));
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("text"));
- (void)xmlTextWriterWriteString(pWriter, BAD_CAST(GetText().toUtf8().getStr()));
+ OUString aText = GetText();
+ // TODO share code with sax_fastparser::FastSaxSerializer::write().
+ (void)xmlTextWriterWriteString(pWriter, BAD_CAST(aText.replaceAll("", "&#9;").toUtf8().getStr()));
(void)xmlTextWriterEndElement(pWriter);
aParaAttribs.dumpAsXml(pWriter);
for (size_t i=0; i<maCharAttribs.size(); ++i)
diff --git a/include/oox/drawingml/clrscheme.hxx b/include/oox/drawingml/clrscheme.hxx
index 21553aafe2fe..fbb107601940 100644
--- a/include/oox/drawingml/clrscheme.hxx
+++ b/include/oox/drawingml/clrscheme.hxx
@@ -80,6 +80,7 @@ typedef std::shared_ptr< ClrMap > ClrMapPtr;
class OOX_DLLPUBLIC ClrScheme
{
std::vector< std::pair<sal_Int32, ::Color> > maClrScheme;
+ OUString maName;
public:
@@ -88,6 +89,9 @@ public:
bool getColorByIndex(size_t nIndex,
::Color& rColor) const;
+
+ void SetName(const OUString& rName) { maName = rName; }
+ const OUString& GetName() const { return maName; }
};
}
diff --git a/include/svx/svdpage.hxx b/include/svx/svdpage.hxx
index 540002eb7d14..065590e85b9a 100644
--- a/include/svx/svdpage.hxx
+++ b/include/svx/svdpage.hxx
@@ -344,6 +344,8 @@ public:
void SetTheme(std::unique_ptr<svx::Theme> pTheme);
svx::Theme* GetTheme();
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const;
};
@@ -535,6 +537,8 @@ public:
const sdr::contact::ViewObjectContact& rOriginal,
const sdr::contact::DisplayInfo& rDisplayInfo,
bool bEdit );
+
+ void dumpAsXml(xmlTextWriterPtr pWriter) const override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/qa/unit/data/theme.pptx b/oox/qa/unit/data/theme.pptx
new file mode 100644
index 000000000000..6d9ffc00bbbb
--- /dev/null
+++ b/oox/qa/unit/data/theme.pptx
Binary files differ
diff --git a/oox/qa/unit/drawingml.cxx b/oox/qa/unit/drawingml.cxx
index 57e02545eb62..b220170f3edc 100644
--- a/oox/qa/unit/drawingml.cxx
+++ b/oox/qa/unit/drawingml.cxx
@@ -27,6 +27,7 @@
#include <com/sun/star/chart2/XDataPointCustomLabelField.hpp>
#include <com/sun/star/style/ParagraphAdjust.hpp>
#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
+#include <com/sun/star/drawing/XMasterPageTarget.hpp>
#include <com/sun/star/text/XTextRange.hpp>
#include <unotools/mediadescriptor.hxx>
@@ -397,6 +398,40 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testChartThemeOverride)
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x4472C4), nActual);
}
+CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testPptxTheme)
+{
+ // Given a PPTX file with a slide -> master slide -> theme:
+ OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "theme.pptx";
+
+ // When importing the document:
+ load(aURL);
+
+ // Then make sure the theme + referring to that theme is imported:
+ // Check the imported theme of the master page:
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XMasterPageTarget> xDrawPage(
+ xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xMasterpage(xDrawPage->getMasterPage(), uno::UNO_QUERY);
+ comphelper::SequenceAsHashMap aMap(xMasterpage->getPropertyValue("Theme"));
+ CPPUNIT_ASSERT_EQUAL(OUString("Office Theme"), aMap["Name"].get<OUString>());
+ // Without the accompanying fix in place, this test would have failed with:
+ // - Cannot extract an Any(void) to string!
+ // i.e. the name of the color scheme was lost on import.
+ CPPUNIT_ASSERT_EQUAL(OUString("Office"), aMap["ColorSchemeName"].get<OUString>());
+
+ // Check the reference to that theme:
+ uno::Reference<drawing::XShapes> xDrawPageShapes(xDrawPage, uno::UNO_QUERY);
+ uno::Reference<text::XTextRange> xShape(xDrawPageShapes->getByIndex(0), uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xText(xShape->getText(), uno::UNO_QUERY);
+ uno::Reference<container::XEnumerationAccess> xPara(xText->createEnumeration()->nextElement(),
+ uno::UNO_QUERY);
+ uno::Reference<beans::XPropertySet> xPortion(xPara->createEnumeration()->nextElement(),
+ uno::UNO_QUERY);
+ // 4 is accent1, see oox::drawingml::Color::getSchemeColorIndex().
+ CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4),
+ xPortion->getPropertyValue("CharColorTheme").get<sal_Int32>());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/theme.cxx b/oox/source/drawingml/theme.cxx
index be9f199ff8f8..ba1761311154 100644
--- a/oox/source/drawingml/theme.cxx
+++ b/oox/source/drawingml/theme.cxx
@@ -107,6 +107,7 @@ void Theme::addTheme(const css::uno::Reference<css::drawing::XDrawPage>& xDrawPa
{
beans::PropertyValues aValues = {
comphelper::makePropertyValue("Name", maThemeName),
+ comphelper::makePropertyValue("ColorSchemeName", maClrScheme.GetName()),
};
uno::Reference<beans::XPropertySet> xPropertySet(xDrawPage, uno::UNO_QUERY);
xPropertySet->setPropertyValue("Theme", uno::makeAny(aValues));
diff --git a/oox/source/drawingml/themeelementscontext.cxx b/oox/source/drawingml/themeelementscontext.cxx
index 6fbd62e91d18..0922c4b61939 100644
--- a/oox/source/drawingml/themeelementscontext.cxx
+++ b/oox/source/drawingml/themeelementscontext.cxx
@@ -214,6 +214,10 @@ ContextHandlerRef ThemeElementsContext::onCreateContext( sal_Int32 nElement, con
switch( nElement )
{
case A_TOKEN( clrScheme ): // CT_ColorScheme
+ if (rAttribs.hasAttribute(XML_name))
+ {
+ mrTheme.getClrScheme().SetName(rAttribs.getString(XML_name).get());
+ }
return new clrSchemeContext( *this, mrTheme.getClrScheme() );
case A_TOKEN( fontScheme ): // CT_FontScheme
return new FontSchemeContext( *this, mrTheme.getFontScheme() );
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 44d84207683f..571eafb0b08c 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -393,7 +393,9 @@ xmlDocUniquePtr SdTiledRenderingTest::parseXmlDump()
(void)xmlTextWriterEndDocument(pXmlWriter);
xmlFreeTextWriter(pXmlWriter);
- return xmlDocUniquePtr(xmlParseMemory(reinterpret_cast<const char*>(xmlBufferContent(m_pXmlBuffer)), xmlBufferLength(m_pXmlBuffer)));
+ auto pCharBuffer = reinterpret_cast<const xmlChar*>(xmlBufferContent(m_pXmlBuffer));
+ SAL_INFO("test", "SdTiledRenderingTest::parseXmlDump: pCharBuffer is '" << pCharBuffer << "'");
+ return xmlDocUniquePtr(xmlParseDoc(pCharBuffer));
}
void SdTiledRenderingTest::testCreateDestroy()
@@ -861,7 +863,7 @@ void SdTiledRenderingTest::testResizeTableColumn()
// Remember the original cell widths.
xmlDocUniquePtr pXmlDoc = parseXmlDump();
- OString aPrefix = "/SdDrawDocument/SdrModel/SdPage/SdrObjList/SdrTableObj/SdrTableObjImpl/TableLayouter/columns/";
+ OString aPrefix = "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl/TableLayouter/columns/";
sal_Int32 nExpectedColumn1 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[1]", "size").toInt32();
sal_Int32 nExpectedColumn2 = getXPath(pXmlDoc, aPrefix + "TableLayouter_Layout[2]", "size").toInt32();
pXmlDoc = nullptr;
@@ -1704,7 +1706,7 @@ void SdTiledRenderingTest::testTdf104405()
OUString("2"),
getXPath(
pXmlDoc,
- "/SdDrawDocument/SdrModel/SdPage/SdrObjList/SdrTableObj/SdrTableObjImpl"
+ "/SdDrawDocument/SdrModel/maPages/SdPage/SdrPage/SdrObjList/SdrTableObj/SdrTableObjImpl"
"/TableModel/Cell[1]/DefaultProperties/SfxItemSet/SdrTextVertAdjustItem",
"value"));
}
diff --git a/svx/source/styles/ColorSets.cxx b/svx/source/styles/ColorSets.cxx
index 8ab3d939ef5a..fbcf4bd4a889 100644
--- a/svx/source/styles/ColorSets.cxx
+++ b/svx/source/styles/ColorSets.cxx
@@ -164,11 +164,15 @@ void Theme::dumpAsXml(xmlTextWriterPtr pWriter) const
void Theme::ToAny(css::uno::Any& rVal) const
{
- beans::PropertyValues aValues = {
- comphelper::makePropertyValue("Name", maName)
- };
+ comphelper::SequenceAsHashMap aMap;
+ aMap["Name"] <<= maName;
- rVal <<= aValues;
+ if (mpColorSet)
+ {
+ aMap["ColorSchemeName"] <<= mpColorSet->getName();
+ }
+
+ rVal <<= aMap.getAsConstPropertyValueList();
}
std::unique_ptr<Theme> Theme::FromAny(const css::uno::Any& rVal)
@@ -184,6 +188,15 @@ std::unique_ptr<Theme> Theme::FromAny(const css::uno::Any& rVal)
pTheme = std::make_unique<Theme>(aName);
}
+ it = aMap.find("ColorSchemeName");
+ if (it != aMap.end() && pTheme)
+ {
+ OUString aName;
+ it->second >>= aName;
+ auto pColorSet = std::make_unique<ColorSet>(aName);
+ pTheme->SetColorSet(std::move(pColorSet));
+ }
+
return pTheme;
}
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx
index 6dcebf3ef541..8a19ce2b27a7 100644
--- a/svx/source/svdraw/svdmodel.cxx
+++ b/svx/source/svdraw/svdmodel.cxx
@@ -1874,12 +1874,25 @@ void SdrModel::dumpAsXml(xmlTextWriterPtr pWriter) const
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdrModel"));
(void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
- sal_uInt16 nPageCount = GetPageCount();
- for (sal_uInt16 i = 0; i < nPageCount; ++i)
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("maMasterPages"));
+ for (size_t i = 0; i < maMasterPages.size(); ++i)
{
- if (const SdrPage* pPage = GetPage(i))
+ if (const SdrPage* pPage = maMasterPages[i].get())
+ {
+ pPage->dumpAsXml(pWriter);
+ }
+ }
+ (void)xmlTextWriterEndElement(pWriter);
+
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("maPages"));
+ for (size_t i = 0; i < maPages.size(); ++i)
+ {
+ if (const SdrPage* pPage = maPages[i].get())
+ {
pPage->dumpAsXml(pWriter);
+ }
}
+ (void)xmlTextWriterEndElement(pWriter);
if (mpImpl->mpTheme)
{
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx
index a0acaba2ee5f..1ebfe6cad4ac 100644
--- a/svx/source/svdraw/svdpage.cxx
+++ b/svx/source/svdraw/svdpage.cxx
@@ -1291,6 +1291,19 @@ void SdrPageProperties::SetTheme(std::unique_ptr<svx::Theme> pTheme) { mpTheme =
svx::Theme* SdrPageProperties::GetTheme() { return mpTheme.get(); }
+void SdrPageProperties::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdrPageProperties"));
+ (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this);
+
+ if (mpTheme)
+ {
+ mpTheme->dumpAsXml(pWriter);
+ }
+
+ (void)xmlTextWriterEndElement(pWriter);
+}
+
SdrPage::SdrPage(SdrModel& rModel, bool bMasterPage)
: mrSdrModelFromSdrPage(rModel),
mnWidth(10),
@@ -1817,6 +1830,19 @@ bool SdrPage::checkVisibility(
return true;
}
+void SdrPage::dumpAsXml(xmlTextWriterPtr pWriter) const
+{
+ (void)xmlTextWriterStartElement(pWriter, BAD_CAST("SdrPage"));
+ SdrObjList::dumpAsXml(pWriter);
+
+ if (mpSdrPageProperties)
+ {
+ mpSdrPageProperties->dumpAsXml(pWriter);
+ }
+
+ (void)xmlTextWriterEndElement(pWriter);
+}
+
// DrawContact support: Methods for handling Page changes
void SdrPage::ActionChanged()
{