Kaydet (Commit) 5b8377f8 authored tarafından Noel Power's avatar Noel Power

fix selection change event firing

Change-Id: I64e8b684dd5462e1a742ba47b5480951b4e3a4c4
üst 959d1dc0
...@@ -205,7 +205,8 @@ private: ...@@ -205,7 +205,8 @@ private:
void EndMouseListening(); void EndMouseListening();
void StartActivationListening(); void StartActivationListening();
void EndActivationListening(); void EndActivationListening();
bool mbLeftMousePressed;
bool mbPendingSelectionChanged;
ScTabViewObj(); // disabled ScTabViewObj(); // disabled
public: public:
ScTabViewObj(ScTabViewShell* pViewSh); ScTabViewObj(ScTabViewShell* pViewSh);
......
...@@ -463,7 +463,9 @@ ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) : ...@@ -463,7 +463,9 @@ ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) :
aMouseClickHandlers( 0 ), aMouseClickHandlers( 0 ),
aActivationListeners( 0 ), aActivationListeners( 0 ),
nPreviousTab( 0 ), nPreviousTab( 0 ),
bDrawSelModeSet(false) bDrawSelModeSet(false),
mbLeftMousePressed(false ),
mbPendingSelectionChanged(false)
{ {
if (pViewSh) if (pViewSh)
nPreviousTab = pViewSh->GetViewData()->GetTabNo(); nPreviousTab = pViewSh->GetViewData()->GetTabNo();
...@@ -1184,13 +1186,17 @@ bool ScTabViewObj::IsMouseListening() const ...@@ -1184,13 +1186,17 @@ bool ScTabViewObj::IsMouseListening() const
SCTAB nTab = pViewData->GetTabNo(); SCTAB nTab = pViewData->GetTabNo();
return return
pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) || 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 ) sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
throw (::uno::RuntimeException) throw (::uno::RuntimeException)
{ {
sal_Bool bReturn(false); 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)); uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y));
if (!aMouseClickHandlers.empty() && xTarget.is()) if (!aMouseClickHandlers.empty() && xTarget.is())
...@@ -1281,6 +1287,26 @@ sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e ) ...@@ -1281,6 +1287,26 @@ sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e )
sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e ) sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e )
throw (uno::RuntimeException) 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); sal_Bool bReturn(false);
if (!aMouseClickHandlers.empty()) if (!aMouseClickHandlers.empty())
...@@ -1746,7 +1772,24 @@ void ScTabViewObj::SelectionChanged() ...@@ -1746,7 +1772,24 @@ void ScTabViewObj::SelectionChanged()
/*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); /*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;
}
} }
......
...@@ -192,11 +192,14 @@ void SAL_CALL ScVbaControl::setEnabled( sal_Bool bVisible ) throw (uno::RuntimeE ...@@ -192,11 +192,14 @@ void SAL_CALL ScVbaControl::setEnabled( sal_Bool bVisible ) throw (uno::RuntimeE
sal_Bool SAL_CALL ScVbaControl::getVisible() throw (uno::RuntimeException) sal_Bool SAL_CALL ScVbaControl::getVisible() throw (uno::RuntimeException)
{ {
sal_Bool bVisible( sal_True ); sal_Bool bVisible( sal_True );
m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible;
uno::Reference< drawing::XControlShape > xControlShape( m_xControl, uno::UNO_QUERY ); uno::Reference< drawing::XControlShape > xControlShape( m_xControl, uno::UNO_QUERY );
if ( xControlShape.is() ) if ( xControlShape.is() )
{ {
bool bEnableVisible = bVisible;
uno::Reference< beans::XPropertySet > xProps( m_xControl, uno::UNO_QUERY_THROW ); uno::Reference< beans::XPropertySet > xProps( m_xControl, uno::UNO_QUERY_THROW );
xProps->getPropertyValue ( "Visible" ) >>= bVisible; xProps->getPropertyValue ( "Visible" ) >>= bVisible;
bVisible = bVisible && bEnableVisible;
} }
else else
m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible; m_xProps->getPropertyValue ( "EnableVisible" ) >>= bVisible;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment