diff options
author | Armin Le Grand <alg@apache.org> | 2012-08-10 13:30:31 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-05-28 15:55:24 +0100 |
commit | d7b7c9fdfe63deec26c420efc3ff1fd73c21bb27 (patch) | |
tree | 4c615cd17d1dbbf62b091a1ba45288d3680192b6 /sw | |
parent | c726a1b12c9fdc91f32e6bed4d6dbd1edf73f9f8 (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')
-rw-r--r-- | sw/source/core/draw/dview.cxx | 12 | ||||
-rw-r--r-- | sw/source/core/inc/UndoManager.hxx | 6 | ||||
-rw-r--r-- | sw/source/core/inc/dview.hxx | 4 | ||||
-rw-r--r-- | sw/source/core/undo/docundo.cxx | 109 |
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; } |