/* -*- 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 #include #include #include #include #include #include #include #include #include using namespace com::sun::star; namespace model { Theme::Theme() = default; Theme::Theme(OUString const& rName) : maName(rName) { } Theme::Theme(Theme const& rTheme) : maName(rTheme.maName) , mpColorSet(new ColorSet(*rTheme.getColorSet())) , maFontScheme(rTheme.maFontScheme) { } void Theme::SetName(const OUString& rName) { maName = rName; } const OUString& Theme::GetName() const { return maName; } void Theme::dumpAsXml(xmlTextWriterPtr pWriter) const { (void)xmlTextWriterStartElement(pWriter, BAD_CAST("Theme")); (void)xmlTextWriterWriteFormatAttribute(pWriter, BAD_CAST("ptr"), "%p", this); (void)xmlTextWriterWriteAttribute(pWriter, BAD_CAST("maName"), BAD_CAST(maName.toUtf8().getStr())); if (mpColorSet) { mpColorSet->dumpAsXml(pWriter); } (void)xmlTextWriterEndElement(pWriter); } void Theme::ToAny(uno::Any& rVal) const { comphelper::SequenceAsHashMap aMap; aMap["Name"] <<= maName; if (mpColorSet) { std::vector aColorScheme; for (auto eThemeColorType : o3tl::enumrange()) { if (eThemeColorType != model::ThemeColorType::Unknown) { Color aColor = mpColorSet->getColor(eThemeColorType); aColorScheme.push_back(sal_Int32(aColor)); } } aMap["ColorSchemeName"] <<= mpColorSet->getName(); aMap["ColorScheme"] <<= comphelper::containerToSequence(aColorScheme); } rVal <<= aMap.getAsConstPropertyValueList(); } std::unique_ptr Theme::FromAny(const uno::Any& rVal) { comphelper::SequenceAsHashMap aMap(rVal); std::unique_ptr pTheme; std::shared_ptr pColorSet; auto it = aMap.find("Name"); if (it != aMap.end()) { OUString aName; it->second >>= aName; pTheme = std::make_unique(aName); } it = aMap.find("ColorSchemeName"); if (it != aMap.end() && pTheme) { OUString aName; it->second >>= aName; pColorSet = std::make_shared(aName); pTheme->setColorSet(pColorSet); } it = aMap.find("ColorScheme"); if (it != aMap.end() && pColorSet) { uno::Sequence aColors; it->second >>= aColors; SAL_WARN_IF(aColors.size() > 12, "svx", "Theme::FromAny: number of colors greater than max theme colors supported"); for (auto eThemeColorType : o3tl::enumrange()) { if (eThemeColorType != model::ThemeColorType::Unknown) { size_t nIndex(static_cast(eThemeColorType)); if (nIndex < aColors.size()) { Color aColor(ColorTransparency, aColors[nIndex]); pColorSet->add(eThemeColorType, aColor); } } } } return pTheme; } std::vector Theme::GetColors() const { if (!mpColorSet) return {}; std::vector aColors; for (auto eThemeColorType : o3tl::enumrange()) { if (eThemeColorType != model::ThemeColorType::Unknown) aColors.push_back(mpColorSet->getColor(eThemeColorType)); } return aColors; } Color Theme::GetColor(model::ThemeColorType eType) const { if (!mpColorSet) return {}; return mpColorSet->getColor(eType); } } // end of namespace model /* vim:set shiftwidth=4 softtabstop=4 expandtab: */