sd/source/core/text/textapi.cxx |   89 ++++++++++++++++------------------------
 1 file changed, 36 insertions(+), 53 deletions(-)

New commits:
commit e08c22500af085712a2514561996ae882b477ec6
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Apr 19 17:28:50 2024 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Tue May 14 12:42:25 2024 +0200

    annot: use smart pointers in TextAPIEditSource and clean-up
    
    rename TextAPIEditSource_Impl to OutlinerHolder and use smart
    pointers (std::unique_ptr) in OutlinerHolder instead of manually
    taking care of the destruction.
    
    Change-Id: I7b8397be35ad9a7a5c6a461ecb522af15eb5c6ed
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166496
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>
    Tested-by: Jenkins

diff --git a/sd/source/core/text/textapi.cxx b/sd/source/core/text/textapi.cxx
index afb3c80714e5..c5f9ab631bff 100644
--- a/sd/source/core/text/textapi.cxx
+++ b/sd/source/core/text/textapi.cxx
@@ -83,13 +83,14 @@ void UndoTextAPIChanged::Redo()
     }
 }
 
-namespace {
+namespace
+{
 
-struct TextAPIEditSource_Impl
+struct OutlinerHolder
 {
     SdrModel* mpModel;
-    Outliner* mpOutliner;
-    SvxOutlinerForwarder* mpTextForwarder;
+    std::unique_ptr<Outliner> mpOutliner;
+    std::unique_ptr<SvxOutlinerForwarder> mpTextForwarder;
 };
 
 }
@@ -97,22 +98,20 @@ struct TextAPIEditSource_Impl
 class TextAPIEditSource : public SvxEditSource
 {
     // refcounted
-    std::shared_ptr<TextAPIEditSource_Impl> m_xImpl;
+    std::shared_ptr<OutlinerHolder> mpHolder;
 
     virtual std::unique_ptr<SvxEditSource> Clone() const override;
-    virtual SvxTextForwarder*   GetTextForwarder() override;
-    virtual void                UpdateData() override;
-    explicit            TextAPIEditSource( const TextAPIEditSource& rSource );
+    virtual SvxTextForwarder* GetTextForwarder() override;
+    virtual void UpdateData() override;
+    explicit TextAPIEditSource(const TextAPIEditSource& rSource);
 
 public:
-    explicit            TextAPIEditSource(SdrModel* pModel);
+    explicit TextAPIEditSource(SdrModel* pModel);
 
-    void                Dispose();
-    void                SetText( OutlinerParaObject const & rText );
+    void SetText(OutlinerParaObject const & rText);
     std::optional<OutlinerParaObject> CreateText();
-    OUString            GetText() const;
-
-    SdrModel* getModel() { return m_xImpl->mpModel; }
+    OUString GetText() const;
+    SdrModel* getModel() { return mpHolder->mpModel; }
 };
 
 static const SvxItemPropertySet* ImplGetSdTextPortionPropertyMap()
@@ -152,12 +151,8 @@ rtl::Reference<TextApiObject> 
TextApiObject::create(SdrModel* pModel)
 
 void TextApiObject::dispose()
 {
-    if( mpSource )
-    {
-        mpSource->Dispose();
+    if (mpSource)
         mpSource.reset();
-    }
-
 }
 
 std::optional<OutlinerParaObject> TextApiObject::CreateText()
@@ -192,13 +187,13 @@ TextApiObject* TextApiObject::getImplementation( const 
css::uno::Reference< css:
 
 TextAPIEditSource::TextAPIEditSource(const TextAPIEditSource& rSource)
     : SvxEditSource(*this)
-    , m_xImpl(rSource.m_xImpl) // shallow copy; uses internal refcounting
+    , mpHolder(rSource.mpHolder) // shallow copy; uses internal refcounting
 {
 }
 
 std::unique_ptr<SvxEditSource> TextAPIEditSource::Clone() const
 {
-    return std::unique_ptr<SvxEditSource>(new TextAPIEditSource( *this ));
+    return std::unique_ptr<SvxEditSource>(new TextAPIEditSource(*this));
 }
 
 void TextAPIEditSource::UpdateData()
@@ -207,70 +202,58 @@ void TextAPIEditSource::UpdateData()
 }
 
 TextAPIEditSource::TextAPIEditSource(SdrModel* pModel)
-: m_xImpl(std::make_shared<TextAPIEditSource_Impl>())
+    : mpHolder(std::make_shared<OutlinerHolder>())
 {
-    m_xImpl->mpModel = pModel;
-    m_xImpl->mpOutliner = nullptr;
-    m_xImpl->mpTextForwarder = nullptr;
-}
-
-void TextAPIEditSource::Dispose()
-{
-    m_xImpl->mpModel = nullptr;
-    delete m_xImpl->mpTextForwarder;
-    m_xImpl->mpTextForwarder = nullptr;
-
-    delete m_xImpl->mpOutliner;
-    m_xImpl->mpOutliner = nullptr;
+    mpHolder->mpModel = pModel;
 }
 
 SvxTextForwarder* TextAPIEditSource::GetTextForwarder()
 {
-    if(!m_xImpl->mpModel)
+    if (!mpHolder->mpModel)
         return nullptr; // mpModel == 0 can be used to flag this as disposed
 
-    if (!m_xImpl->mpOutliner)
+    if (!mpHolder->mpOutliner)
     {
         //init draw model first
-        SfxItemPool* pPool = &m_xImpl->mpModel->GetItemPool();
-        m_xImpl->mpOutliner = new SdrOutliner(pPool, OutlinerMode::TextObject);
-        SdDrawDocument::SetCalcFieldValueHdl(m_xImpl->mpOutliner);
+        SfxItemPool* pPool = &mpHolder->mpModel->GetItemPool();
+        mpHolder->mpOutliner.reset(new SdrOutliner(pPool, 
OutlinerMode::TextObject));
+        SdDrawDocument::SetCalcFieldValueHdl(mpHolder->mpOutliner.get());
     }
 
-    if (!m_xImpl->mpTextForwarder)
-        m_xImpl->mpTextForwarder = new 
SvxOutlinerForwarder(*m_xImpl->mpOutliner, false);
+    if (!mpHolder->mpTextForwarder)
+        mpHolder->mpTextForwarder.reset(new 
SvxOutlinerForwarder(*mpHolder->mpOutliner, false));
 
-    return m_xImpl->mpTextForwarder;
+    return mpHolder->mpTextForwarder.get();
 }
 
 void TextAPIEditSource::SetText( OutlinerParaObject const & rText )
 {
-    if (m_xImpl->mpModel)
+    if (mpHolder->mpModel)
     {
-        if (!m_xImpl->mpOutliner)
+        if (!mpHolder->mpOutliner)
         {
             //init draw model first
-            SfxItemPool* pPool = &m_xImpl->mpModel->GetItemPool();
-            m_xImpl->mpOutliner = new SdrOutliner(pPool, 
OutlinerMode::TextObject);
-            SdDrawDocument::SetCalcFieldValueHdl(m_xImpl->mpOutliner);
+            SfxItemPool* pPool = &mpHolder->mpModel->GetItemPool();
+            mpHolder->mpOutliner.reset(new SdrOutliner(pPool, 
OutlinerMode::TextObject));
+            SdDrawDocument::SetCalcFieldValueHdl(mpHolder->mpOutliner.get());
         }
 
-        m_xImpl->mpOutliner->SetText( rText );
+        mpHolder->mpOutliner->SetText(rText);
     }
 }
 
 std::optional<OutlinerParaObject> TextAPIEditSource::CreateText()
 {
-    if (m_xImpl->mpModel && m_xImpl->mpOutliner)
-        return m_xImpl->mpOutliner->CreateParaObject();
+    if (mpHolder->mpModel && mpHolder->mpOutliner)
+        return mpHolder->mpOutliner->CreateParaObject();
     else
         return std::nullopt;
 }
 
 OUString TextAPIEditSource::GetText() const
 {
-    if (m_xImpl->mpModel && m_xImpl->mpOutliner)
-        return m_xImpl->mpOutliner->GetEditEngine().GetText();
+    if (mpHolder->mpModel && mpHolder->mpOutliner)
+        return mpHolder->mpOutliner->GetEditEngine().GetText();
     else
         return OUString();
 }

Reply via email to