include/svx/svdedxv.hxx | 5 ++- include/svx/textchaincursor.hxx | 17 ++++++++--- sd/source/ui/view/drviewse.cxx | 3 +- svx/source/svdraw/svdedxv.cxx | 36 ++++++++++++++---------- svx/source/svdraw/textchaincursor.cxx | 50 +++++++++++++++++++++++++++++----- 5 files changed, 84 insertions(+), 27 deletions(-)
New commits: commit 8c4db4fe0f5bd10c06fb2a35b2e5cdaedad34bc3 Author: matteocam <matteo.campane...@gmail.com> Date: Fri Jul 24 16:29:47 2015 +0200 Handle DEL calling Sdr*View::KeyInput instead of OutlinerView::PostKeyEvent Change-Id: I7f4483e5165d30786288462fe5397ee93e477673 diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx index 516f487..a8bb8c1 100644 --- a/sd/source/ui/view/drviewse.cxx +++ b/sd/source/ui/view/drviewse.cxx @@ -939,7 +939,8 @@ void DrawViewShell::FuSupport(SfxRequest& rReq) { vcl::KeyCode aKCode(KEY_DELETE); KeyEvent aKEvt( 0, aKCode); - pOLV->PostKeyEvent(aKEvt); + //pOLV->PostKeyEvent(aKEvt); + mpDrawView->KeyInput(aKEvt, NULL); } } else commit ebe372b42c1e9667a60fb06e798e01dc11e2155b Author: matteocam <matteo.campane...@gmail.com> Date: Fri Jul 24 12:04:31 2015 +0200 Handle Delete Change-Id: I17a1886689785420fb881bea8f1d609ab3f35c4e diff --git a/include/svx/svdedxv.hxx b/include/svx/svdedxv.hxx index d45a12f..c7e9c99 100644 --- a/include/svx/svdedxv.hxx +++ b/include/svx/svdedxv.hxx @@ -34,6 +34,7 @@ class EditFieldInfo; class ImpSdrEditPara; struct PasteOrDropInfos; class SdrUndoManager; +class TextChainCursorManager; enum class CursorChainingEvent; class ESelection; @@ -110,8 +111,8 @@ protected: OutlinerView* ImpFindOutlinerView(vcl::Window* pWin) const; - void ImpMoveCursorAfterChainingEvent(); - bool ImpHandleMotionThroughBoxesKeyInput(const KeyEvent& rKEvt, vcl::Window* pWin); + void ImpMoveCursorAfterChainingEvent(TextChainCursorManager *pCursorManager); + TextChainCursorManager *ImpHandleMotionThroughBoxesKeyInput(const KeyEvent& rKEvt, vcl::Window* pWin, bool *bOutHandled); // Create a new OutlinerView at the heap and initialize all required parameters. // pTextEditObj, pTextEditPV and pTextEditOutliner have to be initialized diff --git a/include/svx/textchaincursor.hxx b/include/svx/textchaincursor.hxx index 1d9c4de..7668773 100644 --- a/include/svx/textchaincursor.hxx +++ b/include/svx/textchaincursor.hxx @@ -31,19 +31,28 @@ class TextChainCursorManager public: TextChainCursorManager(SdrObjEditView *pEditView, const SdrTextObj *pTextObj); - bool HandleKeyEvent( const KeyEvent& rKEvt ) const; + bool HandleKeyEvent( const KeyEvent& rKEvt ); + + // Used by HandledKeyEvent and basic building block for handling cursor event void HandleCursorEvent(const CursorChainingEvent aCurEvt, - const ESelection aNewSel) const; + const ESelection aNewSel); + + // To be used after chaining event to deal with some nuisances + void HandleCursorEventAfterChaining(const CursorChainingEvent aCurEvt, + const ESelection aNewSel); private: SdrObjEditView *mpEditView; const SdrTextObj *mpTextObj; - void impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel) const; + // flag for handling of CANC which is kind of an exceptional case + bool mbHandlingDel; + + void impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel); void impDetectEvent(const KeyEvent& rKEvt, CursorChainingEvent *pOutCursorEvt, ESelection *pOutSel, - bool *bOutHandled) const; + bool *bOutHandled); }; diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index ad35d29..cfc5d33 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -526,9 +526,9 @@ IMPL_LINK_NOARG(SdrObjEditView,ImpChainingEventHdl) } -void SdrObjEditView::ImpMoveCursorAfterChainingEvent() +void SdrObjEditView::ImpMoveCursorAfterChainingEvent(TextChainCursorManager *pCursorManager) { - if (!mxTextEditObj.is()) + if (!mxTextEditObj.is() || !pCursorManager) return; SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(mxTextEditObj.get()); @@ -539,8 +539,8 @@ void SdrObjEditView::ImpMoveCursorAfterChainingEvent() TextChain *pTextChain = pTextObj->GetTextChain(); ESelection aNewSel = pTextChain->GetPostChainingSel(pTextObj); - TextChainCursorManager aCursorManager(this, pTextObj); - aCursorManager.HandleCursorEvent( + + pCursorManager->HandleCursorEventAfterChaining( pTextChain->GetCursorEvent(pTextObj), aNewSel); @@ -1258,25 +1258,30 @@ bool SdrObjEditView::IsTextEditFrameHit(const Point& rHit) const return bOk; } -bool SdrObjEditView::ImpHandleMotionThroughBoxesKeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) +TextChainCursorManager *SdrObjEditView::ImpHandleMotionThroughBoxesKeyInput( + const KeyEvent& rKEvt, + vcl::Window* pWin, + bool *bOutHandled) { + *bOutHandled = false; + SdrTextObj* pTextObj = NULL; if (mxTextEditObj.is()) pTextObj= dynamic_cast<SdrTextObj*>(mxTextEditObj.get()); else - return false; + return NULL; if (!pTextObj->IsChainable()) - return false; + return NULL; - TextChainCursorManager aCursorManager(this, pTextObj); - if( aCursorManager.HandleKeyEvent(rKEvt) ) { + TextChainCursorManager *pCursorManager = new TextChainCursorManager(this, pTextObj); + if( pCursorManager->HandleKeyEvent(rKEvt) ) { // Possibly do other stuff here if necessary... // XXX: Careful with the checks below (in KeyInput) for pWin and co. You should do them here I guess. - return true; - } else { - return false; + *bOutHandled = true; } + + return pCursorManager; } bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) @@ -1284,7 +1289,10 @@ bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) if(pTextEditOutlinerView) { // We possibly move to another box before any handling - if (ImpHandleMotionThroughBoxesKeyInput(rKEvt, pWin)) + bool bHandled = false; + TextChainCursorManager *pCursorManager = + ImpHandleMotionThroughBoxesKeyInput(rKEvt, pWin, &bHandled); + if (bHandled) return true; // FIXME(matteocam): Old code from here @@ -1299,7 +1307,7 @@ bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) // FIXME(matteocam) // Start chaining processing ImpChainingEventHdl(NULL); - ImpMoveCursorAfterChainingEvent(); + ImpMoveCursorAfterChainingEvent(pCursorManager); // End chaining processing if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin); diff --git a/svx/source/svdraw/textchaincursor.cxx b/svx/source/svdraw/textchaincursor.cxx index af2af7c..35a339e 100644 --- a/svx/source/svdraw/textchaincursor.cxx +++ b/svx/source/svdraw/textchaincursor.cxx @@ -28,14 +28,15 @@ TextChainCursorManager::TextChainCursorManager(SdrObjEditView *pEditView, const SdrTextObj *pTextObj) : mpEditView(pEditView), - mpTextObj(pTextObj) + mpTextObj(pTextObj), + mbHandlingDel(false) { assert(mpEditView); assert(mpTextObj); } -bool TextChainCursorManager::HandleKeyEvent( const KeyEvent& rKEvt ) const +bool TextChainCursorManager::HandleKeyEvent( const KeyEvent& rKEvt ) { ESelection aNewSel; CursorChainingEvent aCursorEvent; @@ -56,7 +57,7 @@ bool TextChainCursorManager::HandleKeyEvent( const KeyEvent& rKEvt ) const void TextChainCursorManager::impDetectEvent(const KeyEvent& rKEvt, CursorChainingEvent *pOutCursorEvt, ESelection *pOutSel, - bool *bOutHandled) const + bool *bOutHandled) { SdrOutliner *pOutl = mpEditView->GetTextEditOutliner(); OutlinerView *pOLV = mpEditView->GetTextEditOutlinerView(); @@ -92,6 +93,16 @@ void TextChainCursorManager::impDetectEvent(const KeyEvent& rKEvt, return; } + // Possibility: Are we "pushing" at the end of the object? + if (nCode == KEY_DELETE && bAtEndOfTextContent && pNextLink) + { + *pOutCursorEvt = CursorChainingEvent::TO_NEXT_LINK; + // Selection unchanged: we are at the beginning of the box + *bOutHandled = false; // We still need to delete the characters + mbHandlingDel = true; + return; + } + ESelection aStartSel = ESelection(0, 0); bool bAtStartOfTextContent = aCurSel.IsEqual(aStartSel); @@ -118,16 +129,40 @@ void TextChainCursorManager::impDetectEvent(const KeyEvent& rKEvt, } +void TextChainCursorManager::HandleCursorEventAfterChaining( + const CursorChainingEvent aCurEvt, + const ESelection aNewSel) + +{ + // Special case for DELETE handling: we need to get back at the end of the prev box + if (mbHandlingDel) { + // reset flag + mbHandlingDel = false; + + // Move to end of prev box + SdrTextObj *pPrevLink = mpTextObj->GetPrevLinkInChain(); + ESelection aEndSel(100000, 100000); + impChangeEditingTextObj(pPrevLink, aEndSel); + return; + } + + // Standard handling + HandleCursorEvent(aCurEvt, aNewSel); +} + + void TextChainCursorManager::HandleCursorEvent( const CursorChainingEvent aCurEvt, const ESelection aNewSel) - const + { OutlinerView* pOLV = mpEditView->GetTextEditOutlinerView(); SdrTextObj *pNextLink = mpTextObj->GetNextLinkInChain(); SdrTextObj *pPrevLink = mpTextObj->GetPrevLinkInChain(); + + switch ( aCurEvt ) { case CursorChainingEvent::UNCHANGED: // Set same selection as before the chaining (which is saved as PostChainingSel) @@ -148,7 +183,7 @@ void TextChainCursorManager::HandleCursorEvent( } -void TextChainCursorManager::impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel) const +void TextChainCursorManager::impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel) { assert(pTargetTextObj); @@ -156,7 +191,10 @@ void TextChainCursorManager::impChangeEditingTextObj(SdrTextObj *pTargetTextObj, mpEditView->SdrBeginTextEdit(pTargetTextObj); // OutlinerView has changed, so we update the pointer OutlinerView *pOLV = mpEditView->GetTextEditOutlinerView(); - pOLV->SetSelection(aNewSel); // XXX + pOLV->SetSelection(aNewSel); + + // Update reference text obj + mpTextObj = pTargetTextObj; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits