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