diff --git a/starmath/CppunitTest_starmath_import.mk b/starmath/CppunitTest_starmath_import.mk index 15c9053facfb..0139b590bac6 100644 --- a/starmath/CppunitTest_starmath_import.mk +++ b/starmath/CppunitTest_starmath_import.mk @@ -19,6 +19,7 @@ $(eval $(call gb_CppunitTest_use_external,starmath_import,boost_headers)) $(eval $(call gb_CppunitTest_use_sdk_api,starmath_import)) $(eval $(call gb_CppunitTest_add_exception_objects,starmath_import,\ + starmath/qa/cppunit/test_import \ starmath/qa/extras/mmlimport-test \ )) diff --git a/starmath/inc/unomodel.hxx b/starmath/inc/unomodel.hxx index 6c2ecbbdd4b0..6292b2825508 100644 --- a/starmath/inc/unomodel.hxx +++ b/starmath/inc/unomodel.hxx @@ -27,6 +27,8 @@ #include #include +#include "format.hxx" + inline constexpr OUStringLiteral PRTUIOPT_TITLE_ROW = u"TitleRow"; inline constexpr OUStringLiteral PRTUIOPT_FORMULA_TEXT = u"FormulaText"; inline constexpr OUStringLiteral PRTUIOPT_BORDER = u"Border"; @@ -48,6 +50,8 @@ class SmModel final : public SfxBaseModel, { std::unique_ptr m_pPrintUIOptions; + SmFace maFonts[FNT_END + 1]; + virtual void _setPropertyValues( const comphelper::PropertyMapEntry** ppEntries, const css::uno::Any* pValues ) override; virtual void _getPropertyValues( const comphelper::PropertyMapEntry** ppEntries, css::uno::Any* pValue ) override; public: diff --git a/starmath/qa/cppunit/data/font-styles.odf b/starmath/qa/cppunit/data/font-styles.odf new file mode 100644 index 000000000000..3b58386c2f1d Binary files /dev/null and b/starmath/qa/cppunit/data/font-styles.odf differ diff --git a/starmath/qa/cppunit/test_import.cxx b/starmath/qa/cppunit/test_import.cxx new file mode 100644 index 000000000000..5486dfe43e0c --- /dev/null +++ b/starmath/qa/cppunit/test_import.cxx @@ -0,0 +1,91 @@ +/* -*- 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 + +using namespace ::com::sun::star; + +namespace +{ +class Test : public UnoApiTest +{ +public: + Test() + : UnoApiTest("starmath/qa/cppunit/data/") + { + } + + void testFontStyles(); + + CPPUNIT_TEST_SUITE(Test); + CPPUNIT_TEST(testFontStyles); + CPPUNIT_TEST_SUITE_END(); +}; + +void Test::testFontStyles() +{ + // tdf#143213 + loadFromURL(u"font-styles.odf"); + SfxBaseModel* pModel = dynamic_cast(mxComponent.get()); + SmDocShell* pDocShell = static_cast(pModel->GetObjectShell()); + + const SmFormat& aFormat = pDocShell->GetFormat(); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NORMAL, aFormat.GetFont(FNT_MATH).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, aFormat.GetFont(FNT_MATH).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_MATH).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NORMAL, aFormat.GetFont(FNT_VARIABLE).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, aFormat.GetFont(FNT_VARIABLE).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_VARIABLE).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NORMAL, aFormat.GetFont(FNT_FUNCTION).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, aFormat.GetFont(FNT_FUNCTION).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_FUNCTION).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NORMAL, aFormat.GetFont(FNT_NUMBER).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, aFormat.GetFont(FNT_NUMBER).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_NUMBER).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NORMAL, aFormat.GetFont(FNT_TEXT).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_BOLD, aFormat.GetFont(FNT_TEXT).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_TEXT).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NONE, aFormat.GetFont(FNT_SERIF).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_NORMAL, aFormat.GetFont(FNT_SERIF).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_SERIF).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NONE, aFormat.GetFont(FNT_SANS).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_NORMAL, aFormat.GetFont(FNT_SANS).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_SANS).GetFontSize().Height()); + + CPPUNIT_ASSERT_EQUAL(ITALIC_NONE, aFormat.GetFont(FNT_FIXED).GetItalic()); + CPPUNIT_ASSERT_EQUAL(WEIGHT_NORMAL, aFormat.GetFont(FNT_FIXED).GetWeight()); + CPPUNIT_ASSERT_EQUAL(aFormat.GetBaseSize().Height(), + aFormat.GetFont(FNT_FIXED).GetFontSize().Height()); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(Test); + +} // namespace + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx index 64ca28e692e1..a75dfe68799c 100644 --- a/starmath/source/unomodel.cxx +++ b/starmath/source/unomodel.cxx @@ -434,16 +434,7 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* *pValues >>= sFontName; if(sFontName.isEmpty()) throw IllegalArgumentException(); - - if(aFormat.GetFont((*ppEntries)->mnMemberId).GetFamilyName() != sFontName) - { - const SmFace rOld = aFormat.GetFont((*ppEntries)->mnMemberId); - - SmFace aSet( sFontName, rOld.GetFontSize() ); - aSet.SetBorderWidth( rOld.GetBorderWidth() ); - aSet.SetAlignment( ALIGN_BASELINE ); - aFormat.SetFont( (*ppEntries)->mnMemberId, aSet ); - } + maFonts[(*ppEntries)->mnMemberId].SetFamilyName(sFontName); } break; case HANDLE_CUSTOM_FONT_FIXED_POSTURE: @@ -458,9 +449,7 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* std::optional bVal = o3tl::tryAccess(*pValues); if(!bVal.has_value()) throw IllegalArgumentException(); - vcl::Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId)); - aNewFont.SetItalic(*bVal ? ITALIC_NORMAL : ITALIC_NONE); - aFormat.SetFont((*ppEntries)->mnMemberId, aNewFont); + maFonts[(*ppEntries)->mnMemberId].SetItalic(*bVal ? ITALIC_NORMAL : ITALIC_NONE); } break; case HANDLE_CUSTOM_FONT_FIXED_WEIGHT : @@ -475,9 +464,7 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* std::optional bVal = o3tl::tryAccess(*pValues); if(!bVal.has_value()) throw IllegalArgumentException(); - vcl::Font aNewFont(aFormat.GetFont((*ppEntries)->mnMemberId)); - aNewFont.SetWeight(*bVal ? WEIGHT_BOLD : WEIGHT_NORMAL); - aFormat.SetFont((*ppEntries)->mnMemberId, aNewFont); + maFonts[(*ppEntries)->mnMemberId].SetWeight(*bVal ? WEIGHT_BOLD : WEIGHT_NORMAL); } break; case HANDLE_BASE_FONT_HEIGHT : @@ -493,7 +480,7 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* // apply base size to fonts const Size aTmp( aFormat.GetBaseSize() ); for (sal_uInt16 i = FNT_BEGIN; i <= FNT_END; i++) - aFormat.SetFontSize(i, aTmp); + maFonts[i].SetSize(aTmp); } break; case HANDLE_RELATIVE_FONT_HEIGHT_TEXT : @@ -674,6 +661,42 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* } } + // tdf#143213 + // Collect all font settings and apply them at the end, since the font name change can be seen + // after italic or bold settings and would then override them. + for (sal_uInt16 nFontDesc = FNT_BEGIN; nFontDesc <= FNT_END; ++nFontDesc) + { + const SmFace& rFont = maFonts[nFontDesc]; + if (aFormat.GetFont(nFontDesc).GetFamilyName() != rFont.GetFamilyName()) + { + const SmFace rOld = aFormat.GetFont(nFontDesc); + + SmFace aSet(rFont.GetFamilyName(), rOld.GetFontSize()); + aSet.SetBorderWidth(rOld.GetBorderWidth()); + aSet.SetAlignment(ALIGN_BASELINE); + aFormat.SetFont(nFontDesc, aSet); + } + + if (aFormat.GetFont(nFontDesc).GetItalic() != rFont.GetItalic()) + { + vcl::Font aNewFont(aFormat.GetFont(nFontDesc)); + aNewFont.SetItalic(rFont.GetItalic()); + aFormat.SetFont(nFontDesc, aNewFont); + } + + if (aFormat.GetFont(nFontDesc).GetWeight() != rFont.GetWeight()) + { + vcl::Font aNewFont(aFormat.GetFont(nFontDesc)); + aNewFont.SetWeight(rFont.GetWeight()); + aFormat.SetFont(nFontDesc, aNewFont); + } + + if (aFormat.GetFont(nFontDesc).GetFontSize() != rFont.GetFontSize()) + { + aFormat.SetFontSize(nFontDesc, rFont.GetFontSize()); + } + } + pDocSh->SetFormat( aFormat ); // #i67283# since about all of the above changes are likely to change