xref: /aoo42x/main/vcl/inc/ilstbox.hxx (revision ad3a95a3)
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 //IAccessibility2 Implementation 2009-----
252 	Link			maFocusHdl;
253 	Link			maListItemSelectHdl;
254 //-----IAccessibility2 Implementation 2009
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 	//IAccessibility2 Implementation 2009-----
270 	//sal_Bool			SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False );
271 	sal_Bool			SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False, sal_Bool bSelectPosChange = sal_False );
272 	//-----IAccessibility2 Implementation 2009
273 	void			ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false );
274     void			ImplDoPaint( const Rectangle& rRect, bool bLayout = false );
275 	void			ImplCalcMetrics();
276 	void			ImplUpdateEntryMetrics( ImplEntryType& rEntry );
277 	void			ImplCallSelect();
278 
279     void            ImplShowFocusRect();
280     void            ImplHideFocusRect();
281 
282 
283 	virtual void	StateChanged( StateChangedType nType );
284 	virtual void	DataChanged( const DataChangedEvent& rDCEvt );
285 
286 public:
287     virtual void  FillLayoutData() const;
288 
289 					ImplListBoxWindow( Window* pParent, WinBits nWinStyle );
290 					~ImplListBoxWindow();
291 
292 	ImplEntryList*	GetEntryList() const { return mpEntryList; }
293 
294 	sal_uInt16			InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry );
295 	void			RemoveEntry( sal_uInt16 nPos );
296 	void			Clear();
297 	void			ResetCurrentPos()				{ mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; }
298 	sal_uInt16			GetCurrentPos()	const			{ return mnCurrentPos; }
299     sal_uInt16			GetDisplayLineCount() const;
300     void            SetEntryFlags( sal_uInt16 nPos, long nFlags );
301 
302 	void 			DrawEntry( sal_uInt16 nPos, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );
303 
304 	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
305 	void			DeselectAll();
306     sal_uInt16			GetEntryPosForPoint( const Point& rPoint ) const;
307     sal_uInt16          GetLastVisibleEntry() const;
308 
309 	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt );
310 
311 	void			SetTopEntry( sal_uInt16 nTop );
312 	sal_uInt16			GetTopEntry() const 			{ return mnTop; }
313 	// ShowProminentEntry will set the entry correspoding to nEntryPos
314 	// either at top or in the middle depending on the chosen style
315 	void            ShowProminentEntry( sal_uInt16 nEntryPos );
316 	void            SetProminentEntryType( ProminentEntry eType ) { meProminentType = eType; }
317 	ProminentEntry  GetProminentEntryType() const { return meProminentType; }
318     using Window::IsVisible;
319 	sal_Bool			IsVisible( sal_uInt16 nEntry ) const;
320 
321 	long			GetLeftIndent() const			{ return mnLeft; }
322 	void			SetLeftIndent( long n );
323 	void			ScrollHorz( long nDiff );
324 
325 	void			AllowGrabFocus( sal_Bool b )		{ mbGrabFocus = b; }
326 	sal_Bool			IsGrabFocusAllowed() const		{ return mbGrabFocus; }
327 
328 	void			SetSeparatorPos( sal_uInt16 n )		{ mnSeparatorPos = n; }
329 	sal_uInt16			GetSeparatorPos() const			{ return mnSeparatorPos; }
330 
331 	void            SetTravelSelect( sal_Bool bTravelSelect ) { mbTravelSelect = bTravelSelect; }
332 	sal_Bool			IsTravelSelect() const			{ return mbTravelSelect; }
333 	sal_Bool			IsTrackingSelect() const			{ return mbTrackingSelect; }
334 
335 	void			SetUserItemSize( const Size& rSz );
336 	const Size&		GetUserItemSize() const				{ return maUserItemSize; }
337 
338 	void			EnableUserDraw( sal_Bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; }
339 	sal_Bool			IsUserDrawEnabled() const 	{ return mbUserDrawEnabled; }
340 
341 	void			EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { mbMulti = bMulti; mbStackMode = bStackMode; }
342 	sal_Bool			IsMultiSelectionEnabled() const 	{ return mbMulti; }
343 
344 	void			SetMultiSelectionSimpleMode( sal_Bool bSimple )	{ mbSimpleMode = bSimple; }
345 	sal_Bool			IsMultiSelectionSimpleMode() const 			{ return mbSimpleMode; }
346 
347 	void			EnableMouseMoveSelect( sal_Bool bMouseMoveSelect ) { mbMouseMoveSelect = bMouseMoveSelect; }
348 	sal_Bool			IsMouseMoveSelectEnabled() const 	{ return mbMouseMoveSelect; }
349 	sal_Bool			IsMouseMoveSelect() const 	{ return mbMouseMoveSelect||mbStackMode; }
350 
351 	Size			CalcSize( sal_uInt16 nMaxLines ) const;
352     Rectangle       GetBoundingRectangle( sal_uInt16 nItem ) const;
353 
354     long			GetEntryHeight() const				{ return mnMaxHeight; }
355 	long			GetMaxEntryWidth() const			{ return mnMaxWidth; }
356 
357 	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
358 	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
359 	void			SetSelectHdl( const Link& rLink )	{ maSelectHdl = rLink; }
360 	const Link& 	GetSelectHdl() const				{ return maSelectHdl; }
361 	void			SetCancelHdl( const Link& rLink )	{ maCancelHdl = rLink; }
362 	const Link& 	GetCancelHdl() const				{ return maCancelHdl; }
363 	void			SetDoubleClickHdl( const Link& rLink )	{ maDoubleClickHdl = rLink; }
364 	const Link& 	GetDoubleClickHdl() const				{ return maDoubleClickHdl; }
365 	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
366 	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }
367 	void			SetMRUChangedHdl( const Link& rLink )	{ maMRUChangedHdl = rLink; }
368 	const Link& 	GetMRUChangedHdl() const				{ return maMRUChangedHdl; }
369 //IAccessibility2 Implementation 2009-----
370 	void			SetFocusHdl( const Link& rLink )	{ maFocusHdl = rLink ; }
371 	const Link& 	GetFocusHdl() const				{ return maFocusHdl; }
372 
373 	void			SetListItemSelectHdl( const Link& rLink )	{ maListItemSelectHdl = rLink ; }
374 	const Link& 	GetListItemSelectHdl() const				{ return maListItemSelectHdl; }
375 //-----IAccessibility2 Implementation 2009
376 	sal_Bool			IsSelectionChanged() const { return mbSelectionChanged; }
377 	sal_uInt16			GetSelectModifier() const { return mnSelectModifier; }
378 
379 	void			EnableSort( sal_Bool b ) { mbSort = b; }
380 
381 	void			SetReadOnly( sal_Bool bReadOnly ) 	{ mbReadOnly = bReadOnly; }
382 	sal_Bool			IsReadOnly() const 				{ return mbReadOnly; }
383 
384     using Control::ImplInitSettings;
385 	void			ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
386     sal_uInt16          ImplGetTextStyle() const;
387 
388 	// pb: #106948# explicit mirroring for calc
389 	inline void		EnableMirroring()		{ mbMirroring = sal_True; }
390 	inline sal_Bool		IsMirroring() const { return mbMirroring; }
391 
392 protected:
393     // ISearchableStringList
394     virtual ::vcl::StringEntryIdentifier    CurrentEntry( String& _out_entryText ) const;
395     virtual ::vcl::StringEntryIdentifier    NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const;
396     virtual void                            SelectEntry( ::vcl::StringEntryIdentifier _entry );
397 };
398 
399 // ---------------
400 // - ImplListBox -
401 // ---------------
402 
403 class ImplListBox : public Control
404 {
405 private:
406 	ImplListBoxWindow	maLBWindow;
407 	ScrollBar*			mpHScrollBar;
408 	ScrollBar*			mpVScrollBar;
409 	ScrollBarBox*		mpScrollBarBox;
410 	sal_Bool				mbVScroll		: 1,	// VScroll an oder aus
411 						mbHScroll		: 1,	// HScroll an oder aus
412 						mbAutoHScroll	: 1;	// AutoHScroll an oder aus
413 	Link				maScrollHdl;	// Weil der vom ImplListBoxWindow selbst benoetigt wird.
414     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer;
415 
416 protected:
417 	virtual void		GetFocus();
418 	virtual void		StateChanged( StateChangedType nType );
419 	virtual void		DataChanged( const DataChangedEvent& rDCEvt );
420 
421 	long 				Notify( NotifyEvent& rNEvt );
422 
423 	void				ImplResizeControls();
424 	void				ImplCheckScrollBars();
425 	void				ImplInitScrollBars();
426 
427 	DECL_LINK(			ScrollBarHdl, ScrollBar* );
428 	DECL_LINK(			LBWindowScrolled, void* );
429 	DECL_LINK(			MRUChanged, void* );
430 
431 public:
432 					ImplListBox( Window* pParent, WinBits nWinStyle );
433 					~ImplListBox();
434 
435 	const ImplEntryList*	GetEntryList() const			{ return maLBWindow.GetEntryList(); }
436 	ImplListBoxWindow* 		GetMainWindow() 				{ return &maLBWindow; }
437 
438 	virtual void	Resize();
439     virtual const Wallpaper& GetDisplayBackground() const;
440     virtual Window*     GetPreferredKeyInputWindow();
441 
442 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr );
443 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const Image& rImage );
444 	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr, const Image& rImage );
445 	void			RemoveEntry( sal_uInt16 nPos );
446 	void			SetEntryData( sal_uInt16 nPos, void* pNewData )	{ maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); }
447 	void			Clear();
448 
449 	void			SetEntryFlags( sal_uInt16 nPos, long nFlags );
450 	long			GetEntryFlags( sal_uInt16 nPos ) const;
451 
452 	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
453 	void			SetNoSelection();
454 	void			ResetCurrentPos()				{ maLBWindow.ResetCurrentPos(); }
455 	sal_uInt16			GetCurrentPos()	const			{ return maLBWindow.GetCurrentPos(); }
456 
457 	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt )	{ return maLBWindow.ProcessKeyInput( rKEvt ); }
458 	sal_Bool			HandleWheelAsCursorTravel( const CommandEvent& rCEvt );
459 
460 	void			SetSeparatorPos( sal_uInt16 n )		{ maLBWindow.SetSeparatorPos( n ); }
461 	sal_uInt16			GetSeparatorPos() const			{ return maLBWindow.GetSeparatorPos(); }
462 
463 	void			SetTopEntry( sal_uInt16 nTop )		{ maLBWindow.SetTopEntry( nTop ); }
464 	sal_uInt16			GetTopEntry() const 			{ return maLBWindow.GetTopEntry(); }
465 	void            ShowProminentEntry( sal_uInt16 nPos ) { maLBWindow.ShowProminentEntry( nPos ); }
466     using Window::IsVisible;
467 	sal_Bool			IsVisible( sal_uInt16 nEntry ) const { return maLBWindow.IsVisible( nEntry ); }
468 
469 	void            SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); }
470 	ProminentEntry  GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); }
471 
472 	long			GetLeftIndent() const			{ return maLBWindow.GetLeftIndent(); }
473 	void			SetLeftIndent( sal_uInt16 n )		{ maLBWindow.SetLeftIndent( n ); }
474 	void			ScrollHorz( short nDiff )		{ maLBWindow.ScrollHorz( nDiff ); }
475 
476 	void            SetTravelSelect( sal_Bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); }
477 	sal_Bool			IsTravelSelect() const			{ return maLBWindow.IsTravelSelect(); }
478 	sal_Bool			IsTrackingSelect() const			{ return maLBWindow.IsTrackingSelect(); }
479 
480 	void			EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); }
481 	sal_Bool			IsMultiSelectionEnabled() const 	{ return maLBWindow.IsMultiSelectionEnabled(); }
482 
483 	void			SetMultiSelectionSimpleMode( sal_Bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); }
484 	sal_Bool			IsMultiSelectionSimpleMode() const 	{ return maLBWindow.IsMultiSelectionSimpleMode(); }
485 
486 	void			SetReadOnly( sal_Bool b ) 			{ maLBWindow.SetReadOnly( b ); }
487 	sal_Bool			IsReadOnly() const 				{ return maLBWindow.IsReadOnly(); }
488 
489 
490 	Size			CalcSize( sal_uInt16 nMaxLines ) const				{ return maLBWindow.CalcSize( nMaxLines ); }
491 	long			GetEntryHeight() const			{ return maLBWindow.GetEntryHeight(); }
492 	long			GetMaxEntryWidth() const		{ return maLBWindow.GetMaxEntryWidth(); }
493 
494 	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
495 	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
496 	void			SetSelectHdl( const Link& rLink )	{ maLBWindow.SetSelectHdl( rLink ); }
497 	const Link& 	GetSelectHdl() const				{ return maLBWindow.GetSelectHdl(); }
498 	void			SetCancelHdl( const Link& rLink )	{ maLBWindow.SetCancelHdl( rLink ); }
499 	const Link& 	GetCancelHdl() const				{ return maLBWindow.GetCancelHdl(); }
500 	void			SetDoubleClickHdl( const Link& rLink )	{ maLBWindow.SetDoubleClickHdl( rLink ); }
501 	const Link& 	GetDoubleClickHdl() const				{ return maLBWindow.GetDoubleClickHdl(); }
502 	void			SetUserDrawHdl( const Link& rLink )	{ maLBWindow.SetUserDrawHdl( rLink ); }
503 	const Link& 	GetUserDrawHdl() const				{ return maLBWindow.GetUserDrawHdl(); }
504 
505 //IAccessibility2 Implementation 2009-----
506 	void			SetFocusHdl( const Link& rLink )	{ maLBWindow.SetFocusHdl( rLink ); }
507 	const Link& 	GetFocusHdl() const				{ return maLBWindow.GetFocusHdl(); }
508 	void			SetListItemSelectHdl( const Link& rLink )	{ maLBWindow.SetListItemSelectHdl( rLink ); }
509 	const Link& 	GetListItemSelectHdl() const	{ return maLBWindow.GetListItemSelectHdl(); }
510 //-----IAccessibility2 Implementation 2009
511 	void			SetSelectionChangedHdl( const Link& rLnk )	{ maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); }
512 	void			SetCallSelectionChangedHdl( sal_Bool bCall )	{ maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
513 	sal_Bool			IsSelectionChanged() const 					{ return maLBWindow.IsSelectionChanged(); }
514 	sal_uInt16			GetSelectModifier() const 					{ return maLBWindow.GetSelectModifier(); }
515 
516 	void			SetMRUEntries( const XubString& rEntries, xub_Unicode cSep );
517 	XubString		GetMRUEntries( xub_Unicode cSep ) const;
518 	void			SetMaxMRUCount( sal_uInt16 n )					{ maLBWindow.GetEntryList()->SetMaxMRUCount( n ); }
519 	sal_uInt16			GetMaxMRUCount() const						{ return maLBWindow.GetEntryList()->GetMaxMRUCount(); }
520     sal_uInt16			GetDisplayLineCount() const
521     { return maLBWindow.GetDisplayLineCount(); }
522 
523 	// pb: #106948# explicit mirroring for calc
524 	inline void		EnableMirroring()	{ maLBWindow.EnableMirroring(); }
525     inline void     SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; }
526 };
527 
528 // -----------------------------
529 // - ImplListBoxFloatingWindow -
530 // -----------------------------
531 
532 class ImplListBoxFloatingWindow : public FloatingWindow
533 {
534 private:
535 	ImplListBox*	mpImplLB;
536 	Size			maPrefSz;
537 	sal_uInt16			mnDDLineCount;
538     sal_uInt16          mnPopupModeStartSaveSelection;
539 	sal_Bool			mbAutoWidth;
540 
541 protected:
542 	long			PreNotify( NotifyEvent& rNEvt );
543 
544 public:
545 					ImplListBoxFloatingWindow( Window* pParent );
546 
547 	void			SetImplListBox( ImplListBox* pLB )	{ mpImplLB = pLB; }
548 
549 	void			SetPrefSize( const Size& rSz )		{ maPrefSz = rSz; }
550 	const Size& 	GetPrefSize() const 				{ return maPrefSz; }
551 
552 	void			SetAutoWidth( sal_Bool b )				{ mbAutoWidth = b; }
553     sal_Bool            IsAutoWidth() const                 { return mbAutoWidth; }
554 
555 	Size			CalcFloatSize();
556 	void			StartFloat( sal_Bool bStartTracking );
557 
558 	virtual void	SetPosSizePixel( long nX, long nY,
559 									 long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
560 	void			SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
561 						{ FloatingWindow::SetPosSizePixel( rNewPos, rNewSize ); }
562 
563 	void			SetDropDownLineCount( sal_uInt16 n ) { mnDDLineCount = n; }
564 	sal_uInt16			GetDropDownLineCount() const { return mnDDLineCount; }
565 
566     sal_uInt16          GetPopupModeStartSaveSelection() const { return mnPopupModeStartSaveSelection; }
567 
568     virtual void	Resize();
569 };
570 
571 // -----------
572 // - ImplWin -
573 // -----------
574 
575 class ImplWin : public Control
576 {
577 private:
578 
579 	sal_uInt16			mnItemPos;	// wegen UserDraw muss ich wissen, welches Item ich darstelle.
580 	XubString		maString;
581 	Image			maImage;
582 	Image			maImageHC;
583 
584 	Rectangle		maFocusRect;
585 	Size			maUserItemSize;
586 
587 	Link			maMBDownHdl;
588 	Link			maUserDrawHdl;
589 
590 	sal_Bool			mbUserDrawEnabled	: 1,
591 					mbInUserDraw		: 1;
592 
593 
594     void ImplDraw( bool bLayout = false );
595 protected:
596     virtual void  FillLayoutData() const;
597 public:
598 
599 					ImplWin( Window* pParent, WinBits nWinStyle = 0 );
600 					~ImplWin() {};
601 
602 	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
603 	virtual void	Paint( const Rectangle& rRect );
604 	virtual void	Resize();
605 	virtual void	GetFocus();
606 	virtual void	LoseFocus();
607     virtual long    PreNotify( NotifyEvent& rNEvt );
608 
609 	sal_uInt16			GetItemPos() const { return mnItemPos; }
610 	void			SetItemPos( sal_uInt16 n ) { mnItemPos = n; }
611 
612 	const XubString& GetString() const { return maString; }
613 	void			SetString( const XubString& rStr ) { maString = rStr; }
614 
615 	const Image&	GetImage() const { return maImage; }
616 	void			SetImage( const Image& rImg ) { maImage = rImg; }
617 
618     sal_Bool            SetModeImage( const Image& rImage, BmpColorMode eMode = BMP_COLOR_NORMAL );
619     const Image&    GetModeImage( BmpColorMode eMode = BMP_COLOR_NORMAL ) const;
620 
621 
622 	virtual void	MBDown();
623 	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
624 	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }
625 
626 	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
627 	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }
628 
629 	void			SetUserItemSize( const Size& rSz )	{ maUserItemSize = rSz; }
630 	const Size&		GetUserItemSize() const				{ return maUserItemSize; }
631 
632 	void			EnableUserDraw( sal_Bool bUserDraw ) 	{ mbUserDrawEnabled = bUserDraw; }
633 	sal_Bool			IsUserDrawEnabled() const 			{ return mbUserDrawEnabled; }
634 
635 	void 			DrawEntry( sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );
636 };
637 
638 // -----------
639 // - ImplBtn -
640 // -----------
641 
642 class ImplBtn : public PushButton
643 {
644 private:
645 	sal_Bool			mbDown;
646 
647 	Link			maMBDownHdl;
648 
649 public:
650 					ImplBtn( Window* pParent, WinBits nWinStyle = 0 );
651 					~ImplBtn() {};
652 
653 	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
654 
655 	virtual void	MBDown();
656 	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
657 	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }
658 };
659 
660 
661 void ImplInitFieldSettings( Window* pWin, sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
662 void ImplInitDropDownButton( PushButton* pButton );
663 
664 #endif	// _SV_ILSTBOX_HXX
665