sd/inc/Annotation.hxx                                |    4 -
 sd/inc/sdpage.hxx                                    |    9 +--
 sd/qa/unit/SdrPdfImportTest.cxx                      |    1 
 sd/source/core/annotations/Annotation.cxx            |   19 ++----
 sd/source/core/annotations/AnnotationEnumeration.cxx |    1 
 sd/source/core/sdpage.cxx                            |    1 
 sd/source/core/sdpage2.cxx                           |   14 ++--
 sd/source/filter/pdf/sdpdffilter.cxx                 |   10 +--
 sd/source/ui/annotations/annotationmanager.cxx       |   55 +++++++++++--------
 sd/source/ui/annotations/annotationmanagerimpl.hxx   |   16 ++---
 sd/source/ui/annotations/annotationtag.cxx           |   17 ++---
 sd/source/ui/annotations/annotationtag.hxx           |    8 +-
 sd/source/ui/unoidl/unomodel.cxx                     |    2 
 sd/source/ui/unoidl/unopage.cxx                      |    7 +-
 14 files changed, 87 insertions(+), 77 deletions(-)

New commits:
commit fd2988a5911758cc6c56942c235857fd9a327fd4
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Nov 8 11:59:13 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Nov 9 07:00:22 2023 +0100

    use more concrete sd::Annotation in AnnotationManagerImpl
    
    instead of casting to and from the UNO type
    
    Change-Id: Ia69865e1c4fb809e325335d33118287bcc692a39
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159177
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sd/inc/Annotation.hxx b/sd/inc/Annotation.hxx
index 00870dc703e8..c09f67703289 100644
--- a/sd/inc/Annotation.hxx
+++ b/sd/inc/Annotation.hxx
@@ -49,7 +49,7 @@ namespace sd {
 
 enum class CommentNotificationType { Add, Modify, Remove };
 
-void createAnnotation( css::uno::Reference< css::office::XAnnotation >& 
xAnnotation, SdPage* pPage );
+void createAnnotation( rtl::Reference< Annotation >& xAnnotation, SdPage* 
pPage );
 
 std::unique_ptr<SdrUndoAction> CreateUndoInsertOrRemoveAnnotation( const 
css::uno::Reference< css::office::XAnnotation >& xAnnotation, bool bInsert );
 
@@ -73,7 +73,7 @@ struct SD_DLLPUBLIC CustomAnnotationMarker
     std::vector<basegfx::B2DPolygon> maPolygons;
 };
 
-class Annotation final : private ::cppu::BaseMutex,
+class SD_DLLPUBLIC Annotation final : private ::cppu::BaseMutex,
                    public 
::cppu::WeakComponentImplHelper<css::office::XAnnotation>,
                    public ::cppu::PropertySetMixin<css::office::XAnnotation>
 {
diff --git a/sd/inc/sdpage.hxx b/sd/inc/sdpage.hxx
index 9ba839724bc0..ef127ea60769 100644
--- a/sd/inc/sdpage.hxx
+++ b/sd/inc/sdpage.hxx
@@ -54,6 +54,7 @@ class Graphic;
 namespace sd
 {
     class MainSequence;
+    class Annotation;
 }
 
 namespace sd {
@@ -79,7 +80,7 @@ namespace sd {
         bool operator==( const HeaderFooterSettings& rSettings ) const;
     };
 
-    typedef std::vector< css::uno::Reference< css::office::XAnnotation > > 
AnnotationVector;
+    typedef std::vector< rtl::Reference< Annotation > > AnnotationVector;
 }
 
 namespace sd {
@@ -367,9 +368,9 @@ public:
     */
     bool IsPrecious() const { return mbIsPrecious; }
 
-    void createAnnotation( css::uno::Reference< css::office::XAnnotation >& 
xAnnotation );
-    void addAnnotation( const css::uno::Reference< css::office::XAnnotation >& 
xAnnotation, int nIndex );
-    void removeAnnotation( const css::uno::Reference< css::office::XAnnotation 
>& xAnnotation );
+    void createAnnotation( rtl::Reference< sd::Annotation >& xAnnotation );
+    void addAnnotation( const rtl::Reference< sd::Annotation >& xAnnotation, 
int nIndex );
+    void removeAnnotation( const rtl::Reference< sd::Annotation >& xAnnotation 
);
     const sd::AnnotationVector& getAnnotations() const { return maAnnotations; 
}
     bool Equals(const SdPage&) const;
     virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
diff --git a/sd/qa/unit/SdrPdfImportTest.cxx b/sd/qa/unit/SdrPdfImportTest.cxx
index 87225f66eac2..5b6c0b4b43be 100644
--- a/sd/qa/unit/SdrPdfImportTest.cxx
+++ b/sd/qa/unit/SdrPdfImportTest.cxx
@@ -20,6 +20,7 @@
 #include <vcl/filter/PDFiumLibrary.hxx>
 #include <vcl/pdf/PDFAnnotationSubType.hxx>
 
+#include <Annotation.hxx>
 #include <DrawDocShell.hxx>
 #include <ViewShell.hxx>
 #include <sdpage.hxx>
diff --git a/sd/source/core/annotations/Annotation.cxx 
b/sd/source/core/annotations/Annotation.cxx
index 432d38f9cb32..9faee9d7b701 100644
--- a/sd/source/core/annotations/Annotation.cxx
+++ b/sd/source/core/annotations/Annotation.cxx
@@ -108,7 +108,7 @@ protected:
 
 }
 
-void createAnnotation(uno::Reference<office::XAnnotation>& xAnnotation, 
SdPage* pPage )
+void createAnnotation(rtl::Reference<Annotation>& xAnnotation, SdPage* pPage )
 {
     xAnnotation.set(
         new Annotation(comphelper::getProcessComponentContext(), pPage));
@@ -409,10 +409,8 @@ 
UndoInsertOrRemoveAnnotation::UndoInsertOrRemoveAnnotation( Annotation& rAnnotat
     SdPage* pPage = rAnnotation.GetPage();
     if( pPage )
     {
-        uno::Reference<office::XAnnotation> xAnnotation( &rAnnotation );
-
         const AnnotationVector& rVec = pPage->getAnnotations();
-        auto iter = std::find(rVec.begin(), rVec.end(), xAnnotation);
+        auto iter = std::find(rVec.begin(), rVec.end(), &rAnnotation);
         mnIndex += std::distance(rVec.begin(), iter);
     }
 }
@@ -424,14 +422,14 @@ void UndoInsertOrRemoveAnnotation::Undo()
     if( !(pPage && pModel) )
         return;
 
-    uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
     if( mbInsert )
     {
-        pPage->removeAnnotation( xAnnotation );
+        pPage->removeAnnotation( mxAnnotation );
     }
     else
     {
-        pPage->addAnnotation( xAnnotation, mnIndex );
+        pPage->addAnnotation( mxAnnotation, mnIndex );
+        uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
         LOKCommentNotifyAll( CommentNotificationType::Add, xAnnotation );
     }
 }
@@ -443,16 +441,15 @@ void UndoInsertOrRemoveAnnotation::Redo()
     if( !(pPage && pModel) )
         return;
 
-    uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
-
     if( mbInsert )
     {
-        pPage->addAnnotation( xAnnotation, mnIndex );
+        pPage->addAnnotation( mxAnnotation, mnIndex );
+        uno::Reference<office::XAnnotation> xAnnotation( mxAnnotation );
         LOKCommentNotifyAll( CommentNotificationType::Add, xAnnotation );
     }
     else
     {
-        pPage->removeAnnotation( xAnnotation );
+        pPage->removeAnnotation( mxAnnotation );
     }
 }
 
diff --git a/sd/source/core/annotations/AnnotationEnumeration.cxx 
b/sd/source/core/annotations/AnnotationEnumeration.cxx
index 5fae2422b8f4..c622b10383bb 100644
--- a/sd/source/core/annotations/AnnotationEnumeration.cxx
+++ b/sd/source/core/annotations/AnnotationEnumeration.cxx
@@ -23,6 +23,7 @@
 #include <com/sun/star/container/NoSuchElementException.hpp>
 #include <com/sun/star/office/XAnnotationEnumeration.hpp>
 
+#include <Annotation.hxx>
 #include <AnnotationEnumeration.hxx>
 #include <sdpage.hxx>
 
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index 3d6c20f09984..02609a7083fa 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -66,6 +66,7 @@
 #include <o3tl/sorted_vector.hxx>
 #include <xmloff/autolayout.hxx>
 
+#include <Annotation.hxx>
 #include <Outliner.hxx>
 #include <app.hrc>
 #include <createunopageimpl.hxx>
diff --git a/sd/source/core/sdpage2.cxx b/sd/source/core/sdpage2.cxx
index 49c4133f3bb3..0195a5578acb 100644
--- a/sd/source/core/sdpage2.cxx
+++ b/sd/source/core/sdpage2.cxx
@@ -378,9 +378,9 @@ void SdPage::lateInit(const SdPage& rSrcPage)
     rSrcPage.cloneAnimations(*this);
 
     // annotations
-    for(const Reference< XAnnotation >& srcAnnotation : rSrcPage.maAnnotations)
+    for(const rtl::Reference< Annotation >& srcAnnotation : 
rSrcPage.maAnnotations)
     {
-        Reference< XAnnotation > ref;
+        rtl::Reference< Annotation > ref;
         createAnnotation(ref);
         ref->setPosition(srcAnnotation->getPosition());
         ref->setSize(srcAnnotation->getSize());
@@ -553,12 +553,12 @@ bool SdPage::Equals(const SdPage& rOtherPage) const
     return true;
  }
 
-void SdPage::createAnnotation( css::uno::Reference< css::office::XAnnotation 
>& xAnnotation )
+void SdPage::createAnnotation( rtl::Reference< Annotation >& xAnnotation )
 {
     sd::createAnnotation( xAnnotation, this );
 }
 
-void SdPage::addAnnotation( const Reference< XAnnotation >& xAnnotation, int 
nIndex )
+void SdPage::addAnnotation( const rtl::Reference< Annotation >& xAnnotation, 
int nIndex )
 {
     if( (nIndex == -1) || (nIndex > static_cast<int>(maAnnotations.size())) )
     {
@@ -581,10 +581,10 @@ void SdPage::addAnnotation( const Reference< XAnnotation 
>& xAnnotation, int nIn
     NotifyDocumentEvent(
         static_cast< SdDrawDocument& >(getSdrModelFromSdrPage()),
         "OnAnnotationInserted",
-        Reference<XInterface>(xAnnotation, UNO_QUERY));
+        
Reference<XInterface>(static_cast<cppu::OWeakObject*>(xAnnotation.get()), 
UNO_QUERY));
 }
 
-void SdPage::removeAnnotation( const Reference< XAnnotation >& xAnnotation )
+void SdPage::removeAnnotation( const rtl::Reference< Annotation >& xAnnotation 
)
 {
     if( getSdrModelFromSdrPage().IsUndoEnabled() )
     {
@@ -601,7 +601,7 @@ void SdPage::removeAnnotation( const Reference< XAnnotation 
>& xAnnotation )
     NotifyDocumentEvent(
         static_cast< SdDrawDocument& >( getSdrModelFromSdrPage() ),
         "OnAnnotationRemoved",
-        Reference<XInterface>( xAnnotation, UNO_QUERY ) );
+        Reference<XInterface>( 
static_cast<cppu::OWeakObject*>(xAnnotation.get()), UNO_QUERY ) );
 }
 
 void SdPage::getGraphicsForPrefetch(std::vector<Graphic*>& graphics) const
diff --git a/sd/source/filter/pdf/sdpdffilter.cxx 
b/sd/source/filter/pdf/sdpdffilter.cxx
index 35b1bffbcb73..c0800010e16a 100644
--- a/sd/source/filter/pdf/sdpdffilter.cxx
+++ b/sd/source/filter/pdf/sdpdffilter.cxx
@@ -93,7 +93,7 @@ bool SdPdfFilter::Import()
 
         for (auto const& rPDFAnnotation : rPDFGraphicResult.GetAnnotations())
         {
-            uno::Reference<office::XAnnotation> xAnnotation;
+            rtl::Reference<sd::Annotation> xAnnotation;
             pPage->createAnnotation(xAnnotation);
 
             xAnnotation->setAuthor(rPDFAnnotation.maAuthor);
@@ -111,10 +111,9 @@ bool SdPdfFilter::Import()
 
             if (rPDFAnnotation.mpMarker)
             {
-                auto* pAnnotation = 
static_cast<sd::Annotation*>(xAnnotation.get());
-                pAnnotation->createCustomAnnotationMarker();
+                xAnnotation->createCustomAnnotationMarker();
                 sd::CustomAnnotationMarker& rCustomAnnotationMarker
-                    = pAnnotation->getCustomAnnotationMarker();
+                    = xAnnotation->getCustomAnnotationMarker();
 
                 rCustomAnnotationMarker.maLineColor = rPDFAnnotation.maColor;
 
@@ -191,8 +190,7 @@ bool SdPdfFilter::Import()
             }
             else if (rPDFAnnotation.meSubType == 
vcl::pdf::PDFAnnotationSubType::FreeText)
             {
-                auto* pAnnotation = 
static_cast<sd::Annotation*>(xAnnotation.get());
-                pAnnotation->setIsFreeText(true);
+                xAnnotation->setIsFreeText(true);
             }
         }
     }
diff --git a/sd/source/ui/annotations/annotationmanager.cxx 
b/sd/source/ui/annotations/annotationmanager.cxx
index 5ec59e703452..339aefa7c576 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -248,7 +248,7 @@ void SAL_CALL AnnotationManagerImpl::disposing( const 
css::lang::EventObject& /*
 {
 }
 
-Reference<XAnnotation> AnnotationManagerImpl::GetAnnotationById(sal_uInt32 
nAnnotationId)
+rtl::Reference<Annotation> AnnotationManagerImpl::GetAnnotationById(sal_uInt32 
nAnnotationId)
 {
     SdPage* pPage = nullptr;
     do
@@ -266,7 +266,7 @@ Reference<XAnnotation> 
AnnotationManagerImpl::GetAnnotationById(sal_uInt32 nAnno
         }
     } while( pPage );
 
-    Reference<XAnnotation> xAnnotationEmpty;
+    rtl::Reference<Annotation> xAnnotationEmpty;
     return xAnnotationEmpty;
 }
 
@@ -355,13 +355,20 @@ void 
AnnotationManagerImpl::ExecuteDeleteAnnotation(SfxRequest const & rReq)
         break;
     case SID_DELETE_POSTIT:
         {
-            Reference< XAnnotation > xAnnotation;
+            rtl::Reference< Annotation > xAnnotation;
             sal_uInt32 nId = 0;
             if( pArgs )
             {
                 const SfxPoolItem*  pPoolItem = nullptr;
                 if( SfxItemState::SET == pArgs->GetItemState( 
SID_DELETE_POSTIT, true, &pPoolItem ) )
-                    static_cast<const SfxUnoAnyItem*>(pPoolItem)->GetValue() 
>>= xAnnotation;
+                {
+                    uno::Reference<XAnnotation> xTmpAnnotation;
+                    if (static_cast<const 
SfxUnoAnyItem*>(pPoolItem)->GetValue() >>= xTmpAnnotation)
+                    {
+                        xAnnotation = 
dynamic_cast<Annotation*>(xTmpAnnotation.get());
+                        assert(bool(xAnnotation) == bool(xTmpAnnotation) && 
"must be of concrete type sd::Annoation");
+                    }
+                }
                 if( SfxItemState::SET == pArgs->GetItemState( 
SID_ATTR_POSTIT_ID, true, &pPoolItem ) )
                     nId = static_cast<const 
SvxPostItIdItem*>(pPoolItem)->GetValue().toUInt32();
             }
@@ -490,7 +497,7 @@ void AnnotationManagerImpl::InsertAnnotation(const 
OUString& rText)
         }
     }
 
-    Reference< XAnnotation > xAnnotation;
+    rtl::Reference< Annotation > xAnnotation;
     pPage->createAnnotation( xAnnotation );
 
     OUString sAuthor;
@@ -530,7 +537,7 @@ void AnnotationManagerImpl::InsertAnnotation(const 
OUString& rText)
 
 void AnnotationManagerImpl::ExecuteReplyToAnnotation( SfxRequest const & rReq )
 {
-    Reference< XAnnotation > xAnnotation;
+    rtl::Reference< Annotation > xAnnotation;
     const SfxItemSet* pArgs = rReq.GetArgs();
     OUString sReplyText;
     if( pArgs )
@@ -543,7 +550,14 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( 
SfxRequest const & rReq )
             xAnnotation = GetAnnotationById(nReplyId);
         }
         else if( SfxItemState::SET == pArgs->GetItemState( rReq.GetSlot(), 
true, &pPoolItem ) )
-            static_cast<const SfxUnoAnyItem*>( pPoolItem )->GetValue() >>= 
xAnnotation;
+        {
+            uno::Reference<XAnnotation> xTmpAnnotation;
+            if (static_cast<const SfxUnoAnyItem*>(pPoolItem)->GetValue() >>= 
xTmpAnnotation)
+            {
+                xAnnotation = dynamic_cast<Annotation*>(xTmpAnnotation.get());
+                assert(bool(xAnnotation) == bool(xTmpAnnotation) && "must be 
of concrete type sd::Annoation");
+            }
+        }
 
         if( SfxItemState::SET == pArgs->GetItemState( SID_ATTR_POSTIT_TEXT, 
true, &pPoolItem ) )
             sReplyText = static_cast<const SvxPostItTextItem*>( pPoolItem 
)->GetValue();
@@ -614,7 +628,7 @@ void AnnotationManagerImpl::ExecuteReplyToAnnotation( 
SfxRequest const & rReq )
     SelectAnnotation( xAnnotation, true );
 }
 
-void AnnotationManagerImpl::DeleteAnnotation( const Reference< XAnnotation >& 
xAnnotation )
+void AnnotationManagerImpl::DeleteAnnotation( const rtl::Reference< Annotation 
>& xAnnotation )
 {
     SdPage* pPage = GetCurrentPage();
 
@@ -642,10 +656,9 @@ void AnnotationManagerImpl::DeleteAnnotationsByAuthor( 
std::u16string_view sAuth
     {
         pPage = GetNextPage( pPage, true );
 
-        if( pPage && !pPage->getAnnotations().empty() )
+        if( pPage )
         {
-            AnnotationVector aAnnotations( pPage->getAnnotations() );
-            for( Reference< XAnnotation >& xAnnotation : aAnnotations )
+            for( const rtl::Reference< Annotation >& xAnnotation : 
pPage->getAnnotations() )
             {
                 if( xAnnotation->getAuthor() == sAuthor )
                 {
@@ -703,7 +716,7 @@ void AnnotationManagerImpl::GetAnnotationState(SfxItemSet& 
rSet)
 
     rSet.Put(SfxBoolItem(SID_TOGGLE_NOTES, mbShowAnnotations));
 
-    Reference< XAnnotation > xAnnotation;
+    rtl::Reference< Annotation > xAnnotation;
     GetSelectedAnnotation( xAnnotation );
 
     // Don't disable these slot in case of LOK, as postit doesn't need to
@@ -742,7 +755,7 @@ void AnnotationManagerImpl::SelectNextAnnotation(bool 
bForward)
 {
     ShowAnnotations( true );
 
-    Reference< XAnnotation > xCurrent;
+    rtl::Reference< Annotation > xCurrent;
     GetSelectedAnnotation( xCurrent );
     SdPage* pPage = GetCurrentPage();
     if( !pPage )
@@ -852,7 +865,7 @@ void AnnotationManagerImpl::onTagDeselected( AnnotationTag 
const & rTag )
     }
 }
 
-void AnnotationManagerImpl::SelectAnnotation( const css::uno::Reference< 
css::office::XAnnotation >& xAnnotation, bool bEdit /* = sal_False */ )
+void AnnotationManagerImpl::SelectAnnotation( const rtl::Reference< Annotation 
>& xAnnotation, bool bEdit /* = sal_False */ )
 {
     mxSelectedAnnotation = xAnnotation;
 
@@ -866,7 +879,7 @@ void AnnotationManagerImpl::SelectAnnotation( const 
css::uno::Reference< css::of
     }
 }
 
-void AnnotationManagerImpl::GetSelectedAnnotation( css::uno::Reference< 
css::office::XAnnotation >& xAnnotation )
+void AnnotationManagerImpl::GetSelectedAnnotation( rtl::Reference< Annotation 
>& xAnnotation )
 {
     xAnnotation = mxSelectedAnnotation;
 }
@@ -954,7 +967,7 @@ void AnnotationManagerImpl::CreateTags()
 
         rtl::Reference< AnnotationTag > xSelectedTag;
 
-        for (const css::uno::Reference< css::office::XAnnotation > & 
xAnnotation : mxCurrentPage->getAnnotations() )
+        for (const rtl::Reference< Annotation > & xAnnotation : 
mxCurrentPage->getAnnotations() )
         {
             Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( 
xAnnotation->getAuthor() ) ) );
             rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, 
*xViewShell->GetView(), xAnnotation, aColor, nIndex++, maFont ) );
@@ -1029,7 +1042,7 @@ IMPL_LINK(AnnotationManagerImpl,EventMultiplexerListener,
     }
 }
 
-void AnnotationManagerImpl::ExecuteAnnotationTagContextMenu(const 
Reference<XAnnotation>& xAnnotation, weld::Widget* pParent, const 
::tools::Rectangle& rContextRect)
+void AnnotationManagerImpl::ExecuteAnnotationTagContextMenu(const 
rtl::Reference<Annotation>& xAnnotation, weld::Widget* pParent, const 
::tools::Rectangle& rContextRect)
 {
     SfxDispatcher* pDispatcher( getDispatcher( mrBase ) );
     if( !pDispatcher )
@@ -1063,13 +1076,13 @@ void 
AnnotationManagerImpl::ExecuteAnnotationTagContextMenu(const Reference<XAnn
 
     if (sId == ".uno:ReplyToAnnotation")
     {
-        const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( xAnnotation ) );
+        const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( 
css::uno::Reference<XInterface>(static_cast<cppu::OWeakObject*>(xAnnotation.get()))
 ) );
         pDispatcher->ExecuteList(SID_REPLYTO_POSTIT,
                 SfxCallMode::ASYNCHRON, { &aItem });
     }
     else if (sId == ".uno:DeleteAnnotation")
     {
-        const SfxUnoAnyItem aItem( SID_DELETE_POSTIT, Any( xAnnotation ) );
+        const SfxUnoAnyItem aItem( SID_REPLYTO_POSTIT, Any( 
css::uno::Reference<XInterface>(static_cast<cppu::OWeakObject*>(xAnnotation.get()))
 ) );
         pDispatcher->ExecuteList(SID_DELETE_POSTIT, SfxCallMode::ASYNCHRON,
                 { &aItem });
     }
diff --git a/sd/source/ui/annotations/annotationmanagerimpl.hxx 
b/sd/source/ui/annotations/annotationmanagerimpl.hxx
index b5fa42001b11..bbcd5a852199 100644
--- a/sd/source/ui/annotations/annotationmanagerimpl.hxx
+++ b/sd/source/ui/annotations/annotationmanagerimpl.hxx
@@ -38,7 +38,7 @@ struct ImplSVEvent;
 
 namespace sd
 {
-
+class Annotation;
 class ViewShellBase;
 
 namespace tools {
@@ -73,15 +73,15 @@ public:
 
     void SelectNextAnnotation(bool bForward);
 
-    void SelectAnnotation( const css::uno::Reference< css::office::XAnnotation 
>& xAnnotation, bool bEdit = false );
-    void GetSelectedAnnotation( css::uno::Reference< css::office::XAnnotation 
>& xAnnotation );
+    void SelectAnnotation( const rtl::Reference< Annotation >& xAnnotation, 
bool bEdit = false );
+    void GetSelectedAnnotation( rtl::Reference< Annotation >& xAnnotation );
 
     void InsertAnnotation(const OUString& rText);
-    void DeleteAnnotation( const css::uno::Reference< css::office::XAnnotation 
>& xAnnotation );
+    void DeleteAnnotation( const rtl::Reference< Annotation >& xAnnotation );
     void DeleteAnnotationsByAuthor( std::u16string_view sAuthor );
     void DeleteAllAnnotations();
 
-    void ExecuteAnnotationTagContextMenu(const 
css::uno::Reference<css::office::XAnnotation>& xAnnotation, weld::Widget* 
pParent, const ::tools::Rectangle& rContextRect);
+    void ExecuteAnnotationTagContextMenu(const rtl::Reference<Annotation>& 
xAnnotation, weld::Widget* pParent, const ::tools::Rectangle& rContextRect);
 
     static Color GetColorDark(sal_uInt16 aAuthorIndex);
     static Color GetColorLight(sal_uInt16 aAuthorIndex);
@@ -121,13 +121,13 @@ private:
 
     css::uno::Reference< css::drawing::XDrawView > mxView;
     rtl::Reference< SdPage > mxCurrentPage;
-    css::uno::Reference< css::office::XAnnotation > mxSelectedAnnotation;
+    rtl::Reference< Annotation > mxSelectedAnnotation;
 
     bool mbShowAnnotations;
     ImplSVEvent * mnUpdateTagsEvent;
     vcl::Font maFont;
 
-    css::uno::Reference<css::office::XAnnotation> GetAnnotationById(sal_uInt32 
nAnnotationId);
+    rtl::Reference<Annotation> GetAnnotationById(sal_uInt32 nAnnotationId);
 };
 
 OUString getAnnotationDateTimeString( const css::uno::Reference< 
css::office::XAnnotation >& xAnnotation );
diff --git a/sd/source/ui/annotations/annotationtag.cxx 
b/sd/source/ui/annotations/annotationtag.cxx
index 4b37ffaeea62..6bea2492725e 100644
--- a/sd/source/ui/annotations/annotationtag.cxx
+++ b/sd/source/ui/annotations/annotationtag.cxx
@@ -162,19 +162,19 @@ namespace {
 class AnnotationHdl : public SmartHdl
 {
 public:
-    AnnotationHdl( const SmartTagReference& xTag, const Reference< XAnnotation 
>& xAnnotation, const Point& rPnt );
+    AnnotationHdl( const SmartTagReference& xTag, const rtl::Reference< 
Annotation >& xAnnotation, const Point& rPnt );
 
     virtual void CreateB2dIAObject() override;
     virtual bool IsFocusHdl() const override;
 
 private:
-    Reference< XAnnotation > mxAnnotation;
+    rtl::Reference< sd::Annotation > mxAnnotation;
     rtl::Reference< AnnotationTag > mxTag;
 };
 
 }
 
-AnnotationHdl::AnnotationHdl( const SmartTagReference& xTag, const Reference< 
XAnnotation >& xAnnotation, const Point& rPnt )
+AnnotationHdl::AnnotationHdl( const SmartTagReference& xTag, const 
rtl::Reference< Annotation >& xAnnotation, const Point& rPnt )
 : SmartHdl( xTag, rPnt, SdrHdlKind::SmartTag )
 , mxAnnotation( xAnnotation )
 , mxTag( dynamic_cast< AnnotationTag* >( xTag.get() ) )
@@ -225,11 +225,9 @@ void AnnotationHdl::CreateB2dIAObject()
         {
             std::unique_ptr<sdr::overlay::OverlayObject> pOverlayObject;
 
-            auto* pAnnotation = 
dynamic_cast<sd::Annotation*>(mxAnnotation.get());
-
-            if (pAnnotation && pAnnotation->hasCustomAnnotationMarker())
+            if (mxAnnotation && mxAnnotation->hasCustomAnnotationMarker())
             {
-                CustomAnnotationMarker& rCustomAnnotationMarker = 
pAnnotation->getCustomAnnotationMarker();
+                CustomAnnotationMarker& rCustomAnnotationMarker = 
mxAnnotation->getCustomAnnotationMarker();
 
                 auto& rPolygons = rCustomAnnotationMarker.maPolygons;
                 if (!rPolygons.empty())
@@ -274,7 +272,7 @@ bool AnnotationHdl::IsFocusHdl() const
     return true;
 }
 
-AnnotationTag::AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& 
rView, const Reference< XAnnotation >& xAnnotation, Color const & rColor, int 
nIndex, const vcl::Font& rFont )
+AnnotationTag::AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& 
rView, const rtl::Reference< Annotation >& xAnnotation, Color const & rColor, 
int nIndex, const vcl::Font& rFont )
 : SmartTag( rView )
 , mrManager( rManager )
 , mxAnnotation( xAnnotation )
@@ -525,8 +523,7 @@ BitmapEx AnnotationTag::CreateAnnotationBitmap( bool 
bSelected )
     ScopedVclPtrInstance< VirtualDevice > pVDev;
 
     OUString sText;
-    auto* pAnnotation = dynamic_cast<sd::Annotation*>(mxAnnotation.get());
-    if (pAnnotation && pAnnotation->isFreeText())
+    if (mxAnnotation && mxAnnotation->isFreeText())
     {
         sText = mxAnnotation->getTextRange()->getString();
     }
diff --git a/sd/source/ui/annotations/annotationtag.hxx 
b/sd/source/ui/annotations/annotationtag.hxx
index 23dcde13a3a8..b5807a4b08d7 100644
--- a/sd/source/ui/annotations/annotationtag.hxx
+++ b/sd/source/ui/annotations/annotationtag.hxx
@@ -27,14 +27,14 @@
 namespace com::sun::star::office { class XAnnotation; }
 
 namespace sd {
-
+class Annotation;
 class View;
 class AnnotationManagerImpl;
 
 class AnnotationTag final : public SmartTag
 {
 public:
-    AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const 
css::uno::Reference< css::office::XAnnotation >& xAnnotation, Color const & 
rColor, int nIndex, const vcl::Font& rFont );
+    AnnotationTag( AnnotationManagerImpl& rManager, ::sd::View& rView, const 
rtl::Reference< Annotation >& xAnnotation, Color const & rColor, int nIndex, 
const vcl::Font& rFont );
     virtual ~AnnotationTag() override;
 
     /// @return true if the SmartTag handled the event.
@@ -58,7 +58,7 @@ public:
 
     BitmapEx CreateAnnotationBitmap(bool);
 
-    const css::uno::Reference< css::office::XAnnotation >& GetAnnotation() 
const { return mxAnnotation; }
+    const rtl::Reference< Annotation >& GetAnnotation() const { return 
mxAnnotation; }
 
     void OpenPopup( bool bEdit );
     void ClosePopup();
@@ -74,7 +74,7 @@ private:
     DECL_LINK(PopupModeEndHdl, weld::Popover&, void);
 
     AnnotationManagerImpl& mrManager;
-    css::uno::Reference< css::office::XAnnotation > mxAnnotation;
+    rtl::Reference< Annotation >                    mxAnnotation;
     std::unique_ptr<AnnotationWindow>               mpAnnotationWindow;
     Color                                           maColor;
     int                                             mnIndex;
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 802aab269e46..8ae4cd0818da 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -2549,7 +2549,7 @@ void SdXImpressDocument::getPostIts(::tools::JsonWriter& 
rJsonWriter)
         pPage = static_cast<SdPage*>(mpDoc->GetPage(nPage));
         const sd::AnnotationVector& aPageAnnotations = pPage->getAnnotations();
 
-        for (const uno::Reference<office::XAnnotation>& xAnnotation : 
aPageAnnotations)
+        for (const rtl::Reference<Annotation>& xAnnotation : aPageAnnotations)
         {
             sal_uInt32 nID = sd::getAnnotationId(xAnnotation);
             OString nodeName = "comment" + OString::number(nID);
diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx
index efaaec7105c2..6676eac3d1b7 100644
--- a/sd/source/ui/unoidl/unopage.cxx
+++ b/sd/source/ui/unoidl/unopage.cxx
@@ -41,6 +41,7 @@
 #include <toolkit/helper/vclunohelper.hxx>
 #include <comphelper/diagnose_ex.hxx>
 #include <vcl/svapp.hxx>
+#include <Annotation.hxx>
 #include <AnnotationEnumeration.hxx>
 #include <createunopageimpl.hxx>
 #include <unomodel.hxx>
@@ -2523,14 +2524,16 @@ Reference< XAnnotation > SAL_CALL 
SdGenericDrawPage::createAndInsertAnnotation()
     if( !GetPage() )
         throw DisposedException();
 
-    Reference< XAnnotation > xRet;
+    rtl::Reference< sd::Annotation > xRet;
     GetPage()->createAnnotation(xRet);
     return xRet;
 }
 
 void SAL_CALL SdGenericDrawPage::removeAnnotation(const Reference< XAnnotation 
> & annotation)
 {
-    GetPage()->removeAnnotation(annotation);
+    rtl::Reference<sd::Annotation> xSdAnnotation = 
dynamic_cast<sd::Annotation*>(annotation.get());
+    assert(bool(annotation) == bool(xSdAnnotation) && "must be of concrete 
type sd::Annoation");
+    GetPage()->removeAnnotation(xSdAnnotation);
 }
 
 Reference< XAnnotationEnumeration > SAL_CALL 
SdGenericDrawPage::createAnnotationEnumeration()
commit 9edefc2d441d6879cc64d6b18fabd5682d9e464c
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Nov 8 11:25:38 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Nov 9 07:00:12 2023 +0100

    use less UNO in AnnotationManagerImpl
    
    use the "real" underlying objects instead of the UNO wrapper objects
    
    Change-Id: I70b7c5b90da5ca07a2c73af2121f5399ae411bb8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159176
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sd/source/ui/annotations/annotationmanager.cxx 
b/sd/source/ui/annotations/annotationmanager.cxx
index 81d6b3c0176b..5ec59e703452 100644
--- a/sd/source/ui/annotations/annotationmanager.cxx
+++ b/sd/source/ui/annotations/annotationmanager.cxx
@@ -893,7 +893,7 @@ void AnnotationManagerImpl::onSelectionChanged()
 
     try
     {
-        Reference< XAnnotationAccess > xPage( mxView->getCurrentPage(), 
UNO_QUERY );
+        rtl::Reference< SdPage > xPage = 
mrBase.GetMainViewShell()->getCurrentPage();
 
         if( xPage != mxCurrentPage )
         {
@@ -954,10 +954,8 @@ void AnnotationManagerImpl::CreateTags()
 
         rtl::Reference< AnnotationTag > xSelectedTag;
 
-        Reference< XAnnotationEnumeration > xEnum( 
mxCurrentPage->createAnnotationEnumeration() );
-        while( xEnum->hasMoreElements() )
+        for (const css::uno::Reference< css::office::XAnnotation > & 
xAnnotation : mxCurrentPage->getAnnotations() )
         {
-            Reference< XAnnotation > xAnnotation( xEnum->nextElement() );
             Color aColor( GetColorLight( mpDoc->GetAnnotationAuthorIndex( 
xAnnotation->getAuthor() ) ) );
             rtl::Reference< AnnotationTag > xTag( new AnnotationTag( *this, 
*xViewShell->GetView(), xAnnotation, aColor, nIndex++, maFont ) );
             maTagVector.push_back(xTag);
diff --git a/sd/source/ui/annotations/annotationmanagerimpl.hxx 
b/sd/source/ui/annotations/annotationmanagerimpl.hxx
index c5871d90c75a..b5fa42001b11 100644
--- a/sd/source/ui/annotations/annotationmanagerimpl.hxx
+++ b/sd/source/ui/annotations/annotationmanagerimpl.hxx
@@ -120,7 +120,7 @@ private:
     std::vector< rtl::Reference< AnnotationTag > > maTagVector;
 
     css::uno::Reference< css::drawing::XDrawView > mxView;
-    css::uno::Reference< css::office::XAnnotationAccess > mxCurrentPage;
+    rtl::Reference< SdPage > mxCurrentPage;
     css::uno::Reference< css::office::XAnnotation > mxSelectedAnnotation;
 
     bool mbShowAnnotations;

Reply via email to