[Libreoffice-commits] core.git: sw/inc sw/source

Ashod Nakashian ashodnakashian at yahoo.com
Fri Aug 21 15:02:33 PDT 2015


 sw/inc/IDocumentUndoRedo.hxx       |    4 ++++
 sw/inc/view.hxx                    |    4 ++--
 sw/source/core/inc/UndoManager.hxx |    1 +
 sw/source/core/undo/docundo.cxx    |    5 +++++
 sw/source/uibase/docvw/edtwin.cxx  |   37 +++++++++++++++++++++++++------------
 5 files changed, 37 insertions(+), 14 deletions(-)

New commits:
commit d0489d0827fc6cef04d0f3602023d82ceda82480
Author: Ashod Nakashian <ashodnakashian at yahoo.com>
Date:   Sat Jul 11 12:53:08 2015 -0400

    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/16951
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/inc/IDocumentUndoRedo.hxx b/sw/inc/IDocumentUndoRedo.hxx
index ee67ba0..206617f 100644
--- a/sw/inc/IDocumentUndoRedo.hxx
+++ b/sw/inc/IDocumentUndoRedo.hxx
@@ -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() {};
 };
diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx
index 4e07635..44d1960 100644
--- a/sw/inc/view.hxx
+++ b/sw/inc/view.hxx
@@ -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;
     }
diff --git a/sw/source/core/inc/UndoManager.hxx b/sw/source/core/inc/UndoManager.hxx
index 934edc5..087d81e 100644
--- a/sw/source/core/inc/UndoManager.hxx
+++ b/sw/source/core/inc/UndoManager.hxx
@@ -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,
diff --git a/sw/source/core/undo/docundo.cxx b/sw/source/core/undo/docundo.cxx
index ff83eb9b..654576a 100644
--- a/sw/source/core/undo/docundo.cxx
+++ b/sw/source/core/undo/docundo.cxx
@@ -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())
diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx
index e27c158..09a24d2 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -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>
@@ -4707,15 +4708,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();
                 }
@@ -4736,7 +4737,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();
@@ -4750,7 +4752,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();
@@ -4762,7 +4765,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();
@@ -4774,6 +4778,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:
@@ -4783,7 +4789,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();
                     }
@@ -4849,14 +4856,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();
@@ -4865,6 +4874,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();
@@ -5192,8 +5202,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;
             }
     }


More information about the Libreoffice-commits mailing list