include/svx/svdmrkv.hxx             |    6 ++++++
 sc/source/ui/unoobj/docuno.cxx      |    6 ++++++
 sc/source/ui/view/drawvie3.cxx      |    2 ++
 sc/source/ui/view/gridwin4.cxx      |    2 ++
 svx/source/svdraw/sdrpagewindow.cxx |   13 +++++++++----
 svx/source/svdraw/svdmrkv.cxx       |    9 +++++++++
 6 files changed, 34 insertions(+), 4 deletions(-)

New commits:
commit 2c250e8f5007e756afb794944f0be791e2d535f4
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Mon Dec 6 13:42:27 2021 +0530
Commit:     Dennis Francis <dennis.fran...@collabora.com>
CommitDate: Wed Feb 2 10:10:07 2022 +0100

    lokCalcRTL: shapes: do not send negative(X) invalidations
    
    LOK client expects tile invalidations in positive document coordinates
    irrespective of RTL flags.
    
    For this introduce a flag mbNegativeX in svx class SdrMarkView to
    indicate the case when all x coordinates are negated (this happens only
    for the LOK + Calc + RTL mode). Use this flag to counter negate the
    x coordinates before sending invalidation rectangles.
    
    Conflicts:
            sc/source/ui/view/drawvie3.cxx
    
    Change-Id: I35d8142718b538e55b668a8ee18f3dd1fe433951
    (cherry picked from commit 5e37acbaaa0b0891829907331ecacd2d3b67526d)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129195
    Tested-by: Jenkins
    Reviewed-by: Dennis Francis <dennis.fran...@collabora.com>

diff --git a/include/svx/svdmrkv.hxx b/include/svx/svdmrkv.hxx
index d4ece164bece..ec9055711c3f 100644
--- a/include/svx/svdmrkv.hxx
+++ b/include/svx/svdmrkv.hxx
@@ -130,6 +130,9 @@ protected:
     // flag to completely disable handles at the view
     bool                        mbMarkHandlesHidden : 1;
 
+    // flag indicating whether all x coordinates are negated or not
+    bool                        mbNegativeX : 1;
+
     // Helper to get a possible GridOffset from SdrObject
     bool getPossibleGridOffsetForSdrObject(
         basegfx::B2DVector& rOffset,
@@ -240,6 +243,9 @@ public:
 
     bool HasMarkableObj() const { return MarkableObjectsExceed(0); };
 
+    /// whether all x coordinates in use are negated or not
+    void SetNegativeX(bool bOn) { mbNegativeX = bOn; }
+    bool IsNegativeX() const { return mbNegativeX; }
 
 // migrate selections
 
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 80ac5e29db7e..2525b360d1a3 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -578,7 +578,13 @@ void ScModelObj::setPart( int nPart, bool 
/*bAllowChangeFocus*/ )
     ScTabView* pTabView = pViewData->GetView();
 
     if (pTabView)
+    {
+        if (SdrView* pDrawView = pViewData->GetViewShell()->GetScDrawView())
+            pDrawView->SetNegativeX(comphelper::LibreOfficeKit::isActive() &&
+                pViewData->GetDocument().IsLayoutRTL(nPart));
+
         pTabView->SelectTabPage(nPart + 1);
+    }
 }
 
 int ScModelObj::getParts()
diff --git a/sc/source/ui/view/drawvie3.cxx b/sc/source/ui/view/drawvie3.cxx
index 88c74b442bfe..ce4d132b87e4 100644
--- a/sc/source/ui/view/drawvie3.cxx
+++ b/sc/source/ui/view/drawvie3.cxx
@@ -25,6 +25,7 @@
 #include <svx/svdoole2.hxx>
 #include <svx/ImageMapInfo.hxx>
 #include <sfx2/viewfrm.hxx>
+#include <comphelper/lok.hxx>
 #include <svtools/optionsdrawinglayer.hxx>
 
 #include <strings.hrc>
@@ -49,6 +50,7 @@ ScDrawView::ScDrawView(
     pDropMarkObj( nullptr ),
     bInConstruct( true )
 {
+    SetNegativeX(comphelper::LibreOfficeKit::isActive() && 
rDoc.IsLayoutRTL(nTab));
     // #i73602# Use default from the configuration
     SetBufferedOverlayAllowed(SvtOptionsDrawinglayer::IsOverlayBuffer_Calc());
 
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index 5a21738bb9c3..42ce441e53d1 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -1609,6 +1609,8 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice,
             new FmFormView(
                 *pModel,
                 &rDevice));
+
+        mpLOKDrawView->SetNegativeX(bLayoutRTL);
         mpLOKDrawView->ShowSdrPage(mpLOKDrawView->GetModel()->GetPage(nTab));
         aOutputData.SetDrawView(mpLOKDrawView.get());
         aOutputData.SetSpellCheckContext(mpSpellCheckCxt.get());
diff --git a/svx/source/svdraw/sdrpagewindow.cxx 
b/svx/source/svdraw/sdrpagewindow.cxx
index aeb337d7a8e5..5facfc45d237 100644
--- a/svx/source/svdraw/sdrpagewindow.cxx
+++ b/svx/source/svdraw/sdrpagewindow.cxx
@@ -430,7 +430,8 @@ void SdrPageWindow::RedrawLayer(const SdrLayerID* pId,
 // Invalidate call, used from ObjectContact(OfPageView) in 
InvalidatePartOfView(...)
 void SdrPageWindow::InvalidatePageWindow(const basegfx::B2DRange& rRange)
 {
-    if (GetPageView().IsVisible() && GetPaintWindow().OutputToWindow())
+    bool bLOKActive = comphelper::LibreOfficeKit::isActive();
+    if (!bLOKActive && GetPageView().IsVisible() && 
GetPaintWindow().OutputToWindow())
     {
         OutputDevice& rWindow(GetPaintWindow().GetOutputDevice());
         basegfx::B2DRange aDiscreteRange(rRange);
@@ -454,15 +455,19 @@ void SdrPageWindow::InvalidatePageWindow(const 
basegfx::B2DRange& rRange)
         GetPageView().GetView().InvalidateOneWin(rWindow, 
aVCLDiscreteRectangle);
         rWindow.EnableMapMode(bWasMapModeEnabled);
     }
-    else if (comphelper::LibreOfficeKit::isActive())
+    else if (bLOKActive)
     {
         // we don't really have to have a paint window with LOK; OTOH we know
         // that the drawinglayer units are 100ths of mm, so they are easy to
         // convert to twips
+
+        // If the shapes use negative X coordinates, make them positive before 
sending
+        // the invalidation rectangle.
+        bool bNegativeX = mpImpl->mrPageView.GetView().IsNegativeX();
         const tools::Rectangle aRect100thMM(
-            static_cast<tools::Long>(floor(rRange.getMinX())),
+            static_cast<tools::Long>(bNegativeX ? std::max(0.0, 
ceil(-rRange.getMaxX())) : floor(rRange.getMinX())),
             static_cast<tools::Long>(floor(rRange.getMinY())),
-            static_cast<tools::Long>(ceil(rRange.getMaxX())),
+            static_cast<tools::Long>(bNegativeX ? std::max(0.0, 
floor(-rRange.getMinX())) : ceil(rRange.getMaxX())),
             static_cast<tools::Long>(ceil(rRange.getMaxY())));
 
         const tools::Rectangle aRectTwips = o3tl::convert(aRect100thMM, 
o3tl::Length::mm100, o3tl::Length::twip);
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx
index 42aa011ab8b4..4406b5f535ff 100644
--- a/svx/source/svdraw/svdmrkv.cxx
+++ b/svx/source/svdraw/svdmrkv.cxx
@@ -179,6 +179,7 @@ SdrMarkView::SdrMarkView(SdrModel& rSdrModel, OutputDevice* 
pOut)
     , mbMrkPntDirty(false)
     , mbMarkedPointsRectsDirty(false)
     , mbMarkHandlesHidden(false)
+    , mbNegativeX(false)
 {
 
     BrkMarkObj();
@@ -273,6 +274,14 @@ void SdrMarkView::modelHasChangedLOKit()
         }
 
         pResultSelection = &aSelection;
+
+        if (mbNegativeX)
+        {
+            // Convert to positive X doc-coordinates
+            tools::Long nTmp = aSelection.Left();
+            aSelection.SetLeft(-aSelection.Right());
+            aSelection.SetRight(-nTmp);
+        }
     }
 
     if (SfxViewShell* pViewShell = GetSfxViewShell())

Reply via email to