diff options
Diffstat (limited to 'vcl/source/control/lstbox.cxx')
-rw-r--r-- | vcl/source/control/lstbox.cxx | 96 |
1 files changed, 52 insertions, 44 deletions
diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx index a35c502851fd..06da9a114911 100644 --- a/vcl/source/control/lstbox.cxx +++ b/vcl/source/control/lstbox.cxx @@ -39,7 +39,7 @@ void ListBox::EnableQuickSelection( const bool& b ) { - mpImplLB->GetMainWindow().EnableQuickSelection(b); + mpImplLB->GetMainWindow()->EnableQuickSelection(b); } ListBox::ListBox(WindowType nType) @@ -70,17 +70,19 @@ ListBox::ListBox( vcl::Window* pParent, const ResId& rResId ) : ListBox::~ListBox() { + disposeOnce(); +} + +void ListBox::dispose() +{ CallEventListeners( VCLEVENT_OBJECT_DYING ); - // When destroying the FloatWin TH does a GrabFocus to the Parent: - // that means this "ListBox => PreNotify() ..." - ImplListBox *pImplLB = mpImplLB; - mpImplLB = NULL; - delete pImplLB; + mpImplLB.disposeAndClear(); + mpFloatWin.disposeAndClear(); + mpImplWin.disposeAndClear(); + mpBtn.disposeAndClear(); - delete mpFloatWin; - delete mpImplWin; - delete mpBtn; + Control::dispose(); } void ListBox::ImplInitListBoxData() @@ -130,19 +132,19 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) } } - mpFloatWin = new ImplListBoxFloatingWindow( this ); + mpFloatWin = VclPtr<ImplListBoxFloatingWindow>::Create( this ); mpFloatWin->SetAutoWidth( true ); mpFloatWin->SetPopupModeEndHdl( LINK( this, ListBox, ImplPopupModeEndHdl ) ); mpFloatWin->GetDropTarget()->addDropTargetListener(xDrop); - mpImplWin = new ImplWin( this, (nStyle & (WB_LEFT|WB_RIGHT|WB_CENTER))|WB_NOBORDER ); + mpImplWin = VclPtr<ImplWin>::Create( this, (nStyle & (WB_LEFT|WB_RIGHT|WB_CENTER))|WB_NOBORDER ); mpImplWin->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 )); mpImplWin->userDrawSignal.connect( boost::bind( &ListBox::ImplUserDrawHandler, this, _1 ) ); mpImplWin->Show(); mpImplWin->GetDropTarget()->addDropTargetListener(xDrop); mpImplWin->SetEdgeBlending(GetEdgeBlending()); - mpBtn = new ImplBtn( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); + mpBtn = VclPtr<ImplBtn>::Create( this, WB_NOLIGHTBORDER | WB_RECTSTYLE ); ImplInitDropDownButton( mpBtn ); mpBtn->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 )); mpBtn->Show(); @@ -152,7 +154,7 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) vcl::Window* pLBParent = this; if ( mpFloatWin ) pLBParent = mpFloatWin; - mpImplLB = new ImplListBox( pLBParent, nStyle&(~WB_BORDER) ); + mpImplLB = VclPtr<ImplListBox>::Create( pLBParent, nStyle&(~WB_BORDER) ); mpImplLB->SetSelectHdl( LINK( this, ListBox, ImplSelectHdl ) ); mpImplLB->SetScrollHdl( LINK( this, ListBox, ImplScrollHdl ) ); mpImplLB->SetCancelHdl( LINK( this, ListBox, ImplCancelHdl ) ); @@ -173,7 +175,7 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle ) mpImplLB->SetSelectionChangedHdl( LINK( this, ListBox, ImplSelectionChangedHdl ) ); } else - mpImplLB->GetMainWindow().AllowGrabFocus( true ); + mpImplLB->GetMainWindow()->AllowGrabFocus( true ); SetCompoundControl( true ); } @@ -311,7 +313,7 @@ void ListBox::ImplClickButtonHandler( Control* ) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); if( mpImplWin ) mpImplWin->ImplClearLayoutData(); } @@ -341,7 +343,7 @@ IMPL_LINK_NOARG(ListBox, ImplPopupModeEndHdl) ImplClearLayoutData(); if( mpImplLB ) - mpImplLB->GetMainWindow().ImplClearLayoutData(); + mpImplLB->GetMainWindow()->ImplClearLayoutData(); if( mpImplWin ) mpImplWin->ImplClearLayoutData(); @@ -369,11 +371,11 @@ void ListBox::ToggleDropDown() void ListBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags ) { - mpImplLB->GetMainWindow().ImplInitSettings( true, true, true ); + mpImplLB->GetMainWindow()->ImplInitSettings( true, true, true ); Point aPos = pDev->LogicToPixel( rPos ); Size aSize = pDev->LogicToPixel( rSize ); - vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev ); + vcl::Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev ); OutDevType eOutDevType = pDev->GetOutDevType(); pDev->Push(); @@ -519,9 +521,15 @@ vcl::Window* ListBox::GetPreferredKeyInputWindow() void ListBox::LoseFocus() { if( IsDropDownBox() ) - mpImplWin->HideFocus(); + { + if (mpImplWin) + mpImplWin->HideFocus(); + } else - mpImplLB->HideFocus(); + { + if (mpImplLB) + mpImplLB->HideFocus(); + } Control::LoseFocus(); } @@ -691,7 +699,7 @@ void ListBox::Resize() void ListBox::FillLayoutData() const { mpControlData->mpLayoutData = new vcl::ControlLayoutData(); - const Control& rMainWin = mpImplLB->GetMainWindow(); + const ImplListBoxWindow* rMainWin = mpImplLB->GetMainWindow(); if( mpFloatWin ) { // Dropdown mode @@ -699,14 +707,14 @@ void ListBox::FillLayoutData() const mpImplWin->SetLayoutDataParent( this ); if( mpFloatWin->IsReallyVisible() ) { - AppendLayoutData( rMainWin ); - rMainWin.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWin ); + rMainWin->SetLayoutDataParent( this ); } } else { - AppendLayoutData( rMainWin ); - rMainWin.SetLayoutDataParent( this ); + AppendLayoutData( *rMainWin ); + rMainWin->SetLayoutDataParent( this ); } } @@ -721,16 +729,16 @@ long ListBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const { // Point must be either in main list window // or in impl window (dropdown case) - ImplListBoxWindow& rMain = mpImplLB->GetMainWindow(); + ImplListBoxWindow* rMain = mpImplLB->GetMainWindow(); // Convert coordinates to ImplListBoxWindow pixel coordinate space Point aConvPoint = LogicToPixel( rPoint ); aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint ); - aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint ); - aConvPoint = rMain.PixelToLogic( aConvPoint ); + aConvPoint = rMain->AbsoluteScreenToOutputPixel( aConvPoint ); + aConvPoint = rMain->PixelToLogic( aConvPoint ); // Try to find entry - sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint ); + sal_Int32 nEntry = rMain->GetEntryPosForPoint( aConvPoint ); if( nEntry == LISTBOX_ENTRY_NOTFOUND ) { // Not found, maybe dropdown case @@ -803,7 +811,7 @@ void ListBox::StateChanged( StateChangedType nType ) if ( mpImplWin ) { mpImplWin->SetZoom( GetZoom() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } Resize(); @@ -814,7 +822,7 @@ void ListBox::StateChanged( StateChangedType nType ) if ( mpImplWin ) { mpImplWin->SetControlFont( GetControlFont() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } Resize(); @@ -826,7 +834,7 @@ void ListBox::StateChanged( StateChangedType nType ) { mpImplWin->SetControlForeground( GetControlForeground() ); mpImplWin->SetTextColor( GetControlForeground() ); - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } } @@ -843,17 +851,17 @@ void ListBox::StateChanged( StateChangedType nType ) } else { - mpImplWin->SetBackground( mpImplLB->GetMainWindow().GetControlBackground() ); - mpImplWin->SetControlBackground( mpImplLB->GetMainWindow().GetControlBackground() ); + mpImplWin->SetBackground( mpImplLB->GetMainWindow()->GetControlBackground() ); + mpImplWin->SetControlBackground( mpImplLB->GetMainWindow()->GetControlBackground() ); } - mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() ); + mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() ); mpImplWin->Invalidate(); } } else if ( nType == StateChangedType::STYLE ) { SetStyle( ImplInitStyle( GetStyle() ) ); - mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) != 0 ); + mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) != 0 ); bool bSimpleMode = ( GetStyle() & WB_SIMPLEMODE ) != 0; mpImplLB->SetMultiSelectionSimpleMode( bSimpleMode ); } @@ -1157,8 +1165,8 @@ bool ListBox::IsInDropDown() const Rectangle ListBox::GetBoundingRectangle( sal_Int32 nItem ) const { - Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem ); - Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this ); + Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem ); + Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (vcl::Window*)this ); aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() ); return aRect; } @@ -1180,7 +1188,7 @@ void ListBox::EnableMultiSelection( bool bMulti, bool bStackSelection ) // In a MultiSelection, we can't see us travelling without focus if ( mpFloatWin ) - mpImplLB->GetMainWindow().AllowGrabFocus( bMulti ); + mpImplLB->GetMainWindow()->AllowGrabFocus( bMulti ); } bool ListBox::IsMultiSelectionEnabled() const @@ -1348,7 +1356,7 @@ void ListBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines float nCharWidth = approximate_char_width(); if ( !IsDropDownBox() ) { - Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel(); + Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel(); rnCols = (sal_uInt16) (aOutSz.Width()/nCharWidth); rnLines = (sal_uInt16) (aOutSz.Height()/mpImplLB->GetEntryHeight()); } @@ -1371,22 +1379,22 @@ void ListBox::UserDraw( const UserDrawEvent& ) void ListBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos ) { - if ( rEvt.GetDevice() == &mpImplLB->GetMainWindow() ) - mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); + if ( rEvt.GetDevice() == mpImplLB->GetMainWindow() ) + mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos ); else if ( rEvt.GetDevice() == mpImplWin ) mpImplWin->DrawEntry( bDrawImage, bDrawText, bDrawTextAtImagePos ); } void ListBox::SetUserItemSize( const Size& rSz ) { - mpImplLB->GetMainWindow().SetUserItemSize( rSz ); + mpImplLB->GetMainWindow()->SetUserItemSize( rSz ); if ( mpImplWin ) mpImplWin->SetUserItemSize( rSz ); } void ListBox::EnableUserDraw( bool bUserDraw ) { - mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw ); + mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw ); if ( mpImplWin ) mpImplWin->EnableUserDraw( bUserDraw ); } |