Apply a simple pimpl idiom and rename the old Impl to make it non-Impl.
The old Impl instance is ref-counted, which I'd like to convert to using boost::intrusive_ptr. But to make it happen, we need to really hide this from public header... Change-Id: I1f1e9e500f2112eea04e3e6d661a7dfa74655c62
This commit is contained in:
@@ -32,9 +32,11 @@
|
|||||||
#include <vcl/bitmap.hxx>
|
#include <vcl/bitmap.hxx>
|
||||||
#include <tools/stream.hxx>
|
#include <tools/stream.hxx>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the guts of OutlinerParaObject, refcounted and shared among
|
||||||
class ImplOutlinerParaObject
|
* multiple instances of OutlinerParaObject.
|
||||||
|
*/
|
||||||
|
class OutlinerParaObjData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// data members
|
// data members
|
||||||
@@ -46,7 +48,7 @@ public:
|
|||||||
sal_uInt32 mnRefCount;
|
sal_uInt32 mnRefCount;
|
||||||
|
|
||||||
// constuctor
|
// constuctor
|
||||||
ImplOutlinerParaObject(EditTextObject* pEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc)
|
OutlinerParaObjData(EditTextObject* pEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc)
|
||||||
: mpEditTextObject(pEditTextObject),
|
: mpEditTextObject(pEditTextObject),
|
||||||
maParagraphDataVector(rParagraphDataVector),
|
maParagraphDataVector(rParagraphDataVector),
|
||||||
mbIsEditDoc(bIsEditDoc),
|
mbIsEditDoc(bIsEditDoc),
|
||||||
@@ -57,12 +59,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// destructor
|
// destructor
|
||||||
~ImplOutlinerParaObject()
|
~OutlinerParaObjData()
|
||||||
{
|
{
|
||||||
delete mpEditTextObject;
|
delete mpEditTextObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator==(const ImplOutlinerParaObject& rCandidate) const
|
bool operator==(const OutlinerParaObjData& rCandidate) const
|
||||||
{
|
{
|
||||||
return (*mpEditTextObject == *rCandidate.mpEditTextObject
|
return (*mpEditTextObject == *rCandidate.mpEditTextObject
|
||||||
&& maParagraphDataVector == rCandidate.maParagraphDataVector
|
&& maParagraphDataVector == rCandidate.maParagraphDataVector
|
||||||
@@ -70,69 +72,81 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #i102062#
|
// #i102062#
|
||||||
bool isWrongListEqual(const ImplOutlinerParaObject& rCompare) const
|
bool isWrongListEqual(const OutlinerParaObjData& rCompare) const
|
||||||
{
|
{
|
||||||
return mpEditTextObject->isWrongListEqual(*rCompare.mpEditTextObject);
|
return mpEditTextObject->isWrongListEqual(*rCompare.mpEditTextObject);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct OutlinerParaObject::Impl
|
||||||
|
{
|
||||||
|
OutlinerParaObjData* mpData;
|
||||||
|
|
||||||
|
Impl( const EditTextObject& rTextObj, const ParagraphDataVector& rParaData, bool bIsEditDoc ) :
|
||||||
|
mpData(new OutlinerParaObjData(rTextObj.Clone(), rParaData, bIsEditDoc)) {}
|
||||||
|
|
||||||
|
Impl( const EditTextObject& rTextObj ) :
|
||||||
|
mpData(new OutlinerParaObjData(rTextObj.Clone(), ParagraphDataVector(), true)) {}
|
||||||
|
|
||||||
|
Impl( const Impl& r ) : mpData(r.mpData)
|
||||||
|
{
|
||||||
|
mpData->mnRefCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
~Impl()
|
||||||
|
{
|
||||||
|
if (mpData->mnRefCount)
|
||||||
|
mpData->mnRefCount--;
|
||||||
|
else
|
||||||
|
delete mpData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void OutlinerParaObject::ImplMakeUnique()
|
void OutlinerParaObject::ImplMakeUnique()
|
||||||
{
|
{
|
||||||
if(mpImplOutlinerParaObject->mnRefCount)
|
if (mpImpl->mpData->mnRefCount)
|
||||||
{
|
{
|
||||||
ImplOutlinerParaObject* pNew = new ImplOutlinerParaObject(
|
OutlinerParaObjData* pNew = new OutlinerParaObjData(
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->Clone(),
|
mpImpl->mpData->mpEditTextObject->Clone(),
|
||||||
mpImplOutlinerParaObject->maParagraphDataVector,
|
mpImpl->mpData->maParagraphDataVector,
|
||||||
mpImplOutlinerParaObject->mbIsEditDoc);
|
mpImpl->mpData->mbIsEditDoc);
|
||||||
mpImplOutlinerParaObject->mnRefCount--;
|
mpImpl->mpData->mnRefCount--;
|
||||||
mpImplOutlinerParaObject = pNew;
|
mpImpl->mpData = pNew;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OutlinerParaObject::OutlinerParaObject(const EditTextObject& rEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc)
|
OutlinerParaObject::OutlinerParaObject(
|
||||||
: mpImplOutlinerParaObject(new ImplOutlinerParaObject(rEditTextObject.Clone(), rParagraphDataVector, bIsEditDoc))
|
const EditTextObject& rTextObj, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc ) :
|
||||||
|
mpImpl(new Impl(rTextObj, rParagraphDataVector, bIsEditDoc)) {}
|
||||||
|
|
||||||
|
OutlinerParaObject::OutlinerParaObject( const EditTextObject& rTextObj ) :
|
||||||
|
mpImpl(new Impl(rTextObj))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
OutlinerParaObject::OutlinerParaObject( const EditTextObject& rEditTextObject)
|
OutlinerParaObject::OutlinerParaObject(const OutlinerParaObject& rCandidate) :
|
||||||
: mpImplOutlinerParaObject( new ImplOutlinerParaObject( rEditTextObject.Clone(), ParagraphDataVector(), true))
|
mpImpl(new Impl(*rCandidate.mpImpl)) {}
|
||||||
{}
|
|
||||||
|
|
||||||
OutlinerParaObject::OutlinerParaObject(const OutlinerParaObject& rCandidate)
|
|
||||||
: mpImplOutlinerParaObject(rCandidate.mpImplOutlinerParaObject)
|
|
||||||
{
|
|
||||||
mpImplOutlinerParaObject->mnRefCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
OutlinerParaObject::~OutlinerParaObject()
|
OutlinerParaObject::~OutlinerParaObject()
|
||||||
{
|
{
|
||||||
if(mpImplOutlinerParaObject->mnRefCount)
|
delete mpImpl;
|
||||||
{
|
|
||||||
mpImplOutlinerParaObject->mnRefCount--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete mpImplOutlinerParaObject;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCandidate)
|
OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCandidate)
|
||||||
{
|
{
|
||||||
if(rCandidate.mpImplOutlinerParaObject != mpImplOutlinerParaObject)
|
if(rCandidate.mpImpl->mpData != mpImpl->mpData)
|
||||||
{
|
{
|
||||||
if(mpImplOutlinerParaObject->mnRefCount)
|
if (mpImpl->mpData->mnRefCount)
|
||||||
{
|
{
|
||||||
mpImplOutlinerParaObject->mnRefCount--;
|
mpImpl->mpData->mnRefCount--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delete mpImplOutlinerParaObject;
|
delete mpImpl->mpData;
|
||||||
}
|
}
|
||||||
|
|
||||||
mpImplOutlinerParaObject = rCandidate.mpImplOutlinerParaObject;
|
mpImpl->mpData = rCandidate.mpImpl->mpData;
|
||||||
mpImplOutlinerParaObject->mnRefCount++;
|
mpImpl->mpData->mnRefCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@@ -140,56 +154,56 @@ OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCan
|
|||||||
|
|
||||||
bool OutlinerParaObject::operator==(const OutlinerParaObject& rCandidate) const
|
bool OutlinerParaObject::operator==(const OutlinerParaObject& rCandidate) const
|
||||||
{
|
{
|
||||||
if(rCandidate.mpImplOutlinerParaObject == mpImplOutlinerParaObject)
|
if (rCandidate.mpImpl->mpData == mpImpl->mpData)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (*rCandidate.mpImplOutlinerParaObject == *mpImplOutlinerParaObject);
|
return (*rCandidate.mpImpl->mpData == *mpImpl->mpData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #i102062#
|
// #i102062#
|
||||||
bool OutlinerParaObject::isWrongListEqual(const OutlinerParaObject& rCompare) const
|
bool OutlinerParaObject::isWrongListEqual(const OutlinerParaObject& rCompare) const
|
||||||
{
|
{
|
||||||
if(rCompare.mpImplOutlinerParaObject == mpImplOutlinerParaObject)
|
if (rCompare.mpImpl->mpData == mpImpl->mpData)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mpImplOutlinerParaObject->isWrongListEqual(*rCompare.mpImplOutlinerParaObject);
|
return mpImpl->mpData->isWrongListEqual(*rCompare.mpImpl->mpData);
|
||||||
}
|
}
|
||||||
|
|
||||||
sal_uInt16 OutlinerParaObject::GetOutlinerMode() const
|
sal_uInt16 OutlinerParaObject::GetOutlinerMode() const
|
||||||
{
|
{
|
||||||
return mpImplOutlinerParaObject->mpEditTextObject->GetUserType();
|
return mpImpl->mpData->mpEditTextObject->GetUserType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutlinerParaObject::SetOutlinerMode(sal_uInt16 nNew)
|
void OutlinerParaObject::SetOutlinerMode(sal_uInt16 nNew)
|
||||||
{
|
{
|
||||||
if(mpImplOutlinerParaObject->mpEditTextObject->GetUserType() != nNew)
|
if (mpImpl->mpData->mpEditTextObject->GetUserType() != nNew)
|
||||||
{
|
{
|
||||||
ImplMakeUnique();
|
ImplMakeUnique();
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->SetUserType(nNew);
|
mpImpl->mpData->mpEditTextObject->SetUserType(nNew);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OutlinerParaObject::IsVertical() const
|
bool OutlinerParaObject::IsVertical() const
|
||||||
{
|
{
|
||||||
return mpImplOutlinerParaObject->mpEditTextObject->IsVertical();
|
return mpImpl->mpData->mpEditTextObject->IsVertical();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutlinerParaObject::SetVertical(bool bNew)
|
void OutlinerParaObject::SetVertical(bool bNew)
|
||||||
{
|
{
|
||||||
if((bool)mpImplOutlinerParaObject->mpEditTextObject->IsVertical() != bNew)
|
if((bool)mpImpl->mpData->mpEditTextObject->IsVertical() != bNew)
|
||||||
{
|
{
|
||||||
ImplMakeUnique();
|
ImplMakeUnique();
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->SetVertical(bNew);
|
mpImpl->mpData->mpEditTextObject->SetVertical(bNew);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sal_Int32 OutlinerParaObject::Count() const
|
sal_Int32 OutlinerParaObject::Count() const
|
||||||
{
|
{
|
||||||
size_t nSize = mpImplOutlinerParaObject->maParagraphDataVector.size();
|
size_t nSize = mpImpl->mpData->maParagraphDataVector.size();
|
||||||
if (nSize > EE_PARA_MAX_COUNT)
|
if (nSize > EE_PARA_MAX_COUNT)
|
||||||
{
|
{
|
||||||
SAL_WARN( "editeng", "OutlinerParaObject::Count - overflow " << nSize);
|
SAL_WARN( "editeng", "OutlinerParaObject::Count - overflow " << nSize);
|
||||||
@@ -200,9 +214,9 @@ sal_Int32 OutlinerParaObject::Count() const
|
|||||||
|
|
||||||
sal_Int16 OutlinerParaObject::GetDepth(sal_Int32 nPara) const
|
sal_Int16 OutlinerParaObject::GetDepth(sal_Int32 nPara) const
|
||||||
{
|
{
|
||||||
if(0 <= nPara && static_cast<size_t>(nPara) < mpImplOutlinerParaObject->maParagraphDataVector.size())
|
if(0 <= nPara && static_cast<size_t>(nPara) < mpImpl->mpData->maParagraphDataVector.size())
|
||||||
{
|
{
|
||||||
return mpImplOutlinerParaObject->maParagraphDataVector[nPara].getDepth();
|
return mpImpl->mpData->maParagraphDataVector[nPara].getDepth();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -212,19 +226,19 @@ sal_Int16 OutlinerParaObject::GetDepth(sal_Int32 nPara) const
|
|||||||
|
|
||||||
const EditTextObject& OutlinerParaObject::GetTextObject() const
|
const EditTextObject& OutlinerParaObject::GetTextObject() const
|
||||||
{
|
{
|
||||||
return *mpImplOutlinerParaObject->mpEditTextObject;
|
return *mpImpl->mpData->mpEditTextObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OutlinerParaObject::IsEditDoc() const
|
bool OutlinerParaObject::IsEditDoc() const
|
||||||
{
|
{
|
||||||
return mpImplOutlinerParaObject->mbIsEditDoc;
|
return mpImpl->mpData->mbIsEditDoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ParagraphData& OutlinerParaObject::GetParagraphData(sal_Int32 nIndex) const
|
const ParagraphData& OutlinerParaObject::GetParagraphData(sal_Int32 nIndex) const
|
||||||
{
|
{
|
||||||
if(0 <= nIndex && static_cast<size_t>(nIndex) < mpImplOutlinerParaObject->maParagraphDataVector.size())
|
if(0 <= nIndex && static_cast<size_t>(nIndex) < mpImpl->mpData->maParagraphDataVector.size())
|
||||||
{
|
{
|
||||||
return mpImplOutlinerParaObject->maParagraphDataVector[nIndex];
|
return mpImpl->mpData->maParagraphDataVector[nIndex];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -237,21 +251,21 @@ const ParagraphData& OutlinerParaObject::GetParagraphData(sal_Int32 nIndex) cons
|
|||||||
void OutlinerParaObject::ClearPortionInfo()
|
void OutlinerParaObject::ClearPortionInfo()
|
||||||
{
|
{
|
||||||
ImplMakeUnique();
|
ImplMakeUnique();
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->ClearPortionInfo();
|
mpImpl->mpData->mpEditTextObject->ClearPortionInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OutlinerParaObject::ChangeStyleSheets(const OUString& rOldName,
|
bool OutlinerParaObject::ChangeStyleSheets(const OUString& rOldName,
|
||||||
SfxStyleFamily eOldFamily, const OUString& rNewName, SfxStyleFamily eNewFamily)
|
SfxStyleFamily eOldFamily, const OUString& rNewName, SfxStyleFamily eNewFamily)
|
||||||
{
|
{
|
||||||
ImplMakeUnique();
|
ImplMakeUnique();
|
||||||
return mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheets(rOldName, eOldFamily, rNewName, eNewFamily);
|
return mpImpl->mpData->mpEditTextObject->ChangeStyleSheets(rOldName, eOldFamily, rNewName, eNewFamily);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutlinerParaObject::ChangeStyleSheetName(SfxStyleFamily eFamily,
|
void OutlinerParaObject::ChangeStyleSheetName(SfxStyleFamily eFamily,
|
||||||
const OUString& rOldName, const OUString& rNewName)
|
const OUString& rOldName, const OUString& rNewName)
|
||||||
{
|
{
|
||||||
ImplMakeUnique();
|
ImplMakeUnique();
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheetName(eFamily, rOldName, rNewName);
|
mpImpl->mpData->mpEditTextObject->ChangeStyleSheetName(eFamily, rOldName, rNewName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewName,
|
void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewName,
|
||||||
@@ -268,7 +282,7 @@ void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewN
|
|||||||
{
|
{
|
||||||
if(GetDepth(--nDecrementer) == nLevel)
|
if(GetDepth(--nDecrementer) == nLevel)
|
||||||
{
|
{
|
||||||
mpImplOutlinerParaObject->mpEditTextObject->SetStyleSheet(nDecrementer, rNewName, rNewFamily);
|
mpImpl->mpData->mpEditTextObject->SetStyleSheet(nDecrementer, rNewName, rNewFamily);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,12 +26,11 @@
|
|||||||
#include <rsc/rscsfx.hxx>
|
#include <rsc/rscsfx.hxx>
|
||||||
|
|
||||||
class EditTextObject;
|
class EditTextObject;
|
||||||
class ImplOutlinerParaObject;
|
|
||||||
|
|
||||||
class EDITENG_DLLPUBLIC OutlinerParaObject
|
class EDITENG_DLLPUBLIC OutlinerParaObject
|
||||||
{
|
{
|
||||||
private:
|
struct Impl;
|
||||||
ImplOutlinerParaObject* mpImplOutlinerParaObject;
|
Impl* mpImpl;
|
||||||
|
|
||||||
void ImplMakeUnique();
|
void ImplMakeUnique();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user