editeng/source/editeng/editview.cxx |   10 ++
 editeng/source/editeng/impedit.cxx  |   97 +++++++++++++++++++--------
 editeng/source/editeng/impedit.hxx  |   10 ++
 include/editeng/editview.hxx        |    2 
 sc/source/ui/inc/gridwin.hxx        |   15 ++++
 sc/source/ui/view/gridwin4.cxx      |  125 +++++++++++++++++++++++++++++++++---
 sc/source/ui/view/viewdata.cxx      |    1 
 7 files changed, 223 insertions(+), 37 deletions(-)

New commits:
commit d58f1e334245f9e136750fbba267c2a941a213cc
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Tue Apr 14 14:49:23 2020 +0530
Commit:     Michael Meeks <michael.me...@collabora.com>
CommitDate: Wed Apr 22 11:29:27 2020 +0200

    lokit: fix edit-text/view-cursor position
    
    in case of views with heterogeneous zooms.
    
    1. EditText render position fix
    
    The EditView has an 'output-area' which is used to clip the rectangle
    we pass to the Paint() call. It also holds on to the ScGridWindow
    instance where the edit started. The 'output-area' of the EditView is in
    the coordinates/units of the MapMode of the ScGridWindow it holds. So we
    need to temporarily change the MapMode and 'output-area' of the EditView
    in agreement to the device(with the current view's zoom settings) where
    we are going to paint to. After we call the Paint(), we rollback the
    original settings of the EditView.
    
    2. EditViewCursor position fix
    
    Before this change the cursor position in twips (calculated based on
    pixel aligned cell position in the view where editing occurred) is
    broadcasted to all the client-views. If the clients have different zooms, 
then
    simply scaling this common cursor position in the client for its zoom
    is not going to be accurate enough (due to the non-linear 
Logic->Pixel->Logic
    transformation involving pixel rounding). This is very visible if you are
    editing far away from A1 (like Z50).
    The fix is to turn off this broadcast for calc-cell editing and send
    view specific edit-cursor invalidation messages.
    
    This is accompanied by a online.git patch that removes unnessecary
    broadcast of view-cursor invalidation messages which messes up things again.
    "Do not broadcast view-cursor invalidation messages"
    
    Change-Id: Ib2fbbe4b6f93f26fc85d6adaa8684dd4397d886f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92631
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/editeng/source/editeng/editview.cxx 
b/editeng/source/editeng/editview.cxx
index 24d0947d7de5..c598f36afbfa 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -471,6 +471,16 @@ void EditView::Command( const CommandEvent& rCEvt )
     pImpEditView->Command( rCEvt );
 }
 
+void EditView::SetBroadcastLOKViewCursor(bool bSet)
+{
+    pImpEditView->SetBroadcastLOKViewCursor(bSet);
+}
+
+tools::Rectangle EditView::GetEditCursor() const
+{
+    return pImpEditView->GetEditCursor();
+}
+
 void EditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor, bool 
bActivate )
 {
     if ( pImpEditView->pEditEngine->HasView( this ) )
diff --git a/editeng/source/editeng/impedit.cxx 
b/editeng/source/editeng/impedit.cxx
index c9ad00241a55..ee9b40b0e97a 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -79,6 +79,7 @@ ImpEditView::ImpEditView( EditView* pView, EditEngine* pEng, 
vcl::Window* pWindo
     eSelectionMode      = EESelectionMode::Std;
     eAnchorMode         = EEAnchorMode::TopLeft;
     mpEditViewCallbacks = nullptr;
+    mbBroadcastLOKViewCursor = comphelper::LibreOfficeKit::isActive();
     nInvMore            = 1;
     nTravelXPos         = TRAVEL_X_DONTKNOW;
     nControl            = EVControlBits::AUTOSCROLL | 
EVControlBits::ENABLEPASTE;
@@ -911,6 +912,69 @@ OString buildHyperlinkJSON(const OUString& sText, const 
OUString& sLink)
 
 } // End of anon namespace
 
+tools::Rectangle ImpEditView::ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags, sal_Int32& nTextPortionStart,
+        const ParaPortion* pParaPortion) const
+{
+    tools::Rectangle aEditCursor = 
pEditEngine->pImpEditEngine->PaMtoEditCursor( aPaM, nShowCursorFlags );
+    if ( !IsInsertMode() && !aEditSelection.HasRange() )
+    {
+        if ( aPaM.GetNode()->Len() && ( aPaM.GetIndex() < 
aPaM.GetNode()->Len() ) )
+        {
+            // If we are behind a portion, and the next portion has other 
direction, we must change position...
+            aEditCursor.SetLeft( pEditEngine->pImpEditEngine->PaMtoEditCursor( 
aPaM, GetCursorFlags::TextOnly|GetCursorFlags::PreferPortionStart ).Left() );
+            aEditCursor.SetRight( aEditCursor.Left() );
+
+            sal_Int32 nTextPortion = 
pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), 
nTextPortionStart, true );
+            const TextPortion& rTextPortion = 
pParaPortion->GetTextPortions()[nTextPortion];
+            if ( rTextPortion.GetKind() == PortionKind::TAB )
+            {
+                aEditCursor.AdjustRight(rTextPortion.GetSize().Width() );
+            }
+            else
+            {
+                EditPaM aNext = pEditEngine->CursorRight( aPaM );
+                tools::Rectangle aTmpRect = 
pEditEngine->pImpEditEngine->PaMtoEditCursor( aNext, GetCursorFlags::TextOnly );
+                if ( aTmpRect.Top() != aEditCursor.Top() )
+                    aTmpRect = pEditEngine->pImpEditEngine->PaMtoEditCursor( 
aNext, GetCursorFlags::TextOnly|GetCursorFlags::EndOfLine );
+                aEditCursor.SetRight( aTmpRect.Left() );
+            }
+        }
+    }
+
+    long nMaxHeight = !IsVertical() ? aOutArea.GetHeight() : 
aOutArea.GetWidth();
+    if ( aEditCursor.GetHeight() > nMaxHeight )
+    {
+        aEditCursor.SetBottom( aEditCursor.Top() + nMaxHeight - 1 );
+    }
+
+    return aEditCursor;
+}
+
+tools::Rectangle ImpEditView::GetEditCursor() const
+{
+    EditPaM aPaM( aEditSelection.Max() );
+
+    sal_Int32 nTextPortionStart = 0;
+    sal_Int32 nPara = pEditEngine->GetEditDoc().GetPos( aPaM.GetNode() );
+    if (nPara == EE_PARA_NOT_FOUND) // #i94322
+        return tools::Rectangle();
+
+    const ParaPortion* pParaPortion = pEditEngine->GetParaPortions()[nPara];
+
+    GetCursorFlags nShowCursorFlags = nExtraCursorFlags | 
GetCursorFlags::TextOnly;
+
+    // Use CursorBidiLevel 0/1 in meaning of
+    // 0: prefer portion end, normal mode
+    // 1: prefer portion start
+
+    if ( ( GetCursorBidiLevel() != CURSOR_BIDILEVEL_DONTKNOW ) && 
GetCursorBidiLevel() )
+    {
+        nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
+    }
+
+    return ImplGetEditCursor(aPaM, nShowCursorFlags, nTextPortionStart, 
pParaPortion);
+}
+
 void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
 {
     // No ShowCursor in an empty View ...
@@ -953,36 +1017,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool 
bForceVisCursor )
         nShowCursorFlags |= GetCursorFlags::PreferPortionStart;
     }
 
-    tools::Rectangle aEditCursor = 
pEditEngine->pImpEditEngine->PaMtoEditCursor( aPaM, nShowCursorFlags );
-    if ( !IsInsertMode() && !aEditSelection.HasRange() )
-    {
-        if ( aPaM.GetNode()->Len() && ( aPaM.GetIndex() < 
aPaM.GetNode()->Len() ) )
-        {
-            // If we are behind a portion, and the next portion has other 
direction, we must change position...
-            aEditCursor.SetLeft( pEditEngine->pImpEditEngine->PaMtoEditCursor( 
aPaM, GetCursorFlags::TextOnly|GetCursorFlags::PreferPortionStart ).Left() );
-            aEditCursor.SetRight( aEditCursor.Left() );
+    tools::Rectangle aEditCursor = ImplGetEditCursor(aPaM, nShowCursorFlags, 
nTextPortionStart, pParaPortion);
 
-            sal_Int32 nTextPortion = 
pParaPortion->GetTextPortions().FindPortion( aPaM.GetIndex(), 
nTextPortionStart, true );
-            const TextPortion& rTextPortion = 
pParaPortion->GetTextPortions()[nTextPortion];
-            if ( rTextPortion.GetKind() == PortionKind::TAB )
-            {
-                aEditCursor.AdjustRight(rTextPortion.GetSize().Width() );
-            }
-            else
-            {
-                EditPaM aNext = pEditEngine->CursorRight( aPaM );
-                tools::Rectangle aTmpRect = 
pEditEngine->pImpEditEngine->PaMtoEditCursor( aNext, GetCursorFlags::TextOnly );
-                if ( aTmpRect.Top() != aEditCursor.Top() )
-                    aTmpRect = pEditEngine->pImpEditEngine->PaMtoEditCursor( 
aNext, GetCursorFlags::TextOnly|GetCursorFlags::EndOfLine );
-                aEditCursor.SetRight( aTmpRect.Left() );
-            }
-        }
-    }
-    long nMaxHeight = !IsVertical() ? aOutArea.GetHeight() : 
aOutArea.GetWidth();
-    if ( aEditCursor.GetHeight() > nMaxHeight )
-    {
-        aEditCursor.SetBottom( aEditCursor.Top() + nMaxHeight - 1 );
-    }
     if ( bGotoCursor  ) // && 
(!pEditEngine->pImpEditEngine->GetStatus().AutoPageSize() ) )
     {
         // check if scrolling is necessary...
@@ -1197,7 +1233,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool 
bForceVisCursor )
                 }
 
                 SfxLokHelper::notifyVisCursorInvalidation(mpViewShell, sRect, 
bIsWrong, sHyperlink);
-                
mpViewShell->NotifyOtherViews(LOK_CALLBACK_INVALIDATE_VIEW_CURSOR, "rectangle", 
sRect);
+                if (mbBroadcastLOKViewCursor)
+                    
mpViewShell->NotifyOtherViews(LOK_CALLBACK_INVALIDATE_VIEW_CURSOR, "rectangle", 
sRect);
             }
         }
 
diff --git a/editeng/source/editeng/impedit.hxx 
b/editeng/source/editeng/impedit.hxx
index dffd2534ef69..ebae3eaf81b1 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -267,6 +267,7 @@ private:
     // in Draw/Impress in an OverlayObject which avoids evtl. expensive full
     // repaints of the EditView(s)
     const EditViewCallbacks* mpEditViewCallbacks;
+    bool mbBroadcastLOKViewCursor;
 
     bool hasEditViewCallbacks() const
     {
@@ -280,6 +281,11 @@ private:
 
     void InvalidateAtWindow(const tools::Rectangle& rRect);
 
+    void SetBroadcastLOKViewCursor(bool bSet)
+    {
+        mbBroadcastLOKViewCursor = bSet;
+    }
+
 protected:
 
     // DragAndDropClient
@@ -294,6 +300,8 @@ protected:
     void HideDDCursor();
 
     void ImplDrawHighlightRect( OutputDevice* _pTarget, const Point& 
rDocPosTopLeft, const Point& rDocPosBottomRight, tools::PolyPolygon* pPolyPoly 
);
+    tools::Rectangle ImplGetEditCursor(EditPaM& aPaM, GetCursorFlags 
nShowCursorFlags,
+            sal_Int32& nTextPortionStart, const ParaPortion* pParaPortion) 
const;
 
 public:
                     ImpEditView( EditView* pView, EditEngine* pEng, 
vcl::Window* pWindow );
@@ -372,6 +380,8 @@ public:
     void            CalcAnchorPoint();
     void            RecalcOutputArea();
 
+    tools::Rectangle GetEditCursor() const;
+
     void            ShowCursor( bool bGotoCursor, bool bForceVisCursor );
     Pair            Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck = 
ScrollRangeCheck::NoNegative );
 
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index b516e4484eb1..1d9ceece9d59 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -149,6 +149,8 @@ public:
     void            Invalidate();
     Pair            Scroll( long nHorzScroll, long nVertScroll, 
ScrollRangeCheck nRangeCheck = ScrollRangeCheck::NoNegative );
 
+    void            SetBroadcastLOKViewCursor(bool bSet);
+    tools::Rectangle       GetEditCursor() const;
     void            ShowCursor( bool bGotoCursor = true, bool bForceVisCursor 
= true, bool bActivate = false );
     void            HideCursor( bool bDeactivate = false );
 
diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index 70f0e267b8fa..03f0763883e5 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -131,6 +131,17 @@ class ScGridWindow : public vcl::Window, public 
DropTargetHelper, public DragSou
 
     VisibleRange maVisibleRange;
 
+    struct LOKCursorEntry
+    {
+        Fraction aScaleX;
+        Fraction aScaleY;
+        tools::Rectangle aRect;
+    };
+
+    // Stores the last cursor position in twips for all
+    // zoom levels demanded from a ScGridWindow instance.
+    std::vector<LOKCursorEntry> maLOKLastCursor;
+
     std::unique_ptr<sc::SpellCheckContext> mpSpellCheckCxt;
 
     ScViewData*             pViewData;
@@ -289,6 +300,10 @@ class ScGridWindow : public vcl::Window, public 
DropTargetHelper, public DragSou
                                       ::std::vector< tools::Rectangle >& 
rPixelRects ) const;
     void            UpdateKitSelection(const std::vector<tools::Rectangle>& 
rRectangles,
                                        std::vector<tools::Rectangle>* 
pLogicRects = nullptr);
+    bool            NeedLOKCursorInvalidation(const tools::Rectangle& 
rCursorRect,
+                                              const Fraction aScaleX, const 
Fraction aScaleY);
+    void            InvalidateLOKViewCursor(const tools::Rectangle& 
rCursorRect,
+                                            const Fraction aScaleX, const 
Fraction aScaleY);
 
 protected:
     virtual void    PrePaint(vcl::RenderContext& rRenderContext) override;
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index 66a261931216..065f56bf1591 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -303,6 +303,59 @@ void ScGridWindow::PrePaint(vcl::RenderContext& 
/*rRenderContext*/)
     }
 }
 
+bool ScGridWindow::NeedLOKCursorInvalidation(const tools::Rectangle& 
rCursorRect,
+        const Fraction aScaleX, const Fraction aScaleY)
+{
+    // Don't see the need for a map as there will be only a few zoom levels
+    // and as of now X and Y zooms in online are the same.
+    for (auto& rEntry : maLOKLastCursor)
+    {
+        if (aScaleX == rEntry.aScaleX && aScaleY == rEntry.aScaleY)
+        {
+            if (rCursorRect == rEntry.aRect)
+                return false; // No change
+
+            // Update and allow invalidate.
+            rEntry.aRect = rCursorRect;
+            return true;
+        }
+    }
+
+    maLOKLastCursor.push_back(LOKCursorEntry{aScaleX, aScaleY, rCursorRect});
+    return true;
+}
+
+void ScGridWindow::InvalidateLOKViewCursor(const tools::Rectangle& rCursorRect,
+        const Fraction aScaleX, const Fraction aScaleY)
+{
+    if (!NeedLOKCursorInvalidation(rCursorRect, aScaleX, aScaleY))
+        return;
+
+    ScTabViewShell* pThisViewShell = pViewData->GetViewShell();
+    SfxViewShell* pViewShell = SfxViewShell::GetFirst();
+
+    while (pViewShell)
+    {
+        if (pViewShell != pThisViewShell)
+        {
+            ScTabViewShell* pOtherViewShell = 
dynamic_cast<ScTabViewShell*>(pViewShell);
+            if (pOtherViewShell)
+            {
+                ScViewData& rOtherViewData = pOtherViewShell->GetViewData();
+                Fraction aZoomX = rOtherViewData.GetZoomX();
+                Fraction aZoomY = rOtherViewData.GetZoomY();
+                if (aZoomX == aScaleX && aZoomY == aScaleY)
+                {
+                    SfxLokHelper::notifyOtherView(pThisViewShell, 
pOtherViewShell,
+                            LOK_CALLBACK_INVALIDATE_VIEW_CURSOR, "rectangle", 
rCursorRect.toString());
+                }
+            }
+        }
+
+        pViewShell = SfxViewShell::GetNext(*pViewShell);
+    }
+}
+
 void ScGridWindow::Paint( vcl::RenderContext& /*rRenderContext*/, const 
tools::Rectangle& rRect )
 {
     ScDocument* pDoc = pViewData->GetDocument();
@@ -924,13 +977,11 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, 
const ScTableInfo& rTableI
                         {
                             long nScreenX = aOutputData.nScrX;
                             long nScreenY = aOutputData.nScrY;
-                            long nScreenW = aOutputData.GetScrW();
-                            long nScreenH = aOutputData.GetScrH();
 
                             rDevice.SetLineColor();
                             
rDevice.SetFillColor(pOtherEditView->GetBackgroundColor());
-                            Point aStart = rOtherViewData.GetScrPos( nCol1, 
nRow1, eOtherWhich );
-                            Point aEnd = rOtherViewData.GetScrPos( nCol2+1, 
nRow2+1, eOtherWhich );
+                            Point aStart = pViewData->GetScrPos( nCol1, nRow1, 
eOtherWhich );
+                            Point aEnd = pViewData->GetScrPos( nCol2+1, 
nRow2+1, eOtherWhich );
 
                             // don't overwrite grid
                             long nLayoutSign = bLayoutRTL ? -1 : 1;
@@ -958,8 +1009,24 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, 
const ScTableInfo& rTableI
                             // paint the background
                             
rDevice.DrawRect(rDevice.PixelToLogic(aBackground));
 
-                            tools::Rectangle aEditRect(Point(nScreenX, 
nScreenY), Size(nScreenW, nScreenH));
+                            tools::Rectangle aEditRect(aBackground);
+                            aEditRect.AdjustLeft(1);
+                            aEditRect.AdjustTop(1);
+
+                            // EditView has an 'output area' which is used to 
clip the 'paint area' we provide below.
+                            // So they need to be in the same 
coordinates/units. This is tied to the mapmode of the gridwin
+                            // attached to the EditView, so we have to change 
its mapmode too (temporarily). We save the
+                            // original mapmode and 'output area' and roll 
them back when we finish painting to rDevice.
+                            vcl::Window* pOtherWin = 
pOtherEditView->GetWindow();
+                            const tools::Rectangle 
aOrigOutputArea(pOtherEditView->GetOutputArea()); // Not in pixels.
+                            const MapMode aOrigMapMode = 
pOtherWin->GetMapMode();
+                            pOtherWin->SetMapMode(rDevice.GetMapMode());
+                            
pOtherEditView->SetOutputArea(rDevice.PixelToLogic(aEditRect));
                             
pOtherEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice);
+
+                            // Rollback the mapmode and 'output area'.
+                            pOtherWin->SetMapMode(aOrigMapMode);
+                            pOtherEditView->SetOutputArea(aOrigOutputArea);
                             rDevice.SetMapMode(MapMode(MapUnit::MapPixel));
                         }
                     }
@@ -1003,6 +1070,8 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, 
const ScTableInfo& rTableI
 
         // set the correct mapmode
         tools::Rectangle aBackground(aStart, aEnd);
+        tools::Rectangle aBGAbs(aStart, aEnd);
+
         if (bIsTiledRendering)
         {
             // Need to draw the background in absolute coords.
@@ -1038,8 +1107,50 @@ void ScGridWindow::DrawContent(OutputDevice &rDevice, 
const ScTableInfo& rTableI
         rDevice.DrawRect(aLogicRect);
 
         // paint the editeng text
-        tools::Rectangle aEditRect(Point(nScrX, nScrY), 
Size(aOutputData.GetScrW(), aOutputData.GetScrH()));
-        pEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice);
+        if (bIsTiledRendering)
+        {
+            tools::Rectangle aEditRect(aBackground);
+            aEditRect.AdjustLeft(1);
+            aEditRect.AdjustTop(1);
+            // EditView has an 'output area' which is used to clip the paint 
area we provide below.
+            // So they need to be in the same coordinates/units. This is tied 
to the mapmode of the gridwin
+            // attached to the EditView, so we have to change its mapmode too 
(temporarily). We save the
+            // original mapmode and 'output area' and roll them back when we 
finish painting to rDevice.
+            const tools::Rectangle 
aOrigOutputArea(pEditView->GetOutputArea()); // Not in pixels.
+            const MapMode aOrigMapMode = GetMapMode();
+            SetMapMode(rDevice.GetMapMode());
+            pEditView->SetOutputArea(rDevice.PixelToLogic(aEditRect));
+            pEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice);
+
+            // Now we need to get relative cursor position within the editview.
+            // This is for sending the absolute twips position of the cursor 
to the specific views with
+            // the same given zoom level.
+            tools::Rectangle aCursorRect = pEditView->GetEditCursor();
+            Point aCursPos = OutputDevice::LogicToLogic(aCursorRect.TopLeft(), 
MapMode(MapUnit::Map100thMM), MapMode(MapUnit::MapTwip));
+
+            // Rollback the mapmode and 'output area'.
+            SetMapMode(aOrigMapMode);
+            pEditView->SetOutputArea(aOrigOutputArea);
+
+            const MapMode& rDevMM = rDevice.GetMapMode();
+            MapMode aMM(MapUnit::MapTwip);
+            aMM.SetScaleX(rDevMM.GetScaleX());
+            aMM.SetScaleY(rDevMM.GetScaleY());
+
+            aBGAbs.AdjustLeft(1);
+            aBGAbs.AdjustTop(1);
+            aCursorRect = OutputDevice::PixelToLogic(aBGAbs, aMM);
+            aCursorRect.setWidth(0);
+            aCursorRect.Move(aCursPos.getX(), 0);
+            // Sends view cursor position to views of all matching zooms if 
needed (avoids duplicates).
+            InvalidateLOKViewCursor(aCursorRect, aMM.GetScaleX(), 
aMM.GetScaleY());
+        }
+        else
+        {
+            tools::Rectangle aEditRect(Point(nScrX, nScrY), 
Size(aOutputData.GetScrW(), aOutputData.GetScrH()));
+            pEditView->Paint(rDevice.PixelToLogic(aEditRect), &rDevice);
+        }
+
         rDevice.SetMapMode(MapMode(MapUnit::MapPixel));
 
         // restore the cursor it was originally visible
diff --git a/sc/source/ui/view/viewdata.cxx b/sc/source/ui/view/viewdata.cxx
index 28ae0b54fbf6..1c7e36ca484a 100644
--- a/sc/source/ui/view/viewdata.cxx
+++ b/sc/source/ui/view/viewdata.cxx
@@ -1428,6 +1428,7 @@ void ScViewData::SetEditEngine( ScSplitPos eWhich,
 
         if (comphelper::LibreOfficeKit::isActive())
         {
+            pEditView[eWhich]->SetBroadcastLOKViewCursor(false);
             pEditView[eWhich]->RegisterViewShell(pViewShell);
         }
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to