include/svx/textchaincursor.hxx | 4 + svx/source/svdraw/svdedxv.cxx | 3 + svx/source/svdraw/textchaincursor.cxx | 85 +++++++++++++++++++++------------- 3 files changed, 61 insertions(+), 31 deletions(-)
New commits: commit 4ded1c96716ac12fabda495901f677d366265926 Author: matteocam <matteo.campane...@gmail.com> Date: Fri Jul 24 01:38:16 2015 +0200 Add specific method for detecting event Change-Id: I3030f4a5c80bcade440fb66d578430abb15dfc44 diff --git a/include/svx/textchaincursor.hxx b/include/svx/textchaincursor.hxx index ce5200f..b56dd72 100644 --- a/include/svx/textchaincursor.hxx +++ b/include/svx/textchaincursor.hxx @@ -23,6 +23,7 @@ class SdrObjEditView; class SdrTextObj; class KeyEvent; +class SdrOutliner; class TextChainCursorManager @@ -39,6 +40,9 @@ private: const SdrTextObj *mpTextObj; void impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel) const; + void impDetectEvent(const KeyEvent& rKEvt, + CursorChainingEvent *pOutCursorEvt, + ESelection *pOutSel) const; }; diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index 15e2228..c9428dc 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -1266,6 +1266,9 @@ bool SdrObjEditView::ImpHandleMotionThroughBoxesKeyInput(const KeyEvent& rKEvt, else return false; + if (!pTextObj->IsChainable()) + return false; + TextChainCursorManager aCursorManager(this, pTextObj); if( aCursorManager.HandleKeyEvent(rKEvt) ) { // Possibly do other stuff here if necessary... diff --git a/svx/source/svdraw/textchaincursor.cxx b/svx/source/svdraw/textchaincursor.cxx index a0def07..7ca44f7 100644 --- a/svx/source/svdraw/textchaincursor.cxx +++ b/svx/source/svdraw/textchaincursor.cxx @@ -30,49 +30,73 @@ TextChainCursorManager::TextChainCursorManager(SdrObjEditView *pEditView, const mpEditView(pEditView), mpTextObj(pTextObj) { + assert(mpEditView); + assert(mpTextObj); } bool TextChainCursorManager::HandleKeyEvent( const KeyEvent& rKEvt ) const { - bool bHandled = false; + ESelection aNewSel; + CursorChainingEvent aCursorEvent; + + // check what the cursor/event situation looks like + impDetectEvent(rKEvt, &aCursorEvent, &aNewSel); + + if (aCursorEvent == CursorChainingEvent::NULL_EVENT) + return false; + else { + HandleCursorEvent(aCursorEvent, aNewSel); + return true; + } +} + +void TextChainCursorManager::impDetectEvent(const KeyEvent& rKEvt, + CursorChainingEvent *pOutCursorEvt, + ESelection *pOutSel) const +{ + SdrOutliner *pOutl = mpEditView->GetTextEditOutliner(); + OutlinerView *pOLV = mpEditView->GetTextEditOutlinerView(); - // XXX: Find a clean way to do this (even cleaner than the code commented below) - // if( pTextEditOutlinerView->IsKeyEventPushingOutOfPage(rKevt, pWin) - // pWin = HandleKeyPushingOutOfBox(rKevt); KeyFuncType eFunc = rKEvt.GetKeyCode().GetFunction(); - sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); - ESelection aCurSel = mpEditView->GetTextEditOutlinerView()->GetSelection(); - if (mpTextObj && mpTextObj->IsChainable() && mpTextObj->GetNextLinkInChain() && - eFunc == KeyFuncType::DONTKNOW) + // We need to have this KeyFuncType + if (eFunc != KeyFuncType::DONTKNOW) { - SdrOutliner *pOutl = mpEditView->GetTextEditOutliner(); - sal_Int32 nLastPara = pOutl->GetParagraphCount()-1; - OUString aLastParaText = pOutl->GetText(pOutl->GetParagraph(nLastPara)); - sal_Int32 nLastParaLen = aLastParaText.getLength(); - - if (nCode == KEY_RIGHT && - aCurSel.nEndPara == nLastPara && - aCurSel.nEndPos == nLastParaLen - ) - { - fprintf(stderr, "[CHAIN - CURSOR] Trying to move to next box\n" ); - - // Move to next box - mpEditView->SdrEndTextEdit(); - SdrTextObj *pNextLink = mpTextObj->GetNextLinkInChain(); - mpEditView->SdrBeginTextEdit(pNextLink); - bHandled = true; - } + *pOutCursorEvt = CursorChainingEvent::NULL_EVENT; + return; + } + sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode(); + ESelection aCurSel = pOLV->GetSelection(); + + sal_Int32 nLastPara = pOutl->GetParagraphCount()-1; + OUString aLastParaText = pOutl->GetText(pOutl->GetParagraph(nLastPara)); + sal_Int32 nLastParaLen = aLastParaText.getLength(); + + bool bAtEndOfTextContent = + (aCurSel.nEndPara == nLastPara) && + (aCurSel.nEndPos == nLastParaLen); + + if (nCode == KEY_RIGHT && bAtEndOfTextContent) + { + *pOutCursorEvt = CursorChainingEvent::TO_NEXT_LINK; + // Selection unchanged: we are at the beginning of the box } - return bHandled; + + // if (nCode == KEY_LEFT && bAtStartOfTextContent) ... + + // If arrived here there is no event detected + *pOutCursorEvt = CursorChainingEvent::NULL_EVENT; + } -void TextChainCursorManager::HandleCursorEvent(const CursorChainingEvent aCurEvt, - const ESelection aNewSel) const +void TextChainCursorManager::HandleCursorEvent( + const CursorChainingEvent aCurEvt, + const ESelection aNewSel) + const { + OutlinerView* pOLV = mpEditView->GetTextEditOutlinerView(); SdrTextObj *pNextLink = mpTextObj->GetNextLinkInChain(); SdrTextObj *pPrevLink = mpTextObj->GetPrevLinkInChain(); @@ -99,8 +123,7 @@ void TextChainCursorManager::HandleCursorEvent(const CursorChainingEvent aCurEvt void TextChainCursorManager::impChangeEditingTextObj(SdrTextObj *pTargetTextObj, ESelection aNewSel) const { - if (!pTargetTextObj) - return; + assert(pTargetTextObj); mpEditView->SdrEndTextEdit(); mpEditView->SdrBeginTextEdit(pTargetTextObj); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits