include/LibreOfficeKit/LibreOfficeKitEnums.h |   31 ++++++++++++++++++++++++++
 libreofficekit/source/gtk/lokdocview.cxx     |    1 
 sc/inc/prnsave.hxx                           |    3 ++
 sc/source/core/tool/prnsave.cxx              |   32 +++++++++++++++++++++++++++
 sc/source/ui/undo/undotab.cxx                |   15 ++++++++++++
 sc/source/ui/view/viewfun2.cxx               |   11 +++++++++
 6 files changed, 93 insertions(+)

New commits:
commit 172bc7a8f4eeab907adac077407186fbbd046a77
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Thu May 12 13:13:35 2022 +0530
Commit:     Pranam Lashkari <lpra...@collabora.com>
CommitDate: Tue May 17 15:17:41 2022 +0200

    lok-calc: new callback for print ranges
    
    With this callback the lok clients can read and draw the print ranges on
    each sheet of the Calc document.
    
    Change-Id: Ie19351d4420e0f3d4191f6a354ce99ab830aede2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134375
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Pranam Lashkari <lpra...@collabora.com>

diff --git a/include/LibreOfficeKit/LibreOfficeKitEnums.h 
b/include/LibreOfficeKit/LibreOfficeKitEnums.h
index e00968a86dc8..0f085d5385a8 100644
--- a/include/LibreOfficeKit/LibreOfficeKitEnums.h
+++ b/include/LibreOfficeKit/LibreOfficeKitEnums.h
@@ -783,6 +783,35 @@ typedef enum
      * When a user tries to use command which is restricted for that user
      */
     LOK_COMMAND_BLOCKED = 53,
+
+    /**
+     * This is Calc specific. The payload contains print ranges of all
+     * sheets in the document.
+     *
+     * Payload example:
+     * {
+     *     "printranges" : [
+     *         {
+     *             "sheet": 0,
+     *             "ranges": [
+     *                 [0, 0, 4, 5],
+     *                 [5, 100, 8, 150]
+     *             ]
+     *         },
+     *         {
+     *             "sheet": 3,
+     *             "ranges": [
+     *                 [1, 0, 6, 10],
+     *                 [3, 200, 6, 230]
+     *             ]
+     *         }
+     *     ]
+     * }
+     *
+     * The format of the inner "ranges" array for each sheet is
+     * [<startColumn>, <startRow>, <endColumn>, <endRow>]
+     */
+    LOK_CALLBACK_PRINT_RANGES = 54,
 }
 LibreOfficeKitCallbackType;
 
@@ -919,6 +948,8 @@ static inline const char* lokCallbackTypeToString(int nType)
         return "LOK_CALLBACK_DOCUMENT_BACKGROUND_COLOR";
     case LOK_COMMAND_BLOCKED:
         return "LOK_COMMAND_BLOCKED";
+    case LOK_CALLBACK_PRINT_RANGES:
+        return "LOK_CALLBACK_PRINT_RANGES";
     }
 
     assert(!"Unknown LibreOfficeKitCallbackType type.");
diff --git a/libreofficekit/source/gtk/lokdocview.cxx 
b/libreofficekit/source/gtk/lokdocview.cxx
index 1d40ebc2db90..045af47704ff 100644
--- a/libreofficekit/source/gtk/lokdocview.cxx
+++ b/libreofficekit/source/gtk/lokdocview.cxx
@@ -1416,6 +1416,7 @@ callback (gpointer pData)
     case LOK_CALLBACK_INVALIDATE_SHEET_GEOMETRY:
     case LOK_CALLBACK_DOCUMENT_BACKGROUND_COLOR:
     case LOK_COMMAND_BLOCKED:
+    case LOK_CALLBACK_PRINT_RANGES:
     {
         // TODO: Implement me
         break;
diff --git a/sc/inc/prnsave.hxx b/sc/inc/prnsave.hxx
index ca928f908dd1..a2e6810554e7 100644
--- a/sc/inc/prnsave.hxx
+++ b/sc/inc/prnsave.hxx
@@ -24,6 +24,8 @@
 #include <vector>
 #include <memory>
 
+namespace tools { class JsonWriter; }
+
 class ScPrintSaverTab
 {
     typedef ::std::vector< ScRange > ScRangeVec;
@@ -60,6 +62,7 @@ public:
     SCTAB                   GetTabCount() const     { return nTabCount; }
     ScPrintSaverTab&        GetTabData(SCTAB nTab);
     const ScPrintSaverTab&  GetTabData(SCTAB nTab) const;
+    void GetPrintRangesInfo(tools::JsonWriter& rPrintRanges) const;
 
     bool    operator==( const ScPrintRangeSaver& rCmp ) const;
 };
diff --git a/sc/source/core/tool/prnsave.cxx b/sc/source/core/tool/prnsave.cxx
index c07eda00f9ed..09e4c7f48473 100644
--- a/sc/source/core/tool/prnsave.cxx
+++ b/sc/source/core/tool/prnsave.cxx
@@ -22,6 +22,7 @@
 #include <address.hxx>
 
 #include <osl/diagnose.h>
+#include <tools/json_writer.hxx>
 
 //      Data per table
 
@@ -87,6 +88,37 @@ const ScPrintSaverTab& ScPrintRangeSaver::GetTabData(SCTAB 
nTab) const
     return pData[nTab];
 }
 
+void ScPrintRangeSaver::GetPrintRangesInfo(tools::JsonWriter& rPrintRanges) 
const
+{
+    // Array for sheets in the document.
+    auto printRanges = rPrintRanges.startArray("printranges");
+    for (SCTAB nTab = 0; nTab < nTabCount; nTab++)
+    {
+        auto sheetNode = rPrintRanges.startStruct();
+        const ScPrintSaverTab& rPsTab = pData[nTab];
+        const std::vector<ScRange>& rRangeVec = rPsTab.GetPrintRanges();
+
+        rPrintRanges.put("sheet", static_cast<sal_Int32>(nTab));
+
+        // Array for ranges within each sheet.
+        auto sheetRanges = rPrintRanges.startArray("ranges");
+        OStringBuffer aRanges;
+        sal_Int32 nLast = rRangeVec.size() - 1;
+        for (sal_Int32 nIdx = 0; nIdx <= nLast; ++nIdx)
+        {
+            const ScRange& rRange = rRangeVec[nIdx];
+            aRanges.append("[ " +
+                OString::number(rRange.aStart.Col()) + ", " +
+                OString::number(rRange.aStart.Row()) + ", " +
+                OString::number(rRange.aEnd.Col()) + ", " +
+                OString::number(rRange.aEnd.Row()) +
+                OString(nLast == nIdx ? "]" : "], "));
+        }
+
+        rPrintRanges.putRaw(aRanges.getStr());
+    }
+}
+
 bool ScPrintRangeSaver::operator==( const ScPrintRangeSaver& rCmp ) const
 {
     bool bEqual = ( nTabCount == rCmp.nTabCount );
diff --git a/sc/source/ui/undo/undotab.cxx b/sc/source/ui/undo/undotab.cxx
index 85c2708367e4..8e674517c0c5 100644
--- a/sc/source/ui/undo/undotab.cxx
+++ b/sc/source/ui/undo/undotab.cxx
@@ -48,6 +48,9 @@
 #include <drwlayer.hxx>
 #include <scresid.hxx>
 #include <sheetevents.hxx>
+#include <LibreOfficeKit/LibreOfficeKitEnums.h>
+#include <comphelper/lok.hxx>
+#include <tools/json_writer.hxx>
 
 #include <memory>
 #include <utility>
@@ -1315,6 +1318,18 @@ void ScUndoPrintRange::DoChange(bool bUndo)
 
     ScPrintFunc( pDocShell, pDocShell->GetPrinter(), nTab ).UpdatePages();
 
+    if (pViewShell && comphelper::LibreOfficeKit::isActive())
+    {
+        tools::JsonWriter aJsonWriter;
+        if (bUndo)
+            pOldRanges->GetPrintRangesInfo(aJsonWriter);
+        else
+            pNewRanges->GetPrintRangesInfo(aJsonWriter);
+
+        const std::string message = aJsonWriter.extractAsStdString();
+        pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_PRINT_RANGES, 
message.c_str());
+    }
+
     pDocShell->PostPaint( ScRange(0,0,nTab,rDoc.MaxCol(),rDoc.MaxRow(),nTab), 
PaintPartFlags::Grid );
 }
 
diff --git a/sc/source/ui/view/viewfun2.cxx b/sc/source/ui/view/viewfun2.cxx
index 8fc4e7597a25..97f63fb4a300 100644
--- a/sc/source/ui/view/viewfun2.cxx
+++ b/sc/source/ui/view/viewfun2.cxx
@@ -86,6 +86,7 @@
 #include <vector>
 #include <memory>
 #include <boost/property_tree/json_parser.hpp>
+#include <tools/json_writer.hxx>
 
 #include <officecfg/Office/Calc.hxx>
 
@@ -1101,6 +1102,16 @@ void ScViewFunc::SetPrintRanges( bool bEntireSheet, 
const OUString* pPrint,
     {
         SCTAB nCurTab = GetViewData().GetTabNo();
         std::unique_ptr<ScPrintRangeSaver> pNewRanges = 
rDoc.CreatePrintRangeSaver();
+        if (comphelper::LibreOfficeKit::isActive())
+        {
+            tools::JsonWriter aJsonWriter;
+            pNewRanges->GetPrintRangesInfo(aJsonWriter);
+
+            SfxViewShell* pViewShell = GetViewData().GetViewShell();
+            const std::string message = aJsonWriter.extractAsStdString();
+            pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_PRINT_RANGES, 
message.c_str());
+        }
+
         pDocSh->GetUndoManager()->AddUndoAction(
                     std::make_unique<ScUndoPrintRange>( pDocSh, nCurTab, 
std::move(pOldRanges), std::move(pNewRanges) ) );
     }

Reply via email to