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