Kaydet (Commit) c26f80aa authored tarafından Armin Le Grand's avatar Armin Le Grand

#120106# Use boost::shared_ptr and stl tools to implement a SwPosFlyFrms which…

#120106# Use boost::shared_ptr and stl tools to implement a SwPosFlyFrms which can be used and handed over by value and cleans up it's content to avoid memory leaks.

Found by: Chao Huang
Patch by: Chao Huang, alg
Review by: Chao Huang, alg
üst e7168710
...@@ -89,6 +89,7 @@ class SwList; ...@@ -89,6 +89,7 @@ class SwList;
#include <boost/scoped_ptr.hpp> #include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <flypos.hxx>
class SvxForbiddenCharactersTable; class SvxForbiddenCharactersTable;
class SwExtTextInput; class SwExtTextInput;
...@@ -153,7 +154,6 @@ class SwNodes; ...@@ -153,7 +154,6 @@ class SwNodes;
class SwNumRule; class SwNumRule;
class SwNumRuleTbl; class SwNumRuleTbl;
class SwPageDesc; class SwPageDesc;
class SwPosFlyFrms;
class SwPagePreViewPrtData; class SwPagePreViewPrtData;
class SwRedline; class SwRedline;
class SwRedlineTbl; class SwRedlineTbl;
...@@ -1056,8 +1056,7 @@ public: ...@@ -1056,8 +1056,7 @@ public:
// FlyFrames von der ::com::sun::star::awt::Selection vollstaendig umschlossen sein // FlyFrames von der ::com::sun::star::awt::Selection vollstaendig umschlossen sein
// ( Start < Pos < End ) !!! // ( Start < Pos < End ) !!!
// (wird fuer die Writer benoetigt) // (wird fuer die Writer benoetigt)
void GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, const SwPaM* = 0, SwPosFlyFrms GetAllFlyFmts( const SwPaM* = 0, sal_Bool bDrawAlso = sal_False ) const;
sal_Bool bDrawAlso = sal_False ) const;
// wegen swrtf.cxx und define private public, jetzt hier // wegen swrtf.cxx und define private public, jetzt hier
SwFlyFrmFmt *MakeFlyFrmFmt (const String &rFmtName, SwFrmFmt *pDerivedFrom); SwFlyFrmFmt *MakeFlyFrmFmt (const String &rFmtName, SwFrmFmt *pDerivedFrom);
......
...@@ -23,9 +23,9 @@ ...@@ -23,9 +23,9 @@
#ifndef _FLYPOS_HXX #ifndef _FLYPOS_HXX
#define _FLYPOS_HXX #define _FLYPOS_HXX
#include <svl/svarray.hxx>
#include <swdllapi.h> #include <swdllapi.h>
#include <boost/shared_ptr.hpp>
#include <set>
class SwFrmFmt; class SwFrmFmt;
class SwNodeIndex; class SwNodeIndex;
...@@ -34,23 +34,24 @@ class SwNodeIndex; ...@@ -34,23 +34,24 @@ class SwNodeIndex;
class SW_DLLPUBLIC SwPosFlyFrm class SW_DLLPUBLIC SwPosFlyFrm
{ {
const SwFrmFmt* pFrmFmt; // das FlyFrmFmt const SwFrmFmt* pFrmFmt; // das FlyFrmFmt
// SwPosition* pPos; // Position in den ContentNode
SwNodeIndex* pNdIdx; // es reicht ein Index auf den Node SwNodeIndex* pNdIdx; // es reicht ein Index auf den Node
sal_uInt32 nOrdNum; sal_uInt32 nOrdNum;
public: public:
SwPosFlyFrm( const SwNodeIndex& , const SwFrmFmt*, sal_uInt16 nArrPos ); SwPosFlyFrm( const SwNodeIndex& , const SwFrmFmt*, sal_uInt16 nArrPos );
virtual ~SwPosFlyFrm(); // virtual fuer die Writer (DLL !!) virtual ~SwPosFlyFrm(); // virtual fuer die Writer (DLL !!)
// operatoren fuer das Sort-Array
sal_Bool operator==( const SwPosFlyFrm& );
sal_Bool operator<( const SwPosFlyFrm& );
const SwFrmFmt& GetFmt() const { return *pFrmFmt; } const SwFrmFmt& GetFmt() const { return *pFrmFmt; }
const SwNodeIndex& GetNdIndex() const { return *pNdIdx; } const SwNodeIndex& GetNdIndex() const { return *pNdIdx; }
sal_uInt32 GetOrdNum() const { return nOrdNum; } sal_uInt32 GetOrdNum() const { return nOrdNum; }
}; };
typedef SwPosFlyFrm* SwPosFlyFrmPtr; // define needed classes to safely handle an array of allocated SwPosFlyFrm(s).
SV_DECL_PTRARR_SORT_VISIBILITY( SwPosFlyFrms, SwPosFlyFrmPtr, 0, 40, SW_DLLPUBLIC ) // SwPosFlyFrms can be handled by value (as return value), only refcounts to
// contained SwPosFlyFrm* will be copied. When releasing the last SwPosFlyFrmPtr
// instance the allocated instance will be freed. The array is sorted by
// GetNdIndex by using a ::std::set container.
typedef ::boost::shared_ptr< SwPosFlyFrm > SwPosFlyFrmPtr;
struct SwPosFlyFrmCmp { bool operator()(const SwPosFlyFrmPtr& rA, const SwPosFlyFrmPtr& rB) const; };
typedef ::std::set< SwPosFlyFrmPtr, SwPosFlyFrmCmp > SwPosFlyFrms;
#endif // _FLYPOS_HXX #endif // _FLYPOS_HXX
...@@ -1084,10 +1084,9 @@ sal_Bool TstFlyRange( const SwPaM* pPam, const SwPosition* pFlyPos, ...@@ -1084,10 +1084,9 @@ sal_Bool TstFlyRange( const SwPaM* pPam, const SwPosition* pFlyPos,
} }
void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, SwPosFlyFrms SwDoc::GetAllFlyFmts( const SwPaM* pCmpRange, sal_Bool bDrawAlso ) const
const SwPaM* pCmpRange, sal_Bool bDrawAlso ) const
{ {
SwPosFlyFrm *pFPos = 0; SwPosFlyFrms aRetval;
SwFrmFmt *pFly; SwFrmFmt *pFly;
// erstmal alle Absatzgebundenen einsammeln // erstmal alle Absatzgebundenen einsammeln
...@@ -1108,8 +1107,7 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, ...@@ -1108,8 +1107,7 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts,
if( pCmpRange && if( pCmpRange &&
!TstFlyRange( pCmpRange, pAPos, rAnchor.GetAnchorId() )) !TstFlyRange( pCmpRange, pAPos, rAnchor.GetAnchorId() ))
continue; // kein gueltiger FlyFrame continue; // kein gueltiger FlyFrame
pFPos = new SwPosFlyFrm( pAPos->nNode, pFly, rPosFlyFmts.Count() ); aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(pAPos->nNode, pFly, aRetval.size())));
rPosFlyFmts.Insert( pFPos );
} }
} }
} }
...@@ -1117,9 +1115,10 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, ...@@ -1117,9 +1115,10 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts,
// kein Layout oder nur ein Teil, dann wars das // kein Layout oder nur ein Teil, dann wars das
// Seitenbezogen Flys nur, wenn vollstaendig "gewuenscht" wird ! // Seitenbezogen Flys nur, wenn vollstaendig "gewuenscht" wird !
if( !GetCurrentViewShell() || pCmpRange ) //swmod 071108//swmod 071225 if( !GetCurrentViewShell() || pCmpRange ) //swmod 071108//swmod 071225
return; {
return aRetval;
}
pFPos = 0;
SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower(); //swmod 080218 SwPageFrm *pPage = (SwPageFrm*)GetCurrentLayout()->GetLower(); //swmod 080218
while( pPage ) while( pPage )
{ {
...@@ -1157,18 +1156,15 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts, ...@@ -1157,18 +1156,15 @@ void SwDoc::GetAllFlyFmts( SwPosFlyFrms& rPosFlyFmts,
if ( pCntntFrm ) if ( pCntntFrm )
{ {
SwNodeIndex aIdx( *pCntntFrm->GetNode() ); SwNodeIndex aIdx( *pCntntFrm->GetNode() );
pFPos = new SwPosFlyFrm( aIdx, pFly, rPosFlyFmts.Count() ); aRetval.insert(SwPosFlyFrmPtr(new SwPosFlyFrm(aIdx, pFly, aRetval.size())));
} }
} }
if ( pFPos )
{
rPosFlyFmts.Insert( pFPos );
pFPos = 0;
}
} }
} }
pPage = (SwPageFrm*)pPage->GetNext(); pPage = (SwPageFrm*)pPage->GetNext();
} }
return aRetval;
} }
/************************************************************************* /*************************************************************************
......
...@@ -37,7 +37,15 @@ ...@@ -37,7 +37,15 @@
#include "ndindex.hxx" #include "ndindex.hxx"
#include "switerator.hxx" #include "switerator.hxx"
SV_IMPL_OP_PTRARR_SORT( SwPosFlyFrms, SwPosFlyFrmPtr ) bool SwPosFlyFrmCmp::operator()(const SwPosFlyFrmPtr& rA, const SwPosFlyFrmPtr& rB) const
{
if(rA->GetNdIndex() == rB->GetNdIndex())
{
return rA->GetOrdNum() < rB->GetOrdNum();
}
return rA->GetNdIndex() < rB->GetNdIndex();
}
SwPosFlyFrm::SwPosFlyFrm( const SwNodeIndex& rIdx, const SwFrmFmt* pFmt, SwPosFlyFrm::SwPosFlyFrm( const SwNodeIndex& rIdx, const SwFrmFmt* pFmt,
sal_uInt16 nArrPos ) sal_uInt16 nArrPos )
...@@ -89,20 +97,4 @@ SwPosFlyFrm::~SwPosFlyFrm() ...@@ -89,20 +97,4 @@ SwPosFlyFrm::~SwPosFlyFrm()
} }
} }
sal_Bool SwPosFlyFrm::operator==( const SwPosFlyFrm& ) // eof
{
return sal_False; // FlyFrames koennen auf der gleichen Position stehen
}
sal_Bool SwPosFlyFrm::operator<( const SwPosFlyFrm& rPosFly )
{
if( pNdIdx->GetIndex() == rPosFly.pNdIdx->GetIndex() )
{
// dann entscheidet die Ordnungsnummer!
return nOrdNum < rPosFly.nOrdNum;
}
return pNdIdx->GetIndex() < rPosFly.pNdIdx->GetIndex();
}
...@@ -1885,20 +1885,18 @@ SwXParaFrameEnumeration::SwXParaFrameEnumeration( ...@@ -1885,20 +1885,18 @@ SwXParaFrameEnumeration::SwXParaFrameEnumeration(
{ {
if (PARAFRAME_PORTION_TEXTRANGE == eParaFrameMode) if (PARAFRAME_PORTION_TEXTRANGE == eParaFrameMode)
{ {
SwPosFlyFrms aFlyFrms;
//get all frames that are bound at paragraph or at character //get all frames that are bound at paragraph or at character
rPaM.GetDoc()->GetAllFlyFmts(aFlyFrms, m_pImpl->GetCursor()); SwPosFlyFrms aFlyFrms(rPaM.GetDoc()->GetAllFlyFmts(m_pImpl->GetCursor()));
for(sal_uInt16 i = 0; i < aFlyFrms.Count(); i++)
for(SwPosFlyFrms::const_iterator aIter(aFlyFrms.begin()); aIter != aFlyFrms.end(); aIter++)
{ {
SwPosFlyFrm* pPosFly = aFlyFrms[i]; SwFrmFmt *const pFrmFmt = const_cast<SwFrmFmt*>(&((*aIter)->GetFmt()));
SwFrmFmt *const pFrmFmt =
const_cast<SwFrmFmt*>(&pPosFly->GetFmt());
// create SwDepend for frame and insert into array // create SwDepend for frame and insert into array
SwDepend *const pNewDepend = SwDepend *const pNewDepend = new SwDepend(m_pImpl.get(), pFrmFmt);
new SwDepend(m_pImpl.get(), pFrmFmt); m_pImpl->m_Frames.push_back(::boost::shared_ptr<SwDepend>(pNewDepend));
m_pImpl->m_Frames.push_back(
::boost::shared_ptr<SwDepend>(pNewDepend) );
} }
//created from any text range //created from any text range
if (m_pImpl->GetCursor()->HasMark()) if (m_pImpl->GetCursor()->HasMark())
{ {
...@@ -1914,6 +1912,7 @@ SwXParaFrameEnumeration::SwXParaFrameEnumeration( ...@@ -1914,6 +1912,7 @@ SwXParaFrameEnumeration::SwXParaFrameEnumeration(
*m_pImpl->GetCursor()->GetMark()); *m_pImpl->GetCursor()->GetMark());
} }
} }
lcl_FillFrame(*m_pImpl.get(), *m_pImpl->GetCursor(), m_pImpl->m_Frames); lcl_FillFrame(*m_pImpl.get(), *m_pImpl->GetCursor(), m_pImpl->m_Frames);
} }
} }
......
...@@ -310,12 +310,11 @@ void SwHTMLWriter::CollectFlyFrms() ...@@ -310,12 +310,11 @@ void SwHTMLWriter::CollectFlyFrms()
"number of browser configurations has changed" ); "number of browser configurations has changed" );
sal_uInt8 nSz = (sal_uInt8)Min( pDoc->GetSpzFrmFmts()->Count(), sal_uInt16(255) ); sal_uInt8 nSz = (sal_uInt8)Min( pDoc->GetSpzFrmFmts()->Count(), sal_uInt16(255) );
SwPosFlyFrms aFlyPos( nSz, nSz ); SwPosFlyFrms aFlyPos(pDoc->GetAllFlyFmts(bWriteAll ? 0 : pCurPam, sal_True));
pDoc->GetAllFlyFmts( aFlyPos, bWriteAll ? 0 : pCurPam, sal_True );
for( sal_uInt16 i=0; i< aFlyPos.Count(); i++ ) for(SwPosFlyFrms::const_iterator aIter(aFlyPos.begin()); aIter != aFlyPos.end(); aIter++)
{ {
const SwFrmFmt& rFrmFmt = aFlyPos[i]->GetFmt(); const SwFrmFmt& rFrmFmt = (*aIter)->GetFmt();
const SdrObject *pSdrObj = 0; const SdrObject *pSdrObj = 0;
const SwPosition *pAPos; const SwPosition *pAPos;
const SwCntntNode *pACNd; const SwCntntNode *pACNd;
...@@ -365,8 +364,7 @@ void SwHTMLWriter::CollectFlyFrms() ...@@ -365,8 +364,7 @@ void SwHTMLWriter::CollectFlyFrms()
if( !pHTMLPosFlyFrms ) if( !pHTMLPosFlyFrms )
pHTMLPosFlyFrms = new SwHTMLPosFlyFrms; pHTMLPosFlyFrms = new SwHTMLPosFlyFrms;
SwHTMLPosFlyFrm *pNew = SwHTMLPosFlyFrm *pNew = new SwHTMLPosFlyFrm(**aIter, pSdrObj, nMode);
new SwHTMLPosFlyFrm( *aFlyPos[i], pSdrObj, nMode );
pHTMLPosFlyFrms->Insert( pNew ); pHTMLPosFlyFrms->Insert( pNew );
} }
} }
......
...@@ -140,17 +140,24 @@ namespace ...@@ -140,17 +140,24 @@ namespace
sw::Frames SwPosFlyFrmsToFrames(const SwPosFlyFrms &rFlys) sw::Frames SwPosFlyFrmsToFrames(const SwPosFlyFrms &rFlys)
{ {
sw::Frames aRet; sw::Frames aRet;
sal_uInt16 nEnd = rFlys.Count();
for (sal_uInt16 nI = 0; nI < nEnd; ++nI) for(SwPosFlyFrms::const_iterator aPos(rFlys.begin()); aPos != rFlys.end(); aPos++)
{ {
const SwFrmFmt &rEntry = rFlys[nI]->GetFmt(); const SwFrmFmt &rEntry = (*aPos)->GetFmt();
if (const SwPosition* pAnchor = rEntry.GetAnchor().GetCntntAnchor()) if (const SwPosition* pAnchor = rEntry.GetAnchor().GetCntntAnchor())
{
aRet.push_back(sw::Frame(rEntry, *pAnchor)); aRet.push_back(sw::Frame(rEntry, *pAnchor));
}
else else
{ {
SwPosition aPos(rFlys[nI]->GetNdIndex()); SwPosition aPos((*aPos)->GetNdIndex());
if (SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode()) if (SwTxtNode* pTxtNd = aPos.nNode.GetNode().GetTxtNode())
{
aPos.nContent.Assign(pTxtNd, 0); aPos.nContent.Assign(pTxtNd, 0);
}
aRet.push_back(sw::Frame(rEntry, aPos)); aRet.push_back(sw::Frame(rEntry, aPos));
} }
} }
...@@ -567,11 +574,8 @@ namespace sw ...@@ -567,11 +574,8 @@ namespace sw
*/ */
Frames GetFrames(const SwDoc &rDoc, SwPaM *pPaM /*, bool bAll*/) Frames GetFrames(const SwDoc &rDoc, SwPaM *pPaM /*, bool bAll*/)
{ {
SwPosFlyFrms aFlys; SwPosFlyFrms aFlys(rDoc.GetAllFlyFmts(pPaM, true));
rDoc.GetAllFlyFmts(aFlys, pPaM, true);
sw::Frames aRet(SwPosFlyFrmsToFrames(aFlys)); sw::Frames aRet(SwPosFlyFrmsToFrames(aFlys));
for (sal_uInt16 i = aFlys.Count(); i > 0;)
delete aFlys[--i];
return aRet; return aRet;
} }
......
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