diff options
author | Lennard Wasserthal <Wasserthal@nefkom.net> | 2013-02-09 14:31:21 +0100 |
---|---|---|
committer | Tor Lillqvist <tml@iki.fi> | 2013-02-11 10:10:29 +0000 |
commit | e80a8b6f14fac6bb6cc7ea55b118f95472d5b654 (patch) | |
tree | 7b3cf8169527aed8af7236ebd982b64673468d21 /sc/source/ui/drawfunc | |
parent | 847749e975a7111ea306909a29fddb5df13e9a70 (diff) |
fdo#55430 switches off text mode when clicking an other object.
This patch complements 85ea03ae536831649b104694d08dced4d4c8663f (and
6fbba11da54b52554941f00b07e42cc5d7a1643c, which didn't work correctly before)
This also fixes issues when clicking on another object to stop text editing.
Switches off text mode, and instantaneously selects the other object.
(Rotation doesn't belong into the ./sd/ text routine AT ALL, which also caused bug 37482,
which is resolved differently from now on)
(Creating text fields doesn't belong into the ./sc/ shape text routine either, and if this executed, it causes funny glitches)
Known issues: text mode stays on when you use drag'n drop (the one WITH waiting, to move to other applications etc).
Change-Id: I3c8cdedbfae58165ebeda5887c1b6573832eb495
Signed-off-by: Lennard Wasserthal <Wasserthal@nefkom.net>
Reviewed-on: https://gerrit.libreoffice.org/1344
Reviewed-by: Tor Lillqvist <tml@iki.fi>
Tested-by: Tor Lillqvist <tml@iki.fi>
Diffstat (limited to 'sc/source/ui/drawfunc')
-rw-r--r-- | sc/source/ui/drawfunc/fusel.cxx | 28 | ||||
-rw-r--r-- | sc/source/ui/drawfunc/futext.cxx | 41 |
2 files changed, 54 insertions, 15 deletions
diff --git a/sc/source/ui/drawfunc/fusel.cxx b/sc/source/ui/drawfunc/fusel.cxx index 4968f15e47c0..a3568b0992fb 100644 --- a/sc/source/ui/drawfunc/fusel.cxx +++ b/sc/source/ui/drawfunc/fusel.cxx @@ -53,6 +53,8 @@ // Maximal erlaubte Mausbewegung um noch Drag&Drop zu starten //! fusel,fuconstr,futext - zusammenfassen! #define SC_MAXDRAGMOVE 3 +// Min necessary mouse motion for normal dragging +#define SC_MINDRAGMOVE 2 // ----------------------------------------------------------------------- @@ -381,11 +383,14 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) sal_Bool bReturn = FuDraw::MouseButtonUp(rMEvt); sal_Bool bOle = pViewShell->GetViewFrame()->GetFrame().IsInPlace(); + SdrObject* pObj = NULL; + SdrPageView* pPV = NULL; if (aDragTimer.IsActive() ) { aDragTimer.Stop(); } + sal_uInt16 nDrgLog = sal_uInt16 ( pWindow->PixelToLogic(Size(SC_MINDRAGMOVE,0)).Width() ); Point aPnt( pWindow->PixelToLogic( rMEvt.GetPosPixel() ) ); bool bCopy = false; @@ -416,7 +421,7 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) for ( sal_uLong i = 0; i < nMarkCount; ++i ) { SdrMark* pMark = rSdrMarkList.GetMark( i ); - SdrObject* pObj = ( pMark ? pMark->GetMarkedSdrObj() : NULL ); + pObj = ( pMark ? pMark->GetMarkedSdrObj() : NULL ); if ( pObj ) { ScChartHelper::AddRangesIfProtectedChart( aProtectedChartRangesVector, pDocument, pObj ); @@ -426,6 +431,21 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) bCopy = true; } + if (!rMEvt.IsShift() && !rMEvt.IsMod1() && !rMEvt.IsMod2() && + Abs(aPnt.X() - aMDPos.X()) < nDrgLog && + Abs(aPnt.Y() - aMDPos.Y()) < nDrgLog) + { + /************************************************************* + * If a user wants to click on an object in front of a marked + * one, he releases the mouse button immediately + **************************************************************/ + if (pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_BEFOREMARK)) + { + pView->UnmarkAllObj(); + pView->MarkObj(pObj,pPV,false,false); + return (sal_True); + } + } pView->EndDragObj( rMEvt.IsMod1() ); pView->ForceMarkedToAnotherPage(); @@ -433,7 +453,7 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) if (rMarkList.GetMarkCount() == 1) { SdrMark* pMark = rMarkList.GetMark(0); - SdrObject* pObj = pMark->GetMarkedSdrObj(); + pObj = pMark->GetMarkedSdrObj(); FuPoor* pPoor = pViewShell->GetViewData()->GetView()->GetDrawFuncPtr(); FuText* pText = static_cast<FuText*>(pPoor); pText->StopDragMode(pObj ); @@ -458,7 +478,7 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) bool bFound = false; for( sal_uLong nIdx = 0; !bFound && (nIdx < nCount); ++nIdx ) { - SdrObject* pObj = rMarkList.GetMark( nIdx )->GetMarkedSdrObj(); + pObj = rMarkList.GetMark( nIdx )->GetMarkedSdrObj(); bFound = ScDrawLayer::IsNoteCaption( pObj ); if( bFound ) { @@ -494,7 +514,7 @@ sal_Bool FuSelection::MouseButtonUp(const MouseEvent& rMEvt) if (rMarkList.GetMarkCount() == 1) { SdrMark* pMark = rMarkList.GetMark(0); - SdrObject* pObj = pMark->GetMarkedSdrObj(); + pObj = pMark->GetMarkedSdrObj(); // aktivieren nur, wenn die Maus auch (noch) ueber dem // selektierten Objekt steht diff --git a/sc/source/ui/drawfunc/futext.cxx b/sc/source/ui/drawfunc/futext.cxx index 6be3b9d641de..b1963c281d35 100644 --- a/sc/source/ui/drawfunc/futext.cxx +++ b/sc/source/ui/drawfunc/futext.cxx @@ -125,6 +125,7 @@ sal_Bool FuText::MouseButtonDown(const MouseEvent& rMEvt) { // remember button state for creation of own MouseEvents SetMouseButtonCode(rMEvt.GetButtons()); + sal_Bool bStraightEnter = true; if ( pView->MouseButtonDown(rMEvt, pWindow) ) return (sal_True); // Event von der SdrView ausgewertet @@ -132,7 +133,13 @@ sal_Bool FuText::MouseButtonDown(const MouseEvent& rMEvt) if ( pView->IsTextEdit() ) { if( !IsSizingOrMovingNote(rMEvt) ) + { StopEditMode(); // Danebengeklickt, Ende mit Edit + pView->UnmarkAll(); + bStraightEnter = false; + ScViewData& rViewData = *pViewShell->GetViewData(); + rViewData.GetDispatcher().Execute(aSfxRequest.GetSlot(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD); + } pView->SetCreateMode(); } @@ -302,18 +309,30 @@ sal_Bool FuText::MouseButtonDown(const MouseEvent& rMEvt) } else { - /********************************************************** - * Objekt erzeugen - **********************************************************/ - // Hack to align object to nearest grid position where object - // would be anchored ( if it were cell anchored ) - // Get grid offset for current position ( note: aPnt is - // also adjusted ) - Point aGridOff = CurrentGridSyncOffsetAndPos( aMDPos ); - - bool bRet = pView->BegCreateObj(aMDPos, (OutputDevice*) NULL); - if ( bRet ) + if (bStraightEnter)//Hack for that silly idea that creating text fields is inside the text routine + { + /********************************************************** + * Objekt erzeugen + **********************************************************/ + // Hack to align object to nearest grid position where object + // would be anchored ( if it were cell anchored ) + // Get grid offset for current position ( note: aPnt is + // also adjusted ) + Point aGridOff = CurrentGridSyncOffsetAndPos( aMDPos ); + + bool bRet = pView->BegCreateObj(aMDPos, (OutputDevice*) NULL); + if ( bRet ) pView->GetCreateObj()->SetGridOffset( aGridOff ); + } + else if (pView->PickObj(aMDPos, pView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER | SDRSEARCH_BEFOREMARK)) + { + pView->UnmarkAllObj(); + pView->MarkObj(pObj,pPV,false,false); + + pHdl=pView->PickHandle(aMDPos); + pView->BegDragObj(aMDPos, (OutputDevice*) NULL, pHdl); + return(sal_True); + } } } } |