summaryrefslogtreecommitdiff
path: root/sc/source/ui/unoobj
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-05-18 02:47:01 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-05-18 20:45:04 +0000
commitfc29ace3438eea09afe3ddbb5118458cbb531b06 (patch)
tree2b0fbfe02011edd3d1b236e1f52f6e15fa8a2719 /sc/source/ui/unoobj
parent6a0081642633eb406059295b90fd0c9b0cd1130f (diff)
better fix for memory leak around calc header-footer UNO objects
Change-Id: I396a2c57b38623d82fe973ad8d53f08b1b480e2e Reviewed-on: https://gerrit.libreoffice.org/25116 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'sc/source/ui/unoobj')
-rw-r--r--sc/source/ui/unoobj/fielduno.cxx12
-rw-r--r--sc/source/ui/unoobj/textuno.cxx38
2 files changed, 28 insertions, 22 deletions
diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx
index 74e351c0fd09..c71ac79c4064 100644
--- a/sc/source/ui/unoobj/fielduno.cxx
+++ b/sc/source/ui/unoobj/fielduno.cxx
@@ -479,19 +479,23 @@ uno::Reference<text::XTextField> ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_In
// Get the parent text range instance.
uno::Reference<text::XTextRange> xTextRange;
- rtl::Reference<ScHeaderFooterContentObj> rContentObj = mrData.GetContentObj();
+ uno::Reference<sheet::XHeaderFooterContent> xContentObj = mrData.GetContentObj();
+ if (!xContentObj.is())
+ throw uno::RuntimeException("");
+
+ rtl::Reference<ScHeaderFooterContentObj> pContentObj = ScHeaderFooterContentObj::getImplementation(xContentObj);
uno::Reference<text::XText> xText;
switch ( mrData.GetPart() )
{
case ScHeaderFooterPart::LEFT:
- xText = rContentObj->getLeftText();
+ xText = pContentObj->getLeftText();
break;
case ScHeaderFooterPart::CENTER:
- xText = rContentObj->getCenterText();
+ xText = pContentObj->getCenterText();
break;
case ScHeaderFooterPart::RIGHT:
- xText = rContentObj->getRightText();
+ xText = pContentObj->getRightText();
break;
}
diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx
index d5c73d99d1c5..f52b030f9e45 100644
--- a/sc/source/ui/unoobj/textuno.cxx
+++ b/sc/source/ui/unoobj/textuno.cxx
@@ -92,12 +92,7 @@ static const SvxItemPropertySet * lcl_GetHdFtPropertySet()
SC_SIMPLE_SERVICE_INFO( ScHeaderFooterContentObj, "ScHeaderFooterContentObj", "com.sun.star.sheet.HeaderFooterContent" )
SC_SIMPLE_SERVICE_INFO( ScHeaderFooterTextObj, "ScHeaderFooterTextObj", "stardiv.one.Text.Text" )
-ScHeaderFooterContentObj::ScHeaderFooterContentObj( const EditTextObject* pLeft,
- const EditTextObject* pCenter,
- const EditTextObject* pRight ) :
- mxLeftText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::LEFT, pLeft)),
- mxCenterText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::CENTER, pCenter)),
- mxRightText(new ScHeaderFooterTextObj(this, ScHeaderFooterPart::RIGHT, pRight))
+ScHeaderFooterContentObj::ScHeaderFooterContentObj()
{
}
@@ -178,17 +173,20 @@ rtl::Reference<ScHeaderFooterContentObj> ScHeaderFooterContentObj::getImplementa
return pRet;
}
-void ScHeaderFooterContentObj::dispose()
+void ScHeaderFooterContentObj::Init( const EditTextObject* pLeft,
+ const EditTextObject* pCenter,
+ const EditTextObject* pRight )
{
- mxLeftText->dispose();
- mxCenterText->dispose();
- mxRightText->dispose();
+ uno::Reference<css::sheet::XHeaderFooterContent> xThis(this);
+ mxLeftText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::LEFT, pLeft));
+ mxCenterText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::CENTER, pCenter));
+ mxRightText = rtl::Reference<ScHeaderFooterTextObj>(new ScHeaderFooterTextObj(xThis, ScHeaderFooterPart::RIGHT, pRight));
}
ScHeaderFooterTextData::ScHeaderFooterTextData(
- rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) :
+ uno::WeakReference<sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) :
mpTextObj(pTextObj ? pTextObj->Clone() : nullptr),
- rContentObj( rContent ),
+ xContentObj( xContent ),
nPart( nP ),
pEditEngine( nullptr ),
pForwarder( nullptr ),
@@ -261,8 +259,8 @@ void ScHeaderFooterTextData::UpdateData(EditEngine& rEditEngine)
}
ScHeaderFooterTextObj::ScHeaderFooterTextObj(
- rtl::Reference<ScHeaderFooterContentObj> const & rContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) :
- aTextData(rContent, nP, pTextObj)
+ uno::WeakReference<sheet::XHeaderFooterContent> xContent, ScHeaderFooterPart nP, const EditTextObject* pTextObj) :
+ aTextData(xContent, nP, pTextObj)
{
// ScHeaderFooterTextData acquires rContent
// pUnoText is created on demand (getString/setString work without it)
@@ -329,18 +327,22 @@ OUString SAL_CALL ScHeaderFooterTextObj::getString() throw(uno::RuntimeException
OUString aRet;
const EditTextObject* pData;
- rtl::Reference<ScHeaderFooterContentObj> rContentObj = aTextData.GetContentObj();
+ uno::Reference<css::sheet::XHeaderFooterContent> xContentObj = aTextData.GetContentObj();
+ if (!xContentObj.is())
+ throw css::uno::RuntimeException("");
+
+ rtl::Reference<ScHeaderFooterContentObj> pObj = ScHeaderFooterContentObj::getImplementation(xContentObj);
switch ( aTextData.GetPart() )
{
case ScHeaderFooterPart::LEFT:
- pData = rContentObj->GetLeftEditObject();
+ pData = pObj->GetLeftEditObject();
break;
case ScHeaderFooterPart::CENTER:
- pData = rContentObj->GetCenterEditObject();
+ pData = pObj->GetCenterEditObject();
break;
case ScHeaderFooterPart::RIGHT:
- pData = rContentObj->GetRightEditObject();
+ pData = pObj->GetRightEditObject();
break;
default:
SAL_WARN("sc.ui","unexpected enum value of ScHeaderFooterPart");