sc/inc/drwlayer.hxx              |    1 
 sc/qa/unit/ucalc.hxx             |    2 +
 sc/qa/unit/ucalc_sort.cxx        |   62 +++++++++++++++++++++++++++++++++++++++
 sc/source/core/data/column.cxx   |   21 +------------
 sc/source/core/data/drwlayer.cxx |   24 +++++++++++++++
 5 files changed, 91 insertions(+), 19 deletions(-)

New commits:
commit 9f329c08e6b7e87879545c1bd78a4d3435fc44e4
Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
Date:   Mon Jan 22 12:46:11 2018 +0100

    tdf#98931 Test for sorting images
    
    Change-Id: Ia9bbdfefc4f8ef2948d497391cdc1e9c760f1f64
    Reviewed-on: https://gerrit.libreoffice.org/48310
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Eike Rathke <er...@redhat.com>

diff --git a/sc/inc/drwlayer.hxx b/sc/inc/drwlayer.hxx
index 8f33dbebf721..56c820d465d3 100644
--- a/sc/inc/drwlayer.hxx
+++ b/sc/inc/drwlayer.hxx
@@ -183,6 +183,7 @@ public:
     static void             UpdateCellAnchorFromPositionEnd( const SdrObject 
&rObj, ScDrawObjData &rAnchor, const ScDocument &rDoc, SCTAB nTab, bool 
bUseLogicRect = true );
     static ScAnchorType     GetAnchorType( const SdrObject& );
     std::vector<SdrObject*> GetObjectsAnchoredToCell(const ScAddress& rPos);
+    void MoveObject(SdrObject* pObj, ScAddress& rNewPosition);
 
     // positions for detektive lines
     static ScDrawObjData* GetObjData( SdrObject* pObj, bool bCreate=false );
diff --git a/sc/qa/unit/ucalc.hxx b/sc/qa/unit/ucalc.hxx
index 74729debe9ea..81d100254f93 100644
--- a/sc/qa/unit/ucalc.hxx
+++ b/sc/qa/unit/ucalc.hxx
@@ -462,6 +462,7 @@ public:
     void testSortBroadcastBroadcaster();
     void testSortOutOfPlaceResult();
     void testSortPartialFormulaGroup();
+    void testSortImages();
 
     void testNoteBasic();
     void testNoteDeleteRow();
@@ -764,6 +765,7 @@ public:
     CPPUNIT_TEST(testSortBroadcastBroadcaster);
     CPPUNIT_TEST(testSortOutOfPlaceResult);
     CPPUNIT_TEST(testSortPartialFormulaGroup);
+    CPPUNIT_TEST(testSortImages);
     CPPUNIT_TEST(testShiftCells);
     CPPUNIT_TEST(testNoteBasic);
     CPPUNIT_TEST(testNoteDeleteRow);
diff --git a/sc/qa/unit/ucalc_sort.cxx b/sc/qa/unit/ucalc_sort.cxx
index 922856bcae96..eb7d1b79039e 100644
--- a/sc/qa/unit/ucalc_sort.cxx
+++ b/sc/qa/unit/ucalc_sort.cxx
@@ -21,10 +21,13 @@
 #include <docfunc.hxx>
 #include <scitems.hxx>
 #include <editutil.hxx>
+#include <table.hxx>
 
 #include <sal/config.h>
 #include <editeng/wghtitem.hxx>
 #include <editeng/postitem.hxx>
+#include <svx/svdocirc.hxx>
+#include <svx/svdpage.hxx>
 #include <test/bootstrapfixture.hxx>
 
 void Test::testSort()
@@ -1884,4 +1887,63 @@ void Test::testSortPartialFormulaGroup()
     m_pDoc->DeleteTab(0);
 }
 
+void Test::testSortImages()
+{
+    m_pDoc->InsertTab(0, "testSortImages");
+
+    // We need a drawing layer in order to create caption objects.
+    m_pDoc->InitDrawLayer(&getDocShell());
+    ScDrawLayer* pDrawLayer = m_pDoc->GetDrawLayer();
+    CPPUNIT_ASSERT(pDrawLayer);
+
+    ScRange aDataRange;
+    ScAddress aPos(0,0,0);
+    {
+        const char* aData[][1] = {
+            { "2" },
+            { "1" },
+        };
+
+        clearRange(m_pDoc, ScRange(0, 0, 0, 1, SAL_N_ELEMENTS(aData), 0));
+        aDataRange = insertRangeData(m_pDoc, aPos, aData, 
SAL_N_ELEMENTS(aData));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("failed to insert range data at correct 
position", aPos, aDataRange.aStart);
+    }
+
+    // Insert graphic in cell B2.
+    const tools::Rectangle aOrigRect = tools::Rectangle(1000, 1000, 1200, 
1200);
+    SdrCircObj* pObj = new SdrCircObj(OBJ_CIRC, aOrigRect);
+    SdrPage* pPage = pDrawLayer->GetPage(0);
+    CPPUNIT_ASSERT(pPage);
+    pPage->InsertObject(pObj);
+    // Anchor to cell
+    ScDrawLayer::SetCellAnchoredFromPosition(*pObj, *m_pDoc, 0);
+    // Move to cell B2
+    ScAddress aCellPos(1, 1, 0);
+    pDrawLayer->MoveObject(pObj, aCellPos);
+
+    std::vector<SdrObject*> pObjects = 
pDrawLayer->GetObjectsAnchoredToCell(aCellPos);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pObjects.size());
+
+    ScSortParam aSortData;
+    aSortData.nCol1 = 0;
+    aSortData.nCol2 = 1;
+    aSortData.nRow1 = 0;
+    aSortData.nRow2 = 1;
+    aSortData.maKeyState[0].bDoSort = true;
+    aSortData.maKeyState[0].nField = 0;
+    aSortData.maKeyState[0].bAscending = true;
+
+    m_pDoc->Sort(0, aSortData, false, true, nullptr, nullptr);
+
+    double nVal = m_pDoc->GetValue(0,0,0);
+    ASSERT_DOUBLES_EQUAL(nVal, 1.0);
+
+    // check that note is also moved after sorting
+    aCellPos = ScAddress(1, 0, 0);
+    pObjects = pDrawLayer->GetObjectsAnchoredToCell(aCellPos);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pObjects.size());
+
+    m_pDoc->DeleteTab(0);
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 24d825901483..e8d773f6923f 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1912,29 +1912,12 @@ void ScColumn::UpdateDrawObjectsForRow( 
std::vector<SdrObject*>& pObjects, SCCOL
 {
     for (auto &pObject : pObjects)
     {
-        // Get anchor data
-        ScDrawObjData* pObjData = ScDrawLayer::GetObjData(pObject, false);
-        if (!pObjData)
-            continue;
-        const ScAddress aOldStart = pObjData->maStart;
-        const ScAddress aOldEnd = pObjData->maEnd;
-
-        // Set start address
-        ScAddress aNewStart = ScAddress(nTargetCol, nTargetRow, nTab);
-        pObjData->maStart = aNewStart;
-
-        // Set end address
-        const SCCOL nObjectColSpan = aOldEnd.Col() - aOldStart.Col();
-        const SCROW nObjectRowSpan = aOldEnd.Row() - aOldStart.Row();
-        ScAddress aNewEnd = aNewStart;
-        aNewEnd.IncRow(nObjectRowSpan);
-        aNewEnd.IncCol(nObjectColSpan);
-        pObjData->maEnd = aNewEnd;
+        ScAddress aNewAddress = ScAddress(nTargetCol, nTargetRow, nTab);
 
         // Update draw object according to new anchor
         ScDrawLayer* pDrawLayer = GetDoc()->GetDrawLayer();
         if (pDrawLayer)
-            pDrawLayer->RecalcPos(pObject, *pObjData, false, false);
+            pDrawLayer->MoveObject(pObject, aNewAddress);
     }
 }
 
diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx
index 3d5507bea459..7f2124d98755 100644
--- a/sc/source/core/data/drwlayer.cxx
+++ b/sc/source/core/data/drwlayer.cxx
@@ -2017,6 +2017,30 @@ std::vector<SdrObject*> 
ScDrawLayer::GetObjectsAnchoredToCell(const ScAddress& r
     return pObjects;
 }
 
+void ScDrawLayer::MoveObject(SdrObject* pObject, ScAddress& rNewPosition)
+{
+    // Get anchor data
+    ScDrawObjData* pObjData = GetObjData(pObject, false);
+    if (!pObjData)
+        return;
+    const ScAddress aOldStart = pObjData->maStart;
+    const ScAddress aOldEnd = pObjData->maEnd;
+
+    // Set start address
+    pObjData->maStart = rNewPosition;
+
+    // Set end address
+    const SCCOL nObjectColSpan = aOldEnd.Col() - aOldStart.Col();
+    const SCROW nObjectRowSpan = aOldEnd.Row() - aOldStart.Row();
+    ScAddress aNewEnd = rNewPosition;
+    aNewEnd.IncRow(nObjectRowSpan);
+    aNewEnd.IncCol(nObjectColSpan);
+    pObjData->maEnd = aNewEnd;
+
+    // Update draw object according to new anchor
+    RecalcPos(pObject, *pObjData, false, false);
+}
+
 ScDrawObjData* ScDrawLayer::GetNonRotatedObjData( SdrObject* pObj, bool 
bCreate )
 {
     sal_uInt16 nCount = pObj ? pObj->GetUserDataCount() : 0;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to