325 lines
12 KiB
C
325 lines
12 KiB
C
#ifndef __LISTBOX_H__
|
|
#define __LISTBOX_H__
|
|
|
|
#include "combo.h" // for CBOX defn
|
|
|
|
//
|
|
// Return Values
|
|
//
|
|
#define EQ 0
|
|
#define PREFIX 1
|
|
#define LT 2
|
|
#define GT 3
|
|
|
|
#define SINGLESEL 0
|
|
#define MULTIPLESEL 1
|
|
#define EXTENDEDSEL 2
|
|
|
|
#define LBI_ADD 0x0004
|
|
|
|
|
|
//
|
|
// The various bits of wFileDetails field are used as mentioned below:
|
|
// 0x0001 Should the file name be in upper case.
|
|
// 0x0002 Should the file size be shown.
|
|
// 0x0004 Date stamp of the file to be shown ?
|
|
// 0x0008 Time stamp of the file to be shown ?
|
|
// 0x0010 The dos attributes of the file ?
|
|
// 0x0020 In DlgDirSelectEx(), along with file name
|
|
// all other details also will be returned
|
|
//
|
|
#define LBUP_RELEASECAPTURE 0x0001
|
|
#define LBUP_RESETSELECTION 0x0002
|
|
#define LBUP_NOTIFY 0x0004
|
|
#define LBUP_SUCCESS 0x0008
|
|
#define LBUP_SELCHANGE 0x0010
|
|
|
|
|
|
//
|
|
// System timer IDs used be listbox
|
|
//
|
|
#define IDSYS_LBSEARCH 0x0000FFFCL
|
|
#define IDSYS_SCROLL 0x0000FFFEL
|
|
#define IDSYS_CARET 0x0000FFFFL
|
|
|
|
|
|
//
|
|
// Parameter for AlterHilite()
|
|
//
|
|
#define HILITEONLY 0x0001
|
|
#define SELONLY 0x0002
|
|
#define HILITEANDSEL (HILITEONLY + SELONLY)
|
|
|
|
#define HILITE 1
|
|
|
|
|
|
//
|
|
// Listbox macros
|
|
//
|
|
#define IsLBoxVisible(plb) \
|
|
(plb->fRedraw && IsWindowVisible(plb->hwnd))
|
|
|
|
#define CaretCreate(plb) \
|
|
((plb)->fCaret = TRUE)
|
|
|
|
//
|
|
//from sysmet.c
|
|
//
|
|
#define SCROLL_TIMEOUT() \
|
|
((GetDoubleClickTime()*4)/5)
|
|
|
|
//
|
|
// We don't need 64-bit intermediate precision so we use this macro
|
|
// instead of calling MulDiv.
|
|
//
|
|
#define MultDiv(x, y, z) \
|
|
(((INT)(x) * (INT)(y) + (INT)(z) / 2) / (INT)(z))
|
|
|
|
//
|
|
// Instance data pointer access functions
|
|
//
|
|
#define ListBox_GetPtr(hwnd) \
|
|
(PLBIV)GetWindowPtr(hwnd, 0)
|
|
|
|
#define ListBox_SetPtr(hwnd, p) \
|
|
(PLBIV)SetWindowPtr(hwnd, 0, p)
|
|
|
|
//
|
|
// List Box
|
|
//
|
|
typedef struct tagSCROLLPOS
|
|
{
|
|
INT cItems;
|
|
UINT iPage;
|
|
INT iPos;
|
|
UINT fMask;
|
|
INT iReturn;
|
|
} SCROLLPOS, *PSCROLLPOS;
|
|
|
|
typedef struct tagLBIV
|
|
{
|
|
HWND hwnd; // lbox ctl window
|
|
HWND hwndParent; // lbox parent
|
|
HTHEME hTheme; // Handle to the theme manager
|
|
PWW pww; // RO pointer into the pwnd to ExStyle, Style, State, State2
|
|
INT iTop; // index of top item displayed
|
|
INT iSel; // index of current item selected
|
|
INT iSelBase; // base sel for multiple selections
|
|
INT cItemFullMax; // cnt of Fully Visible items. Always contains
|
|
// result of ListBox_CItemInWindow(plb, FALSE) for fixed
|
|
// height listboxes. Contains 1 for var height
|
|
// listboxes.
|
|
INT cMac; // cnt of items in listbox
|
|
INT cMax; // cnt of total # items allocated for rgpch.
|
|
// Not all are necessarly in use
|
|
PBYTE rgpch; // pointer to array of string offsets
|
|
LPWSTR hStrings; // string storage handle
|
|
INT cchStrings; // Size in bytes of hStrings
|
|
INT ichAlloc; // Pointer to end of hStrings (end of last valid
|
|
// string)
|
|
INT cxChar; // Width of a character
|
|
INT cyChar; // height of line
|
|
INT cxColumn; // width of a column in multicolumn listboxes
|
|
INT itemsPerColumn; // for multicolumn listboxes
|
|
INT numberOfColumns;// for multicolumn listboxes
|
|
POINT ptPrev; // coord of last tracked mouse pt. used for auto
|
|
// scrolling the listbox during timer's
|
|
|
|
UINT OwnerDraw:2; // Owner draw styles. Non-zero if ownerdraw.
|
|
UINT fRedraw:1; // if TRUE then do repaints
|
|
UINT fDeferUpdate:1;
|
|
UINT wMultiple:2; // SINGLESEL allows a single item to be selected.
|
|
// MULTIPLESEL allows simple toggle multi-selection
|
|
// EXTENDEDSEL allows extended multi selection;
|
|
|
|
UINT fSort:1; // if TRUE the sort list
|
|
UINT fNotify:1; // if TRUE then Notify parent
|
|
UINT fMouseDown:1; // if TRUE then process mouse moves/mouseup
|
|
UINT fCaptured:1; // if TRUE then process mouse messages
|
|
UINT fCaret:1; // flashing caret allowed
|
|
UINT fDoubleClick:1; // mouse down in double click
|
|
UINT fCaretOn:1; // if TRUE then caret is on
|
|
UINT fAddSelMode:1; // if TRUE, then it is in ADD selection mode */
|
|
UINT fHasStrings:1; // True if the listbox has a string associated
|
|
// with each item else it has an app suppled LONG
|
|
// value and is ownerdraw
|
|
|
|
UINT fHasData:1; // if FALSE, then lb doesn't keep any line data
|
|
// beyond selection state, but instead calls back
|
|
// to the client for each line's definition.
|
|
// Forces OwnerDraw==OWNERDRAWFIXED, !fSort,
|
|
// and !fHasStrings.
|
|
|
|
UINT fNewItemState:1;// select/deselect mode? for multiselection lb
|
|
UINT fUseTabStops:1; // True if the non-ownerdraw listbox should handle tabstops
|
|
UINT fMultiColumn:1; // True if this is a multicolumn listbox
|
|
UINT fNoIntegralHeight:1; // True if we don't want to size the listbox
|
|
// an integral lineheight
|
|
UINT fWantKeyboardInput:1; // True if we should pass on WM_KEY & CHAR
|
|
// so that the app can go to special items
|
|
// with them.
|
|
UINT fDisableNoScroll:1; // True if the listbox should
|
|
// automatically Enable/disable
|
|
// it's scroll bars. If false, the scroll
|
|
// bars will be hidden/Shown automatically
|
|
// if they are present.
|
|
UINT fHorzBar:1; // TRUE if WS_HSCROLL specified at create time
|
|
|
|
UINT fVertBar:1; // TRUE if WS_VSCROLL specified at create time
|
|
UINT fFromInsert:1; // TRUE if client drawing should be deferred during delete/insert ops
|
|
UINT fNoSel:1;
|
|
|
|
UINT fHorzInitialized : 1; // Horz scroll cache initialized
|
|
UINT fVertInitialized : 1; // Vert scroll cache initialized
|
|
|
|
UINT fSized : 1; // Listbox was resized.
|
|
UINT fIgnoreSizeMsg : 1; // If TRUE, ignore WM_SIZE message
|
|
|
|
UINT fInitialized : 1;
|
|
|
|
UINT fRightAlign:1; // used primarily for MidEast right align
|
|
UINT fRtoLReading:1; // used only for MidEast, text rtol reading order
|
|
UINT fSmoothScroll:1;// allow just one smooth-scroll per scroll cycle
|
|
|
|
int xRightOrigin; // For horizontal scrolling. The current x origin
|
|
|
|
INT iLastSelection; // Used for cancelable selection. Last selection
|
|
// in listbox for combo box support
|
|
INT iMouseDown; // For multiselection mouse click & drag extended
|
|
// selection. It is the ANCHOR point for range selections
|
|
INT iLastMouseMove; // selection of listbox items
|
|
|
|
// IanJa/Win32: Tab positions remain int for 32-bit API ??
|
|
LPINT iTabPixelPositions; // List of positions for tabs
|
|
HANDLE hFont; // User settable font for listboxes
|
|
int xOrigin; // For horizontal scrolling. The current x origin
|
|
int maxWidth; // Maximum width of listbox in pixels for
|
|
// horizontal scrolling purposes
|
|
PCBOX pcbox; // Combo box pointer
|
|
HDC hdc; // hdc currently in use
|
|
DWORD dwLocaleId; // Locale used for sorting strings in list box
|
|
int iTypeSearch;
|
|
LPWSTR pszTypeSearch;
|
|
SCROLLPOS HPos;
|
|
SCROLLPOS VPos;
|
|
} LBIV, *PLBIV;
|
|
|
|
//
|
|
// rgpch is set up as follows: First there are cMac 2 byte pointers to the
|
|
// start of the strings in hStrings or if ownerdraw, it is 4 bytes of data
|
|
// supplied by the app and hStrings is not used. Then if multiselection
|
|
// listboxes, there are cMac 1 byte selection state bytes (one for each item
|
|
// in the list box). If variable height owner draw, there will be cMac 1 byte
|
|
// height bytes (once again, one for each item in the list box.).
|
|
//
|
|
// CHANGES DONE BY SANKAR:
|
|
// The selection byte in rgpch is divided into two nibbles. The lower
|
|
// nibble is the selection state (1 => Selected; 0 => de-selected)
|
|
// and higher nibble is the display state(1 => Hilited and 0 => de-hilited).
|
|
// You must be wondering why on earth we should store this selection state and
|
|
// the display state seperately.Well! The reason is as follows:
|
|
// While Ctrl+Dragging or Shift+Ctrl+Dragging, the user can adjust the
|
|
// selection before the mouse button is up. If the user enlarges a range and
|
|
// and before the button is up if he shrinks the range, then the old selection
|
|
// state has to be preserved for the individual items that do not fall in the
|
|
// range finally.
|
|
// Please note that the display state and the selection state for an item
|
|
// will be the same except when the user is dragging his mouse. When the mouse
|
|
// is dragged, only the display state is updated so that the range is hilited
|
|
// or de-hilited) but the selection state is preserved. Only when the button
|
|
// goes up, for all the individual items in the range, the selection state is
|
|
// made the same as the display state.
|
|
//
|
|
|
|
|
|
typedef struct tagLBItem
|
|
{
|
|
LONG offsz;
|
|
ULONG_PTR itemData;
|
|
} LBItem, *lpLBItem;
|
|
|
|
|
|
typedef struct tagLBODItem
|
|
{
|
|
ULONG_PTR itemData;
|
|
} LBODItem, *lpLBODItem;
|
|
|
|
|
|
extern WORD DbcsCombine(HWND hwnd, WORD ch);
|
|
extern VOID GetCharDimensions(HDC hDC, SIZE *psiz);
|
|
|
|
//
|
|
// Listbox function prototypes
|
|
//
|
|
|
|
extern LRESULT ListBox_WndProc(
|
|
HWND hwnd,
|
|
UINT msg,
|
|
WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
|
|
// in listbox.c
|
|
LPWSTR GetLpszItem(PLBIV, INT);
|
|
VOID ListBox_HSrollMultiColumn(PLBIV, INT, INT);
|
|
INT ListBox_GetVarHeightItemHeight(PLBIV, INT);
|
|
INT ListBox_VisibleItemsVarOwnerDraw(PLBIV, BOOL);
|
|
INT ListBox_Page(PLBIV, INT, BOOL);
|
|
INT ListBox_CalcVarITopScrollAmt(PLBIV, INT, INT);
|
|
VOID ListBox_SetCItemFullMax(PLBIV);
|
|
VOID ListBox_DoDeleteItems(PLBIV);
|
|
void ListBox_InitHStrings(PLBIV);
|
|
VOID ListBox_Event(PLBIV, UINT, int);
|
|
|
|
|
|
// in listbox_ctl1.c
|
|
int ListBox_SetScrollParms(PLBIV plb, int nCtl);
|
|
VOID ListBox_ShowHideScrollBars(PLBIV);
|
|
LONG_PTR ListBox_GetItemDataHandler(PLBIV, INT);
|
|
INT ListBox_GetTextHandler(PLBIV, BOOL, BOOL, INT, LPWSTR);
|
|
LONG ListBox_InitStorage(PLBIV plb, BOOL fAnsi, INT cItems, INT cb);
|
|
int ListBox_InsertItem(PLBIV, LPWSTR, int, UINT);
|
|
BOOL ListBox_ResetContentHandler(PLBIV plb);
|
|
INT ListBox_DeleteStringHandler(PLBIV, INT);
|
|
VOID ListBox_DeleteItem(PLBIV, INT);
|
|
INT ListBox_SetCount(PLBIV, INT);
|
|
|
|
|
|
// in listbox_ctl2.c
|
|
BOOL ListBox_InvalidateRect(PLBIV plb, LPRECT lprc, BOOL fErase);
|
|
HBRUSH ListBox_GetBrush(PLBIV plb, HBRUSH *phbrOld);
|
|
BOOL ListBox_GetItemRectHandler(PLBIV, INT, LPRECT);
|
|
VOID ListBox_SetCaret(PLBIV, BOOL);
|
|
BOOL ListBox_IsSelected(PLBIV, INT, UINT);
|
|
INT ListBox_CItemInWindow(PLBIV, BOOL);
|
|
VOID ListBox_VScroll(PLBIV, INT, INT);
|
|
VOID ListBox_HScroll(PLBIV, INT, INT);
|
|
VOID ListBox_Paint(PLBIV, HDC, LPRECT);
|
|
BOOL ListBox_ISelFromPt(PLBIV, POINT, LPDWORD);
|
|
VOID ListBox_InvertItem(PLBIV, INT, BOOL);
|
|
VOID ListBox_NotifyOwner(PLBIV, INT);
|
|
VOID ListBox_SetISelBase(PLBIV, INT);
|
|
VOID ListBox_TrackMouse(PLBIV, UINT, POINT);
|
|
void ListBox_ButtonUp(PLBIV plb, UINT uFlags);
|
|
VOID ListBox_NewITop(PLBIV, INT);
|
|
VOID ListBox_InsureVisible(PLBIV, INT, BOOL);
|
|
VOID ListBox_KeyInput(PLBIV, UINT, UINT);
|
|
int Listbox_FindStringHandler(PLBIV, LPWSTR, INT, INT, BOOL);
|
|
VOID ListBox_CharHandler(PLBIV, UINT, BOOL);
|
|
INT ListBox_GetSelItemsHandler(PLBIV, BOOL, INT, LPINT);
|
|
VOID ListBox_SetRedraw(PLBIV plb, BOOL fRedraw);
|
|
VOID ListBox_SetRange(PLBIV, INT, INT, BOOL);
|
|
INT ListBox_SetCurSelHandler(PLBIV, INT);
|
|
int ListBox_SetItemDataHandler(PLBIV, INT, LONG_PTR);
|
|
VOID ListBox_CheckRedraw(PLBIV, BOOL, INT);
|
|
VOID ListBox_CaretDestroy(PLBIV);
|
|
LONG ListBox_SetSelHandler(PLBIV, BOOL, INT);
|
|
|
|
|
|
// in listbox_ctl3.c
|
|
INT ListBox_DirHandler(PLBIV, UINT, LPWSTR);
|
|
INT ListBox_InsertFile(PLBIV, LPWSTR);
|
|
|
|
|
|
#endif // __LISTBOX_H__
|