sc/inc/column.hxx | 2 ++ sc/inc/drwlayer.hxx | 4 +++- sc/source/core/data/column.cxx | 35 +++++++++++++++++++++++++++++++++++ sc/source/core/data/drwlayer.cxx | 24 +++++++++++++++++++++++- sc/source/core/data/table3.cxx | 27 ++++++++++++++++++++++++++- 5 files changed, 89 insertions(+), 3 deletions(-)
New commits: commit efb190857650b2f2592be783a0e2997b8eeaf768 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Date: Wed Dec 20 11:30:36 2017 +0100 tdf#98931 Consider cell-anchored images when sorting (cherry picked from commit 06567dd9c92fc2d3971fc0ce893c74d019176c5e) Change-Id: Id9a56a15f776d5adbe382a9bca167bff48b69a0c Reviewed-on: https://gerrit.libreoffice.org/46982 Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Tested-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index 939716443d20..2188c539bf41 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -29,6 +29,7 @@ #include "mtvelements.hxx" #include <formula/types.hxx> #include <svl/zforlist.hxx> +#include <svx/svdobj.hxx> #include <set> #include <vector> @@ -608,6 +609,7 @@ public: sc::ColumnBlockPosition& maDestBlockPos, bool bCloneCaption = true, SCROW nRowOffsetDest=0 ) const; void UpdateNoteCaptions( SCROW nRow1, SCROW nRow2 ); + void UpdateDrawObjects( std::vector<std::vector<SdrObject*>> pObjects, SCROW nRowStart, SCROW nRowEnd ); void InterpretDirtyCells( SCROW nRow1, SCROW nRow2 ); diff --git a/sc/inc/drwlayer.hxx b/sc/inc/drwlayer.hxx index 54951b506f36..64c8b1980c68 100644 --- a/sc/inc/drwlayer.hxx +++ b/sc/inc/drwlayer.hxx @@ -104,7 +104,6 @@ private: void MoveCells( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2, SCsCOL nDx,SCsROW nDy, bool bUpdateNoteCaptionPos ); - void RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos ); void ResizeLastRectFromAnchor( SdrObject* pObj, ScDrawObjData& rData, bool bUseLogicRect, bool bNegativePage, bool bCanResize, bool bHiddenAsZero = true ); public: @@ -142,6 +141,8 @@ public: void MoveArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, SCCOL nCol2,SCROW nRow2, SCsCOL nDx,SCsROW nDy, bool bInsDel, bool bUpdateNoteCaptionPos = true ); + void RecalcPos( SdrObject* pObj, ScDrawObjData& rData, bool bNegativePage, bool bUpdateNoteCaptionPos ); + bool HasObjectsInRows( SCTAB nTab, SCROW nStartRow, SCROW nEndRow ); void DeleteObjectsInArea( SCTAB nTab, SCCOL nCol1,SCROW nRow1, @@ -182,6 +183,7 @@ public: static void SetCellAnchoredFromPosition( SdrObject &rObj, const ScDocument &rDoc, SCTAB nTab ); static void UpdateCellAnchorFromPositionEnd( SdrObject &rObj, ScDrawObjData &rAnchor, const ScDocument &rDoc, SCTAB nTab, bool bUseLogicRect = true ); static ScAnchorType GetAnchorType( const SdrObject& ); + std::vector<SdrObject*> GetObjectsAnchoredToCell(const ScAddress& rPos); // positions for detektive lines static ScDrawObjData* GetObjData( SdrObject* pObj, bool bCreate=false ); diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx index b70796390989..91b078e37d9b 100644 --- a/sc/source/core/data/column.cxx +++ b/sc/source/core/data/column.cxx @@ -45,6 +45,8 @@ #include <refhint.hxx> #include <stlalgorithm.hxx> #include <formulagroup.hxx> +#include <userdat.hxx> +#include <drwlayer.hxx> #include <svl/poolcach.hxx> #include <svl/zforlist.hxx> @@ -1896,6 +1898,39 @@ void ScColumn::UpdateNoteCaptions( SCROW nRow1, SCROW nRow2 ) NoteCaptionUpdater aFunc(nCol, nTab); sc::ProcessNote(maCellNotes.begin(), maCellNotes, nRow1, nRow2, aFunc); } +void ScColumn::UpdateDrawObjects(std::vector<std::vector<SdrObject*>> pObjects, SCROW nRowStart, SCROW nRowEnd) +{ + int nObj = 0; + for (SCROW nCurrentRow = nRowStart; nCurrentRow <= nRowEnd; nCurrentRow++, nObj++) + { + if (pObjects[nObj].empty()) + continue; // No draw objects in this row + + for (auto &pObject : pObjects[nObj]) + { + // Get anchor data + ScDrawObjData* pObjData = ScDrawLayer::GetObjData(pObject, false); + const ScAddress aOldStart = pObjData->maStart; + const ScAddress aOldEnd = pObjData->maEnd; + + // Set start address + ScAddress aNewStart = ScAddress(nCol, nCurrentRow, 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; + + // Update draw object according to new anchor + ScDrawLayer* pDrawLayer = GetDoc().GetDrawLayer(); + pDrawLayer->RecalcPos(pObject, *pObjData, false, false); + } + } +} void ScColumn::SwapCol(ScColumn& rCol) { diff --git a/sc/source/core/data/drwlayer.cxx b/sc/source/core/data/drwlayer.cxx index 7ea675821d0a..501cb275c973 100644 --- a/sc/source/core/data/drwlayer.cxx +++ b/sc/source/core/data/drwlayer.cxx @@ -1936,7 +1936,6 @@ void ScDrawLayer::GetCellAnchorFromPosition( SdrObject &rObj, ScDrawObjData &rAn rAnchor.maEndOffset.X() = aObjRect.Right()-aCellRect.Left(); else rAnchor.maEndOffset.X() = aCellRect.Right()-aObjRect.Left(); - } void ScDrawLayer::UpdateCellAnchorFromPositionEnd( SdrObject &rObj, ScDrawObjData &rAnchor, const ScDocument &rDoc, SCTAB nTab, bool bUseLogicRect ) @@ -1977,6 +1976,29 @@ ScAnchorType ScDrawLayer::GetAnchorType( const SdrObject &rObj ) return ScDrawLayer::GetObjData(const_cast<SdrObject*>(&rObj)) ? SCA_CELL : SCA_PAGE; } +std::vector<SdrObject*> ScDrawLayer::GetObjectsAnchoredToCell(const ScAddress& rCell) +{ + SdrPage* pPage = GetPage(static_cast<sal_uInt16>(rCell.Tab())); + if (!pPage || pPage->GetObjCount() < 1) + return std::vector<SdrObject*>(); + + std::vector<SdrObject*> pObjects; + SdrObjListIter aIter( *pPage, IM_FLAT ); + SdrObject* pObject = aIter.Next(); + ScDrawObjData* pObjData; + while (pObject) + { + if (!dynamic_cast<SdrCaptionObj*>(pObject)) // Caption objects are handled differently + { + pObjData = GetObjData(pObject); + if (pObjData && pObjData->maStart == rCell) // Object is anchored to this cell + pObjects.push_back(pObject); + } + pObject = aIter.Next(); + } + return pObjects; +} + ScDrawObjData* ScDrawLayer::GetNonRotatedObjData( SdrObject* pObj, bool bCreate ) { sal_uInt16 nCount = pObj ? pObj->GetUserDataCount() : 0; diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx index afe21d794e5a..509731d0eff0 100644 --- a/sc/source/core/data/table3.cxx +++ b/sc/source/core/data/table3.cxx @@ -22,6 +22,7 @@ #include <unotools/textsearch.hxx> #include <svl/zforlist.hxx> #include <svl/zformat.hxx> +#include <svx/svdobj.hxx> #include <unotools/charclass.hxx> #include <unotools/collatorwrapper.hxx> #include <com/sun/star/i18n/CollatorOptions.hpp> @@ -64,6 +65,7 @@ #include <listenerquery.hxx> #include <bcaslot.hxx> #include <reordermap.hxx> +#include <drwlayer.hxx> #include <svl/sharedstringpool.hxx> @@ -228,9 +230,10 @@ public: ScRefCellValue maCell; const sc::CellTextAttr* mpAttr; const ScPostIt* mpNote; + std::vector<SdrObject*> maDrawObjects; const ScPatternAttr* mpPattern; - Cell() : mpAttr(nullptr), mpNote(nullptr), mpPattern(nullptr) {} + Cell() : mpAttr(nullptr), mpNote(nullptr), maDrawObjects(), mpPattern(nullptr) {} }; struct Row @@ -439,6 +442,17 @@ void initDataRows( rCell.maCell = rCol.GetCellValue(aBlockPos, nRow); rCell.mpAttr = rCol.GetCellTextAttr(aBlockPos, nRow); rCell.mpNote = rCol.GetCellNote(aBlockPos, nRow); + ScDrawLayer* pDrawLayer = rTab.GetDoc().GetDrawLayer(); + if (pDrawLayer) + { + ScAddress aCellPos(nCol, nRow, rTab.GetTab()); + std::vector<SdrObject*> pObjects = pDrawLayer->GetObjectsAnchoredToCell(aCellPos); + rCell.maDrawObjects = pObjects; + } + else + { + SAL_WARN("sc", "Could not retrieve anchored images, no DrawLayer available"); + } if (!bUniformPattern && bPattern) rCell.mpPattern = rCol.GetPattern(nRow); @@ -549,6 +563,7 @@ struct SortedColumn sc::CellTextAttrStoreType maCellTextAttrs; sc::BroadcasterStoreType maBroadcasters; sc::CellNoteStoreType maCellNotes; + std::vector<std::vector<SdrObject*>> maCellDrawObjects; PatRangeType maPatterns; PatRangeType::const_iterator miPatternPos; @@ -561,6 +576,7 @@ struct SortedColumn maCellTextAttrs(nTopEmptyRows), maBroadcasters(nTopEmptyRows), maCellNotes(nTopEmptyRows), + maCellDrawObjects(), maPatterns(0, MAXROWCOUNT, nullptr), miPatternPos(maPatterns.begin()) {} @@ -811,6 +827,9 @@ void fillSortedColumnArray( else rNoteStore.push_back_empty(); + // Add cell anchored images + aSortedCols.at(j).get()->maCellDrawObjects.push_back(rCell.maDrawObjects); + if (rCell.mpPattern) aSortedCols.at(j).get()->setPattern(aCellPos.Row(), rCell.mpPattern); } @@ -1120,6 +1139,9 @@ void ScTable::SortReorderByRow( aCol[nThisCol].UpdateNoteCaptions(nRow1, nRow2); } + // Update draw object positions + aCol[nThisCol].UpdateDrawObjects(aSortedCols[i].get()->maCellDrawObjects, nRow1, nRow2); + { // Get all row spans where the pattern is not NULL. std::vector<PatternSpan> aSpans = @@ -1318,6 +1340,9 @@ void ScTable::SortReorderByRowRefUpdate( aCol[nThisCol].UpdateNoteCaptions(nRow1, nRow2); } + // Update draw object positions + aCol[nThisCol].UpdateDrawObjects(aSortedCols[i].get()->maCellDrawObjects, nRow1, nRow2); + { // Get all row spans where the pattern is not NULL. std::vector<PatternSpan> aSpans = _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits