sc/qa/unit/tiledrendering/tiledrendering.cxx |   10 ++++++++--
 sc/source/ui/view/viewfun3.cxx               |    2 +-
 2 files changed, 9 insertions(+), 3 deletions(-)

New commits:
commit 5fcde58ce0b2f3e42dd2e62246ca9704560e57d8
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Wed Apr 24 08:22:10 2024 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Wed Apr 24 11:50:13 2024 +0200

    cool#8789 sc lok: classify multi-selection with 2 cells as simple
    
    The trouble was that even if commit
    b13c7b31f9ce3c3a25cffd0c35e7ee6b8c2a1895 (cool#8789 sc lok: fix copy for
    multi-selections, 2024-04-19) made multi-selection copy work, just 2
    cells in a multi-selection was classified as a complex selection at a
    LOK level, while 2 cells next to each other is a simple selection, which
    is inconsistent. (A LOK client can provide a simpler UI for simple
    selections.)
    
    What happens is that the multi-selection clipboard document had no
    selection ranges defined, so ScDocument::GetClipArea() returned early,
    so the numbers in the ScTransferObj ctor were left initialized, which at
    the end lead to a >1000 cells in ScTransferObj::isComplex(), because we
    were calculating uninitialized data.
    
    Fix the problem by passing a range (that covers all ranges of the
    multi-selection) to ScViewFunc::CopyToTransferable(), which avoids the
    wrong col/row start/length, so the selection is classified as simple.
    
    Also adapt testRowColumnSelections, which was just meant to check we
    don't crash, but now the cell under the cell cursor is returned, so the
    assert about the empty selection would fail.
    
    Change-Id: If98212c623fa75adb2ddf628a6e90f3eef450e59
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166574
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    (cherry picked from commit fca9f7899843336d0ff0198a522ec8ccbb4273da)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166578
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx 
b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index 3a9ee97ee49a..1c183521b605 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -223,7 +223,7 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, 
testRowColumnSelections)
     // When we copy this, we don't get anything useful, but we must not crash
     // (used to happen)
     aResult = 
apitest::helper::transferable::getTextSelection(pModelObj->getSelection(), 
"text/plain;charset=utf-8"_ostr);
-    CPPUNIT_ASSERT_EQUAL(OString(), aResult);
+    CPPUNIT_ASSERT_EQUAL("9"_ostr, aResult);
 
     // TODO check that we really selected what we wanted here
 
@@ -235,7 +235,7 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, 
testRowColumnSelections)
     // When we copy this, we don't get anything useful, but we must not crash
     // (used to happen)
     aResult = 
apitest::helper::transferable::getTextSelection(pModelObj->getSelection(), 
"text/plain;charset=utf-8"_ostr);
-    CPPUNIT_ASSERT_EQUAL(OString(), aResult);
+    CPPUNIT_ASSERT_EQUAL("1"_ostr, aResult);
 
     // TODO check that we really selected what we wanted here
 
@@ -3926,6 +3926,12 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, 
testCopyMultiSelection)
 
     // Make sure we get A1+A3 instead of an error:
     CPPUNIT_ASSERT(xTransferable.is());
+
+    // Also make sure that just 2 cells is classified as a simple selection:
+    uno::Reference<datatransfer::XTransferable2> xTransferable2(xTransferable, 
uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xTransferable2.is());
+    // Without the fix, the text selection was complex.
+    CPPUNIT_ASSERT(!xTransferable2->isComplex());
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx
index aa8daeb8338f..6003878133cd 100644
--- a/sc/source/ui/view/viewfun3.cxx
+++ b/sc/source/ui/view/viewfun3.cxx
@@ -462,7 +462,7 @@ rtl::Reference<ScTransferObj> 
ScViewFunc::CopyToTransferable()
     {
         ScDocumentUniquePtr pClipDoc(new ScDocument(SCDOCMODE_CLIP));
         // This takes care of the input line and calls CopyToClipMultiRange() 
for us.
-        CopyToClip(pClipDoc.get(), /*bCut=*/false, /*bApi=*/true);
+        CopyToClip(pClipDoc.get(), aRange, /*bCut=*/false, /*bApi=*/true);
         TransferableObjectDescriptor aObjDesc;
         return new ScTransferObj(std::move(pClipDoc), std::move(aObjDesc));
     }

Reply via email to