You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2012/08/10 16:19:02 UTC

svn commit: r1371711 - in /incubator/ooo/trunk/main/svx: inc/svx/sdrundomanager.hxx inc/svx/svdedxv.hxx source/svdraw/sdrundomanager.cxx source/svdraw/svdedxv.cxx

Author: alg
Date: Fri Aug 10 14:19:02 2012
New Revision: 1371711

URL: http://svn.apache.org/viewvc?rev=1371711&view=rev
Log:
#120498# fixed error with half text edit undone, extended as preparation for #120515#

Modified:
    incubator/ooo/trunk/main/svx/inc/svx/sdrundomanager.hxx
    incubator/ooo/trunk/main/svx/inc/svx/svdedxv.hxx
    incubator/ooo/trunk/main/svx/source/svdraw/sdrundomanager.cxx
    incubator/ooo/trunk/main/svx/source/svdraw/svdedxv.cxx

Modified: incubator/ooo/trunk/main/svx/inc/svx/sdrundomanager.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/inc/svx/sdrundomanager.hxx?rev=1371711&r1=1371710&r2=1371711&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/inc/svx/sdrundomanager.hxx (original)
+++ incubator/ooo/trunk/main/svx/inc/svx/sdrundomanager.hxx Fri Aug 10 14:19:02 2012
@@ -37,6 +37,11 @@ private:
 
     Link            maEndTextEditHdl;
     SfxUndoAction*  mpLastUndoActionBeforeTextEdit;
+    bool            mbEndTextEditTriggeredFromUndo;
+
+protected:
+    // call to check for TextEdit active
+    bool isTextEditActive() const;
 
 public:
 	SdrUndoManager(sal_uInt16 nMaxUndoActionCount = 20);
@@ -51,6 +56,11 @@ public:
     // reset all text edit actions will be removed from this undo manager to
     // restore the state before activation
     void SetEndTextEditHdl(const Link& rLink);
+
+    // check from outside if we are inside a callback for ending text edit. This
+    // is needed to detect inside end text edit if it is a regular one or triggered
+    // by a last undo during text edit
+    bool isEndTextEditTriggeredFromUndo() { return mbEndTextEditTriggeredFromUndo; }
 };
 
 //////////////////////////////////////////////////////////////////////////////

Modified: incubator/ooo/trunk/main/svx/inc/svx/svdedxv.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/inc/svx/svdedxv.hxx?rev=1371711&r1=1371710&r2=1371711&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/inc/svx/svdedxv.hxx (original)
+++ incubator/ooo/trunk/main/svx/inc/svx/svdedxv.hxx Fri Aug 10 14:19:02 2012
@@ -120,6 +120,12 @@ private:
 	SVX_DLLPRIVATE void ImpClearVars();
 
 protected:
+    // central method to get an SdrUndoManager for enhanced TextEdit. Default will
+    // try to return a dynamic_casted GetModel()->GetSdrUndoManager(). Applications
+    // which want to use this feature will need to overload this virtual method,
+    // provide their document UndoManager and derive it from SdrUndoManager.
+    virtual SdrUndoManager* getSdrUndoManagerForEnhancedTextEdit() const;
+
 	OutlinerView* ImpFindOutlinerView(Window* pWin) const;
 
 	// Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.

Modified: incubator/ooo/trunk/main/svx/source/svdraw/sdrundomanager.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/svdraw/sdrundomanager.cxx?rev=1371711&r1=1371710&r2=1371711&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/svdraw/sdrundomanager.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/svdraw/sdrundomanager.cxx Fri Aug 10 14:19:02 2012
@@ -28,7 +28,8 @@
 SdrUndoManager::SdrUndoManager(sal_uInt16 nMaxUndoActionCount)
 :   EditUndoManager(nMaxUndoActionCount),
     maEndTextEditHdl(),
-    mpLastUndoActionBeforeTextEdit(0)
+    mpLastUndoActionBeforeTextEdit(0),
+    mbEndTextEditTriggeredFromUndo(false)
 {
 }
     
@@ -38,10 +39,10 @@ SdrUndoManager::~SdrUndoManager()
 
 sal_Bool SdrUndoManager::Undo()
 {
-    sal_Bool bRetval(sal_False);
-
-    if(maEndTextEditHdl.IsSet())
+    if(isTextEditActive())
     {
+        sal_Bool bRetval(sal_False);
+
         // we are in text edit mode
         if(GetUndoActionCount() && mpLastUndoActionBeforeTextEdit != GetUndoAction(0))
         {
@@ -51,24 +52,25 @@ sal_Bool SdrUndoManager::Undo()
         else
         {
             // no more text edit undo, end text edit
+            mbEndTextEditTriggeredFromUndo = true;
             maEndTextEditHdl.Call(this);
+            mbEndTextEditTriggeredFromUndo = false;
         }
-    }
 
-    if(!bRetval && GetUndoActionCount())
+        return bRetval;
+    }
+    else
     {
         // no undo triggered up to now, trigger local one
-        bRetval = SfxUndoManager::Undo();
+        return SfxUndoManager::Undo();
     }
-
-    return bRetval;
 }
 
 sal_Bool SdrUndoManager::Redo()
 {
     sal_Bool bRetval(sal_False);
 
-    if(maEndTextEditHdl.IsSet())
+    if(isTextEditActive())
     {
         // we are in text edit mode
         bRetval = EditUndoManager::Redo();
@@ -87,7 +89,7 @@ void SdrUndoManager::SetEndTextEditHdl(c
 {
     maEndTextEditHdl = rLink; 
 
-    if(maEndTextEditHdl.IsSet())
+    if(isTextEditActive())
     {
         // text edit start, remember last non-textedit action for later cleanup
         mpLastUndoActionBeforeTextEdit = GetUndoActionCount() ? GetUndoAction(0) : 0;
@@ -110,5 +112,10 @@ void SdrUndoManager::SetEndTextEditHdl(c
     }
 }
 
+bool SdrUndoManager::isTextEditActive() const
+{
+    return maEndTextEditHdl.IsSet();
+}
+
 //////////////////////////////////////////////////////////////////////////////
 // eof

Modified: incubator/ooo/trunk/main/svx/source/svdraw/svdedxv.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/svx/source/svdraw/svdedxv.cxx?rev=1371711&r1=1371710&r2=1371711&view=diff
==============================================================================
--- incubator/ooo/trunk/main/svx/source/svdraw/svdedxv.cxx (original)
+++ incubator/ooo/trunk/main/svx/source/svdraw/svdedxv.cxx Fri Aug 10 14:19:02 2012
@@ -550,6 +550,12 @@ IMPL_LINK(SdrObjEditView, EndTextEditHdl
     return 0;
 }
 
+SdrUndoManager* SdrObjEditView::getSdrUndoManagerForEnhancedTextEdit() const
+{
+    // default returns registered UndoManager
+    return GetModel() ? dynamic_cast< SdrUndoManager* >(GetModel()->GetSdrUndoManager()) : 0;
+}
+
 sal_Bool SdrObjEditView::SdrBeginTextEdit(
 	SdrObject* pObj, SdrPageView* pPV, Window* pWin, 
 	sal_Bool bIsNewObj,	SdrOutliner* pGivenOutliner, 
@@ -780,7 +786,7 @@ sal_Bool SdrObjEditView::SdrBeginTextEdi
 
             if(IsUndoEnabled())
             {
-                SdrUndoManager* pSdrUndoManager = dynamic_cast< SdrUndoManager* >(GetModel()->GetSdrUndoManager());
+                SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
             
                 if(pSdrUndoManager)
                 {
@@ -789,7 +795,8 @@ sal_Bool SdrObjEditView::SdrBeginTextEdi
                     // it that text edit starts by setting a callback if it needs to end text edit mode.
                     if(mpOldTextEditUndoManager)
                     {
-                        // should not happen, delete it
+                        // should not happen, delete it since it was probably forgotten somewhere
+                        OSL_ENSURE(false, "Deleting forgotten old TextEditUndoManager, should be checked (!)");
                         delete mpOldTextEditUndoManager;
                         mpOldTextEditUndoManager = 0;
                     }
@@ -860,7 +867,8 @@ SdrEndTextEditKind SdrObjEditView::SdrEn
     SdrOutliner*  pTEOutliner    =pTextEditOutliner;
     OutlinerView* pTEOutlinerView=pTextEditOutlinerView;
     Cursor*       pTECursorMerker=pTextEditCursorMerker;
-    SdrUndoManager* pExtraUndoEditUndoManager = 0;
+    SdrUndoManager* pUndoEditUndoManager = 0;
+    bool bNeedToUndoSavedRedoTextEdit(false);
 
     if(IsUndoEnabled() && GetModel() && pTEObj && pTEOutliner)
     {
@@ -871,18 +879,26 @@ SdrEndTextEditKind SdrObjEditView::SdrEn
         if(pOriginal)
         {
             // check if we got back our document undo manager
-            SdrUndoManager* pSdrUndoManager = dynamic_cast< SdrUndoManager* >(GetModel()->GetSdrUndoManager());
+            SdrUndoManager* pSdrUndoManager = getSdrUndoManagerForEnhancedTextEdit();
 
             if(pSdrUndoManager && dynamic_cast< SdrUndoManager* >(pOriginal) == pSdrUndoManager)
             {
-                // We are ending text edit; execute all redos to create a complete text change
-                // undo action for the redo buffer. Also mark this state when at least one redo was 
-                // executed; the created TextChange needs to be undone plus the first real undo
-                // outside the text edit changes
-                while(pSdrUndoManager->GetRedoActionCount())
+                if(pSdrUndoManager->isEndTextEditTriggeredFromUndo())
                 {
-                    pExtraUndoEditUndoManager = pSdrUndoManager;
-                    pSdrUndoManager->Redo();
+                    // remember the UndoManager where missing Undos have to be triggered after end
+                    // text edit. When the undo had triggered the end text edit, the original action
+                    // which had to be undone originally is not yet undone.
+                    pUndoEditUndoManager = pSdrUndoManager;
+
+                    // We are ending text edit; if text edit was triggered from undo, execute all redos 
+                    // to create a complete text change undo action for the redo buffer. Also mark this 
+                    // state when at least one redo was executed; the created extra TextChange needs to 
+                    // be undone in addition to the first real undo outside the text edit changes
+                    while(pSdrUndoManager->GetRedoActionCount())
+                    {
+                        bNeedToUndoSavedRedoTextEdit = true;
+                        pSdrUndoManager->Redo();
+                    }
                 }
 
                 // reset the callback link and let the undo manager cleanup all text edit
@@ -1105,12 +1121,19 @@ SdrEndTextEditKind SdrObjEditView::SdrEn
 		((SfxBroadcaster*)pTEObj->GetBroadcaster())->Broadcast(aHint);
 	}
 
-    if(pExtraUndoEditUndoManager)
+    if(pUndoEditUndoManager)
     {
-        // undo the text edit action since it was created as part of a EndTextEdit
-        // callback from undo itself. This needs to be done after the call to
-        // FmFormView::SdrEndTextEdit since it gets created there
-        pExtraUndoEditUndoManager->Undo();
+        if(bNeedToUndoSavedRedoTextEdit)
+        {
+            // undo the text edit action since it was created as part of an EndTextEdit
+            // callback from undo itself. This needs to be done after the call to
+            // FmFormView::SdrEndTextEdit since it gets created there
+            pUndoEditUndoManager->Undo();
+        }
+        
+        // trigger the Undo which was not executed, but lead to this
+        // end text edit
+        pUndoEditUndoManager->Undo();
     }
 
     return eRet;