/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _SV_ILSTBOX_HXX
#define _SV_ILSTBOX_HXX

#include <vcl/sv.h>
#include <vcl/image.hxx>
#include <vcl/ctrl.hxx>
#include <vcl/button.hxx>
#include <vcl/floatwin.hxx>
#include <vcl/lstbox.h>
#include <vcl/timer.hxx>

#include "vcl/quickselectionengine.hxx"

class ScrollBar;
class ScrollBarBox;

// -----------------
// - ListBox-Types -
// -----------------

#define HORZ_SCROLL 		4
#define IMG_TXT_DISTANCE	6

enum LB_EVENT_TYPE
{
	LET_MBDOWN,
	LET_TRACKING,
	LET_TRACKING_END,
	LET_KEYMOVE,
	LET_KEYSPACE
};

// -----------------
// - ImplEntryType -
// -----------------

struct ImplEntryType
{
	XubString	maStr;
	Image		maImage;
	void*		mpUserData;
	sal_Bool		mbIsSelected;
	long		mnFlags;
    long        mnHeight;

	ImplEntryType( const XubString& rStr, const Image& rImage ) :
		maStr( rStr ),
		maImage( rImage ),
		mnFlags( 0 ),
        mnHeight( 0 )
	{
		mbIsSelected = sal_False;
		mpUserData = NULL;
	}

	ImplEntryType( const XubString& rStr ) :
		maStr( rStr ),
		mnFlags( 0 ),
        mnHeight( 0 )
	{
		mbIsSelected = sal_False;
		mpUserData = NULL;
	}

	ImplEntryType( const Image& rImage ) :
		maImage( rImage ),
		mnFlags( 0 ),
        mnHeight( 0 )
	{
		mbIsSelected = sal_False;
		mpUserData = NULL;
	}
};

// -----------------
// - ImplEntryList -
// -----------------

class ImplEntryList : private List
{
private:
    Window*         mpWindow;   // For getting the current locale when matching strings
	sal_uInt16			mnLastSelected;
	sal_uInt16			mnSelectionAnchor;
	sal_uInt16			mnImages;

	sal_uInt16			mnMRUCount;
	sal_uInt16			mnMaxMRUCount;

	Link			maSelectionChangedHdl;
	sal_Bool			mbCallSelectionChangedHdl;

	ImplEntryType*	GetEntry( sal_uInt16 nPos )	const { return (ImplEntryType*)List::GetObject( nPos ); }

public:
					ImplEntryList( Window* pWindow );
					~ImplEntryList();

	sal_uInt16					InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry, sal_Bool bSort );
	void					RemoveEntry( sal_uInt16 nPos );
	const ImplEntryType* 	GetEntryPtr( sal_uInt16 nPos ) const { return (const ImplEntryType*) GetObject( nPos ); }
	ImplEntryType* 	        GetMutableEntryPtr( sal_uInt16 nPos ) const { return (ImplEntryType*) GetObject( nPos ); }
	void					Clear();

	sal_uInt16			FindMatchingEntry( const XubString& rStr, sal_uInt16 nStart = 0, sal_Bool bForward = sal_True, sal_Bool bLazy = sal_True ) const;
	sal_uInt16			FindEntry( const XubString& rStr, sal_Bool bSearchMRUArea = sal_False ) const;
	sal_uInt16			FindEntry( const void* pData ) const;

    // helper: add up heights up to index nEndIndex.
    // GetAddedHeight( 0 ) returns 0
    // GetAddedHeight( LISTBOX_ENTRY_NOTFOUND ) returns 0
    // GetAddedHeight( i, k ) with k > i is equivalent -GetAddedHeight( k, i )
    long            GetAddedHeight( sal_uInt16 nEndIndex, sal_uInt16 nBeginIndex = 0, long nBeginHeight = 0 ) const;
    long            GetEntryHeight( sal_uInt16 nPos ) const;

	sal_uInt16			GetEntryCount() const { return (sal_uInt16)List::Count(); }
	sal_Bool			HasImages() const { return mnImages ? sal_True : sal_False; }

	XubString		GetEntryText( sal_uInt16 nPos ) const;

	sal_Bool			HasEntryImage( sal_uInt16 nPos ) const;
	Image			GetEntryImage( sal_uInt16 nPos ) const;

	void			SetEntryData( sal_uInt16 nPos, void* pNewData );
	void*			GetEntryData( sal_uInt16 nPos ) const;

	void			SetEntryFlags( sal_uInt16 nPos, long nFlags );
	long			GetEntryFlags( sal_uInt16 nPos ) const;

	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );

	sal_uInt16			GetSelectEntryCount() const;
	XubString		GetSelectEntry( sal_uInt16 nIndex ) const;
	sal_uInt16			GetSelectEntryPos( sal_uInt16 nIndex ) const;
	sal_Bool			IsEntrySelected( const XubString& rStr ) const;
	sal_Bool			IsEntryPosSelected( sal_uInt16 nIndex ) const;

	void			SetLastSelected( sal_uInt16 nPos )	{ mnLastSelected = nPos; }
	sal_uInt16			GetLastSelected() const { return mnLastSelected; }

	void			SetSelectionAnchor( sal_uInt16 nPos )	{ mnSelectionAnchor = nPos; }
	sal_uInt16			GetSelectionAnchor() const { return mnSelectionAnchor; }


	void			SetSelectionChangedHdl( const Link& rLnk )	{ maSelectionChangedHdl = rLnk; }
	void			SetCallSelectionChangedHdl( sal_Bool bCall )	{ mbCallSelectionChangedHdl = bCall; }

	void			SetMRUCount( sal_uInt16 n )	{ mnMRUCount = n; }
	sal_uInt16			GetMRUCount() const		{ return mnMRUCount; }

	void			SetMaxMRUCount( sal_uInt16 n )	{ mnMaxMRUCount = n; }
	sal_uInt16			GetMaxMRUCount() const		{ return mnMaxMRUCount; }

	/**	An Entry is selectable if its mnFlags does not have the 
		LISTBOX_ENTRY_FLAG_DISABLE_SELECTION flag set. */
	bool			IsEntrySelectable( sal_uInt16 nPos ) const;

	/** returns the first entry found from the given position nPos that is selectable
		or LISTBOX_ENTRY_NOTFOUND if non is found. If the entry at nPos is not selectable,
		it returns the first selectable entry after nPos if bForward is true and the
		first selectable entry after nPos is bForward is false.
		*/
	sal_uInt16			FindFirstSelectable( sal_uInt16 nPos, bool bForward = true );
};

// ---------------------
// - ImplListBoxWindow -
// ---------------------

class ImplListBoxWindow : public Control, public ::vcl::ISearchableStringList
{
private:
	ImplEntryList*	mpEntryList;	 // EntryListe
	Rectangle		maFocusRect;

	Size			maUserItemSize;

	long			mnMaxTxtHeight;  // Maximale Hoehe eines Text-Items
	long			mnMaxTxtWidth;	 // Maximale Breite eines Text-Items
									 // Entry ohne Image
	long			mnMaxImgTxtWidth;// Maximale Breite eines Text-Items
									 // Entry UND Image
	long			mnMaxImgWidth;	 // Maximale Breite eines Image-Items
	long			mnMaxImgHeight;  // Maximale Hoehe eines Image-Items
	long			mnMaxWidth; 	 // Maximale Breite eines Eintrags
	long			mnMaxHeight;	 // Maximale Hoehe eines Eintrags

	sal_uInt16			mnCurrentPos;	 // Position (Focus)
	sal_uInt16			mnTrackingSaveSelection; // Selektion vor Tracking();

	sal_uInt16			mnSeparatorPos;	// Separator

	sal_uInt16			mnUserDrawEntry;

	sal_uInt16			mnTop;			 // Ausgabe ab Zeile
	long			mnLeft; 		 // Ausgabe ab Spalte
	long			mnBorder;		 // Abstand Rahmen - Text
	long			mnTextHeight;	 // Texthoehe
	ProminentEntry  meProminentType; // where is the "prominent" entry

	sal_uInt16			mnSelectModifier;	// Modifiers

    /// bitfield
    bool mbHasFocusRect : 1;
    bool mbSort : 1;             // ListBox sortiert
    bool mbTrack : 1;            // Tracking
    bool mbMulti : 1;            // MultiListBox
    bool mbStackMode : 1;        // StackSelection
    bool mbSimpleMode : 1;       // SimpleMode fuer MultiListBox
    bool mbImgsDiffSz : 1;       // Images haben verschiedene Groessen
    bool mbTravelSelect : 1;     // TravelSelect
    bool mbTrackingSelect : 1;   // Selektiert bei MouseMove
    bool mbSelectionChanged : 1; // Select() nicht zu oft rufen...
    bool mbMouseMoveSelect : 1;  // Selektieren bei MouseMove
    bool mbGrabFocus : 1;        // Focus bei MBDown grabben
    bool mbUserDrawEnabled : 1;  // UserDraw possible
    bool mbInUserDraw : 1;       // In UserDraw
    bool mbReadOnly : 1;         // ReadOnly
    bool mbMirroring : 1;        // pb: #106948# explicit mirroring for calc
    bool mbRight : 1;            // right align Text output
    bool mbCenter : 1;           // center Text output
    bool mbEdgeBlending : 1;

	Link			maScrollHdl;
	Link			maSelectHdl;
	Link			maCancelHdl;
	Link			maDoubleClickHdl;
	Link			maUserDrawHdl;
	Link			maMRUChangedHdl;
	Link			maFocusHdl;
	Link			maListItemSelectHdl;

    ::vcl::QuickSelectionEngine maQuickSelectionEngine;

protected:
	virtual void	KeyInput( const KeyEvent& rKEvt );
	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
	virtual void	MouseMove( const MouseEvent& rMEvt );
	virtual void	Tracking( const TrackingEvent& rTEvt );
	virtual void	Paint( const Rectangle& rRect );
	virtual void	Resize();
	virtual void	GetFocus();
	virtual void	LoseFocus();

	//sal_Bool			SelectEntries( sal_uInt16 nSelect, LB_EVENT_TYPE eLET, sal_Bool bShift = sal_False, sal_Bool bCtrl = sal_False );
	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 );
	void			ImplPaint( sal_uInt16 nPos, sal_Bool bErase = sal_False, bool bLayout = false );
    void			ImplDoPaint( const Rectangle& rRect, bool bLayout = false );
	void			ImplCalcMetrics();
	void			ImplUpdateEntryMetrics( ImplEntryType& rEntry );
	void			ImplCallSelect();

    void            ImplShowFocusRect();
    void            ImplHideFocusRect();


	virtual void	StateChanged( StateChangedType nType );
	virtual void	DataChanged( const DataChangedEvent& rDCEvt );

public:
    virtual void  FillLayoutData() const;

					ImplListBoxWindow( Window* pParent, WinBits nWinStyle );
					~ImplListBoxWindow();

	ImplEntryList*	GetEntryList() const { return mpEntryList; }

	sal_uInt16			InsertEntry( sal_uInt16 nPos, ImplEntryType* pNewEntry );
	void			RemoveEntry( sal_uInt16 nPos );
	void			Clear();
	void			ResetCurrentPos()				{ mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; }
	sal_uInt16			GetCurrentPos()	const			{ return mnCurrentPos; }
    sal_uInt16			GetDisplayLineCount() const;
    void            SetEntryFlags( sal_uInt16 nPos, long nFlags );

	void 			DrawEntry( sal_uInt16 nPos, sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );

	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
	void			DeselectAll();
    sal_uInt16			GetEntryPosForPoint( const Point& rPoint ) const;
    sal_uInt16          GetLastVisibleEntry() const;

	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt );

	void			SetTopEntry( sal_uInt16 nTop );
	sal_uInt16			GetTopEntry() const 			{ return mnTop; }
	// ShowProminentEntry will set the entry correspoding to nEntryPos
	// either at top or in the middle depending on the chosen style
	void            ShowProminentEntry( sal_uInt16 nEntryPos );
	void            SetProminentEntryType( ProminentEntry eType ) { meProminentType = eType; }
	ProminentEntry  GetProminentEntryType() const { return meProminentType; }
    using Window::IsVisible;
	sal_Bool			IsVisible( sal_uInt16 nEntry ) const;

	long			GetLeftIndent() const			{ return mnLeft; }
	void			SetLeftIndent( long n );
	void			ScrollHorz( long nDiff );

	void			AllowGrabFocus( bool b )		{ mbGrabFocus = b; }
	bool            IsGrabFocusAllowed() const		{ return mbGrabFocus; }

	void			SetSeparatorPos( sal_uInt16 n )		{ mnSeparatorPos = n; }
	sal_uInt16			GetSeparatorPos() const			{ return mnSeparatorPos; }

	void            SetTravelSelect( bool bTravelSelect ) { mbTravelSelect = bTravelSelect; }
	bool            IsTravelSelect() const			{ return mbTravelSelect; }
	bool            IsTrackingSelect() const		{ return mbTrackingSelect; }

	void			SetUserItemSize( const Size& rSz );
	const Size&		GetUserItemSize() const				{ return maUserItemSize; }

	void			EnableUserDraw( bool bUserDraw ) { mbUserDrawEnabled = bUserDraw; }
	bool            IsUserDrawEnabled() const 	{ return mbUserDrawEnabled; }

	void			EnableMultiSelection( bool bMulti, bool bStackMode ) { mbMulti = bMulti; mbStackMode = bStackMode; }
	bool            IsMultiSelectionEnabled() const 	{ return mbMulti; }

	void			SetMultiSelectionSimpleMode( bool bSimple )	{ mbSimpleMode = bSimple; }
	bool            IsMultiSelectionSimpleMode() const 			{ return mbSimpleMode; }

	void			EnableMouseMoveSelect( bool bMouseMoveSelect ) { mbMouseMoveSelect = bMouseMoveSelect; }
	bool            IsMouseMoveSelectEnabled() const 	{ return mbMouseMoveSelect; }
	bool            IsMouseMoveSelect() const 	{ return mbMouseMoveSelect||mbStackMode; }

	Size			CalcSize( sal_uInt16 nMaxLines ) const;
    Rectangle       GetBoundingRectangle( sal_uInt16 nItem ) const;

    long			GetEntryHeight() const				{ return mnMaxHeight; }
	long			GetMaxEntryWidth() const			{ return mnMaxWidth; }

	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
	void			SetSelectHdl( const Link& rLink )	{ maSelectHdl = rLink; }
	const Link& 	GetSelectHdl() const				{ return maSelectHdl; }
	void			SetCancelHdl( const Link& rLink )	{ maCancelHdl = rLink; }
	const Link& 	GetCancelHdl() const				{ return maCancelHdl; }
	void			SetDoubleClickHdl( const Link& rLink )	{ maDoubleClickHdl = rLink; }
	const Link& 	GetDoubleClickHdl() const				{ return maDoubleClickHdl; }
	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }
	void			SetMRUChangedHdl( const Link& rLink )	{ maMRUChangedHdl = rLink; }
	const Link& 	GetMRUChangedHdl() const				{ return maMRUChangedHdl; }
	void			SetFocusHdl( const Link& rLink )	{ maFocusHdl = rLink ; }
	const Link& 	GetFocusHdl() const				{ return maFocusHdl; }

	void			SetListItemSelectHdl( const Link& rLink )	{ maListItemSelectHdl = rLink ; }
	const Link& 	GetListItemSelectHdl() const				{ return maListItemSelectHdl; }
	bool			IsSelectionChanged() const { return mbSelectionChanged; }
	sal_uInt16			GetSelectModifier() const { return mnSelectModifier; }

	void			EnableSort( bool b ) { mbSort = b; }

	void			SetReadOnly( bool bReadOnly ) 	{ mbReadOnly = bReadOnly; }
	bool            IsReadOnly() const 				{ return mbReadOnly; }

    using Control::ImplInitSettings;
	void			ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
    sal_uInt16          ImplGetTextStyle() const;

	// pb: #106948# explicit mirroring for calc
	inline void		EnableMirroring()		{ mbMirroring = true; }
	inline bool     IsMirroring() const { return mbMirroring; }

    bool GetEdgeBlending() const { return mbEdgeBlending; }
    void SetEdgeBlending(bool bNew) { mbEdgeBlending = bNew; }

protected:
    // ISearchableStringList
    virtual ::vcl::StringEntryIdentifier    CurrentEntry( String& _out_entryText ) const;
    virtual ::vcl::StringEntryIdentifier    NextEntry( ::vcl::StringEntryIdentifier _currentEntry, String& _out_entryText ) const;
    virtual void                            SelectEntry( ::vcl::StringEntryIdentifier _entry );
};

// ---------------
// - ImplListBox -
// ---------------

class ImplListBox : public Control
{
private:
	ImplListBoxWindow	maLBWindow;
	ScrollBar*			mpHScrollBar;
	ScrollBar*			mpVScrollBar;
	ScrollBarBox*		mpScrollBarBox;

    /// bitfield
    bool mbVScroll : 1;     // VScroll an oder aus
    bool mbHScroll : 1;     // HScroll an oder aus
    bool mbAutoHScroll : 1; // AutoHScroll an oder aus
    bool mbEdgeBlending : 1;

	Link				maScrollHdl;	// Weil der vom ImplListBoxWindow selbst benoetigt wird.
    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxDNDListenerContainer;

protected:
	virtual void		GetFocus();
	virtual void		StateChanged( StateChangedType nType );
	virtual void		DataChanged( const DataChangedEvent& rDCEvt );

	long 				Notify( NotifyEvent& rNEvt );

	void				ImplResizeControls();
	void				ImplCheckScrollBars();
	void				ImplInitScrollBars();

	DECL_LINK(			ScrollBarHdl, ScrollBar* );
	DECL_LINK(			LBWindowScrolled, void* );
	DECL_LINK(			MRUChanged, void* );

public:
					ImplListBox( Window* pParent, WinBits nWinStyle );
					~ImplListBox();

	const ImplEntryList*	GetEntryList() const			{ return maLBWindow.GetEntryList(); }
	ImplListBoxWindow* 		GetMainWindow() 				{ return &maLBWindow; }

	virtual void	Resize();
    virtual const Wallpaper& GetDisplayBackground() const;
    virtual Window*     GetPreferredKeyInputWindow();

	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr );
	sal_uInt16			InsertEntry( sal_uInt16 nPos, const Image& rImage );
	sal_uInt16			InsertEntry( sal_uInt16 nPos, const XubString& rStr, const Image& rImage );
	void			RemoveEntry( sal_uInt16 nPos );
	void			SetEntryData( sal_uInt16 nPos, void* pNewData )	{ maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); }
	void			Clear();

	void			SetEntryFlags( sal_uInt16 nPos, long nFlags );
	long			GetEntryFlags( sal_uInt16 nPos ) const;

	void			SelectEntry( sal_uInt16 nPos, sal_Bool bSelect );
	void			SetNoSelection();
	void			ResetCurrentPos()				{ maLBWindow.ResetCurrentPos(); }
	sal_uInt16			GetCurrentPos()	const			{ return maLBWindow.GetCurrentPos(); }

	sal_Bool			ProcessKeyInput( const KeyEvent& rKEvt )	{ return maLBWindow.ProcessKeyInput( rKEvt ); }
	sal_Bool			HandleWheelAsCursorTravel( const CommandEvent& rCEvt );

	void			SetSeparatorPos( sal_uInt16 n )		{ maLBWindow.SetSeparatorPos( n ); }
	sal_uInt16			GetSeparatorPos() const			{ return maLBWindow.GetSeparatorPos(); }

	void			SetTopEntry( sal_uInt16 nTop )		{ maLBWindow.SetTopEntry( nTop ); }
	sal_uInt16			GetTopEntry() const 			{ return maLBWindow.GetTopEntry(); }
	void            ShowProminentEntry( sal_uInt16 nPos ) { maLBWindow.ShowProminentEntry( nPos ); }
    using Window::IsVisible;
	sal_Bool			IsVisible( sal_uInt16 nEntry ) const { return maLBWindow.IsVisible( nEntry ); }

	void            SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); }
	ProminentEntry  GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); }

	long			GetLeftIndent() const			{ return maLBWindow.GetLeftIndent(); }
	void			SetLeftIndent( sal_uInt16 n )		{ maLBWindow.SetLeftIndent( n ); }
	void			ScrollHorz( short nDiff )		{ maLBWindow.ScrollHorz( nDiff ); }

	void            SetTravelSelect( sal_Bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); }
	sal_Bool			IsTravelSelect() const			{ return maLBWindow.IsTravelSelect(); }
	sal_Bool			IsTrackingSelect() const			{ return maLBWindow.IsTrackingSelect(); }

	void			EnableMultiSelection( sal_Bool bMulti, sal_Bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); }
	sal_Bool			IsMultiSelectionEnabled() const 	{ return maLBWindow.IsMultiSelectionEnabled(); }

	void			SetMultiSelectionSimpleMode( sal_Bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); }
	sal_Bool			IsMultiSelectionSimpleMode() const 	{ return maLBWindow.IsMultiSelectionSimpleMode(); }

	void			SetReadOnly( sal_Bool b ) 			{ maLBWindow.SetReadOnly( b ); }
	sal_Bool			IsReadOnly() const 				{ return maLBWindow.IsReadOnly(); }


	Size			CalcSize( sal_uInt16 nMaxLines ) const				{ return maLBWindow.CalcSize( nMaxLines ); }
	long			GetEntryHeight() const			{ return maLBWindow.GetEntryHeight(); }
	long			GetMaxEntryWidth() const		{ return maLBWindow.GetMaxEntryWidth(); }

	void			SetScrollHdl( const Link& rLink )	{ maScrollHdl = rLink; }
	const Link& 	GetScrollHdl() const				{ return maScrollHdl; }
	void			SetSelectHdl( const Link& rLink )	{ maLBWindow.SetSelectHdl( rLink ); }
	const Link& 	GetSelectHdl() const				{ return maLBWindow.GetSelectHdl(); }
	void			SetCancelHdl( const Link& rLink )	{ maLBWindow.SetCancelHdl( rLink ); }
	const Link& 	GetCancelHdl() const				{ return maLBWindow.GetCancelHdl(); }
	void			SetDoubleClickHdl( const Link& rLink )	{ maLBWindow.SetDoubleClickHdl( rLink ); }
	const Link& 	GetDoubleClickHdl() const				{ return maLBWindow.GetDoubleClickHdl(); }
	void			SetUserDrawHdl( const Link& rLink )	{ maLBWindow.SetUserDrawHdl( rLink ); }
	const Link& 	GetUserDrawHdl() const				{ return maLBWindow.GetUserDrawHdl(); }

	void			SetFocusHdl( const Link& rLink )	{ maLBWindow.SetFocusHdl( rLink ); }
	const Link& 	GetFocusHdl() const				{ return maLBWindow.GetFocusHdl(); }
	void			SetListItemSelectHdl( const Link& rLink )	{ maLBWindow.SetListItemSelectHdl( rLink ); }
	const Link& 	GetListItemSelectHdl() const	{ return maLBWindow.GetListItemSelectHdl(); }
	void			SetSelectionChangedHdl( const Link& rLnk )	{ maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); }
	void			SetCallSelectionChangedHdl( sal_Bool bCall )	{ maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
	sal_Bool			IsSelectionChanged() const 					{ return maLBWindow.IsSelectionChanged(); }
	sal_uInt16			GetSelectModifier() const 					{ return maLBWindow.GetSelectModifier(); }

	void			SetMRUEntries( const XubString& rEntries, xub_Unicode cSep );
	XubString		GetMRUEntries( xub_Unicode cSep ) const;
	void			SetMaxMRUCount( sal_uInt16 n )					{ maLBWindow.GetEntryList()->SetMaxMRUCount( n ); }
	sal_uInt16			GetMaxMRUCount() const						{ return maLBWindow.GetEntryList()->GetMaxMRUCount(); }
    sal_uInt16			GetDisplayLineCount() const
    { return maLBWindow.GetDisplayLineCount(); }

    bool GetEdgeBlending() const { return mbEdgeBlending; }
    void SetEdgeBlending(bool bNew);

    // pb: #106948# explicit mirroring for calc
	inline void		EnableMirroring()	{ maLBWindow.EnableMirroring(); }
    inline void     SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; }
};

// -----------------------------
// - ImplListBoxFloatingWindow -
// -----------------------------

class ImplListBoxFloatingWindow : public FloatingWindow
{
private:
	ImplListBox*	mpImplLB;
	Size			maPrefSz;
	sal_uInt16			mnDDLineCount;
    sal_uInt16          mnPopupModeStartSaveSelection;
	sal_Bool			mbAutoWidth;

protected:
	long			PreNotify( NotifyEvent& rNEvt );

public:
					ImplListBoxFloatingWindow( Window* pParent );

	void			SetImplListBox( ImplListBox* pLB )	{ mpImplLB = pLB; }

	void			SetPrefSize( const Size& rSz )		{ maPrefSz = rSz; }
	const Size& 	GetPrefSize() const 				{ return maPrefSz; }

	void			SetAutoWidth( sal_Bool b )				{ mbAutoWidth = b; }
    sal_Bool            IsAutoWidth() const                 { return mbAutoWidth; }

	Size			CalcFloatSize();
	void			StartFloat( sal_Bool bStartTracking );

	virtual void	SetPosSizePixel( long nX, long nY,
									 long nWidth, long nHeight, sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
	void			SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
						{ FloatingWindow::SetPosSizePixel( rNewPos, rNewSize ); }

	void			SetDropDownLineCount( sal_uInt16 n ) { mnDDLineCount = n; }
	sal_uInt16			GetDropDownLineCount() const { return mnDDLineCount; }

    sal_uInt16          GetPopupModeStartSaveSelection() const { return mnPopupModeStartSaveSelection; }

    virtual void	Resize();
};

// -----------
// - ImplWin -
// -----------

class ImplWin : public Control
{
private:

	sal_uInt16			mnItemPos;	// wegen UserDraw muss ich wissen, welches Item ich darstelle.
	XubString		maString;
	Image			maImage;
	Image			maImageHC;

	Rectangle		maFocusRect;
	Size			maUserItemSize;

	Link			maMBDownHdl;
	Link			maUserDrawHdl;

    /// bitfield
    bool            mbUserDrawEnabled : 1;
    bool            mbInUserDraw : 1;
    bool            mbEdgeBlending : 1;

    void ImplDraw( bool bLayout = false );
protected:
    virtual void  FillLayoutData() const;
public:

					ImplWin( Window* pParent, WinBits nWinStyle = 0 );
					~ImplWin() {};

	virtual void	MouseButtonDown( const MouseEvent& rMEvt );
	virtual void	Paint( const Rectangle& rRect );
	virtual void	Resize();
	virtual void	GetFocus();
	virtual void	LoseFocus();
    virtual long    PreNotify( NotifyEvent& rNEvt );

	sal_uInt16			GetItemPos() const { return mnItemPos; }
	void			SetItemPos( sal_uInt16 n ) { mnItemPos = n; }

	const XubString& GetString() const { return maString; }
	void			SetString( const XubString& rStr ) { maString = rStr; }

	const Image&	GetImage() const { return maImage; }
	void			SetImage( const Image& rImg ) { maImage = rImg; }

    sal_Bool            SetModeImage( const Image& rImage, BmpColorMode eMode = BMP_COLOR_NORMAL );
    const Image&    GetModeImage( BmpColorMode eMode = BMP_COLOR_NORMAL ) const;


	virtual void	MBDown();
	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }

	void			SetUserDrawHdl( const Link& rLink )	{ maUserDrawHdl = rLink; }
	const Link& 	GetUserDrawHdl() const				{ return maUserDrawHdl; }

	void			SetUserItemSize( const Size& rSz )	{ maUserItemSize = rSz; }
	const Size&		GetUserItemSize() const				{ return maUserItemSize; }

	void			EnableUserDraw( bool bUserDraw ) 	{ mbUserDrawEnabled = bUserDraw; }
	bool            IsUserDrawEnabled() const 			{ return mbUserDrawEnabled; }

	void 			DrawEntry( sal_Bool bDrawImage, sal_Bool bDrawText, sal_Bool bDrawTextAtImagePos = sal_False, bool bLayout = false );

    bool GetEdgeBlending() const { return mbEdgeBlending; }
    void SetEdgeBlending(bool bNew) { mbEdgeBlending = bNew; }
};

// -----------
// - ImplBtn -
// -----------

class ImplBtn : public PushButton
{
private:
	sal_Bool			mbDown;

	Link			maMBDownHdl;

public:
					ImplBtn( Window* pParent, WinBits nWinStyle = 0 );
					~ImplBtn() {};

	virtual void	MouseButtonDown( const MouseEvent& rMEvt );

	virtual void	MBDown();
	void			SetMBDownHdl( const Link& rLink ) { maMBDownHdl = rLink; }
	const Link& 	GetMBDownHdl() const { return maMBDownHdl; }
};


void ImplInitFieldSettings( Window* pWin, sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground );
void ImplInitDropDownButton( PushButton* pButton );

#endif	// _SV_ILSTBOX_HXX
