Kaydet (Commit) 89f01955 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski Kaydeden (comit) Caolán McNamara

Merge common code of sw format lists

Moves the common code of Fmt based lists and simple vector lists
into two intermediate template classes, of which one provides
the SwFmtsBase interface.

Change-Id: If963c19293584654a3d17438221e3fca8bdfd4f9
Reviewed-on: https://gerrit.libreoffice.org/13448Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst f2be1cf9
......@@ -25,10 +25,6 @@
#include <algorithm>
#include <o3tl/sorted_vector.hxx>
class SwFieldType;
class SwTOXType;
class SwUndo;
class SwNumRule;
class SwRangeRedline;
class SwExtraRedline;
class SwUnoCrsr;
......@@ -47,6 +43,9 @@ namespace com { namespace sun { namespace star { namespace i18n {
#include <fmtcol.hxx>
#include <frmfmt.hxx>
#include <section.hxx>
#include <fldbas.hxx>
#include <tox.hxx>
#include <numrule.hxx>
/** provides some methods for generic operations on lists that contain
SwFmt* subclasses. */
......@@ -54,114 +53,127 @@ class SwFmtsBase
{
public:
virtual size_t GetFmtCount() const = 0;
virtual const SwFmt* GetFmt(size_t idx) const = 0;
virtual SwFmt* GetFmt(size_t idx) = 0;
virtual ~SwFmtsBase() = 0;
virtual SwFmt* GetFmt(size_t idx) const = 0;
virtual ~SwFmtsBase() {};
};
class SwGrfFmtColls : public SwFmtsBase
template<typename Value>
class SwVectorModifyBase : public std::vector<Value>
{
public:
typedef typename std::vector<Value>::const_iterator const_iterator;
protected:
enum class DestructorPolicy {
KeepElements,
FreeElements,
};
private:
std::vector<SwGrfFmtColl*> mvColls;
const DestructorPolicy mPolicy;
protected:
// default destructor deletes all contained elements
SwVectorModifyBase(DestructorPolicy policy = DestructorPolicy::FreeElements)
: mPolicy(policy) {}
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE { return size(); }
virtual const SwGrfFmtColl* GetFmt(size_t idx) const SAL_OVERRIDE { return operator[](idx); }
virtual SwGrfFmtColl* GetFmt(size_t idx) SAL_OVERRIDE { return operator[](idx); }
size_t size() const { return mvColls.size(); }
SwGrfFmtColl *operator[](size_t idx) const { return mvColls[idx]; }
void push_back(SwGrfFmtColl* pColl) { mvColls.push_back(pColl); }
void DeleteAndDestroy(int nStartIdx, int nEndIdx);
sal_uInt16 GetPos(const SwGrfFmtColl* pFmt) const;
/// free's any remaining child objects
virtual ~SwGrfFmtColls() {}
using std::vector<Value>::begin;
using std::vector<Value>::end;
// free any remaining child objects based on mPolicy
virtual ~SwVectorModifyBase()
{
if (mPolicy == DestructorPolicy::FreeElements)
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
void DeleteAndDestroy(int aStartIdx, int aEndIdx)
{
if (aEndIdx < aStartIdx)
return;
for (const_iterator it = begin() + aStartIdx;
it != begin() + aEndIdx; ++it)
delete *it;
this->erase( begin() + aStartIdx, begin() + aEndIdx);
}
sal_uInt16 GetPos(Value const& p) const
{
const_iterator const it = std::find(begin(), end(), p);
return it == end() ? USHRT_MAX : it - begin();
}
bool Contains(Value const& p) const
{ return std::find(begin(), end(), p) != end(); }
void dumpAsXml(xmlTextWriterPtr) const {};
};
/// stupid base class to work around MSVC dllexport mess
class SAL_DLLPUBLIC_TEMPLATE SwFrmFmts_Base : public std::vector<SwFrmFmt*> {};
template<typename Value>
class SwFmtsModifyBase : public SwVectorModifyBase<Value>, public SwFmtsBase
{
protected:
SwFmtsModifyBase(typename SwVectorModifyBase<Value>::DestructorPolicy
policy = SwVectorModifyBase<Value>::DestructorPolicy::FreeElements)
: SwVectorModifyBase<Value>(policy) {}
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE
{ return std::vector<Value>::size(); }
virtual Value GetFmt(size_t idx) const SAL_OVERRIDE
{ return std::vector<Value>::operator[](idx); }
inline sal_uInt16 GetPos(const SwFmt *p) const
{ return SwVectorModifyBase<Value>::GetPos( static_cast<Value>( const_cast<SwFmt*>( p ) ) ); }
inline bool Contains(const SwFmt *p) const
{ return SwVectorModifyBase<Value>::Contains( static_cast<Value>( const_cast<SwFmt*>( p ) ) ); }
};
class SwGrfFmtColls : public SwFmtsModifyBase<SwGrfFmtColl*>
{
public:
SwGrfFmtColls() : SwFmtsModifyBase( DestructorPolicy::KeepElements ) {}
};
/// Specific frame formats (frames, DrawObjects).
class SW_DLLPUBLIC SwFrmFmts : public SwFrmFmts_Base, public SwFmtsBase
class SW_DLLPUBLIC SwFrmFmts : public SwFmtsModifyBase<SwFrmFmt*>
{
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE { return size(); }
virtual const SwFrmFmt* GetFmt(size_t idx) const SAL_OVERRIDE { return operator[](idx); }
virtual SwFrmFmt* GetFmt(size_t idx) SAL_OVERRIDE { return operator[](idx); }
sal_uInt16 GetPos(const SwFrmFmt* pFmt) const;
bool Contains(const SwFrmFmt* pFmt) const;
void dumpAsXml(xmlTextWriterPtr w, const char* pName) const;
/// free's any remaining child objects
virtual ~SwFrmFmts();
};
class SwCharFmts : public std::vector<SwCharFmt*>, public SwFmtsBase
class SwCharFmts : public SwFmtsModifyBase<SwCharFmt*>
{
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE { return size(); }
virtual const SwCharFmt* GetFmt(size_t idx) const SAL_OVERRIDE { return operator[](idx); }
virtual SwCharFmt* GetFmt(size_t idx) SAL_OVERRIDE { return operator[](idx); }
sal_uInt16 GetPos(const SwCharFmt* pFmt) const;
bool Contains(const SwCharFmt* pFmt) const;
void dumpAsXml(xmlTextWriterPtr w) const;
/// free's any remaining child objects
virtual ~SwCharFmts();
};
class SwTxtFmtColls : public std::vector<SwTxtFmtColl*>, public SwFmtsBase
class SwTxtFmtColls : public SwFmtsModifyBase<SwTxtFmtColl*>
{
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE { return size(); }
virtual const SwTxtFmtColl* GetFmt(size_t idx) const SAL_OVERRIDE { return operator[](idx); }
virtual SwTxtFmtColl* GetFmt(size_t idx) SAL_OVERRIDE { return operator[](idx); }
sal_uInt16 GetPos(const SwTxtFmtColl* pFmt) const;
SwTxtFmtColls() : SwFmtsModifyBase( DestructorPolicy::KeepElements ) {}
void dumpAsXml(xmlTextWriterPtr w) const;
virtual ~SwTxtFmtColls() {}
};
/// Array of Undo-history.
class SW_DLLPUBLIC SwSectionFmts : public std::vector<SwSectionFmt*>, public SwFmtsBase
class SW_DLLPUBLIC SwSectionFmts : public SwFmtsModifyBase<SwSectionFmt*>
{
public:
virtual size_t GetFmtCount() const SAL_OVERRIDE { return size(); }
virtual const SwSectionFmt* GetFmt(size_t idx) const SAL_OVERRIDE { return operator[](idx); }
virtual SwSectionFmt* GetFmt(size_t idx) SAL_OVERRIDE { return operator[](idx); }
sal_uInt16 GetPos(const SwSectionFmt* pFmt) const;
bool Contains(const SwSectionFmt* pFmt) const;
void dumpAsXml(xmlTextWriterPtr w) const;
/// free's any remaining child objects
virtual ~SwSectionFmts();
};
class SwFldTypes : public std::vector<SwFieldType*> {
class SwFldTypes : public SwVectorModifyBase<SwFieldType*> {
public:
/// the destructor will free all objects still in the vector
~SwFldTypes();
sal_uInt16 GetPos(const SwFieldType* pFieldType) const;
void dumpAsXml(xmlTextWriterPtr w) const;
};
class SwTOXTypes {
private:
typedef std::vector<SwTOXType*> _SwTOXTypes;
_SwTOXTypes items;
public:
/// the destructor will free all objects still in the vector
~SwTOXTypes();
sal_uInt16 GetPos(const SwTOXType* pTOXType) const;
size_t size() const { return items.size(); };
SwTOXType* operator[] (size_t n) { return items[n]; };
const SwTOXType* operator[] (size_t n) const { return items[n]; };
void push_back ( SwTOXType* value) { items.push_back(value); };
void clear() { items.clear(); };
_SwTOXTypes::const_iterator begin() const { return items.begin(); };
_SwTOXTypes::const_iterator end() const { return items.end(); };
};
class SwTOXTypes : public SwVectorModifyBase<SwTOXType*> {};
class SW_DLLPUBLIC SwNumRuleTbl : public std::vector<SwNumRule*> {
class SW_DLLPUBLIC SwNumRuleTbl : public SwVectorModifyBase<SwNumRule*> {
public:
/// the destructor will free all objects still in the vector
~SwNumRuleTbl();
sal_uInt16 GetPos(const SwNumRule* pRule) const;
void dumpAsXml(xmlTextWriterPtr w) const;
};
......
......@@ -1731,16 +1731,4 @@ SwDoc::GetVbaEventProcessor()
return mxVbaEvents;
}
sal_uInt16 SwNumRuleTbl::GetPos(const SwNumRule* pRule) const
{
const_iterator it = std::find(begin(), end(), pRule);
return it == end() ? USHRT_MAX : it - begin();
}
SwNumRuleTbl::~SwNumRuleTbl()
{
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -2008,40 +2008,4 @@ namespace docfunc
}
}
SwFmtsBase::~SwFmtsBase() {}
sal_uInt16 SwFrmFmts::GetPos(const SwFrmFmt* p) const
{
const_iterator it = std::find(begin(), end(), p);
return it == end() ? USHRT_MAX : it - begin();
}
bool SwFrmFmts::Contains(const SwFrmFmt* p) const
{
return std::find(begin(), end(), p) != end();
}
SwFrmFmts::~SwFrmFmts()
{
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
sal_uInt16 SwCharFmts::GetPos(const SwCharFmt* p) const
{
const_iterator it = std::find(begin(), end(), p);
return it == end() ? USHRT_MAX : it - begin();
}
bool SwCharFmts::Contains(const SwCharFmt* p) const
{
return std::find(begin(), end(), p) != end();
}
SwCharFmts::~SwCharFmts()
{
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -377,36 +377,6 @@ SwDoc::SwDoc()
getIDocumentState().ResetModified();
}
static void DeleteAndDestroy(SwFrmFmts& rFmts, int aStartIdx, int aEndIdx)
{
if (aEndIdx < aStartIdx)
return;
for( SwFrmFmts::const_iterator it = rFmts.begin() + aStartIdx;
it != rFmts.begin() + aEndIdx; ++it )
delete *it;
rFmts.erase( rFmts.begin() + aStartIdx, rFmts.begin() + aEndIdx);
}
static void DeleteAndDestroy(SwTxtFmtColls& rFmts, int aStartIdx, int aEndIdx)
{
if (aEndIdx < aStartIdx)
return;
for( SwTxtFmtColls::const_iterator it = rFmts.begin() + aStartIdx;
it != rFmts.begin() + aEndIdx; ++it )
delete *it;
rFmts.erase( rFmts.begin() + aStartIdx, rFmts.begin() + aEndIdx);
}
static void DeleteAndDestroy(SwCharFmts& rFmts, int aStartIdx, int aEndIdx)
{
if (aEndIdx < aStartIdx)
return;
for( SwCharFmts::const_iterator it = rFmts.begin() + aStartIdx;
it != rFmts.begin() + aEndIdx; ++it )
delete *it;
rFmts.erase( rFmts.begin() + aStartIdx, rFmts.begin() + aEndIdx);
}
/**
* Speciality: a member of the class SwDoc is located at
* position 0 in the array of the Format and GDI objects.
......@@ -539,8 +509,8 @@ SwDoc::~SwDoc()
// array, we should delete it as the last. With this we avoid
// reparenting the Formats all the time!
if( 2 < mpTxtFmtCollTbl->size() )
DeleteAndDestroy(*mpTxtFmtCollTbl, 2, mpTxtFmtCollTbl->size());
DeleteAndDestroy(*mpTxtFmtCollTbl, 1, mpTxtFmtCollTbl->size());
mpTxtFmtCollTbl->DeleteAndDestroy(2, mpTxtFmtCollTbl->size());
mpTxtFmtCollTbl->DeleteAndDestroy(1, mpTxtFmtCollTbl->size());
delete mpTxtFmtCollTbl;
OSL_ENSURE( mpDfltGrfFmtColl == (*mpGrfFmtCollTbl)[0],
......@@ -570,7 +540,7 @@ SwDoc::~SwDoc()
// All Flys need to be destroyed before the Drawing Model,
// because Flys can still contain DrawContacts, when no
// Layout could be constructed due to a read error.
DeleteAndDestroy( *mpSpzFrmFmtTbl, 0, mpSpzFrmFmtTbl->size() );
mpSpzFrmFmtTbl->DeleteAndDestroy( 0, mpSpzFrmFmtTbl->size() );
// Only now destroy the Model, the drawing objects - which are also
// contained in the Undo - need to remove their attributes from the
......@@ -732,20 +702,20 @@ void SwDoc::ClearDoc()
// array, we should delete it as the last. With this we avoid
// reparenting the Formats all the time!
if( 2 < mpTxtFmtCollTbl->size() )
DeleteAndDestroy(*mpTxtFmtCollTbl, 2, mpTxtFmtCollTbl->size());
DeleteAndDestroy(*mpTxtFmtCollTbl, 1, mpTxtFmtCollTbl->size());
mpTxtFmtCollTbl->DeleteAndDestroy(2, mpTxtFmtCollTbl->size());
mpTxtFmtCollTbl->DeleteAndDestroy(1, mpTxtFmtCollTbl->size());
mpGrfFmtCollTbl->DeleteAndDestroy(1, mpGrfFmtCollTbl->size());
DeleteAndDestroy(*mpCharFmtTbl, 1, mpCharFmtTbl->size());
mpCharFmtTbl->DeleteAndDestroy(1, mpCharFmtTbl->size());
if( getIDocumentLayoutAccess().GetCurrentViewShell() )
{
// search the FrameFormat of the root frm. This is not allowed to delete
mpFrmFmtTbl->erase( std::find( mpFrmFmtTbl->begin(), mpFrmFmtTbl->end(), getIDocumentLayoutAccess().GetCurrentViewShell()->GetLayout()->GetFmt() ) );
DeleteAndDestroy(*mpFrmFmtTbl, 1, mpFrmFmtTbl->size());
mpFrmFmtTbl->DeleteAndDestroy(1, mpFrmFmtTbl->size());
mpFrmFmtTbl->push_back( getIDocumentLayoutAccess().GetCurrentViewShell()->GetLayout()->GetFmt() );
}
else
DeleteAndDestroy(*mpFrmFmtTbl, 1, mpFrmFmtTbl->size());
mpFrmFmtTbl->DeleteAndDestroy(1, mpFrmFmtTbl->size());
mxForbiddenCharsTable.clear();
......@@ -1156,26 +1126,4 @@ else
return aStartAppendIndex;
}
sal_uInt16 SwTxtFmtColls::GetPos(const SwTxtFmtColl* p) const
{
const_iterator it = std::find(begin(), end(), p);
return it == end() ? USHRT_MAX : it - begin();
}
void SwGrfFmtColls::DeleteAndDestroy(int nStartIdx, int nEndIdx)
{
if (nEndIdx < nStartIdx)
return;
for( std::vector<SwGrfFmtColl*>::const_iterator it = mvColls.begin() + nStartIdx;
it != mvColls.begin() + nEndIdx; ++it )
delete *it;
mvColls.erase( mvColls.begin() + nStartIdx, mvColls.begin() + nEndIdx);
}
sal_uInt16 SwGrfFmtColls::GetPos(const SwGrfFmtColl* p) const
{
std::vector<SwGrfFmtColl*>::const_iterator it = std::find(mvColls.begin(), mvColls.end(), p);
return it == mvColls.end() ? USHRT_MAX : it - mvColls.begin();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -1589,21 +1589,4 @@ bool SwIntrnlSectRefLink::IsInRange( sal_uLong nSttNd, sal_uLong nEndNd,
pSttNd->EndOfSectionIndex() < nEndNd;
}
sal_uInt16 SwSectionFmts::GetPos(const SwSectionFmt* p) const
{
const_iterator it = std::find(begin(), end(), p);
return it == end() ? USHRT_MAX : it - begin();
}
bool SwSectionFmts::Contains(const SwSectionFmt* p) const
{
return std::find(begin(), end(), p) != end();
}
SwSectionFmts::~SwSectionFmts()
{
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -747,16 +747,4 @@ bool SwField::IsClickable() const
return false;
}
sal_uInt16 SwFldTypes::GetPos(const SwFieldType* pFieldType) const
{
const_iterator it = std::find(begin(), end(), pFieldType);
return it == end() ? USHRT_MAX : it - begin();
}
SwFldTypes::~SwFldTypes()
{
for(const_iterator it = begin(); it != end(); ++it)
delete *it;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -858,16 +858,4 @@ const SwFormTokens& SwForm::GetPattern(sal_uInt16 nLevel) const
return aPattern[nLevel];
}
sal_uInt16 SwTOXTypes::GetPos(const SwTOXType* pTOXType) const
{
_SwTOXTypes::const_iterator it = std::find(items.begin(), items.end(), pTOXType);
return it == items.end() ? USHRT_MAX : it - items.begin();
}
SwTOXTypes::~SwTOXTypes()
{
for(_SwTOXTypes::const_iterator it = items.begin(); it != items.end(); ++it)
delete *it;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -150,7 +150,7 @@ void SwUndoFmtAttr::Init()
else if ( RES_FRMFMT == m_nFmtWhich )
{
SwDoc* pDoc = m_pFmt->GetDoc();
if ( pDoc->GetTblFrmFmts()->Contains(static_cast<const SwFrmFmt*>(m_pFmt)))
if ( pDoc->GetTblFrmFmts()->Contains( m_pFmt ))
{
// Table Format: save table position, table formats are volatile!
SwTable * pTbl = SwIterator<SwTable,SwFmt>::FirstElement( *m_pFmt );
......@@ -160,7 +160,7 @@ void SwUndoFmtAttr::Init()
->FindTableNode()->GetIndex();
}
}
else if ( pDoc->GetSections().Contains(static_cast<const SwSectionFmt*>(m_pFmt)))
else if ( pDoc->GetSections().Contains( m_pFmt ))
{
m_nNodeIndex = m_pFmt->GetCntnt().GetCntntIdx()->GetIndex();
}
......@@ -237,8 +237,7 @@ bool SwUndoFmtAttr::IsFmtInDoc( SwDoc* pDoc )
switch ( m_nFmtWhich )
{
case RES_TXTFMTCOLL:
nPos = pDoc->GetTxtFmtColls()->GetPos(
static_cast<const SwTxtFmtColl*>(m_pFmt) );
nPos = pDoc->GetTxtFmtColls()->GetPos( m_pFmt );
break;
case RES_GRFFMTCOLL:
......@@ -247,8 +246,7 @@ bool SwUndoFmtAttr::IsFmtInDoc( SwDoc* pDoc )
break;
case RES_CHRFMT:
nPos = pDoc->GetCharFmts()->GetPos(
static_cast<SwCharFmt*>(m_pFmt) );
nPos = pDoc->GetCharFmts()->GetPos( m_pFmt );
break;
case RES_FRMFMT:
......@@ -289,12 +287,10 @@ bool SwUndoFmtAttr::IsFmtInDoc( SwDoc* pDoc )
// no break!
case RES_DRAWFRMFMT:
case RES_FLYFRMFMT:
nPos = pDoc->GetSpzFrmFmts()->GetPos(
static_cast<const SwFrmFmt*>(m_pFmt) );
nPos = pDoc->GetSpzFrmFmts()->GetPos( m_pFmt );
if ( USHRT_MAX == nPos )
{
nPos = pDoc->GetFrmFmts()->GetPos(
static_cast<const SwFrmFmt*>(m_pFmt) );
nPos = pDoc->GetFrmFmts()->GetPos( m_pFmt );
}
break;
}
......
......@@ -537,7 +537,7 @@ void SwUndoSetFlyFmt::UndoImpl(::sw::UndoRedoContext & rContext)
SwDoc & rDoc = rContext.GetDoc();
// Is the new Format still existent?
if( USHRT_MAX != rDoc.GetFrmFmts()->GetPos( (const SwFrmFmt*)pOldFmt ) )
if( USHRT_MAX != rDoc.GetFrmFmts()->GetPos( pOldFmt ) )
{
if( bAnchorChgd )
pFrmFmt->DelFrms();
......@@ -610,7 +610,7 @@ void SwUndoSetFlyFmt::RedoImpl(::sw::UndoRedoContext & rContext)
SwDoc & rDoc = rContext.GetDoc();
// Is the new Format still existent?
if( USHRT_MAX != rDoc.GetFrmFmts()->GetPos( (const SwFrmFmt*)pNewFmt ) )
if( USHRT_MAX != rDoc.GetFrmFmts()->GetPos( pNewFmt ) )
{
if( bAnchorChgd )
......
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