summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@gmail.com>2012-04-24 16:19:38 -0400
committerKohei Yoshida <kohei.yoshida@gmail.com>2012-04-26 09:58:00 -0400
commit399727e98353c24719408780ad9d7e7eee198176 (patch)
treee06c0619e2de06fce23be7ecb05894501cc5eda1 /sc
parent0809ccec5cee9f65461f7b551ffd686d2ff4281c (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...
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/editsrc.hxx3
-rw-r--r--sc/inc/fielduno.hxx7
-rw-r--r--sc/inc/textuno.hxx58
-rw-r--r--sc/source/ui/unoobj/editsrc.cxx8
-rw-r--r--sc/source/ui/unoobj/fielduno.cxx11
-rw-r--r--sc/source/ui/unoobj/textuno.cxx136
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()