xref: /AOO41X/main/vcl/inc/ilstbox.hxx (revision 54befb6bcc47df7a34762ec9cc562856b04262b6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _SV_ILSTBOX_HXX
25 #define _SV_ILSTBOX_HXX
26 
27 #include <vcl/sv.h>
28 #include <vcl/image.hxx>
29 #include <vcl/ctrl.hxx>
30 #include <vcl/button.hxx>
31 #include <vcl/floatwin.hxx>
32 #include <vcl/lstbox.h>
33 #include <vcl/timer.hxx>
34 
35 #include "vcl/quickselectionengine.hxx"
36 
37 class ScrollBar;
38 class ScrollBarBox;
39 
40 // -----------------
41 // - ListBox-Types -
42 // -----------------
43 
44 #define HORZ_SCROLL 		4
45 #define IMG_TXT_DISTANCE	6
46 
47 enum LB_EVENT_TYPE
48 {
49 	LET_MBDOWN,
50 	LET_TRACKING,
51 	LET_TRACKING_END,
52 	LET_KEYMOVE,
53 	LET_KEYSPACE
54 };
55 
56 // -----------------
57 // - ImplEntryType -
58 // -----------------
59 
60 struct ImplEntryType
61 {
62 	XubString	maStr;
63 	Image		maImage;
64 	void*		mpUserData;
65 	sal_Bool		mbIsSelected;
66 	long		mnFlags;
67     long        mnHeight;
68 
69 				ImplEntryType( const XubString& rStr, const Image& rImage ) :
70 					maStr( rStr ),
71 					maImage( rImage ),
72 					mnFlags( 0 ),
73                     mnHeight( 0 )
74 				{
75 					mbIsSelected = sal_False;
76 					mpUserData = NULL;
77 				}
78 
79 				ImplEntryType( const XubString& rStr ) :
80 					maStr( rStr ),
81 					mnFlags( 0 ),
82                     mnHeight( 0 )
83 				{
84 					mbIsSelected = sal_False;
85 					mpUserData = NULL;
86 				}
87 
88 				ImplEntryType( const Image& rImage ) :
89 					maImage( rImage ),
90 					mnFlags( 0 ),
91                     mnHeight( 0 )
92 				{
93 					mbIsSelected = sal_False;
94 					mpUserData = NULL;
95 				}
96 };
97 
98 // -----------------
99 // - ImplEntryList -
100 // -----------------
101 
102 class ImplEntryList : private List
103 {
104 private:
105     Window*         mpWindow;   // For getting the current locale when matching strings
106 	sal_uInt16			mnLastSelected;
107 	sal_uInt16			mnSelectionAnchor;
108 	sal_uInt16			mnImages;
109 
110 	sal_uInt16			mnMRUCount;
111 	sal_uInt16			mnMaxMRUCount;
112 
113 	Link			maSelectionChangedHdl;
114 	sal_Bool			mbCallSelectionChangedHdl;
115 
116 	ImplEntryType*	GetEntry( sal_uInt16 nPos )	const { return (ImplEntryType*)List::GetObject( nPos ); }
117 
118 public:
119 					ImplEntryList( Window* pWindow );
120 					~ImplEntryList();
121 
122 	sal_uInt16					InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry, sal_Bool bSort );
123 	void					RemoveEntry( sal_uInt16 nPos );
124 	const ImplEntryType* 	GetEntryPtr( sal_uInt16 nPos ) const { return (const ImplEntryType*) GetObject( nPos ); }
125 	ImplEntryType* 	        GetMutableEntryPtr( sal_uInt16 nPos ) const { return (ImplEntryType*) GetObject( nPos ); }
126 	void					Clear();
127 
128 	sal_uInt16			FindMatchingEntry( const XubString& rStr, sal_uInt16 nStart = 0, sal_Bool bForward = sal_True, sal_Bool bLazy = sal_True ) const;
129 	sal_uInt16			FindEntry( const XubString& rStr, sal_Bool bSearchMRUArea = sal_False ) const;
130 	sal_uInt16			FindEntry( const void* pData ) const;
131 
132     // helper: add up heights up to index nEndIndex.
133     // GetAddedHeight( 0 ) returns 0
134     // GetAddedHeight( LISTBOX_ENTRY_NOTFOUND ) returns 0
135     // GetAddedHeight( i, k ) with k > i is equivalent -GetAddedHeight( k, i )
136     long            GetAddedHeight( sal_uInt16 nEndIndex, sal_uInt16 nBeginIndex = 0, long nBeginHeight = 0 ) const;
137     long            GetEntryHeight( sal_uInt16 nPos ) const;
138 
139 	sal_uInt16			GetEntryCount() const { return (sal_uInt16)List::Count(); }
140 	sal_Bool			HasImages() const { return mnImages ? sal_True : sal_False; }
141 
142 	XubString		GetEntryText( sal_uInt16 nPos ) const;
143 
144 	sal_Bool			HasEntryImage( sal_uInt16 nPos ) const;
145 	Image			GetEntryImage( sal_uInt16 nPos ) const;
146 
147 	void			SetEntryData( sal_uInt16 nPos, void* pNewData );
148 	void*			GetEntryData( sal_uInt16 nPos ) const;
149 
150 	void			SetEntryFlags( sal_uInt16 nPos, long nFlags );
151 	long			GetEntryFlags( sal_uInt16 nPos ) const;
152 
153 	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
154 
155 	sal_uInt16			GetSelectEntryCount() const;
156 	XubString		GetSelectEntry( sal_uInt16 nIndex ) const;
157 	sal_uInt16			GetSelectEntryPos( sal_uInt16 nIndex ) const;
158 	sal_Bool			IsEntrySelected( const XubString& rStr ) const;
159 	sal_Bool			IsEntryPosSelected( sal_uInt16 nIndex ) const;
160 
161 	void			SetLastSelected( sal_uInt16 nPos )	{ mnLastSelected = nPos; }
162 	sal_uInt16			GetLastSelected() const { return mnLastSelected; }
163 
164 	void			SetSelectionAnchor( sal_uInt16 nPos )	{ mnSelectionAnchor = nPos; }
165 	sal_uInt16			GetSelectionAnchor() const { return mnSelectionAnchor; }
166 
167 
168 	void			SetSelectionChangedHdl( const Link& rLnk )	{ maSelectionChangedHdl = rLnk; }
169 	void			SetCallSelectionChangedHdl( sal_Bool bCall )	{ mbCallSelectionChangedHdl = bCall; }
170 
171 	void			SetMRUCount( sal_uInt16 n )	{ mnMRUCount = n; }
172 	sal_uInt16			GetMRUCount() const		{ return mnMRUCount; }
173 
174 	void			SetMaxMRUCount( sal_uInt16 n )	{ mnMaxMRUCount = n; }
175 	sal_uInt16			GetMaxMRUCount() const		{ return mnMaxMRUCount; }
176 
177 	/**	An Entry is selectable if its mnFlags does not have the
178 		LISTBOX_ENTRY_FLAG_DISABLE_SELECTION flag set. */
179 	bool			IsEntrySelectable( sal_uInt16 nPos ) const;
180 
181 	/** returns the first entry found from the given position nPos that is selectable
182 		or LISTBOX_ENTRY_NOTFOUND if non is found. If the entry at nPos is not selectable,
183 		it returns the first selectable entry after nPos if bForward is true and the
184 		first selectable entry after nPos is bForward is false.
185 		*/
186 	sal_uInt16			FindFirstSelectable( sal_uInt16 nPos, bool bForward = true );
187 };
188 
189 // ---------------------
190 // - ImplListBoxWindow -
191 // ---------------------
192 
193 class ImplListBoxWindow : public Control, public ::vcl::ISearchableStringList
194 {
195 private:
196 	ImplEntryList*	mpEntryList;	 // EntryListe
197 	Rectangle		maFocusRect;
198 
199 	Size			maUserItemSize;
200 
201 	long			mnMaxTxtHeight;  // Maximale Hoehe eines Text-Items
202 	long			mnMaxTxtWidth;	 // Maximale Breite eines Text-Items
203 									 // Entry ohne Image
204 	long			mnMaxImgTxtWidth;// Maximale Breite eines Text-Items
205 									 // Entry UND Image
206 	long			mnMaxImgWidth;	 // Maximale Breite eines Image-Items
207 	long			mnMaxImgHeight;  // Maximale Hoehe eines Image-Items
208 	long			mnMaxWidth; 	 // Maximale Breite eines Eintrags
209 	long			mnMaxHeight;	 // Maximale Hoehe eines Eintrags
210 
211 	sal_uInt16			mnCurrentPos;	 // Position (Focus)
212 	sal_uInt16			mnTrackingSaveSelection; // Selektion vor Tracking();
213 
214 	sal_uInt16			mnSeparatorPos;	// Separator
215 
216 	sal_uInt16			mnUserDrawEntry;
217 
218 	sal_uInt16			mnTop;			 // Ausgabe ab Zeile
219 	long			mnLeft; 		 // Ausgabe ab Spalte
220 	long			mnBorder;		 // Abstand Rahmen - Text
221 	long			mnTextHeight;	 // Texthoehe
222 	ProminentEntry  meProminentType; // where is the "prominent" entry
223 
224 	sal_uInt16			mnSelectModifier;	// Modifiers
225 
226     sal_Bool			mbHasFocusRect:         1,
227                     mbSort: 				1,	// ListBox sortiert
228 					mbTrack:				1,	// Tracking
229 					mbMulti:				1,	// MultiListBox
230 					mbStackMode:			1,	// StackSelection
231 					mbSimpleMode:			1,	// SimpleMode fuer MultiListBox
232 					mbImgsDiffSz:			1,	// Images haben verschiedene Groessen
233 					mbTravelSelect: 		1,	// TravelSelect
234 					mbTrackingSelect: 		1,	// Selektiert bei MouseMove
235 					mbSelectionChanged:		1,	// Select() nicht zu oft rufen...
236 					mbMouseMoveSelect:		1,  // Selektieren bei MouseMove
237 					mbGrabFocus:			1,  // Focus bei MBDown grabben
238 					mbUserDrawEnabled:		1,	// UserDraw possible
239 					mbInUserDraw:			1,	// In UserDraw
240 					mbReadOnly:				1,	// ReadOnly
241 					mbMirroring:			1,	// pb: #106948# explicit mirroring for calc
242                     mbRight:                1,  // right align Text output
243                     mbCenter:               1;  // center Text output
244 
245 	Link			maScrollHdl;
246 	Link			maSelectHdl;
247 	Link			maCancelHdl;
248 	Link			maDoubleClickHdl;
249 	Link			maUserDrawHdl;
250 	Link			maMRUChangedHdl;
251 
252     ::vcl::QuickSelectionEngine
253                     maQuickSelectionEngine;
254 
255 protected:
256 	virtual void	KeyInput( const KeyEvent& rKEvt );
257 	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
258 	virtual void	MouseMove( const MouseEvent& rMEvt );
259 	virtual void	Tracking( const TrackingEvent& rTEvt );
260 	virtual void	Paint( const Rectangle& rRect );
261 	virtual void	Resize();
262 	virtual void	GetFocus();
263 	virtual void	LoseFocus();
264 
265 	sal_Bool			SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False );
266 	void			ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false );
267     void			ImplDoPaint( const Rectangle& rRect, bool bLayout = false );
268 	void			ImplCalcMetrics();
269 	void			ImplUpdateEntryMetrics( ImplEntryType& rEntry );
270 	void			ImplCallSelect();
271 
272     void            ImplShowFocusRect();
273     void            ImplHideFocusRect();
274 
275 
276 	virtual void	StateChanged( StateChangedType nType );
277 	virtual void	DataChanged( const DataChangedEvent& rDCEvt );
278 
279 public:
280     virtual void  FillLayoutData() const;
281 
282 					ImplListBoxWindow( Window* pParent, WinBits nWinStyle );
283 					~ImplListBoxWindow();
284 
285 	ImplEntryList*	GetEntryList() const { return mpEntryList; }
286 
287 	sal_uInt16			InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry );
288 	void			RemoveEntry( sal_uInt16 nPos );
289 	void			Clear();
290 	void			ResetCurrentPos()				{ mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; }
291 	sal_uInt16			GetCurrentPos()	const			{ return mnCurrentPos; }
292     sal_uInt16			GetDisplayLineCount() const;
293     void            SetEntryFlags( sal_uInt16 nPos, long nFlags );
294 
295 	void 			DrawEntry( sal_uInt16 nPos, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );
296 
297 	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
298 	void			DeselectAll();
299     sal_uInt16			GetEntryPosForPoint( const Point& rPoint ) const;
300     sal_uInt16          GetLastVisibleEntry() const;
301 
302 	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt );
303 
304 	void			SetTopEntry( sal_uInt16 nTop );
305 	sal_uInt16			GetTopEntry() const 			{ return mnTop; }
306 	// ShowProminentEntry will set the entry correspoding to nEntryPos
307 	// either at top or in the middle depending on the chosen style
308 	void            ShowProminentEntry( sal_uInt16 nEntryPos );
309 	void            SetProminentEntryType( ProminentEntry eType ) { meProminentType = eType; }
310 	ProminentEntry  GetProminentEntryType() const { return meProminentType; }
311     using Window::IsVisible;
312 	sal_Bool			IsVisible( sal_uInt16 nEntry ) const;
313 
314 	long			GetLeftIndent() const			{ return mnLeft; }
315 	void			SetLeftIndent( long n );
316 	void			ScrollHorz( long nDiff );
317 
318 	void			AllowGrabFocus( sal_Bool b )		{ mbGrabFocus = b; }
319 	sal_Bool			IsGrabFocusAllowed() const		{ return mbGrabFocus; }
320 
321 	void			SetSeparatorPos( sal_uInt16 n )		{ mnSeparatorPos = n; }
322 	sal_uInt16			GetSeparatorPos() const			{ return mnSeparatorPos; }
323 
324 	void            SetTravelSelect( sal_Bool bTravelSelect ) { mbTravelSelect = bTravelSelect; }
325 	sal_Bool			IsTravelSelect() const			{ return mbTravelSelect; }
326 	sal_Bool			IsTrackingSelect() const			{ return mbTrackingSelect; }
327 
328 	void			SetUserItemSize( const Size& rSz );
329 	const Size&		GetUserItemSize() const				{ return maUserItemSize; }
330 
331 	void			EnableUserDraw( sal_Bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; }
332 	sal_Bool			IsUserDrawEnabled() const 	{ return mbUserDrawEnabled; }
333 
334 	void			EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { mbMulti = bMulti; mbStackMode = bStackMode; }
335 	sal_Bool			IsMultiSelectionEnabled() const 	{ return mbMulti; }
336 
337 	void			SetMultiSelectionSimpleMode( sal_Bool bSimple )	{ mbSimpleMode = bSimple; }
338 	sal_Bool			IsMultiSelectionSimpleMode() const 			{ return mbSimpleMode; }
339 
340 	void			EnableMouseMoveSelect( sal_Bool bMouseMoveSelect ) { mbMouseMoveSelect = bMouseMoveSelect; }
341 	sal_Bool			IsMouseMoveSelectEnabled() const 	{ return mbMouseMoveSelect; }
342 	sal_Bool			IsMouseMoveSelect() const 	{ return mbMouseMoveSelect||mbStackMode; }
343 
344 	Size			CalcSize( sal_uInt16 nMaxLines ) const;
345     Rectangle       GetBoundingRectangle( sal_uInt16 nItem ) const;
346 
347     long			GetEntryHeight() const				{ return mnMaxHeight; }
348 	long			GetMaxEntryWidth() const			{ return mnMaxWidth; }
349 
350 	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
351 	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
352 	void			SetSelectHdl( const Link& rLink )	{ maSelectHdl = rLink; }
353 	const Link& 	GetSelectHdl() const				{ return maSelectHdl; }
354 	void			SetCancelHdl( const Link& rLink )	{ maCancelHdl = rLink; }
355 	const Link& 	GetCancelHdl() const				{ return maCancelHdl; }
356 	void			SetDoubleClickHdl( const Link& rLink )	{ maDoubleClickHdl = rLink; }
357 	const Link& 	GetDoubleClickHdl() const				{ return maDoubleClickHdl; }
358 	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
359 	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }
360 	void			SetMRUChangedHdl( const Link& rLink )	{ maMRUChangedHdl = rLink; }
361 	const Link& 	GetMRUChangedHdl() const				{ return maMRUChangedHdl; }
362 
363 	sal_Bool			IsSelectionChanged() const { return mbSelectionChanged; }
364 	sal_uInt16			GetSelectModifier() const { return mnSelectModifier; }
365 
366 	void			EnableSort( sal_Bool b ) { mbSort = b; }
367 
368 	void			SetReadOnly( sal_Bool bReadOnly ) 	{ mbReadOnly = bReadOnly; }
369 	sal_Bool			IsReadOnly() const 				{ return mbReadOnly; }
370 
371     using Control::ImplInitSettings;
372 	void			ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
373     sal_uInt16          ImplGetTextStyle() const;
374 
375 	// pb: #106948# explicit mirroring for calc
376 	inline void		EnableMirroring()		{ mbMirroring = sal_True; }
377 	inline sal_Bool		IsMirroring() const { return mbMirroring; }
378 
379 protected:
380     // ISearchableStringList
381     virtual ::vcl::StringEntryIdentifier    CurrentEntry( String& _out_entryText ) const;
382     virtual ::vcl::StringEntryIdentifier    NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const;
383     virtual void                            SelectEntry( ::vcl::StringEntryIdentifier _entry );
384 };
385 
386 // ---------------
387 // - ImplListBox -
388 // ---------------
389 
390 class ImplListBox : public Control
391 {
392 private:
393 	ImplListBoxWindow	maLBWindow;
394 	ScrollBar*			mpHScrollBar;
395 	ScrollBar*			mpVScrollBar;
396 	ScrollBarBox*		mpScrollBarBox;
397 	sal_Bool				mbVScroll		: 1,	// VScroll an oder aus
398 						mbHScroll		: 1,	// HScroll an oder aus
399 						mbAutoHScroll	: 1;	// AutoHScroll an oder aus
400 	Link				maScrollHdl;	// Weil der vom ImplListBoxWindow selbst benoetigt wird.
401     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer;
402 
403 protected:
404 	virtual void		GetFocus();
405 	virtual void		StateChanged( StateChangedType nType );
406 	virtual void		DataChanged( const DataChangedEvent& rDCEvt );
407 
408 	long 				Notify( NotifyEvent& rNEvt );
409 
410 	void				ImplResizeControls();
411 	void				ImplCheckScrollBars();
412 	void				ImplInitScrollBars();
413 
414 	DECL_LINK(			ScrollBarHdl, ScrollBar* );
415 	DECL_LINK(			LBWindowScrolled, void* );
416 	DECL_LINK(			MRUChanged, void* );
417 
418 public:
419 					ImplListBox( Window* pParent, WinBits nWinStyle );
420 					~ImplListBox();
421 
422 	const ImplEntryList*	GetEntryList() const			{ return maLBWindow.GetEntryList(); }
423 	ImplListBoxWindow* 		GetMainWindow() 				{ return &maLBWindow; }
424 
425 	virtual void	Resize();
426     virtual const Wallpaper& GetDisplayBackground() const;
427     virtual Window*     GetPreferredKeyInputWindow();
428 
429 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr );
430 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const Image& rImage );
431 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr, const Image& rImage );
432 	void			RemoveEntry( sal_uInt16 nPos );
433 	void			SetEntryData( sal_uInt16 nPos, void* pNewData )	{ maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); }
434 	void			Clear();
435 
436 	void			SetEntryFlags( sal_uInt16 nPos, long nFlags );
437 	long			GetEntryFlags( sal_uInt16 nPos ) const;
438 
439 	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
440 	void			SetNoSelection();
441 	void			ResetCurrentPos()				{ maLBWindow.ResetCurrentPos(); }
442 	sal_uInt16			GetCurrentPos()	const			{ return maLBWindow.GetCurrentPos(); }
443 
444 	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt )	{ return maLBWindow.ProcessKeyInput( rKEvt ); }
445 	sal_Bool			HandleWheelAsCursorTravel( const CommandEvent& rCEvt );
446 
447 	void			SetSeparatorPos( sal_uInt16 n )		{ maLBWindow.SetSeparatorPos( n ); }
448 	sal_uInt16			GetSeparatorPos() const			{ return maLBWindow.GetSeparatorPos(); }
449 
450 	void			SetTopEntry( sal_uInt16 nTop )		{ maLBWindow.SetTopEntry( nTop ); }
451 	sal_uInt16			GetTopEntry() const 			{ return maLBWindow.GetTopEntry(); }
452 	void            ShowProminentEntry( sal_uInt16 nPos ) { maLBWindow.ShowProminentEntry( nPos ); }
453     using Window::IsVisible;
454 	sal_Bool			IsVisible( sal_uInt16 nEntry ) const { return maLBWindow.IsVisible( nEntry ); }
455 
456 	void            SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); }
457 	ProminentEntry  GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); }
458 
459 	long			GetLeftIndent() const			{ return maLBWindow.GetLeftIndent(); }
460 	void			SetLeftIndent( sal_uInt16 n )		{ maLBWindow.SetLeftIndent( n ); }
461 	void			ScrollHorz( short nDiff )		{ maLBWindow.ScrollHorz( nDiff ); }
462 
463 	void            SetTravelSelect( sal_Bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); }
464 	sal_Bool			IsTravelSelect() const			{ return maLBWindow.IsTravelSelect(); }
465 	sal_Bool			IsTrackingSelect() const			{ return maLBWindow.IsTrackingSelect(); }
466 
467 	void			EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); }
468 	sal_Bool			IsMultiSelectionEnabled() const 	{ return maLBWindow.IsMultiSelectionEnabled(); }
469 
470 	void			SetMultiSelectionSimpleMode( sal_Bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); }
471 	sal_Bool			IsMultiSelectionSimpleMode() const 	{ return maLBWindow.IsMultiSelectionSimpleMode(); }
472 
473 	void			SetReadOnly( sal_Bool b ) 			{ maLBWindow.SetReadOnly( b ); }
474 	sal_Bool			IsReadOnly() const 				{ return maLBWindow.IsReadOnly(); }
475 
476 
477 	Size			CalcSize( sal_uInt16 nMaxLines ) const				{ return maLBWindow.CalcSize( nMaxLines ); }
478 	long			GetEntryHeight() const			{ return maLBWindow.GetEntryHeight(); }
479 	long			GetMaxEntryWidth() const		{ return maLBWindow.GetMaxEntryWidth(); }
480 
481 	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
482 	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
483 	void			SetSelectHdl( const Link& rLink )	{ maLBWindow.SetSelectHdl( rLink ); }
484 	const Link& 	GetSelectHdl() const				{ return maLBWindow.GetSelectHdl(); }
485 	void			SetCancelHdl( const Link& rLink )	{ maLBWindow.SetCancelHdl( rLink ); }
486 	const Link& 	GetCancelHdl() const				{ return maLBWindow.GetCancelHdl(); }
487 	void			SetDoubleClickHdl( const Link& rLink )	{ maLBWindow.SetDoubleClickHdl( rLink ); }
488 	const Link& 	GetDoubleClickHdl() const				{ return maLBWindow.GetDoubleClickHdl(); }
489 	void			SetUserDrawHdl( const Link& rLink )	{ maLBWindow.SetUserDrawHdl( rLink ); }
490 	const Link& 	GetUserDrawHdl() const				{ return maLBWindow.GetUserDrawHdl(); }
491 
492 	void			SetSelectionChangedHdl( const Link& rLnk )	{ maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); }
493 	void			SetCallSelectionChangedHdl( sal_Bool bCall )	{ maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
494 	sal_Bool			IsSelectionChanged() const 					{ return maLBWindow.IsSelectionChanged(); }
495 	sal_uInt16			GetSelectModifier() const 					{ return maLBWindow.GetSelectModifier(); }
496 
497 	void			SetMRUEntries( const XubString& rEntries, xub_Unicode cSep );
498 	XubString		GetMRUEntries( xub_Unicode cSep ) const;
499 	void			SetMaxMRUCount( sal_uInt16 n )					{ maLBWindow.GetEntryList()->SetMaxMRUCount( n ); }
500 	sal_uInt16			GetMaxMRUCount() const						{ return maLBWindow.GetEntryList()->GetMaxMRUCount(); }
501     sal_uInt16			GetDisplayLineCount() const
502     { return maLBWindow.GetDisplayLineCount(); }
503 
504 	// pb: #106948# explicit mirroring for calc
505 	inline void		EnableMirroring()	{ maLBWindow.EnableMirroring(); }
506     inline void     SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; }
507 };
508 
509 // -----------------------------
510 // - ImplListBoxFloatingWindow -
511 // -----------------------------
512 
513 class ImplListBoxFloatingWindow : public FloatingWindow
514 {
515 private:
516 	ImplListBox*	mpImplLB;
517 	Size			maPrefSz;
518 	sal_uInt16			mnDDLineCount;
519     sal_uInt16          mnPopupModeStartSaveSelection;
520 	sal_Bool			mbAutoWidth;
521 
522 protected:
523 	long			PreNotify( NotifyEvent& rNEvt );
524 
525 public:
526 					ImplListBoxFloatingWindow( Window* pParent );
527 
528 	void			SetImplListBox( ImplListBox* pLB )	{ mpImplLB = pLB; }
529 
530 	void			SetPrefSize( const Size& rSz )		{ maPrefSz = rSz; }
531 	const Size& 	GetPrefSize() const 				{ return maPrefSz; }
532 
533 	void			SetAutoWidth( sal_Bool b )				{ mbAutoWidth = b; }
534     sal_Bool            IsAutoWidth() const                 { return mbAutoWidth; }
535 
536 	Size			CalcFloatSize();
537 	void			StartFloat( sal_Bool bStartTracking );
538 
539 	virtual void	SetPosSizePixel( long nX, long nY,
540 									 long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
541 	void			SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
542 						{ FloatingWindow::SetPosSizePixel( rNewPos, rNewSize ); }
543 
544 	void			SetDropDownLineCount( sal_uInt16 n ) { mnDDLineCount = n; }
545 	sal_uInt16			GetDropDownLineCount() const { return mnDDLineCount; }
546 
547     sal_uInt16          GetPopupModeStartSaveSelection() const { return mnPopupModeStartSaveSelection; }
548 
549     virtual void	Resize();
550 };
551 
552 // -----------
553 // - ImplWin -
554 // -----------
555 
556 class ImplWin : public Control
557 {
558 private:
559 
560 	sal_uInt16			mnItemPos;	// wegen UserDraw muss ich wissen, welches Item ich darstelle.
561 	XubString		maString;
562 	Image			maImage;
563 	Image			maImageHC;
564 
565 	Rectangle		maFocusRect;
566 	Size			maUserItemSize;
567 
568 	Link			maMBDownHdl;
569 	Link			maUserDrawHdl;
570 
571 	sal_Bool			mbUserDrawEnabled	: 1,
572 					mbInUserDraw		: 1;
573 
574 
575     void ImplDraw( bool bLayout = false );
576 protected:
577     virtual void  FillLayoutData() const;
578 public:
579 
580 					ImplWin( Window* pParent, WinBits nWinStyle = 0 );
581 					~ImplWin() {};
582 
583 	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
584 	virtual void	Paint( const Rectangle& rRect );
585 	virtual void	Resize();
586 	virtual void	GetFocus();
587 	virtual void	LoseFocus();
588     virtual long    PreNotify( NotifyEvent& rNEvt );
589 
590 	sal_uInt16			GetItemPos() const { return mnItemPos; }
591 	void			SetItemPos( sal_uInt16 n ) { mnItemPos = n; }
592 
593 	const XubString& GetString() const { return maString; }
594 	void			SetString( const XubString& rStr ) { maString = rStr; }
595 
596 	const Image&	GetImage() const { return maImage; }
597 	void			SetImage( const Image& rImg ) { maImage = rImg; }
598 
599     sal_Bool            SetModeImage( const Image& rImage, BmpColorMode eMode = BMP_COLOR_NORMAL );
600     const Image&    GetModeImage( BmpColorMode eMode = BMP_COLOR_NORMAL ) const;
601 
602 
603 	virtual void	MBDown();
604 	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
605 	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }
606 
607 	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
608 	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }
609 
610 	void			SetUserItemSize( const Size& rSz )	{ maUserItemSize = rSz; }
611 	const Size&		GetUserItemSize() const				{ return maUserItemSize; }
612 
613 	void			EnableUserDraw( sal_Bool bUserDraw ) 	{ mbUserDrawEnabled = bUserDraw; }
614 	sal_Bool			IsUserDrawEnabled() const 			{ return mbUserDrawEnabled; }
615 
616 	void 			DrawEntry( sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );
617 };
618 
619 // -----------
620 // - ImplBtn -
621 // -----------
622 
623 class ImplBtn : public PushButton
624 {
625 private:
626 	sal_Bool			mbDown;
627 
628 	Link			maMBDownHdl;
629 
630 public:
631 					ImplBtn( Window* pParent, WinBits nWinStyle = 0 );
632 					~ImplBtn() {};
633 
634 	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
635 
636 	virtual void	MBDown();
637 	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
638 	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }
639 };
640 
641 
642 void ImplInitFieldSettings( Window* pWin, sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
643 void ImplInitDropDownButton( PushButton* pButton );
644 
645 #endif	// _SV_ILSTBOX_HXX
646