Kaydet (Commit) 9e03f5f1 authored tarafından Ashod Nakashian's avatar Ashod Nakashian Kaydeden (comit) Andras Timar

tdf#92612 Right-clicking after applying "paint buckets" leads to multiple Undo

In paint bucket mode the user can undo by right-clicking.
Undoing, however, is only possible after the first paint op.
After undoing is enabled, the user can undo indefinetely by
righ-clicking. This is not consistent and can be confusing.

This patch tracks the changes done after entering the paint
bucket mode, and allows the user to undo them using right-clicking
until they reach the first operation before entering this context.

Because the user can undo/redo using other means, the patch takes
it into account and will reset its tracking to accomodate this.

Ultimately, the user is able to make any changes in paint bucket
mode and undo them all by right-clicking, but no further than that.

Change-Id: I93380fb60db83aee37a1d324218ba6ab1700a2e5
Reviewed-on: https://gerrit.libreoffice.org/16951Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
(cherry picked from commit d0489d08)
Reviewed-on: https://gerrit.libreoffice.org/18257Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
üst 87318fa0
......@@ -193,6 +193,10 @@ public:
*/
virtual bool IsUndoNodes(SwNodes const& rNodes) const = 0;
/** Get the number of Undo actions.
*/
virtual size_t GetUndoActionCount(const bool bCurrentLevel = true) const = 0;
protected:
virtual ~IDocumentUndoRedo() {};
};
......
......@@ -71,6 +71,7 @@ public:
virtual void AppendUndo(SwUndo *const pUndo) SAL_OVERRIDE;
virtual void ClearRedo() SAL_OVERRIDE;
virtual bool IsUndoNodes(SwNodes const& rNodes) const SAL_OVERRIDE;
virtual size_t GetUndoActionCount(const bool bCurrentLevel = true) const SAL_OVERRIDE;
// ::svl::IUndoManager
virtual void AddUndoAction(SfxUndoAction *pAction,
......
......@@ -79,6 +79,11 @@ bool UndoManager::IsUndoNodes(SwNodes const& rNodes) const
return & rNodes == m_xUndoNodes.get();
}
size_t UndoManager::GetUndoActionCount(const bool bCurrentLevel) const
{
return SdrUndoManager::GetUndoActionCount(bCurrentLevel);
}
void UndoManager::DoUndo(bool const bDoUndo)
{
if(!isTextEditActive())
......
......@@ -77,6 +77,7 @@
#include <wrtsh.hxx>
#include <IDocumentSettingAccess.hxx>
#include <IDocumentDrawModelAccess.hxx>
#include <IDocumentUndoRedo.hxx>
#include <textboxhelper.hxx>
#include <dcontact.hxx>
#include <fldbas.hxx>
......@@ -4706,15 +4707,15 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
{
if( rSh.IsSelection() && !rSh.HasReadonlySel() )
{
if(nId == RES_CHRATR_BACKGROUND)
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
if (nId == RES_CHRATR_BACKGROUND)
rSh.SetAttrItem( SvxBrushItem( SwEditWin::m_aWaterCanTextBackColor, nId ) );
else
rSh.SetAttrItem( SvxColorItem( SwEditWin::m_aWaterCanTextColor, nId ) );
rSh.UnSetVisCrsr();
rSh.EnterStdMode();
rSh.SetVisCrsr(aDocPt);
m_pApplyTempl->bUndo = true;
bCallBase = false;
m_aTemplateIdle.Stop();
}
......@@ -4735,7 +4736,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
& eSelection ) && !rSh.HasReadonlySel() )
{
rSh.SetTextFormatColl( m_pApplyTempl->aColl.pTextColl );
m_pApplyTempl->bUndo = true;
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
bCallBase = false;
if ( m_pApplyTempl->aColl.pTextColl )
aStyleName = m_pApplyTempl->aColl.pTextColl->GetName();
......@@ -4749,7 +4751,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
rSh.UnSetVisCrsr();
rSh.EnterStdMode();
rSh.SetVisCrsr(aDocPt);
m_pApplyTempl->bUndo = true;
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
bCallBase = false;
if ( m_pApplyTempl->aColl.pCharFormat )
aStyleName = m_pApplyTempl->aColl.pCharFormat->GetName();
......@@ -4761,7 +4764,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
if(PTR_CAST(SwFlyFrameFormat, pFormat))
{
rSh.SetFrameFormat( m_pApplyTempl->aColl.pFrameFormat, false, &aDocPt );
m_pApplyTempl->bUndo = true;
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
bCallBase = false;
if( m_pApplyTempl->aColl.pFrameFormat )
aStyleName = m_pApplyTempl->aColl.pFrameFormat->GetName();
......@@ -4773,6 +4777,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
rSh.ChgCurPageDesc( *m_pApplyTempl->aColl.pPageDesc );
if ( m_pApplyTempl->aColl.pPageDesc )
aStyleName = m_pApplyTempl->aColl.pPageDesc->GetName();
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
bCallBase = false;
break;
case SFX_STYLE_FAMILY_PSEUDO:
......@@ -4782,7 +4788,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
false,
m_pApplyTempl->aColl.pNumRule->GetDefaultListId() );
bCallBase = false;
m_pApplyTempl->bUndo = true;
m_pApplyTempl->nUndo =
std::min(m_pApplyTempl->nUndo, rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount());
if( m_pApplyTempl->aColl.pNumRule )
aStyleName = m_pApplyTempl->aColl.pNumRule->GetName();
}
......@@ -4848,14 +4855,16 @@ void SwEditWin::SetApplyTemplate(const SwApplyTemplate &rTempl)
if(rTempl.m_pFormatClipboard)
{
m_pApplyTempl = new SwApplyTemplate( rTempl );
SetPointer( PointerStyle::Fill );//@todo #i20119# maybe better a new brush pointer here in future
rSh.NoEdit( false );
bIdle = rSh.GetViewOptions()->IsIdle();
rSh.GetViewOptions()->SetIdle( false );
m_pApplyTempl->nUndo = rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount();
SetPointer( PointerStyle::Fill );//@todo #i20119# maybe better a new brush pointer here in future
rSh.NoEdit( false );
bIdle = rSh.GetViewOptions()->IsIdle();
rSh.GetViewOptions()->SetIdle( false );
}
else if(rTempl.nColor)
{
m_pApplyTempl = new SwApplyTemplate( rTempl );
m_pApplyTempl->nUndo = rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount();
SetPointer( PointerStyle::Fill );
rSh.NoEdit( false );
bIdle = rSh.GetViewOptions()->IsIdle();
......@@ -4864,6 +4873,7 @@ void SwEditWin::SetApplyTemplate(const SwApplyTemplate &rTempl)
else if( rTempl.eType )
{
m_pApplyTempl = new SwApplyTemplate( rTempl );
m_pApplyTempl->nUndo = rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount();
SetPointer( PointerStyle::Fill );
rSh.NoEdit( false );
bIdle = rSh.GetViewOptions()->IsIdle();
......@@ -5189,8 +5199,11 @@ void SwEditWin::Command( const CommandEvent& rCEvt )
else if ( !m_rView.ExecSpellPopup( aDocPos ) )
SfxDispatcher::ExecutePopup( 0, this, &aPixPos);
}
else if (m_pApplyTempl->bUndo)
else if (m_pApplyTempl->nUndo < rSh.GetDoc()->GetIDocumentUndoRedo().GetUndoActionCount())
{
// Undo until we reach the point when we entered this context.
rSh.Do(SwWrtShell::UNDO);
}
bCallBase = false;
}
}
......
......@@ -132,13 +132,13 @@ struct SwApplyTemplate
int eType;
sal_uInt16 nColor;
SwFormatClipboard* m_pFormatClipboard;
bool bUndo;
size_t nUndo; //< The initial undo stack depth.
SwApplyTemplate() :
eType(0),
nColor(0),
m_pFormatClipboard(0),
bUndo(false)
nUndo(0)
{
aColl.pTextColl = 0;
}
......
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