summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/ThemeTable.cxx
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/source/dmapper/ThemeTable.cxx
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/source/dmapper/ThemeTable.cxx')
-rw-r--r--writerfilter/source/dmapper/ThemeTable.cxx563
1 files changed, 0 insertions, 563 deletions
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: */