diff options
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdpage.cxx | 12 | ||||
-rw-r--r-- | svx/source/svdraw/svdundo.cxx | 48 |
2 files changed, 49 insertions, 11 deletions
diff --git a/svx/source/svdraw/svdpage.cxx b/svx/source/svdraw/svdpage.cxx index 1ebfe6cad4ac..473b06d1f394 100644 --- a/svx/source/svdraw/svdpage.cxx +++ b/svx/source/svdraw/svdpage.cxx @@ -718,25 +718,15 @@ void SdrObjList::sort( std::vector<sal_Int32>& sortOrder) bool const isUndo(rModel.IsUndoEnabled()); if (isUndo) { - rModel.BegUndo(SvxResId(STR_SortShapes)); + rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoSort(*getSdrPageFromSdrObjList(), sortOrder)); } for (size_t i = 0; i < aNewSortOrder.size(); ++i) { aNewList[i] = maList[ aNewSortOrder[i] ]; - if (isUndo && i != sal::static_int_cast<size_t>(aNewSortOrder[i])) - { - rModel.AddUndo(rModel.GetSdrUndoFactory().CreateUndoObjectOrdNum( - *aNewList[i], aNewSortOrder[i], i)); - } aNewList[i]->SetOrdNum(i); } - if (isUndo) - { - rModel.EndUndo(); - } - std::swap(aNewList, maList); } diff --git a/svx/source/svdraw/svdundo.cxx b/svx/source/svdraw/svdundo.cxx index 116c5e479a13..d26a27339541 100644 --- a/svx/source/svdraw/svdundo.cxx +++ b/svx/source/svdraw/svdundo.cxx @@ -42,6 +42,7 @@ #include <vcl/svapp.hxx> #include <sfx2/viewsh.hxx> #include <svx/svdoashp.hxx> +#include <sal/log.hxx> #include <osl/diagnose.h> @@ -970,6 +971,48 @@ OUString SdrUndoObjOrdNum::GetComment() const return ImpGetDescriptionStr(STR_UndoObjOrdNum); } +SdrUndoSort::SdrUndoSort(SdrPage & rPage, + ::std::vector<sal_Int32> const& rSortOrder) + : SdrUndoAction(rPage.getSdrModelFromSdrPage()) + , m_OldSortOrder(rSortOrder.size()) + , m_NewSortOrder(rSortOrder) + , m_nPage(rPage.GetPageNum()) +{ + // invert order + for (size_t i = 0; i < rSortOrder.size(); ++i) + { + m_OldSortOrder[rSortOrder[i]] = i; + } +} + +void SdrUndoSort::Do(::std::vector<sal_Int32> & rSortOrder) +{ + SdrPage & rPage(*rMod.GetPage(m_nPage)); + if (rPage.GetObjCount() != rSortOrder.size()) + { + // can probably happen with sw's cursed SdrVirtObj mess - no good solution for that + SAL_WARN("svx", "SdrUndoSort size mismatch"); + return; + } + + // hopefully this can't throw + rPage.sort(rSortOrder); +} + +void SdrUndoSort::Undo() +{ + Do(m_OldSortOrder); +} + +void SdrUndoSort::Redo() +{ + Do(m_NewSortOrder); +} + +OUString SdrUndoSort::GetComment() const +{ + return SvxResId(STR_SortShapes); +} SdrUndoObjSetText::SdrUndoObjSetText(SdrObject& rNewObj, sal_Int32 nText) : SdrUndoObj(rNewObj) @@ -1668,6 +1711,11 @@ std::unique_ptr<SdrUndoAction> SdrUndoFactory::CreateUndoObjectOrdNum( SdrObject return std::make_unique<SdrUndoObjOrdNum>( rObject, nOldOrdNum1, nNewOrdNum1 ); } +std::unique_ptr<SdrUndoAction> SdrUndoFactory::CreateUndoSort(SdrPage & rPage, ::std::vector<sal_Int32> const& rSortOrder) +{ + return std::make_unique<SdrUndoSort>(rPage, rSortOrder); +} + std::unique_ptr<SdrUndoAction> SdrUndoFactory::CreateUndoReplaceObject( SdrObject& rOldObject, SdrObject& rNewObject ) { return std::make_unique<SdrUndoReplaceObj>( rOldObject, rNewObject ); |