include/docmodel/theme/FormatScheme.hxx | 128 ++++++++++++++++++- oox/inc/drawingml/linepropertiescontext.hxx | 10 - oox/source/drawingml/linepropertiescontext.cxx | 166 ++++++++++++++++++++++--- oox/source/drawingml/themeelementscontext.cxx | 23 ++- sw/qa/core/theme/ThemeTest.cxx | 58 ++++++++ 5 files changed, 356 insertions(+), 29 deletions(-)
New commits: commit f69614d8115e9d62752f1c59c0fdcd697a9ded2c Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Wed Mar 1 22:59:02 2023 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed Apr 12 06:55:41 2023 +0200 oox: add model::LineStyle and import line style elements of a theme Also extend the SwCoreThemeTest with asserts for the LineStyles for the example theme. Change-Id: I72aa64345d39fea84544e39b0a37a22f3e6baa5d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149360 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/include/docmodel/theme/FormatScheme.hxx b/include/docmodel/theme/FormatScheme.hxx index cd3c5491a62a..5d16b79b6231 100644 --- a/include/docmodel/theme/FormatScheme.hxx +++ b/include/docmodel/theme/FormatScheme.hxx @@ -344,19 +344,133 @@ public: } }; -// Format Scheme - class DOCMODEL_DLLPUBLIC FillStyle { public: std::shared_ptr<Fill> mpFill; }; +enum class CapType +{ + Unset, + Flat, + Round, + Square +}; + +enum class PenAlignmentType +{ + Unset, + Center, + Inset +}; + +enum class CompoundLineType +{ + Unset, + Single, + Double, + ThickThin_Double, + ThinThick_Double, + Triple, +}; + +enum class PresetDashType +{ + Unset, + Dash, + DashDot, + Dot, + LargeDash, + LargeDashDot, + LargeDashDotDot, + Solid, + SystemDash, + SystemDashDot, + SystemDashDotDot, + SystemDot, +}; + +enum class LineJoinType +{ + Unset, + Round, + Bevel, + Miter, +}; + +struct DOCMODEL_DLLPUBLIC LineJoin +{ + LineJoinType meType = LineJoinType::Unset; + sal_Int32 mnMiterLimit = 0; // Percentage +}; + +enum class LineEndType +{ + None, + Triangle, + Stealth, + Diamond, + Oval, + Arrow +}; + +enum class LineEndWidth +{ + Unset, + Small, + Medium, + Large +}; + +enum class LineEndLength +{ + Unset, + Small, + Medium, + Large +}; + +struct DOCMODEL_DLLPUBLIC LineEnd +{ + LineEndType meType; + LineEndWidth meWidth; + LineEndLength meLength; +}; + +struct DOCMODEL_DLLPUBLIC DashStop +{ + sal_Int32 mnDashLength = 0; + sal_Int32 mnStopLength = 0; +}; + +struct DOCMODEL_DLLPUBLIC LineDash +{ + PresetDashType mePresetType = PresetDashType::Unset; + std::vector<DashStop> maCustomList; +}; + +class DOCMODEL_DLLPUBLIC LineStyle +{ +public: + sal_Int32 mnWidth; + CapType meCapType; + PenAlignmentType mePenAlignment; + CompoundLineType meCompoundLineType; + LineDash maLineDash; + LineJoin maLineJoin; + LineEnd maHeadEnd; + LineEnd maTailEnd; + + FillStyle maLineFillStyle; +}; + class DOCMODEL_DLLPUBLIC FormatScheme { private: OUString maName; std::vector<FillStyle> maFillStyleList; + std::vector<LineStyle> maLineStyleList; std::vector<FillStyle> maBackgroundFillStyleList; public: @@ -369,6 +483,16 @@ public: const OUString& getName() const { return maName; } + std::vector<LineStyle> const& getLineStyleList() const { return maLineStyleList; } + + LineStyle* addLineStyle() + { + if (maLineStyleList.size() > 3) + return nullptr; + auto& rLineStyle = maLineStyleList.emplace_back(); + return &rLineStyle; + } + std::vector<FillStyle> const& getFillStyleList() const { return maFillStyleList; } FillStyle* addFillStyle() diff --git a/oox/inc/drawingml/linepropertiescontext.hxx b/oox/inc/drawingml/linepropertiescontext.hxx index 470a38c68514..041f50bf0d73 100644 --- a/oox/inc/drawingml/linepropertiescontext.hxx +++ b/oox/inc/drawingml/linepropertiescontext.hxx @@ -22,23 +22,25 @@ #include <oox/core/contexthandler2.hxx> -namespace oox::drawingml { +namespace model { class LineStyle; } +namespace oox::drawingml +{ struct LineProperties; class LinePropertiesContext final : public ::oox::core::ContextHandler2 { public: - LinePropertiesContext( ::oox::core::ContextHandler2Helper const & rParent, - const ::oox::AttributeList& rAttributes, - LineProperties& rLineProperties ) noexcept; + LinePropertiesContext(::oox::core::ContextHandler2Helper const & rParent, const ::oox::AttributeList& rAttributes, + LineProperties& rLineProperties, model::LineStyle* pLineStyle = nullptr) noexcept; virtual ~LinePropertiesContext() override; virtual ::oox::core::ContextHandlerRef onCreateContext( ::sal_Int32 Element, const ::oox::AttributeList& rAttribs ) override; private: + model::LineStyle* mpLineStyle; LineProperties& mrLineProperties; }; diff --git a/oox/source/drawingml/linepropertiescontext.cxx b/oox/source/drawingml/linepropertiescontext.cxx index 0a95883ccbf8..dbcae7caf5c7 100644 --- a/oox/source/drawingml/linepropertiescontext.cxx +++ b/oox/source/drawingml/linepropertiescontext.cxx @@ -23,6 +23,7 @@ #include <oox/helper/attributelist.hxx> #include <oox/token/namespaces.hxx> #include <oox/token/tokens.hxx> +#include <docmodel/theme/FormatScheme.hxx> using namespace ::oox::core; using namespace ::com::sun::star::uno; @@ -33,13 +34,47 @@ using namespace ::com::sun::star::xml::sax; namespace oox::drawingml { LinePropertiesContext::LinePropertiesContext( ContextHandler2Helper const & rParent, const AttributeList& rAttribs, - LineProperties& rLineProperties ) noexcept -: ContextHandler2( rParent ) -, mrLineProperties( rLineProperties ) + LineProperties& rLineProperties, model::LineStyle* pLineStyle) noexcept + : ContextHandler2(rParent) + , mpLineStyle(pLineStyle) + , mrLineProperties(rLineProperties) { mrLineProperties.moLineWidth = rAttribs.getInteger( XML_w ); mrLineProperties.moLineCompound = rAttribs.getToken( XML_cmpd ); mrLineProperties.moLineCap = rAttribs.getToken( XML_cap ); + + if (mpLineStyle) + { + mpLineStyle->mnWidth = rAttribs.getInteger(XML_w, 0); + + switch (rAttribs.getToken(XML_cap, XML_TOKEN_INVALID)) + { + case XML_rnd: mpLineStyle->meCapType = model::CapType::Round; break; + case XML_sq: mpLineStyle->meCapType = model::CapType::Square; break; + case XML_flat: mpLineStyle->meCapType = model::CapType::Flat; break; + default: + mpLineStyle->meCapType = model::CapType::Unset; break; + } + + switch (rAttribs.getToken(XML_cmpd, XML_TOKEN_INVALID)) + { + case XML_sng: mpLineStyle->meCompoundLineType = model::CompoundLineType::Single; break; + case XML_dbl: mpLineStyle->meCompoundLineType = model::CompoundLineType::Double; break; + case XML_thickThin: mpLineStyle->meCompoundLineType = model::CompoundLineType::ThickThin_Double; break; + case XML_thinThick: mpLineStyle->meCompoundLineType = model::CompoundLineType::ThinThick_Double; break; + case XML_tri: mpLineStyle->meCompoundLineType = model::CompoundLineType::Triple; break; + default: + mpLineStyle->meCompoundLineType = model::CompoundLineType::Unset; break; + } + + switch (rAttribs.getToken(XML_algn, XML_TOKEN_INVALID)) + { + case XML_ctr: mpLineStyle->mePenAlignment = model::PenAlignmentType::Center; break; + case XML_in: mpLineStyle->mePenAlignment = model::PenAlignmentType::Inset; break; + default: + mpLineStyle->mePenAlignment = model::PenAlignmentType::Unset; break; + } + } } LinePropertiesContext::~LinePropertiesContext() @@ -55,12 +90,42 @@ ContextHandlerRef LinePropertiesContext::onCreateContext( sal_Int32 nElement, co case A_TOKEN( solidFill ): case A_TOKEN( gradFill ): case A_TOKEN( pattFill ): - return FillPropertiesContext::createFillContext(*this, nElement, rAttribs, mrLineProperties.maLineFill, nullptr); + { + model::FillStyle* pFillStyle = nullptr; + if (mpLineStyle) + { + pFillStyle = &mpLineStyle->maLineFillStyle; + } + return FillPropertiesContext::createFillContext(*this, nElement, rAttribs, mrLineProperties.maLineFill, pFillStyle); + } break; // LineDashPropertiesGroup case A_TOKEN( prstDash ): // CT_PresetLineDashProperties + { mrLineProperties.moPresetDash = rAttribs.getToken( XML_val ); + + if (mpLineStyle) + { + auto& rLineDash = mpLineStyle->maLineDash; + switch (rAttribs.getToken(XML_val, XML_TOKEN_INVALID)) + { + case XML_solid: rLineDash.mePresetType = model::PresetDashType::Solid; break; + case XML_dot: rLineDash.mePresetType = model::PresetDashType::Dot; break; + case XML_dash: rLineDash.mePresetType = model::PresetDashType::Dash; break; + case XML_lgDash: rLineDash.mePresetType = model::PresetDashType::LargeDash; break; + case XML_dashDot: rLineDash.mePresetType = model::PresetDashType::DashDot; break; + case XML_lgDashDot: rLineDash.mePresetType = model::PresetDashType::LargeDashDot; break; + case XML_lgDashDotDot: rLineDash.mePresetType = model::PresetDashType::LargeDashDotDot; break; + case XML_sysDash: rLineDash.mePresetType = model::PresetDashType::SystemDash; break; + case XML_sysDot: rLineDash.mePresetType = model::PresetDashType::SystemDot; break; + case XML_sysDashDot: rLineDash.mePresetType = model::PresetDashType::SystemDashDot; break; + case XML_sysDashDotDot: rLineDash.mePresetType = model::PresetDashType::SystemDashDotDot; break; + default: + rLineDash.mePresetType = model::PresetDashType::Unset; break; + } + } + } break; case A_TOKEN( custDash ): // CT_DashStopList return this; @@ -73,41 +138,46 @@ ContextHandlerRef LinePropertiesContext::onCreateContext( sal_Int32 nElement, co // as 1000th's of a percent without a trailing percent sign. // The code below takes care of both scenarios by converting to '1000th of a percent' always OUString aStr; - sal_Int32 nDash = 0; + sal_Int32 nDashLength = 0; aStr = rAttribs.getStringDefaulted( XML_d); if ( aStr.endsWith("%") ) { // Ends with a '%' aStr = aStr.copy(0, aStr.getLength() - 1); aStr = aStr.trim(); - nDash = aStr.toInt32(); + nDashLength = aStr.toInt32(); // Convert to 1000th of a percent - nDash *= 1000; + nDashLength *= 1000; } else { - nDash = rAttribs.getInteger( XML_d, 0 ); + nDashLength = rAttribs.getInteger( XML_d, 0 ); } - sal_Int32 nSp = 0; + sal_Int32 nSpaceLength = 0; aStr = rAttribs.getStringDefaulted( XML_sp); if ( aStr.endsWith("%") ) { // Ends with a '%' aStr = aStr.copy(0, aStr.getLength() - 1); aStr = aStr.trim(); - nSp = aStr.toInt32(); + nSpaceLength = aStr.toInt32(); // Convert to 1000th of a percent - nSp *= 1000; + nSpaceLength *= 1000; } else { - nSp = rAttribs.getInteger( XML_sp, 0 ); + nSpaceLength = rAttribs.getInteger( XML_sp, 0 ); } - mrLineProperties.maCustomDash.emplace_back( nDash, nSp ); + mrLineProperties.maCustomDash.emplace_back( nDashLength, nSpaceLength ); + + if (mpLineStyle) + { + mpLineStyle->maLineDash.maCustomList.push_back({ nDashLength, nSpaceLength }); + } } break; @@ -115,7 +185,27 @@ ContextHandlerRef LinePropertiesContext::onCreateContext( sal_Int32 nElement, co case A_TOKEN( round ): case A_TOKEN( bevel ): case A_TOKEN( miter ): - mrLineProperties.moLineJoint = getBaseToken( nElement ); + { + sal_Int32 nToken = getBaseToken(nElement); + mrLineProperties.moLineJoint = nToken; + + if (mpLineStyle) + { + switch (nToken) + { + case XML_round: mpLineStyle->maLineJoin.meType = model::LineJoinType::Round; break; + case XML_bevel: mpLineStyle->maLineJoin.meType = model::LineJoinType::Bevel; break; + case XML_miter: mpLineStyle->maLineJoin.meType = model::LineJoinType::Miter; break; + default: + mpLineStyle->maLineJoin.meType = model::LineJoinType::Miter; + } + if (nToken == XML_miter) + { + sal_Int32 nMiterLimit = rAttribs.getInteger(XML_lim, 0); + mpLineStyle->maLineJoin.mnMiterLimit = nMiterLimit; + } + } + } break; case A_TOKEN( headEnd ): // CT_LineEndProperties @@ -126,6 +216,54 @@ ContextHandlerRef LinePropertiesContext::onCreateContext( sal_Int32 nElement, co rArrowProps.moArrowType = rAttribs.getToken( XML_type ); rArrowProps.moArrowWidth = rAttribs.getToken( XML_w ); rArrowProps.moArrowLength = rAttribs.getToken( XML_len ); + + if (mpLineStyle) + { + model::LineEndType eLineEndType = model::LineEndType::None; + switch (rAttribs.getToken(XML_type, XML_none)) + { + case XML_triangle: eLineEndType = model::LineEndType::Triangle; break; + case XML_stealth: eLineEndType = model::LineEndType::Stealth; break; + case XML_diamond: eLineEndType = model::LineEndType::Diamond; break; + case XML_oval: eLineEndType = model::LineEndType::Oval; break; + case XML_arrow: eLineEndType = model::LineEndType::Arrow; break; + default: + case XML_none: eLineEndType = model::LineEndType::None; break; + } + + model::LineEndLength eLineEndLength = model::LineEndLength::Unset; + switch (rAttribs.getToken(XML_len, XML_TOKEN_INVALID)) + { + case XML_sm: eLineEndLength = model::LineEndLength::Small; break; + case XML_med: eLineEndLength = model::LineEndLength::Medium; break; + case XML_lg: eLineEndLength = model::LineEndLength::Large; break; + default: + break; + } + + model::LineEndWidth eLineEndWidth = model::LineEndWidth::Unset; + switch (rAttribs.getToken(XML_w, XML_TOKEN_INVALID)) + { + case XML_sm: eLineEndWidth = model::LineEndWidth::Small; break; + case XML_med: eLineEndWidth = model::LineEndWidth::Medium; break; + case XML_lg: eLineEndWidth = model::LineEndWidth::Large; break; + default: + break; + } + + if (nElement == A_TOKEN(tailEnd)) + { + mpLineStyle->maTailEnd.meType = eLineEndType; + mpLineStyle->maTailEnd.meLength = eLineEndLength; + mpLineStyle->maTailEnd.meWidth = eLineEndWidth; + } + else if (nElement == A_TOKEN(headEnd)) + { + mpLineStyle->maHeadEnd.meType = eLineEndType; + mpLineStyle->maHeadEnd.meLength = eLineEndLength; + mpLineStyle->maHeadEnd.meWidth = eLineEndWidth; + } + } } break; } diff --git a/oox/source/drawingml/themeelementscontext.cxx b/oox/source/drawingml/themeelementscontext.cxx index ae38d3eb8d43..c3230d66039f 100644 --- a/oox/source/drawingml/themeelementscontext.cxx +++ b/oox/source/drawingml/themeelementscontext.cxx @@ -106,28 +106,33 @@ namespace { class LineStyleListContext : public ContextHandler2 { public: - LineStyleListContext( ContextHandler2Helper const & rParent, LineStyleList& rLineStyleList ); + LineStyleListContext(ContextHandler2Helper const & rParent, LineStyleList& rLineStyleList, model::FormatScheme& rFormatScheme); virtual ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) override; private: + model::FormatScheme& mrFormatScheme; LineStyleList& mrLineStyleList; }; } -LineStyleListContext::LineStyleListContext( ContextHandler2Helper const & rParent, LineStyleList& rLineStyleList ) : - ContextHandler2( rParent ), - mrLineStyleList( rLineStyleList ) +LineStyleListContext::LineStyleListContext( ContextHandler2Helper const & rParent, LineStyleList& rLineStyleList, model::FormatScheme& rFormatScheme) + : ContextHandler2(rParent) + , mrFormatScheme(rFormatScheme) + , mrLineStyleList(rLineStyleList) { } ContextHandlerRef LineStyleListContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { - switch( nElement ) + switch (nElement) { - case A_TOKEN( ln ): + case A_TOKEN(ln): + { mrLineStyleList.push_back( std::make_shared<LineProperties>( ) ); - return new LinePropertiesContext( *this, rAttribs, *mrLineStyleList.back() ); + model::LineStyle* pLineStyle = mrFormatScheme.addLineStyle(); + return new LinePropertiesContext(*this, rAttribs, *mrLineStyleList.back(), pLineStyle); + } } return nullptr; } @@ -335,9 +340,9 @@ ContextHandlerRef ThemeElementsContext::onCreateContext(sal_Int32 nElement, cons } case A_TOKEN( fillStyleLst ): // CT_FillStyleList - return new FillStyleListContext( *this, mrOoxTheme.getFillStyleList(), mrTheme.getFormatScheme()); + return new FillStyleListContext(*this, mrOoxTheme.getFillStyleList(), mrTheme.getFormatScheme()); case A_TOKEN( lnStyleLst ): // CT_LineStyleList - return new LineStyleListContext( *this, mrOoxTheme.getLineStyleList() ); + return new LineStyleListContext(*this, mrOoxTheme.getLineStyleList(), mrTheme.getFormatScheme()); case A_TOKEN( effectStyleLst ): // CT_EffectStyleList return new EffectStyleListContext( *this, mrOoxTheme.getEffectStyleList() ); case A_TOKEN( bgFillStyleLst ): // CT_BackgroundFillStyleList diff --git a/sw/qa/core/theme/ThemeTest.cxx b/sw/qa/core/theme/ThemeTest.cxx index f9270663a5bb..27517e64223c 100644 --- a/sw/qa/core/theme/ThemeTest.cxx +++ b/sw/qa/core/theme/ThemeTest.cxx @@ -85,6 +85,7 @@ CPPUNIT_TEST_FIXTURE(SwCoreThemeTest, testDrawPageThemeExistsDOCX) model::FormatScheme const& rFormatScheme = pTheme->getFormatScheme(); CPPUNIT_ASSERT_EQUAL(size_t(3), rFormatScheme.getFillStyleList().size()); + CPPUNIT_ASSERT_EQUAL(size_t(3), rFormatScheme.getLineStyleList().size()); CPPUNIT_ASSERT_EQUAL(size_t(3), rFormatScheme.getBackgroundFillStyleList().size()); // Fill style 1 @@ -257,6 +258,63 @@ CPPUNIT_TEST_FIXTURE(SwCoreThemeTest, testDrawPageThemeExistsDOCX) } } } + + // Line style 1 + { + model::LineStyle const& rLineStyle = rFormatScheme.getLineStyleList().at(0); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6350), rLineStyle.mnWidth); + CPPUNIT_ASSERT_EQUAL(model::CapType::Flat, rLineStyle.meCapType); + CPPUNIT_ASSERT_EQUAL(model::PenAlignmentType::Center, rLineStyle.mePenAlignment); + CPPUNIT_ASSERT_EQUAL(model::CompoundLineType::Single, rLineStyle.meCompoundLineType); + CPPUNIT_ASSERT_EQUAL(model::PresetDashType::Solid, rLineStyle.maLineDash.mePresetType); + CPPUNIT_ASSERT_EQUAL(model::LineJoinType::Miter, rLineStyle.maLineJoin.meType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(800000), rLineStyle.maLineJoin.mnMiterLimit); + + model::FillStyle const& rFillStyle = rLineStyle.maLineFillStyle; + CPPUNIT_ASSERT(rFillStyle.mpFill); + CPPUNIT_ASSERT_EQUAL(model::FillType::Solid, rFillStyle.mpFill->meType); + auto* pSolidFill = static_cast<model::SolidFill*>(rFillStyle.mpFill.get()); + CPPUNIT_ASSERT_EQUAL(model::ColorType::Placeholder, pSolidFill->maColorDefinition.meType); + CPPUNIT_ASSERT_EQUAL(size_t(0), pSolidFill->maColorDefinition.maTransformations.size()); + } + + // Line style 2 + { + model::LineStyle const& rLineStyle = rFormatScheme.getLineStyleList().at(1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(12700), rLineStyle.mnWidth); + CPPUNIT_ASSERT_EQUAL(model::CapType::Flat, rLineStyle.meCapType); + CPPUNIT_ASSERT_EQUAL(model::PenAlignmentType::Center, rLineStyle.mePenAlignment); + CPPUNIT_ASSERT_EQUAL(model::CompoundLineType::Single, rLineStyle.meCompoundLineType); + CPPUNIT_ASSERT_EQUAL(model::PresetDashType::Solid, rLineStyle.maLineDash.mePresetType); + CPPUNIT_ASSERT_EQUAL(model::LineJoinType::Miter, rLineStyle.maLineJoin.meType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(800000), rLineStyle.maLineJoin.mnMiterLimit); + + model::FillStyle const& rFillStyle = rLineStyle.maLineFillStyle; + CPPUNIT_ASSERT(rFillStyle.mpFill); + CPPUNIT_ASSERT_EQUAL(model::FillType::Solid, rFillStyle.mpFill->meType); + auto* pSolidFill = static_cast<model::SolidFill*>(rFillStyle.mpFill.get()); + CPPUNIT_ASSERT_EQUAL(model::ColorType::Placeholder, pSolidFill->maColorDefinition.meType); + CPPUNIT_ASSERT_EQUAL(size_t(0), pSolidFill->maColorDefinition.maTransformations.size()); + } + + // Line style 3 + { + model::LineStyle const& rLineStyle = rFormatScheme.getLineStyleList().at(2); + CPPUNIT_ASSERT_EQUAL(sal_Int32(19050), rLineStyle.mnWidth); + CPPUNIT_ASSERT_EQUAL(model::CapType::Flat, rLineStyle.meCapType); + CPPUNIT_ASSERT_EQUAL(model::PenAlignmentType::Center, rLineStyle.mePenAlignment); + CPPUNIT_ASSERT_EQUAL(model::CompoundLineType::Single, rLineStyle.meCompoundLineType); + CPPUNIT_ASSERT_EQUAL(model::PresetDashType::Solid, rLineStyle.maLineDash.mePresetType); + CPPUNIT_ASSERT_EQUAL(model::LineJoinType::Miter, rLineStyle.maLineJoin.meType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(800000), rLineStyle.maLineJoin.mnMiterLimit); + + model::FillStyle const& rFillStyle = rLineStyle.maLineFillStyle; + CPPUNIT_ASSERT(rFillStyle.mpFill); + CPPUNIT_ASSERT_EQUAL(model::FillType::Solid, rFillStyle.mpFill->meType); + auto* pSolidFill = static_cast<model::SolidFill*>(rFillStyle.mpFill.get()); + CPPUNIT_ASSERT_EQUAL(model::ColorType::Placeholder, pSolidFill->maColorDefinition.meType); + CPPUNIT_ASSERT_EQUAL(size_t(0), pSolidFill->maColorDefinition.maTransformations.size()); + } } CPPUNIT_TEST_FIXTURE(SwCoreThemeTest, testDrawPageThemeExistsODT)