blob: e83add61eab60ad9acbebf25e617214fa9c8aa4c [file] [log] [blame]
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001/*
2 * Header control
3 *
4 * Copyright 1998 Eric Kohl
5 *
6 * TODO:
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00007 * - Imagelist support (partially).
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00008 * - Callback items (under construction).
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00009 * - Order list support.
Alexandre Julliarda845b881998-06-01 10:44:35 +000010 * - Control specific cursors (over dividers).
11 * - Hottrack support (partially).
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000012 * - Custom draw support (including Notifications).
13 * - Drag and Drop support (including Notifications).
14 * - Unicode support.
Alexandre Julliarda845b881998-06-01 10:44:35 +000015 *
16 * FIXME:
17 * - Replace DrawText32A by DrawTextEx32A(...|DT_ENDELLIPSIS) in
18 * HEADER_DrawItem.
19 * - Little flaw when drawing a bitmap on the right side of the text.
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000020 */
21
Jeff Garzikc3e1f721999-02-19 15:42:11 +000022#include <string.h>
23
Marcus Meissner3480e4a1999-03-16 10:53:11 +000024#include "winbase.h"
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000025#include "commctrl.h"
Marcus Meissner317af321999-02-17 13:51:06 +000026#include "header.h"
Alexandre Julliarda099a551999-06-12 15:45:58 +000027#include "debugtools.h"
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000028
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000029DEFAULT_DEBUG_CHANNEL(header)
30
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000031
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000032#define VERT_BORDER 4
33#define DIVIDER_WIDTH 10
34
Eric Kohlcad17ff1999-03-12 17:42:50 +000035#define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongA(hwnd,0))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000036
37
Martin Fuchs33bdf532000-04-28 14:46:36 +000038static void
39HEADER_SetItemBounds (HWND hwnd)
40{
41 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
42 HEADER_ITEM *phdi;
43 RECT rect;
44 int i, x;
45
46 infoPtr->bRectsValid = TRUE;
47
48 if (infoPtr->uNumItem == 0)
49 return;
50
51 GetClientRect (hwnd, &rect);
52
53 x = rect.left;
54 for (i = 0; i < infoPtr->uNumItem; i++) {
55 phdi = &infoPtr->items[i];
56 phdi->rect.top = rect.top;
57 phdi->rect.bottom = rect.bottom;
58 phdi->rect.left = x;
59 phdi->rect.right = phdi->rect.left + phdi->cxy;
60 x = phdi->rect.right;
61 }
62}
63
64static LRESULT
65HEADER_Size (HWND hwnd, WPARAM wParam)
66{
67 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
68
69 infoPtr->bRectsValid = FALSE;
70
71 return 0;
72}
73
74
Alexandre Julliarda3960291999-02-26 11:11:13 +000075static INT
Eric Kohlcad17ff1999-03-12 17:42:50 +000076HEADER_DrawItem (HWND hwnd, HDC hdc, INT iItem, BOOL bHotTrack)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000077{
Eric Kohlcad17ff1999-03-12 17:42:50 +000078 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +000079 HEADER_ITEM *phdi = &infoPtr->items[iItem];
Alexandre Julliarda3960291999-02-26 11:11:13 +000080 RECT r;
81 INT oldBkMode;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000082
Martin Fuchs33bdf532000-04-28 14:46:36 +000083 if (!infoPtr->bRectsValid)
84 HEADER_SetItemBounds(hwnd);
85
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000086 r = phdi->rect;
87 if (r.right - r.left == 0)
88 return phdi->rect.right;
89
Eric Kohlcad17ff1999-03-12 17:42:50 +000090 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000091 if (phdi->bDown) {
Alexandre Julliarda3960291999-02-26 11:11:13 +000092 DrawEdge (hdc, &r, BDR_RAISEDOUTER,
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000093 BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
94 r.left += 2;
95 r.top += 2;
96 }
97 else
Alexandre Julliarda3960291999-02-26 11:11:13 +000098 DrawEdge (hdc, &r, EDGE_RAISED,
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000099 BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
100 }
101 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000102 DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000103
104 if (phdi->fmt & HDF_OWNERDRAW) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000105 DRAWITEMSTRUCT dis;
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000106 dis.CtlType = ODT_HEADER;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000107 dis.CtlID = GetWindowLongA (hwnd, GWL_ID);
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000108 dis.itemID = iItem;
109 dis.itemAction = ODA_DRAWENTIRE;
110 dis.itemState = phdi->bDown ? ODS_SELECTED : 0;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000111 dis.hwndItem = hwnd;
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000112 dis.hDC = hdc;
113 dis.rcItem = r;
114 dis.itemData = phdi->lParam;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000115 SendMessageA (GetParent (hwnd), WM_DRAWITEM,
116 (WPARAM)dis.CtlID, (LPARAM)&dis);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000117 }
118 else {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000119 UINT uTextJustify = DT_LEFT;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000120
121 if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_CENTER)
122 uTextJustify = DT_CENTER;
123 else if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_RIGHT)
124 uTextJustify = DT_RIGHT;
125
126 if ((phdi->fmt & HDF_BITMAP) && (phdi->hbm)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000127 BITMAP bmp;
128 HDC hdcBitmap;
129 INT yD, yS, cx, cy, rx, ry;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000130
Alexandre Julliarda3960291999-02-26 11:11:13 +0000131 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
Alexandre Julliarda845b881998-06-01 10:44:35 +0000132
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000133 ry = r.bottom - r.top;
134 rx = r.right - r.left;
135
136 if (ry >= bmp.bmHeight) {
137 cy = bmp.bmHeight;
138 yD = r.top + (ry - bmp.bmHeight) / 2;
139 yS = 0;
140 }
141 else {
142 cy = ry;
143 yD = r.top;
144 yS = (bmp.bmHeight - ry) / 2;
145
146 }
147
148 if (rx >= bmp.bmWidth + 6) {
149 cx = bmp.bmWidth;
150 }
151 else {
152 cx = rx - 6;
153 }
154
Alexandre Julliarda3960291999-02-26 11:11:13 +0000155 hdcBitmap = CreateCompatibleDC (hdc);
156 SelectObject (hdcBitmap, phdi->hbm);
157 BitBlt (hdc, r.left + 3, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
158 DeleteDC (hdcBitmap);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000159
160 r.left += (bmp.bmWidth + 3);
161 }
162
Alexandre Julliarda845b881998-06-01 10:44:35 +0000163
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000164 if ((phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000165 BITMAP bmp;
166 HDC hdcBitmap;
167 INT xD, yD, yS, cx, cy, rx, ry, tx;
168 RECT textRect;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000169
Alexandre Julliarda3960291999-02-26 11:11:13 +0000170 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000171
Alexandre Julliarda845b881998-06-01 10:44:35 +0000172 textRect = r;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000173 DrawTextW (hdc, phdi->pszText, lstrlenW (phdi->pszText),
Alexandre Julliarda845b881998-06-01 10:44:35 +0000174 &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT);
175 tx = textRect.right - textRect.left;
176 ry = r.bottom - r.top;
177 rx = r.right - r.left;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000178
Alexandre Julliarda845b881998-06-01 10:44:35 +0000179 if (ry >= bmp.bmHeight) {
180 cy = bmp.bmHeight;
181 yD = r.top + (ry - bmp.bmHeight) / 2;
182 yS = 0;
183 }
184 else {
185 cy = ry;
186 yD = r.top;
187 yS = (bmp.bmHeight - ry) / 2;
188
189 }
190
191 if (r.left + tx + bmp.bmWidth + 9 <= r.right) {
192 cx = bmp.bmWidth;
193 xD = r.left + tx + 6;
194 }
195 else {
196 if (rx >= bmp.bmWidth + 6) {
197 cx = bmp.bmWidth;
198 xD = r.right - bmp.bmWidth - 3;
199 r.right = xD - 3;
200 }
201 else {
202 cx = rx - 3;
203 xD = r.left;
204 r.right = r.left;
205 }
206 }
207
Alexandre Julliarda3960291999-02-26 11:11:13 +0000208 hdcBitmap = CreateCompatibleDC (hdc);
209 SelectObject (hdcBitmap, phdi->hbm);
210 BitBlt (hdc, xD, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
211 DeleteDC (hdcBitmap);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000212 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000213
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000214 if (phdi->fmt & HDF_IMAGE) {
215
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000216
Marcus Meissner73458b01998-12-26 12:54:29 +0000217/* ImageList_Draw (infoPtr->himl, phdi->iImage,...); */
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000218 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000219
Martin Fuchs33bdf532000-04-28 14:46:36 +0000220 if (((phdi->fmt & HDF_STRING)
221 || (!(phdi->fmt & (HDF_OWNERDRAW|HDF_STRING|HDF_BITMAP|
222 HDF_BITMAP_ON_RIGHT|HDF_IMAGE)))) /* no explicit format specified? */
223 && (phdi->pszText)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000224 oldBkMode = SetBkMode(hdc, TRANSPARENT);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000225 r.left += 3;
226 r.right -= 3;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000227 SetTextColor (hdc, bHotTrack ? COLOR_HIGHLIGHT : COLOR_BTNTEXT);
228 DrawTextW (hdc, phdi->pszText, lstrlenW (phdi->pszText),
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000229 &r, uTextJustify|DT_VCENTER|DT_SINGLELINE);
230 if (oldBkMode != TRANSPARENT)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000231 SetBkMode(hdc, oldBkMode);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000232 }
233 }
Eric Kohlcad17ff1999-03-12 17:42:50 +0000234
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000235 return phdi->rect.right;
236}
237
238
239static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000240HEADER_Refresh (HWND hwnd, HDC hdc)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000241{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000242 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000243 HFONT hFont, hOldFont;
244 RECT rect;
245 HBRUSH hbrBk;
246 INT i, x;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000247
248 /* get rect for the bar, adjusted for the border */
Eric Kohlcad17ff1999-03-12 17:42:50 +0000249 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000250
Alexandre Julliarda3960291999-02-26 11:11:13 +0000251 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
252 hOldFont = SelectObject (hdc, hFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000253
254 /* draw Background */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000255 hbrBk = GetSysColorBrush(COLOR_3DFACE);
256 FillRect(hdc, &rect, hbrBk);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000257
258 x = rect.left;
259 for (i = 0; i < infoPtr->uNumItem; i++) {
Eric Kohlcad17ff1999-03-12 17:42:50 +0000260 x = HEADER_DrawItem (hwnd, hdc, i, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000261 }
262
263 if ((x <= rect.right) && (infoPtr->uNumItem > 0)) {
264 rect.left = x;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000265 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000266 DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000267 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000268 DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000269 }
270
Alexandre Julliarda3960291999-02-26 11:11:13 +0000271 SelectObject (hdc, hOldFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000272}
273
274
275static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000276HEADER_RefreshItem (HWND hwnd, HDC hdc, INT iItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000277{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000278 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000279 HFONT hFont, hOldFont;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000280
Alexandre Julliarda3960291999-02-26 11:11:13 +0000281 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
282 hOldFont = SelectObject (hdc, hFont);
Eric Kohlcad17ff1999-03-12 17:42:50 +0000283 HEADER_DrawItem (hwnd, hdc, iItem, FALSE);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000284 SelectObject (hdc, hOldFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000285}
286
287
288static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000289HEADER_InternalHitTest (HWND hwnd, LPPOINT lpPt, UINT *pFlags, INT *pItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000290{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000291 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000292 RECT rect, rcTest;
293 INT iCount, width;
294 BOOL bNoWidth;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000295
Eric Kohlcad17ff1999-03-12 17:42:50 +0000296 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000297
298 *pFlags = 0;
299 bNoWidth = FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000300 if (PtInRect (&rect, *lpPt))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000301 {
302 if (infoPtr->uNumItem == 0) {
303 *pFlags |= HHT_NOWHERE;
304 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000305 TRACE("NOWHERE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000306 return;
307 }
308 else {
309 /* somewhere inside */
310 for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) {
311 rect = infoPtr->items[iCount].rect;
312 width = rect.right - rect.left;
313 if (width == 0) {
314 bNoWidth = TRUE;
315 continue;
316 }
Alexandre Julliarda3960291999-02-26 11:11:13 +0000317 if (PtInRect (&rect, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000318 if (width <= 2 * DIVIDER_WIDTH) {
319 *pFlags |= HHT_ONHEADER;
320 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000321 TRACE("ON HEADER %d\n", iCount);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000322 return;
323 }
324 if (iCount > 0) {
325 rcTest = rect;
326 rcTest.right = rcTest.left + DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000327 if (PtInRect (&rcTest, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000328 if (bNoWidth) {
329 *pFlags |= HHT_ONDIVOPEN;
330 *pItem = iCount - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000331 TRACE("ON DIVOPEN %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000332 return;
333 }
334 else {
335 *pFlags |= HHT_ONDIVIDER;
336 *pItem = iCount - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000337 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000338 return;
339 }
340 }
341 }
342 rcTest = rect;
343 rcTest.left = rcTest.right - DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000344 if (PtInRect (&rcTest, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000345 *pFlags |= HHT_ONDIVIDER;
346 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000347 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000348 return;
349 }
350
351 *pFlags |= HHT_ONHEADER;
352 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000353 TRACE("ON HEADER %d\n", iCount);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000354 return;
355 }
356 }
357
358 /* check for last divider part (on nowhere) */
359 rect = infoPtr->items[infoPtr->uNumItem-1].rect;
360 rect.left = rect.right;
361 rect.right += DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000362 if (PtInRect (&rect, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000363 if (bNoWidth) {
364 *pFlags |= HHT_ONDIVOPEN;
365 *pItem = infoPtr->uNumItem - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000366 TRACE("ON DIVOPEN %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000367 return;
368 }
369 else {
370 *pFlags |= HHT_ONDIVIDER;
371 *pItem = infoPtr->uNumItem-1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000372 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000373 return;
374 }
375 }
376
377 *pFlags |= HHT_NOWHERE;
378 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000379 TRACE("NOWHERE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000380 return;
381 }
382 }
383 else {
384 if (lpPt->x < rect.left) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000385 TRACE("TO LEFT\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000386 *pFlags |= HHT_TOLEFT;
387 }
388 else if (lpPt->x > rect.right) {
Thuy Nguyen30eaa591999-10-13 13:47:36 +0000389 TRACE("TO RIGHT\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000390 *pFlags |= HHT_TORIGHT;
391 }
392
393 if (lpPt->y < rect.top) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000394 TRACE("ABOVE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000395 *pFlags |= HHT_ABOVE;
396 }
397 else if (lpPt->y > rect.bottom) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000398 TRACE("BELOW\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000399 *pFlags |= HHT_BELOW;
400 }
401 }
402
403 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000404 TRACE("flags=0x%X\n", *pFlags);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000405 return;
406}
407
408
409static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000410HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000411{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000412 RECT rect;
413 HPEN hOldPen;
414 INT oldRop;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000415
Eric Kohlcad17ff1999-03-12 17:42:50 +0000416 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000417
Alexandre Julliarda3960291999-02-26 11:11:13 +0000418 hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
419 oldRop = SetROP2 (hdc, R2_XORPEN);
420 MoveToEx (hdc, x, rect.top, NULL);
421 LineTo (hdc, x, rect.bottom);
422 SetROP2 (hdc, oldRop);
423 SelectObject (hdc, hOldPen);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000424}
425
426
Alexandre Julliarda3960291999-02-26 11:11:13 +0000427static BOOL
Eric Kohlcad17ff1999-03-12 17:42:50 +0000428HEADER_SendSimpleNotify (HWND hwnd, UINT code)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000429{
430 NMHDR nmhdr;
431
Eric Kohlcad17ff1999-03-12 17:42:50 +0000432 nmhdr.hwndFrom = hwnd;
433 nmhdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000434 nmhdr.code = code;
435
Eric Kohlcad17ff1999-03-12 17:42:50 +0000436 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
Alexandre Julliarda3960291999-02-26 11:11:13 +0000437 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000438}
439
Aric Stewart3054b762000-06-11 20:39:14 +0000440static BOOL
441HEADER_SendItemChange(HWND hwnd, INT iItem, UINT mask, UINT msg)
442{
443 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
444 NMHEADERA nmhdr;
445 HDITEMA nmitem;
446
447 nmhdr.hdr.hwndFrom = hwnd;
448 nmhdr.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
449 nmhdr.hdr.code = msg;
450 nmhdr.iItem = iItem;
451 nmhdr.iButton = 0;
452 nmhdr.pitem = &nmitem;
453 nmitem.mask = mask;
454 nmitem.cxy = infoPtr->items[iItem].cxy;
455 nmitem.hbm = infoPtr->items[iItem].hbm;
456 nmitem.pszText = NULL;
457 nmitem.cchTextMax = 0;
458 nmitem.fmt = infoPtr->items[iItem].fmt;
459 nmitem.lParam = infoPtr->items[iItem].lParam;
460 nmitem.iOrder = infoPtr->items[iItem].iOrder;
461 nmitem.iImage = infoPtr->items[iItem].iImage;
462
463 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
464 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
465}
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000466
Alexandre Julliarda3960291999-02-26 11:11:13 +0000467static BOOL
Eric Kohlcad17ff1999-03-12 17:42:50 +0000468HEADER_SendHeaderNotify (HWND hwnd, UINT code, INT iItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000469{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000470 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000471 NMHEADERA nmhdr;
472 HDITEMA nmitem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000473
Eric Kohlcad17ff1999-03-12 17:42:50 +0000474 nmhdr.hdr.hwndFrom = hwnd;
475 nmhdr.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000476 nmhdr.hdr.code = code;
477 nmhdr.iItem = iItem;
478 nmhdr.iButton = 0;
479 nmhdr.pitem = &nmitem;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000480 nmitem.mask = 0;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000481 nmitem.cxy = infoPtr->items[iItem].cxy;
482 nmitem.hbm = infoPtr->items[iItem].hbm;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000483 nmitem.pszText = NULL;
484 nmitem.cchTextMax = 0;
Marcus Meissner73458b01998-12-26 12:54:29 +0000485/* nmitem.pszText = infoPtr->items[iItem].pszText; */
486/* nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; */
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000487 nmitem.fmt = infoPtr->items[iItem].fmt;
488 nmitem.lParam = infoPtr->items[iItem].lParam;
489 nmitem.iOrder = infoPtr->items[iItem].iOrder;
490 nmitem.iImage = infoPtr->items[iItem].iImage;
491
Eric Kohlcad17ff1999-03-12 17:42:50 +0000492 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
493 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000494}
495
496
Alexandre Julliarda3960291999-02-26 11:11:13 +0000497static BOOL
Eric Kohlcad17ff1999-03-12 17:42:50 +0000498HEADER_SendClickNotify (HWND hwnd, UINT code, INT iItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000499{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000500 NMHEADERA nmhdr;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000501
Eric Kohlcad17ff1999-03-12 17:42:50 +0000502 nmhdr.hdr.hwndFrom = hwnd;
503 nmhdr.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000504 nmhdr.hdr.code = code;
505 nmhdr.iItem = iItem;
506 nmhdr.iButton = 0;
507 nmhdr.pitem = NULL;
508
Eric Kohlcad17ff1999-03-12 17:42:50 +0000509 return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
510 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000511}
512
513
514static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000515HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000516{
Alexandre Julliarda099a551999-06-12 15:45:58 +0000517 FIXME("empty stub!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000518 return 0;
519}
520
521
522static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000523HEADER_DeleteItem (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000524{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000525 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000526 INT iItem = (INT)wParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000527
Alexandre Julliarda099a551999-06-12 15:45:58 +0000528 TRACE("[iItem=%d]\n", iItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000529
Alexandre Julliarda3960291999-02-26 11:11:13 +0000530 if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000531 return FALSE;
532
533 if (infoPtr->uNumItem == 1) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000534 TRACE("Simple delete!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000535 if (infoPtr->items[0].pszText)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000536 COMCTL32_Free (infoPtr->items[0].pszText);
537 COMCTL32_Free (infoPtr->items);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000538 infoPtr->items = 0;
539 infoPtr->uNumItem = 0;
540 }
541 else {
542 HEADER_ITEM *oldItems = infoPtr->items;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000543 TRACE("Complex delete! [iItem=%d]\n", iItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000544
545 if (infoPtr->items[iItem].pszText)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000546 COMCTL32_Free (infoPtr->items[iItem].pszText);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000547
548 infoPtr->uNumItem--;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000549 infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000550 /* pre delete copy */
551 if (iItem > 0) {
552 memcpy (&infoPtr->items[0], &oldItems[0],
553 iItem * sizeof(HEADER_ITEM));
554 }
555
556 /* post delete copy */
557 if (iItem < infoPtr->uNumItem) {
558 memcpy (&infoPtr->items[iItem], &oldItems[iItem+1],
559 (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
560 }
561
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000562 COMCTL32_Free (oldItems);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000563 }
564
Eric Kohlcad17ff1999-03-12 17:42:50 +0000565 HEADER_SetItemBounds (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000566
Chris Morgan3cbc1682000-06-04 01:34:31 +0000567 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000568
569 return TRUE;
570}
571
572
573static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000574HEADER_GetImageList (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000575{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000576 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000577
578 return (LRESULT)infoPtr->himl;
579}
580
581
582static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000583HEADER_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000584{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000585 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000586 HDITEMA *phdi = (HDITEMA*)lParam;
587 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000588 HEADER_ITEM *lpItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000589
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000590 if (!phdi)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000591 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000592 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000593 return FALSE;
594
Alexandre Julliarda099a551999-06-12 15:45:58 +0000595 TRACE("[nItem=%d]\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000596
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000597 if (phdi->mask == 0)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000598 return TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000599
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000600 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
601 if (phdi->mask & HDI_BITMAP)
602 phdi->hbm = lpItem->hbm;
603
604 if (phdi->mask & HDI_FORMAT)
605 phdi->fmt = lpItem->fmt;
606
607 if (phdi->mask & HDI_WIDTH)
608 phdi->cxy = lpItem->cxy;
609
610 if (phdi->mask & HDI_LPARAM)
611 phdi->lParam = lpItem->lParam;
612
613 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000614 if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000615 lstrcpynWtoA (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000616 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000617 phdi->pszText = LPSTR_TEXTCALLBACKA;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000618 }
619
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000620 if (phdi->mask & HDI_IMAGE)
621 phdi->iImage = lpItem->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000622
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000623 if (phdi->mask & HDI_ORDER)
624 phdi->iOrder = lpItem->iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000625
626 return TRUE;
627}
628
629
630static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000631HEADER_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000632{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000633 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000634 HDITEMW *phdi = (HDITEMW*)lParam;
635 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000636 HEADER_ITEM *lpItem;
637
638 if (!phdi)
639 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000640 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Eric Kohl8d2933d1998-11-22 18:12:12 +0000641 return FALSE;
642
Alexandre Julliarda099a551999-06-12 15:45:58 +0000643 TRACE("[nItem=%d]\n", nItem);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000644
645 if (phdi->mask == 0)
646 return TRUE;
647
648 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
649 if (phdi->mask & HDI_BITMAP)
650 phdi->hbm = lpItem->hbm;
651
652 if (phdi->mask & HDI_FORMAT)
653 phdi->fmt = lpItem->fmt;
654
655 if (phdi->mask & HDI_WIDTH)
656 phdi->cxy = lpItem->cxy;
657
658 if (phdi->mask & HDI_LPARAM)
659 phdi->lParam = lpItem->lParam;
660
661 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000662 if (lpItem->pszText != LPSTR_TEXTCALLBACKW)
663 lstrcpynW (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000664 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000665 phdi->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000666 }
667
668 if (phdi->mask & HDI_IMAGE)
669 phdi->iImage = lpItem->iImage;
670
671 if (phdi->mask & HDI_ORDER)
672 phdi->iOrder = lpItem->iOrder;
673
674 return TRUE;
675}
676
677
Patrik Stridvall896889f1999-05-08 12:50:36 +0000678inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000679HEADER_GetItemCount (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000680{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000681 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000682 return infoPtr->uNumItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000683}
684
685
686static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000687HEADER_GetItemRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000688{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000689 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000690 INT iItem = (INT)wParam;
691 LPRECT lpRect = (LPRECT)lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000692
Alexandre Julliarda3960291999-02-26 11:11:13 +0000693 if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000694 return FALSE;
695
696 lpRect->left = infoPtr->items[iItem].rect.left;
697 lpRect->right = infoPtr->items[iItem].rect.right;
698 lpRect->top = infoPtr->items[iItem].rect.top;
699 lpRect->bottom = infoPtr->items[iItem].rect.bottom;
700
701 return TRUE;
702}
703
704
Marcus Meissner73458b01998-12-26 12:54:29 +0000705/* << HEADER_GetOrderArray >> */
Eric Kohl8d2933d1998-11-22 18:12:12 +0000706
707
Patrik Stridvall896889f1999-05-08 12:50:36 +0000708inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000709HEADER_GetUnicodeFormat (HWND hwnd)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000710{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000711 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000712 return infoPtr->bUnicode;
713}
714
715
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000716static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000717HEADER_HitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000718{
719 LPHDHITTESTINFO phti = (LPHDHITTESTINFO)lParam;
720
Eric Kohlcad17ff1999-03-12 17:42:50 +0000721 HEADER_InternalHitTest (hwnd, &phti->pt, &phti->flags, &phti->iItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000722
Aric Stewart7d6e9a12000-05-05 18:22:44 +0000723 if (phti->flags == HHT_ONHEADER)
724 return phti->iItem;
725 else
726 return -1;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000727}
728
729
730static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000731HEADER_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000732{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000733 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000734 HDITEMA *phdi = (HDITEMA*)lParam;
735 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000736 HEADER_ITEM *lpItem;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000737 INT len;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000738
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000739 if ((phdi == NULL) || (nItem < 0))
740 return -1;
741
742 if (nItem > infoPtr->uNumItem)
743 nItem = infoPtr->uNumItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000744
745 if (infoPtr->uNumItem == 0) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000746 infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000747 infoPtr->uNumItem++;
748 }
749 else {
750 HEADER_ITEM *oldItems = infoPtr->items;
751
752 infoPtr->uNumItem++;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000753 infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000754 if (nItem == 0) {
755 memcpy (&infoPtr->items[1], &oldItems[0],
756 (infoPtr->uNumItem-1) * sizeof(HEADER_ITEM));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000757 }
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000758 else
759 {
760 /* pre insert copy */
761 if (nItem > 0) {
762 memcpy (&infoPtr->items[0], &oldItems[0],
763 nItem * sizeof(HEADER_ITEM));
764 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000765
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000766 /* post insert copy */
767 if (nItem < infoPtr->uNumItem - 1) {
768 memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
Huw D M Davies25539761999-12-04 03:59:33 +0000769 (infoPtr->uNumItem - nItem - 1) * sizeof(HEADER_ITEM));
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000770 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000771 }
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000772
773 COMCTL32_Free (oldItems);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000774 }
775
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000776 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
777 lpItem->bDown = FALSE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000778
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000779 if (phdi->mask & HDI_WIDTH)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000780 lpItem->cxy = phdi->cxy;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000781
782 if (phdi->mask & HDI_TEXT) {
Alexandre Julliard60e414f1999-04-24 11:51:13 +0000783 if (!phdi->pszText) /* null pointer check */
Alexandre Julliard6691fa81999-05-22 15:59:09 +0000784 phdi->pszText = "";
785 if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000786 len = lstrlenA (phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000787 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
788 lstrcpyAtoW (lpItem->pszText, phdi->pszText);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000789 }
790 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000791 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000792 }
793
794 if (phdi->mask & HDI_FORMAT)
795 lpItem->fmt = phdi->fmt;
796
797 if (lpItem->fmt == 0)
798 lpItem->fmt = HDF_LEFT;
799
800 if (phdi->mask & HDI_BITMAP)
801 lpItem->hbm = phdi->hbm;
802
803 if (phdi->mask & HDI_LPARAM)
804 lpItem->lParam = phdi->lParam;
805
806 if (phdi->mask & HDI_IMAGE)
807 lpItem->iImage = phdi->iImage;
808
809 if (phdi->mask & HDI_ORDER)
810 lpItem->iOrder = phdi->iOrder;
811
Eric Kohlcad17ff1999-03-12 17:42:50 +0000812 HEADER_SetItemBounds (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000813
Chris Morgan3cbc1682000-06-04 01:34:31 +0000814 InvalidateRect(hwnd, NULL, FALSE);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000815
816 return nItem;
817}
818
819
820static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000821HEADER_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000822{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000823 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000824 HDITEMW *phdi = (HDITEMW*)lParam;
825 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000826 HEADER_ITEM *lpItem;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000827 INT len;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000828
829 if ((phdi == NULL) || (nItem < 0))
830 return -1;
831
832 if (nItem > infoPtr->uNumItem)
833 nItem = infoPtr->uNumItem;
834
835 if (infoPtr->uNumItem == 0) {
836 infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM));
837 infoPtr->uNumItem++;
838 }
839 else {
840 HEADER_ITEM *oldItems = infoPtr->items;
841
842 infoPtr->uNumItem++;
843 infoPtr->items = COMCTL32_Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
844 /* pre insert copy */
845 if (nItem > 0) {
846 memcpy (&infoPtr->items[0], &oldItems[0],
847 nItem * sizeof(HEADER_ITEM));
848 }
849
850 /* post insert copy */
851 if (nItem < infoPtr->uNumItem - 1) {
852 memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
853 (infoPtr->uNumItem - nItem) * sizeof(HEADER_ITEM));
854 }
855
856 COMCTL32_Free (oldItems);
857 }
858
859 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
860 lpItem->bDown = FALSE;
861
862 if (phdi->mask & HDI_WIDTH)
863 lpItem->cxy = phdi->cxy;
864
865 if (phdi->mask & HDI_TEXT) {
Alexandre Julliard6691fa81999-05-22 15:59:09 +0000866 WCHAR wide_null_char = 0;
Alexandre Julliard60e414f1999-04-24 11:51:13 +0000867 if (!phdi->pszText) /* null pointer check */
Alexandre Julliard6691fa81999-05-22 15:59:09 +0000868 phdi->pszText = &wide_null_char;
869 if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000870 len = lstrlenW (phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000871 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
Alexandre Julliarda3960291999-02-26 11:11:13 +0000872 lstrcpyW (lpItem->pszText, phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000873 }
874 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000875 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000876 }
877
878 if (phdi->mask & HDI_FORMAT)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000879 lpItem->fmt = phdi->fmt;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000880
Eric Kohl54d9f791998-10-11 13:20:06 +0000881 if (lpItem->fmt == 0)
882 lpItem->fmt = HDF_LEFT;
883
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000884 if (phdi->mask & HDI_BITMAP)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000885 lpItem->hbm = phdi->hbm;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000886
887 if (phdi->mask & HDI_LPARAM)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000888 lpItem->lParam = phdi->lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000889
890 if (phdi->mask & HDI_IMAGE)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000891 lpItem->iImage = phdi->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000892
893 if (phdi->mask & HDI_ORDER)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000894 lpItem->iOrder = phdi->iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000895
Eric Kohlcad17ff1999-03-12 17:42:50 +0000896 HEADER_SetItemBounds (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000897
Chris Morgan3cbc1682000-06-04 01:34:31 +0000898 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000899
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000900 return nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000901}
902
903
904static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000905HEADER_Layout (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000906{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000907 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000908 LPHDLAYOUT lpLayout = (LPHDLAYOUT)lParam;
909
Eric Kohlcad17ff1999-03-12 17:42:50 +0000910 lpLayout->pwpos->hwnd = hwnd;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000911 lpLayout->pwpos->hwndInsertAfter = 0;
912 lpLayout->pwpos->x = lpLayout->prc->left;
913 lpLayout->pwpos->y = lpLayout->prc->top;
914 lpLayout->pwpos->cx = lpLayout->prc->right - lpLayout->prc->left;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000915 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_HIDDEN)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000916 lpLayout->pwpos->cy = 0;
Martin Fuchs33bdf532000-04-28 14:46:36 +0000917 else {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000918 lpLayout->pwpos->cy = infoPtr->nHeight;
Martin Fuchs33bdf532000-04-28 14:46:36 +0000919 lpLayout->prc->top += infoPtr->nHeight;
920 }
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000921 lpLayout->pwpos->flags = SWP_NOZORDER;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000922
Alexandre Julliarda099a551999-06-12 15:45:58 +0000923 TRACE("Layout x=%d y=%d cx=%d cy=%d\n",
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000924 lpLayout->pwpos->x, lpLayout->pwpos->y,
925 lpLayout->pwpos->cx, lpLayout->pwpos->cy);
926
Martin Fuchs33bdf532000-04-28 14:46:36 +0000927 infoPtr->bRectsValid = FALSE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000928
929 return TRUE;
930}
931
932
933static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000934HEADER_SetImageList (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000935{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000936 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000937 HIMAGELIST himlOld;
938
939 himlOld = infoPtr->himl;
940 infoPtr->himl = (HIMAGELIST)lParam;
941
942 /* FIXME: Refresh needed??? */
943
944 return (LRESULT)himlOld;
945}
946
947
948static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000949HEADER_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000950{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000951 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000952 HDITEMA *phdi = (HDITEMA*)lParam;
953 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000954 HEADER_ITEM *lpItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000955
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000956 if (phdi == NULL)
957 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000958 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000959 return FALSE;
960
Alexandre Julliarda099a551999-06-12 15:45:58 +0000961 TRACE("[nItem=%d]\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000962
Aric Stewart3054b762000-06-11 20:39:14 +0000963 if (HEADER_SendItemChange(hwnd, nItem, phdi->mask,HDN_ITEMCHANGINGA))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000964 return FALSE;
965
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000966 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
967 if (phdi->mask & HDI_BITMAP)
968 lpItem->hbm = phdi->hbm;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000969
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000970 if (phdi->mask & HDI_FORMAT)
971 lpItem->fmt = phdi->fmt;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000972
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000973 if (phdi->mask & HDI_LPARAM)
974 lpItem->lParam = phdi->lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000975
976 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000977 if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
Eric Kohl8d2933d1998-11-22 18:12:12 +0000978 if (lpItem->pszText) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000979 COMCTL32_Free (lpItem->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000980 lpItem->pszText = NULL;
981 }
982 if (phdi->pszText) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000983 INT len = lstrlenA (phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000984 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
985 lstrcpyAtoW (lpItem->pszText, phdi->pszText);
986 }
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000987 }
988 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000989 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000990 }
991
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000992 if (phdi->mask & HDI_WIDTH)
993 lpItem->cxy = phdi->cxy;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000994
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000995 if (phdi->mask & HDI_IMAGE)
996 lpItem->iImage = phdi->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000997
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000998 if (phdi->mask & HDI_ORDER)
999 lpItem->iOrder = phdi->iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001000
Aric Stewart3054b762000-06-11 20:39:14 +00001001 HEADER_SendItemChange(hwnd,nItem,phdi->mask,HDN_ITEMCHANGEDA);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001002
Eric Kohlcad17ff1999-03-12 17:42:50 +00001003 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001004
1005 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001006
1007 return TRUE;
1008}
1009
1010
1011static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001012HEADER_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +00001013{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001014 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001015 HDITEMW *phdi = (HDITEMW*)lParam;
1016 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001017 HEADER_ITEM *lpItem;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001018
1019 if (phdi == NULL)
1020 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001021 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Eric Kohl8d2933d1998-11-22 18:12:12 +00001022 return FALSE;
1023
Alexandre Julliarda099a551999-06-12 15:45:58 +00001024 TRACE("[nItem=%d]\n", nItem);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001025
Aric Stewart3054b762000-06-11 20:39:14 +00001026 if (HEADER_SendItemChange(hwnd,nItem,phdi->mask,HDN_ITEMCHANGINGW))
Eric Kohl8d2933d1998-11-22 18:12:12 +00001027 return FALSE;
1028
1029 lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
1030 if (phdi->mask & HDI_BITMAP)
1031 lpItem->hbm = phdi->hbm;
1032
1033 if (phdi->mask & HDI_FORMAT)
1034 lpItem->fmt = phdi->fmt;
1035
1036 if (phdi->mask & HDI_LPARAM)
1037 lpItem->lParam = phdi->lParam;
1038
1039 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001040 if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
Eric Kohl8d2933d1998-11-22 18:12:12 +00001041 if (lpItem->pszText) {
1042 COMCTL32_Free (lpItem->pszText);
1043 lpItem->pszText = NULL;
1044 }
1045 if (phdi->pszText) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001046 INT len = lstrlenW (phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001047 lpItem->pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
Alexandre Julliarda3960291999-02-26 11:11:13 +00001048 lstrcpyW (lpItem->pszText, phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001049 }
1050 }
1051 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001052 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001053 }
1054
1055 if (phdi->mask & HDI_WIDTH)
1056 lpItem->cxy = phdi->cxy;
1057
1058 if (phdi->mask & HDI_IMAGE)
1059 lpItem->iImage = phdi->iImage;
1060
1061 if (phdi->mask & HDI_ORDER)
1062 lpItem->iOrder = phdi->iOrder;
1063
Aric Stewart3054b762000-06-11 20:39:14 +00001064 HEADER_SendItemChange(hwnd, nItem, phdi->mask,HDN_ITEMCHANGEDW);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001065
Eric Kohlcad17ff1999-03-12 17:42:50 +00001066 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001067
1068 InvalidateRect(hwnd, NULL, FALSE);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001069
1070 return TRUE;
1071}
1072
1073
Marcus Meissner73458b01998-12-26 12:54:29 +00001074/* << HEADER_SetOrderArray >> */
Eric Kohl8d2933d1998-11-22 18:12:12 +00001075
1076
Patrik Stridvall896889f1999-05-08 12:50:36 +00001077inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001078HEADER_SetUnicodeFormat (HWND hwnd, WPARAM wParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +00001079{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001080 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001081 BOOL bTemp = infoPtr->bUnicode;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001082
Alexandre Julliarda3960291999-02-26 11:11:13 +00001083 infoPtr->bUnicode = (BOOL)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001084
1085 return bTemp;
1086}
1087
1088
1089static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001090HEADER_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001091{
1092 HEADER_INFO *infoPtr;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001093 TEXTMETRICA tm;
1094 HFONT hOldFont;
1095 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001096
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001097 infoPtr = (HEADER_INFO *)COMCTL32_Alloc (sizeof(HEADER_INFO));
Eric Kohlcad17ff1999-03-12 17:42:50 +00001098 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001099
1100 infoPtr->uNumItem = 0;
1101 infoPtr->nHeight = 20;
1102 infoPtr->hFont = 0;
1103 infoPtr->items = 0;
Martin Fuchs33bdf532000-04-28 14:46:36 +00001104 infoPtr->bRectsValid = FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001105 infoPtr->hcurArrow = LoadCursorA (0, IDC_ARROWA);
1106 infoPtr->hcurDivider = LoadCursorA (0, IDC_SIZEWEA);
1107 infoPtr->hcurDivopen = LoadCursorA (0, IDC_SIZENSA);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001108 infoPtr->bPressed = FALSE;
1109 infoPtr->bTracking = FALSE;
1110 infoPtr->iMoveItem = 0;
1111 infoPtr->himl = 0;
1112 infoPtr->iHotItem = -1;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001113 infoPtr->bUnicode = IsWindowUnicode (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001114
Alexandre Julliarda3960291999-02-26 11:11:13 +00001115 hdc = GetDC (0);
1116 hOldFont = SelectObject (hdc, GetStockObject (SYSTEM_FONT));
1117 GetTextMetricsA (hdc, &tm);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001118 infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001119 SelectObject (hdc, hOldFont);
1120 ReleaseDC (0, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001121
1122 return 0;
1123}
1124
1125
1126static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001127HEADER_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001128{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001129 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001130 HEADER_ITEM *lpItem;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001131 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001132
1133 if (infoPtr->items) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001134 lpItem = (HEADER_ITEM*)infoPtr->items;
1135 for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001136 if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACKW))
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001137 COMCTL32_Free (lpItem->pszText);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001138 }
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001139 COMCTL32_Free (infoPtr->items);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001140 }
1141
1142 if (infoPtr->himl)
1143 ImageList_Destroy (infoPtr->himl);
1144
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001145 COMCTL32_Free (infoPtr);
Gerard Patela1b2fc22000-05-10 01:34:53 +00001146 SetWindowLongA (hwnd, 0, 0);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001147 return 0;
1148}
1149
1150
Patrik Stridvall896889f1999-05-08 12:50:36 +00001151static inline LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001152HEADER_GetFont (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001153{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001154 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001155
1156 return (LRESULT)infoPtr->hFont;
1157}
1158
1159
1160static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001161HEADER_LButtonDblClk (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001162{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001163 POINT pt;
1164 UINT flags;
1165 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001166
Alexandre Julliarda3960291999-02-26 11:11:13 +00001167 pt.x = (INT)LOWORD(lParam);
1168 pt.y = (INT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001169 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001170
Eric Kohlcad17ff1999-03-12 17:42:50 +00001171 if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER))
1172 HEADER_SendHeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001173 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
Eric Kohlcad17ff1999-03-12 17:42:50 +00001174 HEADER_SendHeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001175
1176 return 0;
1177}
1178
1179
1180static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001181HEADER_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001182{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001183 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1184 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001185 POINT pt;
1186 UINT flags;
1187 INT nItem;
1188 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001189
Alexandre Julliarda3960291999-02-26 11:11:13 +00001190 pt.x = (INT)LOWORD(lParam);
1191 pt.y = (INT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001192 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001193
Eric Kohlcad17ff1999-03-12 17:42:50 +00001194 if ((dwStyle & HDS_BUTTONS) && (flags == HHT_ONHEADER)) {
1195 SetCapture (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001196 infoPtr->bCaptured = TRUE;
1197 infoPtr->bPressed = TRUE;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001198 infoPtr->iMoveItem = nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001199
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001200 infoPtr->items[nItem].bDown = TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001201
1202 /* Send WM_CUSTOMDRAW */
Eric Kohlcad17ff1999-03-12 17:42:50 +00001203 hdc = GetDC (hwnd);
1204 HEADER_RefreshItem (hwnd, hdc, nItem);
1205 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001206
Alexandre Julliarda099a551999-06-12 15:45:58 +00001207 TRACE("Pressed item %d!\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001208 }
1209 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001210 if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem))) {
1211 SetCapture (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001212 infoPtr->bCaptured = TRUE;
1213 infoPtr->bTracking = TRUE;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001214 infoPtr->iMoveItem = nItem;
1215 infoPtr->nOldWidth = infoPtr->items[nItem].cxy;
1216 infoPtr->xTrackOffset = infoPtr->items[nItem].rect.right - pt.x;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001217
Eric Kohlcad17ff1999-03-12 17:42:50 +00001218 if (!(dwStyle & HDS_FULLDRAG)) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001219 infoPtr->xOldTrack = infoPtr->items[nItem].rect.right;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001220 hdc = GetDC (hwnd);
1221 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
1222 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001223 }
1224
Alexandre Julliarda099a551999-06-12 15:45:58 +00001225 TRACE("Begin tracking item %d!\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001226 }
1227 }
1228
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001229 return 0;
1230}
1231
1232
1233static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001234HEADER_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001235{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001236 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Aric Stewart3054b762000-06-11 20:39:14 +00001237 /*
1238 *DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
1239 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001240 POINT pt;
1241 UINT flags;
1242 INT nItem, nWidth;
1243 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001244
Thuy Nguyen30eaa591999-10-13 13:47:36 +00001245 pt.x = (INT)SLOWORD(lParam);
1246 pt.y = (INT)SHIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001247 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001248
1249 if (infoPtr->bPressed) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001250 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001251 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001252 hdc = GetDC (hwnd);
1253 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
1254 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001255
Eric Kohlcad17ff1999-03-12 17:42:50 +00001256 HEADER_SendClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001257 }
Alexandre Julliarda099a551999-06-12 15:45:58 +00001258 TRACE("Released item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001259 infoPtr->bPressed = FALSE;
1260 }
1261 else if (infoPtr->bTracking) {
Alexandre Julliarda099a551999-06-12 15:45:58 +00001262 TRACE("End tracking item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001263 infoPtr->bTracking = FALSE;
1264
Eric Kohlcad17ff1999-03-12 17:42:50 +00001265 HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001266
Aric Stewart3054b762000-06-11 20:39:14 +00001267 /*
1268 * we want to do this even for HDS_FULLDRAG because this is where
1269 * we send the HDN_ITEMCHANGING and HDN_ITEMCHANGED notifications
1270 *
1271 * if (!(dwStyle & HDS_FULLDRAG)) {
1272 */
1273
Eric Kohlcad17ff1999-03-12 17:42:50 +00001274 hdc = GetDC (hwnd);
1275 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
Aric Stewart3054b762000-06-11 20:39:14 +00001276 ReleaseDC (hwnd, hdc);
1277 if (HEADER_SendItemChange(hwnd, infoPtr->iMoveItem,HDI_WIDTH,
1278 HDN_ITEMCHANGINGA))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001279 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
1280 else {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001281 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001282 if (nWidth < 0)
1283 nWidth = 0;
1284 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
Aric Stewart3054b762000-06-11 20:39:14 +00001285 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001286
Aric Stewart3054b762000-06-11 20:39:14 +00001287 HEADER_SendItemChange(hwnd,infoPtr->iMoveItem,HDI_WIDTH,
1288 HDN_ITEMCHANGEDA);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001289 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001290 InvalidateRect(hwnd, NULL, FALSE);
Aric Stewart3054b762000-06-11 20:39:14 +00001291 /*
1292 * }
1293 */
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001294 }
1295
1296 if (infoPtr->bCaptured) {
1297 infoPtr->bCaptured = FALSE;
1298 ReleaseCapture ();
Eric Kohlcad17ff1999-03-12 17:42:50 +00001299 HEADER_SendSimpleNotify (hwnd, NM_RELEASEDCAPTURE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001300 }
1301
1302 return 0;
1303}
1304
1305
1306static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001307HEADER_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001308{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001309 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1310 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001311 POINT pt;
1312 UINT flags;
1313 INT nItem, nWidth;
1314 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001315
Thuy Nguyen30eaa591999-10-13 13:47:36 +00001316 pt.x = (INT)SLOWORD(lParam);
1317 pt.y = (INT)SHIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001318 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001319
Eric Kohlcad17ff1999-03-12 17:42:50 +00001320 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001321 if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001322 infoPtr->iHotItem = nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001323 else
1324 infoPtr->iHotItem = -1;
Chris Morgan3cbc1682000-06-04 01:34:31 +00001325 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001326 }
1327
1328 if (infoPtr->bCaptured) {
1329 if (infoPtr->bPressed) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001330 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001331 infoPtr->items[infoPtr->iMoveItem].bDown = TRUE;
1332 else
1333 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001334 hdc = GetDC (hwnd);
1335 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
1336 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001337
Alexandre Julliarda099a551999-06-12 15:45:58 +00001338 TRACE("Moving pressed item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001339 }
1340 else if (infoPtr->bTracking) {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001341 if (dwStyle & HDS_FULLDRAG) {
Aric Stewart3054b762000-06-11 20:39:14 +00001342 /*
1343 * Investigation shows that the changing message occure only
1344 * after tracking is done
1345 *
1346 *if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
1347 * infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
1348 *else {
1349 *
1350 */
1351 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
1352 if (nWidth < 0)
1353 nWidth = 0;
1354 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
1355 /*
1356 * Invistigation shows that the item changed only occures
1357 * after the tracking is done
1358 *
1359 * HEADER_SendItemChanged(FALSE,hwnd,infoPtr->iMoveItem,HDI_WIDTH);
1360 *}
1361 */
1362
Eric Kohlcad17ff1999-03-12 17:42:50 +00001363 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001364 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001365 }
1366 else {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001367 hdc = GetDC (hwnd);
1368 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001369 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset;
1370 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left)
1371 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left;
1372 infoPtr->items[infoPtr->iMoveItem].cxy =
1373 infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001374 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
1375 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001376 }
1377
Eric Kohlcad17ff1999-03-12 17:42:50 +00001378 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem);
Alexandre Julliarda099a551999-06-12 15:45:58 +00001379 TRACE("Tracking item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001380 }
1381 }
1382
Eric Kohlcad17ff1999-03-12 17:42:50 +00001383 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
Alexandre Julliarda099a551999-06-12 15:45:58 +00001384 FIXME("hot track support!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001385 }
1386
1387 return 0;
1388}
1389
1390
1391static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001392HEADER_Paint (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001393{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001394 HDC hdc;
1395 PAINTSTRUCT ps;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001396
Eric Kohlcad17ff1999-03-12 17:42:50 +00001397 hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam;
1398 HEADER_Refresh (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001399 if(!wParam)
Eric Kohlcad17ff1999-03-12 17:42:50 +00001400 EndPaint (hwnd, &ps);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001401 return 0;
1402}
1403
1404
1405static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001406HEADER_RButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001407{
Pascal Lessardce527de2000-02-29 22:04:00 +00001408 BOOL bRet;
1409 POINT pt;
1410
1411 pt.x = LOWORD(lParam);
1412 pt.y = HIWORD(lParam);
1413
1414 /* Send a Notify message */
1415 bRet = HEADER_SendSimpleNotify (hwnd, NM_RCLICK);
1416
1417 /* Change to screen coordinate for WM_CONTEXTMENU */
1418 ClientToScreen(hwnd, &pt);
1419
1420 /* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
1421 SendMessageA( hwnd, WM_CONTEXTMENU, (WPARAM) hwnd, MAKELPARAM(pt.x, pt.y));
1422
1423 return bRet;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001424}
1425
1426
1427static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001428HEADER_SetCursor (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001429{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001430 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001431 POINT pt;
1432 UINT flags;
1433 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001434
Alexandre Julliarda099a551999-06-12 15:45:58 +00001435 TRACE("code=0x%X id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001436
Alexandre Julliarda3960291999-02-26 11:11:13 +00001437 GetCursorPos (&pt);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001438 ScreenToClient (hwnd, &pt);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001439
Eric Kohlcad17ff1999-03-12 17:42:50 +00001440 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001441
1442 if (flags == HHT_ONDIVIDER)
Alexandre Julliarda3960291999-02-26 11:11:13 +00001443 SetCursor (infoPtr->hcurDivider);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001444 else if (flags == HHT_ONDIVOPEN)
Alexandre Julliarda3960291999-02-26 11:11:13 +00001445 SetCursor (infoPtr->hcurDivopen);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001446 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001447 SetCursor (infoPtr->hcurArrow);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001448
1449 return 0;
1450}
1451
1452
1453static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001454HEADER_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001455{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001456 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001457 TEXTMETRICA tm;
1458 HFONT hFont, hOldFont;
1459 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001460
Alexandre Julliarda3960291999-02-26 11:11:13 +00001461 infoPtr->hFont = (HFONT)wParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001462
Alexandre Julliarda3960291999-02-26 11:11:13 +00001463 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001464
Alexandre Julliarda3960291999-02-26 11:11:13 +00001465 hdc = GetDC (0);
1466 hOldFont = SelectObject (hdc, hFont);
1467 GetTextMetricsA (hdc, &tm);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001468 infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001469 SelectObject (hdc, hOldFont);
1470 ReleaseDC (0, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001471
Martin Fuchs33bdf532000-04-28 14:46:36 +00001472 infoPtr->bRectsValid = FALSE;
1473
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001474 if (lParam) {
Chris Morgan3cbc1682000-06-04 01:34:31 +00001475 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001476 }
1477
1478 return 0;
1479}
1480
1481
Patrik Stridvall26ffb3c1999-07-31 14:41:43 +00001482static LRESULT WINAPI
Alexandre Julliarda3960291999-02-26 11:11:13 +00001483HEADER_WindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001484{
Gerard Patela1b2fc22000-05-10 01:34:53 +00001485 TRACE("hwnd=%x msg=%x wparam=%x lParam=%lx\n", hwnd, msg, wParam, lParam);
1486 if (!HEADER_GetInfoPtr (hwnd) && (msg != WM_CREATE))
1487 return DefWindowProcA (hwnd, msg, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001488 switch (msg) {
1489 case HDM_CREATEDRAGIMAGE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001490 return HEADER_CreateDragImage (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001491
1492 case HDM_DELETEITEM:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001493 return HEADER_DeleteItem (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001494
1495 case HDM_GETIMAGELIST:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001496 return HEADER_GetImageList (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001497
Alexandre Julliarda3960291999-02-26 11:11:13 +00001498 case HDM_GETITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001499 return HEADER_GetItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001500
Alexandre Julliarda3960291999-02-26 11:11:13 +00001501 case HDM_GETITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001502 return HEADER_GetItemW (hwnd, wParam, lParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001503
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001504 case HDM_GETITEMCOUNT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001505 return HEADER_GetItemCount (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001506
1507 case HDM_GETITEMRECT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001508 return HEADER_GetItemRect (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001509
Marcus Meissner73458b01998-12-26 12:54:29 +00001510/* case HDM_GETORDERARRAY: */
Eric Kohl8d2933d1998-11-22 18:12:12 +00001511
1512 case HDM_GETUNICODEFORMAT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001513 return HEADER_GetUnicodeFormat (hwnd);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001514
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001515 case HDM_HITTEST:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001516 return HEADER_HitTest (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001517
Alexandre Julliarda3960291999-02-26 11:11:13 +00001518 case HDM_INSERTITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001519 return HEADER_InsertItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001520
Alexandre Julliarda3960291999-02-26 11:11:13 +00001521 case HDM_INSERTITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001522 return HEADER_InsertItemW (hwnd, wParam, lParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001523
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001524 case HDM_LAYOUT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001525 return HEADER_Layout (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001526
1527 case HDM_SETIMAGELIST:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001528 return HEADER_SetImageList (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001529
Alexandre Julliarda3960291999-02-26 11:11:13 +00001530 case HDM_SETITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001531 return HEADER_SetItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001532
Alexandre Julliarda3960291999-02-26 11:11:13 +00001533 case HDM_SETITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001534 return HEADER_SetItemW (hwnd, wParam, lParam);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001535
Marcus Meissner73458b01998-12-26 12:54:29 +00001536/* case HDM_SETORDERARRAY: */
Eric Kohl8d2933d1998-11-22 18:12:12 +00001537
1538 case HDM_SETUNICODEFORMAT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001539 return HEADER_SetUnicodeFormat (hwnd, wParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001540
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001541 case WM_CREATE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001542 return HEADER_Create (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001543
1544 case WM_DESTROY:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001545 return HEADER_Destroy (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001546
1547 case WM_ERASEBKGND:
1548 return 1;
1549
1550 case WM_GETDLGCODE:
1551 return DLGC_WANTTAB | DLGC_WANTARROWS;
1552
1553 case WM_GETFONT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001554 return HEADER_GetFont (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001555
1556 case WM_LBUTTONDBLCLK:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001557 return HEADER_LButtonDblClk (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001558
1559 case WM_LBUTTONDOWN:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001560 return HEADER_LButtonDown (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001561
1562 case WM_LBUTTONUP:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001563 return HEADER_LButtonUp (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001564
1565 case WM_MOUSEMOVE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001566 return HEADER_MouseMove (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001567
Marcus Meissner73458b01998-12-26 12:54:29 +00001568/* case WM_NOTIFYFORMAT: */
Eric Kohl8d2933d1998-11-22 18:12:12 +00001569
Martin Fuchs33bdf532000-04-28 14:46:36 +00001570 case WM_SIZE:
1571 return HEADER_Size (hwnd, wParam);
1572
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001573 case WM_PAINT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001574 return HEADER_Paint (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001575
1576 case WM_RBUTTONUP:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001577 return HEADER_RButtonUp (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001578
1579 case WM_SETCURSOR:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001580 return HEADER_SetCursor (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001581
1582 case WM_SETFONT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001583 return HEADER_SetFont (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001584
1585 default:
1586 if (msg >= WM_USER)
Alexandre Julliarda099a551999-06-12 15:45:58 +00001587 ERR("unknown msg %04x wp=%04x lp=%08lx\n",
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001588 msg, wParam, lParam );
Alexandre Julliarda3960291999-02-26 11:11:13 +00001589 return DefWindowProcA (hwnd, msg, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001590 }
1591 return 0;
1592}
1593
1594
Eric Kohl9d8e8641998-10-24 10:49:27 +00001595VOID
Patrik Stridvall9e61c1c1999-06-12 08:27:49 +00001596HEADER_Register (void)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001597{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001598 WNDCLASSA wndClass;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001599
Alexandre Julliarda3960291999-02-26 11:11:13 +00001600 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001601 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001602 wndClass.lpfnWndProc = (WNDPROC)HEADER_WindowProc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001603 wndClass.cbClsExtra = 0;
1604 wndClass.cbWndExtra = sizeof(HEADER_INFO *);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001605 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
1606 wndClass.lpszClassName = WC_HEADERA;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001607
Alexandre Julliarda3960291999-02-26 11:11:13 +00001608 RegisterClassA (&wndClass);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001609}
1610
Eric Kohl9d8e8641998-10-24 10:49:27 +00001611
1612VOID
Patrik Stridvall9e61c1c1999-06-12 08:27:49 +00001613HEADER_Unregister (void)
Eric Kohl9d8e8641998-10-24 10:49:27 +00001614{
Alexandre Julliardd711ad92000-02-13 15:10:16 +00001615 UnregisterClassA (WC_HEADERA, (HINSTANCE)NULL);
Eric Kohl9d8e8641998-10-24 10:49:27 +00001616}
1617