bool SdrUndoManager::Undo()
{ if (isTextEditActive())
{ bool bRetval(false);
// we are in text edit mode if (GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction())
{ // there is an undo action for text edit, trigger it
bRetval = EditUndoManager::Undo();
} else
{ // no more text edit undo, end text edit
mbEndTextEditTriggeredFromUndo = true;
maEndTextEditHdl.Call(this);
mbEndTextEditTriggeredFromUndo = false;
}
return bRetval;
} else
{ // no undo triggered up to now, trigger local one return SfxUndoManager::Undo();
}
}
if (isTextEditActive())
{ // we are in text edit mode
bRetval = EditUndoManager::Redo();
}
if (!bRetval)
{ // Check if the current and thus to-be undone UndoAction is a SdrUndoDiagramModelData action constbool bCurrentIsDiagramChange(
GetRedoActionCount()
&& nullptr != dynamic_cast<SdrUndoDiagramModelData*>(GetRedoAction()));
// no redo triggered up to now, trigger local one
bRetval = SfxUndoManager::Redo();
// it was a SdrUndoDiagramModelData action and we have more Redo actions if (bCurrentIsDiagramChange && GetRedoActionCount())
{ constbool bNextIsDiagramChange(
nullptr != dynamic_cast<SdrUndoDiagramModelData*>(GetRedoAction()));
// We have more Redo-actions and the 'next' one to be executed is *not* a // SdrUndoDiagramModelData-action. This means that the already executed // one had done a re-Layout/Re-create of the Diagram XShape/SdrObject // representation based on the restored Diagram ModelData. When the next // Redo action is something else (and thus will not itself re-create // XShapes/SdrShapes) it may be that it is an UnGroup/Delete where a former // as-content-of-Diagram created XShape/SdrShape is referenced, an action // that references a XShape/SdrShape by pointer/reference. That // pointer/reference *cannot* be valid anymore (now).
// The problem here is that Undo/Redo actions historically reference // XShapes/SdrShapes by pointer/reference, e.g. deleting means: remove // from an SdrObjList and add to an Undo action. I is *not* // address/incarnation-invariant in the sense to remember e.g. to // remove the Nth object in the list (that would work).
// It might be possible to solve/correct this better, but since it's // a rare corner case just avoid the possible crash when continuing Redos // by clearing the Redo-Stack here as a consequence
bClearRedoStack = !bNextIsDiagramChange;
}
}
if (bClearRedoStack)
{ // clear Redo-Stack (explanation see above)
ClearRedo();
}
return bRetval;
}
void SdrUndoManager::Clear()
{ if (isTextEditActive())
{ while (GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction())
{
RemoveLastUndoAction();
}
// urgently needed: RemoveLastUndoAction does NOT correct the Redo stack by itself (!)
ClearRedo();
} else
{ // call parent
EditUndoManager::Clear();
}
}
if (isTextEditActive())
{ // text edit start, remember last non-textedit action for later cleanup
mpLastUndoActionBeforeTextEdit = GetUndoActionCount() ? GetUndoAction() : nullptr;
mnRedoActionCountBeforeTextEdit = GetRedoActionCount();
} else
{ // text edit ends, pop all textedit actions up to the remembered non-textedit action from the start // to set back the UndoManager to the state before text edit started. If that action is already gone // (due to being removed from the undo stack in the meantime), all need to be removed anyways while (GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction())
{
RemoveLastUndoAction();
}
// urgently needed: RemoveLastUndoAction does NOT correct the Redo stack by itself (!)
ClearRedo();
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.10Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.