sc/qa/extras/macros-test.cxx    |   34 ++++++++++++++++++++++++++++++++++
 sc/source/ui/unoobj/viewuno.cxx |    9 ++++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

New commits:
commit b9411e587586750f36ba9009b5f1e29fe461d8b5
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Thu Jan 12 07:46:43 2023 +0100
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Mon Jan 16 08:28:49 2023 +0000

    tdf#147122 - Return cell object when a simple selection is merged
    
    Change-Id: I4ddd3b3a804f8300a5ec15526f4c9c77aaf45fc5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145378
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/sc/qa/extras/macros-test.cxx b/sc/qa/extras/macros-test.cxx
index f53389f40459..24379362bed5 100644
--- a/sc/qa/extras/macros-test.cxx
+++ b/sc/qa/extras/macros-test.cxx
@@ -71,6 +71,7 @@ public:
     void testTdf107572();
     void testShapeLayerId();
     void testFunctionAccessIndirect();
+    void testTdf147122();
 
     CPPUNIT_TEST_SUITE(ScMacrosTest);
     CPPUNIT_TEST(testStarBasic);
@@ -105,6 +106,7 @@ public:
     CPPUNIT_TEST(testTdf107572);
     CPPUNIT_TEST(testShapeLayerId);
     CPPUNIT_TEST(testFunctionAccessIndirect);
+    CPPUNIT_TEST(testTdf147122);
 
     CPPUNIT_TEST_SUITE_END();
 };
@@ -898,6 +900,38 @@ void ScMacrosTest::testFunctionAccessIndirect()
     CPPUNIT_ASSERT_EQUAL(css::uno::Any(OUString("a1")), aResult);
 }
 
+void ScMacrosTest::testTdf147122()
+{
+    mxComponent = loadFromDesktop("private:factory/scalc");
+
+    css::uno::Reference<css::document::XEmbeddedScripts> xDocScr(mxComponent, 
UNO_QUERY_THROW);
+    auto xLibs = xDocScr->getBasicLibraries();
+    auto xLibrary = xLibs->createLibrary("TestLibrary");
+    xLibrary->insertByName(
+        "TestModule",
+        uno::Any(
+            OUString("Function TestMergedSelection\n"
+                     // Insert test string into cell A1
+                     "  oActiveSheet = 
ThisComponent.CurrentController.ActiveSheet\n"
+                     "  oActiveCell = 
oActiveSheet.getCellRangeByName(\"A1\")\n"
+                     "  oActiveCell.setString(\"This is a test\")\n"
+                     // Merge A1:B2 cell range and return the content of the 
merged range
+                     "  oRange = oActiveSheet.getCellRangeByName(\"A1:B2\")\n"
+                     "  ThisComponent.getCurrentController.Select(oRange)\n"
+                     "  oActiveCell = ThisComponent.CurrentSelection\n"
+                     "  oActiveCell.Merge(True)\n"
+                     "  TestMergedSelection = 
ThisComponent.getCurrentSelection().getString()\n"
+                     "End Function\n")));
+
+    Any aRet = 
executeMacro("vnd.sun.Star.script:TestLibrary.TestModule.TestMergedSelection?"
+                            "language=Basic&location=document");
+    // Without the fix in place, this test would have failed with
+    // - Expression: false
+    // - Unexpected dialog: Error: BASIC runtime error.
+    // Property or method not found: getString.
+    CPPUNIT_ASSERT_EQUAL(Any(OUString("This is a test")), aRet);
+}
+
 ScMacrosTest::ScMacrosTest()
       : UnoApiXmlTest("/sc/qa/extras/testdocuments")
 {
diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx
index 5a7a8a391427..f8940594746c 100644
--- a/sc/source/ui/unoobj/viewuno.cxx
+++ b/sc/source/ui/unoobj/viewuno.cxx
@@ -70,6 +70,7 @@
 #include <svx/sdrhittesthelper.hxx>
 #include <formatsh.hxx>
 #include <sfx2/app.hxx>
+#include <scitems.hxx>
 
 using namespace com::sun::star;
 
@@ -872,7 +873,13 @@ uno::Any SAL_CALL ScTabViewObj::getSelection()
         ScMarkType eMarkType = rViewData.GetSimpleArea(aRange);
         if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE) )
         {
-            if (aRange.aStart == aRange.aEnd)
+            // tdf#147122 - return cell object when a simple selection is 
merged
+            ScDocument& rDoc = pDocSh->GetDocument();
+            const ScPatternAttr* pMarkPattern = rDoc.GetPattern(aRange.aStart);
+            if (aRange.aStart == aRange.aEnd
+                || (pMarkPattern
+                    && pMarkPattern->GetItemSet().GetItemState(ATTR_MERGE, 
false)
+                           == SfxItemState::SET))
                 pObj = new ScCellObj( pDocSh, aRange.aStart );
             else
                 pObj = new ScCellRangeObj( pDocSh, aRange );

Reply via email to