diff options
author | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-04-24 16:19:38 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@gmail.com> | 2012-04-26 09:58:00 -0400 |
commit | 399727e98353c24719408780ad9d7e7eee198176 (patch) | |
tree | e06c0619e2de06fce23be7ecb05894501cc5eda1 | |
parent | 0809ccec5cee9f65461f7b551ffd686d2ff4281c (diff) |
Have ScHeaderFooterTextObj store authoritative EditTextObject instance.
This removes lots of needless broadcasting, and makes the code a lot
simpler. But it introduced a bug I need to look into...
-rw-r--r-- | sc/inc/editsrc.hxx | 3 | ||||
-rw-r--r-- | sc/inc/fielduno.hxx | 7 | ||||
-rw-r--r-- | sc/inc/textuno.hxx | 58 | ||||
-rw-r--r-- | sc/source/ui/unoobj/editsrc.cxx | 8 | ||||
-rw-r--r-- | sc/source/ui/unoobj/fielduno.cxx | 11 | ||||
-rw-r--r-- | sc/source/ui/unoobj/textuno.cxx | 136 |
6 files changed, 101 insertions, 122 deletions
diff --git a/sc/inc/editsrc.hxx b/sc/inc/editsrc.hxx index 20de06cb99af..435fb856bcd7 100644 --- a/sc/inc/editsrc.hxx +++ b/sc/inc/editsrc.hxx @@ -44,6 +44,7 @@ class ScCellTextData; class ScHeaderFooterTextData; class ScAccessibleTextData; class SdrObject; +class EditTextObject; class ScHeaderFooterChangedHint : public SfxHint @@ -69,7 +70,7 @@ private: public: ScHeaderFooterEditSource(const ScHeaderFooterTextData& rData); - ScHeaderFooterEditSource(ScHeaderFooterContentObj& rContent, sal_uInt16 nP); + ScHeaderFooterEditSource(ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj); virtual ~ScHeaderFooterEditSource(); // GetEditEngine is needed because the forwarder doesn't have field functions diff --git a/sc/inc/fielduno.hxx b/sc/inc/fielduno.hxx index a00dc67b187b..86c6f524ae05 100644 --- a/sc/inc/fielduno.hxx +++ b/sc/inc/fielduno.hxx @@ -58,6 +58,7 @@ class ScEditFieldObj; class ScHeaderFieldObj; class ScHeaderFooterContentObj; class ScDocShell; +class EditTextObject; class ScCellFieldsObj : public cppu::WeakImplHelper5< @@ -283,8 +284,8 @@ private: ScHeaderFieldObj* GetObjectByIndex_Impl(sal_Int32 Index) const; public: - ScHeaderFieldsObj(ScHeaderFooterContentObj* pContent, - sal_uInt16 nP, sal_uInt16 nT); + ScHeaderFieldsObj( + ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, sal_uInt16 nT); virtual ~ScHeaderFieldsObj(); // XIndexAccess @@ -361,7 +362,7 @@ public: SvxFieldItem CreateFieldItem(); void InitDoc( const com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rContent, - ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const ESelection& rSel); + ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, const ESelection& rSel); virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type & rType ) diff --git a/sc/inc/textuno.hxx b/sc/inc/textuno.hxx index 5dccc865cbc0..2eea0c38dd32 100644 --- a/sc/inc/textuno.hxx +++ b/sc/inc/textuno.hxx @@ -40,6 +40,8 @@ #include <com/sun/star/lang/XUnoTunnel.hpp> #include <cppuhelper/implbase3.hxx> #include <cppuhelper/implbase5.hxx> + +#include "rtl/ref.hxx" #include "scdllapi.h" class EditEngine; @@ -52,6 +54,7 @@ class ScSimpleEditSource; class ScCellEditSource; class ScEditEngineDefaulter; class ScFieldEditEngine; +class ScHeaderFooterTextObj; struct ScHeaderFieldData; @@ -70,28 +73,22 @@ class ScHeaderFooterContentObj : public cppu::WeakImplHelper3< com::sun::star::lang::XServiceInfo > { private: - EditTextObject* pLeftText; - EditTextObject* pCenterText; - EditTextObject* pRightText; - SfxBroadcaster aBC; + rtl::Reference<ScHeaderFooterTextObj> mxLeftText; + rtl::Reference<ScHeaderFooterTextObj> mxCenterText; + rtl::Reference<ScHeaderFooterTextObj> mxRightText; ScHeaderFooterContentObj(); // disabled public: - ScHeaderFooterContentObj( const EditTextObject* pLeft, - const EditTextObject* pCenter, - const EditTextObject* pRight ); + ScHeaderFooterContentObj( const EditTextObject* pLeft, + const EditTextObject* pCenter, + const EditTextObject* pRight ); virtual ~ScHeaderFooterContentObj(); // for ScPageHFItem (using getImplementation) - const EditTextObject* GetLeftEditObject() const { return pLeftText; } - const EditTextObject* GetCenterEditObject() const { return pCenterText; } - const EditTextObject* GetRightEditObject() const { return pRightText; } - - void AddListener( SfxListener& rListener ); - void RemoveListener( SfxListener& rListener ); - - void UpdateText( sal_uInt16 nPart, EditEngine& rSource ); + const EditTextObject* GetLeftEditObject() const; + const EditTextObject* GetCenterEditObject() const; + const EditTextObject* GetRightEditObject() const; // XHeaderFooterContent virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XText > SAL_CALL @@ -122,9 +119,10 @@ public: // ScHeaderFooterTextData: shared data between sub objects of a ScHeaderFooterTextObj -class ScHeaderFooterTextData : public SfxListener +class ScHeaderFooterTextData { private: + EditTextObject* mpTextObj; ScHeaderFooterContentObj& rContentObj; sal_uInt16 nPart; ScEditEngineDefaulter* pEditEngine; @@ -133,23 +131,28 @@ private: sal_Bool bInUpdate; public: - ScHeaderFooterTextData( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ); - ~ScHeaderFooterTextData(); - - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); + ScHeaderFooterTextData( + ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj); + ~ScHeaderFooterTextData(); // helper functions SvxTextForwarder* GetTextForwarder(); - void UpdateData(); + void UpdateData(); + void UpdateData(EditEngine& rEditEngine); ScEditEngineDefaulter* GetEditEngine() { GetTextForwarder(); return pEditEngine; } sal_uInt16 GetPart() const { return nPart; } ScHeaderFooterContentObj& GetContentObj() const { return rContentObj; } -}; -// ScHeaderFooterTextObj changes the text in a ScHeaderFooterContentObj + const EditTextObject* GetTextObject() const; +}; +/** + * Each of these instances represent, the left, center or right part of the + * header of footer of a page. + * + * ScHeaderFooterTextObj changes the text in a ScHeaderFooterContentObj. + */ class ScHeaderFooterTextObj : public cppu::WeakImplHelper5< com::sun::star::text::XText, com::sun::star::text::XTextRangeMover, @@ -164,10 +167,11 @@ private: void CreateUnoText_Impl(); public: - ScHeaderFooterTextObj( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ); - virtual ~ScHeaderFooterTextObj(); + ScHeaderFooterTextObj( + ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj); + virtual ~ScHeaderFooterTextObj(); + const EditTextObject* GetTextObject() const; const SvxUnoText& GetUnoText(); static void FillDummyFieldData( ScHeaderFieldData& rData ); diff --git a/sc/source/ui/unoobj/editsrc.cxx b/sc/source/ui/unoobj/editsrc.cxx index d1a41659158f..e52a9e9c56d7 100644 --- a/sc/source/ui/unoobj/editsrc.cxx +++ b/sc/source/ui/unoobj/editsrc.cxx @@ -68,11 +68,11 @@ ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint() // each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData ScHeaderFooterEditSource::ScHeaderFooterEditSource(const ScHeaderFooterTextData& rData) : - pTextData(new ScHeaderFooterTextData(rData.GetContentObj(), rData.GetPart())) {} + pTextData(new ScHeaderFooterTextData(rData.GetContentObj(), rData.GetPart(), rData.GetTextObject())) {} ScHeaderFooterEditSource::ScHeaderFooterEditSource( - ScHeaderFooterContentObj& rContent, sal_uInt16 nP) : - pTextData(new ScHeaderFooterTextData(rContent, nP)) {} + ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj) : + pTextData(new ScHeaderFooterTextData(rContent, nP, pTextObj)) {} ScHeaderFooterEditSource::~ScHeaderFooterEditSource() { @@ -87,7 +87,7 @@ ScEditEngineDefaulter* ScHeaderFooterEditSource::GetEditEngine() SvxEditSource* ScHeaderFooterEditSource::Clone() const { return new ScHeaderFooterEditSource( - pTextData->GetContentObj(), pTextData->GetPart()); + pTextData->GetContentObj(), pTextData->GetPart(), pTextData->GetTextObject()); } SvxTextForwarder* ScHeaderFooterEditSource::GetTextForwarder() diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx index b0cc5bccdb5f..edd7b9e94dee 100644 --- a/sc/source/ui/unoobj/fielduno.cxx +++ b/sc/source/ui/unoobj/fielduno.cxx @@ -848,7 +848,8 @@ uno::Sequence<rtl::OUString> SAL_CALL ScCellFieldObj::getSupportedServiceNames() //------------------------------------------------------------------------ -ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterContentObj* pContent, sal_uInt16 nP, sal_uInt16 nT) : +ScHeaderFieldsObj::ScHeaderFieldsObj( + ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, sal_uInt16 nT) : pContentObj( pContent ), nPart( nP ), nType( nT ), @@ -859,7 +860,7 @@ ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterContentObj* pContent, sal_uIn if (pContentObj) { pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart); + pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, pTextObj); } else pEditSource = NULL; @@ -1118,7 +1119,7 @@ ScHeaderFieldObj::ScHeaderFieldObj( if (pContentObj) { pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart); + pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, NULL); } else pEditSource = NULL; @@ -1187,7 +1188,7 @@ void SAL_CALL ScHeaderFieldObj::release() throw() void ScHeaderFieldObj::InitDoc( const uno::Reference<text::XTextRange>& rContent, - ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const ESelection& rSel) + ScHeaderFooterContentObj* pContent, sal_uInt16 nP, const EditTextObject* pTextObj, const ESelection& rSel) { if ( pContent && !pEditSource ) { @@ -1199,7 +1200,7 @@ void ScHeaderFieldObj::InitDoc( mpContent = rContent; pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart); + pEditSource = new ScHeaderFooterEditSource(*pContentObj, nPart, pTextObj); } } diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx index b333f142648d..faaabd3c800f 100644 --- a/sc/source/ui/unoobj/textuno.cxx +++ b/sc/source/ui/unoobj/textuno.cxx @@ -109,55 +109,27 @@ SC_SIMPLE_SERVICE_INFO( ScHeaderFooterTextObj, "ScHeaderFooterTextObj", "stardiv ScHeaderFooterContentObj::ScHeaderFooterContentObj( const EditTextObject* pLeft, const EditTextObject* pCenter, const EditTextObject* pRight ) : - pLeftText ( NULL ), - pCenterText ( NULL ), - pRightText ( NULL ) + mxLeftText(new ScHeaderFooterTextObj(*this, SC_HDFT_LEFT, pLeft)), + mxCenterText(new ScHeaderFooterTextObj(*this, SC_HDFT_CENTER, pCenter)), + mxRightText(new ScHeaderFooterTextObj(*this, SC_HDFT_RIGHT, pRight)) { - if ( pLeft ) - pLeftText = pLeft->Clone(); - if ( pCenter ) - pCenterText = pCenter->Clone(); - if ( pRight ) - pRightText = pRight->Clone(); } -ScHeaderFooterContentObj::~ScHeaderFooterContentObj() -{ - delete pLeftText; - delete pCenterText; - delete pRightText; -} +ScHeaderFooterContentObj::~ScHeaderFooterContentObj() {} -void ScHeaderFooterContentObj::AddListener( SfxListener& rListener ) +const EditTextObject* ScHeaderFooterContentObj::GetLeftEditObject() const { - rListener.StartListening( aBC ); + return mxLeftText->GetTextObject(); } -void ScHeaderFooterContentObj::RemoveListener( SfxListener& rListener ) +const EditTextObject* ScHeaderFooterContentObj::GetCenterEditObject() const { - rListener.EndListening( aBC ); + return mxCenterText->GetTextObject(); } -void ScHeaderFooterContentObj::UpdateText( sal_uInt16 nPart, EditEngine& rSource ) +const EditTextObject* ScHeaderFooterContentObj::GetRightEditObject() const { - EditTextObject* pNew = rSource.CreateTextObject(); - switch (nPart) - { - case SC_HDFT_LEFT: - delete pLeftText; - pLeftText = pNew; - break; - case SC_HDFT_CENTER: - delete pCenterText; - pCenterText = pNew; - break; - default: // SC_HDFT_RIGHT - delete pRightText; - pRightText = pNew; - break; - } - - aBC.Broadcast( ScHeaderFooterChangedHint( nPart ) ); + return mxRightText->GetTextObject(); } // XHeaderFooterContent @@ -166,21 +138,24 @@ uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getLeftText() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_LEFT ); + uno::Reference<text::XText> xInt(*mxLeftText, uno::UNO_QUERY); + return xInt; } uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getCenterText() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_CENTER ); + uno::Reference<text::XText> xInt(*mxCenterText, uno::UNO_QUERY); + return xInt; } uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getRightText() throw(uno::RuntimeException) { SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_RIGHT ); + uno::Reference<text::XText> xInt(*mxRightText, uno::UNO_QUERY); + return xInt; } // XUnoTunnel @@ -220,8 +195,9 @@ ScHeaderFooterContentObj* ScHeaderFooterContentObj::getImplementation( //------------------------------------------------------------------------ -ScHeaderFooterTextData::ScHeaderFooterTextData( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ) : +ScHeaderFooterTextData::ScHeaderFooterTextData( + ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj) : + mpTextObj(pTextObj ? pTextObj->Clone() : NULL), rContentObj( rContent ), nPart( nP ), pEditEngine( NULL ), @@ -229,34 +205,21 @@ ScHeaderFooterTextData::ScHeaderFooterTextData( ScHeaderFooterContentObj& rConte bDataValid( false ), bInUpdate( false ) { + if (!mpTextObj) + fprintf(stdout, "ScHeaderFooterTextData::ScHeaderFooterTextData: mpTextObj = %p\n", mpTextObj); rContentObj.acquire(); // must not go away - rContentObj.AddListener( *this ); } ScHeaderFooterTextData::~ScHeaderFooterTextData() { SolarMutexGuard aGuard; // needed for EditEngine dtor - rContentObj.RemoveListener( *this ); - delete pForwarder; delete pEditEngine; rContentObj.release(); } -void ScHeaderFooterTextData::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScHeaderFooterChangedHint ) ) - { - if ( ((const ScHeaderFooterChangedHint&)rHint).GetPart() == nPart ) - { - if (!bInUpdate) // not for own updates - bDataValid = false; // text has to be fetched again - } - } -} - SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder() { if (!pEditEngine) @@ -292,38 +255,42 @@ SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder() if (bDataValid) return pForwarder; - const EditTextObject* pData; - if (nPart == SC_HDFT_LEFT) - pData = rContentObj.GetLeftEditObject(); - else if (nPart == SC_HDFT_CENTER) - pData = rContentObj.GetCenterEditObject(); - else - pData = rContentObj.GetRightEditObject(); - - if (pData) - pEditEngine->SetText(*pData); + if (mpTextObj) + pEditEngine->SetText(*mpTextObj); - bDataValid = sal_True; + bDataValid = true; return pForwarder; } void ScHeaderFooterTextData::UpdateData() { - if ( pEditEngine ) + fprintf(stdout, "ScHeaderFooterTextData::UpdateData: 1\n"); + if (pEditEngine) { - bInUpdate = sal_True; // don't reset bDataValid during UpdateText + delete mpTextObj; + mpTextObj = pEditEngine->CreateTextObject(); + bDataValid = false; + } +} - rContentObj.UpdateText( nPart, *pEditEngine ); +void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine) +{ + fprintf(stdout, "ScHeaderFooterTextData::UpdateData: 2\n"); + delete mpTextObj; + mpTextObj = rEditEngine.CreateTextObject(); + bDataValid = false; +} - bInUpdate = false; - } +const EditTextObject* ScHeaderFooterTextData::GetTextObject() const +{ + return mpTextObj; } //------------------------------------------------------------------------ -ScHeaderFooterTextObj::ScHeaderFooterTextObj( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ) : - aTextData( rContent, nP ), +ScHeaderFooterTextObj::ScHeaderFooterTextObj( + ScHeaderFooterContentObj& rContent, sal_uInt16 nP, const EditTextObject* pTextObj) : + aTextData(rContent, nP, pTextObj), pUnoText( NULL ) { // ScHeaderFooterTextData acquires rContent @@ -347,6 +314,11 @@ ScHeaderFooterTextObj::~ScHeaderFooterTextObj() pUnoText->release(); } +const EditTextObject* ScHeaderFooterTextObj::GetTextObject() const +{ + return aTextData.GetTextObject(); +} + const SvxUnoText& ScHeaderFooterTextObj::GetUnoText() { if (!pUnoText) @@ -421,10 +393,9 @@ void SAL_CALL ScHeaderFooterTextObj::setString( const rtl::OUString& aText ) thr String aString(aText); // for pure text, no font info is needed in pool defaults - ScHeaderEditEngine aEditEngine( EditEngine::CreatePool(), sal_True ); + ScHeaderEditEngine aEditEngine(EditEngine::CreatePool(), true); aEditEngine.SetText( aString ); - - aTextData.GetContentObj().UpdateText( aTextData.GetPart(), aEditEngine ); + aTextData.UpdateData(aEditEngine); } void SAL_CALL ScHeaderFooterTextObj::insertString( const uno::Reference<text::XTextRange>& xRange, @@ -513,7 +484,7 @@ void SAL_CALL ScHeaderFooterTextObj::insertTextContent( } pHeaderField->InitDoc( - xTextRange, &aTextData.GetContentObj(), aTextData.GetPart(), aSelection); + xTextRange, &aTextData.GetContentObj(), aTextData.GetPart(), aTextData.GetTextObject(), aSelection); // for bAbsorb=FALSE, the new selection must be behind the inserted content // (the xml filter relies on this) @@ -582,7 +553,8 @@ uno::Reference<container::XEnumerationAccess> SAL_CALL ScHeaderFooterTextObj::ge { SolarMutexGuard aGuard; // all fields - return new ScHeaderFieldsObj( &aTextData.GetContentObj(), aTextData.GetPart(), SC_SERVICE_INVALID ); + return new ScHeaderFieldsObj( + &aTextData.GetContentObj(), aTextData.GetPart(), aTextData.GetTextObject(), SC_SERVICE_INVALID); } uno::Reference<container::XNameAccess> SAL_CALL ScHeaderFooterTextObj::getTextFieldMasters() |