sc/qa/unit/tiledrendering/tiledrendering.cxx              |   44 ++++++++++++++
 sc/qa/unit/tiledrendering/tiledrenderingmodeltestbase.cxx |   10 +++
 2 files changed, 54 insertions(+)

New commits:
commit 1eb09e38c324d63d58f34a0268f8a4745afe26af
Author:     Gökay Şatır <gokaysa...@gmail.com>
AuthorDate: Wed Apr 9 16:49:51 2025 +0300
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Apr 11 08:17:13 2025 +0200

    Calc Test: Ensure text cursor visibility after a paste event.
    
    Signed-off-by: Gökay Şatır <gokaysa...@gmail.com>
    Change-Id: I1fc688bb683d7bf62ed6330c168227a7761ec2ae
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183937
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx 
b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index 788e047eb1a9..be54455154dd 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -3569,6 +3569,50 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, 
testFreezeRowOrColumn)
     CPPUNIT_ASSERT_EQUAL(std::string("8"), index);
 }
 
+CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testCursorVisibilityAfterPaste)
+{
+    ScModelObj* pModelObj = createDoc("empty.ods");
+    ViewCallback aView;
+    SfxLokHelper::createView();
+    
pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+
+    ScTabViewShell* pView = 
dynamic_cast<ScTabViewShell*>(SfxViewShell::Current());
+
+    // copy text view 1
+    pView->SetCursor(0, 0); // Go to A1.
+
+    Scheduler::ProcessEventsToIdle();
+
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'B', 0); // Type B.
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 'B', 0);
+    Scheduler::ProcessEventsToIdle();
+
+
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::TAB);
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, awt::Key::TAB);
+    Scheduler::ProcessEventsToIdle();
+
+    pView->SetCursor(0, 0); // Go to A1.
+    Scheduler::ProcessEventsToIdle();
+
+    pView->GetViewFrame().GetBindings().Execute(SID_COPY); // Copy B.
+    Scheduler::ProcessEventsToIdle();
+
+    pView->SetCursor(0, 1); // Go to A2.
+    Scheduler::ProcessEventsToIdle();
+
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 'B', 0); // Type B.
+    pModelObj->postKeyEvent(LOK_KEYEVENT_KEYUP, 'B', 0);
+    Scheduler::ProcessEventsToIdle();
+
+    uno::Sequence<beans::PropertyValue> aArgs;
+    dispatchCommand(mxComponent, u".uno:Paste"_ustr, aArgs); // Paste B.
+    Scheduler::ProcessEventsToIdle();
+
+    // Text cursor should still be visible.
+    CPPUNIT_ASSERT_EQUAL(true, aView.m_textCursorVisible);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/qa/unit/tiledrendering/tiledrenderingmodeltestbase.cxx 
b/sc/qa/unit/tiledrendering/tiledrenderingmodeltestbase.cxx
index 62187ad6a23b..1c01d6d4f626 100644
--- a/sc/qa/unit/tiledrendering/tiledrenderingmodeltestbase.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrenderingmodeltestbase.cxx
@@ -252,6 +252,7 @@ class ViewCallback final
 public:
     bool m_bOwnCursorInvalidated;
     bool m_bViewCursorInvalidated;
+    bool m_textCursorVisible;
     bool m_bTextViewSelectionInvalidated;
     bool m_bGraphicSelection;
     bool m_bGraphicViewSelection;
@@ -276,6 +277,7 @@ public:
     ViewCallback(bool bDeleteListenerOnDestruct = true)
         : m_bOwnCursorInvalidated(false)
         , m_bViewCursorInvalidated(false)
+        , m_textCursorVisible(false)
         , m_bTextViewSelectionInvalidated(false)
         , m_bGraphicSelection(false)
         , m_bGraphicViewSelection(false)
@@ -310,6 +312,14 @@ public:
     {
         switch (nType)
         {
+            case LOK_CALLBACK_VIEW_CURSOR_VISIBLE:
+            {
+                boost::property_tree::ptree aTree;
+                std::stringstream aStream(pPayload);
+                boost::property_tree::read_json(aStream, aTree);
+                m_textCursorVisible = 
aTree.get_child("visible").get_value<std::string>() == "true";
+            }
+            break;
             case LOK_CALLBACK_CELL_CURSOR:
             {
                 m_bOwnCursorInvalidated = true;

Reply via email to