Kaydet (Commit) 5013ac55 authored tarafından Tobias Lippert's avatar Tobias Lippert Kaydeden (comit) Matúš Kukan

fdo#84061 Fix setting text style sheet listeners in SdrTextObj

The code in SdrTextObj::ImpSetTextStyleSheetListeners is obviously not
working correctly.

The families of the stylesheets are appended to the name of the family
for further usage.
An encoded string looks like "STYLE_NAME|3     "
The family is then extracted by copying the first (length-6) bytes,
e.g., "STYLE_NAME" in this example. Then another copy starting a
position 1 is created, e.g., "TYLE_NAME". This string is cast to an
Int32. Since this is not possible, 0 is returned, and the originally
stored family is lost.

This patch corrects this behavior, and adds a unit test.

Change-Id: I60c0add6e4b670acbbc264cc77672452f282f737
Reviewed-on: https://gerrit.libreoffice.org/10818Reviewed-by: 's avatarMatúš Kukan <matus.kukan@collabora.com>
Tested-by: 's avatarMatúš Kukan <matus.kukan@collabora.com>
üst 234b5de7
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <svx/svdoattr.hxx> #include <svx/svdoattr.hxx>
#include <svx/svdtrans.hxx> #include <svx/svdtrans.hxx>
#include <tools/datetime.hxx> #include <tools/datetime.hxx>
#include <rsc/rscsfx.hxx>
#include <svx/xtextit0.hxx> #include <svx/xtextit0.hxx>
#include <svx/svdtext.hxx> #include <svx/svdtext.hxx>
#include <vector> #include <vector>
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
class OutlinerParaObject; class OutlinerParaObject;
class SdrOutliner; class SdrOutliner;
class SdrTextObj; class SdrTextObj;
class SdrTextObjTest;
class SvxFieldItem; class SvxFieldItem;
class ImpSdrObjTextLink; class ImpSdrObjTextLink;
class EditStatus; class EditStatus;
...@@ -271,6 +273,12 @@ private: ...@@ -271,6 +273,12 @@ private:
SVX_DLLPRIVATE ImpSdrObjTextLinkUserData* GetLinkUserData() const; SVX_DLLPRIVATE ImpSdrObjTextLinkUserData* GetLinkUserData() const;
// void ImpCheckItemSetChanges(const SfxItemSet& rAttr); // void ImpCheckItemSetChanges(const SfxItemSet& rAttr);
/** Appends the style family to a provided style name */
static void AppendFamilyToStyleName(OUString& styleName, SfxStyleFamily family);
/** Reads the style family from a style name to which the family has been appended. */
static SfxStyleFamily ReadFamilyFromStyleName(const OUString& styleName);
protected: protected:
bool ImpCanConvTextToCurve() const; bool ImpCanConvTextToCurve() const;
SdrObject* ImpConvertMakeObj(const basegfx::B2DPolyPolygon& rPolyPolygon, bool bClosed, bool bBezier, bool bNoSetAttr = false) const; SdrObject* ImpConvertMakeObj(const basegfx::B2DPolyPolygon& rPolyPolygon, bool bClosed, bool bBezier, bool bNoSetAttr = false) const;
...@@ -591,6 +599,8 @@ public: ...@@ -591,6 +599,8 @@ public:
Also checks for one empty paragraph. Also checks for one empty paragraph.
*/ */
static bool HasTextImpl( SdrOutliner* pOutliner ); static bool HasTextImpl( SdrOutliner* pOutliner );
friend class ::SdrTextObjTest;
}; };
......
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# 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/.
#
$(eval $(call gb_CppunitTest_CppunitTest,svx_unit))
$(eval $(call gb_CppunitTest_use_external,svx_unit,boost_headers))
$(eval $(call gb_CppunitTest_use_api,svx_unit, \
offapi \
udkapi \
))
$(eval $(call gb_CppunitTest_set_include,svx_unit,\
$$(INCLUDE) \
))
$(eval $(call gb_CppunitTest_add_exception_objects,svx_unit, \
svx/qa/unit/svdraw/test_SdrTextObject \
))
$(eval $(call gb_CppunitTest_use_libraries,svx_unit, \
sal \
svxcore \
))
# vim: set noet sw=4 ts=4:
...@@ -32,6 +32,10 @@ $(eval $(call gb_Module_add_l10n_targets,svx,\ ...@@ -32,6 +32,10 @@ $(eval $(call gb_Module_add_l10n_targets,svx,\
UIConfig_svx \ UIConfig_svx \
)) ))
$(eval $(call gb_Module_add_check_targets,svx,\
CppunitTest_svx_unit \
))
ifneq (,$(filter DESKTOP,$(BUILD_TYPE))) ifneq (,$(filter DESKTOP,$(BUILD_TYPE)))
$(eval $(call gb_Module_add_targets,svx,\ $(eval $(call gb_Module_add_targets,svx,\
Executable_gengal \ Executable_gengal \
......
/* -*- 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 <svx/svdotext.hxx>
#include <rtl/ustring.hxx>
#include <cppunit/TestAssert.h>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <boost/foreach.hpp>
class SdrTextObjTest : public CppUnit::TestFixture {
public:
void AllFamiliesCanBeRestoredFromSavedString();
CPPUNIT_TEST_SUITE(SdrTextObjTest);
CPPUNIT_TEST(AllFamiliesCanBeRestoredFromSavedString);
CPPUNIT_TEST_SUITE_END();
};
void SdrTextObjTest::AllFamiliesCanBeRestoredFromSavedString() {
std::vector<SfxStyleFamily> allFamilies;
allFamilies.push_back(SFX_STYLE_FAMILY_CHAR);
allFamilies.push_back(SFX_STYLE_FAMILY_PARA);
allFamilies.push_back(SFX_STYLE_FAMILY_PAGE);
allFamilies.push_back(SFX_STYLE_FAMILY_PSEUDO);
BOOST_FOREACH(SfxStyleFamily family, allFamilies) {
OUString styleName = "styleName";
SdrTextObj::AppendFamilyToStyleName(styleName, family);
SfxStyleFamily readFamily = SdrTextObj::ReadFamilyFromStyleName(styleName);
CPPUNIT_ASSERT_EQUAL(family, readFamily);
}
}
CPPUNIT_TEST_SUITE_REGISTRATION(SdrTextObjTest);
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -50,6 +50,12 @@ ...@@ -50,6 +50,12 @@
#include <set> #include <set>
namespace {
// The style family which is appended to the style names is padded to this many characters.
const short PADDING_LENGTH_FOR_STYLE_FAMILY = 5;
// this character will be used to pad the style families when they are appended to the style names
const sal_Char PADDING_CHARACTER_FOR_STYLE_FAMILY = ' ';
}
bool SdrTextObj::AdjustTextFrameWidthAndHeight(Rectangle& rR, bool bHgt, bool bWdt) const bool SdrTextObj::AdjustTextFrameWidthAndHeight(Rectangle& rR, bool bHgt, bool bWdt) const
{ {
...@@ -236,18 +242,14 @@ void SdrTextObj::ImpSetTextStyleSheetListeners() ...@@ -236,18 +242,14 @@ void SdrTextObj::ImpSetTextStyleSheetListeners()
SfxStyleFamily eStyleFam; SfxStyleFamily eStyleFam;
sal_Int32 nParaAnz=rTextObj.GetParagraphCount(); sal_Int32 nParaAnz=rTextObj.GetParagraphCount();
for(sal_Int32 nParaNum(0); nParaNum < nParaAnz; nParaNum++) for(sal_Int32 nParaNum(0); nParaNum < nParaAnz; nParaNum++)
{ {
rTextObj.GetStyleSheet(nParaNum, aStyleName, eStyleFam); rTextObj.GetStyleSheet(nParaNum, aStyleName, eStyleFam);
if (!aStyleName.isEmpty()) if (!aStyleName.isEmpty())
{ {
OUStringBuffer aFam; AppendFamilyToStyleName(aStyleName, eStyleFam);
aFam.append(static_cast<sal_Int32>(eStyleFam));
comphelper::string::padToLength(aFam, 5, ' ');
aStyleName += OUString('|');
aStyleName += aFam.makeStringAndClear();
bool bFnd(false); bool bFnd(false);
sal_uInt32 nNum(aStyleNames.size()); sal_uInt32 nNum(aStyleNames.size());
...@@ -273,14 +275,7 @@ void SdrTextObj::ImpSetTextStyleSheetListeners() ...@@ -273,14 +275,7 @@ void SdrTextObj::ImpSetTextStyleSheetListeners()
OUString aName = aStyleNames.back(); OUString aName = aStyleNames.back();
aStyleNames.pop_back(); aStyleNames.pop_back();
OUString aFam = aName.copy(0, aName.getLength() - 6); SfxStyleFamily eFam = ReadFamilyFromStyleName(aName);
aFam = aFam.copy(1);
aFam = comphelper::string::stripEnd(aFam, ' ');
sal_uInt16 nFam = (sal_uInt16)aFam.toInt32();
SfxStyleFamily eFam = (SfxStyleFamily)nFam;
SfxStyleSheetBase* pStyleBase = pStylePool->Find(aName,eFam); SfxStyleSheetBase* pStyleBase = pStylePool->Find(aName,eFam);
SfxStyleSheet* pStyle = PTR_CAST(SfxStyleSheet,pStyleBase); SfxStyleSheet* pStyle = PTR_CAST(SfxStyleSheet,pStyleBase);
if (pStyle!=NULL && pStyle!=GetStyleSheet()) { if (pStyle!=NULL && pStyle!=GetStyleSheet()) {
...@@ -372,4 +367,24 @@ bool SdrTextObj::HasText() const ...@@ -372,4 +367,24 @@ bool SdrTextObj::HasText() const
return bHasText; return bHasText;
} }
void SdrTextObj::AppendFamilyToStyleName(OUString& styleName, SfxStyleFamily family)
{
OUStringBuffer aFam;
aFam.append(static_cast<sal_Int32>(family));
comphelper::string::padToLength(aFam, PADDING_LENGTH_FOR_STYLE_FAMILY , PADDING_CHARACTER_FOR_STYLE_FAMILY);
styleName += OUString('|');
styleName += aFam.makeStringAndClear();
}
SfxStyleFamily SdrTextObj::ReadFamilyFromStyleName(const OUString& styleName)
{
OUString familyString = styleName.copy(styleName.getLength() - PADDING_LENGTH_FOR_STYLE_FAMILY);
familyString = comphelper::string::stripEnd(familyString, PADDING_CHARACTER_FOR_STYLE_FAMILY);
sal_uInt16 nFam = static_cast<sal_uInt16>(familyString.toInt32());
assert(nFam != 0);
return static_cast<SfxStyleFamily>(nFam);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment