[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - svx/source

mert (via logerrit) logerrit at kemper.freedesktop.org
Wed Feb 24 07:32:48 UTC 2021


 svx/source/svdraw/svdmrkv.cxx |   83 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 75 insertions(+), 8 deletions(-)

New commits:
commit e6c31a24dd9555b06e9492bfc2d755ba677ee7b6
Author:     mert <mert.tumer at collabora.com>
AuthorDate: Mon Jan 4 22:39:56 2021 +0300
Commit:     Mert Tumer <mert.tumer at collabora.com>
CommitDate: Wed Feb 24 08:32:10 2021 +0100

    Send handle information of selected shapes to LOK
    
    Include the handle information to the callback for
    the new uno command for interactive dragging/resizing
    operations.
    
    Change-Id: I57c03abc22d3831606da2b698f1de080e9b4da78
    Signed-off-by: mert <mert.tumer at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108686
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>

diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index 5b3a77e3e5a8..ecaa8f622edd 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -71,6 +71,7 @@
 #include <com/sun/star/view/XSelectionSupplier.hpp>
 
 #include <boost/property_tree/json_parser.hpp>
+#include <boost/optional/optional.hpp>
 
 using namespace com::sun::star;
 
@@ -747,6 +748,7 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, SfxView
 
     {
         OString sSelectionText;
+        OString sSelectionTextView;
         boost::property_tree::ptree aTableJsonTree;
         bool bTableSelection = false;
 
@@ -770,6 +772,7 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, SfxView
             }
 
             OStringBuffer aExtraInfo;
+            OString handleArrayStr;
 
             aExtraInfo.append("{\"id\":\"");
             aExtraInfo.append(OString::number(reinterpret_cast<sal_IntPtr>(pO)));
@@ -906,18 +909,82 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, SfxView
                     }
                 }
             }
-            aExtraInfo.append("}");
+            if (!pOtherShell && maHdlList.GetHdlCount())
+            {
+                boost::property_tree::ptree responseJSON;
+                boost::property_tree::ptree others;
+                boost::property_tree::ptree rectangle;
+                boost::property_tree::ptree poly;
+                boost::property_tree::ptree custom;
+                boost::property_tree::ptree nodes;
+                for (size_t i = 0; i < maHdlList.GetHdlCount(); i++)
+                {
+                    SdrHdl *pHdl = maHdlList.GetHdl(i);
+                    boost::property_tree::ptree child;
+                    boost::property_tree::ptree point;
+                    sal_Int32 kind = static_cast<sal_Int32>(pHdl->GetKind());
+                    child.put("id", pHdl->GetObjHdlNum());
+                    child.put("kind", kind);
+                    child.put("pointer", static_cast<sal_Int32>(pHdl->GetPointer()));
+                    point.put("x", convertMm100ToTwip(pHdl->GetPos().getX()));
+                    point.put("y", convertMm100ToTwip(pHdl->GetPos().getY()));
+                    child.add_child("point", point);
+                    const auto node = std::make_pair("", child);
+                    boost::property_tree::ptree* selectedNode = nullptr;
+                    if (kind >= static_cast<sal_Int32>(SdrHdlKind::UpperLeft) && kind <= static_cast<sal_Int32>(SdrHdlKind::LowerRight))
+                    {
+                        selectedNode = &rectangle;
+                    }
+                    else if (kind == static_cast<sal_Int32>(SdrHdlKind::Poly))
+                    {
+                        selectedNode = &poly;
+                    }
+                    else if (kind == static_cast<sal_Int32>(SdrHdlKind::CustomShape1))
+                    {
+                        selectedNode = &custom;
+                    }
+                    else
+                    {
+                        selectedNode = &others;
+                    }
+                    std::string sKind = std::to_string(kind);
+                    boost::optional< boost::property_tree::ptree& > kindNode = selectedNode->get_child_optional(sKind.c_str());
+                    if (!kindNode)
+                    {
+                        boost::property_tree::ptree newChild;
+                        newChild.push_back(node);
+                        selectedNode->add_child(sKind.c_str(), newChild);
+                    }
+                    else
+                        kindNode.get().push_back(node);
 
+                }
+                nodes.add_child("rectangle", rectangle);
+                nodes.add_child("poly", poly);
+                nodes.add_child("custom", custom);
+                nodes.add_child("others", others);
+                responseJSON.add_child("kinds", nodes);
+                std::stringstream aStream;
+                boost::property_tree::write_json(aStream, responseJSON, /*pretty=*/ false);
+                handleArrayStr = ", \"handles\":";
+                handleArrayStr += aStream.str().c_str();
+            }
             sSelectionText = aSelection.toString() +
                 ", " + OString::number(nRotAngle);
             if (!aExtraInfo.isEmpty())
             {
+                sSelectionTextView = sSelectionText + ", " + aExtraInfo.toString() + "}";
+                aExtraInfo.append(handleArrayStr);
+                aExtraInfo.append("}");
                 sSelectionText += ", " + aExtraInfo.makeStringAndClear();
             }
         }
 
         if (sSelectionText.isEmpty())
+        {
             sSelectionText = "EMPTY";
+            sSelectionTextView = "EMPTY";
+        }
 
         if (bTableSelection)
         {
@@ -942,14 +1009,14 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, SfxView
             // Another shell wants to know about our existing
             // selection.
             if (pViewShell != pOtherShell)
-                SfxLokHelper::notifyOtherView(pViewShell, pOtherShell, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", sSelectionText);
+                SfxLokHelper::notifyOtherView(pViewShell, pOtherShell, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", sSelectionTextView);
         }
         else
         {
             // We have a new selection, so both pViewShell and the
             // other views want to know about it.
             pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_GRAPHIC_SELECTION, sSelectionText.getStr());
-            SfxLokHelper::notifyOtherViews(pViewShell, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", sSelectionText);
+            SfxLokHelper::notifyOtherViews(pViewShell, LOK_CALLBACK_GRAPHIC_VIEW_SELECTION, "selection", sSelectionTextView);
         }
     }
 }
@@ -1068,11 +1135,6 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell)
 
     tools::Rectangle aRect(GetMarkedObjRect());
 
-    if (bTiledRendering && pViewShell)
-    {
-        SetMarkHandlesForLOKit(aRect, pOtherShell);
-    }
-
     if (bFrmHdl)
     {
         if(!aRect.IsEmpty())
@@ -1254,6 +1316,11 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell)
         }
     }
 
+    // moved it here to access all the handles for callback.
+    if (bTiledRendering && pViewShell)
+    {
+        SetMarkHandlesForLOKit(aRect, pOtherShell);
+    }
     // rotation point/axis of reflection
     if(!bLimitedRotation)
     {


More information about the Libreoffice-commits mailing list