From 5b8377f80c7618a770900848e205a487d846c66e Mon Sep 17 00:00:00 2001 From: Noel Power Date: Thu, 4 Apr 2013 17:07:52 +0100 Subject: fix selection change event firing Change-Id: I64e8b684dd5462e1a742ba47b5480951b4e3a4c4 --- sc/source/ui/unoobj/viewuno.cxx | 49 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) (limited to 'sc/source/ui/unoobj') diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx index 22c0d9d791a3..7e9e1be6a09a 100644 --- a/sc/source/ui/unoobj/viewuno.cxx +++ b/sc/source/ui/unoobj/viewuno.cxx @@ -463,7 +463,9 @@ ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) : aMouseClickHandlers( 0 ), aActivationListeners( 0 ), nPreviousTab( 0 ), - bDrawSelModeSet(false) + bDrawSelModeSet(false), + mbLeftMousePressed(false ), + mbPendingSelectionChanged(false) { if (pViewSh) nPreviousTab = pViewSh->GetViewData()->GetTabNo(); @@ -1184,13 +1186,17 @@ bool ScTabViewObj::IsMouseListening() const SCTAB nTab = pViewData->GetTabNo(); return pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) || - pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true ); + pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true ) || + pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_SELECT, true ); + } sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e ) throw (::uno::RuntimeException) { sal_Bool bReturn(false); + if ( e.Buttons == ::com::sun::star::awt::MouseButton::LEFT ) + mbLeftMousePressed = true; uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y)); if (!aMouseClickHandlers.empty() && xTarget.is()) @@ -1281,6 +1287,26 @@ sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e ) sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e ) throw (uno::RuntimeException) { + if ( e.Buttons == ::com::sun::star::awt::MouseButton::LEFT ) + { + try + { + mbPendingSelectionChanged = false; + ScTabViewShell* pViewSh = GetViewShell(); + ScViewData* pViewData = pViewSh->GetViewData(); + ScDocShell* pDocSh = pViewData->GetDocShell(); + ScDocument* pDoc = pDocSh->GetDocument(); + uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); + uno::Sequence< uno::Any > aArgs( 1 ); + aArgs[ 0 ] <<= getSelection(); + xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs ); + } + catch( uno::Exception& ) + { + } + mbLeftMousePressed = false; + } + sal_Bool bReturn(false); if (!aMouseClickHandlers.empty()) @@ -1746,7 +1772,24 @@ void ScTabViewObj::SelectionChanged() /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); } } - // Removed Sun/Oracle code intentionally, it doesn't work properly ( selection should be fired after mouse release ) + if ( !mbLeftMousePressed ) // selection still in progress + { + mbPendingSelectionChanged = false; + try + { + uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); + uno::Sequence< uno::Any > aArgs( 1 ); + aArgs[ 0 ] <<= getSelection(); + xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_SELECT ), aArgs ); + } + catch( uno::Exception& ) + { + } + } + else + { + mbPendingSelectionChanged = true; + } } -- cgit