diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2021-10-07 16:48:46 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2021-10-20 16:25:16 +0200 |
commit | c175c1dc19d0edc8ca66e39f0b4b8af04e3d6c87 (patch) | |
tree | 04e074d7e034642a4e4025e106dc20db09ca9ee2 /svx | |
parent | 85d53dafd8332fc9c7bf71d6cc9da19ab9d8e252 (diff) |
svx: Don't end text edit mode for all views
This allows multiple views to not disturb each other editing inside
a impress document. With the ending of text edit for all views still
enabled, one view can cancel other views text editing just by moving
or resizing a unrelated shape in the document.
To make this possible we also need a view-local undo manager for
the text edit mode, which is independent of the document undo
manager. When the text edit mode ends, all the changes will be
added as one change to the document undo stack. This prevents any
conflicts in the undo stack that could be made when 2 views are
editing the same document at the same time.
This also adds the test for the new use case and changes the existing
tests to reflect the change.
Change-Id: I04edb4f91d7e111a490c946f7121cbca75f818d7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123220
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svddrgmt.cxx | 2 | ||||
-rw-r--r-- | svx/source/svdraw/svdedtv.cxx | 12 | ||||
-rw-r--r-- | svx/source/svdraw/svdedtv1.cxx | 24 | ||||
-rw-r--r-- | svx/source/svdraw/svdedxv.cxx | 17 |
4 files changed, 36 insertions, 19 deletions
diff --git a/svx/source/svdraw/svddrgmt.cxx b/svx/source/svdraw/svddrgmt.cxx index 7d5fb61569b7..bdba8aa0d7f4 100644 --- a/svx/source/svdraw/svddrgmt.cxx +++ b/svx/source/svdraw/svddrgmt.cxx @@ -1345,7 +1345,7 @@ bool SdrDragObjOwn::EndSdrDrag(bool /*bCopy*/) if( bUndo ) { - getSdrDragView().EndTextEditAllViews(); + getSdrDragView().EndTextEditCurrentView(); if(!getSdrDragView().IsInsObjPoint() && pObj->IsInserted() ) { if (DragStat().IsEndDragChangesAttributes()) diff --git a/svx/source/svdraw/svdedtv.cxx b/svx/source/svdraw/svdedtv.cxx index 0d4bb55d09f5..47f5c971e543 100644 --- a/svx/source/svdraw/svdedtv.cxx +++ b/svx/source/svdraw/svdedtv.cxx @@ -1000,7 +1000,7 @@ bool SdrEditView::InsertObjectAtView(SdrObject* pObj, SdrPageView& rPV, SdrInser } if( IsUndoEnabled()) { - EndTextEditAllViews(); + EndTextEditCurrentView(); AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoNewObject(*pObj)); } @@ -1080,4 +1080,14 @@ void SdrEditView::EndTextEditAllViews() const } } +void SdrEditView::EndTextEditCurrentView() +{ + if (IsTextEdit()) + { + SdrView* pSdrView = dynamic_cast<SdrView*>(this); + if (pSdrView) + pSdrView->SdrEndTextEdit(); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx index 81cf6e6f0b0b..852d160ccd98 100644 --- a/svx/source/svdraw/svdedtv1.cxx +++ b/svx/source/svdraw/svdedtv1.cxx @@ -95,7 +95,7 @@ void SdrEditView::SetMarkedObjRect(const tools::Rectangle& rRect) const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); BegUndo(ImpGetDescriptionString(STR_EditPosSize)); } @@ -186,7 +186,7 @@ void SdrEditView::MoveMarkedObj(const Size& rSiz, bool bCopy) if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr(SvxResId(STR_EditMove)); if (bCopy) aStr += SvxResId(STR_EditWithCopy); @@ -219,7 +219,7 @@ void SdrEditView::ResizeMarkedObj(const Point& rRef, const Fraction& xFact, cons const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr {ImpGetDescriptionString(STR_EditResize)}; if (bCopy) aStr+=SvxResId(STR_EditWithCopy); @@ -254,7 +254,7 @@ void SdrEditView::ResizeMultMarkedObj(const Point& rRef, const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); BegUndo(ImpGetDescriptionString(STR_EditResize)); } @@ -301,7 +301,7 @@ void SdrEditView::RotateMarkedObj(const Point& rRef, Degree100 nAngle, bool bCop const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr {ImpGetDescriptionString(STR_EditRotate)}; if (bCopy) aStr+=SvxResId(STR_EditWithCopy); BegUndo(aStr); @@ -358,7 +358,7 @@ void SdrEditView::MirrorMarkedObj(const Point& rRef1, const Point& rRef2, bool b if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr; Point aDif(rRef2-rRef1); if (aDif.X()==0) @@ -458,7 +458,7 @@ void SdrEditView::ShearMarkedObj(const Point& rRef, Degree100 nAngle, bool bVShe if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr {ImpGetDescriptionString(STR_EditShear)}; if (bCopy) aStr+=SvxResId(STR_EditWithCopy); @@ -574,7 +574,7 @@ void SdrEditView::CrookMarkedObj(const Point& rRef, const Point& rRad, SdrCrookM if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr {ImpGetDescriptionString(bNoContortion ? STR_EditCrook : STR_EditCrookContortion)}; if (bCopy) aStr+=SvxResId(STR_EditWithCopy); @@ -648,7 +648,7 @@ void SdrEditView::DistortMarkedObj(const tools::Rectangle& rRef, const XPolygon& if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr {ImpGetDescriptionString(STR_EditDistort)}; if (bCopy) aStr+=SvxResId(STR_EditWithCopy); @@ -1098,7 +1098,7 @@ void SdrEditView::SetAttrToMarked(const SfxItemSet& rAttr, bool bReplaceAll) const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); BegUndo(ImpGetDescriptionString(STR_EditSetAttributes)); } @@ -1277,7 +1277,7 @@ void SdrEditView::SetStyleSheetToMarked(SfxStyleSheet* pStyleSheet, bool bDontRe if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr; if (pStyleSheet!=nullptr) aStr = ImpGetDescriptionString(STR_EditSetStylesheet); @@ -1844,7 +1844,7 @@ void SdrEditView::AlignMarkedObjects(SdrHorAlign eHor, SdrVertAlign eVert) const bool bUndo = IsUndoEnabled(); if( bUndo ) { - EndTextEditAllViews(); + EndTextEditCurrentView(); OUString aStr(GetDescriptionOfMarkedObjects()); if (eHor==SdrHorAlign::NONE) { diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index db0ccf6ea486..3717fdce2c08 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -1060,10 +1060,11 @@ IMPL_LINK(SdrObjEditView, ImpOutlinerCalcFieldValueHdl, EditFieldInfo*, pFI, voi IMPL_LINK_NOARG(SdrObjEditView, EndTextEditHdl, SdrUndoManager*, void) { SdrEndTextEdit(); } -SdrUndoManager* SdrObjEditView::getSdrUndoManagerForEnhancedTextEdit() const +// Default implementation - null UndoManager +std::unique_ptr<SdrUndoManager> SdrObjEditView::createLocalTextUndoManager() { - // default returns registered UndoManager - return GetModel() ? dynamic_cast<SdrUndoManager*>(GetModel()->GetSdrUndoManager()) : nullptr; + SAL_WARN("svx", "SdrObjEditView::createLocalTextUndoManager needs to be overridden"); + return std::unique_ptr<SdrUndoManager>(); } bool SdrObjEditView::SdrBeginTextEdit(SdrObject* pObj_, SdrPageView* pPV, vcl::Window* pWin, @@ -1360,7 +1361,11 @@ bool SdrObjEditView::SdrBeginTextEdit(SdrObject* pObj_, SdrPageView* pPV, vcl::W if (GetModel() && IsUndoEnabled() && !GetModel()->GetDisableTextEditUsesCommonUndoManager()) { - SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit(); + SdrUndoManager* pSdrUndoManager = nullptr; + mpLocalTextEditUndoManager = createLocalTextUndoManager(); + + if (mpLocalTextEditUndoManager) + pSdrUndoManager = mpLocalTextEditUndoManager.get(); if (pSdrUndoManager) { @@ -1434,7 +1439,7 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) if (pOriginal) { // check if we got back our document undo manager - SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit(); + SdrUndoManager* pSdrUndoManager = mpLocalTextEditUndoManager.get(); if (pSdrUndoManager && dynamic_cast<SdrUndoManager*>(pOriginal) == pSdrUndoManager) { @@ -1467,6 +1472,8 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) "expected document UndoManager (!)"); delete pOriginal; } + + mpLocalTextEditUndoManager.reset(); } } else |