diff options
author | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2015-05-24 17:21:47 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2015-05-24 21:50:10 +0200 |
commit | e9bb2e6f09d711833e659db3b229326d5e997266 (patch) | |
tree | a035b32b69876853dfd6be0f4a433712c298ff64 | |
parent | 27e1a92d3bddf3c3e8595256e67aff006a402b6a (diff) |
tdf#62525: use cow_wrapper for SdrTextAttribute
Change-Id: I8daf6d155c631cbdb850a6af95c92a578905d6e6
-rw-r--r-- | include/svx/sdr/attribute/sdrtextattribute.hxx | 7 | ||||
-rw-r--r-- | svx/source/sdr/attribute/sdrtextattribute.cxx | 91 |
2 files changed, 25 insertions, 73 deletions
diff --git a/include/svx/sdr/attribute/sdrtextattribute.hxx b/include/svx/sdr/attribute/sdrtextattribute.hxx index 637b769faa97..66e3e7ace384 100644 --- a/include/svx/sdr/attribute/sdrtextattribute.hxx +++ b/include/svx/sdr/attribute/sdrtextattribute.hxx @@ -24,7 +24,7 @@ #include <svx/xenum.hxx> #include <editeng/outlobj.hxx> #include <svx/sdtaitm.hxx> - +#include <o3tl/cow_wrapper.hxx> // predefines @@ -50,8 +50,11 @@ namespace drawinglayer { class SdrTextAttribute { + public: + typedef o3tl::cow_wrapper< ImpSdrTextAttribute > ImplType; + private: - ImpSdrTextAttribute* mpSdrTextAttribute; + ImplType mpSdrTextAttribute; public: /// constructors/assignmentoperator/destructor diff --git a/svx/source/sdr/attribute/sdrtextattribute.cxx b/svx/source/sdr/attribute/sdrtextattribute.cxx index 57d2dfd065d7..45b55fbe84ba 100644 --- a/svx/source/sdr/attribute/sdrtextattribute.cxx +++ b/svx/source/sdr/attribute/sdrtextattribute.cxx @@ -25,7 +25,7 @@ #include <editeng/editobj.hxx> #include <editeng/flditem.hxx> #include <svx/sdr/properties/properties.hxx> - +#include <rtl/instance.hxx> namespace drawinglayer @@ -35,9 +35,6 @@ namespace drawinglayer class ImpSdrTextAttribute { public: - // refcounter - sal_uInt32 mnRefCount; - // all-text attributes. The SdrText itself and a copy // of the OPO const SdrText* mpSdrText; @@ -90,8 +87,7 @@ namespace drawinglayer bool bInEditMode, bool bFixedCellHeight, bool bWrongSpell) - : mnRefCount(0), - mpSdrText(pSdrText), + : mpSdrText(pSdrText), mpOutlinerParaObject(new OutlinerParaObject(rOutlinerParaObject)), maSdrFormTextAttribute(), maTextLeftDistance(aTextLeftDistance), @@ -128,8 +124,7 @@ namespace drawinglayer } ImpSdrTextAttribute() - : mnRefCount(0), - mpSdrText(0), + : mpSdrText(0), mpOutlinerParaObject(0), maSdrFormTextAttribute(), maTextLeftDistance(0), @@ -151,14 +146,6 @@ namespace drawinglayer { } - ~ImpSdrTextAttribute() - { - if(mpOutlinerParaObject) - { - delete mpOutlinerParaObject; - } - } - // data read access const SdrText& getSdrText() const { @@ -241,24 +228,14 @@ namespace drawinglayer && isFixedCellHeight() == rCandidate.isFixedCellHeight() && isWrongSpell() == rCandidate.isWrongSpell()); } - - static ImpSdrTextAttribute* get_global_default() - { - static ImpSdrTextAttribute* pDefault = 0; - - if(!pDefault) - { - // use default constructor - pDefault = new ImpSdrTextAttribute(); - - // never delete; start with RefCount 1, not 0 - pDefault->mnRefCount++; - } - - return pDefault; - } }; + namespace + { + struct theGlobalDefault : + public rtl::Static< SdrTextAttribute::ImplType, theGlobalDefault > {}; + } + SdrTextAttribute::SdrTextAttribute( const SdrText& rSdrText, const OutlinerParaObject& rOutlinerParaObject, @@ -278,75 +255,47 @@ namespace drawinglayer bool bInEditMode, bool bFixedCellHeight, bool bWrongSpell) - : mpSdrTextAttribute(new ImpSdrTextAttribute( - &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance, aTextUpperDistance, - aTextRightDistance, aTextLowerDistance, aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, - bFitToSize, bAutoFit, bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell)) + : mpSdrTextAttribute( + ImpSdrTextAttribute( + &rSdrText, rOutlinerParaObject, eFormTextStyle, aTextLeftDistance, + aTextUpperDistance, aTextRightDistance, aTextLowerDistance, + aSdrTextHorzAdjust, aSdrTextVertAdjust, bContour, bFitToSize, bAutoFit, + bHideContour, bBlink, bScroll, bInEditMode, bFixedCellHeight, bWrongSpell)) { } SdrTextAttribute::SdrTextAttribute() - : mpSdrTextAttribute(ImpSdrTextAttribute::get_global_default()) + : mpSdrTextAttribute(theGlobalDefault::get()) { - mpSdrTextAttribute->mnRefCount++; } SdrTextAttribute::SdrTextAttribute(const SdrTextAttribute& rCandidate) : mpSdrTextAttribute(rCandidate.mpSdrTextAttribute) { - mpSdrTextAttribute->mnRefCount++; } SdrTextAttribute::~SdrTextAttribute() { - if(mpSdrTextAttribute->mnRefCount) - { - mpSdrTextAttribute->mnRefCount--; - } - else - { - delete mpSdrTextAttribute; - } } bool SdrTextAttribute::isDefault() const { - return mpSdrTextAttribute == ImpSdrTextAttribute::get_global_default(); + return mpSdrTextAttribute.same_object(theGlobalDefault::get()); } SdrTextAttribute& SdrTextAttribute::operator=(const SdrTextAttribute& rCandidate) { - if(rCandidate.mpSdrTextAttribute != mpSdrTextAttribute) - { - if(mpSdrTextAttribute->mnRefCount) - { - mpSdrTextAttribute->mnRefCount--; - } - else - { - delete mpSdrTextAttribute; - } - - mpSdrTextAttribute = rCandidate.mpSdrTextAttribute; - mpSdrTextAttribute->mnRefCount++; - } - + mpSdrTextAttribute = rCandidate.mpSdrTextAttribute; return *this; } bool SdrTextAttribute::operator==(const SdrTextAttribute& rCandidate) const { - if(rCandidate.mpSdrTextAttribute == mpSdrTextAttribute) - { - return true; - } - + // tdf#87509 default attr is always != non-default attr, even with same values if(rCandidate.isDefault() != isDefault()) - { return false; - } - return (*rCandidate.mpSdrTextAttribute == *mpSdrTextAttribute); + return rCandidate.mpSdrTextAttribute == mpSdrTextAttribute; } const SdrText& SdrTextAttribute::getSdrText() const |