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