Kaydet (Commit) 401d4516 authored tarafından Samuel Mehrbrodt's avatar Samuel Mehrbrodt Kaydeden (comit) Eike Rathke

Improve performance when searching for blocks w/o draw objects

... by returning when the first object in the lookup range has been found

Follow-up for 3a2a430a

Change-Id: I5cc9a268793eb8d156a39b0a2de557220da96748
Reviewed-on: https://gerrit.libreoffice.org/48395Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarEike Rathke <erack@redhat.com>
üst 0254e179
......@@ -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);
bool HasObjectsAnchoredInRange(ScRange& rRange);
void MoveObject(SdrObject* pObj, ScAddress& rNewPosition);
// positions for detektive lines
......
......@@ -1927,13 +1927,8 @@ bool ScColumn::IsDrawObjectsEmptyBlock(SCROW nStartRow, SCROW nEndRow) const
if (!pDrawLayer)
return true;
for (SCROW nCurrentRow = nStartRow; nCurrentRow <= nEndRow; nCurrentRow++)
{
ScAddress aCell(nCol, nCurrentRow, nTab);
if (!pDrawLayer->GetObjectsAnchoredToCell(aCell).empty())
return false;
}
return true;
ScRange aRange(nCol, nStartRow, nTab, nCol, nEndRow, nTab);
return !pDrawLayer->HasObjectsAnchoredInRange(aRange);
}
void ScColumn::SwapCol(ScColumn& rCol)
......
......@@ -2017,6 +2017,31 @@ std::vector<SdrObject*> ScDrawLayer::GetObjectsAnchoredToCell(const ScAddress& r
return pObjects;
}
bool ScDrawLayer::HasObjectsAnchoredInRange(ScRange& rRange)
{
// This only works for one table at a time
assert(rRange.aStart.Tab() == rRange.aEnd.Tab());
SdrPage* pPage = GetPage(static_cast<sal_uInt16>(rRange.aStart.Tab()));
if (!pPage || pPage->GetObjCount() < 1)
return false;
SdrObjListIter aIter( *pPage, SdrIterMode::Flat );
SdrObject* pObject = aIter.Next();
ScDrawObjData* pObjData;
while (pObject)
{
if (!dynamic_cast<SdrCaptionObj*>(pObject)) // Caption objects are handled differently
{
pObjData = GetObjData(pObject);
if (pObjData && rRange.In(pObjData->maStart)) // Object is in given range
return true;
}
pObject = aIter.Next();
}
return false;
}
void ScDrawLayer::MoveObject(SdrObject* pObject, ScAddress& rNewPosition)
{
// Get anchor data
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment