summaryrefslogtreecommitdiff
path: root/xmloff/source/draw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.com>2021-12-07 08:32:30 +0100
committerMiklos Vajna <vmiklos@collabora.com>2021-12-07 09:37:18 +0100
commitc95288aec4eb4d92a5ccfb9d8fc02a0185d8e8d0 (patch)
treea0fb42d00dad076a103ae8ec2d0df141e2a58fde /xmloff/source/draw
parent68c15984ea17354c03e5ddf03e0c0b4214999659 (diff)
ODP export: write the theme of a master page
Which requires describing the schema, which is really just a new <loext:theme> element, the rest reuses the color-table markup, which wasn't used in ODF so far (but was used in our .soc files). Also make sure that we only do this in ODF extended mode (which is the default). Change-Id: I90eaad30f63946c441fe0c53caf6a47caf1714d5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126466 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'xmloff/source/draw')
-rw-r--r--xmloff/source/draw/sdxmlexp.cxx85
-rw-r--r--xmloff/source/draw/sdxmlexp_impl.hxx1
2 files changed, 86 insertions, 0 deletions
diff --git a/xmloff/source/draw/sdxmlexp.cxx b/xmloff/source/draw/sdxmlexp.cxx
index d02a5731ad25..9388cedb25e4 100644
--- a/xmloff/source/draw/sdxmlexp.cxx
+++ b/xmloff/source/draw/sdxmlexp.cxx
@@ -72,6 +72,9 @@
#include <com/sun/star/document/XDocumentProperties.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/util/Color.hpp>
+
+#include <comphelper/sequenceashashmap.hxx>
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
@@ -2299,6 +2302,12 @@ void SdXMLExport::ExportMasterStyles_()
// write optional office:forms
exportFormsElement( xMasterPage );
+ // write optional loext:theme
+ if (IsImpress())
+ {
+ ExportThemeElement(xMasterPage);
+ }
+
// write graphic objects on this master page (if any)
if(xMasterPage.is() && xMasterPage->getCount())
GetShapeExport()->exportShapes( xMasterPage );
@@ -2354,6 +2363,82 @@ void SdXMLExport::exportFormsElement( const Reference< XDrawPage >& xDrawPage )
}
}
+void SdXMLExport::ExportThemeElement(const uno::Reference<drawing::XDrawPage>& xDrawPage)
+{
+ uno::Reference<beans::XPropertySet> xPropertySet(xDrawPage, uno::UNO_QUERY);
+ if (!xPropertySet.is())
+ return;
+
+ comphelper::SequenceAsHashMap aMap(xPropertySet->getPropertyValue("Theme"));
+ if (aMap.empty())
+ {
+ return;
+ }
+
+ if ((getSaneDefaultVersion() & SvtSaveOptions::ODFSVER_EXTENDED) == 0)
+ {
+ // Do not export in standard ODF 1.3 or older.
+ return;
+ }
+
+ auto it = aMap.find("Name");
+ if (it != aMap.end())
+ {
+ OUString aName;
+ it->second >>= aName;
+ AddAttribute(XML_NAMESPACE_LO_EXT, XML_NAME, aName);
+ }
+ SvXMLElementExport aTheme(*this, XML_NAMESPACE_LO_EXT, XML_THEME, true, true);
+
+ uno::Sequence<util::Color> aColors;
+ it = aMap.find("ColorScheme");
+ if (it != aMap.end())
+ {
+ it->second >>= aColors;
+ }
+ if (!aColors.hasElements())
+ {
+ return;
+ }
+
+ it = aMap.find("ColorSchemeName");
+ if (it != aMap.end())
+ {
+ OUString aName;
+ it->second >>= aName;
+ AddAttribute(XML_NAMESPACE_LO_EXT, XML_NAME, aName);
+ }
+ SvXMLElementExport aColorTable(*this, XML_NAMESPACE_LO_EXT, XML_COLOR_TABLE, true, true);
+
+ static const std::u16string_view aColorNames[] = {
+ u"dk1", // Background 1
+ u"lt1", // Text 1
+ u"dk2", // Background 2
+ u"lt2", // Text 2
+ u"accent1", // Accent 1
+ u"accent2", // Accent 2
+ u"accent3", // Accent 3
+ u"accent4", // Accent 4
+ u"accent5", // Accent 5
+ u"accent6", // Accent 6
+ u"hlink", // Hyperlink
+ u"folHlink", // Followed hyperlink
+ };
+ for (size_t nColor = 0; nColor < aColors.size(); ++nColor)
+ {
+ // Import goes via svx::Theme::FromAny(), which sanitizes user input.
+ assert(nColor < SAL_N_ELEMENTS(aColorNames));
+
+ AddAttribute(XML_NAMESPACE_LO_EXT, XML_NAME, OUString(aColorNames[nColor]));
+
+ OUStringBuffer sValue;
+ sax::Converter::convertColor(sValue, aColors[nColor]);
+ AddAttribute(XML_NAMESPACE_LO_EXT, XML_COLOR, sValue.makeStringAndClear());
+
+ SvXMLElementExport aColor(*this, XML_NAMESPACE_LO_EXT, XML_COLOR, true, true);
+ }
+}
+
void SdXMLExport::GetViewSettings(uno::Sequence<beans::PropertyValue>& rProps)
{
Reference< beans::XPropertySet > xPropSet( GetModel(), UNO_QUERY );
diff --git a/xmloff/source/draw/sdxmlexp_impl.hxx b/xmloff/source/draw/sdxmlexp_impl.hxx
index 799767f990b1..9808c738120e 100644
--- a/xmloff/source/draw/sdxmlexp_impl.hxx
+++ b/xmloff/source/draw/sdxmlexp_impl.hxx
@@ -135,6 +135,7 @@ class SdXMLExport : public SvXMLExport
void ImplExportHeaderFooterDeclAttributes( const HeaderFooterPageSettingsImpl& aSettings );
void exportFormsElement( const css::uno::Reference< css::drawing::XDrawPage >& xDrawPage );
+ void ExportThemeElement(const css::uno::Reference<css::drawing::XDrawPage>& xDrawPage);
void exportPresentationSettings();
// #82003# helper function for recursive object count