xref: /aoo4110/main/vcl/source/control/combobox.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/table.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
29*b1cdbd2cSJim Jagielski #include <tools/rc.h>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <vcl/decoview.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/lstbox.h>
33*b1cdbd2cSJim Jagielski #include <vcl/button.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/event.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/combobox.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <svdata.hxx>
38*b1cdbd2cSJim Jagielski #include <subedit.hxx>
39*b1cdbd2cSJim Jagielski #include <ilstbox.hxx>
40*b1cdbd2cSJim Jagielski #include <controldata.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski // =======================================================================
43*b1cdbd2cSJim Jagielski 
ImplCreateKey(sal_uInt16 nPos)44*b1cdbd2cSJim Jagielski inline sal_uLong ImplCreateKey( sal_uInt16 nPos )
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski 	// Key = Pos+1, wegen Pos 0
47*b1cdbd2cSJim Jagielski 	return nPos+1;
48*b1cdbd2cSJim Jagielski }
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
51*b1cdbd2cSJim Jagielski 
lcl_GetSelectedEntries(Table & rSelectedPos,const XubString & rText,xub_Unicode cTokenSep,const ImplEntryList * pEntryList)52*b1cdbd2cSJim Jagielski static void lcl_GetSelectedEntries( Table& rSelectedPos, const XubString& rText, xub_Unicode cTokenSep, const ImplEntryList* pEntryList )
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski 	for( xub_StrLen n = rText.GetTokenCount( cTokenSep ); n; )
55*b1cdbd2cSJim Jagielski 	{
56*b1cdbd2cSJim Jagielski 		XubString aToken = rText.GetToken( --n, cTokenSep );
57*b1cdbd2cSJim Jagielski 		aToken.EraseLeadingAndTrailingChars( ' ' );
58*b1cdbd2cSJim Jagielski 		sal_uInt16 nPos = pEntryList->FindEntry( aToken );
59*b1cdbd2cSJim Jagielski 		if ( nPos != LISTBOX_ENTRY_NOTFOUND )
60*b1cdbd2cSJim Jagielski 			rSelectedPos.Insert( ImplCreateKey( nPos ), (void*)sal_IntPtr(1L) );
61*b1cdbd2cSJim Jagielski 	}
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski // =======================================================================
65*b1cdbd2cSJim Jagielski 
ComboBox(WindowType nType)66*b1cdbd2cSJim Jagielski ComboBox::ComboBox( WindowType nType ) :
67*b1cdbd2cSJim Jagielski 	Edit( nType )
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	ImplInitComboBoxData();
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
73*b1cdbd2cSJim Jagielski 
ComboBox(Window * pParent,WinBits nStyle)74*b1cdbd2cSJim Jagielski ComboBox::ComboBox( Window* pParent, WinBits nStyle ) :
75*b1cdbd2cSJim Jagielski 	Edit( WINDOW_COMBOBOX )
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski 	ImplInitComboBoxData();
78*b1cdbd2cSJim Jagielski 	ImplInit( pParent, nStyle );
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
82*b1cdbd2cSJim Jagielski 
ComboBox(Window * pParent,const ResId & rResId)83*b1cdbd2cSJim Jagielski ComboBox::ComboBox( Window* pParent, const ResId& rResId ) :
84*b1cdbd2cSJim Jagielski 	Edit( WINDOW_COMBOBOX )
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski 	ImplInitComboBoxData();
87*b1cdbd2cSJim Jagielski 	rResId.SetRT( RSC_COMBOBOX );
88*b1cdbd2cSJim Jagielski 	WinBits nStyle = ImplInitRes( rResId );
89*b1cdbd2cSJim Jagielski 	ImplInit( pParent, nStyle );
90*b1cdbd2cSJim Jagielski 	ImplLoadRes( rResId );
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_HIDE ) )
93*b1cdbd2cSJim Jagielski 		Show();
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
97*b1cdbd2cSJim Jagielski 
~ComboBox()98*b1cdbd2cSJim Jagielski ComboBox::~ComboBox()
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski 	SetSubEdit( NULL );
101*b1cdbd2cSJim Jagielski 	delete mpSubEdit;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	delete mpImplLB;
104*b1cdbd2cSJim Jagielski 	mpImplLB = NULL;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	delete mpFloatWin;
107*b1cdbd2cSJim Jagielski 	delete mpBtn;
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
111*b1cdbd2cSJim Jagielski 
ImplInitComboBoxData()112*b1cdbd2cSJim Jagielski void ComboBox::ImplInitComboBoxData()
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski 	mpSubEdit			= NULL;
115*b1cdbd2cSJim Jagielski 	mpBtn				= NULL;
116*b1cdbd2cSJim Jagielski 	mpImplLB			= NULL;
117*b1cdbd2cSJim Jagielski 	mpFloatWin			= NULL;
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	mnDDHeight			= 0;
120*b1cdbd2cSJim Jagielski 	mbDDAutoSize		= sal_True;
121*b1cdbd2cSJim Jagielski 	mbSyntheticModify	= sal_False;
122*b1cdbd2cSJim Jagielski 	mbMatchCase 		= sal_False;
123*b1cdbd2cSJim Jagielski 	mcMultiSep			= ';';
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
127*b1cdbd2cSJim Jagielski 
ImplCalcEditHeight()128*b1cdbd2cSJim Jagielski void ComboBox::ImplCalcEditHeight()
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski 	sal_Int32 nLeft, nTop, nRight, nBottom;
131*b1cdbd2cSJim Jagielski 	GetBorder( nLeft, nTop, nRight, nBottom );
132*b1cdbd2cSJim Jagielski 	mnDDHeight = (sal_uInt16)(mpSubEdit->GetTextHeight() + nTop + nBottom + 4);
133*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
134*b1cdbd2cSJim Jagielski 		mnDDHeight += 4;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski     Rectangle aCtrlRegion( Point( 0, 0 ), Size( 10, 10 ) );
137*b1cdbd2cSJim Jagielski     Rectangle aBoundRegion, aContentRegion;
138*b1cdbd2cSJim Jagielski     ImplControlValue aControlValue;
139*b1cdbd2cSJim Jagielski     ControlType aType = IsDropDownBox() ? CTRL_COMBOBOX : CTRL_EDITBOX;
140*b1cdbd2cSJim Jagielski     if( GetNativeControlRegion( aType, PART_ENTIRE_CONTROL,
141*b1cdbd2cSJim Jagielski                                 aCtrlRegion,
142*b1cdbd2cSJim Jagielski                                 CTRL_STATE_ENABLED,
143*b1cdbd2cSJim Jagielski                                 aControlValue, rtl::OUString(),
144*b1cdbd2cSJim Jagielski                                 aBoundRegion, aContentRegion ) )
145*b1cdbd2cSJim Jagielski     {
146*b1cdbd2cSJim Jagielski         const long nNCHeight = aBoundRegion.GetHeight();
147*b1cdbd2cSJim Jagielski         if( mnDDHeight < nNCHeight )
148*b1cdbd2cSJim Jagielski             mnDDHeight = sal::static_int_cast<sal_uInt16>( nNCHeight );
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
153*b1cdbd2cSJim Jagielski 
ImplInit(Window * pParent,WinBits nStyle)154*b1cdbd2cSJim Jagielski void ComboBox::ImplInit( Window* pParent, WinBits nStyle )
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski 	ImplInitStyle( nStyle );
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	sal_Bool bNoBorder = ( nStyle & WB_NOBORDER ) ? sal_True : sal_False;
159*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_DROPDOWN) )
160*b1cdbd2cSJim Jagielski 	{
161*b1cdbd2cSJim Jagielski 		nStyle &= ~WB_BORDER;
162*b1cdbd2cSJim Jagielski 		nStyle |= WB_NOBORDER;
163*b1cdbd2cSJim Jagielski 	}
164*b1cdbd2cSJim Jagielski 	else
165*b1cdbd2cSJim Jagielski 	{
166*b1cdbd2cSJim Jagielski 		if ( !bNoBorder )
167*b1cdbd2cSJim Jagielski 			nStyle |= WB_BORDER;
168*b1cdbd2cSJim Jagielski 	}
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	Edit::ImplInit( pParent, nStyle );
171*b1cdbd2cSJim Jagielski 	SetBackground();
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	// DropDown ?
174*b1cdbd2cSJim Jagielski 	WinBits nEditStyle = nStyle & ( WB_LEFT | WB_RIGHT | WB_CENTER );
175*b1cdbd2cSJim Jagielski 	WinBits nListStyle = nStyle;
176*b1cdbd2cSJim Jagielski 	if( nStyle & WB_DROPDOWN )
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		mpFloatWin = new ImplListBoxFloatingWindow( this );
179*b1cdbd2cSJim Jagielski 		mpFloatWin->SetAutoWidth( sal_True );
180*b1cdbd2cSJim Jagielski 		mpFloatWin->SetPopupModeEndHdl( LINK( this, ComboBox, ImplPopupModeEndHdl ) );
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 		mpBtn = new ImplBtn( this, WB_NOLIGHTBORDER | WB_RECTSTYLE );
183*b1cdbd2cSJim Jagielski 		ImplInitDropDownButton( mpBtn );
184*b1cdbd2cSJim Jagielski 		mpBtn->SetMBDownHdl( LINK( this, ComboBox, ImplClickBtnHdl ) );
185*b1cdbd2cSJim Jagielski 		mpBtn->Show();
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		nEditStyle |= WB_NOBORDER;
188*b1cdbd2cSJim Jagielski 		nListStyle &= ~WB_BORDER;
189*b1cdbd2cSJim Jagielski 		nListStyle |= WB_NOBORDER;
190*b1cdbd2cSJim Jagielski 	}
191*b1cdbd2cSJim Jagielski 	else
192*b1cdbd2cSJim Jagielski 	{
193*b1cdbd2cSJim Jagielski 		if ( !bNoBorder )
194*b1cdbd2cSJim Jagielski 		{
195*b1cdbd2cSJim Jagielski 			nEditStyle |= WB_BORDER;
196*b1cdbd2cSJim Jagielski 			nListStyle &= ~WB_NOBORDER;
197*b1cdbd2cSJim Jagielski 			nListStyle |= WB_BORDER;
198*b1cdbd2cSJim Jagielski 		}
199*b1cdbd2cSJim Jagielski 	}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	mpSubEdit = new Edit( this, nEditStyle );
202*b1cdbd2cSJim Jagielski 	mpSubEdit->EnableRTL( sal_False );
203*b1cdbd2cSJim Jagielski 	SetSubEdit( mpSubEdit );
204*b1cdbd2cSJim Jagielski 	mpSubEdit->SetPosPixel( Point() );
205*b1cdbd2cSJim Jagielski 	EnableAutocomplete( sal_True );
206*b1cdbd2cSJim Jagielski 	mpSubEdit->Show();
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	Window* pLBParent = this;
209*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
210*b1cdbd2cSJim Jagielski 		pLBParent = mpFloatWin;
211*b1cdbd2cSJim Jagielski 	mpImplLB = new ImplListBox( pLBParent, nListStyle|WB_SIMPLEMODE );
212*b1cdbd2cSJim Jagielski 	mpImplLB->SetPosPixel( Point() );
213*b1cdbd2cSJim Jagielski 	mpImplLB->SetSelectHdl( LINK( this, ComboBox, ImplSelectHdl ) );
214*b1cdbd2cSJim Jagielski 	mpImplLB->SetCancelHdl( LINK( this, ComboBox, ImplCancelHdl ) );
215*b1cdbd2cSJim Jagielski 	mpImplLB->SetDoubleClickHdl( LINK( this, ComboBox, ImplDoubleClickHdl ) );
216*b1cdbd2cSJim Jagielski 	mpImplLB->SetUserDrawHdl( LINK( this, ComboBox, ImplUserDrawHdl ) );
217*b1cdbd2cSJim Jagielski 	mpImplLB->SetSelectionChangedHdl( LINK( this, ComboBox, ImplSelectionChangedHdl ) );
218*b1cdbd2cSJim Jagielski 	mpImplLB->SetListItemSelectHdl( LINK( this, ComboBox, ImplListItemSelectHdl ) );
219*b1cdbd2cSJim Jagielski 	mpImplLB->Show();
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
222*b1cdbd2cSJim Jagielski 		mpFloatWin->SetImplListBox( mpImplLB );
223*b1cdbd2cSJim Jagielski 	else
224*b1cdbd2cSJim Jagielski 		mpImplLB->GetMainWindow()->AllowGrabFocus( sal_True );
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 	ImplCalcEditHeight();
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	SetCompoundControl( sal_True );
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
232*b1cdbd2cSJim Jagielski 
ImplInitStyle(WinBits nStyle)233*b1cdbd2cSJim Jagielski WinBits ComboBox::ImplInitStyle( WinBits nStyle )
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_NOTABSTOP) )
236*b1cdbd2cSJim Jagielski 		nStyle |= WB_TABSTOP;
237*b1cdbd2cSJim Jagielski 	if ( !(nStyle & WB_NOGROUP) )
238*b1cdbd2cSJim Jagielski 		nStyle |= WB_GROUP;
239*b1cdbd2cSJim Jagielski 	return nStyle;
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
243*b1cdbd2cSJim Jagielski 
ImplLoadRes(const ResId & rResId)244*b1cdbd2cSJim Jagielski void ComboBox::ImplLoadRes( const ResId& rResId )
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski 	Edit::ImplLoadRes( rResId );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	sal_uLong nNumber = ReadLongRes();
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 	if( nNumber )
251*b1cdbd2cSJim Jagielski 	{
252*b1cdbd2cSJim Jagielski 		for( sal_uInt16 i = 0; i < nNumber; i++ )
253*b1cdbd2cSJim Jagielski 		{
254*b1cdbd2cSJim Jagielski 			InsertEntry( ReadStringRes(), LISTBOX_APPEND );
255*b1cdbd2cSJim Jagielski 		}
256*b1cdbd2cSJim Jagielski 	}
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
260*b1cdbd2cSJim Jagielski 
EnableAutocomplete(sal_Bool bEnable,sal_Bool bMatchCase)261*b1cdbd2cSJim Jagielski void ComboBox::EnableAutocomplete( sal_Bool bEnable, sal_Bool bMatchCase )
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski 	mbMatchCase = bMatchCase;
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 	if ( bEnable )
266*b1cdbd2cSJim Jagielski 		mpSubEdit->SetAutocompleteHdl( LINK( this, ComboBox, ImplAutocompleteHdl ) );
267*b1cdbd2cSJim Jagielski 	else
268*b1cdbd2cSJim Jagielski 		mpSubEdit->SetAutocompleteHdl( Link() );
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
272*b1cdbd2cSJim Jagielski 
IsAutocompleteEnabled() const273*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsAutocompleteEnabled() const
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski 	return mpSubEdit->GetAutocompleteHdl().IsSet();
276*b1cdbd2cSJim Jagielski }
SetMpSubEditAccessibleName(String & aName)277*b1cdbd2cSJim Jagielski void  ComboBox::SetMpSubEditAccessibleName(String &aName)
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski 	if(mpSubEdit!=NULL)
280*b1cdbd2cSJim Jagielski         mpSubEdit->SetAccessibleName(aName);
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
283*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplClickBtnHdl,void *,EMPTYARG)284*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplClickBtnHdl, void*, EMPTYARG )
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
287*b1cdbd2cSJim Jagielski 	mpSubEdit->GrabFocus();
288*b1cdbd2cSJim Jagielski 	if ( !mpImplLB->GetEntryList()->GetMRUCount() )
289*b1cdbd2cSJim Jagielski 		ImplUpdateFloatSelection();
290*b1cdbd2cSJim Jagielski 	else
291*b1cdbd2cSJim Jagielski 		mpImplLB->SelectEntry( 0 , sal_True );
292*b1cdbd2cSJim Jagielski 	mpBtn->SetPressed( sal_True );
293*b1cdbd2cSJim Jagielski     SetSelection( Selection( 0, SELECTION_MAX ) );
294*b1cdbd2cSJim Jagielski 	mpFloatWin->StartFloat( sal_True );
295*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski     ImplClearLayoutData();
298*b1cdbd2cSJim Jagielski     if( mpImplLB )
299*b1cdbd2cSJim Jagielski         mpImplLB->GetMainWindow()->ImplClearLayoutData();
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 	return 0;
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
305*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplPopupModeEndHdl,void *,EMPTYARG)306*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplPopupModeEndHdl, void*, EMPTYARG )
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski     if( mpFloatWin->IsPopupModeCanceled() )
309*b1cdbd2cSJim Jagielski     {
310*b1cdbd2cSJim Jagielski         if ( !mpImplLB->GetEntryList()->IsEntryPosSelected( mpFloatWin->GetPopupModeStartSaveSelection() ) )
311*b1cdbd2cSJim Jagielski         {
312*b1cdbd2cSJim Jagielski             mpImplLB->SelectEntry( mpFloatWin->GetPopupModeStartSaveSelection(), sal_True );
313*b1cdbd2cSJim Jagielski             sal_Bool bTravelSelect = mpImplLB->IsTravelSelect();
314*b1cdbd2cSJim Jagielski             mpImplLB->SetTravelSelect( sal_True );
315*b1cdbd2cSJim Jagielski             Select();
316*b1cdbd2cSJim Jagielski             mpImplLB->SetTravelSelect( bTravelSelect );
317*b1cdbd2cSJim Jagielski         }
318*b1cdbd2cSJim Jagielski     }
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski     ImplClearLayoutData();
321*b1cdbd2cSJim Jagielski     if( mpImplLB )
322*b1cdbd2cSJim Jagielski         mpImplLB->GetMainWindow()->ImplClearLayoutData();
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	mpBtn->SetPressed( sal_False );
325*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_DROPDOWN_CLOSE );
326*b1cdbd2cSJim Jagielski 	return 0;
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
330*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplAutocompleteHdl,Edit *,pEdit)331*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplAutocompleteHdl, Edit*, pEdit )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	Selection			aSel = pEdit->GetSelection();
334*b1cdbd2cSJim Jagielski 	AutocompleteAction	eAction = pEdit->GetAutocompleteAction();
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     /* If there is no current selection do not auto complete on
337*b1cdbd2cSJim Jagielski        Tab/Shift-Tab since then we would not cycle to the next field.
338*b1cdbd2cSJim Jagielski     */
339*b1cdbd2cSJim Jagielski 	if ( aSel.Len() ||
340*b1cdbd2cSJim Jagielski 		 ((eAction != AUTOCOMPLETE_TABFORWARD) && (eAction != AUTOCOMPLETE_TABBACKWARD)) )
341*b1cdbd2cSJim Jagielski 	{
342*b1cdbd2cSJim Jagielski 		XubString	aFullText = pEdit->GetText();
343*b1cdbd2cSJim Jagielski 		XubString	aStartText = aFullText.Copy( 0, (xub_StrLen)aSel.Max() );
344*b1cdbd2cSJim Jagielski 		sal_uInt16		nStart = mpImplLB->GetCurrentPos();
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 		if ( nStart == LISTBOX_ENTRY_NOTFOUND )
347*b1cdbd2cSJim Jagielski 			nStart = 0;
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 		sal_Bool bForward = sal_True;
350*b1cdbd2cSJim Jagielski 		if ( eAction == AUTOCOMPLETE_TABFORWARD )
351*b1cdbd2cSJim Jagielski 			nStart++;
352*b1cdbd2cSJim Jagielski 		else if ( eAction == AUTOCOMPLETE_TABBACKWARD )
353*b1cdbd2cSJim Jagielski 		{
354*b1cdbd2cSJim Jagielski 			bForward = sal_False;
355*b1cdbd2cSJim Jagielski 			nStart = nStart ? nStart - 1 : mpImplLB->GetEntryList()->GetEntryCount()-1;
356*b1cdbd2cSJim Jagielski 		}
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski         sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
359*b1cdbd2cSJim Jagielski         if( ! mbMatchCase )
360*b1cdbd2cSJim Jagielski         {
361*b1cdbd2cSJim Jagielski 			// Try match case insensitive from current position
362*b1cdbd2cSJim Jagielski 			nPos = mpImplLB->GetEntryList()->FindMatchingEntry( aStartText, nStart, bForward, sal_True );
363*b1cdbd2cSJim Jagielski             if ( nPos == LISTBOX_ENTRY_NOTFOUND )
364*b1cdbd2cSJim Jagielski                 // Try match case insensitive, but from start
365*b1cdbd2cSJim Jagielski                 nPos = mpImplLB->GetEntryList()->FindMatchingEntry( aStartText, bForward ? 0 : (mpImplLB->GetEntryList()->GetEntryCount()-1), bForward, sal_True );
366*b1cdbd2cSJim Jagielski         }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 		if ( nPos == LISTBOX_ENTRY_NOTFOUND )
369*b1cdbd2cSJim Jagielski             // Try match full from current position
370*b1cdbd2cSJim Jagielski             nPos = mpImplLB->GetEntryList()->FindMatchingEntry( aStartText, nStart, bForward, sal_False );
371*b1cdbd2cSJim Jagielski 		if ( nPos == LISTBOX_ENTRY_NOTFOUND )
372*b1cdbd2cSJim Jagielski 			//  Match full, but from start
373*b1cdbd2cSJim Jagielski 			nPos = mpImplLB->GetEntryList()->FindMatchingEntry( aStartText, bForward ? 0 : (mpImplLB->GetEntryList()->GetEntryCount()-1), bForward, sal_False );
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 		if ( nPos != LISTBOX_ENTRY_NOTFOUND )
376*b1cdbd2cSJim Jagielski 		{
377*b1cdbd2cSJim Jagielski 			XubString aText = mpImplLB->GetEntryList()->GetEntryText( nPos );
378*b1cdbd2cSJim Jagielski 			Selection aSelection( aText.Len(), aStartText.Len() );
379*b1cdbd2cSJim Jagielski 			pEdit->SetText( aText, aSelection );
380*b1cdbd2cSJim Jagielski 		}
381*b1cdbd2cSJim Jagielski 	}
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski 	return 0;
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
387*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplSelectHdl,void *,EMPTYARG)388*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplSelectHdl, void*, EMPTYARG )
389*b1cdbd2cSJim Jagielski {
390*b1cdbd2cSJim Jagielski 	sal_Bool bPopup = IsInDropDown();
391*b1cdbd2cSJim Jagielski 	sal_Bool bCallSelect = sal_False;
392*b1cdbd2cSJim Jagielski 	if ( mpImplLB->IsSelectionChanged() || bPopup )
393*b1cdbd2cSJim Jagielski 	{
394*b1cdbd2cSJim Jagielski 		XubString aText;
395*b1cdbd2cSJim Jagielski 		if ( IsMultiSelectionEnabled() )
396*b1cdbd2cSJim Jagielski 		{
397*b1cdbd2cSJim Jagielski 			aText = mpSubEdit->GetText();
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 			// Alle Eintraege entfernen, zu denen es einen Entry gibt, der aber nicht selektiert ist.
400*b1cdbd2cSJim Jagielski 			xub_StrLen nIndex = 0;
401*b1cdbd2cSJim Jagielski 			while ( nIndex != STRING_NOTFOUND )
402*b1cdbd2cSJim Jagielski 			{
403*b1cdbd2cSJim Jagielski 				xub_StrLen	nPrevIndex = nIndex;
404*b1cdbd2cSJim Jagielski 				XubString	aToken = aText.GetToken( 0, mcMultiSep, nIndex );
405*b1cdbd2cSJim Jagielski 				xub_StrLen	nTokenLen = aToken.Len();
406*b1cdbd2cSJim Jagielski 				aToken.EraseLeadingAndTrailingChars( ' ' );
407*b1cdbd2cSJim Jagielski 				sal_uInt16		nP = mpImplLB->GetEntryList()->FindEntry( aToken );
408*b1cdbd2cSJim Jagielski 				if ( (nP != LISTBOX_ENTRY_NOTFOUND) && (!mpImplLB->GetEntryList()->IsEntryPosSelected( nP )) )
409*b1cdbd2cSJim Jagielski 				{
410*b1cdbd2cSJim Jagielski 					aText.Erase( nPrevIndex, nTokenLen );
411*b1cdbd2cSJim Jagielski 					nIndex = sal::static_int_cast<xub_StrLen>(nIndex - nTokenLen);
412*b1cdbd2cSJim Jagielski 					if ( (nPrevIndex < aText.Len()) && (aText.GetChar( nPrevIndex ) == mcMultiSep) )
413*b1cdbd2cSJim Jagielski 					{
414*b1cdbd2cSJim Jagielski 						aText.Erase( nPrevIndex, 1 );
415*b1cdbd2cSJim Jagielski 						nIndex--;
416*b1cdbd2cSJim Jagielski 					}
417*b1cdbd2cSJim Jagielski 				}
418*b1cdbd2cSJim Jagielski 				aText.EraseLeadingAndTrailingChars( ' ' );
419*b1cdbd2cSJim Jagielski 			}
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski 			// Fehlende Eintraege anhaengen...
422*b1cdbd2cSJim Jagielski 			Table aSelInText;
423*b1cdbd2cSJim Jagielski 			lcl_GetSelectedEntries( aSelInText, aText, mcMultiSep, mpImplLB->GetEntryList() );
424*b1cdbd2cSJim Jagielski 			sal_uInt16 nSelectedEntries = mpImplLB->GetEntryList()->GetSelectEntryCount();
425*b1cdbd2cSJim Jagielski 			for ( sal_uInt16 n = 0; n < nSelectedEntries; n++ )
426*b1cdbd2cSJim Jagielski 			{
427*b1cdbd2cSJim Jagielski 				sal_uInt16 nP = mpImplLB->GetEntryList()->GetSelectEntryPos( n );
428*b1cdbd2cSJim Jagielski 				if ( !aSelInText.IsKeyValid( ImplCreateKey( nP ) ) )
429*b1cdbd2cSJim Jagielski 				{
430*b1cdbd2cSJim Jagielski 					if ( aText.Len() && (aText.GetChar( aText.Len()-1 ) != mcMultiSep) )
431*b1cdbd2cSJim Jagielski 						aText += mcMultiSep;
432*b1cdbd2cSJim Jagielski 					if ( aText.Len() )
433*b1cdbd2cSJim Jagielski 						aText += ' ';   // etwas auflockern
434*b1cdbd2cSJim Jagielski 					aText += mpImplLB->GetEntryList()->GetEntryText( nP );
435*b1cdbd2cSJim Jagielski 					aText += mcMultiSep;
436*b1cdbd2cSJim Jagielski 				}
437*b1cdbd2cSJim Jagielski 			}
438*b1cdbd2cSJim Jagielski 			if ( aText.Len() && (aText.GetChar( aText.Len()-1 ) == mcMultiSep) )
439*b1cdbd2cSJim Jagielski 				aText.Erase( aText.Len()-1, 1 );
440*b1cdbd2cSJim Jagielski 		}
441*b1cdbd2cSJim Jagielski 		else
442*b1cdbd2cSJim Jagielski 		{
443*b1cdbd2cSJim Jagielski 			aText = mpImplLB->GetEntryList()->GetSelectEntry( 0 );
444*b1cdbd2cSJim Jagielski 		}
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 		mpSubEdit->SetText( aText );
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 		Selection aNewSelection( 0, aText.Len() );
449*b1cdbd2cSJim Jagielski 		if ( IsMultiSelectionEnabled() )
450*b1cdbd2cSJim Jagielski 			aNewSelection.Min() = aText.Len();
451*b1cdbd2cSJim Jagielski 		mpSubEdit->SetSelection( aNewSelection );
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 		bCallSelect = sal_True;
454*b1cdbd2cSJim Jagielski 	}
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski 	// #84652# Call GrabFocus and EndPopupMode before calling Select/Modify, but after changing the text
457*b1cdbd2cSJim Jagielski 
458*b1cdbd2cSJim Jagielski 	if ( bPopup && !mpImplLB->IsTravelSelect() &&
459*b1cdbd2cSJim Jagielski 		( !IsMultiSelectionEnabled() || !mpImplLB->GetSelectModifier() ) )
460*b1cdbd2cSJim Jagielski 	{
461*b1cdbd2cSJim Jagielski 		mpFloatWin->EndPopupMode();
462*b1cdbd2cSJim Jagielski 		GrabFocus();
463*b1cdbd2cSJim Jagielski 	}
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 	if ( bCallSelect )
466*b1cdbd2cSJim Jagielski 	{
467*b1cdbd2cSJim Jagielski 		mpSubEdit->SetModifyFlag();
468*b1cdbd2cSJim Jagielski 		mbSyntheticModify = sal_True;
469*b1cdbd2cSJim Jagielski 		Modify();
470*b1cdbd2cSJim Jagielski 		mbSyntheticModify = sal_False;
471*b1cdbd2cSJim Jagielski 		Select();
472*b1cdbd2cSJim Jagielski 	}
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 	return 0;
475*b1cdbd2cSJim Jagielski }
IMPL_LINK(ComboBox,ImplListItemSelectHdl,void *,EMPTYARG)476*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplListItemSelectHdl,  void*, EMPTYARG )
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_DROPDOWN_SELECT );
479*b1cdbd2cSJim Jagielski 	return 1;
480*b1cdbd2cSJim Jagielski }
481*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
482*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplCancelHdl,void *,EMPTYARG)483*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplCancelHdl, void*, EMPTYARG )
484*b1cdbd2cSJim Jagielski {
485*b1cdbd2cSJim Jagielski 	if( IsInDropDown() )
486*b1cdbd2cSJim Jagielski 		mpFloatWin->EndPopupMode();
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 	return 1;
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
492*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplSelectionChangedHdl,void *,n)493*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplSelectionChangedHdl, void*, n )
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski 	if ( !mpImplLB->IsTrackingSelect() )
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 		sal_uInt16 nChanged = (sal_uInt16)(sal_uLong)n;
498*b1cdbd2cSJim Jagielski 		if ( !mpSubEdit->IsReadOnly() && mpImplLB->GetEntryList()->IsEntryPosSelected( nChanged ) )
499*b1cdbd2cSJim Jagielski 			mpSubEdit->SetText( mpImplLB->GetEntryList()->GetEntryText( nChanged ) );
500*b1cdbd2cSJim Jagielski 	}
501*b1cdbd2cSJim Jagielski 	return 1;
502*b1cdbd2cSJim Jagielski }
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
505*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplDoubleClickHdl,void *,EMPTYARG)506*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplDoubleClickHdl, void*, EMPTYARG )
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski 	DoubleClick();
509*b1cdbd2cSJim Jagielski 	return 0;
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
513*b1cdbd2cSJim Jagielski 
ToggleDropDown()514*b1cdbd2cSJim Jagielski void ComboBox::ToggleDropDown()
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski     if( IsDropDownBox() )
517*b1cdbd2cSJim Jagielski     {
518*b1cdbd2cSJim Jagielski         if( mpFloatWin->IsInPopupMode() )
519*b1cdbd2cSJim Jagielski             mpFloatWin->EndPopupMode();
520*b1cdbd2cSJim Jagielski         else
521*b1cdbd2cSJim Jagielski         {
522*b1cdbd2cSJim Jagielski             mpSubEdit->GrabFocus();
523*b1cdbd2cSJim Jagielski             if ( !mpImplLB->GetEntryList()->GetMRUCount() )
524*b1cdbd2cSJim Jagielski                 ImplUpdateFloatSelection();
525*b1cdbd2cSJim Jagielski             else
526*b1cdbd2cSJim Jagielski                 mpImplLB->SelectEntry( 0 , sal_True );
527*b1cdbd2cSJim Jagielski             ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
528*b1cdbd2cSJim Jagielski             mpBtn->SetPressed( sal_True );
529*b1cdbd2cSJim Jagielski             SetSelection( Selection( 0, SELECTION_MAX ) );
530*b1cdbd2cSJim Jagielski             mpFloatWin->StartFloat( sal_True );
531*b1cdbd2cSJim Jagielski             ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
532*b1cdbd2cSJim Jagielski         }
533*b1cdbd2cSJim Jagielski     }
534*b1cdbd2cSJim Jagielski }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
537*b1cdbd2cSJim Jagielski 
Select()538*b1cdbd2cSJim Jagielski void ComboBox::Select()
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski     ImplCallEventListenersAndHandler( VCLEVENT_COMBOBOX_SELECT, maSelectHdl, this );
541*b1cdbd2cSJim Jagielski }
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
544*b1cdbd2cSJim Jagielski 
DoubleClick()545*b1cdbd2cSJim Jagielski void ComboBox::DoubleClick()
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski     ImplCallEventListenersAndHandler( VCLEVENT_COMBOBOX_DOUBLECLICK, maDoubleClickHdl, this );
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
551*b1cdbd2cSJim Jagielski 
EnableAutoSize(sal_Bool bAuto)552*b1cdbd2cSJim Jagielski void ComboBox::EnableAutoSize( sal_Bool bAuto )
553*b1cdbd2cSJim Jagielski {
554*b1cdbd2cSJim Jagielski 	mbDDAutoSize = bAuto;
555*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
556*b1cdbd2cSJim Jagielski 	{
557*b1cdbd2cSJim Jagielski 		if ( bAuto && !mpFloatWin->GetDropDownLineCount() )
558*b1cdbd2cSJim Jagielski         {
559*b1cdbd2cSJim Jagielski             // Adapt to GetListBoxMaximumLineCount here; was on fixed number of five before
560*b1cdbd2cSJim Jagielski             AdaptDropDownLineCountToMaximum();
561*b1cdbd2cSJim Jagielski         }
562*b1cdbd2cSJim Jagielski 		else if ( !bAuto )
563*b1cdbd2cSJim Jagielski         {
564*b1cdbd2cSJim Jagielski 			mpFloatWin->SetDropDownLineCount( 0 );
565*b1cdbd2cSJim Jagielski         }
566*b1cdbd2cSJim Jagielski 	}
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
570*b1cdbd2cSJim Jagielski 
EnableDDAutoWidth(sal_Bool b)571*b1cdbd2cSJim Jagielski void ComboBox::EnableDDAutoWidth( sal_Bool b )
572*b1cdbd2cSJim Jagielski {
573*b1cdbd2cSJim Jagielski     if ( mpFloatWin )
574*b1cdbd2cSJim Jagielski         mpFloatWin->SetAutoWidth( b );
575*b1cdbd2cSJim Jagielski }
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski  // -----------------------------------------------------------------------
578*b1cdbd2cSJim Jagielski 
IsDDAutoWidthEnabled() const579*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsDDAutoWidthEnabled() const
580*b1cdbd2cSJim Jagielski {
581*b1cdbd2cSJim Jagielski     return mpFloatWin ? mpFloatWin->IsAutoWidth() : sal_False;
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
586*b1cdbd2cSJim Jagielski 
SetDropDownLineCount(sal_uInt16 nLines)587*b1cdbd2cSJim Jagielski void ComboBox::SetDropDownLineCount( sal_uInt16 nLines )
588*b1cdbd2cSJim Jagielski {
589*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
590*b1cdbd2cSJim Jagielski 		mpFloatWin->SetDropDownLineCount( nLines );
591*b1cdbd2cSJim Jagielski }
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
594*b1cdbd2cSJim Jagielski 
AdaptDropDownLineCountToMaximum()595*b1cdbd2cSJim Jagielski void ComboBox::AdaptDropDownLineCountToMaximum()
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski     // adapt to maximum allowed number
598*b1cdbd2cSJim Jagielski     SetDropDownLineCount(std::min(GetEntryCount(), GetSettings().GetStyleSettings().GetListBoxMaximumLineCount()));
599*b1cdbd2cSJim Jagielski }
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
602*b1cdbd2cSJim Jagielski 
GetDropDownLineCount() const603*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetDropDownLineCount() const
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski 	sal_uInt16 nLines = 0;
606*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
607*b1cdbd2cSJim Jagielski 		nLines = mpFloatWin->GetDropDownLineCount();
608*b1cdbd2cSJim Jagielski 	return nLines;
609*b1cdbd2cSJim Jagielski }
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
612*b1cdbd2cSJim Jagielski 
SetPosSizePixel(long nX,long nY,long nWidth,long nHeight,sal_uInt16 nFlags)613*b1cdbd2cSJim Jagielski void ComboBox::SetPosSizePixel( long nX, long nY, long nWidth, long nHeight,
614*b1cdbd2cSJim Jagielski 								sal_uInt16 nFlags )
615*b1cdbd2cSJim Jagielski {
616*b1cdbd2cSJim Jagielski 	if( IsDropDownBox() && ( nFlags & WINDOW_POSSIZE_SIZE ) )
617*b1cdbd2cSJim Jagielski 	{
618*b1cdbd2cSJim Jagielski 		Size aPrefSz = mpFloatWin->GetPrefSize();
619*b1cdbd2cSJim Jagielski 		if ( ( nFlags & WINDOW_POSSIZE_HEIGHT ) && ( nHeight >= 2*mnDDHeight ) )
620*b1cdbd2cSJim Jagielski 			aPrefSz.Height() = nHeight-mnDDHeight;
621*b1cdbd2cSJim Jagielski 		if ( nFlags & WINDOW_POSSIZE_WIDTH )
622*b1cdbd2cSJim Jagielski 			aPrefSz.Width() = nWidth;
623*b1cdbd2cSJim Jagielski 		mpFloatWin->SetPrefSize( aPrefSz );
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski 		if ( IsAutoSizeEnabled() && ! (nFlags & WINDOW_POSSIZE_DROPDOWN) )
626*b1cdbd2cSJim Jagielski 			nHeight = mnDDHeight;
627*b1cdbd2cSJim Jagielski 	}
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski 	Edit::SetPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
630*b1cdbd2cSJim Jagielski }
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
633*b1cdbd2cSJim Jagielski 
Resize()634*b1cdbd2cSJim Jagielski void ComboBox::Resize()
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski     Control::Resize();
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 	Size aOutSz = GetOutputSizePixel();
639*b1cdbd2cSJim Jagielski 	if( IsDropDownBox() )
640*b1cdbd2cSJim Jagielski 	{
641*b1cdbd2cSJim Jagielski 		long nSBWidth = GetSettings().GetStyleSettings().GetScrollBarSize();
642*b1cdbd2cSJim Jagielski 		long	nTop = 0;
643*b1cdbd2cSJim Jagielski 		long	nBottom = aOutSz.Height();
644*b1cdbd2cSJim Jagielski 
645*b1cdbd2cSJim Jagielski         Window *pBorder = GetWindow( WINDOW_BORDER );
646*b1cdbd2cSJim Jagielski 		ImplControlValue aControlValue;
647*b1cdbd2cSJim Jagielski 		Point aPoint;
648*b1cdbd2cSJim Jagielski 		Rectangle aContent, aBound;
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski         // use the full extent of the control
651*b1cdbd2cSJim Jagielski 		Rectangle aArea( aPoint, pBorder->GetOutputSizePixel() );
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski 		if ( GetNativeControlRegion(CTRL_COMBOBOX, PART_BUTTON_DOWN,
654*b1cdbd2cSJim Jagielski 				aArea, 0, aControlValue, rtl::OUString(), aBound, aContent) )
655*b1cdbd2cSJim Jagielski 		{
656*b1cdbd2cSJim Jagielski             // convert back from border space to local coordinates
657*b1cdbd2cSJim Jagielski             aPoint = pBorder->ScreenToOutputPixel( OutputToScreenPixel( aPoint ) );
658*b1cdbd2cSJim Jagielski             aContent.Move(-aPoint.X(), -aPoint.Y());
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 		    mpBtn->SetPosSizePixel( aContent.Left(), nTop, aContent.getWidth(), (nBottom-nTop) );
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski             // adjust the size of the edit field
663*b1cdbd2cSJim Jagielski             if ( GetNativeControlRegion(CTRL_COMBOBOX, PART_SUB_EDIT,
664*b1cdbd2cSJim Jagielski                         aArea, 0, aControlValue, rtl::OUString(), aBound, aContent) )
665*b1cdbd2cSJim Jagielski             {
666*b1cdbd2cSJim Jagielski                 // convert back from border space to local coordinates
667*b1cdbd2cSJim Jagielski                 aContent.Move(-aPoint.X(), -aPoint.Y());
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski                 // use the themes drop down size
670*b1cdbd2cSJim Jagielski                 mpSubEdit->SetPosSizePixel( aContent.TopLeft(), aContent.GetSize() );
671*b1cdbd2cSJim Jagielski             }
672*b1cdbd2cSJim Jagielski             else
673*b1cdbd2cSJim Jagielski             {
674*b1cdbd2cSJim Jagielski                 // use the themes drop down size for the button
675*b1cdbd2cSJim Jagielski                 aOutSz.Width() -= aContent.getWidth();
676*b1cdbd2cSJim Jagielski                 mpSubEdit->SetSizePixel( aOutSz );
677*b1cdbd2cSJim Jagielski             }
678*b1cdbd2cSJim Jagielski 		}
679*b1cdbd2cSJim Jagielski 		else
680*b1cdbd2cSJim Jagielski         {
681*b1cdbd2cSJim Jagielski             nSBWidth = CalcZoom( nSBWidth );
682*b1cdbd2cSJim Jagielski 		    mpSubEdit->SetPosSizePixel( Point( 0, 0 ), Size( aOutSz.Width() - nSBWidth, aOutSz.Height() ) );
683*b1cdbd2cSJim Jagielski 		    mpBtn->SetPosSizePixel( aOutSz.Width() - nSBWidth, nTop, nSBWidth, (nBottom-nTop) );
684*b1cdbd2cSJim Jagielski         }
685*b1cdbd2cSJim Jagielski 	}
686*b1cdbd2cSJim Jagielski 	else
687*b1cdbd2cSJim Jagielski 	{
688*b1cdbd2cSJim Jagielski 		mpSubEdit->SetSizePixel( Size( aOutSz.Width(), mnDDHeight ) );
689*b1cdbd2cSJim Jagielski 		mpImplLB->SetPosSizePixel( 0, mnDDHeight, aOutSz.Width(), aOutSz.Height() - mnDDHeight );
690*b1cdbd2cSJim Jagielski 		if ( GetText().Len() )
691*b1cdbd2cSJim Jagielski 			ImplUpdateFloatSelection();
692*b1cdbd2cSJim Jagielski 	}
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	// FloatingWindow-Groesse auch im unsichtbare Zustand auf Stand halten,
695*b1cdbd2cSJim Jagielski 	// weil KEY_PGUP/DOWN ausgewertet wird...
696*b1cdbd2cSJim Jagielski 	if ( mpFloatWin )
697*b1cdbd2cSJim Jagielski 		mpFloatWin->SetSizePixel( mpFloatWin->CalcFloatSize() );
698*b1cdbd2cSJim Jagielski }
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
701*b1cdbd2cSJim Jagielski 
FillLayoutData() const702*b1cdbd2cSJim Jagielski void ComboBox::FillLayoutData() const
703*b1cdbd2cSJim Jagielski {
704*b1cdbd2cSJim Jagielski     mpControlData->mpLayoutData = new vcl::ControlLayoutData();
705*b1cdbd2cSJim Jagielski     AppendLayoutData( *mpSubEdit );
706*b1cdbd2cSJim Jagielski     mpSubEdit->SetLayoutDataParent( this );
707*b1cdbd2cSJim Jagielski     Control* pMainWindow = mpImplLB->GetMainWindow();
708*b1cdbd2cSJim Jagielski     if( mpFloatWin )
709*b1cdbd2cSJim Jagielski     {
710*b1cdbd2cSJim Jagielski         // dropdown mode
711*b1cdbd2cSJim Jagielski         if( mpFloatWin->IsReallyVisible() )
712*b1cdbd2cSJim Jagielski         {
713*b1cdbd2cSJim Jagielski             AppendLayoutData( *pMainWindow );
714*b1cdbd2cSJim Jagielski             pMainWindow->SetLayoutDataParent( this );
715*b1cdbd2cSJim Jagielski         }
716*b1cdbd2cSJim Jagielski     }
717*b1cdbd2cSJim Jagielski     else
718*b1cdbd2cSJim Jagielski     {
719*b1cdbd2cSJim Jagielski         AppendLayoutData( *pMainWindow );
720*b1cdbd2cSJim Jagielski         pMainWindow->SetLayoutDataParent( this );
721*b1cdbd2cSJim Jagielski     }
722*b1cdbd2cSJim Jagielski }
723*b1cdbd2cSJim Jagielski 
724*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
725*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nType)726*b1cdbd2cSJim Jagielski void ComboBox::StateChanged( StateChangedType nType )
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski 	Edit::StateChanged( nType );
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski 	if ( nType == STATE_CHANGE_READONLY )
731*b1cdbd2cSJim Jagielski 	{
732*b1cdbd2cSJim Jagielski 		mpImplLB->SetReadOnly( IsReadOnly() );
733*b1cdbd2cSJim Jagielski 		if ( mpBtn )
734*b1cdbd2cSJim Jagielski 			mpBtn->Enable( IsEnabled() && !IsReadOnly() );
735*b1cdbd2cSJim Jagielski 	}
736*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_ENABLE )
737*b1cdbd2cSJim Jagielski 	{
738*b1cdbd2cSJim Jagielski 		mpSubEdit->Enable( IsEnabled() );
739*b1cdbd2cSJim Jagielski 		mpImplLB->Enable( IsEnabled() && !IsReadOnly() );
740*b1cdbd2cSJim Jagielski 		if ( mpBtn )
741*b1cdbd2cSJim Jagielski 			mpBtn->Enable( IsEnabled() && !IsReadOnly() );
742*b1cdbd2cSJim Jagielski 		Invalidate();
743*b1cdbd2cSJim Jagielski 	}
744*b1cdbd2cSJim Jagielski 	else if( nType == STATE_CHANGE_UPDATEMODE )
745*b1cdbd2cSJim Jagielski 	{
746*b1cdbd2cSJim Jagielski 		mpImplLB->SetUpdateMode( IsUpdateMode() );
747*b1cdbd2cSJim Jagielski 	}
748*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_ZOOM )
749*b1cdbd2cSJim Jagielski 	{
750*b1cdbd2cSJim Jagielski 		mpImplLB->SetZoom( GetZoom() );
751*b1cdbd2cSJim Jagielski 		mpSubEdit->SetZoom( GetZoom() );
752*b1cdbd2cSJim Jagielski 		ImplCalcEditHeight();
753*b1cdbd2cSJim Jagielski 		Resize();
754*b1cdbd2cSJim Jagielski 	}
755*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLFONT )
756*b1cdbd2cSJim Jagielski 	{
757*b1cdbd2cSJim Jagielski 		mpImplLB->SetControlFont( GetControlFont() );
758*b1cdbd2cSJim Jagielski 		mpSubEdit->SetControlFont( GetControlFont() );
759*b1cdbd2cSJim Jagielski 		ImplCalcEditHeight();
760*b1cdbd2cSJim Jagielski 		Resize();
761*b1cdbd2cSJim Jagielski 	}
762*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
763*b1cdbd2cSJim Jagielski 	{
764*b1cdbd2cSJim Jagielski 		mpImplLB->SetControlForeground( GetControlForeground() );
765*b1cdbd2cSJim Jagielski 		mpSubEdit->SetControlForeground( GetControlForeground() );
766*b1cdbd2cSJim Jagielski 	}
767*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
768*b1cdbd2cSJim Jagielski 	{
769*b1cdbd2cSJim Jagielski 		mpImplLB->SetControlBackground( GetControlBackground() );
770*b1cdbd2cSJim Jagielski 		mpSubEdit->SetControlBackground( GetControlBackground() );
771*b1cdbd2cSJim Jagielski 	}
772*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_STYLE )
773*b1cdbd2cSJim Jagielski 	{
774*b1cdbd2cSJim Jagielski 		SetStyle( ImplInitStyle( GetStyle() ) );
775*b1cdbd2cSJim Jagielski 		mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) ? sal_True : sal_False );
776*b1cdbd2cSJim Jagielski 	}
777*b1cdbd2cSJim Jagielski     else if( nType == STATE_CHANGE_MIRRORING )
778*b1cdbd2cSJim Jagielski     {
779*b1cdbd2cSJim Jagielski         if( mpBtn )
780*b1cdbd2cSJim Jagielski         {
781*b1cdbd2cSJim Jagielski             mpBtn->EnableRTL( IsRTLEnabled() );
782*b1cdbd2cSJim Jagielski             ImplInitDropDownButton( mpBtn );
783*b1cdbd2cSJim Jagielski         }
784*b1cdbd2cSJim Jagielski         mpSubEdit->StateChanged( STATE_CHANGE_MIRRORING );
785*b1cdbd2cSJim Jagielski         mpImplLB->EnableRTL( IsRTLEnabled() );
786*b1cdbd2cSJim Jagielski         Resize();
787*b1cdbd2cSJim Jagielski     }
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
791*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)792*b1cdbd2cSJim Jagielski void ComboBox::DataChanged( const DataChangedEvent& rDCEvt )
793*b1cdbd2cSJim Jagielski {
794*b1cdbd2cSJim Jagielski 	Control::DataChanged( rDCEvt );
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski 	if ( (rDCEvt.GetType() == DATACHANGED_FONTS) ||
797*b1cdbd2cSJim Jagielski 		 (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
798*b1cdbd2cSJim Jagielski 		 ((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
799*b1cdbd2cSJim Jagielski 		  (rDCEvt.GetFlags() & SETTINGS_STYLE)) )
800*b1cdbd2cSJim Jagielski 	{
801*b1cdbd2cSJim Jagielski 		if ( mpBtn )
802*b1cdbd2cSJim Jagielski 		{
803*b1cdbd2cSJim Jagielski 			mpBtn->SetSettings( GetSettings() );
804*b1cdbd2cSJim Jagielski 			ImplInitDropDownButton( mpBtn );
805*b1cdbd2cSJim Jagielski 		}
806*b1cdbd2cSJim Jagielski 		Resize();
807*b1cdbd2cSJim Jagielski 		mpImplLB->Resize(); // Wird nicht durch ComboBox::Resize() gerufen, wenn sich die ImplLB nicht aendert.
808*b1cdbd2cSJim Jagielski         SetBackground();    // due to a hack in Window::UpdateSettings the background must be reset
809*b1cdbd2cSJim Jagielski                             // otherwise it will overpaint NWF drawn comboboxes
810*b1cdbd2cSJim Jagielski 	}
811*b1cdbd2cSJim Jagielski }
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
814*b1cdbd2cSJim Jagielski 
PreNotify(NotifyEvent & rNEvt)815*b1cdbd2cSJim Jagielski long ComboBox::PreNotify( NotifyEvent& rNEvt )
816*b1cdbd2cSJim Jagielski {
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	return Edit::PreNotify( rNEvt );
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
822*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)823*b1cdbd2cSJim Jagielski long ComboBox::Notify( NotifyEvent& rNEvt )
824*b1cdbd2cSJim Jagielski {
825*b1cdbd2cSJim Jagielski 	long nDone = 0;
826*b1cdbd2cSJim Jagielski 	if( ( rNEvt.GetType() == EVENT_KEYINPUT ) && ( rNEvt.GetWindow() == mpSubEdit )
827*b1cdbd2cSJim Jagielski 			&& !IsReadOnly() )
828*b1cdbd2cSJim Jagielski 	{
829*b1cdbd2cSJim Jagielski 		KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
830*b1cdbd2cSJim Jagielski 		sal_uInt16	 nKeyCode = aKeyEvt.GetKeyCode().GetCode();
831*b1cdbd2cSJim Jagielski 		switch( nKeyCode )
832*b1cdbd2cSJim Jagielski 		{
833*b1cdbd2cSJim Jagielski 			case KEY_UP:
834*b1cdbd2cSJim Jagielski 			case KEY_DOWN:
835*b1cdbd2cSJim Jagielski 			case KEY_PAGEUP:
836*b1cdbd2cSJim Jagielski 			case KEY_PAGEDOWN:
837*b1cdbd2cSJim Jagielski 			{
838*b1cdbd2cSJim Jagielski 				ImplUpdateFloatSelection();
839*b1cdbd2cSJim Jagielski 				if( ( nKeyCode == KEY_DOWN ) && mpFloatWin && !mpFloatWin->IsInPopupMode() && aKeyEvt.GetKeyCode().IsMod2() )
840*b1cdbd2cSJim Jagielski 				{
841*b1cdbd2cSJim Jagielski                     ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN );
842*b1cdbd2cSJim Jagielski 					mpBtn->SetPressed( sal_True );
843*b1cdbd2cSJim Jagielski 					if ( mpImplLB->GetEntryList()->GetMRUCount() )
844*b1cdbd2cSJim Jagielski 						mpImplLB->SelectEntry( 0 , sal_True );
845*b1cdbd2cSJim Jagielski                     SetSelection( Selection( 0, SELECTION_MAX ) );
846*b1cdbd2cSJim Jagielski 					mpFloatWin->StartFloat( sal_False );
847*b1cdbd2cSJim Jagielski                     ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN );
848*b1cdbd2cSJim Jagielski 					nDone = 1;
849*b1cdbd2cSJim Jagielski 				}
850*b1cdbd2cSJim Jagielski 				else if( ( nKeyCode == KEY_UP ) && mpFloatWin && mpFloatWin->IsInPopupMode() && aKeyEvt.GetKeyCode().IsMod2() )
851*b1cdbd2cSJim Jagielski 				{
852*b1cdbd2cSJim Jagielski 					mpFloatWin->EndPopupMode();
853*b1cdbd2cSJim Jagielski 					nDone = 1;
854*b1cdbd2cSJim Jagielski 				}
855*b1cdbd2cSJim Jagielski 				else
856*b1cdbd2cSJim Jagielski                 {
857*b1cdbd2cSJim Jagielski 					nDone = mpImplLB->ProcessKeyInput( aKeyEvt );
858*b1cdbd2cSJim Jagielski                 }
859*b1cdbd2cSJim Jagielski 			}
860*b1cdbd2cSJim Jagielski 			break;
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski 			case KEY_RETURN:
863*b1cdbd2cSJim Jagielski 			{
864*b1cdbd2cSJim Jagielski 				if( ( rNEvt.GetWindow() == mpSubEdit ) && IsInDropDown() )
865*b1cdbd2cSJim Jagielski 				{
866*b1cdbd2cSJim Jagielski 					mpImplLB->ProcessKeyInput( aKeyEvt );
867*b1cdbd2cSJim Jagielski 					nDone = 1;
868*b1cdbd2cSJim Jagielski 				}
869*b1cdbd2cSJim Jagielski 			}
870*b1cdbd2cSJim Jagielski 			break;
871*b1cdbd2cSJim Jagielski 		}
872*b1cdbd2cSJim Jagielski 	}
873*b1cdbd2cSJim Jagielski 	else if ( (rNEvt.GetType() == EVENT_LOSEFOCUS) && mpFloatWin )
874*b1cdbd2cSJim Jagielski 	{
875*b1cdbd2cSJim Jagielski 		if( mpFloatWin->HasChildPathFocus() )
876*b1cdbd2cSJim Jagielski 			mpSubEdit->GrabFocus();
877*b1cdbd2cSJim Jagielski 		else if ( mpFloatWin->IsInPopupMode() && !HasChildPathFocus( sal_True ) )
878*b1cdbd2cSJim Jagielski 			mpFloatWin->EndPopupMode();
879*b1cdbd2cSJim Jagielski 	}
880*b1cdbd2cSJim Jagielski 	else if( (rNEvt.GetType() == EVENT_COMMAND) &&
881*b1cdbd2cSJim Jagielski 			 (rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL) &&
882*b1cdbd2cSJim Jagielski 			 (rNEvt.GetWindow() == mpSubEdit) )
883*b1cdbd2cSJim Jagielski 	{
884*b1cdbd2cSJim Jagielski         sal_uInt16 nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() );
885*b1cdbd2cSJim Jagielski         if  (   ( nWheelBehavior == MOUSE_WHEEL_ALWAYS )
886*b1cdbd2cSJim Jagielski             ||  (   ( nWheelBehavior == MOUSE_WHEEL_FOCUS_ONLY )
887*b1cdbd2cSJim Jagielski                 &&  HasChildPathFocus()
888*b1cdbd2cSJim Jagielski                 )
889*b1cdbd2cSJim Jagielski             )
890*b1cdbd2cSJim Jagielski         {
891*b1cdbd2cSJim Jagielski             nDone = mpImplLB->HandleWheelAsCursorTravel( *rNEvt.GetCommandEvent() );
892*b1cdbd2cSJim Jagielski         }
893*b1cdbd2cSJim Jagielski         else
894*b1cdbd2cSJim Jagielski         {
895*b1cdbd2cSJim Jagielski             nDone = 0;  // don't eat this event, let the default handling happen (i.e. scroll the context)
896*b1cdbd2cSJim Jagielski         }
897*b1cdbd2cSJim Jagielski 	}
898*b1cdbd2cSJim Jagielski     else if( ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == mpImplLB->GetMainWindow() ) )
899*b1cdbd2cSJim Jagielski 	{
900*b1cdbd2cSJim Jagielski 		mpSubEdit->GrabFocus();
901*b1cdbd2cSJim Jagielski 	}
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski 	return nDone ? nDone : Edit::Notify( rNEvt );
904*b1cdbd2cSJim Jagielski }
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
907*b1cdbd2cSJim Jagielski 
SetText(const XubString & rStr)908*b1cdbd2cSJim Jagielski void ComboBox::SetText( const XubString& rStr )
909*b1cdbd2cSJim Jagielski {
910*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_COMBOBOX_SETTEXT );
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 	Edit::SetText( rStr );
913*b1cdbd2cSJim Jagielski 	ImplUpdateFloatSelection();
914*b1cdbd2cSJim Jagielski }
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
917*b1cdbd2cSJim Jagielski 
SetText(const XubString & rStr,const Selection & rNewSelection)918*b1cdbd2cSJim Jagielski void ComboBox::SetText( const XubString& rStr, const Selection& rNewSelection )
919*b1cdbd2cSJim Jagielski {
920*b1cdbd2cSJim Jagielski     ImplCallEventListeners( VCLEVENT_COMBOBOX_SETTEXT );
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski 	Edit::SetText( rStr, rNewSelection );
923*b1cdbd2cSJim Jagielski 	ImplUpdateFloatSelection();
924*b1cdbd2cSJim Jagielski }
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
927*b1cdbd2cSJim Jagielski 
Modify()928*b1cdbd2cSJim Jagielski void ComboBox::Modify()
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski 	if ( !mbSyntheticModify )
931*b1cdbd2cSJim Jagielski 		ImplUpdateFloatSelection();
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 	Edit::Modify();
934*b1cdbd2cSJim Jagielski }
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
937*b1cdbd2cSJim Jagielski 
ImplUpdateFloatSelection()938*b1cdbd2cSJim Jagielski void ComboBox::ImplUpdateFloatSelection()
939*b1cdbd2cSJim Jagielski {
940*b1cdbd2cSJim Jagielski 	// Text in der ListBox in den sichtbaren Bereich bringen
941*b1cdbd2cSJim Jagielski 	mpImplLB->SetCallSelectionChangedHdl( sal_False );
942*b1cdbd2cSJim Jagielski 	if ( !IsMultiSelectionEnabled() )
943*b1cdbd2cSJim Jagielski 	{
944*b1cdbd2cSJim Jagielski 		XubString	aSearchStr( mpSubEdit->GetText() );
945*b1cdbd2cSJim Jagielski 		sal_uInt16		nSelect = LISTBOX_ENTRY_NOTFOUND;
946*b1cdbd2cSJim Jagielski 		sal_Bool		bSelect = sal_True;
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 		if ( mpImplLB->GetCurrentPos() != LISTBOX_ENTRY_NOTFOUND )
949*b1cdbd2cSJim Jagielski 		{
950*b1cdbd2cSJim Jagielski 			XubString aCurrent = mpImplLB->GetEntryList()->GetEntryText( mpImplLB->GetCurrentPos() );
951*b1cdbd2cSJim Jagielski 			if ( aCurrent == aSearchStr )
952*b1cdbd2cSJim Jagielski 				nSelect = mpImplLB->GetCurrentPos();
953*b1cdbd2cSJim Jagielski 		}
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski 		if ( nSelect == LISTBOX_ENTRY_NOTFOUND )
956*b1cdbd2cSJim Jagielski 			nSelect = mpImplLB->GetEntryList()->FindEntry( aSearchStr );
957*b1cdbd2cSJim Jagielski 		if ( nSelect == LISTBOX_ENTRY_NOTFOUND )
958*b1cdbd2cSJim Jagielski 		{
959*b1cdbd2cSJim Jagielski 			nSelect = mpImplLB->GetEntryList()->FindMatchingEntry( aSearchStr );
960*b1cdbd2cSJim Jagielski 			bSelect = sal_False;
961*b1cdbd2cSJim Jagielski 		}
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 		if( nSelect != LISTBOX_ENTRY_NOTFOUND )
964*b1cdbd2cSJim Jagielski 		{
965*b1cdbd2cSJim Jagielski 			if ( !mpImplLB->IsVisible( nSelect ) )
966*b1cdbd2cSJim Jagielski 				mpImplLB->ShowProminentEntry( nSelect );
967*b1cdbd2cSJim Jagielski 			mpImplLB->SelectEntry( nSelect, bSelect );
968*b1cdbd2cSJim Jagielski 		}
969*b1cdbd2cSJim Jagielski 		else
970*b1cdbd2cSJim Jagielski 		{
971*b1cdbd2cSJim Jagielski 			nSelect = mpImplLB->GetEntryList()->GetSelectEntryPos( 0 );
972*b1cdbd2cSJim Jagielski 			if( nSelect != LISTBOX_ENTRY_NOTFOUND )
973*b1cdbd2cSJim Jagielski 				mpImplLB->SelectEntry( nSelect, sal_False );
974*b1cdbd2cSJim Jagielski 			mpImplLB->ResetCurrentPos();
975*b1cdbd2cSJim Jagielski 		}
976*b1cdbd2cSJim Jagielski 	}
977*b1cdbd2cSJim Jagielski 	else
978*b1cdbd2cSJim Jagielski 	{
979*b1cdbd2cSJim Jagielski 		Table aSelInText;
980*b1cdbd2cSJim Jagielski 		lcl_GetSelectedEntries( aSelInText, mpSubEdit->GetText(), mcMultiSep, mpImplLB->GetEntryList() );
981*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 n = 0; n < mpImplLB->GetEntryList()->GetEntryCount(); n++ )
982*b1cdbd2cSJim Jagielski 			mpImplLB->SelectEntry( n, aSelInText.IsKeyValid( ImplCreateKey( n ) ) );
983*b1cdbd2cSJim Jagielski 	}
984*b1cdbd2cSJim Jagielski 	mpImplLB->SetCallSelectionChangedHdl( sal_True );
985*b1cdbd2cSJim Jagielski }
986*b1cdbd2cSJim Jagielski 
987*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
988*b1cdbd2cSJim Jagielski 
InsertEntry(const XubString & rStr,sal_uInt16 nPos)989*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::InsertEntry( const XubString& rStr, sal_uInt16 nPos )
990*b1cdbd2cSJim Jagielski {
991*b1cdbd2cSJim Jagielski 	sal_uInt16 nRealPos = mpImplLB->InsertEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), rStr );
992*b1cdbd2cSJim Jagielski 	nRealPos = sal::static_int_cast<sal_uInt16>(nRealPos - mpImplLB->GetEntryList()->GetMRUCount());
993*b1cdbd2cSJim Jagielski     CallEventListeners( VCLEVENT_COMBOBOX_ITEMADDED, (void*) sal_IntPtr(nRealPos) );
994*b1cdbd2cSJim Jagielski 	return nRealPos;
995*b1cdbd2cSJim Jagielski }
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
998*b1cdbd2cSJim Jagielski 
InsertEntry(const XubString & rStr,const Image & rImage,sal_uInt16 nPos)999*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::InsertEntry( const XubString& rStr, const Image& rImage, sal_uInt16 nPos )
1000*b1cdbd2cSJim Jagielski {
1001*b1cdbd2cSJim Jagielski 	sal_uInt16 nRealPos = mpImplLB->InsertEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), rStr, rImage );
1002*b1cdbd2cSJim Jagielski 	nRealPos = sal::static_int_cast<sal_uInt16>(nRealPos - mpImplLB->GetEntryList()->GetMRUCount());
1003*b1cdbd2cSJim Jagielski     CallEventListeners( VCLEVENT_COMBOBOX_ITEMADDED, (void*) sal_IntPtr(nRealPos) );
1004*b1cdbd2cSJim Jagielski 	return nRealPos;
1005*b1cdbd2cSJim Jagielski }
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1008*b1cdbd2cSJim Jagielski 
RemoveEntry(const XubString & rStr)1009*b1cdbd2cSJim Jagielski void ComboBox::RemoveEntry( const XubString& rStr )
1010*b1cdbd2cSJim Jagielski {
1011*b1cdbd2cSJim Jagielski 	RemoveEntry( GetEntryPos( rStr ) );
1012*b1cdbd2cSJim Jagielski }
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1015*b1cdbd2cSJim Jagielski 
RemoveEntry(sal_uInt16 nPos)1016*b1cdbd2cSJim Jagielski void ComboBox::RemoveEntry( sal_uInt16 nPos )
1017*b1cdbd2cSJim Jagielski {
1018*b1cdbd2cSJim Jagielski 	mpImplLB->RemoveEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1019*b1cdbd2cSJim Jagielski     CallEventListeners( VCLEVENT_COMBOBOX_ITEMREMOVED, (void*) sal_IntPtr(nPos) );
1020*b1cdbd2cSJim Jagielski }
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1023*b1cdbd2cSJim Jagielski 
Clear()1024*b1cdbd2cSJim Jagielski void ComboBox::Clear()
1025*b1cdbd2cSJim Jagielski {
1026*b1cdbd2cSJim Jagielski 	mpImplLB->Clear();
1027*b1cdbd2cSJim Jagielski     CallEventListeners( VCLEVENT_COMBOBOX_ITEMREMOVED, (void*) sal_IntPtr(-1) );
1028*b1cdbd2cSJim Jagielski }
1029*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1030*b1cdbd2cSJim Jagielski 
GetEntryImage(sal_uInt16 nPos) const1031*b1cdbd2cSJim Jagielski Image ComboBox::GetEntryImage( sal_uInt16 nPos ) const
1032*b1cdbd2cSJim Jagielski {
1033*b1cdbd2cSJim Jagielski     if ( mpImplLB->GetEntryList()->HasEntryImage( nPos ) )
1034*b1cdbd2cSJim Jagielski         return mpImplLB->GetEntryList()->GetEntryImage( nPos );
1035*b1cdbd2cSJim Jagielski     return Image();
1036*b1cdbd2cSJim Jagielski }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1039*b1cdbd2cSJim Jagielski 
GetEntryPos(const XubString & rStr) const1040*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetEntryPos( const XubString& rStr ) const
1041*b1cdbd2cSJim Jagielski {
1042*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = mpImplLB->GetEntryList()->FindEntry( rStr );
1043*b1cdbd2cSJim Jagielski 	if ( nPos != LISTBOX_ENTRY_NOTFOUND )
1044*b1cdbd2cSJim Jagielski 		nPos = sal::static_int_cast<sal_uInt16>(nPos - mpImplLB->GetEntryList()->GetMRUCount());
1045*b1cdbd2cSJim Jagielski 	return nPos;
1046*b1cdbd2cSJim Jagielski }
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1049*b1cdbd2cSJim Jagielski 
GetEntryPos(const void * pData) const1050*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetEntryPos( const void* pData ) const
1051*b1cdbd2cSJim Jagielski {
1052*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = mpImplLB->GetEntryList()->FindEntry( pData );
1053*b1cdbd2cSJim Jagielski 	if ( nPos != LISTBOX_ENTRY_NOTFOUND )
1054*b1cdbd2cSJim Jagielski 		nPos = sal::static_int_cast<sal_uInt16>(nPos - mpImplLB->GetEntryList()->GetMRUCount());
1055*b1cdbd2cSJim Jagielski 	return nPos;
1056*b1cdbd2cSJim Jagielski }
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1059*b1cdbd2cSJim Jagielski 
GetEntry(sal_uInt16 nPos) const1060*b1cdbd2cSJim Jagielski XubString ComboBox::GetEntry( sal_uInt16 nPos ) const
1061*b1cdbd2cSJim Jagielski {
1062*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->GetEntryText( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1063*b1cdbd2cSJim Jagielski }
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1066*b1cdbd2cSJim Jagielski 
GetEntryCount() const1067*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetEntryCount() const
1068*b1cdbd2cSJim Jagielski {
1069*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->GetEntryCount() - mpImplLB->GetEntryList()->GetMRUCount();
1070*b1cdbd2cSJim Jagielski }
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1073*b1cdbd2cSJim Jagielski 
IsTravelSelect() const1074*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsTravelSelect() const
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski 	return mpImplLB->IsTravelSelect();
1077*b1cdbd2cSJim Jagielski }
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1080*b1cdbd2cSJim Jagielski 
IsInDropDown() const1081*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsInDropDown() const
1082*b1cdbd2cSJim Jagielski {
1083*b1cdbd2cSJim Jagielski 	return mpFloatWin && mpFloatWin->IsInPopupMode();
1084*b1cdbd2cSJim Jagielski }
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1087*b1cdbd2cSJim Jagielski 
EnableMultiSelection(sal_Bool bMulti)1088*b1cdbd2cSJim Jagielski void ComboBox::EnableMultiSelection( sal_Bool bMulti )
1089*b1cdbd2cSJim Jagielski {
1090*b1cdbd2cSJim Jagielski 	mpImplLB->EnableMultiSelection( bMulti, sal_False );
1091*b1cdbd2cSJim Jagielski 	mpImplLB->SetMultiSelectionSimpleMode( sal_True );
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1095*b1cdbd2cSJim Jagielski 
IsMultiSelectionEnabled() const1096*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsMultiSelectionEnabled() const
1097*b1cdbd2cSJim Jagielski {
1098*b1cdbd2cSJim Jagielski 	return mpImplLB->IsMultiSelectionEnabled();
1099*b1cdbd2cSJim Jagielski }
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1102*b1cdbd2cSJim Jagielski 
CalcWindowSizePixel(sal_uInt16 nLines) const1103*b1cdbd2cSJim Jagielski long ComboBox::CalcWindowSizePixel( sal_uInt16 nLines ) const
1104*b1cdbd2cSJim Jagielski {
1105*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryHeight() * nLines;
1106*b1cdbd2cSJim Jagielski }
1107*b1cdbd2cSJim Jagielski 
1108*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1109*b1cdbd2cSJim Jagielski 
GetOptimalSize(WindowSizeType eType) const1110*b1cdbd2cSJim Jagielski Size ComboBox::GetOptimalSize(WindowSizeType eType) const
1111*b1cdbd2cSJim Jagielski {
1112*b1cdbd2cSJim Jagielski     switch (eType) {
1113*b1cdbd2cSJim Jagielski     case WINDOWSIZE_MINIMUM:
1114*b1cdbd2cSJim Jagielski         return CalcMinimumSize();
1115*b1cdbd2cSJim Jagielski     default:
1116*b1cdbd2cSJim Jagielski         return Edit::GetOptimalSize( eType );
1117*b1cdbd2cSJim Jagielski     }
1118*b1cdbd2cSJim Jagielski }
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1121*b1cdbd2cSJim Jagielski 
CalcMinimumSize() const1122*b1cdbd2cSJim Jagielski Size ComboBox::CalcMinimumSize() const
1123*b1cdbd2cSJim Jagielski {
1124*b1cdbd2cSJim Jagielski 	Size aSz;
1125*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1126*b1cdbd2cSJim Jagielski 	{
1127*b1cdbd2cSJim Jagielski 		aSz = mpImplLB->CalcSize( mpImplLB->GetEntryList()->GetEntryCount() );
1128*b1cdbd2cSJim Jagielski 		aSz.Height() += mnDDHeight;
1129*b1cdbd2cSJim Jagielski 	}
1130*b1cdbd2cSJim Jagielski 	else
1131*b1cdbd2cSJim Jagielski 	{
1132*b1cdbd2cSJim Jagielski 		aSz.Height() = mpImplLB->CalcSize( 1 ).Height();
1133*b1cdbd2cSJim Jagielski 		aSz.Width() = mpImplLB->GetMaxEntryWidth();
1134*b1cdbd2cSJim Jagielski 		aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
1135*b1cdbd2cSJim Jagielski 	}
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski 	aSz = CalcWindowSize( aSz );
1138*b1cdbd2cSJim Jagielski 	return aSz;
1139*b1cdbd2cSJim Jagielski }
1140*b1cdbd2cSJim Jagielski 
1141*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1142*b1cdbd2cSJim Jagielski 
CalcAdjustedSize(const Size & rPrefSize) const1143*b1cdbd2cSJim Jagielski Size ComboBox::CalcAdjustedSize( const Size& rPrefSize ) const
1144*b1cdbd2cSJim Jagielski {
1145*b1cdbd2cSJim Jagielski 	Size aSz = rPrefSize;
1146*b1cdbd2cSJim Jagielski 	sal_Int32 nLeft, nTop, nRight, nBottom;
1147*b1cdbd2cSJim Jagielski 	((Window*)this)->GetBorder( nLeft, nTop, nRight, nBottom );
1148*b1cdbd2cSJim Jagielski 	aSz.Height() -= nTop+nBottom;
1149*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1150*b1cdbd2cSJim Jagielski 	{
1151*b1cdbd2cSJim Jagielski 		long nEntryHeight = CalcSize( 1, 1 ).Height();
1152*b1cdbd2cSJim Jagielski 		long nLines = aSz.Height() / nEntryHeight;
1153*b1cdbd2cSJim Jagielski 		if ( nLines < 1 )
1154*b1cdbd2cSJim Jagielski 			nLines = 1;
1155*b1cdbd2cSJim Jagielski 		aSz.Height() = nLines * nEntryHeight;
1156*b1cdbd2cSJim Jagielski 		aSz.Height() += mnDDHeight;
1157*b1cdbd2cSJim Jagielski 	}
1158*b1cdbd2cSJim Jagielski 	else
1159*b1cdbd2cSJim Jagielski 	{
1160*b1cdbd2cSJim Jagielski 		aSz.Height() = mnDDHeight;
1161*b1cdbd2cSJim Jagielski 	}
1162*b1cdbd2cSJim Jagielski 	aSz.Height() += nTop+nBottom;
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski 	aSz = CalcWindowSize( aSz );
1165*b1cdbd2cSJim Jagielski 	return aSz;
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1169*b1cdbd2cSJim Jagielski 
CalcSize(sal_uInt16 nColumns,sal_uInt16 nLines) const1170*b1cdbd2cSJim Jagielski Size ComboBox::CalcSize( sal_uInt16 nColumns, sal_uInt16 nLines ) const
1171*b1cdbd2cSJim Jagielski {
1172*b1cdbd2cSJim Jagielski 	// ggf. werden ScrollBars eingeblendet
1173*b1cdbd2cSJim Jagielski 	Size aMinSz = CalcMinimumSize();
1174*b1cdbd2cSJim Jagielski 	Size aSz;
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski 	// Hoehe
1177*b1cdbd2cSJim Jagielski 	if ( nLines )
1178*b1cdbd2cSJim Jagielski 	{
1179*b1cdbd2cSJim Jagielski 		if ( !IsDropDownBox() )
1180*b1cdbd2cSJim Jagielski 			aSz.Height() = mpImplLB->CalcSize( nLines ).Height() + mnDDHeight;
1181*b1cdbd2cSJim Jagielski 		else
1182*b1cdbd2cSJim Jagielski 			aSz.Height() = mnDDHeight;
1183*b1cdbd2cSJim Jagielski 	}
1184*b1cdbd2cSJim Jagielski 	else
1185*b1cdbd2cSJim Jagielski 		aSz.Height() = aMinSz.Height();
1186*b1cdbd2cSJim Jagielski 
1187*b1cdbd2cSJim Jagielski 	// Breite
1188*b1cdbd2cSJim Jagielski 	if ( nColumns )
1189*b1cdbd2cSJim Jagielski 		aSz.Width() = nColumns * GetTextWidth( UniString( 'X' ) );
1190*b1cdbd2cSJim Jagielski 	else
1191*b1cdbd2cSJim Jagielski 		aSz.Width() = aMinSz.Width();
1192*b1cdbd2cSJim Jagielski 
1193*b1cdbd2cSJim Jagielski 	if ( IsDropDownBox() )
1194*b1cdbd2cSJim Jagielski 		aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
1195*b1cdbd2cSJim Jagielski 
1196*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1197*b1cdbd2cSJim Jagielski 	{
1198*b1cdbd2cSJim Jagielski 		if ( aSz.Width() < aMinSz.Width() )
1199*b1cdbd2cSJim Jagielski 			aSz.Height() += GetSettings().GetStyleSettings().GetScrollBarSize();
1200*b1cdbd2cSJim Jagielski 		if ( aSz.Height() < aMinSz.Height() )
1201*b1cdbd2cSJim Jagielski 			aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize();
1202*b1cdbd2cSJim Jagielski 	}
1203*b1cdbd2cSJim Jagielski 
1204*b1cdbd2cSJim Jagielski 	aSz = CalcWindowSize( aSz );
1205*b1cdbd2cSJim Jagielski 	return aSz;
1206*b1cdbd2cSJim Jagielski }
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1209*b1cdbd2cSJim Jagielski 
GetMaxVisColumnsAndLines(sal_uInt16 & rnCols,sal_uInt16 & rnLines) const1210*b1cdbd2cSJim Jagielski void ComboBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines ) const
1211*b1cdbd2cSJim Jagielski {
1212*b1cdbd2cSJim Jagielski 	long nCharWidth = GetTextWidth( UniString( 'x' ) );
1213*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1214*b1cdbd2cSJim Jagielski 	{
1215*b1cdbd2cSJim Jagielski 		Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel();
1216*b1cdbd2cSJim Jagielski 		rnCols = (sal_uInt16)(aOutSz.Width()/nCharWidth);
1217*b1cdbd2cSJim Jagielski 		rnLines = (sal_uInt16)(aOutSz.Height()/mpImplLB->GetEntryHeight());
1218*b1cdbd2cSJim Jagielski 	}
1219*b1cdbd2cSJim Jagielski 	else
1220*b1cdbd2cSJim Jagielski 	{
1221*b1cdbd2cSJim Jagielski 		Size aOutSz = mpSubEdit->GetOutputSizePixel();
1222*b1cdbd2cSJim Jagielski 		rnCols = (sal_uInt16)(aOutSz.Width()/nCharWidth);
1223*b1cdbd2cSJim Jagielski 		rnLines = 1;
1224*b1cdbd2cSJim Jagielski 	}
1225*b1cdbd2cSJim Jagielski }
1226*b1cdbd2cSJim Jagielski 
1227*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1228*b1cdbd2cSJim Jagielski 
Draw(OutputDevice * pDev,const Point & rPos,const Size & rSize,sal_uLong nFlags)1229*b1cdbd2cSJim Jagielski void ComboBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
1230*b1cdbd2cSJim Jagielski {
1231*b1cdbd2cSJim Jagielski 	mpImplLB->GetMainWindow()->ImplInitSettings( sal_True, sal_True, sal_True );
1232*b1cdbd2cSJim Jagielski 
1233*b1cdbd2cSJim Jagielski 	Point aPos = pDev->LogicToPixel( rPos );
1234*b1cdbd2cSJim Jagielski 	Size aSize = pDev->LogicToPixel( rSize );
1235*b1cdbd2cSJim Jagielski 	Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev );
1236*b1cdbd2cSJim Jagielski 	OutDevType eOutDevType = pDev->GetOutDevType();
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 	pDev->Push();
1239*b1cdbd2cSJim Jagielski 	pDev->SetMapMode();
1240*b1cdbd2cSJim Jagielski 	pDev->SetFont( aFont );
1241*b1cdbd2cSJim Jagielski 	pDev->SetTextFillColor();
1242*b1cdbd2cSJim Jagielski 
1243*b1cdbd2cSJim Jagielski 	// Border/Background
1244*b1cdbd2cSJim Jagielski 	pDev->SetLineColor();
1245*b1cdbd2cSJim Jagielski 	pDev->SetFillColor();
1246*b1cdbd2cSJim Jagielski 	sal_Bool bBorder = !(nFlags & WINDOW_DRAW_NOBORDER ) && (GetStyle() & WB_BORDER);
1247*b1cdbd2cSJim Jagielski 	sal_Bool bBackground = !(nFlags & WINDOW_DRAW_NOBACKGROUND) && IsControlBackground();
1248*b1cdbd2cSJim Jagielski 	if ( bBorder || bBackground )
1249*b1cdbd2cSJim Jagielski 	{
1250*b1cdbd2cSJim Jagielski 		Rectangle aRect( aPos, aSize );
1251*b1cdbd2cSJim Jagielski 		// aRect.Top() += nEditHeight;
1252*b1cdbd2cSJim Jagielski 		if ( bBorder )
1253*b1cdbd2cSJim Jagielski 		{
1254*b1cdbd2cSJim Jagielski             ImplDrawFrame( pDev, aRect );
1255*b1cdbd2cSJim Jagielski 		}
1256*b1cdbd2cSJim Jagielski 		if ( bBackground )
1257*b1cdbd2cSJim Jagielski 		{
1258*b1cdbd2cSJim Jagielski 			pDev->SetFillColor( GetControlBackground() );
1259*b1cdbd2cSJim Jagielski 			pDev->DrawRect( aRect );
1260*b1cdbd2cSJim Jagielski 		}
1261*b1cdbd2cSJim Jagielski 	}
1262*b1cdbd2cSJim Jagielski 
1263*b1cdbd2cSJim Jagielski 	// Inhalt
1264*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1265*b1cdbd2cSJim Jagielski 	{
1266*b1cdbd2cSJim Jagielski 	    long        nOnePixel = GetDrawPixel( pDev, 1 );
1267*b1cdbd2cSJim Jagielski 		long        nTextHeight = pDev->GetTextHeight();
1268*b1cdbd2cSJim Jagielski 		long        nEditHeight = nTextHeight + 6*nOnePixel;
1269*b1cdbd2cSJim Jagielski         sal_uInt16      nTextStyle = TEXT_DRAW_VCENTER;
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 		// First, draw the edit part
1272*b1cdbd2cSJim Jagielski         mpSubEdit->Draw( pDev, aPos, Size( aSize.Width(), nEditHeight ), nFlags );
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski         // Second, draw the listbox
1275*b1cdbd2cSJim Jagielski         if ( GetStyle() & WB_CENTER )
1276*b1cdbd2cSJim Jagielski             nTextStyle |= TEXT_DRAW_CENTER;
1277*b1cdbd2cSJim Jagielski         else if ( GetStyle() & WB_RIGHT )
1278*b1cdbd2cSJim Jagielski             nTextStyle |= TEXT_DRAW_RIGHT;
1279*b1cdbd2cSJim Jagielski         else
1280*b1cdbd2cSJim Jagielski             nTextStyle |= TEXT_DRAW_LEFT;
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski 		if ( ( nFlags & WINDOW_DRAW_MONO ) || ( eOutDevType == OUTDEV_PRINTER ) )
1283*b1cdbd2cSJim Jagielski 		{
1284*b1cdbd2cSJim Jagielski 			pDev->SetTextColor( Color( COL_BLACK ) );
1285*b1cdbd2cSJim Jagielski 		}
1286*b1cdbd2cSJim Jagielski 		else
1287*b1cdbd2cSJim Jagielski 		{
1288*b1cdbd2cSJim Jagielski 			if ( !(nFlags & WINDOW_DRAW_NODISABLE ) && !IsEnabled() )
1289*b1cdbd2cSJim Jagielski 			{
1290*b1cdbd2cSJim Jagielski 				const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
1291*b1cdbd2cSJim Jagielski 				pDev->SetTextColor( rStyleSettings.GetDisableColor() );
1292*b1cdbd2cSJim Jagielski 			}
1293*b1cdbd2cSJim Jagielski 			else
1294*b1cdbd2cSJim Jagielski 			{
1295*b1cdbd2cSJim Jagielski 				pDev->SetTextColor( GetTextColor() );
1296*b1cdbd2cSJim Jagielski 			}
1297*b1cdbd2cSJim Jagielski 		}
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 		Rectangle aClip( aPos, aSize );
1300*b1cdbd2cSJim Jagielski 		pDev->IntersectClipRegion( aClip );
1301*b1cdbd2cSJim Jagielski 		sal_uInt16 nLines = (sal_uInt16) ( (aSize.Height()-nEditHeight) / nTextHeight );
1302*b1cdbd2cSJim Jagielski 		if ( !nLines )
1303*b1cdbd2cSJim Jagielski 			nLines = 1;
1304*b1cdbd2cSJim Jagielski 		sal_uInt16 nTEntry = IsReallyVisible() ? mpImplLB->GetTopEntry() : 0;
1305*b1cdbd2cSJim Jagielski 
1306*b1cdbd2cSJim Jagielski         Rectangle aTextRect( aPos, aSize );
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski         aTextRect.Left() += 3*nOnePixel;
1309*b1cdbd2cSJim Jagielski         aTextRect.Right() -= 3*nOnePixel;
1310*b1cdbd2cSJim Jagielski         aTextRect.Top() += nEditHeight + nOnePixel;
1311*b1cdbd2cSJim Jagielski         aTextRect.Bottom() = aTextRect.Top() + nTextHeight;
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski         // the drawing starts here
1314*b1cdbd2cSJim Jagielski         for ( sal_uInt16 n = 0; n < nLines; n++ )
1315*b1cdbd2cSJim Jagielski         {
1316*b1cdbd2cSJim Jagielski 			pDev->DrawText( aTextRect, mpImplLB->GetEntryList()->GetEntryText( n+nTEntry ), nTextStyle );
1317*b1cdbd2cSJim Jagielski             aTextRect.Top() += nTextHeight;
1318*b1cdbd2cSJim Jagielski             aTextRect.Bottom() += nTextHeight;
1319*b1cdbd2cSJim Jagielski         }
1320*b1cdbd2cSJim Jagielski 	}
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski 	pDev->Pop();
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski     // Call Edit::Draw after restoring the MapMode...
1325*b1cdbd2cSJim Jagielski 	if ( IsDropDownBox() )
1326*b1cdbd2cSJim Jagielski 	{
1327*b1cdbd2cSJim Jagielski 		mpSubEdit->Draw( pDev, rPos, rSize, nFlags );
1328*b1cdbd2cSJim Jagielski 		// DD-Button ?
1329*b1cdbd2cSJim Jagielski 	}
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski }
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1334*b1cdbd2cSJim Jagielski 
IMPL_LINK(ComboBox,ImplUserDrawHdl,UserDrawEvent *,pEvent)1335*b1cdbd2cSJim Jagielski IMPL_LINK( ComboBox, ImplUserDrawHdl, UserDrawEvent*, pEvent )
1336*b1cdbd2cSJim Jagielski {
1337*b1cdbd2cSJim Jagielski 	UserDraw( *pEvent );
1338*b1cdbd2cSJim Jagielski 	return 1;
1339*b1cdbd2cSJim Jagielski }
1340*b1cdbd2cSJim Jagielski 
1341*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1342*b1cdbd2cSJim Jagielski 
UserDraw(const UserDrawEvent &)1343*b1cdbd2cSJim Jagielski void ComboBox::UserDraw( const UserDrawEvent& )
1344*b1cdbd2cSJim Jagielski {
1345*b1cdbd2cSJim Jagielski }
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1348*b1cdbd2cSJim Jagielski 
SetUserItemSize(const Size & rSz)1349*b1cdbd2cSJim Jagielski void ComboBox::SetUserItemSize( const Size& rSz )
1350*b1cdbd2cSJim Jagielski {
1351*b1cdbd2cSJim Jagielski 	mpImplLB->GetMainWindow()->SetUserItemSize( rSz );
1352*b1cdbd2cSJim Jagielski }
1353*b1cdbd2cSJim Jagielski 
1354*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1355*b1cdbd2cSJim Jagielski 
GetUserItemSize() const1356*b1cdbd2cSJim Jagielski const Size& ComboBox::GetUserItemSize() const
1357*b1cdbd2cSJim Jagielski {
1358*b1cdbd2cSJim Jagielski 	return mpImplLB->GetMainWindow()->GetUserItemSize();
1359*b1cdbd2cSJim Jagielski }
1360*b1cdbd2cSJim Jagielski 
1361*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1362*b1cdbd2cSJim Jagielski 
EnableUserDraw(sal_Bool bUserDraw)1363*b1cdbd2cSJim Jagielski void ComboBox::EnableUserDraw( sal_Bool bUserDraw )
1364*b1cdbd2cSJim Jagielski {
1365*b1cdbd2cSJim Jagielski 	mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw );
1366*b1cdbd2cSJim Jagielski }
1367*b1cdbd2cSJim Jagielski 
1368*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1369*b1cdbd2cSJim Jagielski 
IsUserDrawEnabled() const1370*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsUserDrawEnabled() const
1371*b1cdbd2cSJim Jagielski {
1372*b1cdbd2cSJim Jagielski 	return mpImplLB->GetMainWindow()->IsUserDrawEnabled();
1373*b1cdbd2cSJim Jagielski }
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1376*b1cdbd2cSJim Jagielski 
DrawEntry(const UserDrawEvent & rEvt,sal_Bool bDrawImage,sal_Bool bDrawText,sal_Bool bDrawTextAtImagePos)1377*b1cdbd2cSJim Jagielski void ComboBox::DrawEntry( const UserDrawEvent& rEvt, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos )
1378*b1cdbd2cSJim Jagielski {
1379*b1cdbd2cSJim Jagielski 	DBG_ASSERT( rEvt.GetDevice() == mpImplLB->GetMainWindow(), "DrawEntry?!" );
1380*b1cdbd2cSJim Jagielski 	mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
1381*b1cdbd2cSJim Jagielski }
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1384*b1cdbd2cSJim Jagielski 
SetSeparatorPos(sal_uInt16 n)1385*b1cdbd2cSJim Jagielski void ComboBox::SetSeparatorPos( sal_uInt16 n )
1386*b1cdbd2cSJim Jagielski {
1387*b1cdbd2cSJim Jagielski 	mpImplLB->SetSeparatorPos( n );
1388*b1cdbd2cSJim Jagielski }
1389*b1cdbd2cSJim Jagielski 
1390*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1391*b1cdbd2cSJim Jagielski 
SetSeparatorPos()1392*b1cdbd2cSJim Jagielski void ComboBox::SetSeparatorPos()
1393*b1cdbd2cSJim Jagielski {
1394*b1cdbd2cSJim Jagielski 	mpImplLB->SetSeparatorPos( LISTBOX_ENTRY_NOTFOUND );
1395*b1cdbd2cSJim Jagielski }
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1398*b1cdbd2cSJim Jagielski 
GetSeparatorPos() const1399*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetSeparatorPos() const
1400*b1cdbd2cSJim Jagielski {
1401*b1cdbd2cSJim Jagielski 	return mpImplLB->GetSeparatorPos();
1402*b1cdbd2cSJim Jagielski }
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1405*b1cdbd2cSJim Jagielski 
SetMRUEntries(const XubString & rEntries,xub_Unicode cSep)1406*b1cdbd2cSJim Jagielski void ComboBox::SetMRUEntries( const XubString& rEntries, xub_Unicode cSep )
1407*b1cdbd2cSJim Jagielski {
1408*b1cdbd2cSJim Jagielski 	mpImplLB->SetMRUEntries( rEntries, cSep );
1409*b1cdbd2cSJim Jagielski }
1410*b1cdbd2cSJim Jagielski 
1411*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1412*b1cdbd2cSJim Jagielski 
GetMRUEntries(xub_Unicode cSep) const1413*b1cdbd2cSJim Jagielski XubString ComboBox::GetMRUEntries( xub_Unicode cSep ) const
1414*b1cdbd2cSJim Jagielski {
1415*b1cdbd2cSJim Jagielski 	return mpImplLB->GetMRUEntries( cSep );
1416*b1cdbd2cSJim Jagielski }
1417*b1cdbd2cSJim Jagielski 
1418*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1419*b1cdbd2cSJim Jagielski 
SetMaxMRUCount(sal_uInt16 n)1420*b1cdbd2cSJim Jagielski void ComboBox::SetMaxMRUCount( sal_uInt16 n )
1421*b1cdbd2cSJim Jagielski {
1422*b1cdbd2cSJim Jagielski 	mpImplLB->SetMaxMRUCount( n );
1423*b1cdbd2cSJim Jagielski }
1424*b1cdbd2cSJim Jagielski 
1425*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1426*b1cdbd2cSJim Jagielski 
GetMaxMRUCount() const1427*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetMaxMRUCount() const
1428*b1cdbd2cSJim Jagielski {
1429*b1cdbd2cSJim Jagielski 	return mpImplLB->GetMaxMRUCount();
1430*b1cdbd2cSJim Jagielski }
1431*b1cdbd2cSJim Jagielski 
GetMRUCount() const1432*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetMRUCount() const
1433*b1cdbd2cSJim Jagielski {
1434*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->GetMRUCount();
1435*b1cdbd2cSJim Jagielski }
1436*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1437*b1cdbd2cSJim Jagielski 
GetDisplayLineCount() const1438*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetDisplayLineCount() const
1439*b1cdbd2cSJim Jagielski {
1440*b1cdbd2cSJim Jagielski     return mpImplLB->GetDisplayLineCount();
1441*b1cdbd2cSJim Jagielski }
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1444*b1cdbd2cSJim Jagielski 
SetEntryData(sal_uInt16 nPos,void * pNewData)1445*b1cdbd2cSJim Jagielski void ComboBox::SetEntryData( sal_uInt16 nPos, void* pNewData )
1446*b1cdbd2cSJim Jagielski {
1447*b1cdbd2cSJim Jagielski 	mpImplLB->SetEntryData( nPos + mpImplLB->GetEntryList()->GetMRUCount(), pNewData );
1448*b1cdbd2cSJim Jagielski }
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1451*b1cdbd2cSJim Jagielski 
GetEntryData(sal_uInt16 nPos) const1452*b1cdbd2cSJim Jagielski void* ComboBox::GetEntryData( sal_uInt16 nPos ) const
1453*b1cdbd2cSJim Jagielski {
1454*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->GetEntryData( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1455*b1cdbd2cSJim Jagielski }
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1458*b1cdbd2cSJim Jagielski 
SetTopEntry(sal_uInt16 nPos)1459*b1cdbd2cSJim Jagielski void ComboBox::SetTopEntry( sal_uInt16 nPos )
1460*b1cdbd2cSJim Jagielski {
1461*b1cdbd2cSJim Jagielski 	mpImplLB->SetTopEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1462*b1cdbd2cSJim Jagielski }
1463*b1cdbd2cSJim Jagielski 
1464*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1465*b1cdbd2cSJim Jagielski 
ShowProminentEntry(sal_uInt16 nPos)1466*b1cdbd2cSJim Jagielski void ComboBox::ShowProminentEntry( sal_uInt16 nPos )
1467*b1cdbd2cSJim Jagielski {
1468*b1cdbd2cSJim Jagielski 	mpImplLB->ShowProminentEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1469*b1cdbd2cSJim Jagielski }
1470*b1cdbd2cSJim Jagielski 
1471*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1472*b1cdbd2cSJim Jagielski 
GetTopEntry() const1473*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetTopEntry() const
1474*b1cdbd2cSJim Jagielski {
1475*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = GetEntryCount() ? mpImplLB->GetTopEntry() : LISTBOX_ENTRY_NOTFOUND;
1476*b1cdbd2cSJim Jagielski 	if ( nPos < mpImplLB->GetEntryList()->GetMRUCount() )
1477*b1cdbd2cSJim Jagielski 		nPos = 0;
1478*b1cdbd2cSJim Jagielski 	return nPos;
1479*b1cdbd2cSJim Jagielski }
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1482*b1cdbd2cSJim Jagielski 
SetProminentEntryType(ProminentEntry eType)1483*b1cdbd2cSJim Jagielski void ComboBox::SetProminentEntryType( ProminentEntry eType )
1484*b1cdbd2cSJim Jagielski {
1485*b1cdbd2cSJim Jagielski     mpImplLB->SetProminentEntryType( eType );
1486*b1cdbd2cSJim Jagielski }
1487*b1cdbd2cSJim Jagielski 
1488*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1489*b1cdbd2cSJim Jagielski 
GetProminentEntryType() const1490*b1cdbd2cSJim Jagielski ProminentEntry ComboBox::GetProminentEntryType() const
1491*b1cdbd2cSJim Jagielski {
1492*b1cdbd2cSJim Jagielski     return mpImplLB->GetProminentEntryType();
1493*b1cdbd2cSJim Jagielski }
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1496*b1cdbd2cSJim Jagielski 
GetDropDownPosSizePixel() const1497*b1cdbd2cSJim Jagielski Rectangle ComboBox::GetDropDownPosSizePixel() const
1498*b1cdbd2cSJim Jagielski {
1499*b1cdbd2cSJim Jagielski     return mpFloatWin ? mpFloatWin->GetWindowExtentsRelative( const_cast<ComboBox*>(this) ) : Rectangle();
1500*b1cdbd2cSJim Jagielski }
1501*b1cdbd2cSJim Jagielski 
1502*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1503*b1cdbd2cSJim Jagielski 
GetListPosSizePixel() const1504*b1cdbd2cSJim Jagielski Rectangle ComboBox::GetListPosSizePixel() const
1505*b1cdbd2cSJim Jagielski {
1506*b1cdbd2cSJim Jagielski     return mpFloatWin ? Rectangle() : mpImplLB->GetMainWindow()->GetWindowExtentsRelative( const_cast<ComboBox*>(this) );
1507*b1cdbd2cSJim Jagielski }
1508*b1cdbd2cSJim Jagielski 
1509*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1510*b1cdbd2cSJim Jagielski 
GetDisplayBackground() const1511*b1cdbd2cSJim Jagielski const Wallpaper& ComboBox::GetDisplayBackground() const
1512*b1cdbd2cSJim Jagielski {
1513*b1cdbd2cSJim Jagielski     if( ! mpSubEdit->IsBackground() )
1514*b1cdbd2cSJim Jagielski         return Control::GetDisplayBackground();
1515*b1cdbd2cSJim Jagielski 
1516*b1cdbd2cSJim Jagielski     const Wallpaper& rBack = mpSubEdit->GetBackground();
1517*b1cdbd2cSJim Jagielski     if( ! rBack.IsBitmap() &&
1518*b1cdbd2cSJim Jagielski         ! rBack.IsGradient() &&
1519*b1cdbd2cSJim Jagielski         rBack.GetColor().GetColor() == COL_TRANSPARENT
1520*b1cdbd2cSJim Jagielski         )
1521*b1cdbd2cSJim Jagielski         return Control::GetDisplayBackground();
1522*b1cdbd2cSJim Jagielski     return rBack;
1523*b1cdbd2cSJim Jagielski }
1524*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetSelectEntryCount() const1525*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetSelectEntryCount() const
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->GetSelectEntryCount();
1528*b1cdbd2cSJim Jagielski }
1529*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetSelectEntryPos(sal_uInt16 nIndex) const1530*b1cdbd2cSJim Jagielski sal_uInt16 ComboBox::GetSelectEntryPos( sal_uInt16 nIndex ) const
1531*b1cdbd2cSJim Jagielski {
1532*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = mpImplLB->GetEntryList()->GetSelectEntryPos( nIndex );
1533*b1cdbd2cSJim Jagielski 	if ( nPos != LISTBOX_ENTRY_NOTFOUND )
1534*b1cdbd2cSJim Jagielski 	{
1535*b1cdbd2cSJim Jagielski 		if ( nPos < mpImplLB->GetEntryList()->GetMRUCount() )
1536*b1cdbd2cSJim Jagielski 			nPos = mpImplLB->GetEntryList()->FindEntry( mpImplLB->GetEntryList()->GetEntryText( nPos ) );
1537*b1cdbd2cSJim Jagielski 		nPos = sal::static_int_cast<sal_uInt16>(nPos - mpImplLB->GetEntryList()->GetMRUCount());
1538*b1cdbd2cSJim Jagielski 	}
1539*b1cdbd2cSJim Jagielski 	return nPos;
1540*b1cdbd2cSJim Jagielski }
1541*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
IsEntryPosSelected(sal_uInt16 nPos) const1542*b1cdbd2cSJim Jagielski sal_Bool ComboBox::IsEntryPosSelected( sal_uInt16 nPos ) const
1543*b1cdbd2cSJim Jagielski {
1544*b1cdbd2cSJim Jagielski 	return mpImplLB->GetEntryList()->IsEntryPosSelected( nPos + mpImplLB->GetEntryList()->GetMRUCount() );
1545*b1cdbd2cSJim Jagielski }
1546*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
SelectEntryPos(sal_uInt16 nPos,sal_Bool bSelect)1547*b1cdbd2cSJim Jagielski void ComboBox::SelectEntryPos( sal_uInt16 nPos, sal_Bool bSelect)
1548*b1cdbd2cSJim Jagielski {
1549*b1cdbd2cSJim Jagielski 	if ( nPos < mpImplLB->GetEntryList()->GetEntryCount() )
1550*b1cdbd2cSJim Jagielski 		mpImplLB->SelectEntry( nPos + mpImplLB->GetEntryList()->GetMRUCount(), bSelect );
1551*b1cdbd2cSJim Jagielski }
1552*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
SetNoSelection()1553*b1cdbd2cSJim Jagielski void ComboBox::SetNoSelection()
1554*b1cdbd2cSJim Jagielski {
1555*b1cdbd2cSJim Jagielski 	mpImplLB->SetNoSelection();
1556*b1cdbd2cSJim Jagielski 	mpSubEdit->SetText( String() );
1557*b1cdbd2cSJim Jagielski }
1558*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetBoundingRectangle(sal_uInt16 nItem) const1559*b1cdbd2cSJim Jagielski Rectangle ComboBox::GetBoundingRectangle( sal_uInt16 nItem ) const
1560*b1cdbd2cSJim Jagielski {
1561*b1cdbd2cSJim Jagielski     Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem );
1562*b1cdbd2cSJim Jagielski     Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (Window*)this );
1563*b1cdbd2cSJim Jagielski     aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() );
1564*b1cdbd2cSJim Jagielski     return aRect;
1565*b1cdbd2cSJim Jagielski }
1566*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1567*b1cdbd2cSJim Jagielski 
SetBorderStyle(sal_uInt16 nBorderStyle)1568*b1cdbd2cSJim Jagielski void ComboBox::SetBorderStyle( sal_uInt16 nBorderStyle )
1569*b1cdbd2cSJim Jagielski {
1570*b1cdbd2cSJim Jagielski 	Window::SetBorderStyle( nBorderStyle );
1571*b1cdbd2cSJim Jagielski 	if ( !IsDropDownBox() )
1572*b1cdbd2cSJim Jagielski 	{
1573*b1cdbd2cSJim Jagielski 		mpSubEdit->SetBorderStyle( nBorderStyle );
1574*b1cdbd2cSJim Jagielski 		mpImplLB->SetBorderStyle( nBorderStyle );
1575*b1cdbd2cSJim Jagielski 	}
1576*b1cdbd2cSJim Jagielski }
1577*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1578*b1cdbd2cSJim Jagielski 
GetIndexForPoint(const Point & rPoint,sal_uInt16 & rPos) const1579*b1cdbd2cSJim Jagielski long ComboBox::GetIndexForPoint( const Point& rPoint, sal_uInt16& rPos ) const
1580*b1cdbd2cSJim Jagielski {
1581*b1cdbd2cSJim Jagielski     if( !HasLayoutData() )
1582*b1cdbd2cSJim Jagielski         FillLayoutData();
1583*b1cdbd2cSJim Jagielski 
1584*b1cdbd2cSJim Jagielski     // check whether rPoint fits at all
1585*b1cdbd2cSJim Jagielski     long nIndex = Control::GetIndexForPoint( rPoint );
1586*b1cdbd2cSJim Jagielski     if( nIndex != -1 )
1587*b1cdbd2cSJim Jagielski     {
1588*b1cdbd2cSJim Jagielski         // point must be either in main list window
1589*b1cdbd2cSJim Jagielski         // or in impl window (dropdown case)
1590*b1cdbd2cSJim Jagielski         ImplListBoxWindow* pMain = mpImplLB->GetMainWindow();
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski         // convert coordinates to ImplListBoxWindow pixel coordinate space
1593*b1cdbd2cSJim Jagielski         Point aConvPoint = LogicToPixel( rPoint );
1594*b1cdbd2cSJim Jagielski         aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint );
1595*b1cdbd2cSJim Jagielski         aConvPoint = pMain->AbsoluteScreenToOutputPixel( aConvPoint );
1596*b1cdbd2cSJim Jagielski         aConvPoint = pMain->PixelToLogic( aConvPoint );
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski         // try to find entry
1599*b1cdbd2cSJim Jagielski         sal_uInt16 nEntry = pMain->GetEntryPosForPoint( aConvPoint );
1600*b1cdbd2cSJim Jagielski         if( nEntry == LISTBOX_ENTRY_NOTFOUND )
1601*b1cdbd2cSJim Jagielski             nIndex = -1;
1602*b1cdbd2cSJim Jagielski         else
1603*b1cdbd2cSJim Jagielski             rPos = nEntry;
1604*b1cdbd2cSJim Jagielski     }
1605*b1cdbd2cSJim Jagielski 
1606*b1cdbd2cSJim Jagielski     // get line relative index
1607*b1cdbd2cSJim Jagielski     if( nIndex != -1 )
1608*b1cdbd2cSJim Jagielski         nIndex = ToRelativeLineIndex( nIndex );
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski     return nIndex;
1611*b1cdbd2cSJim Jagielski }
1612