summaryrefslogtreecommitdiff
path: root/svx/source/outliner/outlobj.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/outliner/outlobj.cxx')
-rw-r--r--svx/source/outliner/outlobj.cxx310
1 files changed, 147 insertions, 163 deletions
diff --git a/svx/source/outliner/outlobj.cxx b/svx/source/outliner/outlobj.cxx
index 5097e944d6..554ea34004 100644
--- a/svx/source/outliner/outlobj.cxx
+++ b/svx/source/outliner/outlobj.cxx
@@ -38,234 +38,218 @@
#include <svx/outlobj.hxx>
#include <outleeng.hxx>
#include <svx/editobj.hxx>
+#include <vcl/bitmap.hxx>
+#include <tools/stream.hxx>
+//////////////////////////////////////////////////////////////////////////////
-#include <vcl/bitmap.hxx>
+class ImplOutlinerParaObject
+{
+public:
+ // data members
+ EditTextObject* mpEditTextObject;
+ ParagraphDataVector maParagraphDataVector;
+ bool mbIsEditDoc;
+ // refcounter
+ sal_uInt32 mnRefCount;
-#include <tools/stream.hxx>
+ // constuctor
+ ImplOutlinerParaObject(EditTextObject* pEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc)
+ : mpEditTextObject(pEditTextObject),
+ maParagraphDataVector(rParagraphDataVector),
+ mbIsEditDoc(bIsEditDoc),
+ mnRefCount(0)
+ {
+ }
+
+ // destructor
+ ~ImplOutlinerParaObject()
+ {
+ delete mpEditTextObject;
+ }
+
+ bool operator==(const ImplOutlinerParaObject& rCandidate) const
+ {
+ return (*mpEditTextObject == *rCandidate.mpEditTextObject
+ && maParagraphDataVector == rCandidate.maParagraphDataVector
+ && mbIsEditDoc == rCandidate.mbIsEditDoc);
+ }
+};
-DBG_NAME(OutlinerParaObject)
+//////////////////////////////////////////////////////////////////////////////
-OutlinerParaObject::OutlinerParaObject( USHORT nParaCount )
+void OutlinerParaObject::ImplMakeUnique()
{
- DBG_CTOR(OutlinerParaObject,0);
-
- bIsEditDoc = TRUE;
- pParagraphDataArr = new ParagraphData[ nParaCount ];
- nCount = nParaCount;
+ if(mpImplOutlinerParaObject->mnRefCount)
+ {
+ ImplOutlinerParaObject* pNew = new ImplOutlinerParaObject(
+ mpImplOutlinerParaObject->mpEditTextObject->Clone(),
+ mpImplOutlinerParaObject->maParagraphDataVector,
+ mpImplOutlinerParaObject->mbIsEditDoc);
+ mpImplOutlinerParaObject->mnRefCount--;
+ mpImplOutlinerParaObject = pNew;
+ }
}
-OutlinerParaObject::OutlinerParaObject( const OutlinerParaObject& rObj )
+OutlinerParaObject::OutlinerParaObject(const EditTextObject& rEditTextObject, const ParagraphDataVector& rParagraphDataVector, bool bIsEditDoc)
+: mpImplOutlinerParaObject(new ImplOutlinerParaObject(rEditTextObject.Clone(), rParagraphDataVector, bIsEditDoc))
{
- DBG_CTOR(OutlinerParaObject,0);
-
- bIsEditDoc = rObj.bIsEditDoc;
- nCount = rObj.nCount;
- pParagraphDataArr = new ParagraphData[ nCount ];
- for( sal_uInt32 i = 0; i < nCount; i++ )
- pParagraphDataArr[i] = rObj.pParagraphDataArr[i];
- pText = rObj.pText->Clone();
}
-OutlinerParaObject::OutlinerParaObject( const EditTextObject& rEditObj )
+OutlinerParaObject::OutlinerParaObject(const OutlinerParaObject& rCandidate)
+: mpImplOutlinerParaObject(rCandidate.mpImplOutlinerParaObject)
{
- DBG_CTOR(OutlinerParaObject,0);
-
- bIsEditDoc = TRUE;
- pText = rEditObj.Clone();
- nCount = pText->GetParagraphCount();
- pParagraphDataArr = new ParagraphData[ nCount ];
+ mpImplOutlinerParaObject->mnRefCount++;
}
OutlinerParaObject::~OutlinerParaObject()
{
- DBG_DTOR(OutlinerParaObject,0);
-
- delete pText;
- delete[] pParagraphDataArr;
+ if(mpImplOutlinerParaObject->mnRefCount)
+ {
+ mpImplOutlinerParaObject->mnRefCount--;
+ }
+ else
+ {
+ delete mpImplOutlinerParaObject;
+ }
}
-sal_Int16 OutlinerParaObject::GetDepth( USHORT nPara ) const
+OutlinerParaObject& OutlinerParaObject::operator=(const OutlinerParaObject& rCandidate)
{
- if( pParagraphDataArr && (nPara < nCount ) )
- return pParagraphDataArr[nPara].nDepth;
- else
- return -1;
+ if(rCandidate.mpImplOutlinerParaObject != mpImplOutlinerParaObject)
+ {
+ if(mpImplOutlinerParaObject->mnRefCount)
+ {
+ mpImplOutlinerParaObject->mnRefCount--;
+ }
+ else
+ {
+ delete mpImplOutlinerParaObject;
+ }
+
+ mpImplOutlinerParaObject = rCandidate.mpImplOutlinerParaObject;
+ mpImplOutlinerParaObject->mnRefCount++;
+ }
+
+ return *this;
}
-void OutlinerParaObject::ClearPortionInfo()
+bool OutlinerParaObject::operator==(const OutlinerParaObject& rCandidate) const
{
- DBG_CHKTHIS(OutlinerParaObject,0);
- pText->ClearPortionInfo();
+ if(rCandidate.mpImplOutlinerParaObject == mpImplOutlinerParaObject)
+ {
+ return true;
+ }
+
+ return (*rCandidate.mpImplOutlinerParaObject == *mpImplOutlinerParaObject);
}
-OutlinerParaObject* OutlinerParaObject::Clone() const
+sal_uInt16 OutlinerParaObject::GetOutlinerMode() const
{
- DBG_CHKTHIS(OutlinerParaObject,0);
- OutlinerParaObject* pObj = new OutlinerParaObject(*this);
- return pObj;
+ return mpImplOutlinerParaObject->mpEditTextObject->GetUserType();
}
-void OutlinerParaObject::ChangeStyleSheetName( SfxStyleFamily eFamily, const XubString& rOldName, const XubString& rNewName )
+void OutlinerParaObject::SetOutlinerMode(sal_uInt16 nNew)
{
- DBG_CHKTHIS(OutlinerParaObject,0);
- pText->ChangeStyleSheetName( eFamily, rOldName, rNewName );
+ if(mpImplOutlinerParaObject->mpEditTextObject->GetUserType() != nNew)
+ {
+ ImplMakeUnique();
+ mpImplOutlinerParaObject->mpEditTextObject->SetUserType(nNew);
+ }
}
-BOOL OutlinerParaObject::ChangeStyleSheets( const XubString& rOldName, SfxStyleFamily eOldFamily, const XubString& rNewName, SfxStyleFamily eNewFamily )
+bool OutlinerParaObject::IsVertical() const
{
- DBG_CHKTHIS(OutlinerParaObject,0);
- return pText->ChangeStyleSheets( rOldName, eOldFamily, rNewName, eNewFamily );
+ return mpImplOutlinerParaObject->mpEditTextObject->IsVertical();
}
-void OutlinerParaObject::SetStyleSheets( USHORT nLevel, const XubString rNewName, const SfxStyleFamily& rNewFamily )
+void OutlinerParaObject::SetVertical(bool bNew)
{
- for ( USHORT n = sal::static_int_cast< USHORT >( Count() ); n; )
+ if((bool)mpImplOutlinerParaObject->mpEditTextObject->IsVertical() != bNew)
{
- if ( GetDepth( --n ) == nLevel )
- pText->SetStyleSheet( n, rNewName, rNewFamily );
+ ImplMakeUnique();
+ mpImplOutlinerParaObject->mpEditTextObject->SetVertical(bNew);
}
}
-void OutlinerParaObject::Store(SvStream& rStream ) const
+sal_uInt32 OutlinerParaObject::Count() const
{
- rStream << nCount;
- rStream << static_cast<sal_uInt32>(0x42345678);
- pText->Store( rStream );
-
- for( USHORT nPos=0; nPos < nCount; nPos++ )
- rStream << pParagraphDataArr[ nPos ].nDepth;
-
- rStream << bIsEditDoc;
+ return mpImplOutlinerParaObject->maParagraphDataVector.size();
}
-OutlinerParaObject* OutlinerParaObject::Create( SvStream& rStream, SfxItemPool* pTextObjectPool )
+sal_Int16 OutlinerParaObject::GetDepth(sal_uInt16 nPara) const
{
- OutlinerParaObject* pPObj = NULL;
- USHORT nVersion = 0;
-
- sal_uInt32 nCount;
- rStream >> nCount;
-
- sal_uInt32 nSyncRef;
- rStream >> nSyncRef;
- if( nSyncRef == 0x12345678 )
- nVersion = 1;
- else if( nSyncRef == 0x22345678 )
- nVersion = 2;
- else if( nSyncRef == 0x32345678 )
- nVersion = 3;
- else if ( nSyncRef == 0x42345678 )
- nVersion = 4;
-
- if ( nVersion )
+ if(nPara < mpImplOutlinerParaObject->maParagraphDataVector.size())
{
- pPObj = new OutlinerParaObject( (USHORT)nCount );
- if( nVersion <= 3 )
- {
- EditTextObject* pAllText = 0;
- USHORT nCurPara = 0;
- while ( nCount )
- {
- EditTextObject* pText = EditTextObject::Create( rStream, NULL );
- DBG_ASSERT(pText,"CreateEditTextObject failed");
- sal_uInt32 nSync = 0;
- rStream >> nSync;
- DBG_ASSERT(nSync==nSyncRef,"Stream out of sync");
- USHORT nDepth;
- rStream >> nDepth;
- Paragraph* pPara = new Paragraph( nDepth );
- if( nVersion == 1 )
- {
- // Bullet ueberlesen
- USHORT nFlags;
- rStream >> nFlags;
-
- if ( nFlags & 0x0001 ) // Bitmap
- {
- Bitmap aBmp;
- rStream >> aBmp;
- }
- else
- {
- Color aColor;
- rStream >> aColor;
- rStream.SeekRel( 16 );
- String aName;
- rStream.ReadByteString(aName);
- rStream.SeekRel( 12 );
- }
- long nDummy;
- rStream >> nDummy;
- rStream >> nDummy;
- }
- pPara->bVisible = TRUE;
- if( !pAllText )
- pAllText = pText;
- else
- {
- pAllText->Insert( *pText, 0xffff );
- delete pText;
- }
- pPObj->pParagraphDataArr[ nCurPara ] = *pPara;
- delete pPara;
- nCount--;
- nCurPara++;
- if( nCount )
- {
- sal_uInt32 _nSync = 0;
- rStream >> _nSync;
- DBG_ASSERT(_nSync==nSyncRef,"Stream out of sync");
- }
- }
- if( nVersion == 3 )
- rStream >> pPObj->bIsEditDoc;
- pPObj->pText = pAllText;
- }
- else // nVersion >= 4
- {
- pPObj->pText = EditTextObject::Create( rStream, pTextObjectPool );
- for( USHORT nCur=0; nCur < nCount; nCur++ )
- rStream >> pPObj->pParagraphDataArr[ nCur ].nDepth;
- rStream >> pPObj->bIsEditDoc;
- }
+ return mpImplOutlinerParaObject->maParagraphDataVector[nPara].getDepth();
+ }
+ else
+ {
+ return -1;
}
- return pPObj;
}
-USHORT OutlinerParaObject::GetOutlinerMode() const
+const EditTextObject& OutlinerParaObject::GetTextObject() const
{
- return pText->GetUserType();
+ return *mpImplOutlinerParaObject->mpEditTextObject;
}
-void OutlinerParaObject::SetOutlinerMode( USHORT n )
+bool OutlinerParaObject::IsEditDoc() const
{
- pText->SetUserType( n );
+ return mpImplOutlinerParaObject->mbIsEditDoc;
}
-BOOL OutlinerParaObject::RemoveCharAttribs( USHORT nWhich )
+const ParagraphData& OutlinerParaObject::GetParagraphData(sal_uInt32 nIndex) const
{
- return pText->RemoveCharAttribs( nWhich );
+ if(nIndex < mpImplOutlinerParaObject->maParagraphDataVector.size())
+ {
+ return mpImplOutlinerParaObject->maParagraphDataVector[nIndex];
+ }
+ else
+ {
+ OSL_ENSURE(false, "OutlinerParaObject::GetParagraphData: Access out of range (!)");
+ static ParagraphData aEmptyParagraphData;
+ return aEmptyParagraphData;
+ }
}
-BOOL OutlinerParaObject::RemoveParaAttribs( USHORT nWhich )
+void OutlinerParaObject::ClearPortionInfo()
{
- return pText->RemoveParaAttribs( nWhich );
+ ImplMakeUnique();
+ mpImplOutlinerParaObject->mpEditTextObject->ClearPortionInfo();
}
-void OutlinerParaObject::MergeParaAttribs( const SfxItemSet& rAttribs, USHORT nStart, USHORT nEnd )
+bool OutlinerParaObject::ChangeStyleSheets(const XubString& rOldName, SfxStyleFamily eOldFamily, const XubString& rNewName, SfxStyleFamily eNewFamily)
{
- pText->MergeParaAttribs( rAttribs, nStart, nEnd );
+ ImplMakeUnique();
+ return mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheets(rOldName, eOldFamily, rNewName, eNewFamily);
}
-void OutlinerParaObject::SetVertical( BOOL bVertical )
+void OutlinerParaObject::ChangeStyleSheetName(SfxStyleFamily eFamily, const XubString& rOldName, const XubString& rNewName)
{
- pText->SetVertical( bVertical );
+ ImplMakeUnique();
+ mpImplOutlinerParaObject->mpEditTextObject->ChangeStyleSheetName(eFamily, rOldName, rNewName);
}
-BOOL OutlinerParaObject::IsVertical() const
+void OutlinerParaObject::SetStyleSheets(sal_uInt16 nLevel, const XubString rNewName, const SfxStyleFamily& rNewFamily)
{
- return pText->IsVertical();
+ const sal_uInt32 nCount(mpImplOutlinerParaObject->maParagraphDataVector.size());
+
+ if(nCount)
+ {
+ ImplMakeUnique();
+ sal_uInt16 nDecrementer(sal::static_int_cast< sal_uInt16 >(nCount));
+
+ for(;nDecrementer;)
+ {
+ if(GetDepth(--nDecrementer) == nLevel)
+ {
+ mpImplOutlinerParaObject->mpEditTextObject->SetStyleSheet(nDecrementer, rNewName, rNewFamily);
+ }
+ }
+ }
}
+//////////////////////////////////////////////////////////////////////////////
+// eof