svx/source/svdraw/svdograf.cxx |   53 +++++++++++++++++------------------------
 1 file changed, 22 insertions(+), 31 deletions(-)

New commits:
commit 9e5fae358cb22256b34bab85d06fbd75821aead4
Author:     Caolán McNamara <[email protected]>
AuthorDate: Thu Oct 9 19:50:11 2025 +0100
Commit:     Miklos Vajna <[email protected]>
CommitDate: Fri Oct 10 11:28:44 2025 +0200

    create drawing document directly
    
    and work directly with the view-less models's SdrPage
    
    Change-Id: I32432ad0479d8d1faa3646d2059e2a7e8b56e26f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192124
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>

diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 63579069896b..98c7dcbf0800 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -60,8 +60,7 @@
 #include <comphelper/processfactory.hxx>
 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
 #include <com/sun/star/frame/DispatchHelper.hpp>
-#include <com/sun/star/frame/XDesktop2.hpp>
-#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XLoadable.hpp>
 #include <vcl/filter/PDFiumLibrary.hxx>
 #include <svdpdf.hxx>
 #include <svx/unoapi.hxx>
@@ -380,18 +379,15 @@ css::uno::Reference<css::lang::XComponent> 
SdrGrafObj::GetReplacementGraphicMode
 
     // Create an empty Draw component.
     uno::Reference<uno::XComponentContext> xContext = 
::comphelper::getProcessComponentContext();
-    uno::Reference<frame::XDesktop2> xDesktop = 
css::frame::Desktop::create(xContext);
-    if (!xDesktop)
-        return nullptr;
-    uno::Reference<lang::XComponent> xComponent = 
xDesktop->loadComponentFromURL(u"private:factory/sdraw"_ustr, u"_default"_ustr, 
0, {});
-    uno::Reference<frame::XModel> xModel(xComponent, uno::UNO_QUERY);
+    uno::Reference<frame::XModel> 
xModel(xContext->getServiceManager()->createInstanceWithContext(u"com.sun.star.drawing.DrawingDocument"_ustr,
 xContext),
+        uno::UNO_QUERY);
     if (!xModel)
         return nullptr;
+    uno::Reference<css::frame::XLoadable> xModelLoad(xModel, uno::UNO_QUERY);
+    if (xModelLoad)
+        xModelLoad->initNew();
     uno::Reference<frame::XController> 
xController(xModel->getCurrentController());
-    SfxViewShell* pViewShell = SfxViewShell::Get(xController);
-    if (!pViewShell)
-        return nullptr;
-    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xComponent, 
uno::UNO_QUERY);
+    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(xModel, 
uno::UNO_QUERY);
     if (!xDrawPagesSupplier)
         return nullptr;
     uno::Reference<drawing::XDrawPages> xDrawPages = 
xDrawPagesSupplier->getDrawPages();
@@ -412,30 +408,25 @@ css::uno::Reference<css::lang::XComponent> 
SdrGrafObj::GetReplacementGraphicMode
         aFilter.DoImport(*pSdrPage, 0, rGraphic.getPageNumber(), nullptr);
     }
 
-    if (SdrView* pView = pViewShell->GetDrawView())
-    {
-        if (SdrPageView* pPV = pView->GetSdrPageView())
-        {
-            // Group shapes together, including invisible objects
-
-            rtl::Reference<SdrObject> xGrp(new SdrObjGroup(rSdrModel));
-            SdrObjList* pDstList = xGrp->GetSubList();
+    // Group shapes together, including invisible objects
+    size_t nSrcObjCount = pSdrPage->GetObjCount();
+    if (!nSrcObjCount)
+        return xModel;
 
-            SdrObjList* pSrcList = pPV->GetObjList();
-            size_t i = pSrcList->GetObjCount();
-            while (i > 0)
-            {
-                --i;
-                rtl::Reference<SdrObject> xObj(pSrcList->GetObj(i));
-                pSrcList->RemoveObject(i);
-                pDstList->InsertObject(xObj.get(), 0);
-            }
+    rtl::Reference<SdrObject> xGrp(new SdrObjGroup(rSdrModel));
+    SdrObjList* pDstList = xGrp->GetSubList();
 
-            pSrcList->InsertObject(xGrp.get(), 0);
-        }
+    while (nSrcObjCount > 0)
+    {
+        --nSrcObjCount;
+        rtl::Reference<SdrObject> xObj(pSdrPage->GetObj(nSrcObjCount));
+        pSdrPage->RemoveObject(nSrcObjCount);
+        pDstList->InsertObject(xObj.get(), 0);
     }
 
-    return xComponent;
+    pSdrPage->InsertObject(xGrp.get(), 0);
+
+    return xModel;
 }
 
 void SdrGrafObj::NbcSetGraphic(const Graphic& rGraphic)

Reply via email to