summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2022-12-06 17:33:44 +0900
committerTomaž Vajngerl <quikee@gmail.com>2023-01-01 23:35:17 +0000
commit312100003fc7cae358038aaec853584782c698f8 (patch)
tree50c9dbedad29c04539c44880bd238c9015f1dabe /writerfilter
parentd5a71bc6a28f8a3d726b2ac4688c7cef9d77ddf0 (diff)
sw: read theme from OOXML file and set it to the draw page
This change extends writerfilter to use oox::ThemeFragmentHandler to read the theme properties, and sets that to the one and only draw page of a Writer document. This change also removes ThemeTable and replaces it with the ThemeHandler, which takes theme font data from svx::Theme instead. In addition, a test has been writen, which loads a document with a theme, and asserts the draw page has the theme and the theme properties currently supported. Change-Id: Iff0048cd21ea030ac55287707852acc463ec3cb0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143699 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/Library_writerfilter.mk3
-rw-r--r--writerfilter/inc/ooxml/OOXMLDocument.hxx3
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx27
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx8
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx19
-rw-r--r--writerfilter/source/dmapper/ThemeHandler.cxx422
-rw-r--r--writerfilter/source/dmapper/ThemeHandler.hxx35
-rw-r--r--writerfilter/source/dmapper/ThemeTable.cxx563
-rw-r--r--writerfilter/source/dmapper/ThemeTable.hxx58
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.cxx14
-rw-r--r--writerfilter/source/ooxml/OOXMLDocumentImpl.hxx9
-rw-r--r--writerfilter/source/ooxml/OOXMLFactory.hxx2
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx69
-rw-r--r--writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx46
-rw-r--r--writerfilter/source/ooxml/model.xml2
15 files changed, 633 insertions, 647 deletions
diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index 4648ca942220..dafc17c959e1 100644
--- a/writerfilter/Library_writerfilter.mk
+++ b/writerfilter/Library_writerfilter.mk
@@ -112,7 +112,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
writerfilter/source/dmapper/TagLogger \
writerfilter/source/dmapper/TextEffectsHandler \
writerfilter/source/dmapper/TblStylePrHandler \
- writerfilter/source/dmapper/ThemeTable \
+ writerfilter/source/dmapper/ThemeHandler \
writerfilter/source/dmapper/WrapPolygonHandler \
writerfilter/source/dmapper/WriteProtection \
writerfilter/source/dmapper/util \
@@ -123,6 +123,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
writerfilter/source/ooxml/OOXMLDocumentImpl \
writerfilter/source/ooxml/OOXMLFactory \
writerfilter/source/ooxml/OOXMLFastContextHandler \
+ writerfilter/source/ooxml/OOXMLFastContextHandlerTheme \
writerfilter/source/ooxml/OOXMLFastDocumentHandler \
writerfilter/source/ooxml/OOXMLParserState \
writerfilter/source/ooxml/OOXMLPropertySet \
diff --git a/writerfilter/inc/ooxml/OOXMLDocument.hxx b/writerfilter/inc/ooxml/OOXMLDocument.hxx
index 1179be43c8ac..6b47ab752177 100644
--- a/writerfilter/inc/ooxml/OOXMLDocument.hxx
+++ b/writerfilter/inc/ooxml/OOXMLDocument.hxx
@@ -31,6 +31,7 @@
#include <com/sun/star/frame/XModel.hpp>
#include <com/sun/star/drawing/XDrawPage.hpp>
#include <oox/shape/ShapeContextHandler.hxx>
+#include <oox/drawingml/theme.hxx>
/**
@file OOXMLDocument.hxx
@@ -214,6 +215,8 @@ public:
virtual const OUString & getTarget() const = 0;
virtual rtl::Reference<oox::shape::ShapeContextHandler> getShapeContext( ) = 0;
virtual void setShapeContext( rtl::Reference<oox::shape::ShapeContextHandler> xContext ) = 0;
+ virtual const oox::drawingml::ThemePtr & getTheme() const = 0;
+
/// Push context of drawingML shapes, so nested shapes are handled separately.
virtual void pushShapeContext() = 0;
/// Pop context of a previously pushed drawingML shape.
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index c0e4bdf6bae0..032a7bc44b42 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -376,36 +376,36 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
}
break;
case NS_ooxml::LN_CT_Fonts_asciiTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "asciiTheme", ThemeTable::getStringForTheme(nIntValue));
+ m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "asciiTheme", ThemeHandler::getStringForTheme(nIntValue));
if (m_pImpl->GetTopContext())
{
// note: overwrite Fonts_ascii with Fonts_asciiTheme *even if*
// theme font is empty - this is apparently what Word 2013 does
- uno::Any aPropValue( m_pImpl->GetThemeTable()->getFontNameForTheme( nIntValue ) );
+ uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME, aPropValue );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_ASCII, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_ASCII, uno::Any( ThemeTable::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
+ m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_ASCII, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
}
break;
case NS_ooxml::LN_CT_Fonts_hAnsi:
break;//unsupported
case NS_ooxml::LN_CT_Fonts_hAnsiTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "hAnsiTheme", ThemeTable::getStringForTheme(nIntValue));
+ m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "hAnsiTheme", ThemeHandler::getStringForTheme(nIntValue));
if (m_pImpl->GetTopContext())
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_H_ANSI, uno::Any( ThemeTable::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
+ m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_H_ANSI, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
break;
case NS_ooxml::LN_CT_Fonts_eastAsia:
if (m_pImpl->GetTopContext())
m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_ASIAN, uno::Any( sStringValue ));
break;
case NS_ooxml::LN_CT_Fonts_eastAsiaTheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsiaTheme", ThemeTable::getStringForTheme(nIntValue));
+ m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "eastAsiaTheme", ThemeHandler::getStringForTheme(nIntValue));
if (m_pImpl->GetTopContext())
{
- uno::Any aPropValue( m_pImpl->GetThemeTable()->getFontNameForTheme( nIntValue ) );
+ uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_ASIAN, aPropValue );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_EAST_ASIA, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_EAST_ASIA, uno::Any( ThemeTable::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
+ m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_EAST_ASIA, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
}
break;
case NS_ooxml::LN_CT_Fonts_cs:
@@ -413,13 +413,13 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_COMPLEX, uno::Any( sStringValue ));
break;
case NS_ooxml::LN_CT_Fonts_cstheme:
- m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "cstheme", ThemeTable::getStringForTheme(nIntValue));
+ m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "cstheme", ThemeHandler::getStringForTheme(nIntValue));
if (m_pImpl->GetTopContext())
{
- uno::Any aPropValue( m_pImpl->GetThemeTable()->getFontNameForTheme( nIntValue ) );
+ uno::Any aPropValue( m_pImpl->getFontNameForTheme( nIntValue ) );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_FONT_NAME_COMPLEX, aPropValue );
m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_FONT_NAME_CS, aPropValue, true, CHAR_GRAB_BAG );
- m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_CS, uno::Any( ThemeTable::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
+ m_pImpl->GetTopContext()->Insert(PROP_CHAR_THEME_NAME_CS, uno::Any( ThemeHandler::getStringForTheme(nIntValue) ), true, CHAR_GRAB_BAG);
}
break;
case NS_ooxml::LN_CT_Spacing_before:
@@ -4203,11 +4203,6 @@ void DomainMapper::lcl_table(Id name, writerfilter::Reference<Table>::Pointer_t
m_pImpl->SetNumberingImport(false);
}
break;
- case NS_ooxml::LN_THEMETABLE:
- m_pImpl->GetThemeTable()->setThemeFontLangProperties(
- m_pImpl->GetSettingsTable()->GetThemeFontLangProperties() );
- ref->resolve ( *m_pImpl->GetThemeTable() );
- break;
case NS_ooxml::LN_settings_settings:
ref->resolve ( *m_pImpl->GetSettingsTable() );
m_pImpl->ApplySettingsTable();
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 668f7f6758fe..fb3de8824ddd 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -8861,6 +8861,14 @@ bool DomainMapper_Impl::handlePreviousParagraphBorderInBetween() const
return true;
}
+OUString DomainMapper_Impl::getFontNameForTheme(const Id id)
+{
+ auto const& pHandler = getThemeHandler();
+ if (pHandler)
+ return pHandler->getFontNameForTheme(id);
+ return OUString();
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 7c5792b7e4e4..0c6c8cd75f31 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -35,6 +35,8 @@
#include <vector>
#include <optional>
+#include <ooxml/OOXMLDocument.hxx>
+
#include <dmapper/CommentProperties.hxx>
#include "DomainMapper.hxx"
@@ -45,7 +47,7 @@
#include "NumberingManager.hxx"
#include "StyleSheetTable.hxx"
#include "SettingsTable.hxx"
-#include "ThemeTable.hxx"
+#include "ThemeHandler.hxx"
#include "GraphicImport.hxx"
#include "OLEHandler.hxx"
#include "FFDataHandler.hxx"
@@ -527,10 +529,10 @@ private:
ListsManager::Pointer m_pListTable;
std::deque< css::uno::Reference<css::drawing::XShape> > m_aPendingShapes;
StyleSheetTablePtr m_pStyleSheetTable;
- ThemeTablePtr m_pThemeTable;
SettingsTablePtr m_pSettingsTable;
GraphicImportPtr m_pGraphicImport;
+ std::unique_ptr<ThemeHandler> m_pThemeHandler;
PropertyMapPtr m_pTopContext;
PropertyMapPtr m_pLastSectionContext;
@@ -806,11 +808,14 @@ public:
}
OUString GetListStyleName(sal_Int32 nListId);
ListsManager::Pointer const & GetListTable();
- ThemeTablePtr const & GetThemeTable()
+
+ std::unique_ptr<ThemeHandler> const& getThemeHandler()
{
- if(!m_pThemeTable)
- m_pThemeTable = new ThemeTable;
- return m_pThemeTable;
+ if (!m_pThemeHandler && m_pOOXMLDocument && m_pOOXMLDocument->getTheme())
+ {
+ m_pThemeHandler = std::make_unique<ThemeHandler>(m_pOOXMLDocument->getTheme(), GetSettingsTable()->GetThemeFontLangProperties());
+ }
+ return m_pThemeHandler;
}
SettingsTablePtr const & GetSettingsTable()
@@ -1202,6 +1207,8 @@ public:
void commentProps(const OUString& sId, const CommentProperties& rProps);
+ OUString getFontNameForTheme(const Id id);
+
private:
void PushPageHeaderFooter(bool bHeader, SectionPropertyMap::PageType eType);
// Start a new index section; if needed, finish current paragraph
diff --git a/writerfilter/source/dmapper/ThemeHandler.cxx b/writerfilter/source/dmapper/ThemeHandler.cxx
new file mode 100644
index 000000000000..555a2b491fcc
--- /dev/null
+++ b/writerfilter/source/dmapper/ThemeHandler.cxx
@@ -0,0 +1,422 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "ThemeHandler.hxx"
+#include <i18nlangtag/languagetag.hxx>
+#include <ooxml/resourceids.hxx>
+
+using namespace com::sun::star;
+
+namespace writerfilter::dmapper
+{
+namespace
+{
+OUString fromLCIDToScriptTag(LanguageType lang)
+{
+ // conversion list from:
+ // http://blogs.msdn.com/b/officeinteroperability/archive/2013/04/22/office-open-xml-themes-schemes-and-fonts.aspx
+ switch (static_cast<sal_uInt16>(lang))
+ {
+ case 0x429: // lidFarsi
+ case 0x401: // lidArabic
+ case 0x801: // lidIraq
+ case 0xc01: // lidEgyptian
+ case 0x1001: // lidLibya
+ case 0x1401: // lidAlgerian
+ case 0x1801: // lidMorocco
+ case 0x1c01: // lidTunisia
+ case 0x2001: // lidOman
+ case 0x2401: // lidYemen
+ case 0x2801: // lidSyria
+ case 0x2c01: // lidJordan
+ case 0x3001: // lidLebanon
+ case 0x3401: // lidKuwait
+ case 0x3801: // lidUAE
+ case 0x3c01: // lidBahrain
+ case 0x4001: // lidQatar
+ case 0x420: // lidUrdu
+ case 0x846: // lidPunjabiPakistan
+ case 0x859: // lidSindhiPakistan
+ case 0x45f: // lidTamazight
+ case 0x460: // lidKashmiri
+ case 0x463: // lidPashto
+ case 0x48c: // lidDari
+ return "Arab";
+ case 0x42b: // lidArmenian
+ return "Armn";
+ case 0x445: // lidBengali
+ case 0x845: // lidBengaliBangladesh
+ case 0x44d: // lidAssamese
+ case 0x458: // lidManipuri
+ return "Beng";
+ case 0x45d: // lidInuktitut
+ return "Cans";
+ case 0x45c: // lidCherokee
+ return "Cher";
+ case 0x419: // lidRussian
+ case 0x402: // lidBulgarian
+ case 0x281a: // lidSerbianCyrillic
+ case 0x422: // lidUkranian
+ case 0x819: // lidRussianMoldavia
+ case 0xc1a: // lidSerbianCyrillicSerbMont
+ case 0x1c1a: // lidSerbianBosniaHerzegovinaCyrillic
+ case 0x201a: // lidBosnianBosniaHerzegovinaCyrillic
+ case 0x301a: // lidSerbianMontenegroCyrillic
+ case 0x423: // lidByelorussian
+ case 0x428: // lidTajik
+ case 0x82c: // lidAzeriCyrillic
+ case 0x42f: // lidMacedonian
+ case 0x43f: // lidKazakh
+ case 0x440: // lidKyrgyz
+ case 0x843: // lidUzbekCyrillic
+ case 0x444: // lidTatar
+ case 0x450: // lidMongolian
+ case 0x46d: // lidBashkir
+ case 0x485: // lidSakha
+ return "Cyrl";
+ case 0x439: // lidHindi
+ case 0x44e: // lidMarathi
+ case 0x44f: // lidSanskrit
+ case 0x457: // lidKonkani
+ case 0x459: // lidSindhi
+ case 0x860: // lidKashmiriIndia
+ case 0x461: // lidNepali
+ case 0x861: // lidNepaliIndia
+ return "Deva";
+ case 0x45e: // lidAmharic
+ case 0x473: // lidTigrignaEthiopic
+ case 0x873: // lidTigrignaEritrea
+ return "Ethi";
+ case 0x437: // lidGeorgian
+ return "Geor";
+ case 0x408: // lidGreek
+ return "Grek";
+ case 0x447: // lidGujarati
+ return "Gujr";
+ case 0x446: // lidPunjabi
+ return "Guru";
+ case 0x412: // lidKoreanExtWansung
+ return "Hang";
+ case 0x804: // lidChineseSimp
+ case 0x1004: // lidSingapore
+ return "Hans";
+ case 0x404: // lidChineseTrad
+ case 0xc04: // lidHongkong
+ case 0x1404: // lidMacau
+ return "Hant";
+ case 0x40d: // lidHebrew
+ case 0x43d: // lidYiddish
+ return "Hebr";
+ case 0x411: // lidJapanese
+ return "Jpan";
+ case 0x453: // lidKhmer
+ return "Khmr";
+ case 0x44b: // lidKannada
+ return "Knda";
+ case 0x454: // lidLao
+ return "Laoo";
+ case 0x409: // lidAmerican
+ case 0xc09: // lidAustralian
+ case 0x809: // lidBritish
+ case 0x1009: // lidEnglishCanadian
+ case 0x403: // lidCatalan
+ case 0x406: // lidDanish
+ case 0x413: // lidDutch
+ case 0x813: // lidDutchBelgian
+ case 0x479: // lidPapiamentu
+ case 0x40b: // lidFinnish
+ case 0x40c: // lidFrench
+ case 0xc0c: // lidFrenchCanadian
+ case 0x407: // lidGerman
+ case 0x807: // lidSwissGerman
+ case 0xc07: // lidAustrianGerman
+ case 0x1007: // lidGermanLuxembourg
+ case 0x1407: // lidGermanLiechtenstein
+ case 0x410: // lidItalian
+ case 0x414: // lidNorskBokmal
+ case 0x814: // lidNorskNynorsk
+ case 0x416: // lidPortBrazil
+ case 0x816: // lidPortIberian
+ case 0x40a: // lidSpanish
+ case 0x41d: // lidSwedish
+ case 0x405: // lidCzech
+ case 0x40e: // lidHungarian
+ case 0x415: // lidPolish
+ case 0x41f: // lidTurkish
+ case 0x42d: // lidBasque
+ case 0x424: // lidSlovenian
+ case 0x426: // lidLatvian
+ case 0x427: // lidLithuanian
+ case 0x418: // lidRomanian
+ case 0x818: // lidRomanianMoldavia
+ case 0x241a: // lidSerbianLatin
+ case 0x41a: // lidCroatian, lidCroat
+ case 0x491: // lidGaelicScots
+ case 0x83c: // lidGaelicIrish
+ case 0x430: // lidSutu
+ case 0x431: // lidTsonga
+ case 0x432: // lidTswana
+ case 0x433: // lidVenda
+ case 0x434: // lidXhosa
+ case 0x435: // lidZulu
+ case 0x436: // lidAfrikaans
+ case 0x425: // lidEstonian
+ case 0x456: // lidGalician
+ case 0x41b: // lidSlovak
+ case 0x1409: // lidEnglishNewZealand
+ case 0x1809: // lidEnglishIreland
+ case 0x1c09: // lidEnglishSouthAfrica
+ case 0x2009: // lidEnglishJamaica
+ case 0x2409: // lidEnglishCaribbean
+ case 0x2809: // lidEnglishBelize
+ case 0x2c09: // lidEnglishTrinidad
+ case 0x3009: // lidEnglishZimbabwe
+ case 0x3409: // lidEnglishPhilippines
+ case 0x3809: // lidEnglishIndonesia
+ case 0x3c09: // lidEnglishHongKong
+ case 0x4009: // lidEnglishIndia
+ case 0x4409: // lidEnglishMalaysia
+ case 0x4809: // lidEnglishSingapore
+ case 0x80a: // lidSpanishMexican, lidMexican
+ case 0xc0a: // lidSpanishModern
+ case 0x100a: // lidGuatemala
+ case 0x140a: // lidCostaRica
+ case 0x180a: // lidPanama
+ case 0x1c0a: // lidDominicanRepublic
+ case 0x200a: // lidSpanishSA, lidVenezuela
+ case 0x240a: // lidColombia
+ case 0x280a: // lidPeru
+ case 0x2c0a: // lidArgentina
+ case 0x300a: // lidEcuador
+ case 0x340a: // lidChile
+ case 0x380a: // lidUruguay
+ case 0x3c0a: // lidParguay
+ case 0x400a: // lidBolivia
+ case 0x440a: // lidElSalvador
+ case 0x480a: // lidHonduras
+ case 0x4c0a: // lidNicaragua
+ case 0x500a: // lidPuertoRico
+ case 0x540a: // lidSpanishUS
+ case 0x80c: // lidFrenchBelgian
+ case 0x100c: // lidFrenchSwiss
+ case 0x140c: // lidFrenchLuxembourg
+ case 0x180c: // lidFrenchMonaco
+ case 0x1c0c: // lidFrenchWestIndies
+ case 0x200c: // lidFrenchReunion
+ case 0x240c: // lidFrenchCongoDRC, lidFrenchZaire
+ case 0x280c: // lidFrenchSenegal
+ case 0x2c0c: // lidFrenchCameroon
+ case 0x300c: // lidFrenchCotedIvoire
+ case 0x340c: // lidFrenchMali
+ case 0x3c0c: // lidFrenchHaiti
+ case 0x380c: // lidFrenchMorocco
+ case 0x40f: // lidIcelandic
+ case 0x810: // lidItalianSwiss
+ case 0x417: // lidRhaetoRomanic, lidRomanic
+ case 0x81a: // lidSerbianLatinSerbMont, lidCroatSerbo
+ case 0x101a: // lidBosniaHerzegovina
+ case 0x141a: // lidBosnianBosniaHerzegovinaLatin
+ case 0x181a: // lidSerbianBosniaHerzegovinaLatin
+ case 0x2c1a: // lidSerbianMontenegroLatin
+ case 0x41c: // lidAlbanian
+ case 0x81d: // lidSwedishFinland
+ case 0x421: // lidBahasa, lidIndonesian
+ case 0x42c: // lidAzeriLatin
+ case 0x42e: // lidSorbian
+ case 0x82e: // lidLowerSorbian
+ case 0x438: // lidFaeroese
+ case 0x43a: // lidMaltese
+ case 0x43b: // lidSamiLappish
+ case 0x83b: // lidNorthSamiSwe
+ case 0xc3b: // lidNorthernSamiFi
+ case 0x103b: // lidLuleSamiNor
+ case 0x143b: // lidLuleSamiSwe
+ case 0x183b: // lidSouthSamiNor
+ case 0x1c3b: // lidSouthSamiSwe
+ case 0x203b: // lidSkoltSami
+ case 0x243b: // lidInariSami
+ case 0x43e: // lidMalaysian
+ case 0x83e: // lidMalayBrunei
+ case 0x441: // lidSwahili
+ case 0x442: // lidTurkmen
+ case 0x443: // lidUzbekLatin
+ case 0x452: // lidWelsh
+ case 0x85d: // lidInuktitutLatin
+ case 0x85f: // lidTamazightLatin
+ case 0x462: // lidFrisian
+ case 0x464: // lidFilipino
+ case 0x466: // lidEdo
+ case 0x467: // lidFulfulde
+ case 0x468: // lidHausa
+ case 0x469: // lidIbibio
+ case 0x46a: // lidYoruba
+ case 0x46b: // lidQuechuaBol
+ case 0x86b: // lidQuechuaEcu
+ case 0xc6b: // lidQuechuaPe
+ case 0x46c: // lidSesothoSaLeboa
+ case 0x46e: // lidLuxembourgish
+ case 0x46f: // lidGreenlandic
+ case 0x470: // lidIgbo
+ case 0x471: // lidKanuri
+ case 0x472: // lidOromo
+ case 0x474: // lidGuarani
+ case 0x475: // lidHawaiian
+ case 0x476: // lidLatin
+ case 0x477: // lidSomali
+ case 0x47a: // lidMapudungun
+ case 0x47c: // lidMohawk
+ case 0x47e: // lidBreton
+ case 0x481: // lidMaori
+ case 0x482: // lidOccitan
+ case 0x483: // lidCorsican
+ case 0x484: // lidAlsatian
+ case 0x486: // lidKiche
+ case 0x487: // lidKinyarwanda
+ case 0x488: // lidWolof
+ return "Latn";
+ case 0x44c: // lidMalayalam
+ return "Mlym";
+ case 0x850: // lidMongolianMongo
+ return "Mong";
+ case 0x455: // lidBurmese
+ return "Mymr";
+ case 0x448: // lidOriya
+ return "Orya";
+ case 0x45b: // lidSinhalese
+ return "Sinh";
+ case 0x45a: // lidSyriac
+ return "Syrc";
+ case 0x449: // lidTamil
+ return "Taml";
+ case 0x44a: // lidTelugu
+ return "Telu";
+ case 0x465: // lidMaldivian
+ return "Thaa";
+ case 0x41e: // lidThai
+ return "Thai";
+ case 0x451: // lidTibetan
+ case 0x851: // lidBhutanese
+ return "Tibt";
+ case 0x480: // lidUighur
+ return "Uigh";
+ case 0x42a: // lidVietnamese
+ return "Viet";
+ case 0x478: // lidYi
+ return "Yiii";
+ default:
+ return OUString();
+ }
+}
+
+OUString fromLocaleToScriptTag(const OUString& sLocale)
+{
+ return fromLCIDToScriptTag(LanguageTag::convertToLanguageType(sLocale));
+}
+
+OUString resolveMajorMinorTypeFace(svx::FontScheme const& rFontSheme, const Id id)
+{
+ switch (id)
+ {
+ case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
+ return rFontSheme.getMajorAsian().maTypeface;
+ case NS_ooxml::LN_Value_ST_Theme_majorBidi:
+ return rFontSheme.getMajorComplex().maTypeface;
+ case NS_ooxml::LN_Value_ST_Theme_majorAscii:
+ case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
+ return rFontSheme.getMajorLatin().maTypeface;
+ break;
+ case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
+ return rFontSheme.getMinorAsian().maTypeface;
+ case NS_ooxml::LN_Value_ST_Theme_minorBidi:
+ return rFontSheme.getMinorComplex().maTypeface;
+ case NS_ooxml::LN_Value_ST_Theme_minorAscii:
+ case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
+ return rFontSheme.getMinorLatin().maTypeface;
+ break;
+ default:
+ break;
+ }
+ return OUString();
+}
+
+OUString resolveSupplementalFontList(svx::FontScheme const& rFontSheme, const Id id,
+ std::u16string_view rLangAsia, std::u16string_view rLangBidi)
+{
+ switch (id)
+ {
+ case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
+ return rFontSheme.findMajorSupplementalTypeface(rLangAsia);
+ case NS_ooxml::LN_Value_ST_Theme_majorBidi:
+ return rFontSheme.findMajorSupplementalTypeface(rLangBidi);
+ case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
+ return rFontSheme.findMinorSupplementalTypeface(rLangAsia);
+ case NS_ooxml::LN_Value_ST_Theme_minorBidi:
+ return rFontSheme.findMinorSupplementalTypeface(rLangBidi);
+ default:
+ break;
+ }
+ return OUString();
+}
+
+} // end anonymous namespace
+
+ThemeHandler::ThemeHandler(oox::drawingml::ThemePtr const& pTheme,
+ const css::uno::Sequence<css::beans::PropertyValue>& rLangProperties)
+ : mpTheme(pTheme)
+{
+ for (const auto& rProperty : rLangProperties)
+ {
+ OUString sLocaleName;
+ rProperty.Value >>= sLocaleName;
+ if (rProperty.Name == "eastAsia")
+ maThemeFontLangEastAsia = fromLocaleToScriptTag(sLocaleName);
+ if (rProperty.Name == "bidi")
+ maThemeFontLangBidi = fromLocaleToScriptTag(sLocaleName);
+ }
+}
+
+OUString ThemeHandler::getStringForTheme(const Id id)
+{
+ switch (id)
+ {
+ case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
+ return "majorEastAsia";
+ case NS_ooxml::LN_Value_ST_Theme_majorBidi:
+ return "majorBidi";
+ case NS_ooxml::LN_Value_ST_Theme_majorAscii:
+ return "majorAscii";
+ case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
+ return "majorHAnsi";
+ case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
+ return "minorEastAsia";
+ case NS_ooxml::LN_Value_ST_Theme_minorBidi:
+ return "minorBidi";
+ case NS_ooxml::LN_Value_ST_Theme_minorAscii:
+ return "minorAscii";
+ case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
+ return "minorHAnsi";
+ }
+ return OUString();
+}
+
+OUString ThemeHandler::getFontNameForTheme(const Id id) const
+{
+ auto pSvxTheme = mpTheme->createSvxTheme();
+ svx::FontScheme const& rFontScheme = pSvxTheme->getFontScheme();
+ OUString aSupplementalTypeFace = resolveSupplementalFontList(
+ rFontScheme, id, maThemeFontLangEastAsia, maThemeFontLangBidi);
+ if (!aSupplementalTypeFace.isEmpty())
+ return aSupplementalTypeFace;
+ OUString aTypeFace = resolveMajorMinorTypeFace(rFontScheme, id);
+ return aTypeFace;
+}
+
+} //namespace writerfilter
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeHandler.hxx b/writerfilter/source/dmapper/ThemeHandler.hxx
new file mode 100644
index 000000000000..8d7574991b29
--- /dev/null
+++ b/writerfilter/source/dmapper/ThemeHandler.hxx
@@ -0,0 +1,35 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <i18nlangtag/lang.h>
+#include <memory>
+#include <oox/drawingml/theme.hxx>
+#include <ooxml/resourceids.hxx>
+
+namespace writerfilter::dmapper
+{
+class ThemeHandler
+{
+private:
+ oox::drawingml::ThemePtr mpTheme;
+ OUString maThemeFontLangEastAsia;
+ OUString maThemeFontLangBidi;
+
+public:
+ ThemeHandler(oox::drawingml::ThemePtr const& pTheme,
+ const css::uno::Sequence<css::beans::PropertyValue>& rLangProperties);
+ OUString getFontNameForTheme(const Id id) const;
+ static OUString getStringForTheme(const Id id);
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeTable.cxx b/writerfilter/source/dmapper/ThemeTable.cxx
deleted file mode 100644
index 4d6ed2b3bc0f..000000000000
--- a/writerfilter/source/dmapper/ThemeTable.cxx
+++ /dev/null
@@ -1,563 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#include "TagLogger.hxx"
-#include "ThemeTable.hxx"
-#include <i18nlangtag/languagetag.hxx>
-#include <ooxml/resourceids.hxx>
-
-#include <map>
-
-using namespace com::sun::star;
-
-namespace writerfilter::dmapper
-{
-
-struct ThemeTable_Impl
-{
- ThemeTable_Impl() :
- m_currentThemeFontId(0),
- m_supplementalFontId(0)
- {}
- std::map<sal_uInt32, std::map<sal_uInt32, OUString> > m_themeFontMap;
- sal_uInt32 m_currentThemeFontId;
- std::map<sal_uInt32, OUString> m_currentFontThemeEntry;
- OUString m_supplementalFontName;
- sal_uInt32 m_supplementalFontId;
- OUString m_themeFontLangEastAsia;
- OUString m_themeFontLangBidi;
-};
-
-ThemeTable::ThemeTable()
-: LoggedProperties("ThemeTable")
-, LoggedTable("ThemeTable")
-, m_pImpl( new ThemeTable_Impl )
-{
-
-}
-
-ThemeTable::~ThemeTable()
-{
-}
-
-void ThemeTable::lcl_attribute(Id Name, Value & val)
-{
- OUString sValue = val.getString();
- switch(Name)
- {
- case NS_ooxml::LN_CT_TextFont_typeface:
- if (!sValue.isEmpty())
- m_pImpl->m_currentFontThemeEntry[m_pImpl->m_currentThemeFontId] = sValue;
- break;
- case NS_ooxml::LN_CT_SupplementalFont_script:
- if (!sValue.isEmpty())
- {
- if (sValue == m_pImpl->m_themeFontLangBidi)
- m_pImpl->m_supplementalFontId = NS_ooxml::LN_CT_FontCollection_cs;
- else if (sValue == m_pImpl->m_themeFontLangEastAsia)
- m_pImpl->m_supplementalFontId = NS_ooxml::LN_CT_FontCollection_ea;
- }
- break;
- case NS_ooxml::LN_CT_SupplementalFont_typeface:
- if (!sValue.isEmpty())
- m_pImpl->m_supplementalFontName = sValue;
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
- if(m_pImpl->m_supplementalFontId && m_pImpl->m_supplementalFontName.getLength() > 0)
- {
- m_pImpl->m_currentFontThemeEntry[m_pImpl->m_supplementalFontId] = m_pImpl->m_supplementalFontName;
- m_pImpl->m_supplementalFontName.clear();
- m_pImpl->m_supplementalFontId = 0;
- }
-}
-
-void ThemeTable::lcl_sprm(Sprm& rSprm)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("ThemeTable.sprm");
- TagLogger::getInstance().chars(rSprm.toString());
-#endif
-
- m_pImpl->m_supplementalFontName.clear();
- m_pImpl->m_supplementalFontId = 0;
-
- sal_uInt32 nSprmId = rSprm.getId();
- switch(nSprmId)
- {
- case NS_ooxml::LN_CT_BaseStyles_fontScheme:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_FontScheme_majorFont:
- case NS_ooxml::LN_CT_FontScheme_minorFont:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- m_pImpl->m_currentFontThemeEntry = std::map<sal_uInt32, OUString>();
- if( pProperties )
- pProperties->resolve(*this);
- m_pImpl->m_themeFontMap[nSprmId] = m_pImpl->m_currentFontThemeEntry;
- }
- break;
- case NS_ooxml::LN_CT_FontCollection_latin:
- case NS_ooxml::LN_CT_FontCollection_ea:
- case NS_ooxml::LN_CT_FontCollection_cs:
- {
- m_pImpl->m_currentThemeFontId = nSprmId;
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if( pProperties )
- pProperties->resolve(*this);
- }
- break;
- case NS_ooxml::LN_CT_FontCollection_font:
- {
- writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
- if (pProperties )
- pProperties->resolve(*this);
- }
- break;
- default:
- {
-#ifdef DBG_UTIL
- TagLogger::getInstance().element("unhandled");
-#endif
- }
- }
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-void ThemeTable::lcl_entry(writerfilter::Reference<Properties>::Pointer_t ref)
-{
-#ifdef DBG_UTIL
- TagLogger::getInstance().startElement("ThemeTable.entry");
-#endif
-
- ref->resolve(*this);
-
-#ifdef DBG_UTIL
- TagLogger::getInstance().endElement();
-#endif
-}
-
-OUString ThemeTable::getStringForTheme(const Id id)
-{
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- return "majorEastAsia";
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- return "majorBidi";
- case NS_ooxml::LN_Value_ST_Theme_majorAscii:
- return "majorAscii";
- case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
- return "majorHAnsi";
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- return "minorEastAsia";
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- return "minorBidi";
- case NS_ooxml::LN_Value_ST_Theme_minorAscii:
- return "minorAscii";
- case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
- return "minorHAnsi";
- }
- return OUString();
-}
-OUString ThemeTable::getFontNameForTheme(const Id id) const
-{
- std::map<sal_uInt32, OUString> tmpThemeFontMap;
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- case NS_ooxml::LN_Value_ST_Theme_majorAscii:
- case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
- tmpThemeFontMap = m_pImpl->m_themeFontMap[NS_ooxml::LN_CT_FontScheme_majorFont];
- break;
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- case NS_ooxml::LN_Value_ST_Theme_minorAscii:
- case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
- tmpThemeFontMap = m_pImpl->m_themeFontMap[NS_ooxml::LN_CT_FontScheme_minorFont];
- break;
- default:
- return OUString();
- }
-
- switch (id)
- {
- case NS_ooxml::LN_Value_ST_Theme_majorAscii:
- case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
- case NS_ooxml::LN_Value_ST_Theme_minorAscii:
- case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
- {
- std::map<sal_uInt32, OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_latin);
- if (Iter != tmpThemeFontMap.end())
- return Iter->second;
- return OUString();
- }
- case NS_ooxml::LN_Value_ST_Theme_majorBidi:
- case NS_ooxml::LN_Value_ST_Theme_minorBidi:
- {
- std::map<sal_uInt32, OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_cs);
- if (Iter != tmpThemeFontMap.end())
- return Iter->second;
- return OUString();
- }
- case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
- case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
- {
- std::map<sal_uInt32, OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_ea);
- if (Iter != tmpThemeFontMap.end())
- return Iter->second;
- return OUString();
- }
- default:
- return OUString();
- }
-}
-
-void ThemeTable::setThemeFontLangProperties(const uno::Sequence<beans::PropertyValue>& aPropSeq)
-{
- for (const auto& rProp : aPropSeq)
- {
- OUString sLocaleName;
- rProp.Value >>= sLocaleName;
- if (rProp.Name == "eastAsia")
- m_pImpl->m_themeFontLangEastAsia = fromLocaleToScriptTag(sLocaleName);
- if (rProp.Name == "bidi")
- m_pImpl->m_themeFontLangBidi = fromLocaleToScriptTag(sLocaleName);
-
- }
-}
-
-OUString ThemeTable::fromLocaleToScriptTag(const OUString& sLocale)
-{
- return fromLCIDToScriptTag(LanguageTag::convertToLanguageType(sLocale));
-}
-
-OUString ThemeTable::fromLCIDToScriptTag(LanguageType lang)
-{
- // conversion list from:
- // http://blogs.msdn.com/b/officeinteroperability/archive/2013/04/22/office-open-xml-themes-schemes-and-fonts.aspx
- switch (static_cast<sal_uInt16>(lang))
- {
- case 0x429 : // lidFarsi
- case 0x401 : // lidArabic
- case 0x801 : // lidIraq
- case 0xc01 : // lidEgyptian
- case 0x1001 : // lidLibya
- case 0x1401 : // lidAlgerian
- case 0x1801 : // lidMorocco
- case 0x1c01 : // lidTunisia
- case 0x2001 : // lidOman
- case 0x2401 : // lidYemen
- case 0x2801 : // lidSyria
- case 0x2c01 : // lidJordan
- case 0x3001 : // lidLebanon
- case 0x3401 : // lidKuwait
- case 0x3801 : // lidUAE
- case 0x3c01 : // lidBahrain
- case 0x4001 : // lidQatar
- case 0x420 : // lidUrdu
- case 0x846 : // lidPunjabiPakistan
- case 0x859 : // lidSindhiPakistan
- case 0x45f : // lidTamazight
- case 0x460 : // lidKashmiri
- case 0x463 : // lidPashto
- case 0x48c : // lidDari
- return "Arab";
- case 0x42b : // lidArmenian
- return "Armn";
- case 0x445 : // lidBengali
- case 0x845 : // lidBengaliBangladesh
- case 0x44d : // lidAssamese
- case 0x458 : // lidManipuri
- return "Beng";
- case 0x45d : // lidInuktitut
- return "Cans";
- case 0x45c : // lidCherokee
- return "Cher";
- case 0x419 : // lidRussian
- case 0x402 : // lidBulgarian
- case 0x281a : // lidSerbianCyrillic
- case 0x422 : // lidUkranian
- case 0x819 : // lidRussianMoldavia
- case 0xc1a : // lidSerbianCyrillicSerbMont
- case 0x1c1a : // lidSerbianBosniaHerzegovinaCyrillic
- case 0x201a : // lidBosnianBosniaHerzegovinaCyrillic
- case 0x301a : // lidSerbianMontenegroCyrillic
- case 0x423 : // lidByelorussian
- case 0x428 : // lidTajik
- case 0x82c : // lidAzeriCyrillic
- case 0x42f : // lidMacedonian
- case 0x43f : // lidKazakh
- case 0x440 : // lidKyrgyz
- case 0x843 : // lidUzbekCyrillic
- case 0x444 : // lidTatar
- case 0x450 : // lidMongolian
- case 0x46d : // lidBashkir
- case 0x485 : // lidSakha
- return "Cyrl";
- case 0x439 : // lidHindi
- case 0x44e : // lidMarathi
- case 0x44f : // lidSanskrit
- case 0x457 : // lidKonkani
- case 0x459 : // lidSindhi
- case 0x860 : // lidKashmiriIndia
- case 0x461 : // lidNepali
- case 0x861 : // lidNepaliIndia
- return "Deva";
- case 0x45e : // lidAmharic
- case 0x473 : // lidTigrignaEthiopic
- case 0x873 : // lidTigrignaEritrea
- return "Ethi";
- case 0x437 : // lidGeorgian
- return "Geor";
- case 0x408 : // lidGreek
- return "Grek";
- case 0x447 : // lidGujarati
- return "Gujr";
- case 0x446 : // lidPunjabi
- return "Guru";
- case 0x412 : // lidKoreanExtWansung
- return "Hang";
- case 0x804 : // lidChineseSimp
- case 0x1004 : // lidSingapore
- return "Hans";
- case 0x404 : // lidChineseTrad
- case 0xc04 : // lidHongkong
- case 0x1404 : // lidMacau
- return "Hant";
- case 0x40d : // lidHebrew
- case 0x43d : // lidYiddish
- return "Hebr";
- case 0x411 : // lidJapanese
- return "Jpan";
- case 0x453 : // lidKhmer
- return "Khmr";
- case 0x44b : // lidKannada
- return "Knda";
- case 0x454 : // lidLao
- return "Laoo";
- case 0x409 : // lidAmerican
- case 0xc09 : // lidAustralian
- case 0x809 : // lidBritish
- case 0x1009 : // lidEnglishCanadian
- case 0x403 : // lidCatalan
- case 0x406 : // lidDanish
- case 0x413 : // lidDutch
- case 0x813 : // lidDutchBelgian
- case 0x479 : // lidPapiamentu
- case 0x40b : // lidFinnish
- case 0x40c : // lidFrench
- case 0xc0c : // lidFrenchCanadian
- case 0x407 : // lidGerman
- case 0x807 : // lidSwissGerman
- case 0xc07 : // lidAustrianGerman
- case 0x1007 : // lidGermanLuxembourg
- case 0x1407 : // lidGermanLiechtenstein
- case 0x410 : // lidItalian
- case 0x414 : // lidNorskBokmal
- case 0x814 : // lidNorskNynorsk
- case 0x416 : // lidPortBrazil
- case 0x816 : // lidPortIberian
- case 0x40a : // lidSpanish
- case 0x41d : // lidSwedish
- case 0x405 : // lidCzech
- case 0x40e : // lidHungarian
- case 0x415 : // lidPolish
- case 0x41f : // lidTurkish
- case 0x42d : // lidBasque
- case 0x424 : // lidSlovenian
- case 0x426 : // lidLatvian
- case 0x427 : // lidLithuanian
- case 0x418 : // lidRomanian
- case 0x818 : // lidRomanianMoldavia
- case 0x241a : // lidSerbianLatin
- case 0x41a : // lidCroatian, lidCroat
- case 0x491 : // lidGaelicScots
- case 0x83c : // lidGaelicIrish
- case 0x430 : // lidSutu
- case 0x431 : // lidTsonga
- case 0x432 : // lidTswana
- case 0x433 : // lidVenda
- case 0x434 : // lidXhosa
- case 0x435 : // lidZulu
- case 0x436 : // lidAfrikaans
- case 0x425 : // lidEstonian
- case 0x456 : // lidGalician
- case 0x41b : // lidSlovak
- case 0x1409 : // lidEnglishNewZealand
- case 0x1809 : // lidEnglishIreland
- case 0x1c09 : // lidEnglishSouthAfrica
- case 0x2009 : // lidEnglishJamaica
- case 0x2409 : // lidEnglishCaribbean
- case 0x2809 : // lidEnglishBelize
- case 0x2c09 : // lidEnglishTrinidad
- case 0x3009 : // lidEnglishZimbabwe
- case 0x3409 : // lidEnglishPhilippines
- case 0x3809 : // lidEnglishIndonesia
- case 0x3c09 : // lidEnglishHongKong
- case 0x4009 : // lidEnglishIndia
- case 0x4409 : // lidEnglishMalaysia
- case 0x4809 : // lidEnglishSingapore
- case 0x80a : // lidSpanishMexican, lidMexican
- case 0xc0a : // lidSpanishModern
- case 0x100a : // lidGuatemala
- case 0x140a : // lidCostaRica
- case 0x180a : // lidPanama
- case 0x1c0a : // lidDominicanRepublic
- case 0x200a : // lidSpanishSA, lidVenezuela
- case 0x240a : // lidColombia
- case 0x280a : // lidPeru
- case 0x2c0a : // lidArgentina
- case 0x300a : // lidEcuador
- case 0x340a : // lidChile
- case 0x380a : // lidUruguay
- case 0x3c0a : // lidParguay
- case 0x400a : // lidBolivia
- case 0x440a : // lidElSalvador
- case 0x480a : // lidHonduras
- case 0x4c0a : // lidNicaragua
- case 0x500a : // lidPuertoRico
- case 0x540a : // lidSpanishUS
- case 0x80c : // lidFrenchBelgian
- case 0x100c : // lidFrenchSwiss
- case 0x140c : // lidFrenchLuxembourg
- case 0x180c : // lidFrenchMonaco
- case 0x1c0c : // lidFrenchWestIndies
- case 0x200c : // lidFrenchReunion
- case 0x240c : // lidFrenchCongoDRC, lidFrenchZaire
- case 0x280c : // lidFrenchSenegal
- case 0x2c0c : // lidFrenchCameroon
- case 0x300c : // lidFrenchCotedIvoire
- case 0x340c : // lidFrenchMali
- case 0x3c0c : // lidFrenchHaiti
- case 0x380c : // lidFrenchMorocco
- case 0x40f : // lidIcelandic
- case 0x810 : // lidItalianSwiss
- case 0x417 : // lidRhaetoRomanic, lidRomanic
- case 0x81a : // lidSerbianLatinSerbMont, lidCroatSerbo
- case 0x101a : // lidBosniaHerzegovina
- case 0x141a : // lidBosnianBosniaHerzegovinaLatin
- case 0x181a : // lidSerbianBosniaHerzegovinaLatin
- case 0x2c1a : // lidSerbianMontenegroLatin
- case 0x41c : // lidAlbanian
- case 0x81d : // lidSwedishFinland
- case 0x421 : // lidBahasa, lidIndonesian
- case 0x42c : // lidAzeriLatin
- case 0x42e : // lidSorbian
- case 0x82e : // lidLowerSorbian
- case 0x438 : // lidFaeroese
- case 0x43a : // lidMaltese
- case 0x43b : // lidSamiLappish
- case 0x83b : // lidNorthSamiSwe
- case 0xc3b : // lidNorthernSamiFi
- case 0x103b : // lidLuleSamiNor
- case 0x143b : // lidLuleSamiSwe
- case 0x183b : // lidSouthSamiNor
- case 0x1c3b : // lidSouthSamiSwe
- case 0x203b : // lidSkoltSami
- case 0x243b : // lidInariSami
- case 0x43e : // lidMalaysian
- case 0x83e : // lidMalayBrunei
- case 0x441 : // lidSwahili
- case 0x442 : // lidTurkmen
- case 0x443 : // lidUzbekLatin
- case 0x452 : // lidWelsh
- case 0x85d : // lidInuktitutLatin
- case 0x85f : // lidTamazightLatin
- case 0x462 : // lidFrisian
- case 0x464 : // lidFilipino
- case 0x466 : // lidEdo
- case 0x467 : // lidFulfulde
- case 0x468 : // lidHausa
- case 0x469 : // lidIbibio
- case 0x46a : // lidYoruba
- case 0x46b : // lidQuechuaBol
- case 0x86b : // lidQuechuaEcu
- case 0xc6b : // lidQuechuaPe
- case 0x46c : // lidSesothoSaLeboa
- case 0x46e : // lidLuxembourgish
- case 0x46f : // lidGreenlandic
- case 0x470 : // lidIgbo
- case 0x471 : // lidKanuri
- case 0x472 : // lidOromo
- case 0x474 : // lidGuarani
- case 0x475 : // lidHawaiian
- case 0x476 : // lidLatin
- case 0x477 : // lidSomali
- case 0x47a : // lidMapudungun
- case 0x47c : // lidMohawk
- case 0x47e : // lidBreton
- case 0x481 : // lidMaori
- case 0x482 : // lidOccitan
- case 0x483 : // lidCorsican
- case 0x484 : // lidAlsatian
- case 0x486 : // lidKiche
- case 0x487 : // lidKinyarwanda
- case 0x488 : // lidWolof
- return "Latn";
- case 0x44c : // lidMalayalam
- return "Mlym";
- case 0x850 : // lidMongolianMongo
- return "Mong";
- case 0x455 : // lidBurmese
- return "Mymr";
- case 0x448 : // lidOriya
- return "Orya";
- case 0x45b : // lidSinhalese
- return "Sinh";
- case 0x45a : // lidSyriac
- return "Syrc";
- case 0x449 : // lidTamil
- return "Taml";
- case 0x44a : // lidTelugu
- return "Telu";
- case 0x465 : // lidMaldivian
- return "Thaa";
- case 0x41e : // lidThai
- return "Thai";
- case 0x451 : // lidTibetan
- case 0x851 : // lidBhutanese
- return "Tibt";
- case 0x480 : // lidUighur
- return "Uigh";
- case 0x42a : // lidVietnamese
- return "Viet";
- case 0x478 : // lidYi
- return "Yiii";
- default:
- return OUString();
- }
-}
-
-} //namespace writerfilter
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/ThemeTable.hxx b/writerfilter/source/dmapper/ThemeTable.hxx
deleted file mode 100644
index 164f083c9ea3..000000000000
--- a/writerfilter/source/dmapper/ThemeTable.hxx
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#pragma once
-
-#include "LoggedResources.hxx"
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <i18nlangtag/lang.h>
-#include <memory>
-
-namespace writerfilter::dmapper
-{
-struct ThemeTable_Impl;
-
-class ThemeTable : public LoggedProperties, public LoggedTable
-{
- std::unique_ptr<ThemeTable_Impl> m_pImpl;
-
-public:
- ThemeTable();
- virtual ~ThemeTable() override;
-
- OUString getFontNameForTheme(const Id id) const;
- static OUString getStringForTheme(const Id id);
- void setThemeFontLangProperties(const css::uno::Sequence<css::beans::PropertyValue>& aPropSeq);
-
-private:
- // Properties
- virtual void lcl_attribute(Id Name, Value& val) override;
- virtual void lcl_sprm(Sprm& sprm) override;
-
- // Table
- virtual void lcl_entry(writerfilter::Reference<Properties>::Pointer_t ref) override;
-
- // Helper methods
- static OUString fromLocaleToScriptTag(const OUString& sLocale);
- static OUString fromLCIDToScriptTag(LanguageType lang);
-};
-typedef tools::SvRef<ThemeTable> ThemeTablePtr;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index fdfc1f1ed0ab..8e0cd9aa8a86 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -25,6 +25,7 @@
#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
#include <com/sun/star/graphic/GraphicMapper.hpp>
#include <ooxml/resourceids.hxx>
+#include <oox/drawingml/theme.hxx>
#include <oox/shape/ShapeFilterBase.hxx>
#include "OOXMLStreamImpl.hxx"
#include "OOXMLDocumentImpl.hxx"
@@ -484,6 +485,12 @@ void OOXMLDocumentImpl::resolve(Stream & rStream)
resolveFastSubStream(rStream, OOXMLStream::SETTINGS);
mxThemeDom = importSubStream(OOXMLStream::THEME);
resolveFastSubStream(rStream, OOXMLStream::THEME);
+ // Convert the oox::Theme to the draw page
+ {
+ auto pThemePtr = getTheme();
+ if (pThemePtr)
+ pThemePtr->addTheme(getDrawPage());
+ }
mxGlossaryDocDom = importSubStream(OOXMLStream::GLOSSARY);
if (mxGlossaryDocDom.is())
resolveGlossaryStream(rStream);
@@ -885,6 +892,13 @@ const rtl::Reference<oox::shape::ShapeFilterBase>& OOXMLDocumentImpl::getShapeFi
return mxShapeFilterBase;
}
+const rtl::Reference<oox::drawingml::ThemeFilterBase>& OOXMLDocumentImpl::getThemeFilterBase()
+{
+ if (!mxThemeFilterBase)
+ mxThemeFilterBase = new oox::drawingml::ThemeFilterBase(mpStream->getContext());
+ return mxThemeFilterBase;
+}
+
OOXMLDocument *
OOXMLDocumentFactory::createDocument
(const OOXMLStream::Pointer_t& pStream,
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
index c896d7bf4901..3f57696b2d25 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
@@ -24,6 +24,7 @@
#include <com/sun/star/graphic/XGraphicMapper.hpp>
#include <oox/drawingml/drawingmltypes.hxx>
+#include <oox/drawingml/ThemeFilterBase.hxx>
#include "OOXMLPropertySet.hxx"
@@ -73,6 +74,7 @@ class OOXMLDocumentImpl : public OOXMLDocument
// and the same is used by header and footer as well.
oox::drawingml::ThemePtr mpTheme;
rtl::Reference<oox::shape::ShapeFilterBase> mxShapeFilterBase;
+ rtl::Reference<oox::drawingml::ThemeFilterBase> mxThemeFilterBase;
bool mbCommentsExtendedResolved = false;
@@ -135,6 +137,10 @@ public:
virtual const OUString & getTarget() const override;
virtual rtl::Reference<oox::shape::ShapeContextHandler> getShapeContext( ) override;
virtual void setShapeContext( rtl::Reference<oox::shape::ShapeContextHandler> xContext ) override;
+ virtual const oox::drawingml::ThemePtr & getTheme() const override
+ {
+ return mpTheme;
+ }
void pushShapeContext() override;
void popShapeContext() override;
virtual css::uno::Reference<css::xml::dom::XDocument> getThemeDom() override;
@@ -154,11 +160,10 @@ public:
return mxGraphicMapper;
}
- const oox::drawingml::ThemePtr & getTheme() const { return mpTheme; }
void setTheme(const oox::drawingml::ThemePtr& pTheme) { mpTheme = pTheme; }
const rtl::Reference<oox::shape::ShapeFilterBase> & getShapeFilterBase();
-
+ const rtl::Reference<oox::drawingml::ThemeFilterBase> & getThemeFilterBase();
};
}
diff --git a/writerfilter/source/ooxml/OOXMLFactory.hxx b/writerfilter/source/ooxml/OOXMLFactory.hxx
index f687f3b6735c..a3f9dd85382a 100644
--- a/writerfilter/source/ooxml/OOXMLFactory.hxx
+++ b/writerfilter/source/ooxml/OOXMLFactory.hxx
@@ -22,6 +22,7 @@
#include <dmapper/resourcemodel.hxx>
#include "OOXMLFastContextHandler.hxx"
+#include "OOXMLFastContextHandlerTheme.hxx"
namespace writerfilter::ooxml {
@@ -50,6 +51,7 @@ enum class ResourceType {
HpsMeasure,
MeasurementOrPercent,
CommentEx,
+ Theme,
};
struct AttributeInfo
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx
new file mode 100644
index 000000000000..a976453ba911
--- /dev/null
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.cxx
@@ -0,0 +1,69 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <sal/log.hxx>
+#include "OOXMLFastContextHandlerTheme.hxx"
+#include <oox/drawingml/theme.hxx>
+#include <oox/token/namespaces.hxx>
+
+using namespace ::com::sun::star;
+
+namespace writerfilter::ooxml
+{
+OOXMLFastContextHandlerTheme::OOXMLFastContextHandlerTheme(OOXMLFastContextHandler* pContext)
+ : OOXMLFastContextHandler(pContext)
+{
+}
+
+uno::Reference<xml::sax::XFastContextHandler>
+OOXMLFastContextHandlerTheme::lcl_createFastChildContext(
+ Token_t Element, const uno::Reference<xml::sax::XFastAttributeList>& Attribs)
+{
+ if (mpThemeFragmentHandler.is())
+ return mpThemeFragmentHandler->createFastChildContext(Element, Attribs);
+
+ return this;
+}
+
+void OOXMLFastContextHandlerTheme::lcl_startFastElement(
+ Token_t Element, const uno::Reference<xml::sax::XFastAttributeList>& Attribs)
+{
+ if (!mpThemeFragmentHandler.is())
+ {
+ auto xThemeFilterBase = getDocument()->getThemeFilterBase();
+ OUString aThemeFragmentPath
+ = xThemeFilterBase->getFragmentPathFromFirstTypeFromOfficeDoc(u"theme");
+ auto pThemePtr = getDocument()->getTheme();
+ if (!pThemePtr)
+ {
+ pThemePtr = std::make_shared<oox::drawingml::Theme>();
+ getDocument()->setTheme(pThemePtr);
+ }
+ mpThemeFragmentHandler = new oox::drawingml::ThemeFragmentHandler(
+ *xThemeFilterBase, aThemeFragmentPath, *pThemePtr);
+ }
+
+ if (mpThemeFragmentHandler.is())
+ mpThemeFragmentHandler->startFastElement(Element, Attribs);
+}
+
+void OOXMLFastContextHandlerTheme::lcl_endFastElement(Token_t Element)
+{
+ if (mpThemeFragmentHandler.is())
+ mpThemeFragmentHandler->endFastElement(Element);
+}
+
+void OOXMLFastContextHandlerTheme::lcl_characters(const OUString& aChars)
+{
+ if (mpThemeFragmentHandler.is())
+ mpThemeFragmentHandler->characters(aChars);
+}
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx
new file mode 100644
index 000000000000..2de6b75590f0
--- /dev/null
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandlerTheme.hxx
@@ -0,0 +1,46 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#pragma once
+
+#include <set>
+#include <cppuhelper/implbase.hxx>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/xml/sax/XFastContextHandler.hpp>
+#include <oox/mathml/importutils.hxx>
+#include <oox/drawingml/themefragmenthandler.hxx>
+#include <rtl/ref.hxx>
+#include "OOXMLParserState.hxx"
+#include "OOXMLPropertySet.hxx"
+#include "OOXMLFastContextHandler.hxx"
+
+namespace writerfilter::ooxml
+{
+class OOXMLFastContextHandlerTheme : public OOXMLFastContextHandler
+{
+ rtl::Reference<oox::drawingml::ThemeFragmentHandler> mpThemeFragmentHandler;
+
+public:
+ explicit OOXMLFastContextHandlerTheme(OOXMLFastContextHandler* pContext);
+ std::string getType() const override { return "Theme"; }
+
+protected:
+ void lcl_startFastElement(
+ Token_t Element,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) override;
+ void lcl_endFastElement(Token_t Element) override;
+ css::uno::Reference<css::xml::sax::XFastContextHandler> lcl_createFastChildContext(
+ Token_t Element,
+ const css::uno::Reference<css::xml::sax::XFastAttributeList>& Attribs) override;
+ virtual void lcl_characters(const OUString& aChars) override;
+};
+
+} // end namespace writerfilter::ooxml
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 11a434d3d7ee..8706d3fc2150 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -208,7 +208,7 @@
</element>
</define>
</grammar>
- <resource name="CT_OfficeStyleSheet" resource="Table" tokenid="ooxml:THEMETABLE"/>
+ <resource name="CT_OfficeStyleSheet" resource="Theme" tokenid="ooxml:THEMETABLE"/>
<resource name="CT_Hyperlink" resource="Properties">
<attribute name="r:id" tokenid="ooxml:CT_Hyperlink_r_id"/>
</resource>