summaryrefslogtreecommitdiff
path: root/sw/source/core
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2012-08-10 13:30:31 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-05-28 15:55:24 +0100
commitd7b7c9fdfe63deec26c420efc3ff1fd73c21bb27 (patch)
tree4c615cd17d1dbbf62b091a1ba45288d3680192b6 /sw/source/core
parentc726a1b12c9fdc91f32e6bed4d6dbd1edf73f9f8 (diff)
Resolves: #i120515# Implemented and finetuned the enhanced Undo feature
(see #i120498#) for sw (cherry picked from commit fb2580f1c8ae0cd1418c257823dc2d735607655f) Conflicts: sw/source/core/draw/dview.cxx sw/source/core/inc/UndoManager.hxx sw/source/core/undo/docundo.cxx Change-Id: I9970377d66f1104448a2ee7e4fb1cf82bf559cd8
Diffstat (limited to 'sw/source/core')
-rw-r--r--sw/source/core/draw/dview.cxx12
-rw-r--r--sw/source/core/inc/UndoManager.hxx6
-rw-r--r--sw/source/core/inc/dview.hxx4
-rw-r--r--sw/source/core/undo/docundo.cxx109
4 files changed, 85 insertions, 46 deletions
diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx
index 6cbd572ee37a..3d5f69d8bbad 100644
--- a/sw/source/core/draw/dview.cxx
+++ b/sw/source/core/draw/dview.cxx
@@ -22,6 +22,9 @@
#include <svx/svdpagv.hxx>
#include <svx/fmmodel.hxx>
#include <sot/exchange.hxx>
+#include <svx/sdrundomanager.hxx>
+#include <editeng/outliner.hxx>
+#include <com/sun/star/embed/EmbedMisc.hpp>
#include "swtypes.hxx"
#include "pagefrm.hxx"
@@ -53,6 +56,7 @@
// #i28701#
#include <sortedobjs.hxx>
#include <flyfrms.hxx>
+#include <UndoManager.hxx>
using namespace com::sun::star;
@@ -952,4 +956,12 @@ void SwDrawView::DeleteMarked()
pTmpRoot->EndAllAction(); //swmod 080218
}
+// support enhanced text edit for draw objects
+SdrUndoManager* SwDrawView::getSdrUndoManagerForEnhancedTextEdit() const
+{
+ SwDoc* pDoc = Imp().GetShell()->GetDoc();
+
+ return pDoc ? dynamic_cast< SdrUndoManager* >(&(pDoc->GetUndoManager())) : 0;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/inc/UndoManager.hxx b/sw/source/core/inc/UndoManager.hxx
index 14696b380477..0db18261bf60 100644
--- a/sw/source/core/inc/UndoManager.hxx
+++ b/sw/source/core/inc/UndoManager.hxx
@@ -22,7 +22,7 @@
#include <IDocumentUndoRedo.hxx>
#include <memory>
-#include <svl/undo.hxx>
+#include <svx/sdrundomanager.hxx>
class IDocumentDrawModelAccess;
class IDocumentRedlineAccess;
@@ -32,7 +32,7 @@ namespace sw {
class UndoManager
: public IDocumentUndoRedo
- , public SfxUndoManager
+ , public SdrUndoManager
{
public:
UndoManager(::std::auto_ptr<SwNodes> pUndoNodes,
@@ -102,7 +102,7 @@ private:
bool impl_DoUndoRedo(UndoOrRedo_t const undoOrRedo);
// UGLY: should not be called
- using SfxUndoManager::Repeat;
+ using SdrUndoManager::Repeat;
};
} // namespace sw
diff --git a/sw/source/core/inc/dview.hxx b/sw/source/core/inc/dview.hxx
index e722be6dc879..66aa2c3dcda6 100644
--- a/sw/source/core/inc/dview.hxx
+++ b/sw/source/core/inc/dview.hxx
@@ -26,6 +26,7 @@ class SwViewImp;
class SwFrm;
class SwFlyFrm;
class SwAnchoredObject;
+class SdrUndoManager;
class SwDrawView : public FmFormView
{
@@ -74,6 +75,9 @@ protected:
using FmFormView::CheckSingleSdrObjectHit;
virtual SdrObject* CheckSingleSdrObjectHit(const Point& rPnt, sal_uInt16 nTol, SdrObject* pObj, SdrPageView* pPV, sal_uLong nOptions, const SetOfByte* pMVisLay) const;
+ // support enhanced text edit for draw objects
+ virtual SdrUndoManager* getSdrUndoManagerForEnhancedTextEdit() const;
+
public:
SwDrawView( SwViewImp &rI, SdrModel *pMd, OutputDevice* pOutDev=NULL );
diff --git a/sw/source/core/undo/docundo.cxx b/sw/source/core/undo/docundo.cxx
index f38cd4c47528..79ad862c675f 100644
--- a/sw/source/core/undo/docundo.cxx
+++ b/sw/source/core/undo/docundo.cxx
@@ -65,7 +65,7 @@ UndoManager::UndoManager(::std::auto_ptr<SwNodes> pUndoNodes,
OSL_ASSERT(m_pUndoNodes.get());
// writer expects it to be disabled initially
// Undo is enabled by SwEditShell constructor
- SfxUndoManager::EnableUndo(false);
+ SdrUndoManager::EnableUndo(false);
}
SAL_WNODEPRECATED_DECLARATIONS_POP
@@ -86,18 +86,28 @@ bool UndoManager::IsUndoNodes(SwNodes const& rNodes) const
void UndoManager::DoUndo(bool const bDoUndo)
{
- EnableUndo(bDoUndo);
-
- SdrModel *const pSdrModel = m_rDrawModelAccess.GetDrawModel();
- if( pSdrModel )
+ if(!isTextEditActive())
{
- pSdrModel->EnableUndo(bDoUndo);
+ EnableUndo(bDoUndo);
+
+ SdrModel *const pSdrModel = m_rDrawModelAccess.GetDrawModel();
+ if( pSdrModel )
+ {
+ pSdrModel->EnableUndo(bDoUndo);
+ }
}
}
bool UndoManager::DoesUndo() const
{
- return IsUndoEnabled();
+ if(isTextEditActive())
+ {
+ return false;
+ }
+ else
+ {
+ return IsUndoEnabled();
+ }
}
void UndoManager::DoGroupUndo(bool const bDoUndo)
@@ -156,11 +166,11 @@ void UndoManager::UnLockUndoNoModifiedPosition()
SwUndo* UndoManager::GetLastUndo()
{
- if (!SfxUndoManager::GetUndoActionCount(CurrentLevel))
+ if (!SdrUndoManager::GetUndoActionCount(CurrentLevel))
{
return 0;
}
- SfxUndoAction *const pAction( SfxUndoManager::GetUndoAction(0) );
+ SfxUndoAction *const pAction( SdrUndoManager::GetUndoAction(0) );
return dynamic_cast<SwUndo*>(pAction);
}
@@ -171,14 +181,14 @@ void UndoManager::AppendUndo(SwUndo *const pUndo)
void UndoManager::ClearRedo()
{
- return SfxUndoManager::ImplClearRedo_NoLock(TopLevel);
+ return SdrUndoManager::ImplClearRedo_NoLock(TopLevel);
}
void UndoManager::DelAllUndoObj()
{
::sw::UndoGuard const undoGuard(*this);
- SfxUndoManager::ClearAllLevels();
+ SdrUndoManager::ClearAllLevels();
m_UndoSaveMark = MARK_INVALID;
}
@@ -207,7 +217,7 @@ UndoManager::StartUndo(SwUndoId const i_eUndoId,
comment = pRewriter->Apply(comment);
}
- SfxUndoManager::EnterListAction(comment, comment, eUndoId);
+ SdrUndoManager::EnterListAction(comment, comment, eUndoId);
return eUndoId;
}
@@ -227,8 +237,8 @@ UndoManager::EndUndo(SwUndoId const i_eUndoId, SwRewriter const*const pRewriter)
"EndUndo(): no Undo ID, but rewriter given?");
SfxUndoAction *const pLastUndo(
- (0 == SfxUndoManager::GetUndoActionCount(CurrentLevel))
- ? 0 : SfxUndoManager::GetUndoAction(0) );
+ (0 == SdrUndoManager::GetUndoActionCount(CurrentLevel))
+ ? 0 : SdrUndoManager::GetUndoAction(0) );
int const nCount = LeaveListAction();
@@ -236,7 +246,7 @@ UndoManager::EndUndo(SwUndoId const i_eUndoId, SwRewriter const*const pRewriter)
{
OSL_ASSERT(pLastUndo);
OSL_ASSERT(UNDO_START != eUndoId);
- SfxUndoAction *const pUndoAction(SfxUndoManager::GetUndoAction(0));
+ SfxUndoAction *const pUndoAction(SdrUndoManager::GetUndoAction(0));
SfxListUndoAction *const pListAction(
dynamic_cast<SfxListUndoAction*>(pUndoAction));
OSL_ASSERT(pListAction);
@@ -283,12 +293,13 @@ UndoManager::GetLastUndoInfo(
{
// this is actually expected to work on the current level,
// but that was really not obvious from the previous implementation...
- if (!SfxUndoManager::GetUndoActionCount(CurrentLevel))
+ if (!SdrUndoManager::GetUndoActionCount(CurrentLevel))
{
return false;
}
- SfxUndoAction *const pAction( SfxUndoManager::GetUndoAction(0) );
+ SfxUndoAction *const pAction( SdrUndoManager::GetUndoAction(0) );
+
if (o_pStr)
{
*o_pStr = pAction->GetComment();
@@ -304,15 +315,15 @@ UndoManager::GetLastUndoInfo(
SwUndoComments_t UndoManager::GetUndoComments() const
{
- OSL_ENSURE(!SfxUndoManager::IsInListAction(),
+ OSL_ENSURE(!SdrUndoManager::IsInListAction(),
"GetUndoComments() called while in list action?");
SwUndoComments_t ret;
- sal_uInt16 const nUndoCount(SfxUndoManager::GetUndoActionCount(TopLevel));
+ sal_uInt16 const nUndoCount(SdrUndoManager::GetUndoActionCount(TopLevel));
for (sal_uInt16 n = 0; n < nUndoCount; ++n)
{
OUString const comment(
- SfxUndoManager::GetUndoActionComment(n, TopLevel));
+ SdrUndoManager::GetUndoActionComment(n, TopLevel));
ret.push_back(comment);
}
@@ -323,14 +334,14 @@ SwUndoComments_t UndoManager::GetUndoComments() const
/**************** REDO ******************/
bool UndoManager::GetFirstRedoInfo(OUString *const o_pStr) const
{
- if (!SfxUndoManager::GetRedoActionCount(CurrentLevel))
+ if (!SdrUndoManager::GetRedoActionCount(CurrentLevel))
{
return false;
}
if (o_pStr)
{
- *o_pStr = SfxUndoManager::GetRedoActionComment(0, CurrentLevel);
+ *o_pStr = SdrUndoManager::GetRedoActionComment(0, CurrentLevel);
}
return true;
@@ -339,15 +350,15 @@ bool UndoManager::GetFirstRedoInfo(OUString *const o_pStr) const
SwUndoComments_t UndoManager::GetRedoComments() const
{
- OSL_ENSURE(!SfxUndoManager::IsInListAction(),
+ OSL_ENSURE(!SdrUndoManager::IsInListAction(),
"GetRedoComments() called while in list action?");
SwUndoComments_t ret;
- sal_uInt16 const nRedoCount(SfxUndoManager::GetRedoActionCount(TopLevel));
+ sal_uInt16 const nRedoCount(SdrUndoManager::GetRedoActionCount(TopLevel));
for (sal_uInt16 n = 0; n < nRedoCount; ++n)
{
OUString const comment(
- SfxUndoManager::GetRedoActionComment(n, TopLevel));
+ SdrUndoManager::GetRedoActionComment(n, TopLevel));
ret.push_back(comment);
}
@@ -373,19 +384,19 @@ SwUndoId UndoManager::GetRepeatInfo(OUString *const o_pStr) const
SwUndo * UndoManager::RemoveLastUndo()
{
- if (SfxUndoManager::GetRedoActionCount(CurrentLevel) ||
- SfxUndoManager::GetRedoActionCount(TopLevel))
+ if (SdrUndoManager::GetRedoActionCount(CurrentLevel) ||
+ SdrUndoManager::GetRedoActionCount(TopLevel))
{
OSL_ENSURE(false, "RemoveLastUndoAction(): there are Redo actions?");
return 0;
}
- if (!SfxUndoManager::GetUndoActionCount(CurrentLevel))
+ if (!SdrUndoManager::GetUndoActionCount(CurrentLevel))
{
OSL_ENSURE(false, "RemoveLastUndoAction(): no Undo actions");
return 0;
}
SfxUndoAction *const pLastUndo(GetUndoAction(0));
- SfxUndoManager::RemoveLastUndoAction();
+ SdrUndoManager::RemoveLastUndoAction();
return dynamic_cast<SwUndo *>(pLastUndo);
}
@@ -393,9 +404,9 @@ SwUndo * UndoManager::RemoveLastUndo()
void UndoManager::EnableUndo(bool bEnable)
{
- // SfxUndoManager does not have a counter anymore, but reverted to the old behavior of
+ // SdrUndoManager does not have a counter anymore, but reverted to the old behavior of
// having a simple boolean flag for locking. So, simply forward.
- SfxUndoManager::EnableUndo(bEnable);
+ SdrUndoManager::EnableUndo(bEnable);
}
void UndoManager::AddUndoAction(SfxUndoAction *pAction, sal_Bool bTryMerge)
@@ -408,7 +419,7 @@ void UndoManager::AddUndoAction(SfxUndoAction *pAction, sal_Bool bTryMerge)
pUndo->SetRedlineMode( m_rRedlineAccess.GetRedlineMode() );
}
}
- SfxUndoManager::AddUndoAction(pAction, bTryMerge);
+ SdrUndoManager::AddUndoAction(pAction, bTryMerge);
// if the undo nodes array is too large, delete some actions
while (UNDO_ACTION_LIMIT < GetUndoNodes().Count())
{
@@ -473,17 +484,17 @@ bool UndoManager::impl_DoUndoRedo(UndoOrRedo_t const undoOrRedo)
// N.B. these may throw!
if (UNDO == undoOrRedo)
{
- bRet = SfxUndoManager::UndoWithContext(context);
+ bRet = SdrUndoManager::UndoWithContext(context);
}
else
{
- bRet = SfxUndoManager::RedoWithContext(context);
+ bRet = SdrUndoManager::RedoWithContext(context);
}
if (bRet)
{
// if we are at the "last save" position, the document is not modified
- if (SfxUndoManager::HasTopUndoActionMark(m_UndoSaveMark))
+ if (SdrUndoManager::HasTopUndoActionMark(m_UndoSaveMark))
{
m_rState.ResetModified();
}
@@ -500,31 +511,43 @@ bool UndoManager::impl_DoUndoRedo(UndoOrRedo_t const undoOrRedo)
sal_Bool UndoManager::Undo()
{
- bool const bRet = impl_DoUndoRedo(UNDO);
- return bRet;
+ if(isTextEditActive())
+ {
+ return SdrUndoManager::Undo();
+ }
+ else
+ {
+ return impl_DoUndoRedo(UNDO);
+ }
}
sal_Bool UndoManager::Redo()
{
- bool const bRet = impl_DoUndoRedo(REDO);
- return bRet;
+ if(isTextEditActive())
+ {
+ return SdrUndoManager::Redo();
+ }
+ else
+ {
+ return impl_DoUndoRedo(REDO);
+ }
}
-/** N.B.: this does _not_ call SfxUndoManager::Repeat because it is not
+/** N.B.: this does _not_ call SdrUndoManager::Repeat because it is not
possible to wrap a list action around it:
- calling EnterListAction here will cause SfxUndoManager::Repeat
+ calling EnterListAction here will cause SdrUndoManager::Repeat
to repeat the list action!
*/
bool
UndoManager::Repeat(::sw::RepeatContext & rContext,
sal_uInt16 const nRepeatCount)
{
- if (SfxUndoManager::IsInListAction())
+ if (SdrUndoManager::IsInListAction())
{
OSL_ENSURE(false, "repeat in open list action???");
return false;
}
- if (!SfxUndoManager::GetUndoActionCount(TopLevel))
+ if (!SdrUndoManager::GetUndoActionCount(TopLevel))
{
return false;
}