Kaydet (Commit) 4421bb8e authored tarafından Michael Meeks's avatar Michael Meeks

tdf#94495 - protect lstbox usage post-dispose, and fix ItemWin focus.

Change-Id: I2e4d1c79f57ec048d66111ed393491b7803ee3b9
üst 6cd11e4f
...@@ -419,16 +419,19 @@ bool SvxFillTypeBox::PreNotify( NotifyEvent& rNEvt ) ...@@ -419,16 +419,19 @@ bool SvxFillTypeBox::PreNotify( NotifyEvent& rNEvt )
{ {
MouseNotifyEvent nType = rNEvt.GetType(); MouseNotifyEvent nType = rNEvt.GetType();
if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType ) if (!isDisposed())
nCurPos = GetSelectEntryPos();
else if ( MouseNotifyEvent::LOSEFOCUS == nType
&& Application::GetFocusWindow()
&& !IsWindowOrChild( Application::GetFocusWindow(), true ) )
{ {
if ( !bSelect ) if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
SelectEntryPos( nCurPos ); nCurPos = GetSelectEntryPos();
else else if ( MouseNotifyEvent::LOSEFOCUS == nType
bSelect = false; && Application::GetFocusWindow()
&& !IsWindowOrChild( Application::GetFocusWindow(), true ) )
{
if ( !bSelect )
SelectEntryPos( nCurPos );
else
bSelect = false;
}
} }
return FillTypeLB::PreNotify( rNEvt ); return FillTypeLB::PreNotify( rNEvt );
...@@ -440,6 +443,9 @@ bool SvxFillTypeBox::Notify( NotifyEvent& rNEvt ) ...@@ -440,6 +443,9 @@ bool SvxFillTypeBox::Notify( NotifyEvent& rNEvt )
{ {
bool bHandled = FillTypeLB::Notify( rNEvt ); bool bHandled = FillTypeLB::Notify( rNEvt );
if (isDisposed())
return false;
if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
{ {
const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
......
...@@ -971,6 +971,8 @@ void ListBox::DoubleClick() ...@@ -971,6 +971,8 @@ void ListBox::DoubleClick()
void ListBox::Clear() void ListBox::Clear()
{ {
if (!mpImplLB)
return;
mpImplLB->Clear(); mpImplLB->Clear();
if( IsDropDownBox() ) if( IsDropDownBox() )
{ {
...@@ -1026,13 +1028,15 @@ void ListBox::RemoveEntry( sal_Int32 nPos ) ...@@ -1026,13 +1028,15 @@ void ListBox::RemoveEntry( sal_Int32 nPos )
Image ListBox::GetEntryImage( sal_Int32 nPos ) const Image ListBox::GetEntryImage( sal_Int32 nPos ) const
{ {
if ( mpImplLB->GetEntryList()->HasEntryImage( nPos ) ) if ( mpImplLB && mpImplLB->GetEntryList()->HasEntryImage( nPos ) )
return mpImplLB->GetEntryList()->GetEntryImage( nPos ); return mpImplLB->GetEntryList()->GetEntryImage( nPos );
return Image(); return Image();
} }
sal_Int32 ListBox::GetEntryPos( const OUString& rStr ) const sal_Int32 ListBox::GetEntryPos( const OUString& rStr ) const
{ {
if (!mpImplLB)
return LISTBOX_ENTRY_NOTFOUND;
sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( rStr ); sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( rStr );
if ( nPos != LISTBOX_ENTRY_NOTFOUND ) if ( nPos != LISTBOX_ENTRY_NOTFOUND )
nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount(); nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount();
...@@ -1041,6 +1045,8 @@ sal_Int32 ListBox::GetEntryPos( const OUString& rStr ) const ...@@ -1041,6 +1045,8 @@ sal_Int32 ListBox::GetEntryPos( const OUString& rStr ) const
sal_Int32 ListBox::GetEntryPos( const void* pData ) const sal_Int32 ListBox::GetEntryPos( const void* pData ) const
{ {
if (!mpImplLB)
return LISTBOX_ENTRY_NOTFOUND;
sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( pData ); sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( pData );
if ( nPos != LISTBOX_ENTRY_NOTFOUND ) if ( nPos != LISTBOX_ENTRY_NOTFOUND )
nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount(); nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount();
...@@ -1049,11 +1055,15 @@ sal_Int32 ListBox::GetEntryPos( const void* pData ) const ...@@ -1049,11 +1055,15 @@ sal_Int32 ListBox::GetEntryPos( const void* pData ) const
OUString ListBox::GetEntry( sal_Int32 nPos ) const OUString ListBox::GetEntry( sal_Int32 nPos ) const
{ {
if (!mpImplLB)
return OUString();
return mpImplLB->GetEntryList()->GetEntryText( nPos + mpImplLB->GetEntryList()->GetMRUCount() ); return mpImplLB->GetEntryList()->GetEntryText( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
} }
sal_Int32 ListBox::GetEntryCount() const sal_Int32 ListBox::GetEntryCount() const
{ {
if (!mpImplLB)
return 0;
return mpImplLB->GetEntryList()->GetEntryCount() - mpImplLB->GetEntryList()->GetMRUCount(); return mpImplLB->GetEntryList()->GetEntryCount() - mpImplLB->GetEntryList()->GetMRUCount();
} }
...@@ -1064,11 +1074,16 @@ OUString ListBox::GetSelectEntry(sal_Int32 nIndex) const ...@@ -1064,11 +1074,16 @@ OUString ListBox::GetSelectEntry(sal_Int32 nIndex) const
sal_Int32 ListBox::GetSelectEntryCount() const sal_Int32 ListBox::GetSelectEntryCount() const
{ {
if (!mpImplLB)
return 0;
return mpImplLB->GetEntryList()->GetSelectEntryCount(); return mpImplLB->GetEntryList()->GetSelectEntryCount();
} }
sal_Int32 ListBox::GetSelectEntryPos( sal_Int32 nIndex ) const sal_Int32 ListBox::GetSelectEntryPos( sal_Int32 nIndex ) const
{ {
if (!mpImplLB || !mpImplLB->GetEntryList())
return LISTBOX_ENTRY_NOTFOUND;
sal_Int32 nPos = mpImplLB->GetEntryList()->GetSelectEntryPos( nIndex ); sal_Int32 nPos = mpImplLB->GetEntryList()->GetSelectEntryPos( nIndex );
if ( nPos != LISTBOX_ENTRY_NOTFOUND ) if ( nPos != LISTBOX_ENTRY_NOTFOUND )
{ {
...@@ -1096,6 +1111,9 @@ void ListBox::SelectEntry( const OUString& rStr, bool bSelect ) ...@@ -1096,6 +1111,9 @@ void ListBox::SelectEntry( const OUString& rStr, bool bSelect )
void ListBox::SelectEntryPos( sal_Int32 nPos, bool bSelect ) void ListBox::SelectEntryPos( sal_Int32 nPos, bool bSelect )
{ {
if (!mpImplLB)
return;
if ( 0 <= nPos && nPos < mpImplLB->GetEntryList()->GetEntryCount() ) if ( 0 <= nPos && nPos < mpImplLB->GetEntryList()->GetEntryCount() )
{ {
sal_Int32 oldSelectCount = GetSelectEntryCount(), newSelectCount = 0, nCurrentPos = mpImplLB->GetCurrentPos(); sal_Int32 oldSelectCount = GetSelectEntryCount(), newSelectCount = 0, nCurrentPos = mpImplLB->GetCurrentPos();
......
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