Resolves: fdo#44998 crash when opening context menu of a field
If you right click on a field in an inactive text box, then a mouse down, context command, mouse up sequence is sent. The mouse up is supposed to be captured by the context menu here. But it doesn't because the mouse down in draw sends an artificial mouse down to the editengine which eventually sets up a MouseCapture window so the context menu doesn't get considered (because it occurs before the capture window is released) so the mouse up gets send to sd while the context menu is up and that causes all sorts of havoc. Change-Id: If3b7c501586f8561be484d0828c630d84644f770
This commit is contained in:
@@ -365,6 +365,11 @@ bool EditView::MouseButtonUp( const MouseEvent& rMouseEvent )
|
||||
return pImpEditView->MouseButtonUp( rMouseEvent );
|
||||
}
|
||||
|
||||
void EditView::ReleaseMouse()
|
||||
{
|
||||
return pImpEditView->ReleaseMouse();
|
||||
}
|
||||
|
||||
bool EditView::MouseButtonDown( const MouseEvent& rMouseEvent )
|
||||
{
|
||||
return pImpEditView->MouseButtonDown( rMouseEvent );
|
||||
|
@@ -1064,6 +1064,11 @@ bool ImpEditView::MouseButtonUp( const MouseEvent& rMouseEvent )
|
||||
return pEditEngine->pImpEditEngine->MouseButtonUp( rMouseEvent, GetEditViewPtr() );
|
||||
}
|
||||
|
||||
void ImpEditView::ReleaseMouse()
|
||||
{
|
||||
pEditEngine->pImpEditEngine->ReleaseMouse();
|
||||
}
|
||||
|
||||
bool ImpEditView::MouseButtonDown( const MouseEvent& rMouseEvent )
|
||||
{
|
||||
pEditEngine->CheckIdleFormatter(); // If fast typing and mouse button downs
|
||||
|
@@ -288,6 +288,7 @@ public:
|
||||
|
||||
bool MouseButtonUp( const MouseEvent& rMouseEvent );
|
||||
bool MouseButtonDown( const MouseEvent& rMouseEvent );
|
||||
void ReleaseMouse();
|
||||
bool MouseMove( const MouseEvent& rMouseEvent );
|
||||
void Command( const CommandEvent& rCEvt );
|
||||
|
||||
@@ -728,6 +729,7 @@ public:
|
||||
|
||||
bool MouseButtonUp( const MouseEvent& rMouseEvent, EditView* pView );
|
||||
bool MouseButtonDown( const MouseEvent& rMouseEvent, EditView* pView );
|
||||
void ReleaseMouse();
|
||||
bool MouseMove( const MouseEvent& rMouseEvent, EditView* pView );
|
||||
void Command( const CommandEvent& rCEvt, EditView* pView );
|
||||
|
||||
|
@@ -586,6 +586,11 @@ bool ImpEditEngine::MouseButtonUp( const MouseEvent& rMEvt, EditView* pView )
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImpEditEngine::ReleaseMouse()
|
||||
{
|
||||
GetSelEngine().ReleaseMouse();
|
||||
}
|
||||
|
||||
bool ImpEditEngine::MouseMove( const MouseEvent& rMEvt, EditView* pView )
|
||||
{
|
||||
// MouseMove is called directly after ShowQuickHelp()!
|
||||
|
@@ -51,7 +51,6 @@ using namespace ::com::sun::star;
|
||||
|
||||
OutlinerView::OutlinerView( Outliner* pOut, vcl::Window* pWin )
|
||||
{
|
||||
|
||||
pOwner = pOut;
|
||||
|
||||
pEditView = new EditView( pOut->pEditEngine, pWin );
|
||||
@@ -363,6 +362,11 @@ bool OutlinerView::MouseButtonUp( const MouseEvent& rMEvt )
|
||||
return pEditView->MouseButtonUp( rMEvt );
|
||||
}
|
||||
|
||||
void OutlinerView::ReleaseMouse()
|
||||
{
|
||||
pEditView->ReleaseMouse();
|
||||
}
|
||||
|
||||
void OutlinerView::ImpToggleExpand( Paragraph* pPara )
|
||||
{
|
||||
sal_Int32 nPara = pOwner->pParaList->GetAbsPos( pPara );
|
||||
|
@@ -140,6 +140,7 @@ public:
|
||||
|
||||
bool MouseButtonUp( const MouseEvent& rMouseEvent );
|
||||
bool MouseButtonDown( const MouseEvent& rMouseEvent );
|
||||
void ReleaseMouse();
|
||||
bool MouseMove( const MouseEvent& rMouseEvent );
|
||||
void Command( const CommandEvent& rCEvt );
|
||||
|
||||
|
@@ -214,6 +214,7 @@ public:
|
||||
bool PostKeyEvent( const KeyEvent& rKEvt, vcl::Window* pFrameWin = NULL );
|
||||
bool MouseButtonDown( const MouseEvent& );
|
||||
bool MouseButtonUp( const MouseEvent& );
|
||||
void ReleaseMouse();
|
||||
bool MouseMove( const MouseEvent& );
|
||||
|
||||
void ShowCursor( bool bGotoCursor = true );
|
||||
|
@@ -100,6 +100,13 @@ public:
|
||||
bool SelMouseButtonDown( const MouseEvent& rMEvt );
|
||||
bool SelMouseButtonUp( const MouseEvent& rMEvt );
|
||||
bool SelMouseMove( const MouseEvent& rMEvt );
|
||||
//SelMouseButtonDown captures mouse events, SelMouseButtonUp
|
||||
//releases the capture. If you need to release the mouse
|
||||
//capture after SelMouseButtonDown but before
|
||||
//SelMouseButtonUp, e.g. to allow events to go to a
|
||||
//context menu via "Command" which is delivered after
|
||||
//mouse down but before mouse up, then use this
|
||||
void ReleaseMouse();
|
||||
|
||||
// Keyboard
|
||||
void CursorPosChanging( bool bShift, bool bMod1 );
|
||||
|
@@ -541,6 +541,9 @@ void DrawViewShell::Command(const CommandEvent& rCEvt, ::sd::Window* pWin)
|
||||
eLanguage = pOLV->GetOutliner()->GetLanguage( aSelection.nStartPara, aSelection.nStartPos );
|
||||
}
|
||||
|
||||
//fdo#44998 if the outliner has captured the mouse events release the lock
|
||||
//so the SdFieldPopup can get them
|
||||
pOLV->ReleaseMouse();
|
||||
SdFieldPopup aFieldPopup( pFldItem->GetField(), eLanguage );
|
||||
|
||||
if ( rCEvt.IsMouseEvent() )
|
||||
|
@@ -244,7 +244,7 @@ bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
|
||||
|
||||
if( !rMEvt.IsRight() )
|
||||
{
|
||||
pWin->ReleaseMouse();
|
||||
ReleaseMouse();
|
||||
}
|
||||
|
||||
if( (nFlags & SELENG_WAIT_UPEVT) && !(nFlags & SELENG_CMDEVT) &&
|
||||
@@ -276,6 +276,13 @@ bool SelectionEngine::SelMouseButtonUp( const MouseEvent& rMEvt )
|
||||
return true;
|
||||
}
|
||||
|
||||
void SelectionEngine::ReleaseMouse()
|
||||
{
|
||||
if (!pWin)
|
||||
return;
|
||||
pWin->ReleaseMouse();
|
||||
}
|
||||
|
||||
bool SelectionEngine::SelMouseMove( const MouseEvent& rMEvt )
|
||||
{
|
||||
|
||||
|
Reference in New Issue
Block a user