editeng/source/outliner/outlvw.cxx | 11 ++ include/svx/svdedxv.hxx | 10 ++ sd/source/ui/view/drviewse.cxx | 5 + sd/source/ui/view/outlview.cxx | 1 sd/source/ui/view/sdview.cxx | 1 svx/source/svdraw/svdedxv.cxx | 145 +++++++++++++++++++++++++++++++++++++ 6 files changed, 171 insertions(+), 2 deletions(-)
New commits: commit 54b576c3b3bf3d67c5ffd4ae391f6c03e3647dc1 Author: matteocam <matteo.campane...@gmail.com> Date: Mon Sep 7 20:01:35 2015 +0200 Handle chaining for cutting and pasting Change-Id: Iec08e339a7f06c5fa56e67b42206b31c766f845b diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx index 4a0d96e..edf617f 100644 --- a/editeng/source/outliner/outlvw.cxx +++ b/editeng/source/outliner/outlvw.cxx @@ -675,8 +675,12 @@ void OutlinerView::InsertText( const OutlinerParaObject& rParaObj ) void OutlinerView::Cut() { - if ( !ImpCalcSelectedPages( false ) || pOwner->ImpCanDeleteSelectedPages( this ) ) + if ( !ImpCalcSelectedPages( false ) || pOwner->ImpCanDeleteSelectedPages( this ) ) { pEditView->Cut(); + // Chaining handling + if (aEndCutPasteLink.IsSet()) + aEndCutPasteLink.Call(NULL); + } } void OutlinerView::Paste() @@ -705,6 +709,11 @@ void OutlinerView::PasteSpecial() pEditView->SetEditEngineUpdateMode( true ); pOwner->UndoActionEnd( OLUNDO_INSERT ); pEditView->ShowCursor( true ); + + // Chaining handling + // NOTE: We need to do this last because it pEditView may be deleted if a switch of box occurs + if (aEndCutPasteLink.IsSet()) + aEndCutPasteLink.Call(NULL); } } commit 731000696b282f457a7e003297d4f158849825d4 Author: matteocam <matteo.campane...@gmail.com> Date: Mon Sep 7 19:58:16 2015 +0200 Handle DEL key for chaining Change-Id: I124b1adf6df3c42a58d45eaeb0e1e053c0eea4c9 diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx index da65984..d9e0a99 100644 --- a/sd/source/ui/view/drviewse.cxx +++ b/sd/source/ui/view/drviewse.cxx @@ -950,7 +950,10 @@ void DrawViewShell::FuSupport(SfxRequest& rReq) { vcl::KeyCode aKCode(KEY_DELETE); KeyEvent aKEvt( 0, aKCode); - pOLV->PostKeyEvent(aKEvt); + //pOLV->PostKeyEvent(aKEvt); + // We use SdrObjEditView to handle DEL for underflow handling + mpDrawView->KeyInput(aKEvt, NULL); + } } else commit 1a86da45320faf5f644c1a82c07bd9b522a2a351 Author: matteocam <matteo.campane...@gmail.com> Date: Mon Sep 7 16:37:56 2015 +0200 Enable chaining after a key is pressed Change-Id: I64351619dd0886f3bb0c080557864c46a17d737d diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index 86a69e4..c263a62 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -1326,6 +1326,15 @@ bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) if(pTextEditOutlinerView) { + /* Start special handling of keys within a chain */ + // We possibly move to another box before any handling + bool bHandled = false; + TextChainCursorManager *pCursorManager = + ImpHandleMotionThroughBoxesKeyInput(rKEvt, pWin, &bHandled); + if (bHandled) + return true; + /* End special handling of keys within a chain */ + if (pTextEditOutlinerView->PostKeyEvent(rKEvt, pWin)) { if( mpModel ) @@ -1334,6 +1343,11 @@ bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) mpModel->SetChanged(); } + /* Start chaining processing */ + ImpChainingEventHdl(); + ImpMoveCursorAfterChainingEvent(pCursorManager); + /* End chaining processing */ + if (pWin!=NULL && pWin!=pTextEditWin) SetTextEditWin(pWin); #ifdef DBG_UTIL if (mpItemBrowser!=nullptr) mpItemBrowser->SetDirty(); commit 8ecbccf07bfcf82cb755f8abbe84f00576d76cc4 Author: matteocam <matteo.campane...@gmail.com> Date: Mon Sep 7 16:33:39 2015 +0200 Add methods and basic setup for editing-mode chaining Change-Id: I8065bebaf2a54170bc7b3ddbd35740bcca42298d diff --git a/include/svx/svdedxv.hxx b/include/svx/svdedxv.hxx index 2aa9f89..c388941 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; namespace com { namespace sun { namespace star { namespace uno { class Any; @@ -101,6 +102,10 @@ protected: // provide their document UndoManager and derive it from SdrUndoManager. virtual SdrUndoManager* getSdrUndoManagerForEnhancedTextEdit() const; + void ImpMoveCursorAfterChainingEvent(TextChainCursorManager *pCursorManager); + TextChainCursorManager *ImpHandleMotionThroughBoxesKeyInput(const KeyEvent& rKEvt, vcl::Window* pWin, bool *bOutHandled); + + OutlinerView* ImpFindOutlinerView(vcl::Window* pWin) const; // Create a new OutlinerView at the heap and initialize all required parameters. @@ -109,6 +114,11 @@ protected: void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect, OutputDevice& rTargetDevice) const; void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const; + // Chaining + void ImpChainingEventHdl(); + DECL_LINK(ImpAfterCutOrPasteChainingEventHdl,void*); + + // Check if the whole text is selected. // Still returns sal_True if there is no text present. bool ImpIsTextEditAllSelected() const; diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx index 17fe875..c2687f6 100644 --- a/sd/source/ui/view/outlview.cxx +++ b/sd/source/ui/view/outlview.cxx @@ -1375,6 +1375,7 @@ void OutlineView::ResetLinks() const mrOutliner.SetDrawPortionHdl(Link<DrawPortionInfo*,void>()); mrOutliner.SetBeginPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); mrOutliner.SetEndPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); + mrOutliner.SetChainingEventHdl(aEmptyLink); } sal_Int8 OutlineView::AcceptDrop( const AcceptDropEvent&, DropTargetHelper&, ::sd::Window*, sal_uInt16, sal_uInt16) diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx index 18fbf2e..524faba 100644 --- a/sd/source/ui/view/sdview.cxx +++ b/sd/source/ui/view/sdview.cxx @@ -1204,6 +1204,7 @@ void View::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfos*/ ) get the correct style sheet. */ void View::OnEndPasteOrDrop( PasteOrDropInfos* pInfos ) { + /* Style Sheet handling */ SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetTextEditObject() ); SdrOutliner* pOutliner = GetTextEditOutliner(); if( pOutliner && pTextObj && pTextObj->GetPage() ) diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx index f38d33f..86a69e4 100644 --- a/svx/source/svdraw/svdedxv.cxx +++ b/svx/source/svdraw/svdedxv.cxx @@ -51,6 +51,8 @@ #include "svx/svdstr.hrc" #include "svdglob.hxx" #include "svx/globl3d.hxx" +#include <svx/textchain.hxx> +#include <svx/textchaincursor.hxx> #include <editeng/outliner.hxx> #include <editeng/adjustitem.hxx> #include <svtools/colorcfg.hxx> @@ -489,6 +491,102 @@ IMPL_LINK(SdrObjEditView,ImpOutlinerStatusEventHdl,EditStatus*,pEditStat) return 0; } +void SdrObjEditView::ImpChainingEventHdl() +{ + if(pTextEditOutliner ) + { + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj * >( mxTextEditObj.get() ); + OutlinerView* pOLV = GetTextEditOutlinerView(); + if( pTextObj && pOLV) + { + TextChain *pTextChain = pTextObj->GetTextChain(); + + // XXX: IsChainable and GetNilChainingEvent are a bit mixed up atm + if (!pTextObj->IsChainable()) { + return; + } + // This is true during an underflow-caused overflow (with pEdtOutl->SetText()) + if (pTextChain->GetNilChainingEvent(pTextObj)) { + return; + } + + // We prevent to trigger further handling of overflow/underflow for pTextObj + pTextChain->SetNilChainingEvent(pTextObj, true); // XXX + + // Save previous selection pos // NOTE: It must be done to have the right CursorEvent in KeyInput + pTextChain->SetPreChainingSel(pTextObj, pOLV->GetSelection()); + //maPreChainingSel = new ESelection(pOLV->GetSelection()); + + // Handling Undo + const int nText = 0; // XXX: hardcoded index (SdrTextObj::getText handles only 0) + + SdrUndoObjSetText *pTxtUndo = dynamic_cast< SdrUndoObjSetText* > + ( GetModel()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTextObj, nText ) ); + + // trigger actual chaining + pTextObj->onChainingEvent(); + + if (pTxtUndo!=NULL) + { + pTxtUndo->AfterSetText(); + if (!pTxtUndo->IsDifferent()) + { + delete pTxtUndo; + pTxtUndo=NULL; + } + } + + if (pTxtUndo) + AddUndo(pTxtUndo); + + //maCursorEvent = new CursorChainingEvent(pTextChain->GetCursorEvent(pTextObj)); + //SdrTextObj *pNextLink = pTextObj->GetNextLinkInChain(); + + // NOTE: Must be called. Don't let the function return if you set it to true and not reset it + pTextChain->SetNilChainingEvent(pTextObj, false); + } else { + // XXX + fprintf(stderr, "[OnChaining] No Edit Outliner View\n"); + } + } + +} + +IMPL_LINK_NOARG(SdrObjEditView,ImpAfterCutOrPasteChainingEventHdl) +{ + SdrTextObj* pTextObj = dynamic_cast< SdrTextObj * >( GetTextEditObject()); + if (!pTextObj) + return 0; + ImpChainingEventHdl(); + TextChainCursorManager *pCursorManager = new TextChainCursorManager(this, pTextObj); + ImpMoveCursorAfterChainingEvent(pCursorManager); + return 0; +} + +void SdrObjEditView::ImpMoveCursorAfterChainingEvent(TextChainCursorManager *pCursorManager) +{ + if (!mxTextEditObj.is() || !pCursorManager) + return; + + SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(mxTextEditObj.get()); + + // Check if it has links to move it to + if (!pTextObj->IsChainable()) + return; + + TextChain *pTextChain = pTextObj->GetTextChain(); + ESelection aNewSel = pTextChain->GetPostChainingSel(pTextObj); + + + pCursorManager->HandleCursorEventAfterChaining( + pTextChain->GetCursorEvent(pTextObj), + aNewSel); + + // Reset event + pTextChain->SetCursorEvent(pTextObj, CursorChainingEvent::NULL_EVENT); +} + + IMPL_LINK_TYPED(SdrObjEditView,ImpOutlinerCalcFieldValueHdl,EditFieldInfo*,pFI,void) { bool bOk=false; @@ -728,6 +826,10 @@ bool SdrObjEditView::SdrBeginTextEdit( pTextEditOutlinerView->ShowCursor(); pTextEditOutliner->SetStatusEventHdl(LINK(this,SdrObjEditView,ImpOutlinerStatusEventHdl)); + if (pTextObj->IsChainable()) { + pTextEditOutlinerView->SetEndCutPasteLinkHdl(LINK(this,SdrObjEditView,ImpAfterCutOrPasteChainingEventHdl) ); + } + #ifdef DBG_UTIL if (mpItemBrowser!=nullptr) mpItemBrowser->SetDirty(); #endif @@ -917,6 +1019,8 @@ SdrEndTextEditKind SdrObjEditView::SdrEndTextEdit(bool bDontDeleteReally) pTEOutliner->SetBeginPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); pTEOutliner->SetEndPasteOrDropHdl(Link<PasteOrDropInfos*,void>()); + pTEOutliner->SetChainingEventHdl(Link<>()); + const bool bUndo = IsUndoEnabled(); if( bUndo ) { @@ -1189,10 +1293,37 @@ bool SdrObjEditView::IsTextEditFrameHit(const Point& rHit) const return bOk; } +TextChainCursorManager *SdrObjEditView::ImpHandleMotionThroughBoxesKeyInput( + const KeyEvent& rKEvt, + vcl::Window*, + bool *bOutHandled) +{ + *bOutHandled = false; + + SdrTextObj* pTextObj = NULL; + if (mxTextEditObj.is()) + pTextObj= dynamic_cast<SdrTextObj*>(mxTextEditObj.get()); + else + return NULL; + + if (!pTextObj->GetNextLinkInChain() && !pTextObj->GetPrevLinkInChain()) + return NULL; + + 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. + *bOutHandled = true; + } + + return pCursorManager; +} + bool SdrObjEditView::KeyInput(const KeyEvent& rKEvt, vcl::Window* pWin) { + if(pTextEditOutlinerView) { if (pTextEditOutlinerView->PostKeyEvent(rKEvt, pWin)) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits