Standardize License information
[openafs.git] / src / WINNT / afsapplib / fastlist.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef FASTLIST_H
11 #define FASTLIST_H
12
13 #include <commctrl.h>
14
15
16 /*
17  * DEFINITIONS ________________________________________________________________
18  *
19  */
20
21 #ifndef EXPORTED
22 #define EXPORTED
23 #endif
24
25 #ifndef THIS_HINST
26 #define THIS_HINST   (HINSTANCE)GetModuleHandle(NULL)
27 #endif
28
29 #define WC_FASTLIST   TEXT("FastList")
30
31 #define FLM_FIRST     0x1400
32
33 #define FLN_FIRST    (0U-880U)
34 #define FLN_LAST     (0U-885U)
35
36 #define IMAGE_NOIMAGE      ((int)(-1))
37 #define IMAGE_BLANKIMAGE   ((int)(-2))
38
39
40 /*
41  * WINDOW STYLES ______________________________________________________________
42  *
43  */
44
45         // The FLS_VIEW_* styles are used to indicate the format for
46         // displaying items in the FastList; either by Large Icons,
47         // Small Icons (equivalent to a ListView's "List" layout),
48         // in a List (equivalent to ListView's "Report" layout),
49         // in a Tree (equivalent to a TreeView), or as a tree/list hybrid--
50         // showing the Tree hierarchy as well as a header bar and
51         // details about each item.
52         //
53 #define FLS_VIEW_LARGE      0x0001
54 #define FLS_VIEW_SMALL      0x0002
55 #define FLS_VIEW_LIST       0x0003
56 #define FLS_VIEW_TREE       0x0004
57 #define FLS_VIEW_TREELIST   (FLS_VIEW_TREE | FLS_VIEW_LIST)
58 #define FLS_VIEW_MASK       (FLS_VIEW_LARGE | FLS_VIEW_SMALL | FLS_VIEW_TREE | FLS_VIEW_LIST)
59
60         // The FLS_NOSORTHEADER style causes the header bar (when visible)
61         // to be drawn "flat"--the buttons cannot be depressed. This style
62         // cannot be combined with FLS_AUTOSORTHEADER.
63         //
64 #define FLS_NOSORTHEADER    0x0008
65
66         // The FLS_SELECTION_MULTIPLE style indicates that more than one
67         // item in the list may be selected at any time. When combined with
68         // the FLS_SELECTION_SIBLING style, only direct siblings in the tree
69         // hierarchy may be selected at any time. When instead combined with
70         // the FLS_SELECTION_LEVEL style, only items at the same level from
71         // the root may be selected at any time.  If these bits are not set,
72         // only one item may be selected at any time.
73         //
74 #define FLS_SELECTION_MULTIPLE  0x0010
75 #define FLS_SELECTION_SIBLING  (0x0020 | FLS_SELECTION_MULTIPLE)
76 #define FLS_SELECTION_LEVEL    (0x0040 | FLS_SELECTION_MULTIPLE)
77
78         // The FLS_LINESATROOT style causes root-level items in the tree
79         // to be prefixed by open/close boxes.
80         //
81 #define FLS_LINESATROOT     0x0080
82
83         // The FLS_LONGCOLUMNS style allows the right-most column containing
84         // text, if left-justified, to be drawn to the extent of the window
85         // regardless of column boundaries. It is particularly useful in
86         // Tree/List mode, where some entries may have long descriptions
87         // for the left-most column, and others may have several columns of
88         // data.
89         //
90 #define FLS_LONGCOLUMNS     0x0100
91
92         // The FLS_HIT_TEXTONLY style allows the user to de-select all
93         // items by left- or right-clicking on the whitespace between
94         // columns of data in List mode. (It has no effect in other modes.)
95         // If this bit is not set, clicking on this whitespace causes
96         // that item to be selected.
97         //
98 #define FLS_HIT_TEXTONLY    0x0200
99
100         // The FLS_AUTOSORTHEADER style allows the user to sort on any
101         // column by clicking on the column, or to reverse the sort on
102         // a column by clicking it twice. This style cannot be combined
103         // with the FLS_NOSORTHEADER style.
104         //
105 #define FLS_AUTOSORTHEADER  0x0400
106
107 /*
108  * STRUCTURES _________________________________________________________________
109  *
110  */
111
112 typedef struct _FASTLISTITEM *HLISTITEM;
113
114 typedef struct FASTLISTADDITEM
115    {
116    HLISTITEM hParent;   // parent item or NULL
117    int iFirstImage;     // primary icon or imageNO_IMAGE
118    int iSecondImage;    // secondary icon or imageNO_IMAGE
119    LPTSTR pszText;      // text for column 0
120    LPARAM lParam;       // user-supplied cookie
121    DWORD dwFlags;       // combination of FLIF_* flags
122    } FASTLISTADDITEM, *LPFASTLISTADDITEM;
123
124 #define FLIF_TREEVIEW_ONLY      0x0001  // hide item unless in tree view
125 #define FLIF_DROPHIGHLIGHT      0x0002  // draw item as if it were selected
126 #define FLIF_DISALLOW_COLLAPSE  0x0004  // don't allow this item to collapse
127 #define FLIF_DISALLOW_SELECT    0x0008  // don't allow this item to be selected
128
129 typedef struct FASTLISTITEMREGIONS
130    {
131    RECT rItem;  // OUT: overall rectangle for item
132    RECT rImage; // OUT: rect of item's images
133    RECT rLabel; // OUT: rect of item's label
134    RECT rHighlight;     // OUT: rect that inverts on selection
135    RECT rButton;        // OUT: rect of tree open/close button
136    RECT rSelect;        // OUT: union of rHighlight+rImage
137    } FASTLISTITEMREGIONS, *LPFASTLISTITEMREGIONS;
138
139 typedef struct FASTLISTDRAWITEM
140    {
141    HDC hdc;     // IN: target or template HDC
142    BOOL fDraw;  // IN: TRUE if should render to hdc
143    BOOL fDragImage;     // IN: TRUE if want drag image only
144    HWND hWnd;   // IN: handle of fastlist window
145    HLISTITEM hItem;     // IN: item to be drawn
146    LPARAM lParam;       // IN: user-supplied lparam for item
147    RECT rItem;  // IN: overall rectangle for item
148    POINT ptTextTest;    // IN: client coords of point to test
149    BOOL fTextTestHit;   // OUT: TRUE if point is within text
150    FASTLISTITEMREGIONS reg;     // OUT: information about item image
151    } FASTLISTDRAWITEM, *LPFASTLISTDRAWITEM;
152
153 typedef struct FLN_GETITEMTEXT_PARAMS
154    {
155    NMHDR hdr;   // IN: typical notification header
156    struct
157       {
158       HLISTITEM hItem;  // IN: item for which to obtain text
159       int icol; // IN: 0-based column of text to get
160       LPARAM lParam;    // IN: user-supplied lparam for item
161       LPTSTR pszText;   // IN: buffer in which to place text
162       size_t cchTextMax;        // IN: size of buffer; OUT: required
163       } item;
164    } FLN_GETITEMTEXT_PARAMS, *LPFLN_GETITEMTEXT_PARAMS;
165
166 typedef struct FLN_ITEMCHANGED_PARAMS
167    {
168    NMHDR hdr;   // IN: typical notification header
169    HLISTITEM hItem;     // IN: item whose data has changed
170    } FLN_ITEMCHANGED_PARAMS, *LPFLN_ITEMCHANGED_PARAMS;
171
172 typedef struct FLN_ADDITEM_PARAMS
173    {
174    NMHDR hdr;   // IN: typical notification header
175    HLISTITEM hItem;     // IN: item which was added
176    } FLN_ADDITEM_PARAMS, *LPFLN_ADDITEM_PARAMS;
177
178 typedef struct FLN_REMOVEITEM_PARAMS
179    {
180    NMHDR hdr;   // IN: typical notification header
181    HLISTITEM hItem;     // IN: item which was removed
182    } FLN_REMOVEITEM_PARAMS, *LPFLN_REMOVEITEM_PARAMS;
183
184 typedef struct FLN_COLUMNCLICK_PARAMS
185    {
186    NMHDR hdr;   // IN: typical notification header
187    int icol;    // IN: 0-based column that was clicked
188    BOOL fDouble;        // IN: TRUE if 'twas a double-click
189    } FLN_COLUMNCLICK_PARAMS, *LPFLN_COLUMNCLICK_PARAMS;
190
191 typedef struct FLN_COLUMNRESIZE_PARAMS
192    {
193    NMHDR hdr;   // IN: typical notification header
194    int icol;    // IN: 0-based column that was resized
195    LONG cxWidth;        // IN: new width of the column
196    } FLN_COLUMNRESIZE_PARAMS, *LPFLN_COLUMNRESIZE_PARAMS;
197
198 typedef struct FLN_ITEMSELECT_PARAMS
199    {
200    NMHDR hdr;   // IN: typical notification header
201    HLISTITEM hItem;     // IN: first item which is now selected
202    } FLN_ITEMSELECT_PARAMS, *LPFLN_ITEMSELECT_PARAMS;
203
204 typedef struct FLN_ITEMEXPAND_PARAMS
205    {
206    NMHDR hdr;   // IN: typical notification header
207    HLISTITEM hItem;     // IN: item which was expanded/collapsed
208    BOOL fExpanded;      // IN: TRUE if item is now expanded
209    } FLN_ITEMEXPAND_PARAMS, *LPFLN_ITEMEXPAND_PARAMS;
210
211 typedef struct FLN_DRAG_PARAMS
212    {
213    NMHDR hdr;   // IN: typical notification header
214    HLISTITEM hFirst;    // IN: first (of perhaps many) selected
215    POINT ptScreenFrom;  // IN: screen coordinates of button-down
216    POINT ptScreenTo;    // IN: final screen coordinates
217    BOOL fRightButton;   // IN: TRUE if right-button drag
218    BOOL fShift; // IN: TRUE if shift is down
219    BOOL fControl;       // IN: TRUE if control is down
220    } FLN_DRAG_PARAMS, *LPFLN_DRAG_PARAMS;
221
222 typedef struct FASTLISTCOLUMN
223    {
224    DWORD dwFlags;
225    LONG cxWidth;
226    TCHAR szText[ 256 ];
227    } FASTLISTCOLUMN, *LPFASTLISTCOLUMN;
228
229 #define FLCF_JUSTIFY_LEFT    0x0001
230 #define FLCF_JUSTIFY_RIGHT   0x0002
231 #define FLCF_JUSTIFY_CENTER  0x0003
232 #define FLCF_JUSTIFY_MASK    0x0003
233
234 typedef struct FASTLISTITEMCOLUMN
235    {
236    HLISTITEM hItem;
237    int icol;
238    } FASTLISTITEMCOLUMN, *LPFASTLISTITEMCOLUMN;
239
240 typedef struct FASTLISTITEMIMAGE
241    {
242    HLISTITEM hItem;
243    int iImage;
244    } FASTLISTITEMIMAGE, *LPFASTLISTITEMIMAGE;
245
246 typedef int (CALLBACK * LPFASTLISTSORTFUNC)( HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2 );
247
248 typedef BOOL (CALLBACK * LPFASTLISTTEXTCALLBACK)( HWND hList, LPFLN_GETITEMTEXT_PARAMS pfln, DWORD dwCookie );
249
250
251 /*
252  * NOTIFICATIONS ______________________________________________________________
253  *
254  * All notifications come via a WM_NOTIFY message to the FastList window's
255  * parent window. The message handler should be of the form:
256  *
257  * switch (msg) {
258  *    case WM_NOTIFY: {
259  *       switch (((LPNMHDR)lp)->code) {
260  *          case FLN_GETITEMTEXT: {
261  *             LPFLN_GETITEMTEXT_PARAMS pParams = (LPFLN_GETITEMTEXT_PARAMS)lp;
262  *             lstrcpy (pParams->pszText, ...);
263  *             return TRUE;
264  *          }
265  *          case FLN_ITEMEXPAND: {
266  *             ...
267  *             return TRUE;
268  *          }
269  *       }
270  *    }
271  * }
272  *
273  * The LPARAM associated with a WM_NOTIFY message is always (for notifications
274  * from any window, not just FastLists) a structure consisting of:
275  *    struct {
276  *       NMHDR hdr;
277  *       // window- and message-specific elements ...
278  *    } 
279  * Thus, by casing the LPARAM value to LPNMHDR, information about the
280  * notification can be obtained from any notification structure.
281  * If a notification message is handled, the handler must return TRUE.
282  *
283  */
284
285 #define FLN_GETITEMTEXT  (FLN_FIRST-0)  // lp = LPFLN_GETITEMTEXT_PARAMS
286 #define FLN_ITEMCHANGED  (FLN_FIRST-1)  // lp = LPFLN_ITEMCHANGED_PARAMS
287 #define FLN_ADDITEM      (FLN_FIRST-2)  // lp = LPFLN_ADDITEM_PARAMS
288 #define FLN_REMOVEITEM   (FLN_FIRST-3)  // lp = LPFLN_REMOVEITEM_PARAMS
289 #define FLN_COLUMNCLICK  (FLN_FIRST-4)  // lp = LPFLN_COLUMNCLICK_PARAMS
290 #define FLN_COLUMNRESIZE (FLN_FIRST-5)  // lp = LPFLN_COLUMNRESIZE_PARAMS
291 #define FLN_ITEMSELECT   (FLN_FIRST-6)  // lp = LPFLN_ITEMSELECT_PARAMS
292 #define FLN_ITEMEXPAND   (FLN_FIRST-7)  // lp = LPFLN_ITEMEXPAND_PARAMS
293 #define FLN_LCLICK       (FLN_FIRST-8)  // lp = LPNMHDR
294 #define FLN_RCLICK       (FLN_FIRST-9)  // lp = LPNMHDR
295 #define FLN_LDBLCLICK    (FLN_FIRST-10) // lp = LPNMHDR
296 #define FLN_BEGINDRAG    (FLN_FIRST-11) // lp = LPFLN_DRAG_PARAMS, rc = fDrag
297 #define FLN_DRAG         (FLN_FIRST-12) // lp = LPFLN_DRAG_PARAMS
298 #define FLN_ENDDRAG      (FLN_FIRST-13) // lp = LPFLN_DRAG_PARAMS
299
300
301 /*
302  * MESSAGES ___________________________________________________________________
303  *
304  */
305
306 /*
307  * TASK GROUPING
308  *
309  * Calling FastList_Begin() suspends sorting, repainting and other display-
310  * oriented operations until a matching call to FastList_End(). By surrounding
311  * multiple operations with an initial call to _Begin() and a final call to
312  * _End(), the operations can proceed (potentially much) more quickly, and
313  * without flicker as items are added, updated or removed. Calls to _Begin()
314  * and _End() nest: if _Begin() is called twice, two calls to _End() are
315  * required to finally cause the display to be repainted and resume normal
316  * operation. (A call to FastList_EndAll() ignores all nesting and enables
317  * redraw as if the proper number of calls to _End() had been made.)
318  *
319  */
320
321         // void FastList_Begin (HWND hList);
322         //
323 #define FastList_Begin(_hList) \
324            (void)SendMessage (_hList, FLM_BEGIN, 0, 0)
325 #define FLM_BEGIN               (FLM_FIRST + 0x0000)
326
327         // void FastList_End (HWND hList);
328         // void FastList_EndAll (HWND hList);
329         //
330 #define FastList_End(_hList) \
331            (void)SendMessage (_hList, FLM_END, 0, 0)
332 #define FastList_EndAll(_hList) \
333            (void)SendMessage (_hList, FLM_END, 1, 0)
334 #define FLM_END                 (FLM_FIRST + 0x0001)
335
336 /*
337  * ADD/REMOVE ITEMS
338  *
339  * These operations add and remove items to the list, and affect items'
340  * properties.
341  *
342  */
343
344         // HLISTITEM FastList_AddItem (HWND hList, LPFASTLISTADDITEM pai);
345         //
346 #define FastList_AddItem(_hList,_pai) \
347            (HLISTITEM)SendMessage (_hList, FLM_ADDITEM, 0, (LPARAM)(_pai))
348 #define FLM_ADDITEM             (FLM_FIRST + 0x0002)
349
350         // void FastList_RemoveAll (HWND hList)
351         // void FastList_RemoveItem (HWND hList, HLISTITEM hItem)
352         //
353 #define FastList_RemoveAll(_hList) \
354            FastList_RemoveItem(_hList,0)
355 #define FastList_RemoveItem(_hList,_hItem) \
356            (void)SendMessage (_hList, FLM_REMOVEITEM, (WPARAM)(_hItem), 0)
357 #define FLM_REMOVEITEM          (FLM_FIRST + 0x0003)
358
359         // LPCTSTR FastList_GetItemText (HWND hList, HLISTITEM hItem, int icol);
360         // void FastList_SetItemText (HWND hList, HLISTITEM hItem, int icol, LPCTSTR pszText);
361         //
362 #define FastList_GetItemText(_hList,_hItem,_iCol) \
363            (LPCTSTR)SendMessage (_hList, FLM_GETITEMTEXT, (WPARAM)(_hItem), (LPARAM)(_iCol))
364 #define FastList_SetItemText(_hList,_hItem,_iCol,_psz) \
365            do { FASTLISTITEMCOLUMN _flic; \
366                 _flic.hItem = _hItem; \
367                 _flic.icol = _iCol; \
368                 (void)SendMessage (_hList, FLM_SETITEMTEXT, (WPARAM)&_flic, (LPARAM)(_psz)); } while (0)
369 #define FLM_GETITEMTEXT         (FLM_FIRST + 0x0004)
370 #define FLM_SETITEMTEXT         (FLM_FIRST + 0x0005)
371
372         // LPARAM FastList_GetItemParam (HWND hList, HLISTITEM hItem);
373         // void FastList_SetItemParam (HWND hList, HLISTITEM hItem, LPARAM lParam);
374         //
375 #define FastList_GetItemParam(_hList,_hItem) \
376            (LPARAM)SendMessage (_hList, FLM_GETITEMPARAM, (WPARAM)(_hItem), 0)
377 #define FastList_SetItemParam(_hList,_hItem,_lp) \
378            (void)SendMessage (_hList, FLM_SETITEMPARAM, (WPARAM)(_hItem), (LPARAM)(_lp))
379 #define FLM_GETITEMPARAM        (FLM_FIRST + 0x0006)
380 #define FLM_SETITEMPARAM        (FLM_FIRST + 0x0007)
381
382         // DWORD FastList_GetItemFlags (HWND hList, HLISTITEM hItem);
383         // void FastList_SetItemFlags (HWND hList, HLISTITEM hItem, DWORD dwFlags);
384         //
385 #define FastList_GetItemFlags(_hList,_hItem) \
386            (LPARAM)SendMessage (_hList, FLM_GETITEMFLAGS, (WPARAM)(_hItem), 0)
387 #define FastList_SetItemFlags(_hList,_hItem,_dw) \
388            (void)SendMessage (_hList, FLM_SETITEMFLAGS, (WPARAM)(_hItem), (LPARAM)(_dw))
389 #define FLM_GETITEMFLAGS        (FLM_FIRST + 0x0008)
390 #define FLM_SETITEMFLAGS        (FLM_FIRST + 0x0009)
391
392         // int FastList_GetItemFirstImage (HWND hList, HLISTITEM hItem);
393         // int FastList_GetItemSecondImage (HWND hList, HLISTITEM hItem);
394         // void FastList_SetItemFirstImage (HWND hList, HLISTITEM hItem, int image);
395         // void FastList_SetItemSecondImage (HWND hList, HLISTITEM hItem, int image);
396         //
397 #define FastList_GetItemFirstImage(_hList,_hItem) \
398             FastList_GetItemImage(_hList,_hItem,0)
399 #define FastList_GetItemSecondImage(_hList,_hItem) \
400             FastList_GetItemImage(_hList,_hItem,1)
401 #define FastList_SetItemFirstImage(_hList,_hItem,_image) \
402             FastList_SetItemImage(_hList,_hItem,0,_image)
403 #define FastList_SetItemSecondImage(_hList,_hItem,_image) \
404             FastList_SetItemImage(_hList,_hItem,1,_image)
405 #define FastList_GetItemImage(_hList,_hItem,_iImage) \
406            (int)SendMessage (_hList, FLM_GETITEMIMAGE, (WPARAM)(_hItem), (LPARAM)(_iImage))
407 #define FastList_SetItemImage(_hList,_hItem,_iImage,_image) \
408            do { FASTLISTITEMIMAGE _flii; \
409                 _flii.hItem = _hItem; \
410                 _flii.iImage = _iImage; \
411                 (void)SendMessage (_hList, FLM_SETITEMIMAGE, (WPARAM)&_flii, (LPARAM)(_image)); } while (0)
412 #define FLM_GETITEMIMAGE        (FLM_FIRST + 0x000A)
413 #define FLM_SETITEMIMAGE        (FLM_FIRST + 0x000B)
414
415         // BOOL FastList_IsExpanded (HWND hList, HLISTITEM hItem);
416         // void FastList_Expand (HWND hList, HLISTITEM hItem);
417         // void FastList_Collapse (HWND hList, HLISTITEM hItem);
418         // void FastList_SetExpanded (HWND hList, HLISTITEM hItem, BOOL fExpand);
419         //
420 #define FastList_IsExpanded(_hList,_hItem) \
421            (BOOL)SendMessage (_hList, FLM_ISEXPANDED, (WPARAM)(_hItem), 0)
422 #define FastList_Expand(_hList,_hItem) \
423            FastList_SetExpanded(_hList,_hItem,TRUE)
424 #define FastList_Collapse(_hList,_hItem) \
425            FastList_SetExpanded(_hList,_hItem,FALSE)
426 #define FastList_SetExpanded(_hList,_hItem,_fExpand) \
427            (BOOL)SendMessage (_hList, FLM_EXPAND, (WPARAM)(_hItem), (LPARAM)(_fExpand))
428 #define FLM_ISEXPANDED          (FLM_FIRST + 0x000C)
429 #define FLM_EXPAND              (FLM_FIRST + 0x000D)
430
431         // BOOL FastList_IsVisible (HWND hList, HLISTITEM hItem);
432         // void FastList_EnsureVisible (HWND hList, HLISTITEM hItem);
433         //
434 #define FastList_IsVisible(_hList,_hItem) \
435            (BOOL)SendMessage (_hList, FLM_ITEMVISIBLE, (WPARAM)(_hItem), 0)
436 #define FastList_EnsureVisible(_hList,_hItem) \
437            (BOOL)SendMessage (_hList, FLM_ITEMVISIBLE, (WPARAM)(_hItem), 1)
438 #define FLM_ITEMVISIBLE         (FLM_FIRST + 0x000E)
439
440         // HLISTITEM FastList_GetFocus (HWND hList);
441         // BOOL FastList_IsFocused (HWND hList, HLISTITEM hItem);
442         // void FastList_SetFocus (HWND hList, HLISTITEM hItem);
443         //
444 #define FastList_GetFocus(_hList) \
445            (HLISTITEM)SendMessage (_hList, FLM_ITEMFOCUS, 0, 0)
446 #define FastList_IsFocused(_hList,_hItem) \
447            (BOOL)SendMessage (_hList, FLM_ITEMFOCUS, (WPARAM)(_hItem), 0)
448 #define FastList_SetFocus(_hList,_hItem) \
449            (void)SendMessage (_hList, FLM_ITEMFOCUS, (WPARAM)(_hItem), 1)
450 #define FLM_ITEMFOCUS           (FLM_FIRST + 0x000F)
451
452
453 /*
454  * IMAGE LIST SUPPORT
455  *
456  * A FastList may have two separate IMAGELISTs associated with it--one for
457  * 32x32 icons (used only in Large mode), and one for 16x16 icons (used in
458  * all other display modes). Use COMMCTRL.H's ImageList_Create() to create
459  * imagelists for use with a FastList.
460  *
461  */
462
463         // void FastList_GetImageLists (HWND hList, HIMAGELIST *phiSmall, HIMAGELIST *phiLarge)
464         //
465 #define FastList_GetImageLists(_hList,_phiSmall,_phiLarge) \
466            (void)SendMessage (_hList, FLM_GETIMAGELISTS, (WPARAM)(_phiSmall), (LPARAM)(_phiLarge))
467 #define FLM_GETIMAGELISTS       (FLM_FIRST + 0x0010)
468
469         // void FastList_SetImageLists (HWND hList, HIMAGELIST hiSmall, HIMAGELIST hiLarge)
470         //
471 #define FastList_SetImageLists(_hList,_hiSmall,_hiLarge) \
472            (void)SendMessage (_hList, FLM_SETIMAGELISTS, (WPARAM)(_hiSmall), (LPARAM)(_hiLarge))
473 #define FLM_SETIMAGELISTS       (FLM_FIRST + 0x0011)
474
475         // HIMAGELIST FastList_CreateDragImage (HWND hList, HLISTITEM hItem)
476         //
477 #define FastList_CreateDragImage(_hList,_hItem)  \
478            (HIMAGELIST)SendMessage (_hList, FLM_CREATEDRAGIMAGE, (WPARAM)(_hItem), 0)
479 #define FLM_CREATEDRAGIMAGE     (FLM_FIRST + 0x0012)
480
481 /*
482  * SORTING
483  *
484  * The contents of a FastList are always kept sorted; they will never be
485  * displayed out-of-sort. The function used to sort items may be replaced
486  * by calling the FastList_SetSortFunction() method, and parameters
487  * regarding the sort may be changed by calling the FastList_SetSortStyle()
488  * function. The default sorting parameters are:
489  *
490  *    Function: FastList_SortFunc_AlphaNumeric()  [declared way down below]
491  *    Column:   Sorted on column 0
492  *    Reverse:  No; items ascending-sorted
493  *
494  * The FastList_Sort() function may be called to initiate a re-sort;
495  * however, doing so is unnecessary (as the list is automatically re-sorted
496  * when necessary). When displaying items in a tree, sorting is performed
497  * between sibling items only.
498  *
499  */
500
501         // LPFASTLISTSORTFUNC FastList_GetSortFunction (HWND hList)
502         //
503 #define FastList_GetSortFunction(_hList,_pfn) \
504            (LPFASTLISTSORTFUNC)SendMessage (_hList, FLM_GETSORTFUNC, 0, 0)
505 #define FLM_GETSORTFUNC         (FLM_FIRST + 0x0013)
506
507         // void FastList_SetSortFunction (HWND hList, LPFASTLISTSORTFUNC pfn)
508         //
509 #define FastList_SetSortFunction(_hList,_pfn) \
510            (void)SendMessage (_hList, FLM_SETSORTFUNC, 0, (LPARAM)(_pfn))
511 #define FLM_SETSORTFUNC         (FLM_FIRST + 0x0014)
512
513         // void FastList_GetSortStyle (HWND hList, int *piColumn, BOOL *pfReverse)
514         //
515 #define FastList_GetSortStyle(_hList,_piCol,_pfRev) \
516            (void)SendMessage (_hList, FLM_GETSORTSTYLE, (WPARAM)(_piCol), (LPARAM)(_pfRev))
517 #define FLM_GETSORTSTYLE        (FLM_FIRST + 0x0015)
518
519         // void FastList_SetSortStyle (HWND hList, int iColumn, BOOL fReverse)
520         //
521 #define FastList_SetSortStyle(_hList,_iCol,_fRev) \
522            (void)SendMessage (_hList, FLM_SETSORTSTYLE, (WPARAM)(_iCol), (LPARAM)(_fRev))
523 #define FLM_SETSORTSTYLE        (FLM_FIRST + 0x0016)
524
525         // void FastList_Sort (HWND hList)
526         //
527 #define FastList_Sort(_hList) \
528            (void)SendMessage (_hList, FLM_SORT, 0, 0)
529 #define FLM_SORT                (FLM_FIRST + 0x0017)
530
531 /*
532  * COLUMNS
533  *
534  * In List and TreeList mode, a FastList can be caused to display a column
535  * header and the associated multiple columns of information for each item.
536  * FastList_AddItem() supplies only a place for the item's column-0 text
537  * to be specified; other columns may be specified by FastList_SetItemText(),
538  * but if not, the FastList will call back to its parent window via the
539  * WM_NOTIFY/FLN_GETITEMTEXT notification to obtain text for the items'
540  * unspecified columns.
541  *
542  */
543
544         // int FastList_GetColumnCount (HWND hList)
545         //
546 #define FastList_GetColumnCount(_hList) \
547            (int)SendMessage (_hList, FLM_GETCOLUMNCOUNT, 0, 0)
548 #define FLM_GETCOLUMNCOUNT      (FLM_FIRST + 0x0018)
549
550         // BOOL FastList_GetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol)
551         //
552 #define FastList_GetColumn(_hList,_iCol,_pCol) \
553            (BOOL)SendMessage (_hList, FLM_GETCOLUMN, (WPARAM)(_iCol), (LPARAM)(_pCol))
554 #define FLM_GETCOLUMN           (FLM_FIRST + 0x0019)
555
556         // void FastList_SetColumn (HWND hList, int iColumn, LPFASTLISTCOLUMN pcol)
557         // void FastList_RemoveColumn (HWND hList, int iColumn)
558         //
559 #define FastList_SetColumn(_hList,_iCol,_pCol) \
560            (void)SendMessage (_hList, FLM_SETCOLUMN, (WPARAM)(_iCol), (LPARAM)(_pCol))
561 #define FastList_RemoveColumn(_hList,_iCol) \
562            FastList_SetColumn (_hList, _iCol, NULL)
563 #define FLM_SETCOLUMN           (FLM_FIRST + 0x001A)
564
565 /*
566  * SELECTION
567  *
568  * A FastList supports several types of selection.  Single Selection causes
569  * any current selection to be cleared before a new item can be selected,
570  * either programmatically or by user action. Multiple Selection
571  * indiscriminately allows any items to be selected or deselected at
572  * the same time.  Multiple/Sibling Selection requires that, if an item
573  * is selected which is not a sibling of any currently-selected items,
574  * the current selection is cleared first.  Multiple/Level Selection requires
575  * that, if an item is selected which is at a different level from the root
576  * than any currently-selected item, the current selection is cleared first.
577  *
578  */
579
580         // BOOL FastList_IsSelected (HWND hList, HLISTITEM hItem)
581         //
582 #define FastList_IsSelected(_hList,_hItem) \
583            (BOOL)SendMessage (_hList, FLM_ISSELECTED, (WPARAM)(_hItem), 0)
584 #define FLM_ISSELECTED          (FLM_FIRST + 0x001B)
585
586         // void FastList_SelectAll (HWND hList)
587         // void FastList_SelectNone (HWND hList)
588         // void FastList_SelectItem (HWND hList, HLISTITEM hItem, BOOL fSelect)
589         //
590 #define FastList_SelectAll(_hList) \
591            FastList_SelectItem(_hList,0,TRUE)
592 #define FastList_SelectNone(_hList) \
593            FastList_SelectItem(_hList,0,FALSE)
594 #define FastList_SelectItem(_hList,_hItem,_fSel) \
595            (void)SendMessage (_hList, FLM_SELECTITEM, (WPARAM)(_hItem), (LPARAM)(_fSel))
596 #define FLM_SELECTITEM          (FLM_FIRST + 0x001C)
597
598 /*
599  * ENUMERATION
600  *
601  * A FastList provides multiple methods for enumeration. Items in the list
602  * may be enumerated as members of a hierarchy, or as members of a list.
603  * Additionally, the items in a FastList are hashed across their lParam
604  * values, so the FastList item matching a given lParam value can quickly
605  * be found. All enumeration functions are either constant time, or (as
606  * in the case of lParam-to-HLISTITEM lookups) extremely close to it.
607  *
608  * A typical enumeration will look like this:
609  *    for (HLISTITEM hItem = FastList_FindFirst (hList);
610  *         hItem != NULL;
611  *         hItem = FastList_FindNext (hList, hItem))
612  *       {
613  *       // ...
614  *       }
615  *
616  * Or, equivalently:
617  *    HLISTITEM hItem = NULL;
618  *    while ((hItem = FastList_FindNext (hList, hItem)) != NULL)
619  *       {
620  *       // ...
621  *       }
622  *
623  * If an enumeration involving an LPENUM pointer is terminated without
624  * having enumerated all items in the list, the loop must be followed
625  * by a FastList_FindClose() statement. (This statement is optional
626  * otherwise.) If the state of the list or tree is updated, the enumeration
627  * should be stopped.
628  *
629  */
630
631         // HLISTITEM FastList_FindFirst (HWND hList)
632         // HLISTITEM FastList_FindNext (HWND hList, HLISTITEM hItem)
633         // HLISTITEM FastList_FindPrevious (HWND hList, HLISTITEM hItem)
634         //
635 #define FastList_FindFirst(_hList)  \
636            FastList_FindList(_hList,0,FLM_FINDLIST_FIRST) 
637 #define FastList_FindNext(_hList,_hItem)  \
638            FastList_FindList(_hList,_hItem,FLM_FINDLIST_NEXT) 
639 #define FastList_FindPrevious(_hList,_hItem)  \
640            FastList_FindList(_hList,_hItem,FLM_FINDLIST_PREVIOUS) 
641 #define FastList_FindList(_hList,_hItem,_dwCode) \
642            (HLISTITEM)SendMessage (_hList, FLM_FINDLIST, (WPARAM)(_hItem), (LPARAM)(_dwCode))
643 #define FLM_FINDLIST            (FLM_FIRST + 0x001D)
644 #define FLM_FINDLIST_FIRST      0
645 #define FLM_FINDLIST_PREVIOUS   1
646 #define FLM_FINDLIST_NEXT       2
647
648         // HLISTITEM FastList_FindFirstInRoot (HWND hList)
649         // HLISTITEM FastList_FindParent (HWND hList, HLISTITEM hItem)
650         // HLISTITEM FastList_FindFirstChild (HWND hList, HLISTITEM hItem)
651         // HLISTITEM FastList_FindPreviousSibling (HWND hList, HLISTITEM hItem)
652         // HLISTITEM FastList_FindNextSibling (HWND hList, HLISTITEM hItem)
653         //
654 #define FastList_FindFirstInRoot(_hList)  \
655            FastList_FindTree(_hList,0,FLM_FINDTREE_CHILD) 
656 #define FastList_FindParent(_hList,_hItem)  \
657            FastList_FindTree(_hList,_hItem,FLM_FINDTREE_PARENT) 
658 #define FastList_FindFirstChild(_hList,_hItem)  \
659            FastList_FindTree(_hList,_hItem,FLM_FINDTREE_CHILD) 
660 #define FastList_FindPreviousSibling(_hList,_hItem)  \
661            FastList_FindTree(_hList,_hItem,FLM_FINDTREE_PREVIOUS) 
662 #define FastList_FindNextSibling(_hList,_hItem)  \
663            FastList_FindTree(_hList,_hItem,FLM_FINDTREE_NEXT) 
664 #define FastList_FindTree(_hList,_hItem,_dwCode) \
665            (HLISTITEM)SendMessage (_hList, FLM_FINDTREE, (WPARAM)(_hItem), (LPARAM)(_dwCode))
666 #define FLM_FINDTREE            (FLM_FIRST + 0x001E)
667 #define FLM_FINDTREE_PARENT     0
668 #define FLM_FINDTREE_CHILD      1
669 #define FLM_FINDTREE_PREVIOUS   2
670 #define FLM_FINDTREE_NEXT       3
671
672         // HLISTITEM FastList_FindFirstSelected (HWND hList)
673         // HLISTITEM FastList_FindNextSelected (HWND hList, HLISTITEM hItemPrevious)
674         //
675 #define FastList_FindFirstSelected(_hList)  \
676            FastList_FindNextSelected(_hList,0) 
677 #define FastList_FindNextSelected(_hList,_hItem) \
678            (HLISTITEM)SendMessage (_hList, FLM_FINDSELECTED, (WPARAM)(_hItem), 0)
679 #define FLM_FINDSELECTED        (FLM_FIRST + 0x001F)
680
681         // HLISTITEM FastList_FindItem (HWND hList, LPARAM lParam)
682         // HLISTITEM FastList_FindFirstItem (HWND hList, LPENUM *ppEnum, LPARAM lParam)
683         // HLISTITEM FastList_FindNextItem (HWND hList, LPENUM *ppEnum)
684         // void FastList_FindClose (HWND hList, LPENUM *ppEnum)
685         //
686 #define FastList_FindItem(_hList,_lp)  \
687            (HLISTITEM)SendMessage (_hList, FLM_FINDITEM, 0, (LPARAM)(_lp))
688 #define FastList_FindFirstItem(_hList,_ppEnum,_lp)  \
689            (HLISTITEM)SendMessage (_hList, FLM_FINDITEM, (WPARAM)(_ppEnum), (LPARAM)(_lp))
690 #define FastList_FindNextItem(_hList,_ppEnum)  \
691            (HLISTITEM)SendMessage (_hList, FLM_FINDNEXTITEM, (WPARAM)(_ppEnum), 0)
692 #define FastList_FindClose(_hList,_ppEnum) \
693            (void)SendMessage (_hList, FLM_FINDCLOSE, (WPARAM)(_ppEnum), 0) 
694 #define FLM_FINDITEM            (FLM_FIRST + 0x0020)
695 #define FLM_FINDNEXTITEM        (FLM_FIRST + 0x0021)
696 #define FLM_FINDCLOSE           (FLM_FIRST + 0x0022)
697
698         // int FastList_GetItemCount (HWND hList)
699         // int FastList_GetVisibleItemCount (HWND hList)
700         //
701 #define FastList_GetItemCount(_hList) \
702            (int)SendMessage (_hList, FLM_GETITEMCOUNT, 0, 0)
703 #define FastList_GetVisibleItemCount(_hList) \
704            (int)SendMessage (_hList, FLM_GETITEMCOUNT, 1, 0)
705 #define FLM_GETITEMCOUNT        (FLM_FIRST + 0x0023)
706
707         // HLISTITEM FastList_FindFirstVisible (HWND hList)
708         // HLISTITEM FastList_FindNextVisible (HWND hList, HLISTITEM hItem)
709         //
710 #define FastList_FindFirstVisible(_hList)  \
711            FastList_FindVisible(_hList,0,FLM_FINDVISIBLE_FIRST) 
712 #define FastList_FindNextVisible(_hList,_hItem)  \
713            FastList_FindVisible(_hList,_hItem,FLM_FINDVISIBLE_NEXT) 
714 #define FastList_FindVisible(_hList,_hItem,_dwCode) \
715            (HLISTITEM)SendMessage (_hList, FLM_FINDVISIBLE, (WPARAM)(_hItem), (LPARAM)(_dwCode))
716 #define FLM_FINDVISIBLE         (FLM_FIRST + 0x0024)
717 #define FLM_FINDVISIBLE_FIRST   0
718 #define FLM_FINDVISIBLE_NEXT    1
719
720 /*
721  * ITEM DISPLAY
722  *
723  * Like any other control, a FastList can tell you which item is underneath
724  * a particular point, and can tell you what RECTs an item uses for what
725  * purposes on the display.
726  *
727  * There are style bits which can be set to affect hit-testing on
728  * a FastList. Notably, the FLS_HIT_TEXTONLY bit prevents left- or right-
729  * clicking in whitespace to select an item (in list mode).
730  *
731  */
732
733         // HLISTITEM FastList_ItemFromPoint (HWND hList, POINT *pptClient, BOOL fStrict)
734         //
735 #define FastList_ItemFromPoint(_hList,_pptClient,_fStrict)  \
736            (HLISTITEM)SendMessage (_hList, FLM_ITEMFROMPOINT, (WPARAM)(_pptClient), (LPARAM)(_fStrict))
737 #define FLM_ITEMFROMPOINT       (FLM_FIRST + 0x0025)
738
739         // void FastList_GetItemRegions (HWND hList, HLISTITEM hItem, LPFASTLISTITEMREGIONS pReg)
740         //
741 #define FastList_GetItemRegions(_hList,_hItem,_pReg)  \
742            (HLISTITEM)SendMessage (_hList, FLM_GETITEMREGIONS, (WPARAM)(_hItem), (LPARAM)(_pReg))
743 #define FLM_GETITEMREGIONS      (FLM_FIRST + 0x0026)
744
745         // LPFASTLISTTEXTCALLBACK FastList_GetTextCallback (HWND hList)
746         // void FastList_SetTextCallback (HWND hList, LPFASTLISTTEXTCALLBACK pfn, DWORD dwCookie)
747         //
748 #define FastList_GetTextCallback(_hList)  \
749            (LPFASTLISTTEXTCALLBACK)SendMessage (_hList, FLM_GETTEXTCALLBACK, 0, 0)
750 #define FastList_SetTextCallback(_hList,_pfn,_dwCookie)  \
751            (void)SendMessage (_hList, FLM_SETTEXTCALLBACK, (WPARAM)(_pfn), (LPARAM)(_dwCookie))
752 #define FLM_GETTEXTCALLBACK     (FLM_FIRST + 0x0027)
753 #define FLM_SETTEXTCALLBACK     (FLM_FIRST + 0x0028)
754
755
756 /*
757  * PROTOTYPES _________________________________________________________________
758  *
759  */
760
761 EXPORTED BOOL RegisterFastListClass (void);
762 EXPORTED BOOL fIsFastList (HWND hList);
763
764 EXPORTED void FastList_Enter (HWND hList);
765 EXPORTED void FastList_Leave (HWND hList);
766
767 EXPORTED int CALLBACK FastList_SortFunc_Alphabetic (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2);
768 EXPORTED int CALLBACK FastList_SortFunc_Numeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2);
769 EXPORTED int CALLBACK FastList_SortFunc_AlphaNumeric (HWND hList, HLISTITEM hItem1, LPARAM lpItem1, HLISTITEM hItem2, LPARAM lpItem2);
770
771
772 #endif
773