sc/qa/unit/ucalc_copypaste.cxx   |   14 ++++++++------
 sc/qa/unit/uicalc/uicalc.cxx     |   35 +++++++++++++++++++++++++++++++++++
 sc/source/core/data/document.cxx |    5 +++--
 3 files changed, 46 insertions(+), 8 deletions(-)

New commits:
commit 535f8fde0c33c435e4a8e9f768003516ce933666
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Mon May 15 09:01:21 2023 +0200
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Tue May 16 11:05:04 2023 +0200

    tdf#141440 - Do not delete notes when pasting contents
    
    Contents include cells with values, datetimes, strings, formulas, outlines, 
and sparklines.
    
    Change-Id: I9acf3a33c7723300d6b85f0abe468db28de6ebcb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151759
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/sc/qa/unit/ucalc_copypaste.cxx b/sc/qa/unit/ucalc_copypaste.cxx
index 43f9272a13c0..695b5b8f6214 100644
--- a/sc/qa/unit/ucalc_copypaste.cxx
+++ b/sc/qa/unit/ucalc_copypaste.cxx
@@ -9407,10 +9407,11 @@ CPPUNIT_TEST_FIXTURE(TestCopyPaste, 
testCopyPasteSkipEmpty)
 
     // Check the content after the paste.
     {
+        // tdf#141440 - do not delete notes when pasting contents
         static const Check aChecks[] = {
-            { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true },
-            { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true },
-            { "Clip3", COL_YELLOW, false },
+            { "Clip1", COL_YELLOW, true }, { "B", COL_BLUE, true },
+            { "Clip2", COL_YELLOW, true }, { "D", COL_BLUE, true },
+            { "Clip3", COL_YELLOW, true },
         };
 
         bool bRes
@@ -9434,10 +9435,11 @@ CPPUNIT_TEST_FIXTURE(TestCopyPaste, 
testCopyPasteSkipEmpty)
     // Redo, and check the content again.
     aUndo.Redo();
     {
+        // tdf#141440 - do not delete notes when pasting contents
         static const Check aChecks[] = {
-            { "Clip1", COL_YELLOW, false }, { "B", COL_BLUE, true },
-            { "Clip2", COL_YELLOW, false }, { "D", COL_BLUE, true },
-            { "Clip3", COL_YELLOW, false },
+            { "Clip1", COL_YELLOW, true }, { "B", COL_BLUE, true },
+            { "Clip2", COL_YELLOW, true }, { "D", COL_BLUE, true },
+            { "Clip3", COL_YELLOW, true },
         };
 
         bool bRes
diff --git a/sc/qa/unit/uicalc/uicalc.cxx b/sc/qa/unit/uicalc/uicalc.cxx
index d3ae6e4d02fe..a6854ae76d56 100644
--- a/sc/qa/unit/uicalc/uicalc.cxx
+++ b/sc/qa/unit/uicalc/uicalc.cxx
@@ -1893,6 +1893,41 @@ CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf150219)
     CPPUNIT_ASSERT_EQUAL(OUString(""), pDoc->GetString(ScAddress(0, 0, 1)));
 }
 
+CPPUNIT_TEST_FIXTURE(ScUiCalcTest, testTdf141440)
+{
+    createScDoc();
+    ScDocument* pDoc = getScDoc();
+
+    // Insert a note to cell A1
+    goToCell("A1");
+    uno::Sequence<beans::PropertyValue> aArgs
+        = comphelper::InitPropertySequence({ { "Text", uno::Any(OUString("Note 
in A1")) } });
+    dispatchCommand(mxComponent, ".uno:InsertAnnotation", aArgs);
+
+    // Insert a formula to cell A2
+    insertStringToCell("A2", u"=1+1");
+    CPPUNIT_ASSERT_EQUAL(OUString("2"), pDoc->GetString(ScAddress(0, 1, 0)));
+
+    // Copy content of A2 to A1 using paste special command as a formula 
(Flags F)
+    goToCell("A2");
+    dispatchCommand(mxComponent, ".uno:Copy", {});
+    goToCell("A1");
+    aArgs = comphelper::InitPropertySequence(
+        { { "Flags", uno::Any(OUString("F")) },
+          { "FormulaCommand", uno::Any(sal_uInt16(ScPasteFunc::ADD)) },
+          { "SkipEmptyCells", uno::Any(false) },
+          { "Transpose", uno::Any(false) },
+          { "AsLink", uno::Any(false) },
+          { "MoveMode", uno::Any(sal_uInt16(InsCellCmd::INS_NONE)) } });
+    dispatchCommand(mxComponent, ".uno:InsertContents", aArgs);
+
+    // Check if string in cell A2 was copied to cell A1
+    CPPUNIT_ASSERT_EQUAL(OUString("2"), pDoc->GetString(ScAddress(0, 0, 0)));
+    // Without the fix in place, there would be no note in cell A1 after using 
paste special
+    CPPUNIT_ASSERT_MESSAGE("There should be a note on A1", 
pDoc->HasNote(ScAddress(0, 0, 0)));
+    CPPUNIT_ASSERT_EQUAL(OUString("Note in A1"), pDoc->GetNote(ScAddress(0, 0, 
0))->GetText());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 25d0363c35f4..cab1dc364b31 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2905,8 +2905,9 @@ void ScDocument::CopyFromClip(
     InsertDeleteFlags nDelFlag = InsertDeleteFlags::NONE;
     if ( (nInsFlag & (InsertDeleteFlags::CONTENTS | 
InsertDeleteFlags::ADDNOTES)) == (InsertDeleteFlags::NOTE | 
InsertDeleteFlags::ADDNOTES) )
         nDelFlag |= InsertDeleteFlags::NOTE;
-    else if ( nInsFlag & InsertDeleteFlags::CONTENTS )
-        nDelFlag |= InsertDeleteFlags::CONTENTS;
+    // tdf#141440 - do not delete notes when pasting contents (see 
InsertDeleteFlags::CONTENTS)
+    else if ( nInsFlag & (InsertDeleteFlags::CONTENTS & 
~InsertDeleteFlags::NOTE) )
+        nDelFlag |= InsertDeleteFlags::CONTENTS & ~InsertDeleteFlags::NOTE;
 
     if (nInsFlag & InsertDeleteFlags::ATTRIB)
         nDelFlag |= InsertDeleteFlags::ATTRIB;

Reply via email to