Kaydet (Commit) 1de32aec authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Ok, the regression I had introduced in my prev commit is now fixed.

The idea is to keep a reference to the ScHeaderFooterTextData instance
in ScHeaderFooterTextObj which is the authoritative copy, instead of
making copies of it everywhere.  This way when the text is updated
in ScHeaderFooterTextObj all the other places will see it too without
needing to propagate the change.
üst 399727e9
...@@ -66,15 +66,15 @@ public: ...@@ -66,15 +66,15 @@ public:
class ScHeaderFooterEditSource : public SvxEditSource class ScHeaderFooterEditSource : public SvxEditSource
{ {
private: private:
ScHeaderFooterTextData* pTextData; ScHeaderFooterTextData* mpTextData;
public: public:
ScHeaderFooterEditSource(const ScHeaderFooterTextData& rData); ScHeaderFooterEditSource(ScHeaderFooterTextData* pData);
ScHeaderFooterEditSource(ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj);
virtual ~ScHeaderFooterEditSource(); virtual ~ScHeaderFooterEditSource();
// GetEditEngine is needed because the forwarder doesn't have field functions // GetEditEngine is needed because the forwarder doesn't have field functions
ScEditEngineDefaulter* GetEditEngine(); ScEditEngineDefaulter* GetEditEngine();
void SetTextData(ScHeaderFooterTextData* pData);
virtual SvxEditSource* Clone() const; virtual SvxEditSource* Clone() const;
virtual SvxTextForwarder* GetTextForwarder(); virtual SvxTextForwarder* GetTextForwarder();
......
...@@ -59,6 +59,7 @@ class ScHeaderFieldObj; ...@@ -59,6 +59,7 @@ class ScHeaderFieldObj;
class ScHeaderFooterContentObj; class ScHeaderFooterContentObj;
class ScDocShell; class ScDocShell;
class EditTextObject; class EditTextObject;
class ScHeaderFooterTextData;
class ScCellFieldsObj : public cppu::WeakImplHelper5< class ScCellFieldsObj : public cppu::WeakImplHelper5<
...@@ -271,8 +272,7 @@ class ScHeaderFieldsObj : public cppu::WeakImplHelper5< ...@@ -271,8 +272,7 @@ class ScHeaderFieldsObj : public cppu::WeakImplHelper5<
com::sun::star::lang::XServiceInfo > com::sun::star::lang::XServiceInfo >
{ {
private: private:
ScHeaderFooterContentObj* pContentObj; ScHeaderFooterTextData& mrData;
sal_uInt16 nPart;
sal_uInt16 nType; sal_uInt16 nType;
SvxEditSource* pEditSource; SvxEditSource* pEditSource;
...@@ -284,8 +284,7 @@ private: ...@@ -284,8 +284,7 @@ private:
ScHeaderFieldObj* GetObjectByIndex_Impl(sal_Int32 Index) const; ScHeaderFieldObj* GetObjectByIndex_Impl(sal_Int32 Index) const;
public: public:
ScHeaderFieldsObj( ScHeaderFieldsObj(ScHeaderFooterTextData& rData);
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, sal_uInt16 nT);
virtual ~ScHeaderFieldsObj(); virtual ~ScHeaderFieldsObj();
// XIndexAccess // XIndexAccess
...@@ -342,8 +341,6 @@ class ScHeaderFieldObj : public ScMutexHelper, ...@@ -342,8 +341,6 @@ class ScHeaderFieldObj : public ScMutexHelper,
private: private:
const SfxItemPropertySet* pPropSet; const SfxItemPropertySet* pPropSet;
com::sun::star::uno::Reference<com::sun::star::text::XTextRange> mpContent; com::sun::star::uno::Reference<com::sun::star::text::XTextRange> mpContent;
ScHeaderFooterContentObj* pContentObj;
sal_uInt16 nPart;
sal_uInt16 nType; sal_uInt16 nType;
SvxEditSource* pEditSource; SvxEditSource* pEditSource;
ESelection aSelection; ESelection aSelection;
...@@ -353,7 +350,7 @@ private: ...@@ -353,7 +350,7 @@ private:
public: public:
ScHeaderFieldObj( ScHeaderFieldObj(
const com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rContent, const com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rContent,
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, sal_uInt16 nT, const ESelection& rSel); ScHeaderFooterTextData* pData, sal_uInt16 nT, const ESelection& rSel);
virtual ~ScHeaderFieldObj(); virtual ~ScHeaderFieldObj();
// called by getImplementation: // called by getImplementation:
...@@ -362,7 +359,7 @@ public: ...@@ -362,7 +359,7 @@ public:
SvxFieldItem CreateFieldItem(); SvxFieldItem CreateFieldItem();
void InitDoc( void InitDoc(
const com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rContent, const com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rContent,
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, const ESelection& rSel); ScHeaderFooterTextData& rData, const ESelection& rSel);
virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation(
const ::com::sun::star::uno::Type & rType ) const ::com::sun::star::uno::Type & rType )
......
...@@ -67,37 +67,35 @@ ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint() ...@@ -67,37 +67,35 @@ ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint()
// each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData // each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData
ScHeaderFooterEditSource::ScHeaderFooterEditSource(const ScHeaderFooterTextData& rData) : ScHeaderFooterEditSource::ScHeaderFooterEditSource(ScHeaderFooterTextData* pData) :
pTextData(new ScHeaderFooterTextData(rData.GetContentObj(), rData.GetPart(), rData.GetTextObject())) {} mpTextData(pData) {}
ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterEditSource::~ScHeaderFooterEditSource() {}
ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj) :
pTextData(new ScHeaderFooterTextData(rContent, nP, pTextObj)) {}
ScHeaderFooterEditSource::~ScHeaderFooterEditSource() ScEditEngineDefaulter* ScHeaderFooterEditSource::GetEditEngine()
{ {
delete pTextData; // not accessed in ScSharedHeaderFooterEditSource dtor return mpTextData ? mpTextData->GetEditEngine() : NULL;
} }
ScEditEngineDefaulter* ScHeaderFooterEditSource::GetEditEngine() void ScHeaderFooterEditSource::SetTextData(ScHeaderFooterTextData* pData)
{ {
return pTextData->GetEditEngine(); mpTextData = pData;
} }
SvxEditSource* ScHeaderFooterEditSource::Clone() const SvxEditSource* ScHeaderFooterEditSource::Clone() const
{ {
return new ScHeaderFooterEditSource( return new ScHeaderFooterEditSource(mpTextData);
pTextData->GetContentObj(), pTextData->GetPart(), pTextData->GetTextObject());
} }
SvxTextForwarder* ScHeaderFooterEditSource::GetTextForwarder() SvxTextForwarder* ScHeaderFooterEditSource::GetTextForwarder()
{ {
return pTextData->GetTextForwarder(); return mpTextData ? mpTextData->GetTextForwarder() : NULL;
} }
void ScHeaderFooterEditSource::UpdateData() void ScHeaderFooterEditSource::UpdateData()
{ {
pTextData->UpdateData(); if (mpTextData)
mpTextData->UpdateData();
} }
//------------------------------------------------------------------------ //------------------------------------------------------------------------
......
...@@ -848,31 +848,18 @@ uno::Sequence<rtl::OUString> SAL_CALL ScCellFieldObj::getSupportedServiceNames() ...@@ -848,31 +848,18 @@ uno::Sequence<rtl::OUString> SAL_CALL ScCellFieldObj::getSupportedServiceNames()
//------------------------------------------------------------------------ //------------------------------------------------------------------------
ScHeaderFieldsObj::ScHeaderFieldsObj( ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterTextData& rData) :
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, sal_uInt16 nT) : mrData(rData),
pContentObj( pContent ), nType(SC_SERVICE_INVALID),
nPart( nP ),
nType( nT ),
mpRefreshListeners( NULL ) mpRefreshListeners( NULL )
{ {
OSL_ENSURE( pContentObj, "ScHeaderFieldsObj ohne Objekt?" ); pEditSource = new ScHeaderFooterEditSource(&rData);
if (pContentObj)
{
pContentObj->acquire(); // darf nicht wegkommen
pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, pTextObj);
}
else
pEditSource = NULL;
} }
ScHeaderFieldsObj::~ScHeaderFieldsObj() ScHeaderFieldsObj::~ScHeaderFieldsObj()
{ {
delete pEditSource; delete pEditSource;
if (pContentObj)
pContentObj->release();
// increment refcount to prevent double call off dtor // increment refcount to prevent double call off dtor
osl_incrementInterlockedCount( &m_refCount ); osl_incrementInterlockedCount( &m_refCount );
...@@ -928,20 +915,19 @@ ScHeaderFieldObj* ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) cons ...@@ -928,20 +915,19 @@ ScHeaderFieldObj* ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) cons
ESelection aSelection( nPar, nPos, nPar, nPos+1 ); // Field is 1 character ESelection aSelection( nPar, nPos, nPar, nPos+1 ); // Field is 1 character
uno::Reference<text::XTextRange> xTextRange; uno::Reference<text::XTextRange> xTextRange;
if (pContentObj) ScHeaderFooterContentObj& rContentObj = mrData.GetContentObj();
{
uno::Reference<text::XText> xText; uno::Reference<text::XText> xText;
sal_uInt16 nPart = mrData.GetPart();
if ( nPart == SC_HDFT_LEFT ) if ( nPart == SC_HDFT_LEFT )
xText = pContentObj->getLeftText(); xText = rContentObj.getLeftText();
else if (nPart == SC_HDFT_CENTER) else if (nPart == SC_HDFT_CENTER)
xText = pContentObj->getCenterText(); xText = rContentObj.getCenterText();
else else
xText = pContentObj->getRightText(); xText = rContentObj.getRightText();
uno::Reference<text::XTextRange> xTemp(xText, uno::UNO_QUERY); uno::Reference<text::XTextRange> xTemp(xText, uno::UNO_QUERY);
xTextRange = xTemp; xTextRange = xTemp;
} return new ScHeaderFieldObj(xTextRange, &mrData, nFieldType, aSelection);
return new ScHeaderFieldObj(xTextRange, pContentObj, nPart, nFieldType, aSelection);
} }
return NULL; return NULL;
} }
...@@ -1103,26 +1089,19 @@ sal_Int16 lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue ) ...@@ -1103,26 +1089,19 @@ sal_Int16 lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue )
ScHeaderFieldObj::ScHeaderFieldObj( ScHeaderFieldObj::ScHeaderFieldObj(
const uno::Reference<text::XTextRange>& rContent, const uno::Reference<text::XTextRange>& rContent,
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, ScHeaderFooterTextData* pData,
sal_uInt16 nT, const ESelection& rSel) : sal_uInt16 nT, const ESelection& rSel) :
OComponentHelper( getMutex() ), OComponentHelper( getMutex() ),
pPropSet( (nT == SC_SERVICE_FILEFIELD) ? lcl_GetFileFieldPropertySet() : lcl_GetHeaderFieldPropertySet() ), pPropSet( (nT == SC_SERVICE_FILEFIELD) ? lcl_GetFileFieldPropertySet() : lcl_GetHeaderFieldPropertySet() ),
mpContent(rContent), mpContent(rContent),
pContentObj( pContent ),
nPart( nP ),
nType( nT ), nType( nT ),
pEditSource(NULL),
aSelection( rSel ), aSelection( rSel ),
nFileFormat( SVXFILEFORMAT_NAME_EXT ) nFileFormat( SVXFILEFORMAT_NAME_EXT )
{ {
// pContent ist Null, wenn per ServiceProvider erzeugt // pContent ist Null, wenn per ServiceProvider erzeugt
if (pData)
if (pContentObj) pEditSource = new ScHeaderFooterEditSource(pData);
{
pContentObj->acquire(); // darf nicht wegkommen
pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, NULL);
}
else
pEditSource = NULL;
} }
uno::Any SAL_CALL ScHeaderFieldObj::queryAggregation( const uno::Type& rType ) uno::Any SAL_CALL ScHeaderFieldObj::queryAggregation( const uno::Type& rType )
...@@ -1187,29 +1166,20 @@ void SAL_CALL ScHeaderFieldObj::release() throw() ...@@ -1187,29 +1166,20 @@ void SAL_CALL ScHeaderFieldObj::release() throw()
} }
void ScHeaderFieldObj::InitDoc( void ScHeaderFieldObj::InitDoc(
const uno::Reference<text::XTextRange>& rContent, const uno::Reference<text::XTextRange>& rContent, ScHeaderFooterTextData& rData, const ESelection& rSel)
ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, const ESelection& rSel)
{ {
if ( pContent && !pEditSource ) if (!pEditSource)
{ {
OSL_ENSURE( !pContentObj, "ContentObj, aber kein EditSource?" );
aSelection = rSel; aSelection = rSel;
nPart = nP;
pContentObj = pContent;
mpContent = rContent; mpContent = rContent;
pContentObj->acquire(); // darf nicht wegkommen pEditSource = new ScHeaderFooterEditSource(&rData);
pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, pTextObj);
} }
} }
ScHeaderFieldObj::~ScHeaderFieldObj() ScHeaderFieldObj::~ScHeaderFieldObj()
{ {
delete pEditSource; delete pEditSource;
if (pContentObj)
pContentObj->release();
} }
// per getImplementation gerufen: // per getImplementation gerufen:
......
...@@ -445,7 +445,7 @@ uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance( ...@@ -445,7 +445,7 @@ uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance(
{ {
uno::Reference<text::XTextRange> xNullContent; uno::Reference<text::XTextRange> xNullContent;
xRet.set(static_cast<text::XTextField*>( xRet.set(static_cast<text::XTextField*>(
new ScHeaderFieldObj(xNullContent, NULL, 0, nType, ESelection()))); new ScHeaderFieldObj(xNullContent, NULL, nType, ESelection())));
} }
break; break;
case SC_SERVICE_CELLSTYLE: case SC_SERVICE_CELLSTYLE:
......
...@@ -205,8 +205,6 @@ ScHeaderFooterTextData::ScHeaderFooterTextData( ...@@ -205,8 +205,6 @@ ScHeaderFooterTextData::ScHeaderFooterTextData(
bDataValid( false ), bDataValid( false ),
bInUpdate( false ) bInUpdate( false )
{ {
if (!mpTextObj)
fprintf(stdout, "ScHeaderFooterTextData::ScHeaderFooterTextData: mpTextObj = %p\n", mpTextObj);
rContentObj.acquire(); // must not go away rContentObj.acquire(); // must not go away
} }
...@@ -264,7 +262,6 @@ SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder() ...@@ -264,7 +262,6 @@ SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder()
void ScHeaderFooterTextData::UpdateData() void ScHeaderFooterTextData::UpdateData()
{ {
fprintf(stdout, "ScHeaderFooterTextData::UpdateData: 1\n");
if (pEditEngine) if (pEditEngine)
{ {
delete mpTextObj; delete mpTextObj;
...@@ -275,7 +272,6 @@ void ScHeaderFooterTextData::UpdateData() ...@@ -275,7 +272,6 @@ void ScHeaderFooterTextData::UpdateData()
void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine) void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine)
{ {
fprintf(stdout, "ScHeaderFooterTextData::UpdateData: 2\n");
delete mpTextObj; delete mpTextObj;
mpTextObj = rEditEngine.CreateTextObject(); mpTextObj = rEditEngine.CreateTextObject();
bDataValid = false; bDataValid = false;
...@@ -302,7 +298,7 @@ void ScHeaderFooterTextObj::CreateUnoText_Impl() ...@@ -302,7 +298,7 @@ void ScHeaderFooterTextObj::CreateUnoText_Impl()
if ( !pUnoText ) if ( !pUnoText )
{ {
// can't be aggregated because getString/setString is handled here // can't be aggregated because getString/setString is handled here
ScHeaderFooterEditSource aEditSource(aTextData); ScHeaderFooterEditSource aEditSource(&aTextData);
pUnoText = new SvxUnoText( &aEditSource, lcl_GetHdFtPropertySet(), uno::Reference<text::XText>() ); pUnoText = new SvxUnoText( &aEditSource, lcl_GetHdFtPropertySet(), uno::Reference<text::XText>() );
pUnoText->acquire(); pUnoText->acquire();
} }
...@@ -483,8 +479,7 @@ void SAL_CALL ScHeaderFooterTextObj::insertTextContent( ...@@ -483,8 +479,7 @@ void SAL_CALL ScHeaderFooterTextObj::insertTextContent(
break; break;
} }
pHeaderField->InitDoc( pHeaderField->InitDoc(xTextRange, aTextData, aSelection);
xTextRange, &aTextData.GetContentObj(), aTextData.GetPart(), aTextData.GetTextObject(), aSelection);
// for bAbsorb=FALSE, the new selection must be behind the inserted content // for bAbsorb=FALSE, the new selection must be behind the inserted content
// (the xml filter relies on this) // (the xml filter relies on this)
...@@ -553,8 +548,7 @@ uno::Reference<container::XEnumerationAccess> SAL_CALL ScHeaderFooterTextObj::ge ...@@ -553,8 +548,7 @@ uno::Reference<container::XEnumerationAccess> SAL_CALL ScHeaderFooterTextObj::ge
{ {
SolarMutexGuard aGuard; SolarMutexGuard aGuard;
// all fields // all fields
return new ScHeaderFieldsObj( return new ScHeaderFieldsObj(aTextData);
&aTextData.GetContentObj(), aTextData.GetPart(), aTextData.GetTextObject(), SC_SERVICE_INVALID);
} }
uno::Reference<container::XNameAccess> SAL_CALL ScHeaderFooterTextObj::getTextFieldMasters() uno::Reference<container::XNameAccess> SAL_CALL ScHeaderFooterTextObj::getTextFieldMasters()
......
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