xref: /AOO41X/main/vcl/inc/ilstbox.hxx (revision 707fc0d4d52eb4f69d89a98ffec6918ca5de6326)
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