-
Notifications
You must be signed in to change notification settings - Fork 15
/
headercontrol.lua
466 lines (378 loc) · 14.4 KB
/
headercontrol.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
--proc/controls/headercontrol: standard header control
--Written by Cosmin Apreutesei. Public Domain.
setfenv(1, require'winapi')
require'winapi.winuser'
--creation
WC_HEADER = 'SysHeader32'
--commands
HDM_FIRST = 0x1200
HDM_GETITEMCOUNT = (HDM_FIRST + 0)
function Header_GetItemCount(hwndHD)
return checkpoz(SNDMSG(hwndHD, HDM_GETITEMCOUNT))
end
--notifications
--[[
#define HDS_HORZ 0x0000
#define HDS_BUTTONS 0x0002
#define HDS_HOTTRACK 0x0004
#define HDS_HIDDEN 0x0008
#define HDS_DRAGDROP 0x0040
#define HDS_FULLDRAG 0x0080
#define HDS_FILTERBAR 0x0100
#define HDS_FLAT 0x0200
#define HDS_CHECKBOXES 0x0400
#define HDS_NOSIZING 0x0800
#define HDS_OVERFLOW 0x1000
#define HDFT_ISSTRING 0x0000 // HD_ITEM.pvFilter points to a HD_TEXTFILTER
#define HDFT_ISNUMBER 0x0001 // HD_ITEM.pvFilter points to a INT
#define HDFT_ISDATE 0x0002 // HD_ITEM.pvFilter points to a DWORD (dos date)
#define HDFT_HASNOVALUE 0x8000 // clear the filter, by setting this bit
typedef struct _HD_TEXTFILTERW
{
LPWSTR pszText; // [in] pointer to the buffer contiaining the filter (UNICODE)
INT cchTextMax; // [in] max size of buffer/edit control buffer
} HD_TEXTFILTERW, *LPHD_TEXTFILTERW;
typedef struct _HD_ITEMW
{
UINT mask;
int cxy;
LPWSTR pszText;
HBITMAP hbm;
int cchTextMax;
int fmt;
LPARAM lParam;
int iImage; // index of bitmap in ImageList
int iOrder;
UINT type; // [in] filter type (defined what pvFilter is a pointer to)
void * pvFilter; // [in] fillter data see above
UINT state;
} HDITEMW, *LPHDITEMW;
#define HDI_WIDTH 0x0001
#define HDI_HEIGHT HDI_WIDTH
#define HDI_TEXT 0x0002
#define HDI_FORMAT 0x0004
#define HDI_LPARAM 0x0008
#define HDI_BITMAP 0x0010
#define HDI_IMAGE 0x0020
#define HDI_DI_SETITEM 0x0040
#define HDI_ORDER 0x0080
#define HDI_FILTER 0x0100
#define HDI_STATE 0x0200
// HDF_ flags are shared with the listview control (LVCFMT_ flags)
#define HDF_LEFT 0x0000 // Same as LVCFMT_LEFT
#define HDF_RIGHT 0x0001 // Same as LVCFMT_RIGHT
#define HDF_CENTER 0x0002 // Same as LVCFMT_CENTER
#define HDF_JUSTIFYMASK 0x0003 // Same as LVCFMT_JUSTIFYMASK
#define HDF_RTLREADING 0x0004 // Same as LVCFMT_LEFT
#define HDF_BITMAP 0x2000
#define HDF_STRING 0x4000
#define HDF_OWNERDRAW 0x8000 // Same as LVCFMT_COL_HAS_IMAGES
#if (_WIN32_IE >= 0x0300)
#define HDF_IMAGE 0x0800 // Same as LVCFMT_IMAGE
#define HDF_BITMAP_ON_RIGHT 0x1000 // Same as LVCFMT_BITMAP_ON_RIGHT
#endif
#if (_WIN32_WINNT >= 0x0501)
#define HDF_SORTUP 0x0400
#define HDF_SORTDOWN 0x0200
#endif
#if _WIN32_WINNT >= 0x0600
#define HDF_CHECKBOX 0x0040
#define HDF_CHECKED 0x0080
#define HDF_FIXEDWIDTH 0x0100 // Can't resize the column; same as LVCFMT_FIXED_WIDTH
#define HDF_SPLITBUTTON 0x1000000 // Column is a split button; same as LVCFMT_SPLITBUTTON
#endif
#if _WIN32_WINNT >= 0x0600
#define HDIS_FOCUSED 0x00000001
#endif
#define HDM_INSERTITEMA (HDM_FIRST + 1)
#define HDM_INSERTITEMW (HDM_FIRST + 10)
#ifdef UNICODE
#define HDM_INSERTITEM HDM_INSERTITEMW
#else
#define HDM_INSERTITEM HDM_INSERTITEMA
#endif
#define Header_InsertItem(hwndHD, i, phdi) \
(int)SNDMSG((hwndHD), HDM_INSERTITEM, (WPARAM)(int)(i), (LPARAM)(const HD_ITEM *)(phdi))
#define HDM_DELETEITEM (HDM_FIRST + 2)
#define Header_DeleteItem(hwndHD, i) \
(BOOL)SNDMSG((hwndHD), HDM_DELETEITEM, (WPARAM)(int)(i), 0L)
#define HDM_GETITEMA (HDM_FIRST + 3)
#define HDM_GETITEMW (HDM_FIRST + 11)
#ifdef UNICODE
#define HDM_GETITEM HDM_GETITEMW
#else
#define HDM_GETITEM HDM_GETITEMA
#endif
#define Header_GetItem(hwndHD, i, phdi) \
(BOOL)SNDMSG((hwndHD), HDM_GETITEM, (WPARAM)(int)(i), (LPARAM)(HD_ITEM *)(phdi))
#define HDM_SETITEMA (HDM_FIRST + 4)
#define HDM_SETITEMW (HDM_FIRST + 12)
#ifdef UNICODE
#define HDM_SETITEM HDM_SETITEMW
#else
#define HDM_SETITEM HDM_SETITEMA
#endif
#define Header_SetItem(hwndHD, i, phdi) \
(BOOL)SNDMSG((hwndHD), HDM_SETITEM, (WPARAM)(int)(i), (LPARAM)(const HD_ITEM *)(phdi))
#if (_WIN32_IE >= 0x0300)
#define HD_LAYOUT HDLAYOUT
#else
#define HDLAYOUT HD_LAYOUT
#endif
typedef struct _HD_LAYOUT
{
RECT *prc;
WINDOWPOS *pwpos;
} HDLAYOUT, *LPHDLAYOUT;
#define HDM_LAYOUT (HDM_FIRST + 5)
#define Header_Layout(hwndHD, playout) \
(BOOL)SNDMSG((hwndHD), HDM_LAYOUT, 0, (LPARAM)(HD_LAYOUT *)(playout))
#define HHT_NOWHERE 0x0001
#define HHT_ONHEADER 0x0002
#define HHT_ONDIVIDER 0x0004
#define HHT_ONDIVOPEN 0x0008
#if (_WIN32_IE >= 0x0500)
#define HHT_ONFILTER 0x0010
#define HHT_ONFILTERBUTTON 0x0020
#endif
#define HHT_ABOVE 0x0100
#define HHT_BELOW 0x0200
#define HHT_TORIGHT 0x0400
#define HHT_TOLEFT 0x0800
#if _WIN32_WINNT >= 0x0600
#define HHT_ONITEMSTATEICON 0x1000
#define HHT_ONDROPDOWN 0x2000
#define HHT_ONOVERFLOW 0x4000
#endif
#if (_WIN32_IE >= 0x0300)
#define HD_HITTESTINFO HDHITTESTINFO
#else
#define HDHITTESTINFO HD_HITTESTINFO
#endif
typedef struct _HD_HITTESTINFO
{
POINT pt;
UINT flags;
int iItem;
} HDHITTESTINFO, *LPHDHITTESTINFO;
#define HDSIL_NORMAL 0
#define HDSIL_STATE 1
#define HDM_HITTEST (HDM_FIRST + 6)
#if (_WIN32_IE >= 0x0300)
#define HDM_GETITEMRECT (HDM_FIRST + 7)
#define Header_GetItemRect(hwnd, iItem, lprc) \
(BOOL)SNDMSG((hwnd), HDM_GETITEMRECT, (WPARAM)(iItem), (LPARAM)(lprc))
#define HDM_SETIMAGELIST (HDM_FIRST + 8)
#define Header_SetImageList(hwnd, himl) \
(HIMAGELIST)SNDMSG((hwnd), HDM_SETIMAGELIST, HDSIL_NORMAL, (LPARAM)(himl))
#define Header_SetStateImageList(hwnd, himl) \
(HIMAGELIST)SNDMSG((hwnd), HDM_SETIMAGELIST, HDSIL_STATE, (LPARAM)(himl))
#define HDM_GETIMAGELIST (HDM_FIRST + 9)
#define Header_GetImageList(hwnd) \
(HIMAGELIST)SNDMSG((hwnd), HDM_GETIMAGELIST, HDSIL_NORMAL, 0)
#define Header_GetStateImageList(hwnd) \
(HIMAGELIST)SNDMSG((hwnd), HDM_GETIMAGELIST, HDSIL_STATE, 0)
#define HDM_ORDERTOINDEX (HDM_FIRST + 15)
#define Header_OrderToIndex(hwnd, i) \
(int)SNDMSG((hwnd), HDM_ORDERTOINDEX, (WPARAM)(i), 0)
#define HDM_CREATEDRAGIMAGE (HDM_FIRST + 16) // wparam = which item (by index)
#define Header_CreateDragImage(hwnd, i) \
(HIMAGELIST)SNDMSG((hwnd), HDM_CREATEDRAGIMAGE, (WPARAM)(i), 0)
#define HDM_GETORDERARRAY (HDM_FIRST + 17)
#define Header_GetOrderArray(hwnd, iCount, lpi) \
(BOOL)SNDMSG((hwnd), HDM_GETORDERARRAY, (WPARAM)(iCount), (LPARAM)(lpi))
#define HDM_SETORDERARRAY (HDM_FIRST + 18)
#define Header_SetOrderArray(hwnd, iCount, lpi) \
(BOOL)SNDMSG((hwnd), HDM_SETORDERARRAY, (WPARAM)(iCount), (LPARAM)(lpi))
// lparam = int array of size HDM_GETITEMCOUNT
// the array specifies the order that all items should be displayed.
// e.g. { 2, 0, 1}
// says the index 2 item should be shown in the 0ths position
// index 0 should be shown in the 1st position
// index 1 should be shown in the 2nd position
#define HDM_SETHOTDIVIDER (HDM_FIRST + 19)
#define Header_SetHotDivider(hwnd, fPos, dw) \
(int)SNDMSG((hwnd), HDM_SETHOTDIVIDER, (WPARAM)(fPos), (LPARAM)(dw))
// convenience message for external dragdrop
// wParam = BOOL specifying whether the lParam is a dwPos of the cursor
// position or the index of which divider to hotlight
// lParam = depends on wParam (-1 and wParm = FALSE turns off hotlight)
#endif // _WIN32_IE >= 0x0300
#if (_WIN32_IE >= 0x0500)
#define HDM_SETBITMAPMARGIN (HDM_FIRST + 20)
#define Header_SetBitmapMargin(hwnd, iWidth) \
(int)SNDMSG((hwnd), HDM_SETBITMAPMARGIN, (WPARAM)(iWidth), 0)
#define HDM_GETBITMAPMARGIN (HDM_FIRST + 21)
#define Header_GetBitmapMargin(hwnd) \
(int)SNDMSG((hwnd), HDM_GETBITMAPMARGIN, 0, 0)
#endif
#if (_WIN32_IE >= 0x0400)
#define HDM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT
#define Header_SetUnicodeFormat(hwnd, fUnicode) \
(BOOL)SNDMSG((hwnd), HDM_SETUNICODEFORMAT, (WPARAM)(fUnicode), 0)
#define HDM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT
#define Header_GetUnicodeFormat(hwnd) \
(BOOL)SNDMSG((hwnd), HDM_GETUNICODEFORMAT, 0, 0)
#endif
#if (_WIN32_IE >= 0x0500)
#define HDM_SETFILTERCHANGETIMEOUT (HDM_FIRST+22)
#define Header_SetFilterChangeTimeout(hwnd, i) \
(int)SNDMSG((hwnd), HDM_SETFILTERCHANGETIMEOUT, 0, (LPARAM)(i))
#define HDM_EDITFILTER (HDM_FIRST+23)
#define Header_EditFilter(hwnd, i, fDiscardChanges) \
(int)SNDMSG((hwnd), HDM_EDITFILTER, (WPARAM)(i), MAKELPARAM(fDiscardChanges, 0))
// Clear filter takes -1 as a column value to indicate that all
// the filter should be cleared. When this happens you will
// only receive a single filter changed notification.
#define HDM_CLEARFILTER (HDM_FIRST+24)
#define Header_ClearFilter(hwnd, i) \
(int)SNDMSG((hwnd), HDM_CLEARFILTER, (WPARAM)(i), 0)
#define Header_ClearAllFilters(hwnd) \
(int)SNDMSG((hwnd), HDM_CLEARFILTER, (WPARAM)-1, 0)
#endif
#if (_WIN32_IE >= 0x0600)
#define HDM_TRANSLATEACCELERATOR CCM_TRANSLATEACCELERATOR
#endif
#if (_WIN32_WINNT >= 0x600)
#define HDM_GETITEMDROPDOWNRECT (HDM_FIRST+25) // rect of item's drop down button
#define Header_GetItemDropDownRect(hwnd, iItem, lprc) \
(BOOL)SNDMSG((hwnd), HDM_GETITEMDROPDOWNRECT, (WPARAM)(iItem), (LPARAM)(lprc))
#define HDM_GETOVERFLOWRECT (HDM_FIRST+26) // rect of overflow button
#define Header_GetOverflowRect(hwnd, lprc) \
(BOOL)SNDMSG((hwnd), HDM_GETOVERFLOWRECT, 0, (LPARAM)(lprc))
#define HDM_GETFOCUSEDITEM (HDM_FIRST+27)
#define Header_GetFocusedItem(hwnd) \
(int)SNDMSG((hwnd), HDM_GETFOCUSEDITEM, (WPARAM)(0), (LPARAM)(0))
#define HDM_SETFOCUSEDITEM (HDM_FIRST+28)
#define Header_SetFocusedItem(hwnd, iItem) \
(BOOL)SNDMSG((hwnd), HDM_SETFOCUSEDITEM, (WPARAM)(0), (LPARAM)(iItem))
#endif // _WIN32_WINNT >= 0x600
#define HDN_ITEMCHANGINGA (HDN_FIRST-0)
#define HDN_ITEMCHANGINGW (HDN_FIRST-20)
#define HDN_ITEMCHANGEDA (HDN_FIRST-1)
#define HDN_ITEMCHANGEDW (HDN_FIRST-21)
#define HDN_ITEMCLICKA (HDN_FIRST-2)
#define HDN_ITEMCLICKW (HDN_FIRST-22)
#define HDN_ITEMDBLCLICKA (HDN_FIRST-3)
#define HDN_ITEMDBLCLICKW (HDN_FIRST-23)
#define HDN_DIVIDERDBLCLICKA (HDN_FIRST-5)
#define HDN_DIVIDERDBLCLICKW (HDN_FIRST-25)
#define HDN_BEGINTRACKA (HDN_FIRST-6)
#define HDN_BEGINTRACKW (HDN_FIRST-26)
#define HDN_ENDTRACKA (HDN_FIRST-7)
#define HDN_ENDTRACKW (HDN_FIRST-27)
#define HDN_TRACKA (HDN_FIRST-8)
#define HDN_TRACKW (HDN_FIRST-28)
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFOA (HDN_FIRST-9)
#define HDN_GETDISPINFOW (HDN_FIRST-29)
#define HDN_BEGINDRAG (HDN_FIRST-10)
#define HDN_ENDDRAG (HDN_FIRST-11)
#endif
#if (_WIN32_IE >= 0x0500)
#define HDN_FILTERCHANGE (HDN_FIRST-12)
#define HDN_FILTERBTNCLICK (HDN_FIRST-13)
#endif
#if (_WIN32_IE >= 0x0600)
#define HDN_BEGINFILTEREDIT (HDN_FIRST-14)
#define HDN_ENDFILTEREDIT (HDN_FIRST-15)
#endif
#if _WIN32_WINNT >= 0x0600
#define HDN_ITEMSTATEICONCLICK (HDN_FIRST-16)
#define HDN_ITEMKEYDOWN (HDN_FIRST-17)
#define HDN_DROPDOWN (HDN_FIRST-18)
#define HDN_OVERFLOWCLICK (HDN_FIRST-19)
#endif
#ifdef UNICODE
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGW
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDW
#define HDN_ITEMCLICK HDN_ITEMCLICKW
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKW
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKW
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#define HDN_ENDTRACK HDN_ENDTRACKW
#define HDN_TRACK HDN_TRACKW
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOW
#endif
#else
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGA
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDA
#define HDN_ITEMCLICK HDN_ITEMCLICKA
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKA
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKA
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#define HDN_ENDTRACK HDN_ENDTRACKA
#define HDN_TRACK HDN_TRACKA
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOA
#endif
#endif
#if (_WIN32_IE >= 0x0300)
#define HD_NOTIFYA NMHEADERA
#define HD_NOTIFYW NMHEADERW
#else
#define tagNMHEADERA _HD_NOTIFY
#define NMHEADERA HD_NOTIFYA
#define tagHMHEADERW _HD_NOTIFYW
#define NMHEADERW HD_NOTIFYW
#endif
#define HD_NOTIFY NMHEADER
typedef struct tagNMHEADERA
{
NMHDR hdr;
int iItem;
int iButton;
HDITEMA *pitem;
} NMHEADERA, *LPNMHEADERA;
typedef struct tagNMHEADERW
{
NMHDR hdr;
int iItem;
int iButton;
HDITEMW *pitem;
} NMHEADERW, *LPNMHEADERW;
#ifdef UNICODE
#define NMHEADER NMHEADERW
#define LPNMHEADER LPNMHEADERW
#else
#define NMHEADER NMHEADERA
#define LPNMHEADER LPNMHEADERA
#endif
typedef struct tagNMHDDISPINFOW
{
NMHDR hdr;
int iItem;
UINT mask;
LPWSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
} NMHDDISPINFOW, *LPNMHDDISPINFOW;
typedef struct tagNMHDDISPINFOA
{
NMHDR hdr;
int iItem;
UINT mask;
LPSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
} NMHDDISPINFOA, *LPNMHDDISPINFOA;
#ifdef UNICODE
#define NMHDDISPINFO NMHDDISPINFOW
#define LPNMHDDISPINFO LPNMHDDISPINFOW
#else
#define NMHDDISPINFO NMHDDISPINFOA
#define LPNMHDDISPINFO LPNMHDDISPINFOA
#endif
#if (_WIN32_IE >= 0x0500)
typedef struct tagNMHDFILTERBTNCLICK
{
NMHDR hdr;
INT iItem;
RECT rc;
} NMHDFILTERBTNCLICK, *LPNMHDFILTERBTNCLICK;
#endif
#endif // NOHEADER
]]