/*
 *   Listbox definitions
 */

typedef struct tagLISTSTRUCT {
        MEASUREITEMSTRUCT16 mis;
        UINT            itemState;
        RECT16          itemRect;
	HLOCAL16	hData;
	char            *itemText;
	struct tagLISTSTRUCT *lpNext;
} LISTSTRUCT, *LPLISTSTRUCT;

typedef struct {
	WORD    FirstVisible;
	WORD    ItemsCount;
	WORD    ItemsVisible;
	WORD    ColumnsVisible;
	WORD    ItemsPerColumn;
	short   ItemFocused;
	short   PrevFocused;
	WORD    StdItemHeight;
	WORD    ColumnsWidth;
	WORD    DrawCtlType;
        WORD    CtlID;
	LPLISTSTRUCT lpFirst;
	HWND	hSelf;
	DWORD   dwStyle;      /* added for COMBOLBOX style faking */
	HWND    hParent;
	HFONT16 hFont;
	BOOL    bRedrawFlag;
        BOOL    HasStrings;
        BOOL    OwnerDrawn;
	WORD    iNumStops;
	LPINT16 TabStops;
        BOOL    needMeasure;
	HGLOBAL16 HeapSel;
/*	MDESC   *Heap; */
} HEADLIST,*LPHEADLIST;

/* shared code between listbox and combo controls */
extern void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent);
extern void DestroyListBoxStruct(LPHEADLIST lphl);

extern void ListBoxSendNotification(LPHEADLIST lphl, WORD code);

extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex);
extern int ListMaxFirstVisible(LPHEADLIST lphl);
extern int ListBoxScrollToFocus(LPHEADLIST lphl);
extern int ListBoxAddString(LPHEADLIST lphl, SEGPTR itemData);
extern int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr);
extern int ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr);
extern DWORD ListBoxGetItemData(LPHEADLIST lphl, UINT uIndex);
extern int ListBoxSetItemData(LPHEADLIST lphl, UINT uIndex, DWORD ItemData);
extern int ListBoxDeleteString(LPHEADLIST lphl, UINT uIndex);
extern int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
extern int ListBoxFindStringExact(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr);
extern int ListBoxResetContent(LPHEADLIST lphl);
extern int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex);
extern int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state);
extern int ListBoxGetSel(LPHEADLIST lphl, WORD wIndex);
extern LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec);
extern int ListBoxGetItemRect(LPHEADLIST lphl, WORD wIndex, LPRECT16 rect);
extern int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height);
extern int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar);

extern void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC16 hdc,
			     LPLISTSTRUCT lpls, RECT16 *rect, WORD itemAction,
			     WORD itemState);
extern int ListBoxFindMouse(LPHEADLIST lphl, int X, int Y);
extern void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls);
