diff options
author | Armin Le Grand <alg@apache.org> | 2012-08-10 13:30:31 +0000 |
---|---|---|
committer | Armin Le Grand <alg@apache.org> | 2012-08-10 13:30:31 +0000 |
commit | fb2580f1c8ae0cd1418c257823dc2d735607655f (patch) | |
tree | 4a178e6482131c1fd25d665dbe2b3542969d9ab4 /sw/source/core | |
parent | 472c175d1bb809db1dc997d9712d6ecb3fbe731c (diff) |
#120515# Implemented and finetuned the enhanced Undo feature (see #120498#) for sw
Notes
merged as: d7b7c9fdfe63deec26c420efc3ff1fd73c21bb27
Diffstat (limited to 'sw/source/core')
-rw-r--r-- | sw/source/core/draw/dview.cxx | 29 | ||||
-rw-r--r-- | sw/source/core/inc/UndoManager.hxx | 10 | ||||
-rw-r--r-- | sw/source/core/inc/dview.hxx | 4 | ||||
-rw-r--r-- | sw/source/core/undo/docundo.cxx | 108 |
4 files changed, 85 insertions, 66 deletions
diff --git a/sw/source/core/draw/dview.cxx b/sw/source/core/draw/dview.cxx index ba3da27ee87b..96e1d7ea4755 100644 --- a/sw/source/core/draw/dview.cxx +++ b/sw/source/core/draw/dview.cxx @@ -19,8 +19,6 @@ * *************************************************************/ - - // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" @@ -29,6 +27,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" @@ -49,26 +50,13 @@ #include <fmtanchr.hxx> #include "shellres.hxx" #include <IDocumentUndoRedo.hxx> - -// #i7672# -#include <editeng/outliner.hxx> - -#include <com/sun/star/embed/EmbedMisc.hpp> - -// OD 18.06.2003 #108784# -//#ifndef _SVDVMARK_HXX //autogen -//#include <svx/svdvmark.hxx> -//#endif #include <vector> -// --> OD 2004-06-24 #i28701# #include <sortedobjs.hxx> #include <flyfrms.hxx> -// <-- - +#include <UndoManager.hxx> using namespace com::sun::star; - class SwSdrHdl : public SdrHdl { public: @@ -1109,3 +1097,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; +} + +// eof diff --git a/sw/source/core/inc/UndoManager.hxx b/sw/source/core/inc/UndoManager.hxx index 82f94531d7e6..7f76cf867e6a 100644 --- a/sw/source/core/inc/UndoManager.hxx +++ b/sw/source/core/inc/UndoManager.hxx @@ -25,22 +25,18 @@ #define SW_UNDO_MANAGER_HXX #include <IDocumentUndoRedo.hxx> - #include <memory> - -#include <svl/undo.hxx> - +#include <svx/sdrundomanager.hxx> class IDocumentDrawModelAccess; class IDocumentRedlineAccess; class IDocumentState; - namespace sw { class UndoManager : public IDocumentUndoRedo - , public SfxUndoManager + , public SdrUndoManager { public: @@ -111,7 +107,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 b08aff31d3be..1a2017ce3482 100644 --- a/sw/source/core/inc/dview.hxx +++ b/sw/source/core/inc/dview.hxx @@ -31,6 +31,7 @@ class SwViewImp; class SwFrm; class SwFlyFrm; class SwAnchoredObject; +class SdrUndoManager; class SwDrawView : public FmFormView { @@ -87,6 +88,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 54f7e9478dd9..f2731fb3b3d9 100644 --- a/sw/source/core/undo/docundo.cxx +++ b/sw/source/core/undo/docundo.cxx @@ -74,7 +74,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); } SwNodes const& UndoManager::GetUndoNodes() const @@ -94,18 +94,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) @@ -164,11 +174,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); } @@ -179,14 +189,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; } @@ -215,7 +225,7 @@ UndoManager::StartUndo(SwUndoId const i_eUndoId, comment = pRewriter->Apply(comment); } - SfxUndoManager::EnterListAction(comment, comment, eUndoId); + SdrUndoManager::EnterListAction(comment, comment, eUndoId); return eUndoId; } @@ -235,8 +245,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(); @@ -244,7 +254,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); @@ -291,12 +301,12 @@ 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) { @@ -313,15 +323,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) { ::rtl::OUString const comment( - SfxUndoManager::GetUndoActionComment(n, TopLevel)); + SdrUndoManager::GetUndoActionComment(n, TopLevel)); ret.push_back(comment); } @@ -333,14 +343,14 @@ SwUndoComments_t UndoManager::GetUndoComments() const bool UndoManager::GetFirstRedoInfo(::rtl::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; @@ -349,15 +359,15 @@ bool UndoManager::GetFirstRedoInfo(::rtl::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) { ::rtl::OUString const comment( - SfxUndoManager::GetRedoActionComment(n, TopLevel)); + SdrUndoManager::GetRedoActionComment(n, TopLevel)); ret.push_back(comment); } @@ -383,19 +393,19 @@ SwUndoId UndoManager::GetRepeatInfo(::rtl::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); } @@ -403,9 +413,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) @@ -418,7 +428,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()) { @@ -483,17 +493,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(); } @@ -510,31 +520,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; } |