include/sfx2/ipclient.hxx            |    4 ++++
 include/sfx2/lokcomponenthelpers.hxx |    3 ++-
 sc/source/ui/unoobj/docuno.cxx       |    3 ---
 sc/source/ui/view/gridwin4.cxx       |    7 +++++++
 sc/source/ui/view/tabvwshb.cxx       |   14 ++++++++++++++
 sfx2/source/view/ipclient.cxx        |   26 ++++++++++++++++++++++++--
 sfx2/source/view/lokcharthelper.cxx  |    6 ++++--
 7 files changed, 55 insertions(+), 8 deletions(-)

New commits:
commit e3e8aaa2517dfbaf9ab5dcf10612547c6c6b0eb4
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Thu Jan 6 10:54:49 2022 +0530
Commit:     Dennis Francis <dennis.fran...@collabora.com>
CommitDate: Sat Feb 5 08:01:23 2022 +0100

    lokCalcRTL: fix rendering of charts in edit mode
    
    Inform Sfx2InPlaceClient and LokChartHelper when negated X coordinates
    are used. Ensure that invalidation rectangles have positive coordinates
    in all cases.
    
    Conflicts:
            include/sfx2/lokcharthelper.hxx
            sfx2/source/view/ipclient.cxx
    
    Change-Id: I8f5440718e288d8f0d379c8da5f49a29e51f6940
    (cherry picked from commit 284068c7eb473bafd5cafeb30a78daab4538cff6)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129362
    Tested-by: Jenkins
    Reviewed-by: Dennis Francis <dennis.fran...@collabora.com>

diff --git a/include/sfx2/ipclient.hxx b/include/sfx2/ipclient.hxx
index 3e219514a6f1..6eddf9e9f818 100644
--- a/include/sfx2/ipclient.hxx
+++ b/include/sfx2/ipclient.hxx
@@ -87,6 +87,10 @@ public:
     void                ResetObject();
     bool                IsUIActive() const;
 
+    /// To indicate that negated document X coordinates are used
+    void                SetNegativeX(bool bSet);
+    bool                IsNegativeX() const;
+
     virtual void        FormatChanged(); // object format was changed (used 
for StarMath formulas aligning)
 
     virtual bool IsProtected() const;
diff --git a/include/sfx2/lokcomponenthelpers.hxx 
b/include/sfx2/lokcomponenthelpers.hxx
index cace035b16a1..c9468b7d1c3b 100644
--- a/include/sfx2/lokcomponenthelpers.hxx
+++ b/include/sfx2/lokcomponenthelpers.hxx
@@ -48,7 +48,8 @@ public:
     static void PaintAllChartsOnTile(VirtualDevice& rDevice,
                                      int nOutputWidth, int nOutputHeight,
                                      int nTilePosX, int nTilePosY,
-                                     tools::Long nTileWidth, tools::Long 
nTileHeight);
+                                     tools::Long nTileWidth, tools::Long 
nTileHeight,
+                                     bool bNegativeX = false);
     bool postMouseEvent(int nType, int nX, int nY,
                         int nCount, int nButtons, int nModifier,
                         double fScaleX = 1.0, double fScaleY = 1.0);
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index 7e149c8b7123..177a38ca07ad 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -560,9 +560,6 @@ void ScModelObj::paintTile( VirtualDevice& rDevice,
     pGridWindow->PaintTile( rDevice, nOutputWidth, nOutputHeight,
                             nTilePosX, nTilePosY, nTileWidth, nTileHeight );
 
-    LokChartHelper::PaintAllChartsOnTile(rDevice, nOutputWidth, nOutputHeight,
-                                         nTilePosX, nTilePosY, nTileWidth, 
nTileHeight);
-
     // Draw Form controls
     ScDrawLayer* pDrawLayer = pDocShell->GetDocument().GetDrawLayer();
     SdrPage* pPage = pDrawLayer->GetPage(sal_uInt16(pViewData->GetTabNo()));
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index ec77fd12be66..d83c2bcccde2 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -35,6 +35,7 @@
 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
 #include <comphelper/lok.hxx>
 #include <sfx2/lokhelper.hxx>
+#include <sfx2/lokcomponenthelpers.hxx>
 
 #include <svx/svdview.hxx>
 #include <svx/svdpagv.hxx>
@@ -1625,6 +1626,12 @@ void ScGridWindow::PaintTile( VirtualDevice& rDevice,
     DrawContent(rDevice, aTabInfo, aOutputData, true);
     rDevice.SetMapMode(aOriginalMode);
 
+    // Paint the chart(s) in edit mode.
+    LokChartHelper::PaintAllChartsOnTile(rDevice, nOutputWidth, nOutputHeight,
+        nTilePosX, nTilePosY, nTileWidth, nTileHeight, bLayoutRTL);
+
+    rDevice.SetMapMode(aOriginalMode);
+
     // Flag drawn formula cells "unchanged".
     rDoc.ResetChanged(ScRange(nTopLeftTileCol, nTopLeftTileRow, nTab, 
nBottomRightTileCol, nBottomRightTileRow, nTab));
     rDoc.PrepareFormulaCalc();
diff --git a/sc/source/ui/view/tabvwshb.cxx b/sc/source/ui/view/tabvwshb.cxx
index 6ed88f12e3a6..f2ae3b56a55e 100644
--- a/sc/source/ui/view/tabvwshb.cxx
+++ b/sc/source/ui/view/tabvwshb.cxx
@@ -80,6 +80,13 @@ void ScTabViewShell::ConnectObject( const SdrOle2Obj* pObj )
         return;
 
     pClient = new ScClient( this, pWin, GetScDrawView()->GetModel(), pObj );
+    ScViewData& rViewData = GetViewData();
+    ScDocShell* pDocSh = rViewData.GetDocShell();
+    ScDocument& rDoc = pDocSh->GetDocument();
+    bool bNegativeX = comphelper::LibreOfficeKit::isActive() && 
rDoc.IsNegativePage(rViewData.GetTabNo());
+    if (bNegativeX)
+        pClient->SetNegativeX(true);
+
     tools::Rectangle aRect = pObj->GetLogicRect();
     Size aDrawSize = aRect.GetSize();
 
@@ -153,10 +160,17 @@ void ScTabViewShell::ActivateObject(SdrOle2Obj* pObj, 
sal_Int32 nVerb)
     bool bErrorShown = false;
 
     {
+        ScViewData& rViewData = GetViewData();
+        ScDocShell* pDocSh = rViewData.GetDocShell();
+        ScDocument& rDoc = pDocSh->GetDocument();
+        bool bNegativeX = comphelper::LibreOfficeKit::isActive() && 
rDoc.IsNegativePage(rViewData.GetTabNo());
         SfxInPlaceClient* pClient = FindIPClient( xObj, pWin );
         if ( !pClient )
             pClient = new ScClient( this, pWin, GetScDrawView()->GetModel(), 
pObj );
 
+        if (bNegativeX)
+            pClient->SetNegativeX(true);
+
         if ( (sal_uInt32(nErr) & ERRCODE_ERROR_MASK) == 0 && xObj.is() )
         {
             tools::Rectangle aRect = pObj->GetLogicRect();
diff --git a/sfx2/source/view/ipclient.cxx b/sfx2/source/view/ipclient.cxx
index ce9d2fdfb6c7..73fe6f241bae 100644
--- a/sfx2/source/view/ipclient.cxx
+++ b/sfx2/source/view/ipclient.cxx
@@ -91,6 +91,15 @@ public:
     }
 };
 
+tools::Rectangle lcl_negateRectX(const tools::Rectangle& rRect)
+{
+    return tools::Rectangle(
+        std::max(0l, -rRect.Right()),
+        rRect.Top(),
+        std::max(0l, -rRect.Left()),
+        rRect.Bottom());
+}
+
 }
 
 // SfxInPlaceClient_Impl
@@ -112,6 +121,7 @@ public:
     bool                            m_bStoreObject;
     bool                            m_bUIActive;            // set and cleared 
when notification for UI (de)activation is sent
     bool                            m_bResizeNoScale;
+    bool                            m_bNegativeX;
 
     uno::Reference < embed::XEmbeddedObject > m_xObject;
 
@@ -122,6 +132,7 @@ public:
     , m_bStoreObject( true )
     , m_bUIActive( false )
     , m_bResizeNoScale( false )
+    , m_bNegativeX( false )
     {}
 
     void SizeHasChanged();
@@ -347,7 +358,7 @@ void SAL_CALL SfxInPlaceClient_Impl::activatingInplace()
                 aRect = o3tl::convert(aRect, o3tl::Length::mm100, 
o3tl::Length::twip);
         }
 
-        OString str = aRect.toString() + ", \"INPLACE\"";
+        OString str = (m_bNegativeX ? lcl_negateRectX(aRect) : 
aRect).toString() + ", \"INPLACE\"";
         pViewShell->libreOfficeKitViewCallback( 
LOK_CALLBACK_GRAPHIC_SELECTION, str.getStr() );
     }
 
@@ -823,7 +834,8 @@ void SfxInPlaceClient::Invalidate()
     tools::Rectangle aRealObjArea( m_xImp->m_aObjArea );
     aRealObjArea.SetSize( Size( tools::Long( aRealObjArea.GetWidth()  * 
m_xImp->m_aScaleWidth ),
                                 tools::Long( aRealObjArea.GetHeight() * 
m_xImp->m_aScaleHeight ) ) );
-    m_pEditWin->Invalidate( aRealObjArea );
+
+    m_pEditWin->Invalidate( IsNegativeX() ? lcl_negateRectX(aRealObjArea) : 
aRealObjArea );
 
     ViewChanged();
 }
@@ -1122,4 +1134,14 @@ bool SfxInPlaceClient::IsUIActive() const
     return m_xImp->m_bUIActive;
 }
 
+void SfxInPlaceClient::SetNegativeX(bool bSet)
+{
+    m_xImp->m_bNegativeX = bSet;
+}
+
+bool SfxInPlaceClient::IsNegativeX() const
+{
+    return m_xImp->m_bNegativeX;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/view/lokcharthelper.cxx 
b/sfx2/source/view/lokcharthelper.cxx
index e5965802306c..a87388832755 100644
--- a/sfx2/source/view/lokcharthelper.cxx
+++ b/sfx2/source/view/lokcharthelper.cxx
@@ -223,7 +223,8 @@ void LokChartHelper::PaintTile(VirtualDevice& 
rRenderContext, const tools::Recta
 void LokChartHelper::PaintAllChartsOnTile(VirtualDevice& rDevice,
                                           int nOutputWidth, int nOutputHeight,
                                           int nTilePosX, int nTilePosY,
-                                          tools::Long nTileWidth, tools::Long 
nTileHeight)
+                                          tools::Long nTileWidth, tools::Long 
nTileHeight,
+                                          bool bNegativeX)
 {
     if (comphelper::LibreOfficeKit::isTiledAnnotations())
         return;
@@ -245,7 +246,8 @@ void LokChartHelper::PaintAllChartsOnTile(VirtualDevice& 
rDevice,
 
     SfxViewShell* pCurView = SfxViewShell::Current();
     int nPartForCurView = pCurView ? pCurView->getPart() : -1;
-    tools::Rectangle aTileRect(Point(nTilePosX, nTilePosY), Size(nTileWidth, 
nTileHeight));
+    tools::Long nTileRectLeft = bNegativeX ? -nTilePosX - nTileWidth : 
nTilePosX;
+    tools::Rectangle aTileRect(Point(nTileRectLeft, nTilePosY), 
Size(nTileWidth, nTileHeight));
     SfxViewShell* pViewShell = SfxViewShell::GetFirst();
     while (pViewShell)
     {

Reply via email to