LCOV - code coverage report
Current view: top level - vcl/source/control - lstbox.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 390 827 47.2 %
Date: 2014-11-03 Functions: 53 101 52.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "tools/rc.h"
      21             : #include "tools/debug.hxx"
      22             : 
      23             : #include "vcl/decoview.hxx"
      24             : #include "vcl/dialog.hxx"
      25             : #include "vcl/event.hxx"
      26             : #include "vcl/scrbar.hxx"
      27             : #include "vcl/button.hxx"
      28             : #include "vcl/edit.hxx"
      29             : #include "vcl/lstbox.hxx"
      30             : #include "vcl/combobox.hxx"
      31             : #include "vcl/settings.hxx"
      32             : 
      33             : #include "svdata.hxx"
      34             : #include "controldata.hxx"
      35             : #include "ilstbox.hxx"
      36             : #include "dndevdis.hxx"
      37             : 
      38             : #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
      39             : 
      40           0 : void ListBox::EnableQuickSelection( const bool& b )
      41             : {
      42           0 :     mpImplLB->GetMainWindow().EnableQuickSelection(b);
      43           0 : }
      44             : 
      45           0 : ListBox::ListBox(WindowType nType)
      46             :     : Control(nType)
      47           0 :     , mpImplLB(NULL)
      48             : {
      49           0 :     ImplInitListBoxData();
      50           0 : }
      51             : 
      52         452 : ListBox::ListBox( vcl::Window* pParent, WinBits nStyle ) : Control( WINDOW_LISTBOX )
      53             : {
      54         452 :     ImplInitListBoxData();
      55         452 :     ImplInit( pParent, nStyle );
      56         452 : }
      57             : 
      58         156 : ListBox::ListBox( vcl::Window* pParent, const ResId& rResId ) :
      59         156 :     Control( WINDOW_LISTBOX )
      60             : {
      61         156 :     rResId.SetRT( RSC_LISTBOX );
      62         156 :     WinBits nStyle = ImplInitRes( rResId );
      63         156 :     ImplInitListBoxData();
      64         156 :     ImplInit( pParent, nStyle );
      65         156 :     ImplLoadRes( rResId );
      66             : 
      67         156 :     if ( !(nStyle & WB_HIDE ) )
      68         156 :         Show();
      69         156 : }
      70             : 
      71        1256 : ListBox::~ListBox()
      72             : {
      73         608 :     ImplCallEventListeners( VCLEVENT_OBJECT_DYING );
      74             : 
      75             :     // When destroying the FloatWin TH does a GrabFocus to the Parent:
      76             :     // that means this "ListBox => PreNotify() ..."
      77         608 :     ImplListBox *pImplLB = mpImplLB;
      78         608 :     mpImplLB = NULL;
      79         608 :     delete pImplLB;
      80             : 
      81         608 :     delete mpFloatWin;
      82         608 :     delete mpImplWin;
      83         608 :     delete mpBtn;
      84         648 : }
      85             : 
      86         608 : void ListBox::ImplInitListBoxData()
      87             : {
      88         608 :     mpFloatWin      = NULL;
      89         608 :     mpImplWin       = NULL;
      90         608 :     mpBtn           = NULL;
      91         608 :     mnDDHeight      = 0;
      92         608 :     mnSaveValue     = LISTBOX_ENTRY_NOTFOUND;
      93         608 :     mnLineCount     = 0;
      94         608 :     m_nMaxWidthChars = -1;
      95         608 :     mbDDAutoSize    = true;
      96         608 :     mbEdgeBlending  = false;
      97         608 : }
      98             : 
      99         608 : void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle )
     100             : {
     101         608 :     nStyle = ImplInitStyle( nStyle );
     102         608 :     if ( !(nStyle & WB_NOBORDER) && ( nStyle & WB_DROPDOWN ) )
     103         580 :         nStyle |= WB_BORDER;
     104             : 
     105         608 :     Control::ImplInit( pParent, nStyle, NULL );
     106         608 :     SetBackground();
     107             : 
     108         608 :     ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener> xDrop = new DNDEventDispatcher(this);
     109             : 
     110         608 :     if( nStyle & WB_DROPDOWN )
     111             :     {
     112             :         sal_Int32 nLeft, nTop, nRight, nBottom;
     113         580 :         GetBorder( nLeft, nTop, nRight, nBottom );
     114         580 :         mnDDHeight = (sal_uInt16)(GetTextHeight() + nTop + nBottom + 4);
     115             : 
     116        1160 :         if( IsNativeWidgetEnabled() &&
     117         580 :             IsNativeControlSupported( CTRL_LISTBOX, PART_ENTIRE_CONTROL ) )
     118             :         {
     119           0 :                 ImplControlValue aControlValue;
     120           0 :                 Rectangle aCtrlRegion( Point( 0, 0 ), Size( 20, mnDDHeight ) );
     121           0 :                 Rectangle aBoundingRgn( aCtrlRegion );
     122           0 :                 Rectangle aContentRgn( aCtrlRegion );
     123           0 :                 if( GetNativeControlRegion( CTRL_LISTBOX, PART_ENTIRE_CONTROL, aCtrlRegion,
     124             :                                             CTRL_STATE_ENABLED, aControlValue, OUString(),
     125           0 :                                             aBoundingRgn, aContentRgn ) )
     126             :                 {
     127           0 :                     sal_Int32 nHeight = aBoundingRgn.GetHeight();
     128           0 :                     if( nHeight > mnDDHeight )
     129           0 :                         mnDDHeight = static_cast<sal_uInt16>(nHeight);
     130           0 :                 }
     131             :         }
     132             : 
     133         580 :         mpFloatWin = new ImplListBoxFloatingWindow( this );
     134         580 :         mpFloatWin->SetAutoWidth( true );
     135         580 :         mpFloatWin->SetPopupModeEndHdl( LINK( this, ListBox, ImplPopupModeEndHdl ) );
     136         580 :         mpFloatWin->GetDropTarget()->addDropTargetListener(xDrop);
     137             : 
     138         580 :         mpImplWin = new ImplWin( this, (nStyle & (WB_LEFT|WB_RIGHT|WB_CENTER))|WB_NOBORDER );
     139         580 :         mpImplWin->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 ));
     140         580 :         mpImplWin->userDrawSignal.connect( boost::bind( &ListBox::ImplUserDrawHandler, this, _1 ) );
     141         580 :         mpImplWin->Show();
     142         580 :         mpImplWin->GetDropTarget()->addDropTargetListener(xDrop);
     143         580 :         mpImplWin->SetEdgeBlending(GetEdgeBlending());
     144             : 
     145         580 :         mpBtn = new ImplBtn( this, WB_NOLIGHTBORDER | WB_RECTSTYLE );
     146         580 :         ImplInitDropDownButton( mpBtn );
     147         580 :         mpBtn->buttonDownSignal.connect( boost::bind( &ListBox::ImplClickButtonHandler, this, _1 ));
     148         580 :         mpBtn->Show();
     149         580 :         mpBtn->GetDropTarget()->addDropTargetListener(xDrop);
     150             :     }
     151             : 
     152         608 :     vcl::Window* pLBParent = this;
     153         608 :     if ( mpFloatWin )
     154         580 :         pLBParent = mpFloatWin;
     155         608 :     mpImplLB = new ImplListBox( pLBParent, nStyle&(~WB_BORDER) );
     156         608 :     mpImplLB->SetSelectHdl( LINK( this, ListBox, ImplSelectHdl ) );
     157         608 :     mpImplLB->SetScrollHdl( LINK( this, ListBox, ImplScrollHdl ) );
     158         608 :     mpImplLB->SetCancelHdl( LINK( this, ListBox, ImplCancelHdl ) );
     159         608 :     mpImplLB->SetDoubleClickHdl( LINK( this, ListBox, ImplDoubleClickHdl ) );
     160         608 :     mpImplLB->userDrawSignal.connect( boost::bind( &ListBox::ImplUserDrawHandler, this, _1 ) );
     161         608 :     mpImplLB->SetFocusHdl( LINK( this, ListBox, ImplFocusHdl ) );
     162         608 :     mpImplLB->SetListItemSelectHdl( LINK( this, ListBox, ImplListItemSelectHdl ) );
     163         608 :     mpImplLB->SetPosPixel( Point() );
     164         608 :     mpImplLB->SetEdgeBlending(GetEdgeBlending());
     165         608 :     mpImplLB->Show();
     166             : 
     167         608 :     mpImplLB->GetDropTarget()->addDropTargetListener(xDrop);
     168         608 :     mpImplLB->SetDropTraget(xDrop);
     169             : 
     170         608 :     if ( mpFloatWin )
     171             :     {
     172         580 :         mpFloatWin->SetImplListBox( mpImplLB );
     173         580 :         mpImplLB->SetSelectionChangedHdl( LINK( this, ListBox, ImplSelectionChangedHdl ) );
     174             :     }
     175             :     else
     176          28 :         mpImplLB->GetMainWindow().AllowGrabFocus( true );
     177             : 
     178         608 :     SetCompoundControl( true );
     179         608 : }
     180             : 
     181         718 : WinBits ListBox::ImplInitStyle( WinBits nStyle )
     182             : {
     183         718 :     if ( !(nStyle & WB_NOTABSTOP) )
     184         718 :         nStyle |= WB_TABSTOP;
     185         718 :     if ( !(nStyle & WB_NOGROUP) )
     186         718 :         nStyle |= WB_GROUP;
     187         718 :     return nStyle;
     188             : }
     189             : 
     190         156 : void ListBox::ImplLoadRes( const ResId& rResId )
     191             : {
     192         156 :     Control::ImplLoadRes( rResId );
     193             : 
     194             :     // The resource short is actually to be treated as unsigned short.
     195         156 :     sal_uInt16 nResPos = static_cast<sal_uInt16>(ReadShortRes());
     196         156 :     sal_Int32 nSelPos = (nResPos == SAL_MAX_UINT16) ? LISTBOX_ENTRY_NOTFOUND : nResPos;
     197         156 :     sal_Int32 nNumber = ReadLongRes();
     198             : 
     199         156 :     for( sal_Int32 i = 0; i < nNumber; i++ )
     200             :     {
     201           0 :         sal_Int32 nPos = InsertEntry( ReadStringRes(), LISTBOX_APPEND );
     202             : 
     203           0 :         sal_IntPtr nId = ReadLongRes();
     204           0 :         if( nId )
     205           0 :             SetEntryData( nPos, reinterpret_cast<void *>(nId) ); // ID as UserData
     206             :     }
     207             : 
     208         156 :     if( nSelPos < nNumber )
     209           0 :         SelectEntryPos( nSelPos );
     210         156 : }
     211             : 
     212           0 : IMPL_LINK_NOARG(ListBox, ImplSelectHdl)
     213             : {
     214           0 :     bool bPopup = IsInDropDown();
     215           0 :     if( IsDropDownBox() )
     216             :     {
     217           0 :         if( !mpImplLB->IsTravelSelect() )
     218             :         {
     219           0 :             mpFloatWin->EndPopupMode();
     220           0 :             mpImplWin->GrabFocus();
     221             :         }
     222             : 
     223           0 :         mpImplWin->SetItemPos( GetSelectEntryPos() );
     224           0 :         mpImplWin->SetString( GetSelectEntry() );
     225           0 :         if( mpImplLB->GetEntryList()->HasImages() )
     226             :         {
     227           0 :             Image aImage = mpImplLB->GetEntryList()->GetEntryImage( GetSelectEntryPos() );
     228           0 :             mpImplWin->SetImage( aImage );
     229             :         }
     230           0 :         mpImplWin->Invalidate();
     231             :     }
     232             : 
     233           0 :     if ( ( !IsTravelSelect() || mpImplLB->IsSelectionChanged() ) || ( bPopup && !IsMultiSelectionEnabled() ) )
     234           0 :         Select();
     235             : 
     236           0 :     return 1;
     237             : }
     238             : 
     239           0 : IMPL_LINK( ListBox, ImplFocusHdl, void *, nPos )
     240             : {
     241           0 :     ImplCallEventListeners( VCLEVENT_LISTBOX_FOCUS , nPos);
     242           0 :     return 1;
     243             : }
     244             : 
     245           0 : IMPL_LINK( ListBox, ImplListItemSelectHdl, void*, EMPTYARG )
     246             : {
     247           0 :     ImplCallEventListeners( VCLEVENT_DROPDOWN_SELECT );
     248           0 :     return 1;
     249             : }
     250             : 
     251         618 : IMPL_LINK_NOARG(ListBox, ImplScrollHdl)
     252             : {
     253         309 :     ImplCallEventListeners( VCLEVENT_LISTBOX_SCROLLED );
     254         309 :     return 1;
     255             : }
     256             : 
     257           0 : IMPL_LINK_NOARG(ListBox, ImplCancelHdl)
     258             : {
     259           0 :     if( IsInDropDown() )
     260           0 :         mpFloatWin->EndPopupMode();
     261             : 
     262           0 :     return 1;
     263             : }
     264             : 
     265         712 : IMPL_LINK( ListBox, ImplSelectionChangedHdl, void*, n )
     266             : {
     267         356 :     if ( !mpImplLB->IsTrackingSelect() )
     268             :     {
     269         356 :         sal_Int32 nChanged = (sal_Int32)reinterpret_cast<sal_uLong>(n);
     270         356 :         const ImplEntryList* pEntryList = mpImplLB->GetEntryList();
     271         356 :         if ( pEntryList->IsEntryPosSelected( nChanged ) )
     272             :         {
     273             :             // FIXME? This should've been turned into an ImplPaintEntry some time ago...
     274         350 :             if ( nChanged < pEntryList->GetMRUCount() )
     275           0 :                 nChanged = pEntryList->FindEntry( pEntryList->GetEntryText( nChanged ) );
     276         350 :             mpImplWin->SetItemPos( nChanged );
     277         350 :             mpImplWin->SetString( mpImplLB->GetEntryList()->GetEntryText( nChanged ) );
     278         350 :             if( mpImplLB->GetEntryList()->HasImages() )
     279             :             {
     280          57 :                 Image aImage = mpImplLB->GetEntryList()->GetEntryImage( nChanged );
     281          57 :                 mpImplWin->SetImage( aImage );
     282             :             }
     283             :         }
     284             :         else
     285             :         {
     286           6 :             mpImplWin->SetItemPos( LISTBOX_ENTRY_NOTFOUND );
     287           6 :             mpImplWin->SetString( OUString() );
     288           6 :             Image aImage;
     289           6 :             mpImplWin->SetImage( aImage );
     290             :         }
     291         356 :         mpImplWin->Invalidate();
     292             :     }
     293         356 :     return 1;
     294             : }
     295             : 
     296           0 : IMPL_LINK_NOARG(ListBox, ImplDoubleClickHdl)
     297             : {
     298           0 :     DoubleClick();
     299           0 :     return 1;
     300             : }
     301             : 
     302           0 : void ListBox::ImplClickButtonHandler( Control* )
     303             : {
     304           0 :     if( !mpFloatWin->IsInPopupMode() )
     305             :     {
     306           0 :         ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
     307           0 :         mpImplWin->GrabFocus();
     308           0 :         mpBtn->SetPressed( true );
     309           0 :         mpFloatWin->StartFloat( true );
     310           0 :         ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
     311             : 
     312           0 :         ImplClearLayoutData();
     313           0 :         if( mpImplLB )
     314           0 :             mpImplLB->GetMainWindow().ImplClearLayoutData();
     315           0 :         if( mpImplWin )
     316           0 :             mpImplWin->ImplClearLayoutData();
     317             :     }
     318           0 : }
     319             : 
     320           4 : IMPL_LINK_NOARG(ListBox, ImplPopupModeEndHdl)
     321             : {
     322           2 :     if( mpFloatWin->IsPopupModeCanceled() )
     323             :     {
     324           0 :         if ( ( mpFloatWin->GetPopupModeStartSaveSelection() != LISTBOX_ENTRY_NOTFOUND )
     325           0 :                 && !IsEntryPosSelected( mpFloatWin->GetPopupModeStartSaveSelection() ) )
     326             :         {
     327           0 :             mpImplLB->SelectEntry( mpFloatWin->GetPopupModeStartSaveSelection(), true );
     328           0 :             bool bTravelSelect = mpImplLB->IsTravelSelect();
     329           0 :             mpImplLB->SetTravelSelect( true );
     330             : 
     331           0 :             ImplDelData aCheckDelete;
     332           0 :             ImplAddDel( &aCheckDelete );
     333           0 :             Select();
     334           0 :             if ( aCheckDelete.IsDead() )
     335           0 :                 return 0;
     336           0 :             ImplRemoveDel( &aCheckDelete );
     337             : 
     338           0 :             mpImplLB->SetTravelSelect( bTravelSelect );
     339             :         }
     340             :     }
     341             : 
     342           2 :     ImplClearLayoutData();
     343           2 :     if( mpImplLB )
     344           2 :         mpImplLB->GetMainWindow().ImplClearLayoutData();
     345           2 :     if( mpImplWin )
     346           2 :         mpImplWin->ImplClearLayoutData();
     347             : 
     348           2 :     mpBtn->SetPressed( false );
     349           2 :     ImplCallEventListeners( VCLEVENT_DROPDOWN_CLOSE );
     350           2 :     return 0;
     351             : }
     352             : 
     353           6 : void ListBox::ToggleDropDown()
     354             : {
     355           6 :     if( IsDropDownBox() )
     356             :     {
     357           6 :         if( mpFloatWin->IsInPopupMode() )
     358           2 :             mpFloatWin->EndPopupMode();
     359             :         else
     360             :         {
     361           4 :             ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
     362           4 :             mpImplWin->GrabFocus();
     363           4 :             mpBtn->SetPressed( true );
     364           4 :             mpFloatWin->StartFloat( true );
     365           4 :             ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
     366             :         }
     367             :     }
     368           6 : }
     369             : 
     370           0 : void ListBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
     371             : {
     372           0 :     mpImplLB->GetMainWindow().ImplInitSettings( true, true, true );
     373             : 
     374           0 :     Point aPos = pDev->LogicToPixel( rPos );
     375           0 :     Size aSize = pDev->LogicToPixel( rSize );
     376           0 :     vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev );
     377           0 :     OutDevType eOutDevType = pDev->GetOutDevType();
     378             : 
     379           0 :     pDev->Push();
     380           0 :     pDev->SetMapMode();
     381           0 :     pDev->SetFont( aFont );
     382           0 :     pDev->SetTextFillColor();
     383             : 
     384             :     // Border/Background
     385           0 :     pDev->SetLineColor();
     386           0 :     pDev->SetFillColor();
     387           0 :     bool bBorder = !(nFlags & WINDOW_DRAW_NOBORDER ) && (GetStyle() & WB_BORDER);
     388           0 :     bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && IsControlBackground();
     389           0 :     if ( bBorder || bBackground )
     390             :     {
     391           0 :         Rectangle aRect( aPos, aSize );
     392           0 :         if ( bBorder )
     393             :         {
     394           0 :             ImplDrawFrame( pDev, aRect );
     395             :         }
     396           0 :         if ( bBackground )
     397             :         {
     398           0 :             pDev->SetFillColor( GetControlBackground() );
     399           0 :             pDev->DrawRect( aRect );
     400             :         }
     401             :     }
     402             : 
     403             :     // Content
     404           0 :     if ( ( nFlags & WINDOW_DRAW_MONO ) || ( eOutDevType == OUTDEV_PRINTER ) )
     405             :     {
     406           0 :         pDev->SetTextColor( Color( COL_BLACK ) );
     407             :     }
     408             :     else
     409             :     {
     410           0 :         if ( !(nFlags & WINDOW_DRAW_NODISABLE ) && !IsEnabled() )
     411             :         {
     412           0 :             const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
     413           0 :             pDev->SetTextColor( rStyleSettings.GetDisableColor() );
     414             :         }
     415             :         else
     416             :         {
     417           0 :             pDev->SetTextColor( GetTextColor() );
     418             :         }
     419             :     }
     420             : 
     421           0 :     long nOnePixel = GetDrawPixel( pDev, 1 );
     422           0 :     sal_uInt16 nTextStyle = TEXT_DRAW_VCENTER;
     423           0 :     Rectangle aTextRect( aPos, aSize );
     424             : 
     425           0 :     if ( GetStyle() & WB_CENTER )
     426           0 :         nTextStyle |= TEXT_DRAW_CENTER;
     427           0 :     else if ( GetStyle() & WB_RIGHT )
     428           0 :         nTextStyle |= TEXT_DRAW_RIGHT;
     429             :     else
     430           0 :         nTextStyle |= TEXT_DRAW_LEFT;
     431             : 
     432           0 :     aTextRect.Left() += 3*nOnePixel;
     433           0 :     aTextRect.Right() -= 3*nOnePixel;
     434             : 
     435           0 :     if ( IsDropDownBox() )
     436             :     {
     437           0 :         OUString   aText = GetSelectEntry();
     438           0 :         long       nTextHeight = pDev->GetTextHeight();
     439           0 :         long       nTextWidth = pDev->GetTextWidth( aText );
     440           0 :         long       nOffX = 3*nOnePixel;
     441           0 :         long       nOffY = (aSize.Height()-nTextHeight) / 2;
     442             : 
     443             :         // Clipping?
     444           0 :         if ( (nOffY < 0) ||
     445           0 :              ((nOffY+nTextHeight) > aSize.Height()) ||
     446           0 :              ((nOffX+nTextWidth) > aSize.Width()) )
     447             :         {
     448           0 :             Rectangle aClip( aPos, aSize );
     449           0 :             if ( nTextHeight > aSize.Height() )
     450           0 :                 aClip.Bottom() += nTextHeight-aSize.Height()+1;  // So that HP Printers don't optimize this away
     451           0 :             pDev->IntersectClipRegion( aClip );
     452             :         }
     453             : 
     454           0 :         pDev->DrawText( aTextRect, aText, nTextStyle );
     455             :     }
     456             :     else
     457             :     {
     458           0 :         long        nTextHeight = pDev->GetTextHeight();
     459           0 :         sal_uInt16  nLines = ( nTextHeight > 0 ) ? (sal_uInt16)(aSize.Height() / nTextHeight) : 1;
     460           0 :         Rectangle   aClip( aPos, aSize );
     461             : 
     462           0 :         pDev->IntersectClipRegion( aClip );
     463             : 
     464           0 :         if ( !nLines )
     465           0 :             nLines = 1;
     466             : 
     467           0 :         for ( sal_uInt16 n = 0; n < nLines; n++ )
     468             :         {
     469           0 :             sal_Int32 nEntry = n+mpImplLB->GetTopEntry();
     470           0 :             bool bSelected = mpImplLB->GetEntryList()->IsEntryPosSelected( nEntry );
     471           0 :             if ( bSelected )
     472             :             {
     473           0 :                 pDev->SetFillColor( COL_BLACK );
     474           0 :                 pDev->DrawRect( Rectangle(  Point( aPos.X(), aPos.Y() + n*nTextHeight ),
     475           0 :                                             Point( aPos.X() + aSize.Width(), aPos.Y() + (n+1)*nTextHeight + 2*nOnePixel ) ) );
     476           0 :                 pDev->SetFillColor();
     477           0 :                 pDev->SetTextColor( COL_WHITE );
     478             :             }
     479             : 
     480           0 :             aTextRect.Top() = aPos.Y() + n*nTextHeight;
     481           0 :             aTextRect.Bottom() = aTextRect.Top() + nTextHeight;
     482             : 
     483           0 :             pDev->DrawText( aTextRect, mpImplLB->GetEntryList()->GetEntryText( nEntry ), nTextStyle );
     484             : 
     485           0 :             if ( bSelected )
     486           0 :                 pDev->SetTextColor( COL_BLACK );
     487             :         }
     488             :     }
     489             : 
     490           0 :     pDev->Pop();
     491           0 : }
     492             : 
     493           2 : void ListBox::GetFocus()
     494             : {
     495           2 :     if ( mpImplLB )
     496             :     {
     497           0 :         if( IsDropDownBox() )
     498           0 :             mpImplWin->GrabFocus();
     499             :         else
     500           0 :             mpImplLB->GrabFocus();
     501             :     }
     502             : 
     503           2 :     Control::GetFocus();
     504           2 : }
     505             : 
     506           0 : vcl::Window* ListBox::GetPreferredKeyInputWindow()
     507             : {
     508           0 :     if ( mpImplLB )
     509             :     {
     510           0 :         if( IsDropDownBox() )
     511           0 :             return mpImplWin->GetPreferredKeyInputWindow();
     512             :         else
     513           0 :             return mpImplLB->GetPreferredKeyInputWindow();
     514             :     }
     515             : 
     516           0 :     return Control::GetPreferredKeyInputWindow();
     517             : }
     518             : 
     519           0 : void ListBox::LoseFocus()
     520             : {
     521           0 :     if( IsDropDownBox() )
     522           0 :         mpImplWin->HideFocus();
     523             :     else
     524           0 :         mpImplLB->HideFocus();
     525             : 
     526           0 :     Control::LoseFocus();
     527           0 : }
     528             : 
     529         276 : void ListBox::DataChanged( const DataChangedEvent& rDCEvt )
     530             : {
     531         276 :     Control::DataChanged( rDCEvt );
     532             : 
     533         828 :     if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
     534         790 :          (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
     535         552 :          ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
     536         276 :           (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
     537             :     {
     538         238 :         SetBackground();    // Due to a hack in Window::UpdateSettings the background must be reset
     539             :                             // otherwise it will overpaint NWF drawn listboxes
     540         238 :         Resize();
     541         238 :         mpImplLB->Resize(); // Is not called by ListBox::Resize() if the ImplLB does not change
     542             : 
     543         238 :         if ( mpImplWin )
     544             :         {
     545         162 :             mpImplWin->SetSettings( GetSettings() ); // If not yet set...
     546         162 :             ImplInitFieldSettings( mpImplWin, true, true, true );
     547             : 
     548         162 :             mpBtn->SetSettings( GetSettings() );
     549         162 :             ImplInitDropDownButton( mpBtn );
     550             :         }
     551             : 
     552         238 :         if ( IsDropDownBox() )
     553         162 :             Invalidate();
     554             :     }
     555         276 : }
     556             : 
     557          40 : void ListBox::EnableAutoSize( bool bAuto )
     558             : {
     559          40 :     mbDDAutoSize = bAuto;
     560          40 :     if ( mpFloatWin )
     561             :     {
     562          12 :         if ( bAuto && !mpFloatWin->GetDropDownLineCount() )
     563             :         {
     564             :             // use GetListBoxMaximumLineCount here; before, was on fixed number of five
     565           0 :             AdaptDropDownLineCountToMaximum();
     566             :         }
     567          12 :         else if ( !bAuto )
     568             :         {
     569          12 :             mpFloatWin->SetDropDownLineCount( 0 );
     570             :         }
     571             :     }
     572          40 : }
     573             : 
     574           0 : void ListBox::EnableDDAutoWidth( bool b )
     575             : {
     576           0 :     if ( mpFloatWin )
     577           0 :         mpFloatWin->SetAutoWidth( b );
     578           0 : }
     579             : 
     580        2072 : void ListBox::SetDropDownLineCount( sal_uInt16 nLines )
     581             : {
     582        2072 :     mnLineCount = nLines;
     583        2072 :     if ( mpFloatWin )
     584        2042 :         mpFloatWin->SetDropDownLineCount( mnLineCount );
     585        2072 : }
     586             : 
     587         288 : void ListBox::AdaptDropDownLineCountToMaximum()
     588             : {
     589             :     // adapt to maximum allowed number
     590         288 :     SetDropDownLineCount(GetSettings().GetStyleSettings().GetListBoxMaximumLineCount());
     591         288 : }
     592             : 
     593           0 : sal_uInt16 ListBox::GetDropDownLineCount() const
     594             : {
     595           0 :     if ( mpFloatWin )
     596           0 :         return mpFloatWin->GetDropDownLineCount();
     597           0 :     return mnLineCount;
     598             : }
     599             : 
     600        1802 : void ListBox::setPosSizePixel( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags )
     601             : {
     602        1802 :     if( IsDropDownBox() && ( nFlags & WINDOW_POSSIZE_SIZE ) )
     603             :     {
     604        1375 :         Size aPrefSz = mpFloatWin->GetPrefSize();
     605        1375 :         if ( ( nFlags & WINDOW_POSSIZE_HEIGHT ) && ( nHeight >= 2*mnDDHeight ) )
     606        1062 :             aPrefSz.Height() = nHeight-mnDDHeight;
     607        1375 :         if ( nFlags & WINDOW_POSSIZE_WIDTH )
     608        1375 :             aPrefSz.Width() = nWidth;
     609        1375 :         mpFloatWin->SetPrefSize( aPrefSz );
     610             : 
     611        1375 :         if ( IsAutoSizeEnabled() && ! (nFlags & WINDOW_POSSIZE_DROPDOWN) )
     612        1351 :             nHeight = mnDDHeight;
     613             :     }
     614             : 
     615        1802 :     Control::setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
     616        1802 : }
     617             : 
     618        1777 : void ListBox::Resize()
     619             : {
     620        1777 :     Size aOutSz = GetOutputSizePixel();
     621        1777 :     if( IsDropDownBox() )
     622             :     {
     623             :         // Initialize the dropdown button size with the standard scrollbar width
     624        1531 :         long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
     625        1531 :         long nBottom = aOutSz.Height();
     626             : 
     627             :         // Note: in case of no border, pBorder will actually be this
     628        1531 :         vcl::Window *pBorder = GetWindow( WINDOW_BORDER );
     629        1531 :         ImplControlValue aControlValue;
     630        1531 :         Point aPoint;
     631        1531 :         Rectangle aContent, aBound;
     632             : 
     633             :         // Use the full extent of the control
     634        1531 :         Rectangle aArea( aPoint, pBorder->GetOutputSizePixel() );
     635             : 
     636        3062 :         if ( GetNativeControlRegion( CTRL_LISTBOX, PART_BUTTON_DOWN,
     637        3062 :                     aArea, 0, aControlValue, OUString(), aBound, aContent) )
     638             :         {
     639           0 :             long nTop = 0;
     640             :             // Convert back from border space to local coordinates
     641           0 :             aPoint = pBorder->ScreenToOutputPixel( OutputToScreenPixel( aPoint ) );
     642           0 :             aContent.Move( -aPoint.X(), -aPoint.Y() );
     643             : 
     644             :             // Use the themes drop down size for the button
     645           0 :             aOutSz.Width() = aContent.Left();
     646           0 :             mpBtn->setPosSizePixel( aContent.Left(), nTop, aContent.Right(), (nBottom-nTop) );
     647             : 
     648             :             // Adjust the size of the edit field
     649           0 :             if ( GetNativeControlRegion( CTRL_LISTBOX, PART_SUB_EDIT,
     650           0 :                         aArea, 0, aControlValue, OUString(), aBound, aContent) )
     651             :             {
     652             :                 // Convert back from border space to local coordinates
     653           0 :                 aContent.Move( -aPoint.X(), -aPoint.Y() );
     654             : 
     655             :                 // Use the themes drop down size
     656           0 :                 if( ! (GetStyle() & WB_BORDER) && ImplGetSVData()->maNWFData.mbNoFocusRects )
     657             :                 {
     658             :                     // No border but focus ring behavior -> we have a problem; the
     659             :                     // native rect relies on the border to draw the focus
     660             :                     // let's do the best we can and center vertically, so it doesn't look
     661             :                     // completely wrong.
     662           0 :                     Size aSz( GetOutputSizePixel() );
     663           0 :                     long nDiff = aContent.Top() - (aSz.Height() - aContent.GetHeight())/2;
     664           0 :                     aContent.Top() -= nDiff;
     665           0 :                     aContent.Bottom() -= nDiff;
     666             :                 }
     667           0 :                 mpImplWin->SetPosSizePixel( aContent.TopLeft(), aContent.GetSize() );
     668             :             }
     669             :             else
     670           0 :                 mpImplWin->SetSizePixel( aOutSz );
     671             :         }
     672             :         else
     673             :         {
     674        1531 :             nSBWidth = CalcZoom( nSBWidth );
     675        1531 :             mpImplWin->setPosSizePixel( 0, 0, aOutSz.Width() - nSBWidth, aOutSz.Height() );
     676        1531 :             mpBtn->setPosSizePixel( aOutSz.Width() - nSBWidth, 0, nSBWidth, aOutSz.Height() );
     677        1531 :         }
     678             :     }
     679             :     else
     680             :     {
     681         246 :         mpImplLB->SetSizePixel( aOutSz );
     682             :     }
     683             : 
     684             :     // Retain FloatingWindow size even when it's invisible, as we still process KEY_PGUP/DOWN ...
     685        1777 :     if ( mpFloatWin )
     686        1531 :         mpFloatWin->SetSizePixel( mpFloatWin->CalcFloatSize() );
     687             : 
     688        1777 :     Control::Resize();
     689        1777 : }
     690             : 
     691           0 : void ListBox::FillLayoutData() const
     692             : {
     693           0 :     mpControlData->mpLayoutData = new vcl::ControlLayoutData();
     694           0 :     const Control& rMainWin = mpImplLB->GetMainWindow();
     695           0 :     if( mpFloatWin )
     696             :     {
     697             :         // Dropdown mode
     698           0 :         AppendLayoutData( *mpImplWin );
     699           0 :         mpImplWin->SetLayoutDataParent( this );
     700           0 :         if( mpFloatWin->IsReallyVisible() )
     701             :         {
     702           0 :             AppendLayoutData( rMainWin );
     703           0 :             rMainWin.SetLayoutDataParent( this );
     704             :         }
     705             :     }
     706             :     else
     707             :     {
     708           0 :         AppendLayoutData( rMainWin );
     709           0 :         rMainWin.SetLayoutDataParent( this );
     710             :     }
     711           0 : }
     712             : 
     713           0 : long ListBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const
     714             : {
     715           0 :     if( !HasLayoutData() )
     716           0 :         FillLayoutData();
     717             : 
     718             :     // Check whether rPoint fits at all
     719           0 :     long nIndex = Control::GetIndexForPoint( rPoint );
     720           0 :     if( nIndex != -1 )
     721             :     {
     722             :         // Point must be either in main list window
     723             :         // or in impl window (dropdown case)
     724           0 :         ImplListBoxWindow& rMain = mpImplLB->GetMainWindow();
     725             : 
     726             :         // Convert coordinates to ImplListBoxWindow pixel coordinate space
     727           0 :         Point aConvPoint = LogicToPixel( rPoint );
     728           0 :         aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint );
     729           0 :         aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint );
     730           0 :         aConvPoint = rMain.PixelToLogic( aConvPoint );
     731             : 
     732             :         // Try to find entry
     733           0 :         sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint );
     734           0 :         if( nEntry == LISTBOX_ENTRY_NOTFOUND )
     735             :         {
     736             :             // Not found, maybe dropdown case
     737           0 :             if( mpImplWin && mpImplWin->IsReallyVisible() )
     738             :             {
     739             :                 // Convert to impl window pixel coordinates
     740           0 :                 aConvPoint = LogicToPixel( rPoint );
     741           0 :                 aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint );
     742           0 :                 aConvPoint = mpImplWin->AbsoluteScreenToOutputPixel( aConvPoint );
     743             : 
     744             :                 // Check whether converted point is inside impl window
     745           0 :                 Size aImplWinSize = mpImplWin->GetOutputSizePixel();
     746           0 :                 if( aConvPoint.X() >= 0 && aConvPoint.Y() >= 0 && aConvPoint.X() < aImplWinSize.Width() && aConvPoint.Y() < aImplWinSize.Height() )
     747             :                 {
     748             :                     // Inside the impl window, the position is the current item pos
     749           0 :                     rPos = mpImplWin->GetItemPos();
     750             :                 }
     751             :                 else
     752           0 :                     nIndex = -1;
     753             :             }
     754             :             else
     755           0 :                 nIndex = -1;
     756             :         }
     757             :         else
     758           0 :             rPos = nEntry;
     759             : 
     760             :         DBG_ASSERT( nIndex != -1, "found index for point, but relative index failed" );
     761             :     }
     762             : 
     763             :     // Get line relative index
     764           0 :     if( nIndex != -1 )
     765           0 :         nIndex = ToRelativeLineIndex( nIndex );
     766             : 
     767           0 :     return nIndex;
     768             : }
     769             : 
     770        3055 : void ListBox::StateChanged( StateChangedType nType )
     771             : {
     772        3055 :     if( nType == StateChangedType::READONLY )
     773             :     {
     774          24 :         if( mpImplWin )
     775          12 :             mpImplWin->Enable( !IsReadOnly() );
     776          24 :         if( mpBtn )
     777          12 :             mpBtn->Enable( !IsReadOnly() );
     778             :     }
     779        3031 :     else if( nType == StateChangedType::ENABLE )
     780             :     {
     781          46 :         mpImplLB->Enable( IsEnabled() );
     782          46 :         if( mpImplWin )
     783             :         {
     784          34 :             mpImplWin->Enable( IsEnabled() );
     785          68 :             if ( IsNativeControlSupported(CTRL_LISTBOX, PART_ENTIRE_CONTROL)
     786          34 :                     && ! IsNativeControlSupported(CTRL_LISTBOX, PART_BUTTON_DOWN) )
     787             :             {
     788           0 :                 GetWindow( WINDOW_BORDER )->Invalidate( INVALIDATE_NOERASE );
     789             :             }
     790             :             else
     791          34 :                 mpImplWin->Invalidate();
     792             :         }
     793          46 :         if( mpBtn )
     794          34 :             mpBtn->Enable( IsEnabled() );
     795             :     }
     796        2985 :     else if( nType == StateChangedType::UPDATEMODE )
     797             :     {
     798         700 :         mpImplLB->SetUpdateMode( IsUpdateMode() );
     799             :     }
     800        2285 :     else if ( nType == StateChangedType::ZOOM )
     801             :     {
     802           2 :         mpImplLB->SetZoom( GetZoom() );
     803           2 :         if ( mpImplWin )
     804             :         {
     805           0 :             mpImplWin->SetZoom( GetZoom() );
     806           0 :             mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
     807           0 :             mpImplWin->Invalidate();
     808             :         }
     809           2 :         Resize();
     810             :     }
     811        2283 :     else if ( nType == StateChangedType::CONTROLFONT )
     812             :     {
     813         310 :         mpImplLB->SetControlFont( GetControlFont() );
     814         310 :         if ( mpImplWin )
     815             :         {
     816         230 :             mpImplWin->SetControlFont( GetControlFont() );
     817         230 :             mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
     818         230 :             mpImplWin->Invalidate();
     819             :         }
     820         310 :         Resize();
     821             :     }
     822        1973 :     else if ( nType == StateChangedType::CONTROLFOREGROUND )
     823             :     {
     824           4 :         mpImplLB->SetControlForeground( GetControlForeground() );
     825           4 :         if ( mpImplWin )
     826             :         {
     827           0 :             mpImplWin->SetControlForeground( GetControlForeground() );
     828           0 :             mpImplWin->SetTextColor( GetControlForeground() );
     829           0 :             mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
     830           0 :             mpImplWin->Invalidate();
     831             :         }
     832             :     }
     833        1969 :     else if ( nType == StateChangedType::CONTROLBACKGROUND )
     834             :     {
     835           4 :         mpImplLB->SetControlBackground( GetControlBackground() );
     836           4 :         if ( mpImplWin )
     837             :         {
     838           0 :             if ( mpImplWin->IsNativeControlSupported(CTRL_LISTBOX, PART_ENTIRE_CONTROL) )
     839             :             {
     840             :                 // Transparent background
     841           0 :                 mpImplWin->SetBackground();
     842           0 :                 mpImplWin->SetControlBackground();
     843             :             }
     844             :             else
     845             :             {
     846           0 :                 mpImplWin->SetBackground( mpImplLB->GetMainWindow().GetControlBackground() );
     847           0 :                 mpImplWin->SetControlBackground( mpImplLB->GetMainWindow().GetControlBackground() );
     848             :             }
     849           0 :             mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
     850           0 :             mpImplWin->Invalidate();
     851             :         }
     852             :     }
     853        1965 :     else if ( nType == StateChangedType::STYLE )
     854             :     {
     855         110 :         SetStyle( ImplInitStyle( GetStyle() ) );
     856         110 :         mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) ? true : false );
     857         110 :         bool bSimpleMode = ( GetStyle() & WB_SIMPLEMODE ) ? true : false;
     858         110 :         mpImplLB->SetMultiSelectionSimpleMode( bSimpleMode );
     859             :     }
     860        1855 :     else if( nType == StateChangedType::MIRRORING )
     861             :     {
     862          96 :         if( mpBtn )
     863             :         {
     864          32 :             mpBtn->EnableRTL( IsRTLEnabled() );
     865          32 :             ImplInitDropDownButton( mpBtn );
     866             :         }
     867          96 :         mpImplLB->EnableRTL( IsRTLEnabled() );
     868          96 :         if( mpImplWin )
     869          32 :             mpImplWin->EnableRTL( IsRTLEnabled() );
     870          96 :         Resize();
     871             :     }
     872             : 
     873        3055 :     Control::StateChanged( nType );
     874        3055 : }
     875             : 
     876           6 : bool ListBox::PreNotify( NotifyEvent& rNEvt )
     877             : {
     878           6 :     bool nDone = false;
     879           6 :     if ( mpImplLB )
     880             :     {
     881           2 :         if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && ( rNEvt.GetWindow() == mpImplWin ) )
     882             :         {
     883           0 :             KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
     884           0 :             switch( aKeyEvt.GetKeyCode().GetCode() )
     885             :             {
     886             :                 case KEY_DOWN:
     887             :                 {
     888           0 :                     if( mpFloatWin && !mpFloatWin->IsInPopupMode() &&
     889           0 :                         aKeyEvt.GetKeyCode().IsMod2() )
     890             :                     {
     891           0 :                         ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
     892           0 :                         mpBtn->SetPressed( true );
     893           0 :                         mpFloatWin->StartFloat( false );
     894           0 :                         ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
     895           0 :                         nDone = true;
     896             :                     }
     897             :                     else
     898             :                     {
     899           0 :                         nDone = mpImplLB->ProcessKeyInput( aKeyEvt );
     900             :                     }
     901             :                 }
     902           0 :                 break;
     903             :                 case KEY_UP:
     904             :                 {
     905           0 :                     if( mpFloatWin && mpFloatWin->IsInPopupMode() &&
     906           0 :                         aKeyEvt.GetKeyCode().IsMod2() )
     907             :                     {
     908           0 :                         mpFloatWin->EndPopupMode();
     909           0 :                         nDone = true;
     910             :                     }
     911             :                     else
     912             :                     {
     913           0 :                         nDone = mpImplLB->ProcessKeyInput( aKeyEvt );
     914             :                     }
     915             :                 }
     916           0 :                 break;
     917             :                 case KEY_RETURN:
     918             :                 {
     919           0 :                     if( IsInDropDown() )
     920             :                     {
     921           0 :                         mpImplLB->ProcessKeyInput( aKeyEvt );
     922           0 :                         nDone = true;
     923             :                     }
     924             :                 }
     925           0 :                 break;
     926             : 
     927             :                 default:
     928             :                 {
     929           0 :                     nDone = mpImplLB->ProcessKeyInput( aKeyEvt );
     930             :                 }
     931             :             }
     932             :         }
     933           2 :         else if ( rNEvt.GetType() == EVENT_LOSEFOCUS )
     934             :         {
     935           0 :             if ( IsInDropDown() && !HasChildPathFocus( true ) )
     936           0 :                 mpFloatWin->EndPopupMode();
     937             :         }
     938           4 :         else if ( (rNEvt.GetType() == EVENT_COMMAND) &&
     939           2 :                   (rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL) &&
     940           0 :                   (rNEvt.GetWindow() == mpImplWin) )
     941             :         {
     942           0 :             sal_uInt16 nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() );
     943           0 :             if  (   ( nWheelBehavior == MOUSE_WHEEL_ALWAYS )
     944           0 :                 ||  (   ( nWheelBehavior == MOUSE_WHEEL_FOCUS_ONLY )
     945           0 :                     &&  HasChildPathFocus()
     946             :                     )
     947             :                 )
     948             :             {
     949           0 :                 nDone = mpImplLB->HandleWheelAsCursorTravel( *rNEvt.GetCommandEvent() );
     950             :             }
     951             :             else
     952             :             {
     953           0 :                 nDone = false;  // Don't consume this event, let the default handling take it (i.e. scroll the context)
     954             :             }
     955             :         }
     956             :     }
     957             : 
     958           6 :     return nDone || Control::PreNotify( rNEvt );
     959             : }
     960             : 
     961         100 : void ListBox::Select()
     962             : {
     963         100 :     ImplCallEventListenersAndHandler( VCLEVENT_LISTBOX_SELECT, maSelectHdl, this );
     964         100 : }
     965             : 
     966           0 : void ListBox::DoubleClick()
     967             : {
     968           0 :     ImplCallEventListenersAndHandler( VCLEVENT_LISTBOX_DOUBLECLICK, maDoubleClickHdl, this );
     969           0 : }
     970             : 
     971        1860 : void ListBox::Clear()
     972             : {
     973        1860 :     mpImplLB->Clear();
     974        1860 :     if( IsDropDownBox() )
     975             :     {
     976        1806 :         mpImplWin->SetItemPos( LISTBOX_ENTRY_NOTFOUND );
     977        1806 :         mpImplWin->SetString( OUString() );
     978        1806 :         Image aImage;
     979        1806 :         mpImplWin->SetImage( aImage );
     980        1806 :         mpImplWin->Invalidate();
     981             :     }
     982        1860 :     CallEventListeners( VCLEVENT_LISTBOX_ITEMREMOVED, reinterpret_cast<void*>(-1) );
     983        1860 : }
     984             : 
     985         132 : void ListBox::SetNoSelection()
     986             : {
     987         132 :     mpImplLB->SetNoSelection();
     988         132 :     if( IsDropDownBox() )
     989             :     {
     990          82 :         mpImplWin->SetItemPos( LISTBOX_ENTRY_NOTFOUND );
     991          82 :         mpImplWin->SetString( OUString() );
     992          82 :         Image aImage;
     993          82 :         mpImplWin->SetImage( aImage );
     994          82 :         mpImplWin->Invalidate();
     995             :     }
     996         132 :     ImplCallEventListeners(VCLEVENT_LISTBOX_STATEUPDATE);
     997         132 : }
     998             : 
     999       25293 : sal_Int32 ListBox::InsertEntry( const OUString& rStr, sal_Int32 nPos )
    1000             : {
    1001       25293 :     sal_Int32 nRealPos = mpImplLB->InsertEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), rStr );
    1002       25293 :     nRealPos = sal::static_int_cast<sal_Int32>(nRealPos - mpImplLB->GetEntryList()->GetMRUCount());
    1003       25293 :     CallEventListeners( VCLEVENT_LISTBOX_ITEMADDED, reinterpret_cast<void*>(nRealPos) );
    1004       25293 :     return nRealPos;
    1005             : }
    1006             : 
    1007        1261 : sal_Int32 ListBox::InsertEntry( const OUString& rStr, const Image& rImage, sal_Int32 nPos )
    1008             : {
    1009        1261 :     sal_Int32 nRealPos = mpImplLB->InsertEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), rStr, rImage );
    1010        1261 :     nRealPos = sal::static_int_cast<sal_Int32>(nRealPos - mpImplLB->GetEntryList()->GetMRUCount());
    1011        1261 :     CallEventListeners( VCLEVENT_LISTBOX_ITEMADDED, reinterpret_cast<void*>(nRealPos) );
    1012        1261 :     return nRealPos;
    1013             : }
    1014             : 
    1015           0 : void ListBox::RemoveEntry( const OUString& rStr )
    1016             : {
    1017           0 :     RemoveEntry( GetEntryPos( rStr ) );
    1018           0 : }
    1019             : 
    1020           0 : void ListBox::RemoveEntry( sal_Int32 nPos )
    1021             : {
    1022           0 :     mpImplLB->RemoveEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1023           0 :     CallEventListeners( VCLEVENT_LISTBOX_ITEMREMOVED, reinterpret_cast<void*>(nPos) );
    1024           0 : }
    1025             : 
    1026           0 : Image ListBox::GetEntryImage( sal_Int32 nPos ) const
    1027             : {
    1028           0 :     if ( mpImplLB->GetEntryList()->HasEntryImage( nPos ) )
    1029           0 :         return mpImplLB->GetEntryList()->GetEntryImage( nPos );
    1030           0 :     return Image();
    1031             : }
    1032             : 
    1033         114 : sal_Int32 ListBox::GetEntryPos( const OUString& rStr ) const
    1034             : {
    1035         114 :     sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( rStr );
    1036         114 :     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
    1037          48 :         nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount();
    1038         114 :     return nPos;
    1039             : }
    1040             : 
    1041           0 : sal_Int32 ListBox::GetEntryPos( const void* pData ) const
    1042             : {
    1043           0 :     sal_Int32 nPos = mpImplLB->GetEntryList()->FindEntry( pData );
    1044           0 :     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
    1045           0 :         nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount();
    1046           0 :     return nPos;
    1047             : }
    1048             : 
    1049          47 : OUString ListBox::GetEntry( sal_Int32 nPos ) const
    1050             : {
    1051          47 :     return mpImplLB->GetEntryList()->GetEntryText( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1052             : }
    1053             : 
    1054        2087 : sal_Int32 ListBox::GetEntryCount() const
    1055             : {
    1056        2087 :     return mpImplLB->GetEntryList()->GetEntryCount() - mpImplLB->GetEntryList()->GetMRUCount();
    1057             : }
    1058             : 
    1059           0 : OUString ListBox::GetSelectEntry(sal_Int32 nIndex) const
    1060             : {
    1061           0 :     return GetEntry( GetSelectEntryPos( nIndex ) );
    1062             : }
    1063             : 
    1064        1560 : sal_Int32 ListBox::GetSelectEntryCount() const
    1065             : {
    1066        1560 :     return mpImplLB->GetEntryList()->GetSelectEntryCount();
    1067             : }
    1068             : 
    1069        2213 : sal_Int32 ListBox::GetSelectEntryPos( sal_Int32 nIndex ) const
    1070             : {
    1071        2213 :     sal_Int32 nPos = mpImplLB->GetEntryList()->GetSelectEntryPos( nIndex );
    1072        2213 :     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
    1073             :     {
    1074         419 :         if ( nPos < mpImplLB->GetEntryList()->GetMRUCount() )
    1075           0 :             nPos = mpImplLB->GetEntryList()->FindEntry( mpImplLB->GetEntryList()->GetEntryText( nPos ) );
    1076         419 :         nPos = nPos - mpImplLB->GetEntryList()->GetMRUCount();
    1077             :     }
    1078        2213 :     return nPos;
    1079             : }
    1080             : 
    1081           0 : bool ListBox::IsEntrySelected(const OUString& rStr) const
    1082             : {
    1083           0 :     return IsEntryPosSelected( GetEntryPos( rStr ) );
    1084             : }
    1085             : 
    1086         310 : bool ListBox::IsEntryPosSelected( sal_Int32 nPos ) const
    1087             : {
    1088         310 :     return mpImplLB->GetEntryList()->IsEntryPosSelected( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1089             : }
    1090             : 
    1091         114 : void ListBox::SelectEntry( const OUString& rStr, bool bSelect )
    1092             : {
    1093         114 :     SelectEntryPos( GetEntryPos( rStr ), bSelect );
    1094         114 : }
    1095             : 
    1096        1007 : void ListBox::SelectEntryPos( sal_Int32 nPos, bool bSelect )
    1097             : {
    1098        1007 :     if ( 0 <= nPos && nPos < mpImplLB->GetEntryList()->GetEntryCount() )
    1099             :     {
    1100         689 :         sal_Int32 oldSelectCount = GetSelectEntryCount(), newSelectCount = 0, nCurrentPos = mpImplLB->GetCurrentPos();
    1101         689 :         mpImplLB->SelectEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), bSelect );
    1102         689 :         newSelectCount = GetSelectEntryCount();
    1103         689 :         if (oldSelectCount == 0 && newSelectCount > 0)
    1104         354 :             ImplCallEventListeners(VCLEVENT_LISTBOX_STATEUPDATE);
    1105             :         //Only when bSelect == true, send both Selection & Focus events
    1106         689 :         if (nCurrentPos != nPos && bSelect)
    1107             :         {
    1108         348 :             ImplCallEventListeners( VCLEVENT_LISTBOX_SELECT, reinterpret_cast<void*>(nPos));
    1109         348 :             if (HasFocus())
    1110           0 :                 ImplCallEventListeners( VCLEVENT_LISTBOX_FOCUS, reinterpret_cast<void*>(nPos));
    1111             :         }
    1112             :     }
    1113        1007 : }
    1114             : 
    1115           0 : void ListBox::SetEntryData( sal_Int32 nPos, void* pNewData )
    1116             : {
    1117           0 :     mpImplLB->SetEntryData( nPos + mpImplLB->GetEntryList()->GetMRUCount(), pNewData );
    1118           0 : }
    1119             : 
    1120           0 : void* ListBox::GetEntryData( sal_Int32 nPos ) const
    1121             : {
    1122           0 :     return mpImplLB->GetEntryList()->GetEntryData( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1123             : }
    1124             : 
    1125           0 : void ListBox::SetEntryFlags( sal_Int32 nPos, long nFlags )
    1126             : {
    1127           0 :     mpImplLB->SetEntryFlags( nPos + mpImplLB->GetEntryList()->GetMRUCount(), nFlags );
    1128           0 : }
    1129             : 
    1130           0 : long ListBox::GetEntryFlags( sal_Int32 nPos ) const
    1131             : {
    1132           0 :     return mpImplLB->GetEntryList()->GetEntryFlags( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1133             : }
    1134             : 
    1135         165 : void ListBox::SetTopEntry( sal_Int32 nPos )
    1136             : {
    1137         165 :     mpImplLB->SetTopEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
    1138         165 : }
    1139             : 
    1140          47 : sal_Int32 ListBox::GetTopEntry() const
    1141             : {
    1142          47 :     sal_Int32 nPos = GetEntryCount() ? mpImplLB->GetTopEntry() : LISTBOX_ENTRY_NOTFOUND;
    1143          47 :     if ( nPos < mpImplLB->GetEntryList()->GetMRUCount() )
    1144           0 :         nPos = 0;
    1145          47 :     return nPos;
    1146             : }
    1147             : 
    1148           0 : bool ListBox::IsTravelSelect() const
    1149             : {
    1150           0 :     return mpImplLB->IsTravelSelect();
    1151             : }
    1152             : 
    1153          18 : bool ListBox::IsInDropDown() const
    1154             : {
    1155          18 :     return mpFloatWin && mpFloatWin->IsInPopupMode();
    1156             : }
    1157             : 
    1158           0 : Rectangle ListBox::GetBoundingRectangle( sal_Int32 nItem ) const
    1159             : {
    1160           0 :     Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem );
    1161           0 :     Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this );
    1162           0 :     aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() );
    1163           0 :     return aRect;
    1164             : }
    1165             : 
    1166          64 : void ListBox::EnableMultiSelection( bool bMulti )
    1167             : {
    1168          64 :     EnableMultiSelection( bMulti, false );
    1169          64 : }
    1170             : 
    1171          64 : void ListBox::EnableMultiSelection( bool bMulti, bool bStackSelection )
    1172             : {
    1173          64 :     mpImplLB->EnableMultiSelection( bMulti, bStackSelection );
    1174             : 
    1175             :     // WB_SIMPLEMODE:
    1176             :     // The MultiListBox behaves just like a normal ListBox
    1177             :     // MultiSelection is possible via corresponding additional keys
    1178          64 :     bool bSimpleMode = ( GetStyle() & WB_SIMPLEMODE ) ? true : false;
    1179          64 :     mpImplLB->SetMultiSelectionSimpleMode( bSimpleMode );
    1180             : 
    1181             :     // In a MultiSelection, we can't see us travelling without focus
    1182          64 :     if ( mpFloatWin )
    1183          22 :         mpImplLB->GetMainWindow().AllowGrabFocus( bMulti );
    1184          64 : }
    1185             : 
    1186           8 : bool ListBox::IsMultiSelectionEnabled() const
    1187             : {
    1188           8 :     return mpImplLB->IsMultiSelectionEnabled();
    1189             : }
    1190             : 
    1191           0 : Size ListBox::CalcMinimumSize() const
    1192             : {
    1193           0 :     Size aSz;
    1194             : 
    1195           0 :     if (!mpImplLB)
    1196           0 :         return aSz;
    1197             : 
    1198           0 :     aSz = CalcSubEditSize();
    1199             : 
    1200           0 :     bool bAddScrollWidth = false;
    1201             : 
    1202           0 :     if (IsDropDownBox())
    1203             :     {
    1204           0 :         aSz.Height() += 4; // add a space between entry and border
    1205           0 :         aSz.Width() += 4;  // add a little breathing space
    1206           0 :         bAddScrollWidth = true;
    1207             :     }
    1208             :     else
    1209           0 :         bAddScrollWidth = (GetStyle() & WB_VSCROLL) == WB_VSCROLL;
    1210             : 
    1211           0 :     if (bAddScrollWidth)
    1212             :     {
    1213             :         // Try native borders; scrollbar size may not be a good indicator
    1214             :         // See how large the edit area inside is to estimate what is needed for the dropdown
    1215           0 :         ImplControlValue aControlValue;
    1216           0 :         Point aPoint;
    1217           0 :         Rectangle aContent, aBound;
    1218           0 :         Size aTestSize( 100, 20 );
    1219           0 :         Rectangle aArea( aPoint, aTestSize );
    1220           0 :         if( GetNativeControlRegion( CTRL_LISTBOX, PART_SUB_EDIT, aArea, 0,
    1221           0 :                     aControlValue, OUString(), aBound, aContent) )
    1222             :         {
    1223             :             // use the themes drop down size
    1224           0 :             aSz.Width() += aTestSize.Width() - aContent.GetWidth();
    1225             :         }
    1226             :         else
    1227           0 :             aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
    1228             :     }
    1229             : 
    1230           0 :     aSz = CalcWindowSize( aSz );
    1231             : 
    1232           0 :     if (IsDropDownBox()) // Check minimum height of dropdown box
    1233             :     {
    1234           0 :         ImplControlValue aControlValue;
    1235           0 :         Rectangle aRect( Point( 0, 0 ), aSz );
    1236           0 :         Rectangle aContent, aBound;
    1237           0 :         if( GetNativeControlRegion( CTRL_LISTBOX, PART_ENTIRE_CONTROL, aRect, 0,
    1238           0 :                     aControlValue, OUString(), aBound, aContent) )
    1239             :         {
    1240           0 :             if( aBound.GetHeight() > aSz.Height() )
    1241           0 :                 aSz.Height() = aBound.GetHeight();
    1242           0 :         }
    1243             :     }
    1244             : 
    1245           0 :     return aSz;
    1246             : }
    1247             : 
    1248           0 : Size ListBox::CalcSubEditSize() const
    1249             : {
    1250           0 :     Size aSz;
    1251             : 
    1252           0 :     if (!mpImplLB)
    1253           0 :         return aSz;
    1254             : 
    1255           0 :     if ( !IsDropDownBox() )
    1256           0 :         aSz = mpImplLB->CalcSize (mnLineCount ? mnLineCount : mpImplLB->GetEntryList()->GetEntryCount());
    1257             :     else
    1258             :     {
    1259           0 :         aSz.Height() = mpImplLB->CalcSize( 1 ).Height();
    1260             :         // Size to maxmimum entry width
    1261           0 :         aSz.Width() = mpImplLB->GetMaxEntryWidth();
    1262             : 
    1263           0 :         if (m_nMaxWidthChars != -1)
    1264             :         {
    1265           0 :             long nMaxWidth = m_nMaxWidthChars * approximate_char_width();
    1266           0 :             aSz.Width() = std::min(aSz.Width(), nMaxWidth);
    1267             :         }
    1268             : 
    1269             :         // Do not create ultrathin ListBoxes, it doesn't look good
    1270           0 :         if( aSz.Width() < GetSettings().GetStyleSettings().GetScrollBarSize() )
    1271           0 :             aSz.Width() = GetSettings().GetStyleSettings().GetScrollBarSize();
    1272             :     }
    1273             : 
    1274           0 :     return aSz;
    1275             : }
    1276             : 
    1277           0 : Size ListBox::GetOptimalSize() const
    1278             : {
    1279           0 :     return CalcMinimumSize();
    1280             : }
    1281             : 
    1282           0 : Size ListBox::CalcAdjustedSize( const Size& rPrefSize ) const
    1283             : {
    1284           0 :     Size aSz = rPrefSize;
    1285             :     sal_Int32 nLeft, nTop, nRight, nBottom;
    1286           0 :     ((vcl::Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom );
    1287           0 :     aSz.Height() -= nTop+nBottom;
    1288           0 :     if ( !IsDropDownBox() )
    1289             :     {
    1290           0 :         long nEntryHeight = CalcBlockSize( 1, 1 ).Height();
    1291           0 :         long nLines = aSz.Height() / nEntryHeight;
    1292           0 :         if ( nLines < 1 )
    1293           0 :             nLines = 1;
    1294           0 :         aSz.Height() = nLines * nEntryHeight;
    1295             :     }
    1296             :     else
    1297             :     {
    1298           0 :         aSz.Height() = mnDDHeight;
    1299             :     }
    1300           0 :     aSz.Height() += nTop+nBottom;
    1301             : 
    1302           0 :     aSz = CalcWindowSize( aSz );
    1303           0 :     return aSz;
    1304             : }
    1305             : 
    1306           0 : Size ListBox::CalcBlockSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const
    1307             : {
    1308             :     // ScrollBars are shown if needed
    1309           0 :     Size aMinSz = CalcMinimumSize();
    1310             :     // aMinSz = ImplCalcOutSz( aMinSz );
    1311             : 
    1312           0 :     Size aSz;
    1313             : 
    1314             :     // Height
    1315           0 :     if ( nLines )
    1316             :     {
    1317           0 :         if ( !IsDropDownBox() )
    1318           0 :             aSz.Height() = mpImplLB->CalcSize( nLines ).Height();
    1319             :         else
    1320           0 :             aSz.Height() = mnDDHeight;
    1321             :     }
    1322             :     else
    1323           0 :         aSz.Height() = aMinSz.Height();
    1324             : 
    1325             :     // Width
    1326           0 :     if ( nColumns )
    1327           0 :         aSz.Width() = nColumns * GetTextWidth( OUString('X') );
    1328             :     else
    1329           0 :         aSz.Width() = aMinSz.Width();
    1330             : 
    1331           0 :     if ( IsDropDownBox() )
    1332           0 :         aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
    1333             : 
    1334           0 :     if ( !IsDropDownBox() )
    1335             :     {
    1336           0 :         if ( aSz.Width() < aMinSz.Width() )
    1337           0 :             aSz.Height() += GetSettings().GetStyleSettings().GetScrollBarSize();
    1338           0 :         if ( aSz.Height() < aMinSz.Height() )
    1339           0 :             aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
    1340             :     }
    1341             : 
    1342           0 :     aSz = CalcWindowSize( aSz );
    1343           0 :     return aSz;
    1344             : }
    1345             : 
    1346           0 : void ListBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const
    1347             : {
    1348           0 :     float nCharWidth = approximate_char_width();
    1349           0 :     if ( !IsDropDownBox() )
    1350             :     {
    1351           0 :         Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel();
    1352           0 :         rnCols = (sal_uInt16) (aOutSz.Width()/nCharWidth);
    1353           0 :         rnLines = (sal_uInt16) (aOutSz.Height()/mpImplLB->GetEntryHeight());
    1354             :     }
    1355             :     else
    1356             :     {
    1357           0 :         Size aOutSz = mpImplWin->GetOutputSizePixel();
    1358           0 :         rnCols = (sal_uInt16) (aOutSz.Width()/nCharWidth);
    1359           0 :         rnLines = 1;
    1360             :     }
    1361           0 : }
    1362             : 
    1363         199 : void ListBox::ImplUserDrawHandler( UserDrawEvent* pEvent )
    1364             : {
    1365         199 :     UserDraw( *pEvent );
    1366         199 : }
    1367             : 
    1368           0 : void ListBox::UserDraw( const UserDrawEvent& )
    1369             : {
    1370           0 : }
    1371             : 
    1372         199 : void ListBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos )
    1373             : {
    1374         199 :     if ( rEvt.GetDevice() == &mpImplLB->GetMainWindow() )
    1375          57 :         mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
    1376         142 :     else if ( rEvt.GetDevice() == mpImplWin )
    1377         142 :         mpImplWin->DrawEntry( bDrawImage, bDrawText, bDrawTextAtImagePos );
    1378         199 : }
    1379             : 
    1380         126 : void ListBox::SetUserItemSize( const Size& rSz )
    1381             : {
    1382         126 :     mpImplLB->GetMainWindow().SetUserItemSize( rSz );
    1383         126 :     if ( mpImplWin )
    1384         126 :         mpImplWin->SetUserItemSize( rSz );
    1385         126 : }
    1386             : 
    1387         126 : void ListBox::EnableUserDraw( bool bUserDraw )
    1388             : {
    1389         126 :     mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw );
    1390         126 :     if ( mpImplWin )
    1391         126 :         mpImplWin->EnableUserDraw( bUserDraw );
    1392         126 : }
    1393             : 
    1394          56 : void ListBox::SetReadOnly( bool bReadOnly )
    1395             : {
    1396          56 :     if ( mpImplLB->IsReadOnly() != bReadOnly )
    1397             :     {
    1398          24 :         mpImplLB->SetReadOnly( bReadOnly );
    1399          24 :         StateChanged( StateChangedType::READONLY );
    1400             :     }
    1401          56 : }
    1402             : 
    1403          24 : bool ListBox::IsReadOnly() const
    1404             : {
    1405          24 :     return mpImplLB->IsReadOnly();
    1406             : }
    1407             : 
    1408           0 : void ListBox::SetSeparatorPos( sal_Int32 n )
    1409             : {
    1410           0 :     mpImplLB->SetSeparatorPos( n );
    1411           0 : }
    1412             : 
    1413           0 : sal_Int32 ListBox::GetSeparatorPos() const
    1414             : {
    1415           0 :     return mpImplLB->GetSeparatorPos();
    1416             : }
    1417             : 
    1418          67 : sal_uInt16 ListBox::GetDisplayLineCount() const
    1419             : {
    1420          67 :     return mpImplLB->GetDisplayLineCount();
    1421             : }
    1422             : 
    1423           0 : void ListBox::EnableMirroring()
    1424             : {
    1425           0 :     mpImplLB->EnableMirroring();
    1426           0 : }
    1427             : 
    1428           0 : Rectangle ListBox::GetDropDownPosSizePixel() const
    1429             : {
    1430           0 :     return mpFloatWin ? mpFloatWin->GetWindowExtentsRelative( const_cast<ListBox*>(this) ) : Rectangle();
    1431             : }
    1432             : 
    1433           0 : const Wallpaper& ListBox::GetDisplayBackground() const
    1434             : {
    1435             :     // !!! Recursion does not occur because the ImplListBox is initialized by default
    1436             :     // to a non-transparent color in Window::ImplInitData
    1437           0 :     return mpImplLB->GetDisplayBackground();
    1438             : }
    1439             : 
    1440           0 : void ListBox::setMaxWidthChars(sal_Int32 nWidth)
    1441             : {
    1442           0 :     if (nWidth != m_nMaxWidthChars)
    1443             :     {
    1444           0 :         m_nMaxWidthChars = nWidth;
    1445           0 :         queue_resize();
    1446             :     }
    1447           0 : }
    1448             : 
    1449           0 : bool ListBox::set_property(const OString &rKey, const OString &rValue)
    1450             : {
    1451           0 :     if (rKey == "active")
    1452           0 :         SelectEntryPos(rValue.toInt32());
    1453           0 :     else if (rKey == "max-width-chars")
    1454           0 :         setMaxWidthChars(rValue.toInt32());
    1455             :     else
    1456           0 :         return Control::set_property(rKey, rValue);
    1457           0 :     return true;
    1458             : }
    1459             : 
    1460         126 : void ListBox::SetEdgeBlending(bool bNew)
    1461             : {
    1462         126 :     if(mbEdgeBlending != bNew)
    1463             :     {
    1464         126 :         mbEdgeBlending = bNew;
    1465             : 
    1466         126 :         if(IsDropDownBox())
    1467             :         {
    1468         126 :             mpImplWin->Invalidate();
    1469             :         }
    1470             :         else
    1471             :         {
    1472           0 :             mpImplLB->Invalidate();
    1473             :         }
    1474             : 
    1475         126 :         if(mpImplWin)
    1476             :         {
    1477         126 :             mpImplWin->SetEdgeBlending(GetEdgeBlending());
    1478             :         }
    1479             : 
    1480         126 :         if(mpImplLB)
    1481             :         {
    1482         126 :             mpImplLB->SetEdgeBlending(GetEdgeBlending());
    1483             :         }
    1484             : 
    1485         126 :         Invalidate();
    1486             :     }
    1487         126 : }
    1488             : 
    1489           0 : MultiListBox::MultiListBox( vcl::Window* pParent, WinBits nStyle ) :
    1490           0 :     ListBox( WINDOW_MULTILISTBOX )
    1491             : {
    1492           0 :     ImplInit( pParent, nStyle );
    1493           0 :     EnableMultiSelection( true );
    1494        1233 : }
    1495             : 
    1496             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10