diff options
author | Noel Grandin <noel@peralex.com> | 2015-06-19 12:02:57 +0200 |
---|---|---|
committer | Noel Grandin <noel@peralex.com> | 2015-06-19 13:13:48 +0200 |
commit | 30e87214781dd9ca5830aad674e08354d3f9ae30 (patch) | |
tree | 70472f5403c9b83d578f7fd0d5e7534314419c18 /svx | |
parent | 1352d166748ff730b11d9e165e302f7e9a1dc090 (diff) |
optimise SdrObjList::SetObjectOrdNum
the benefit here is that we avoid setting bObjOrdNumsDirty to true,
because we almost always need the ord number the very next time this is
called.
Change-Id: I0b974b79e69754d35095e197400584df4a89bfe9
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdpage.cxx | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 648a675d078f..5be2392abd7f 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -577,26 +577,52 @@ SdrObject* SdrObjList::SetObjectOrdNum(size_t nOldObjNum, size_t nNewObjNum) return NULL; } - SdrObject* pObj=maList[nOldObjNum]; - if (nOldObjNum==nNewObjNum) return pObj; - DBG_ASSERT(pObj!=NULL,"SdrObjList::SetObjectOrdNum: Object not found."); - if (pObj!=NULL) { - DBG_ASSERT(pObj->IsInserted(),"SdrObjList::SetObjectOrdNum: ZObjekt does not have status Inserted."); - RemoveObjectFromContainer(nOldObjNum); - InsertObjectIntoContainer(*pObj,nNewObjNum); + SdrObject* pObj = maList[nOldObjNum]; + assert(pObj!=NULL && "SdrObjList::SetObjectOrdNum: Object not found."); + if (nOldObjNum == nNewObjNum) + return pObj; + SdrObject* pOtherObj = maList[nNewObjNum]; + assert(pOtherObj!=NULL && "SdrObjList::SetObjectOrdNum: other Object not found."); - // No need to delete visualisation data since same object - // gets inserted again. Also a single ActionChanged is enough - pObj->ActionChanged(); + assert(pObj->IsInserted() && "SdrObjList::SetObjectOrdNum: ZObjekt does not have status Inserted."); - pObj->SetOrdNum(nNewObjNum); - bObjOrdNumsDirty=true; - if (pModel!=NULL) - { - // TODO: We need a different broadcast here. - if (pObj->GetPage()!=NULL) pModel->Broadcast(SdrHint(*pObj)); - pModel->SetChanged(); - } + // Update the navigation positions. + if (HasObjectNavigationOrder()) + { + SdrObjectWeakRef aReference (pOtherObj); + WeakSdrObjectContainerType::iterator iObject (::std::find( + mxNavigationOrder->begin(), + mxNavigationOrder->end(), + aReference)); + if (iObject != mxNavigationOrder->end()) + mxNavigationOrder->erase(iObject); + mbIsNavigationOrderDirty = true; + // The new object does not have a user defined position so append it + // to the list. + pObj->SetNavigationPosition(mxNavigationOrder->size()); + mxNavigationOrder->push_back(pObj); + } + + maList.erase(maList.begin()+nOldObjNum); + if (nNewObjNum >= maList.size()) + maList.push_back(pObj); + else + maList.insert(maList.begin()+nNewObjNum, pObj); + + const size_t nCount = maList.size(); + for (size_t no=nOldObjNum; no<nCount; ++no) { + maList[no]->SetOrdNum(no); + } + + // No need to delete visualisation data since same object + // gets inserted again. Also a single ActionChanged is enough + pObj->ActionChanged(); + + if (pModel!=NULL) + { + // TODO: We need a different broadcast here. + if (pObj->GetPage()!=NULL) pModel->Broadcast(SdrHint(*pObj)); + pModel->SetChanged(); } return pObj; } |