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