Kaydet (Commit) 3b16e997 authored tarafından Noel Grandin's avatar Noel Grandin

cleanup SwAuthEntry manual ref-counting

And remove the "handle" nonsense and just pass plain honest pointers to
a real type around

Change-Id: Ic49443f5f8b20890d8335088331fff81585e8981
Reviewed-on: https://gerrit.libreoffice.org/66615
Tested-by: Jenkins
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 2af5d600
......@@ -22,27 +22,24 @@
#include "swdllapi.h"
#include "fldbas.hxx"
#include "toxe.hxx"
#include <rtl/ref.hxx>
#include <sal/log.hxx>
#include <salhelper/simplereferenceobject.hxx>
#include <memory>
#include <vector>
class SwAuthEntry
class SwAuthEntry : public salhelper::SimpleReferenceObject
{
OUString aAuthFields[AUTH_FIELD_END];
sal_uInt16 nRefCount;
public:
SwAuthEntry() : nRefCount(0){}
SwAuthEntry() = default;
SwAuthEntry( const SwAuthEntry& rCopy );
bool operator==(const SwAuthEntry& rComp);
inline OUString const & GetAuthorField(ToxAuthorityField ePos) const;
inline void SetAuthorField(ToxAuthorityField ePos,
const OUString& rField);
void AddRef() { ++nRefCount; }
void RemoveRef() { --nRefCount; }
sal_uInt16 GetRefCount() { return nRefCount; }
};
struct SwTOXSortKey
......@@ -55,19 +52,19 @@ struct SwTOXSortKey
};
typedef std::vector<SwTOXSortKey> SortKeyArr;
typedef std::vector<std::unique_ptr<SwAuthEntry>> SwAuthDataArr;
typedef std::vector<rtl::Reference<SwAuthEntry>> SwAuthDataArr;
class SW_DLLPUBLIC SwAuthorityFieldType : public SwFieldType
{
SwDoc* m_pDoc;
SwAuthDataArr m_DataArr;
std::vector<sal_IntPtr> m_SequArr;
std::vector<sal_IntPtr> m_SequArrRLHidden; ///< hidden redlines
std::vector<SwAuthEntry*> m_SequArr;
std::vector<SwAuthEntry*> m_SequArrRLHidden; ///< hidden redlines
SortKeyArr m_SortKeyArr;
sal_Unicode m_cPrefix;
sal_Unicode m_cSuffix;
bool m_bIsSequence :1;
bool m_bSortByDocument :1;
bool m_bIsSequence :1;
bool m_bSortByDocument :1;
LanguageType m_eLanguage;
OUString m_sSortAlgorithm;
......@@ -83,30 +80,27 @@ public:
virtual void QueryValue( css::uno::Any& rVal, sal_uInt16 nWhichId ) const override;
virtual void PutValue( const css::uno::Any& rVal, sal_uInt16 nWhichId ) override;
void SetDoc(SwDoc* pNewDoc) { m_pDoc = pNewDoc; }
void SetDoc(SwDoc* pNewDoc) { m_pDoc = pNewDoc; }
SwDoc* GetDoc(){ return m_pDoc; }
void RemoveField(sal_IntPtr nHandle);
sal_IntPtr AddField(const OUString& rFieldContents);
void AddField(sal_IntPtr nHandle);
void RemoveField(const SwAuthEntry* nHandle);
SwAuthEntry* AddField(const OUString& rFieldContents);
void DelSequenceArray()
{
m_SequArr.clear();
m_SequArrRLHidden.clear();
}
const SwAuthEntry* GetEntryByHandle(sal_IntPtr nHandle) const;
void GetAllEntryIdentifiers( std::vector<OUString>& rToFill ) const;
const SwAuthEntry* GetEntryByIdentifier(const OUString& rIdentifier) const;
SwAuthEntry* GetEntryByIdentifier(const OUString& rIdentifier) const;
bool ChangeEntryContent(const SwAuthEntry* pNewEntry);
// import interface
sal_uInt16 AppendField(const SwAuthEntry& rInsert);
sal_IntPtr GetHandle(sal_uInt16 nPos);
SwAuthEntry* GetFieldByPos(sal_uInt16 nPos);
sal_uInt16 GetSequencePos(sal_IntPtr nHandle, SwRootFrame const* pLayout);
sal_uInt16 GetSequencePos(const SwAuthEntry* pAuthEntry, SwRootFrame const* pLayout);
bool IsSequence() const {return m_bIsSequence;}
bool IsSequence() const {return m_bIsSequence;}
void SetSequence(bool bSet)
{
DelSequenceArray();
......@@ -121,7 +115,7 @@ public:
sal_Unicode GetPrefix() const { return m_cPrefix;}
sal_Unicode GetSuffix() const { return m_cSuffix;}
bool IsSortByDocument() const {return m_bSortByDocument;}
bool IsSortByDocument() const {return m_bSortByDocument;}
void SetSortByDocument(bool bSet)
{
DelSequenceArray();
......@@ -154,7 +148,7 @@ public:
*/
class SwAuthorityField : public SwField
{
sal_IntPtr m_nHandle;
rtl::Reference<SwAuthEntry> m_xAuthEntry;
mutable sal_IntPtr m_nTempSequencePos;
mutable sal_IntPtr m_nTempSequencePosRLHidden; ///< hidden redlines
......@@ -169,7 +163,7 @@ public:
SW_DLLPUBLIC OUString ExpandCitation(ToxAuthorityField eField, SwRootFrame const* pLayout) const;
SwAuthorityField(SwAuthorityFieldType* pType, const OUString& rFieldContents);
SwAuthorityField(SwAuthorityFieldType* pType, sal_IntPtr nHandle);
SwAuthorityField(SwAuthorityFieldType* pType, SwAuthEntry* pAuthEntry);
virtual ~SwAuthorityField() override;
OUString GetFieldText(ToxAuthorityField eField) const;
......@@ -180,7 +174,7 @@ public:
virtual bool QueryValue( css::uno::Any& rVal, sal_uInt16 nWhichId ) const override;
virtual bool PutValue( const css::uno::Any& rVal, sal_uInt16 nWhichId ) override;
sal_IntPtr GetHandle() const { return m_nHandle; }
SwAuthEntry* GetAuthEntry() const { return m_xAuthEntry.get(); }
virtual OUString GetDescription() const override;
};
......
......@@ -815,8 +815,8 @@ void SwTOXAuthority::FillText( SwTextNode& rNd,
bool SwTOXAuthority::equivalent(const SwTOXSortTabBase& rCmp)
{
return nType == rCmp.nType &&
static_cast<SwAuthorityField*>(m_rField.GetField())->GetHandle() ==
static_cast<SwAuthorityField*>(static_cast<const SwTOXAuthority&>(rCmp).m_rField.GetField())->GetHandle();
static_cast<SwAuthorityField*>(m_rField.GetField())->GetAuthEntry() ==
static_cast<SwAuthorityField*>(static_cast<const SwTOXAuthority&>(rCmp).m_rField.GetField())->GetAuthEntry();
}
bool SwTOXAuthority::sort_lt(const SwTOXSortTabBase& rBase)
......
......@@ -1225,10 +1225,10 @@ IMPL_LINK_NOARG(SwAuthorMarkPane, InsertHdl, weld::Button&, void)
{
if(bDifferent)
{
SwAuthEntry aNewData;
rtl::Reference<SwAuthEntry> xNewData(new SwAuthEntry);
for(int i = 0; i < AUTH_FIELD_END; i++)
aNewData.SetAuthorField(static_cast<ToxAuthorityField>(i), m_sFields[i]);
pSh->ChangeAuthorityData(&aNewData);
xNewData->SetAuthorField(static_cast<ToxAuthorityField>(i), m_sFields[i]);
pSh->ChangeAuthorityData(xNewData.get());
}
SwInsertField_Data aData(TYP_AUTHORITY, 0, sFields.makeStringAndClear(), OUString(), 0 );
aMgr.InsertField( aData );
......@@ -1417,8 +1417,7 @@ void SwAuthorMarkPane::InitControls()
if(bNewEntry || !pField || pField->GetTyp()->Which() != SwFieldIds::TableOfAuthorities)
return;
const SwAuthEntry* pEntry = static_cast<SwAuthorityFieldType*>(pField->GetTyp())->
GetEntryByHandle(static_cast<SwAuthorityField*>(pField)->GetHandle());
const SwAuthEntry* pEntry = static_cast<SwAuthorityField*>(pField)->GetAuthEntry();
OSL_ENSURE(pEntry, "No authority entry found");
if(!pEntry)
......
......@@ -1653,17 +1653,17 @@ void SwFieldMgr::UpdateCurField(sal_uInt32 nFormat,
//#i99069# changes to a bibliography field should change the field type
SwAuthorityField* pAuthorityField = static_cast<SwAuthorityField*>(pTmpField.get());
SwAuthorityFieldType* pAuthorityType = static_cast<SwAuthorityFieldType*>(pType);
SwAuthEntry aTempEntry;
rtl::Reference<SwAuthEntry> xTempEntry(new SwAuthEntry);
for( sal_uInt16 i = 0; i < AUTH_FIELD_END; ++i )
aTempEntry.SetAuthorField( static_cast<ToxAuthorityField>(i),
xTempEntry->SetAuthorField( static_cast<ToxAuthorityField>(i),
rPar1.getToken( i, TOX_STYLE_DELIMITER ));
if( pAuthorityType->ChangeEntryContent( &aTempEntry ) )
if( pAuthorityType->ChangeEntryContent( xTempEntry.get() ) )
{
pType->UpdateFields();
pSh->SetModified();
}
if( aTempEntry.GetAuthorField( AUTH_FIELD_IDENTIFIER ) ==
if( xTempEntry->GetAuthorField( AUTH_FIELD_IDENTIFIER ) ==
pAuthorityField->GetFieldText( AUTH_FIELD_IDENTIFIER ) )
bSetPar1 = false; //otherwise it's a new or changed entry, the field needs to be updated
bSetPar2 = false;
......
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