blob: 743725c7609360f0889dd08aef27d16009d2e1db [file] [log] [blame]
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001/*
2 * Header control
3 *
4 * Copyright 1998 Eric Kohl
Eric Kohldbbc2242000-11-09 20:26:34 +00005 * Copyright 2000 Eric Kohl for CodeWeavers
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +00006 * Copyright 2003 Maxime Bellenge
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00007 *
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00008 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000022 * TODO:
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000023 * - Imagelist support (partially).
Alexandre Julliardd30dfd21998-09-27 18:28:36 +000024 * - Callback items (under construction).
Alexandre Julliarda845b881998-06-01 10:44:35 +000025 * - Hottrack support (partially).
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000026 * - Custom draw support (including Notifications).
27 * - Drag and Drop support (including Notifications).
Eric Kohl40f29ee2000-11-25 03:07:01 +000028 * - New messages.
29 * - Use notification format
Bill Medland69f18272002-07-16 01:14:46 +000030 * - Correct the order maintenance code to preserve valid order
Alexandre Julliarda845b881998-06-01 10:44:35 +000031 *
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000032 */
33
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000034#include <stdarg.h>
Jeff Garzikc3e1f721999-02-19 15:42:11 +000035#include <string.h>
36
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000037#include "windef.h"
Marcus Meissner3480e4a1999-03-16 10:53:11 +000038#include "winbase.h"
Alexandre Julliardc7e7df82000-08-14 14:41:19 +000039#include "wine/unicode.h"
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000040#include "wingdi.h"
41#include "winuser.h"
42#include "winnls.h"
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000043#include "commctrl.h"
Eric Kohldbbc2242000-11-09 20:26:34 +000044#include "comctl32.h"
Uwe Bonnes018c6542000-10-19 22:26:17 +000045#include "imagelist.h"
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000046#include "wine/debug.h"
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000047
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000048WINE_DEFAULT_DEBUG_CHANNEL(header);
Alexandre Julliard70c9e092000-08-09 00:41:17 +000049
Vincent Béron9a624912002-05-31 23:06:46 +000050typedef struct
Alexandre Julliard70c9e092000-08-09 00:41:17 +000051{
52 INT cxy;
53 HBITMAP hbm;
54 LPWSTR pszText;
55 INT fmt;
56 LPARAM lParam;
57 INT iImage;
58 INT iOrder; /* see documentation of HD_ITEM */
59
60 BOOL bDown; /* is item pressed? (used for drawing) */
61 RECT rect; /* bounding rectangle of the item */
62} HEADER_ITEM;
63
64
65typedef struct
66{
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +000067 HWND hwndNotify; /* Owner window to send notifications to */
Eric Kohl40f29ee2000-11-25 03:07:01 +000068 INT nNotifyFormat; /* format used for WM_NOTIFY messages */
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +000069 UINT uNumItem; /* number of items (columns) */
70 INT nHeight; /* height of the header (pixels) */
Alexandre Julliard70c9e092000-08-09 00:41:17 +000071 HFONT hFont; /* handle to the current font */
72 HCURSOR hcurArrow; /* handle to the arrow cursor */
73 HCURSOR hcurDivider; /* handle to a cursor (used over dividers) <-|-> */
74 HCURSOR hcurDivopen; /* handle to a cursor (used over dividers) <-||-> */
75 BOOL bCaptured; /* Is the mouse captured? */
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +000076 BOOL bPressed; /* Is a header item pressed (down)? */
Alexandre Julliard70c9e092000-08-09 00:41:17 +000077 BOOL bTracking; /* Is in tracking mode? */
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +000078 BOOL bUnicode; /* Unicode flag */
Alexandre Julliard70c9e092000-08-09 00:41:17 +000079 INT iMoveItem; /* index of tracked item. (Tracking mode) */
80 INT xTrackOffset; /* distance between the right side of the tracked item and the cursor */
81 INT xOldTrack; /* track offset (see above) after the last WM_MOUSEMOVE */
82 INT nOldWidth; /* width of a sizing item after the last WM_MOUSEMOVE */
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +000083 INT iHotItem; /* index of hot item (cursor is over this item) */
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +000084 INT iMargin; /* width of the margin that surrounds a bitmap */
Alexandre Julliard70c9e092000-08-09 00:41:17 +000085
86 HIMAGELIST himl; /* handle to a image list (may be 0) */
87 HEADER_ITEM *items; /* pointer to array of HEADER_ITEM's */
88 BOOL bRectsValid; /* validity flag for bounding rectangles */
Alexandre Julliard70c9e092000-08-09 00:41:17 +000089} HEADER_INFO;
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000090
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000091
Dimitrie O. Paund6645402002-10-22 00:41:45 +000092#define VERT_BORDER 3
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000093#define DIVIDER_WIDTH 10
94
Robert Shearmancdb263e2004-08-25 17:33:01 +000095#define HEADER_GetInfoPtr(hwnd) ((HEADER_INFO *)GetWindowLongPtrW(hwnd,0))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +000096
97
Uwe Bonnes018c6542000-10-19 22:26:17 +000098inline static LRESULT
99HEADER_IndexToOrder (HWND hwnd, INT iItem)
100{
101 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Bill Medland69f18272002-07-16 01:14:46 +0000102 HEADER_ITEM *lpItem = &infoPtr->items[iItem];
Uwe Bonnes018c6542000-10-19 22:26:17 +0000103 return lpItem->iOrder;
104}
105
106
Vincent Béron9a624912002-05-31 23:06:46 +0000107static INT
Uwe Bonnes018c6542000-10-19 22:26:17 +0000108HEADER_OrderToIndex(HWND hwnd, WPARAM wParam)
109{
110 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000111 INT iorder = (INT)wParam;
112 UINT i;
Vincent Béron9a624912002-05-31 23:06:46 +0000113
Uwe Bonnes018c6542000-10-19 22:26:17 +0000114 if ((iorder <0) || iorder >infoPtr->uNumItem)
115 return iorder;
116 for (i=0; i<infoPtr->uNumItem; i++)
117 if (HEADER_IndexToOrder(hwnd,i) == iorder)
118 return i;
119 return iorder;
120}
121
Martin Fuchs33bdf532000-04-28 14:46:36 +0000122static void
123HEADER_SetItemBounds (HWND hwnd)
124{
125 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
126 HEADER_ITEM *phdi;
127 RECT rect;
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000128 unsigned int i;
129 int x;
Martin Fuchs33bdf532000-04-28 14:46:36 +0000130
131 infoPtr->bRectsValid = TRUE;
132
133 if (infoPtr->uNumItem == 0)
134 return;
135
136 GetClientRect (hwnd, &rect);
137
138 x = rect.left;
139 for (i = 0; i < infoPtr->uNumItem; i++) {
Uwe Bonnes018c6542000-10-19 22:26:17 +0000140 phdi = &infoPtr->items[HEADER_OrderToIndex(hwnd,i)];
Martin Fuchs33bdf532000-04-28 14:46:36 +0000141 phdi->rect.top = rect.top;
142 phdi->rect.bottom = rect.bottom;
143 phdi->rect.left = x;
Mike McCormack7c1db502001-09-17 20:25:52 +0000144 phdi->rect.right = phdi->rect.left + ((phdi->cxy>0)?phdi->cxy:0);
Martin Fuchs33bdf532000-04-28 14:46:36 +0000145 x = phdi->rect.right;
146 }
147}
148
149static LRESULT
150HEADER_Size (HWND hwnd, WPARAM wParam)
151{
152 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
153
154 infoPtr->bRectsValid = FALSE;
155
156 return 0;
157}
158
159
Alexandre Julliarda3960291999-02-26 11:11:13 +0000160static INT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000161HEADER_DrawItem (HWND hwnd, HDC hdc, INT iItem, BOOL bHotTrack)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000162{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000163 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000164 HEADER_ITEM *phdi = &infoPtr->items[iItem];
Alexandre Julliarda3960291999-02-26 11:11:13 +0000165 RECT r;
166 INT oldBkMode;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000167
Duane Clarkf7301572002-03-11 01:08:29 +0000168 TRACE("DrawItem(iItem %d bHotTrack %d unicode flag %d)\n", iItem, bHotTrack, infoPtr->bUnicode);
Eric Kohl4718b6d2000-12-13 01:52:23 +0000169
Martin Fuchs33bdf532000-04-28 14:46:36 +0000170 if (!infoPtr->bRectsValid)
171 HEADER_SetItemBounds(hwnd);
Vincent Béron9a624912002-05-31 23:06:46 +0000172
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000173 r = phdi->rect;
174 if (r.right - r.left == 0)
175 return phdi->rect.right;
176
Eric Kohlcad17ff1999-03-12 17:42:50 +0000177 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000178 if (phdi->bDown) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000179 DrawEdge (hdc, &r, BDR_RAISEDOUTER,
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000180 BF_RECT | BF_FLAT | BF_MIDDLE | BF_ADJUST);
181 r.left += 2;
182 r.top += 2;
183 }
184 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000185 DrawEdge (hdc, &r, EDGE_RAISED,
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000186 BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
187 }
188 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000189 DrawEdge (hdc, &r, EDGE_ETCHED, BF_BOTTOM | BF_RIGHT | BF_ADJUST);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000190
191 if (phdi->fmt & HDF_OWNERDRAW) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000192 DRAWITEMSTRUCT dis;
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000193 dis.CtlType = ODT_HEADER;
Robert Shearmancdb263e2004-08-25 17:33:01 +0000194 dis.CtlID = GetWindowLongPtrW (hwnd, GWLP_ID);
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000195 dis.itemID = iItem;
196 dis.itemAction = ODA_DRAWENTIRE;
197 dis.itemState = phdi->bDown ? ODS_SELECTED : 0;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000198 dis.hwndItem = hwnd;
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +0000199 dis.hDC = hdc;
200 dis.rcItem = r;
201 dis.itemData = phdi->lParam;
Gerard Patel66226d82001-04-04 00:09:05 +0000202 oldBkMode = SetBkMode(hdc, TRANSPARENT);
Dimitrie O. Paunc5940432003-11-20 22:04:13 +0000203 SendMessageA (infoPtr->hwndNotify, WM_DRAWITEM,
Eric Kohlcad17ff1999-03-12 17:42:50 +0000204 (WPARAM)dis.CtlID, (LPARAM)&dis);
Gerard Patel66226d82001-04-04 00:09:05 +0000205 if (oldBkMode != TRANSPARENT)
206 SetBkMode(hdc, oldBkMode);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000207 }
208 else {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000209 UINT uTextJustify = DT_LEFT;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000210
211 if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_CENTER)
212 uTextJustify = DT_CENTER;
213 else if ((phdi->fmt & HDF_JUSTIFYMASK) == HDF_RIGHT)
214 uTextJustify = DT_RIGHT;
215
Carlos9fa51e42002-10-23 23:31:35 +0000216 if ((phdi->fmt & HDF_BITMAP) && !(phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000217 BITMAP bmp;
218 HDC hdcBitmap;
219 INT yD, yS, cx, cy, rx, ry;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000220
Alexandre Julliarda3960291999-02-26 11:11:13 +0000221 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
Alexandre Julliarda845b881998-06-01 10:44:35 +0000222
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000223 ry = r.bottom - r.top;
224 rx = r.right - r.left;
225
226 if (ry >= bmp.bmHeight) {
227 cy = bmp.bmHeight;
228 yD = r.top + (ry - bmp.bmHeight) / 2;
229 yS = 0;
230 }
231 else {
232 cy = ry;
233 yD = r.top;
234 yS = (bmp.bmHeight - ry) / 2;
235
236 }
237
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000238 if (rx >= bmp.bmWidth + infoPtr->iMargin) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000239 cx = bmp.bmWidth;
240 }
241 else {
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000242 cx = rx - infoPtr->iMargin;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000243 }
244
Alexandre Julliarda3960291999-02-26 11:11:13 +0000245 hdcBitmap = CreateCompatibleDC (hdc);
246 SelectObject (hdcBitmap, phdi->hbm);
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000247 BitBlt (hdc, r.left + infoPtr->iMargin, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000248 DeleteDC (hdcBitmap);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000249
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000250 r.left += (bmp.bmWidth + infoPtr->iMargin);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000251 }
252
Alexandre Julliarda845b881998-06-01 10:44:35 +0000253
Carlos9fa51e42002-10-23 23:31:35 +0000254 if ((phdi->fmt & HDF_BITMAP) && (phdi->fmt & HDF_BITMAP_ON_RIGHT) && (phdi->hbm)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000255 BITMAP bmp;
256 HDC hdcBitmap;
257 INT xD, yD, yS, cx, cy, rx, ry, tx;
258 RECT textRect;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000259
Alexandre Julliarda3960291999-02-26 11:11:13 +0000260 GetObjectA (phdi->hbm, sizeof(BITMAP), (LPVOID)&bmp);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000261
Alexandre Julliarda845b881998-06-01 10:44:35 +0000262 textRect = r;
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000263 if (phdi->fmt & HDF_STRING) {
264 DrawTextW (hdc, phdi->pszText, -1,
265 &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT);
266 tx = textRect.right - textRect.left;
267 }
268 else
269 tx = 0;
Alexandre Julliarda845b881998-06-01 10:44:35 +0000270 ry = r.bottom - r.top;
271 rx = r.right - r.left;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000272
Alexandre Julliarda845b881998-06-01 10:44:35 +0000273 if (ry >= bmp.bmHeight) {
274 cy = bmp.bmHeight;
275 yD = r.top + (ry - bmp.bmHeight) / 2;
276 yS = 0;
277 }
278 else {
279 cy = ry;
280 yD = r.top;
281 yS = (bmp.bmHeight - ry) / 2;
282
283 }
284
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000285 if (r.left + tx + bmp.bmWidth + 2*infoPtr->iMargin <= r.right) {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000286 cx = bmp.bmWidth;
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000287 xD = r.left + tx + infoPtr->iMargin;
Alexandre Julliarda845b881998-06-01 10:44:35 +0000288 }
289 else {
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000290 if (rx >= bmp.bmWidth + infoPtr->iMargin ) {
Alexandre Julliarda845b881998-06-01 10:44:35 +0000291 cx = bmp.bmWidth;
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000292 xD = r.right - bmp.bmWidth - infoPtr->iMargin;
293 r.right = xD - infoPtr->iMargin;
Alexandre Julliarda845b881998-06-01 10:44:35 +0000294 }
295 else {
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000296 cx = rx - infoPtr->iMargin;
Alexandre Julliarda845b881998-06-01 10:44:35 +0000297 xD = r.left;
298 r.right = r.left;
299 }
300 }
301
Alexandre Julliarda3960291999-02-26 11:11:13 +0000302 hdcBitmap = CreateCompatibleDC (hdc);
303 SelectObject (hdcBitmap, phdi->hbm);
304 BitBlt (hdc, xD, yD, cx, cy, hdcBitmap, 0, yS, SRCCOPY);
305 DeleteDC (hdcBitmap);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000306 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000307
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000308 if ((phdi->fmt & HDF_IMAGE) && !(phdi->fmt & HDF_BITMAP_ON_RIGHT) && (infoPtr->himl)) {
309 r.left += infoPtr->iMargin;
310 ImageList_DrawEx(infoPtr->himl, phdi->iImage, hdc, r.left, r.top + (r.bottom-r.top- infoPtr->himl->cy)/2,
311 infoPtr->himl->cx, r.bottom-r.top, CLR_DEFAULT, CLR_DEFAULT, 0);
312 r.left += infoPtr->himl->cx;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000313 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000314
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000315 if ((phdi->fmt & HDF_IMAGE) && (phdi->fmt & HDF_BITMAP_ON_RIGHT) && (infoPtr->himl)) {
316 RECT textRect;
317 INT tx;
318
319 textRect = r;
320 if (phdi->fmt & HDF_STRING) {
321 DrawTextW (hdc, phdi->pszText, -1,
322 &textRect, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_CALCRECT);
323 tx = textRect.right - textRect.left;
324 }
325 else
326 tx = 0;
327 ImageList_DrawEx(infoPtr->himl, phdi->iImage, hdc, r.left + tx + 2*infoPtr->iMargin,
328 r.top + (r.bottom-r.top-infoPtr->himl->cy)/2, infoPtr->himl->cx, r.bottom-r.top,
329 CLR_DEFAULT, CLR_DEFAULT, 0);
330 }
331
Martin Fuchs33bdf532000-04-28 14:46:36 +0000332 if (((phdi->fmt & HDF_STRING)
333 || (!(phdi->fmt & (HDF_OWNERDRAW|HDF_STRING|HDF_BITMAP|
334 HDF_BITMAP_ON_RIGHT|HDF_IMAGE)))) /* no explicit format specified? */
335 && (phdi->pszText)) {
Alexandre Julliarda3960291999-02-26 11:11:13 +0000336 oldBkMode = SetBkMode(hdc, TRANSPARENT);
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +0000337 r.left += infoPtr->iMargin;
338 r.right -= infoPtr->iMargin;
Uwe Bonnes018c6542000-10-19 22:26:17 +0000339 SetTextColor (hdc, (bHotTrack) ? COLOR_HIGHLIGHT : COLOR_BTNTEXT);
Martin Fuchsfe7d46a2002-10-18 00:20:04 +0000340 DrawTextW (hdc, phdi->pszText, -1,
341 &r, uTextJustify|DT_END_ELLIPSIS|DT_VCENTER|DT_SINGLELINE);
342 if (oldBkMode != TRANSPARENT)
343 SetBkMode(hdc, oldBkMode);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000344 }
Uwe Bonnes018c6542000-10-19 22:26:17 +0000345 }/*Ownerdrawn*/
Eric Kohlcad17ff1999-03-12 17:42:50 +0000346
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000347 return phdi->rect.right;
348}
349
350
Vincent Béron9a624912002-05-31 23:06:46 +0000351static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000352HEADER_Refresh (HWND hwnd, HDC hdc)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000353{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000354 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000355 HFONT hFont, hOldFont;
356 RECT rect;
357 HBRUSH hbrBk;
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000358 UINT i;
359 INT x;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000360
361 /* get rect for the bar, adjusted for the border */
Eric Kohlcad17ff1999-03-12 17:42:50 +0000362 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000363
Alexandre Julliarda3960291999-02-26 11:11:13 +0000364 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
365 hOldFont = SelectObject (hdc, hFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000366
367 /* draw Background */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000368 hbrBk = GetSysColorBrush(COLOR_3DFACE);
369 FillRect(hdc, &rect, hbrBk);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000370
371 x = rect.left;
372 for (i = 0; i < infoPtr->uNumItem; i++) {
Uwe Bonnes018c6542000-10-19 22:26:17 +0000373 x = HEADER_DrawItem (hwnd, hdc, HEADER_OrderToIndex(hwnd,i), FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000374 }
375
376 if ((x <= rect.right) && (infoPtr->uNumItem > 0)) {
377 rect.left = x;
Eric Kohlcad17ff1999-03-12 17:42:50 +0000378 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS)
Alexandre Julliarda3960291999-02-26 11:11:13 +0000379 DrawEdge (hdc, &rect, EDGE_RAISED, BF_TOP|BF_LEFT|BF_BOTTOM|BF_SOFT);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000380 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000381 DrawEdge (hdc, &rect, EDGE_ETCHED, BF_BOTTOM);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000382 }
383
Alexandre Julliarda3960291999-02-26 11:11:13 +0000384 SelectObject (hdc, hOldFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000385}
386
387
388static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000389HEADER_RefreshItem (HWND hwnd, HDC hdc, INT iItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000390{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000391 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000392 HFONT hFont, hOldFont;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000393
Alexandre Julliarda3960291999-02-26 11:11:13 +0000394 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
395 hOldFont = SelectObject (hdc, hFont);
Eric Kohlcad17ff1999-03-12 17:42:50 +0000396 HEADER_DrawItem (hwnd, hdc, iItem, FALSE);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000397 SelectObject (hdc, hOldFont);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000398}
399
400
401static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000402HEADER_InternalHitTest (HWND hwnd, LPPOINT lpPt, UINT *pFlags, INT *pItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000403{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000404 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000405 RECT rect, rcTest;
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000406 UINT iCount;
407 INT width;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000408 BOOL bNoWidth;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000409
Eric Kohlcad17ff1999-03-12 17:42:50 +0000410 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000411
412 *pFlags = 0;
413 bNoWidth = FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000414 if (PtInRect (&rect, *lpPt))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000415 {
416 if (infoPtr->uNumItem == 0) {
417 *pFlags |= HHT_NOWHERE;
418 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000419 TRACE("NOWHERE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000420 return;
421 }
422 else {
423 /* somewhere inside */
424 for (iCount = 0; iCount < infoPtr->uNumItem; iCount++) {
425 rect = infoPtr->items[iCount].rect;
426 width = rect.right - rect.left;
427 if (width == 0) {
428 bNoWidth = TRUE;
429 continue;
430 }
Alexandre Julliarda3960291999-02-26 11:11:13 +0000431 if (PtInRect (&rect, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000432 if (width <= 2 * DIVIDER_WIDTH) {
433 *pFlags |= HHT_ONHEADER;
434 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000435 TRACE("ON HEADER %d\n", iCount);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000436 return;
437 }
438 if (iCount > 0) {
439 rcTest = rect;
440 rcTest.right = rcTest.left + DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000441 if (PtInRect (&rcTest, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000442 if (bNoWidth) {
443 *pFlags |= HHT_ONDIVOPEN;
444 *pItem = iCount - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000445 TRACE("ON DIVOPEN %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000446 return;
447 }
448 else {
449 *pFlags |= HHT_ONDIVIDER;
450 *pItem = iCount - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000451 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000452 return;
453 }
454 }
455 }
456 rcTest = rect;
457 rcTest.left = rcTest.right - DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000458 if (PtInRect (&rcTest, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000459 *pFlags |= HHT_ONDIVIDER;
460 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000461 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000462 return;
463 }
464
465 *pFlags |= HHT_ONHEADER;
466 *pItem = iCount;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000467 TRACE("ON HEADER %d\n", iCount);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000468 return;
469 }
470 }
471
472 /* check for last divider part (on nowhere) */
473 rect = infoPtr->items[infoPtr->uNumItem-1].rect;
474 rect.left = rect.right;
475 rect.right += DIVIDER_WIDTH;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000476 if (PtInRect (&rect, *lpPt)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000477 if (bNoWidth) {
478 *pFlags |= HHT_ONDIVOPEN;
479 *pItem = infoPtr->uNumItem - 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000480 TRACE("ON DIVOPEN %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000481 return;
482 }
483 else {
484 *pFlags |= HHT_ONDIVIDER;
485 *pItem = infoPtr->uNumItem-1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000486 TRACE("ON DIVIDER %d\n", *pItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000487 return;
488 }
489 }
490
491 *pFlags |= HHT_NOWHERE;
492 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000493 TRACE("NOWHERE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000494 return;
495 }
496 }
497 else {
498 if (lpPt->x < rect.left) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000499 TRACE("TO LEFT\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000500 *pFlags |= HHT_TOLEFT;
501 }
502 else if (lpPt->x > rect.right) {
Thuy Nguyen30eaa591999-10-13 13:47:36 +0000503 TRACE("TO RIGHT\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000504 *pFlags |= HHT_TORIGHT;
505 }
506
507 if (lpPt->y < rect.top) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000508 TRACE("ABOVE\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000509 *pFlags |= HHT_ABOVE;
510 }
511 else if (lpPt->y > rect.bottom) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000512 TRACE("BELOW\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000513 *pFlags |= HHT_BELOW;
514 }
515 }
516
517 *pItem = 1;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000518 TRACE("flags=0x%X\n", *pFlags);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000519 return;
520}
521
522
523static void
Eric Kohlcad17ff1999-03-12 17:42:50 +0000524HEADER_DrawTrackLine (HWND hwnd, HDC hdc, INT x)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000525{
Alexandre Julliarda3960291999-02-26 11:11:13 +0000526 RECT rect;
527 HPEN hOldPen;
528 INT oldRop;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000529
Eric Kohlcad17ff1999-03-12 17:42:50 +0000530 GetClientRect (hwnd, &rect);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000531
Alexandre Julliarda3960291999-02-26 11:11:13 +0000532 hOldPen = SelectObject (hdc, GetStockObject (BLACK_PEN));
533 oldRop = SetROP2 (hdc, R2_XORPEN);
534 MoveToEx (hdc, x, rect.top, NULL);
535 LineTo (hdc, x, rect.bottom);
536 SetROP2 (hdc, oldRop);
537 SelectObject (hdc, hOldPen);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000538}
539
540
Alexandre Julliarda3960291999-02-26 11:11:13 +0000541static BOOL
Eric Kohlcad17ff1999-03-12 17:42:50 +0000542HEADER_SendSimpleNotify (HWND hwnd, UINT code)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000543{
Uwe Bonnes018c6542000-10-19 22:26:17 +0000544 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000545 NMHDR nmhdr;
546
Eric Kohlcad17ff1999-03-12 17:42:50 +0000547 nmhdr.hwndFrom = hwnd;
Robert Shearmancdb263e2004-08-25 17:33:01 +0000548 nmhdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000549 nmhdr.code = code;
550
Uwe Bonnes018c6542000-10-19 22:26:17 +0000551 return (BOOL)SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
Alexandre Julliarda3960291999-02-26 11:11:13 +0000552 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000553}
554
Aric Stewart3054b762000-06-11 20:39:14 +0000555static BOOL
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +0000556HEADER_SendHeaderNotify (HWND hwnd, UINT code, INT iItem, INT mask)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000557{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000558 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000559 NMHEADERA nmhdr;
560 HDITEMA nmitem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000561
Eric Kohlcad17ff1999-03-12 17:42:50 +0000562 nmhdr.hdr.hwndFrom = hwnd;
Robert Shearmancdb263e2004-08-25 17:33:01 +0000563 nmhdr.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000564 nmhdr.hdr.code = code;
565 nmhdr.iItem = iItem;
566 nmhdr.iButton = 0;
567 nmhdr.pitem = &nmitem;
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +0000568 nmitem.mask = mask;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000569 nmitem.cxy = infoPtr->items[iItem].cxy;
570 nmitem.hbm = infoPtr->items[iItem].hbm;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000571 nmitem.pszText = NULL;
572 nmitem.cchTextMax = 0;
Marcus Meissner73458b01998-12-26 12:54:29 +0000573/* nmitem.pszText = infoPtr->items[iItem].pszText; */
574/* nmitem.cchTextMax = infoPtr->items[iItem].cchTextMax; */
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000575 nmitem.fmt = infoPtr->items[iItem].fmt;
576 nmitem.lParam = infoPtr->items[iItem].lParam;
577 nmitem.iOrder = infoPtr->items[iItem].iOrder;
578 nmitem.iImage = infoPtr->items[iItem].iImage;
579
Uwe Bonnes018c6542000-10-19 22:26:17 +0000580 return (BOOL)SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
Eric Kohlcad17ff1999-03-12 17:42:50 +0000581 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000582}
583
584
Alexandre Julliarda3960291999-02-26 11:11:13 +0000585static BOOL
Eric Kohlcad17ff1999-03-12 17:42:50 +0000586HEADER_SendClickNotify (HWND hwnd, UINT code, INT iItem)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000587{
Uwe Bonnes018c6542000-10-19 22:26:17 +0000588 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000589 NMHEADERA nmhdr;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000590
Eric Kohlcad17ff1999-03-12 17:42:50 +0000591 nmhdr.hdr.hwndFrom = hwnd;
Robert Shearmancdb263e2004-08-25 17:33:01 +0000592 nmhdr.hdr.idFrom = GetWindowLongPtrW (hwnd, GWLP_ID);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000593 nmhdr.hdr.code = code;
594 nmhdr.iItem = iItem;
595 nmhdr.iButton = 0;
596 nmhdr.pitem = NULL;
597
Uwe Bonnes018c6542000-10-19 22:26:17 +0000598 return (BOOL)SendMessageA (infoPtr->hwndNotify, WM_NOTIFY,
Eric Kohlcad17ff1999-03-12 17:42:50 +0000599 (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000600}
601
602
603static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000604HEADER_CreateDragImage (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000605{
Alexandre Julliarda099a551999-06-12 15:45:58 +0000606 FIXME("empty stub!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000607 return 0;
608}
609
610
611static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000612HEADER_DeleteItem (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000613{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000614 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000615 INT iItem = (INT)wParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000616
Alexandre Julliarda099a551999-06-12 15:45:58 +0000617 TRACE("[iItem=%d]\n", iItem);
Vincent Béron9a624912002-05-31 23:06:46 +0000618
Alexandre Julliarda3960291999-02-26 11:11:13 +0000619 if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000620 return FALSE;
621
622 if (infoPtr->uNumItem == 1) {
Alexandre Julliarda099a551999-06-12 15:45:58 +0000623 TRACE("Simple delete!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000624 if (infoPtr->items[0].pszText)
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000625 Free (infoPtr->items[0].pszText);
626 Free (infoPtr->items);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000627 infoPtr->items = 0;
628 infoPtr->uNumItem = 0;
629 }
630 else {
631 HEADER_ITEM *oldItems = infoPtr->items;
Bill Medland69f18272002-07-16 01:14:46 +0000632 HEADER_ITEM *pItem;
633 INT i;
634 INT iOrder;
Alexandre Julliarda099a551999-06-12 15:45:58 +0000635 TRACE("Complex delete! [iItem=%d]\n", iItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000636
637 if (infoPtr->items[iItem].pszText)
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000638 Free (infoPtr->items[iItem].pszText);
Bill Medland69f18272002-07-16 01:14:46 +0000639 iOrder = infoPtr->items[iItem].iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000640
641 infoPtr->uNumItem--;
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000642 infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000643 /* pre delete copy */
644 if (iItem > 0) {
645 memcpy (&infoPtr->items[0], &oldItems[0],
646 iItem * sizeof(HEADER_ITEM));
647 }
648
649 /* post delete copy */
650 if (iItem < infoPtr->uNumItem) {
651 memcpy (&infoPtr->items[iItem], &oldItems[iItem+1],
652 (infoPtr->uNumItem - iItem) * sizeof(HEADER_ITEM));
653 }
654
Bill Medland69f18272002-07-16 01:14:46 +0000655 /* Correct the orders */
656 for (i=infoPtr->uNumItem, pItem = infoPtr->items; i; i--, pItem++)
657 {
658 if (pItem->iOrder > iOrder)
659 pItem->iOrder--;
660 }
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000661 Free (oldItems);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000662 }
663
Eric Kohlcad17ff1999-03-12 17:42:50 +0000664 HEADER_SetItemBounds (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000665
Chris Morgan3cbc1682000-06-04 01:34:31 +0000666 InvalidateRect(hwnd, NULL, FALSE);
Vincent Béron9a624912002-05-31 23:06:46 +0000667
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000668 return TRUE;
669}
670
671
672static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000673HEADER_GetImageList (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000674{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000675 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000676
677 return (LRESULT)infoPtr->himl;
678}
679
680
681static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000682HEADER_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000683{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000684 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000685 HDITEMA *phdi = (HDITEMA*)lParam;
686 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000687 HEADER_ITEM *lpItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000688
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000689 if (!phdi)
Alexandre Julliarda0d77311998-09-13 16:32:00 +0000690 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000691 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000692 return FALSE;
693
Alexandre Julliarda099a551999-06-12 15:45:58 +0000694 TRACE("[nItem=%d]\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000695
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000696 if (phdi->mask == 0)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000697 return TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000698
Bill Medland69f18272002-07-16 01:14:46 +0000699 lpItem = &infoPtr->items[nItem];
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000700 if (phdi->mask & HDI_BITMAP)
701 phdi->hbm = lpItem->hbm;
702
703 if (phdi->mask & HDI_FORMAT)
704 phdi->fmt = lpItem->fmt;
705
706 if (phdi->mask & HDI_WIDTH)
707 phdi->cxy = lpItem->cxy;
708
709 if (phdi->mask & HDI_LPARAM)
710 phdi->lParam = lpItem->lParam;
711
712 if (phdi->mask & HDI_TEXT) {
Serge Ivanov7a9a2aa2000-10-12 23:08:19 +0000713 if (lpItem->pszText != LPSTR_TEXTCALLBACKW) {
714 if (lpItem->pszText)
Eric Kohl40f29ee2000-11-25 03:07:01 +0000715 WideCharToMultiByte (CP_ACP, 0, lpItem->pszText, -1,
716 phdi->pszText, phdi->cchTextMax, NULL, NULL);
Serge Ivanov7a9a2aa2000-10-12 23:08:19 +0000717 else
718 *phdi->pszText = 0;
Vincent Béron9a624912002-05-31 23:06:46 +0000719 }
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000720 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000721 phdi->pszText = LPSTR_TEXTCALLBACKA;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000722 }
723
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000724 if (phdi->mask & HDI_IMAGE)
725 phdi->iImage = lpItem->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000726
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000727 if (phdi->mask & HDI_ORDER)
728 phdi->iOrder = lpItem->iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000729
730 return TRUE;
731}
732
733
734static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000735HEADER_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000736{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000737 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000738 HDITEMW *phdi = (HDITEMW*)lParam;
739 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000740 HEADER_ITEM *lpItem;
741
742 if (!phdi)
743 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000744 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Eric Kohl8d2933d1998-11-22 18:12:12 +0000745 return FALSE;
746
Alexandre Julliarda099a551999-06-12 15:45:58 +0000747 TRACE("[nItem=%d]\n", nItem);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000748
749 if (phdi->mask == 0)
750 return TRUE;
751
Bill Medland69f18272002-07-16 01:14:46 +0000752 lpItem = &infoPtr->items[nItem];
Eric Kohl8d2933d1998-11-22 18:12:12 +0000753 if (phdi->mask & HDI_BITMAP)
754 phdi->hbm = lpItem->hbm;
755
756 if (phdi->mask & HDI_FORMAT)
757 phdi->fmt = lpItem->fmt;
758
759 if (phdi->mask & HDI_WIDTH)
760 phdi->cxy = lpItem->cxy;
761
762 if (phdi->mask & HDI_LPARAM)
763 phdi->lParam = lpItem->lParam;
764
765 if (phdi->mask & HDI_TEXT) {
Serge Ivanov7a9a2aa2000-10-12 23:08:19 +0000766 if (lpItem->pszText != LPSTR_TEXTCALLBACKW) {
767 if (lpItem->pszText)
768 lstrcpynW (phdi->pszText, lpItem->pszText, phdi->cchTextMax);
769 else
770 *phdi->pszText = 0;
771 }
Eric Kohl8d2933d1998-11-22 18:12:12 +0000772 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000773 phdi->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000774 }
775
776 if (phdi->mask & HDI_IMAGE)
777 phdi->iImage = lpItem->iImage;
778
779 if (phdi->mask & HDI_ORDER)
780 phdi->iOrder = lpItem->iOrder;
781
782 return TRUE;
783}
784
785
Patrik Stridvall896889f1999-05-08 12:50:36 +0000786inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000787HEADER_GetItemCount (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000788{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000789 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000790 return infoPtr->uNumItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000791}
792
793
794static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000795HEADER_GetItemRect (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000796{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000797 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000798 INT iItem = (INT)wParam;
799 LPRECT lpRect = (LPRECT)lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000800
Alexandre Julliarda3960291999-02-26 11:11:13 +0000801 if ((iItem < 0) || (iItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000802 return FALSE;
803
804 lpRect->left = infoPtr->items[iItem].rect.left;
805 lpRect->right = infoPtr->items[iItem].rect.right;
806 lpRect->top = infoPtr->items[iItem].rect.top;
807 lpRect->bottom = infoPtr->items[iItem].rect.bottom;
808
809 return TRUE;
810}
811
812
Vincent Béron9a624912002-05-31 23:06:46 +0000813static LRESULT
Uwe Bonnes018c6542000-10-19 22:26:17 +0000814HEADER_GetOrderArray(HWND hwnd, WPARAM wParam, LPARAM lParam)
815{
816 int i;
817 LPINT order = (LPINT) lParam;
818 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000819
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000820 if ((unsigned int)wParam <infoPtr->uNumItem)
Uwe Bonnes018c6542000-10-19 22:26:17 +0000821 return FALSE;
822 for (i=0; i<(int)wParam; i++)
823 *order++=HEADER_OrderToIndex(hwnd,i);
824 return TRUE;
825}
826
Vincent Béron9a624912002-05-31 23:06:46 +0000827static LRESULT
Uwe Bonnes018c6542000-10-19 22:26:17 +0000828HEADER_SetOrderArray(HWND hwnd, WPARAM wParam, LPARAM lParam)
829{
830 int i;
831 LPINT order = (LPINT) lParam;
832 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
833 HEADER_ITEM *lpItem;
834
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000835 if ((unsigned int)wParam <infoPtr->uNumItem)
Uwe Bonnes018c6542000-10-19 22:26:17 +0000836 return FALSE;
837 for (i=0; i<(int)wParam; i++)
838 {
Bill Medland69f18272002-07-16 01:14:46 +0000839 lpItem = &infoPtr->items[*order++];
Uwe Bonnes018c6542000-10-19 22:26:17 +0000840 lpItem->iOrder=i;
841 }
842 infoPtr->bRectsValid=0;
843 InvalidateRect(hwnd, NULL, FALSE);
844 return TRUE;
845}
Eric Kohl8d2933d1998-11-22 18:12:12 +0000846
Patrik Stridvall896889f1999-05-08 12:50:36 +0000847inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000848HEADER_GetUnicodeFormat (HWND hwnd)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000849{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000850 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000851 return infoPtr->bUnicode;
852}
853
854
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000855static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000856HEADER_HitTest (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000857{
858 LPHDHITTESTINFO phti = (LPHDHITTESTINFO)lParam;
859
Eric Kohlcad17ff1999-03-12 17:42:50 +0000860 HEADER_InternalHitTest (hwnd, &phti->pt, &phti->flags, &phti->iItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000861
Vitaliy Margolen4cf764f2004-09-13 18:05:02 +0000862 if (phti->flags == HHT_NOWHERE)
Aric Stewart7d6e9a12000-05-05 18:22:44 +0000863 return -1;
Vitaliy Margolen4cf764f2004-09-13 18:05:02 +0000864 else
865 return phti->iItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000866}
867
868
869static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000870HEADER_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000871{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000872 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000873 HDITEMA *phdi = (HDITEMA*)lParam;
874 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000875 HEADER_ITEM *lpItem;
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000876 INT len, iOrder;
877 UINT i;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000878
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000879 if ((phdi == NULL) || (nItem < 0))
880 return -1;
881
882 if (nItem > infoPtr->uNumItem)
883 nItem = infoPtr->uNumItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000884
Robert Shearmanf644c782003-05-22 03:34:54 +0000885 iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder : nItem;
886
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000887 if (infoPtr->uNumItem == 0) {
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000888 infoPtr->items = Alloc (sizeof (HEADER_ITEM));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000889 infoPtr->uNumItem++;
890 }
891 else {
892 HEADER_ITEM *oldItems = infoPtr->items;
893
894 infoPtr->uNumItem++;
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000895 infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000896 if (nItem == 0) {
897 memcpy (&infoPtr->items[1], &oldItems[0],
898 (infoPtr->uNumItem-1) * sizeof(HEADER_ITEM));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000899 }
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000900 else
901 {
902 /* pre insert copy */
903 if (nItem > 0) {
904 memcpy (&infoPtr->items[0], &oldItems[0],
905 nItem * sizeof(HEADER_ITEM));
906 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000907
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000908 /* post insert copy */
909 if (nItem < infoPtr->uNumItem - 1) {
910 memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
Huw D M Davies25539761999-12-04 03:59:33 +0000911 (infoPtr->uNumItem - nItem - 1) * sizeof(HEADER_ITEM));
Luc Tourangeau4d6df2c1999-03-12 17:31:08 +0000912 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000913 }
Vincent Béron9a624912002-05-31 23:06:46 +0000914
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000915 Free (oldItems);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000916 }
917
Robert Shearmanf644c782003-05-22 03:34:54 +0000918 for (i=0; i < infoPtr->uNumItem; i++)
919 {
920 if (infoPtr->items[i].iOrder >= iOrder)
921 infoPtr->items[i].iOrder++;
922 }
923
Bill Medland69f18272002-07-16 01:14:46 +0000924 lpItem = &infoPtr->items[nItem];
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000925 lpItem->bDown = FALSE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000926
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000927 if (phdi->mask & HDI_WIDTH)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000928 lpItem->cxy = phdi->cxy;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +0000929
930 if (phdi->mask & HDI_TEXT) {
Alexandre Julliard60e414f1999-04-24 11:51:13 +0000931 if (!phdi->pszText) /* null pointer check */
Francois Gougetcfc39432004-05-04 04:13:05 +0000932 phdi->pszText = "";
Alexandre Julliard6691fa81999-05-22 15:59:09 +0000933 if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
Eric Kohl40f29ee2000-11-25 03:07:01 +0000934 len = MultiByteToWideChar(CP_ACP, 0, phdi->pszText, -1, NULL, 0);
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000935 lpItem->pszText = Alloc( len*sizeof(WCHAR) );
Eric Kohl40f29ee2000-11-25 03:07:01 +0000936 MultiByteToWideChar(CP_ACP, 0, phdi->pszText, -1, lpItem->pszText, len);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000937 }
938 else
Alexandre Julliarda3960291999-02-26 11:11:13 +0000939 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000940 }
941
942 if (phdi->mask & HDI_FORMAT)
943 lpItem->fmt = phdi->fmt;
944
945 if (lpItem->fmt == 0)
946 lpItem->fmt = HDF_LEFT;
947
Andreas Mohr2295e872002-02-02 18:06:03 +0000948 if (!(lpItem->fmt & HDF_STRING) && (phdi->mask & HDI_TEXT))
Uwe Bonnes018c6542000-10-19 22:26:17 +0000949 {
950 lpItem->fmt |= HDF_STRING;
951 }
Eric Kohl8d2933d1998-11-22 18:12:12 +0000952 if (phdi->mask & HDI_BITMAP)
953 lpItem->hbm = phdi->hbm;
954
955 if (phdi->mask & HDI_LPARAM)
956 lpItem->lParam = phdi->lParam;
957
958 if (phdi->mask & HDI_IMAGE)
959 lpItem->iImage = phdi->iImage;
960
Robert Shearmanf644c782003-05-22 03:34:54 +0000961 lpItem->iOrder = iOrder;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000962
Eric Kohlcad17ff1999-03-12 17:42:50 +0000963 HEADER_SetItemBounds (hwnd);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000964
Chris Morgan3cbc1682000-06-04 01:34:31 +0000965 InvalidateRect(hwnd, NULL, FALSE);
Eric Kohl8d2933d1998-11-22 18:12:12 +0000966
967 return nItem;
968}
969
970
971static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +0000972HEADER_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +0000973{
Eric Kohlcad17ff1999-03-12 17:42:50 +0000974 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000975 HDITEMW *phdi = (HDITEMW*)lParam;
976 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000977 HEADER_ITEM *lpItem;
Hans Leidekker411fc5f2004-09-02 23:00:53 +0000978 INT len, iOrder;
979 UINT i;
Eric Kohl8d2933d1998-11-22 18:12:12 +0000980
981 if ((phdi == NULL) || (nItem < 0))
982 return -1;
983
984 if (nItem > infoPtr->uNumItem)
985 nItem = infoPtr->uNumItem;
986
Robert Shearmanf644c782003-05-22 03:34:54 +0000987 iOrder = (phdi->mask & HDI_ORDER) ? phdi->iOrder : nItem;
988
Eric Kohl8d2933d1998-11-22 18:12:12 +0000989 if (infoPtr->uNumItem == 0) {
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000990 infoPtr->items = Alloc (sizeof (HEADER_ITEM));
Eric Kohl8d2933d1998-11-22 18:12:12 +0000991 infoPtr->uNumItem++;
992 }
993 else {
994 HEADER_ITEM *oldItems = infoPtr->items;
995
996 infoPtr->uNumItem++;
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +0000997 infoPtr->items = Alloc (sizeof (HEADER_ITEM) * infoPtr->uNumItem);
Huw D M Daviesb3b0ddb2002-04-03 22:43:27 +0000998 if (nItem == 0) {
999 memcpy (&infoPtr->items[1], &oldItems[0],
1000 (infoPtr->uNumItem-1) * sizeof(HEADER_ITEM));
Eric Kohl8d2933d1998-11-22 18:12:12 +00001001 }
Huw D M Daviesb3b0ddb2002-04-03 22:43:27 +00001002 else
1003 {
1004 /* pre insert copy */
1005 if (nItem > 0) {
1006 memcpy (&infoPtr->items[0], &oldItems[0],
1007 nItem * sizeof(HEADER_ITEM));
1008 }
Eric Kohl8d2933d1998-11-22 18:12:12 +00001009
Huw D M Daviesb3b0ddb2002-04-03 22:43:27 +00001010 /* post insert copy */
1011 if (nItem < infoPtr->uNumItem - 1) {
1012 memcpy (&infoPtr->items[nItem+1], &oldItems[nItem],
1013 (infoPtr->uNumItem - nItem - 1) * sizeof(HEADER_ITEM));
1014 }
Eric Kohl8d2933d1998-11-22 18:12:12 +00001015 }
Vincent Béron9a624912002-05-31 23:06:46 +00001016
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001017 Free (oldItems);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001018 }
1019
Robert Shearmanf644c782003-05-22 03:34:54 +00001020 for (i=0; i < infoPtr->uNumItem; i++)
1021 {
1022 if (infoPtr->items[i].iOrder >= iOrder)
1023 infoPtr->items[i].iOrder++;
1024 }
1025
Bill Medland69f18272002-07-16 01:14:46 +00001026 lpItem = &infoPtr->items[nItem];
Eric Kohl8d2933d1998-11-22 18:12:12 +00001027 lpItem->bDown = FALSE;
1028
1029 if (phdi->mask & HDI_WIDTH)
1030 lpItem->cxy = phdi->cxy;
1031
1032 if (phdi->mask & HDI_TEXT) {
Alexandre Julliard6691fa81999-05-22 15:59:09 +00001033 WCHAR wide_null_char = 0;
Alexandre Julliard60e414f1999-04-24 11:51:13 +00001034 if (!phdi->pszText) /* null pointer check */
Vincent Béron9a624912002-05-31 23:06:46 +00001035 phdi->pszText = &wide_null_char;
Alexandre Julliard6691fa81999-05-22 15:59:09 +00001036 if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
Alexandre Julliardc7e7df82000-08-14 14:41:19 +00001037 len = strlenW (phdi->pszText);
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001038 lpItem->pszText = Alloc ((len+1)*sizeof(WCHAR));
Alexandre Julliardc7e7df82000-08-14 14:41:19 +00001039 strcpyW (lpItem->pszText, phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001040 }
1041 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001042 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001043 }
1044
1045 if (phdi->mask & HDI_FORMAT)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001046 lpItem->fmt = phdi->fmt;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001047
Eric Kohl54d9f791998-10-11 13:20:06 +00001048 if (lpItem->fmt == 0)
1049 lpItem->fmt = HDF_LEFT;
1050
Huw D M Daviesb3b0ddb2002-04-03 22:43:27 +00001051 if (!(lpItem->fmt &HDF_STRING) && (phdi->mask & HDI_TEXT))
1052 {
1053 lpItem->fmt |= HDF_STRING;
1054 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001055 if (phdi->mask & HDI_BITMAP)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001056 lpItem->hbm = phdi->hbm;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001057
1058 if (phdi->mask & HDI_LPARAM)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001059 lpItem->lParam = phdi->lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001060
1061 if (phdi->mask & HDI_IMAGE)
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001062 lpItem->iImage = phdi->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001063
Robert Shearmanf644c782003-05-22 03:34:54 +00001064 lpItem->iOrder = iOrder;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001065
Eric Kohlcad17ff1999-03-12 17:42:50 +00001066 HEADER_SetItemBounds (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001067
Chris Morgan3cbc1682000-06-04 01:34:31 +00001068 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001069
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001070 return nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001071}
1072
1073
1074static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001075HEADER_Layout (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001076{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001077 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001078 LPHDLAYOUT lpLayout = (LPHDLAYOUT)lParam;
1079
Eric Kohlcad17ff1999-03-12 17:42:50 +00001080 lpLayout->pwpos->hwnd = hwnd;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001081 lpLayout->pwpos->hwndInsertAfter = 0;
1082 lpLayout->pwpos->x = lpLayout->prc->left;
1083 lpLayout->pwpos->y = lpLayout->prc->top;
1084 lpLayout->pwpos->cx = lpLayout->prc->right - lpLayout->prc->left;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001085 if (GetWindowLongA (hwnd, GWL_STYLE) & HDS_HIDDEN)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001086 lpLayout->pwpos->cy = 0;
Martin Fuchs33bdf532000-04-28 14:46:36 +00001087 else {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001088 lpLayout->pwpos->cy = infoPtr->nHeight;
Martin Fuchs33bdf532000-04-28 14:46:36 +00001089 lpLayout->prc->top += infoPtr->nHeight;
1090 }
Alexandre Julliardebfc0fe1998-06-28 18:40:26 +00001091 lpLayout->pwpos->flags = SWP_NOZORDER;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001092
Alexandre Julliarda099a551999-06-12 15:45:58 +00001093 TRACE("Layout x=%d y=%d cx=%d cy=%d\n",
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001094 lpLayout->pwpos->x, lpLayout->pwpos->y,
1095 lpLayout->pwpos->cx, lpLayout->pwpos->cy);
1096
Martin Fuchs33bdf532000-04-28 14:46:36 +00001097 infoPtr->bRectsValid = FALSE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001098
1099 return TRUE;
1100}
1101
1102
1103static LRESULT
Eric Kohl4718b6d2000-12-13 01:52:23 +00001104HEADER_SetImageList (HWND hwnd, HIMAGELIST himl)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001105{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001106 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001107 HIMAGELIST himlOld;
1108
Eric Kohl4718b6d2000-12-13 01:52:23 +00001109 TRACE("(himl 0x%x)\n", (int)himl);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001110 himlOld = infoPtr->himl;
Eric Kohl4718b6d2000-12-13 01:52:23 +00001111 infoPtr->himl = himl;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001112
1113 /* FIXME: Refresh needed??? */
1114
1115 return (LRESULT)himlOld;
1116}
1117
1118
1119static LRESULT
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +00001120HEADER_GetBitmapMargin(HWND hwnd)
1121{
1122 HEADER_INFO *infoPtr = HEADER_GetInfoPtr(hwnd);
1123
1124 return infoPtr->iMargin;
1125}
1126
1127static LRESULT
1128HEADER_SetBitmapMargin(HWND hwnd, WPARAM wParam)
1129{
1130 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1131 INT oldMargin = infoPtr->iMargin;
1132
1133 infoPtr->iMargin = (INT)wParam;
1134
1135 return oldMargin;
1136}
1137
1138static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001139HEADER_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001140{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001141 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001142 HDITEMA *phdi = (HDITEMA*)lParam;
1143 INT nItem = (INT)wParam;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001144 HEADER_ITEM *lpItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001145
Alexandre Julliarda0d77311998-09-13 16:32:00 +00001146 if (phdi == NULL)
1147 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001148 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001149 return FALSE;
1150
Alexandre Julliarda099a551999-06-12 15:45:58 +00001151 TRACE("[nItem=%d]\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001152
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001153 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem, phdi->mask))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001154 return FALSE;
1155
Bill Medland69f18272002-07-16 01:14:46 +00001156 lpItem = &infoPtr->items[nItem];
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001157 if (phdi->mask & HDI_BITMAP)
1158 lpItem->hbm = phdi->hbm;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001159
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001160 if (phdi->mask & HDI_FORMAT)
1161 lpItem->fmt = phdi->fmt;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001162
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001163 if (phdi->mask & HDI_LPARAM)
1164 lpItem->lParam = phdi->lParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001165
1166 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001167 if (phdi->pszText != LPSTR_TEXTCALLBACKA) {
Eric Kohl8d2933d1998-11-22 18:12:12 +00001168 if (lpItem->pszText) {
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001169 Free (lpItem->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001170 lpItem->pszText = NULL;
1171 }
1172 if (phdi->pszText) {
Eric Kohl40f29ee2000-11-25 03:07:01 +00001173 INT len = MultiByteToWideChar (CP_ACP,0,phdi->pszText,-1,NULL,0);
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001174 lpItem->pszText = Alloc( len*sizeof(WCHAR) );
Eric Kohl40f29ee2000-11-25 03:07:01 +00001175 MultiByteToWideChar (CP_ACP,0,phdi->pszText,-1,lpItem->pszText,len);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001176 }
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001177 }
1178 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001179 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001180 }
1181
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001182 if (phdi->mask & HDI_WIDTH)
1183 lpItem->cxy = phdi->cxy;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001184
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001185 if (phdi->mask & HDI_IMAGE)
1186 lpItem->iImage = phdi->iImage;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001187
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001188 if (phdi->mask & HDI_ORDER)
Uwe Bonnes018c6542000-10-19 22:26:17 +00001189 {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001190 lpItem->iOrder = phdi->iOrder;
Uwe Bonnes018c6542000-10-19 22:26:17 +00001191 }
1192 else
1193 lpItem->iOrder = nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001194
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001195 HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem, phdi->mask);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001196
Eric Kohlcad17ff1999-03-12 17:42:50 +00001197 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001198
1199 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001200
1201 return TRUE;
1202}
1203
1204
1205static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001206HEADER_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +00001207{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001208 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001209 HDITEMW *phdi = (HDITEMW*)lParam;
1210 INT nItem = (INT)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001211 HEADER_ITEM *lpItem;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001212
1213 if (phdi == NULL)
1214 return FALSE;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001215 if ((nItem < 0) || (nItem >= (INT)infoPtr->uNumItem))
Eric Kohl8d2933d1998-11-22 18:12:12 +00001216 return FALSE;
1217
Alexandre Julliarda099a551999-06-12 15:45:58 +00001218 TRACE("[nItem=%d]\n", nItem);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001219
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001220 if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGW, nItem, phdi->mask))
Eric Kohl8d2933d1998-11-22 18:12:12 +00001221 return FALSE;
1222
Bill Medland69f18272002-07-16 01:14:46 +00001223 lpItem = &infoPtr->items[nItem];
Eric Kohl8d2933d1998-11-22 18:12:12 +00001224 if (phdi->mask & HDI_BITMAP)
1225 lpItem->hbm = phdi->hbm;
1226
1227 if (phdi->mask & HDI_FORMAT)
1228 lpItem->fmt = phdi->fmt;
1229
1230 if (phdi->mask & HDI_LPARAM)
1231 lpItem->lParam = phdi->lParam;
1232
1233 if (phdi->mask & HDI_TEXT) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001234 if (phdi->pszText != LPSTR_TEXTCALLBACKW) {
Eric Kohl8d2933d1998-11-22 18:12:12 +00001235 if (lpItem->pszText) {
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001236 Free (lpItem->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001237 lpItem->pszText = NULL;
1238 }
1239 if (phdi->pszText) {
Alexandre Julliardc7e7df82000-08-14 14:41:19 +00001240 INT len = strlenW (phdi->pszText);
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001241 lpItem->pszText = Alloc ((len+1)*sizeof(WCHAR));
Alexandre Julliardc7e7df82000-08-14 14:41:19 +00001242 strcpyW (lpItem->pszText, phdi->pszText);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001243 }
1244 }
1245 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001246 lpItem->pszText = LPSTR_TEXTCALLBACKW;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001247 }
1248
1249 if (phdi->mask & HDI_WIDTH)
1250 lpItem->cxy = phdi->cxy;
1251
1252 if (phdi->mask & HDI_IMAGE)
1253 lpItem->iImage = phdi->iImage;
1254
1255 if (phdi->mask & HDI_ORDER)
Uwe Bonnes018c6542000-10-19 22:26:17 +00001256 {
Eric Kohl8d2933d1998-11-22 18:12:12 +00001257 lpItem->iOrder = phdi->iOrder;
Uwe Bonnes018c6542000-10-19 22:26:17 +00001258 }
1259 else
1260 lpItem->iOrder = nItem;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001261
Dimitrie O. Paunf8514f52002-10-21 18:22:51 +00001262 HEADER_SendHeaderNotify(hwnd, HDN_ITEMCHANGEDW, nItem, phdi->mask);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001263
Eric Kohlcad17ff1999-03-12 17:42:50 +00001264 HEADER_SetItemBounds (hwnd);
Chris Morgan3cbc1682000-06-04 01:34:31 +00001265
1266 InvalidateRect(hwnd, NULL, FALSE);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001267
1268 return TRUE;
1269}
1270
Patrik Stridvall896889f1999-05-08 12:50:36 +00001271inline static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001272HEADER_SetUnicodeFormat (HWND hwnd, WPARAM wParam)
Eric Kohl8d2933d1998-11-22 18:12:12 +00001273{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001274 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001275 BOOL bTemp = infoPtr->bUnicode;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001276
Alexandre Julliarda3960291999-02-26 11:11:13 +00001277 infoPtr->bUnicode = (BOOL)wParam;
Eric Kohl8d2933d1998-11-22 18:12:12 +00001278
1279 return bTemp;
1280}
1281
1282
1283static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001284HEADER_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001285{
1286 HEADER_INFO *infoPtr;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001287 TEXTMETRICA tm;
1288 HFONT hOldFont;
1289 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001290
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001291 infoPtr = (HEADER_INFO *)Alloc (sizeof(HEADER_INFO));
Robert Shearmancdb263e2004-08-25 17:33:01 +00001292 SetWindowLongPtrA (hwnd, 0, (DWORD_PTR)infoPtr);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001293
Dimitrie O. Paunc5940432003-11-20 22:04:13 +00001294 infoPtr->hwndNotify = ((LPCREATESTRUCTA)lParam)->hwndParent;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001295 infoPtr->uNumItem = 0;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001296 infoPtr->hFont = 0;
1297 infoPtr->items = 0;
Martin Fuchs33bdf532000-04-28 14:46:36 +00001298 infoPtr->bRectsValid = FALSE;
Alexandre Julliardcf526442003-09-10 03:56:47 +00001299 infoPtr->hcurArrow = LoadCursorA (0, (LPSTR)IDC_ARROW);
Eric Kohldbbc2242000-11-09 20:26:34 +00001300 infoPtr->hcurDivider = LoadCursorA (COMCTL32_hModule, MAKEINTRESOURCEA(IDC_DIVIDER));
1301 infoPtr->hcurDivopen = LoadCursorA (COMCTL32_hModule, MAKEINTRESOURCEA(IDC_DIVIDEROPEN));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001302 infoPtr->bPressed = FALSE;
1303 infoPtr->bTracking = FALSE;
1304 infoPtr->iMoveItem = 0;
1305 infoPtr->himl = 0;
1306 infoPtr->iHotItem = -1;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001307 infoPtr->bUnicode = IsWindowUnicode (hwnd);
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +00001308 infoPtr->iMargin = 3*GetSystemMetrics(SM_CXEDGE);
Eric Kohl40f29ee2000-11-25 03:07:01 +00001309 infoPtr->nNotifyFormat =
1310 SendMessageA (infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_QUERY);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001311
Alexandre Julliarda3960291999-02-26 11:11:13 +00001312 hdc = GetDC (0);
1313 hOldFont = SelectObject (hdc, GetStockObject (SYSTEM_FONT));
1314 GetTextMetricsA (hdc, &tm);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001315 infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001316 SelectObject (hdc, hOldFont);
1317 ReleaseDC (0, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001318
1319 return 0;
1320}
1321
1322
1323static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001324HEADER_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001325{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001326 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001327 HEADER_ITEM *lpItem;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001328 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001329
1330 if (infoPtr->items) {
Bill Medland69f18272002-07-16 01:14:46 +00001331 lpItem = infoPtr->items;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001332 for (nItem = 0; nItem < infoPtr->uNumItem; nItem++, lpItem++) {
Alexandre Julliarda3960291999-02-26 11:11:13 +00001333 if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACKW))
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001334 Free (lpItem->pszText);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001335 }
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001336 Free (infoPtr->items);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001337 }
1338
1339 if (infoPtr->himl)
1340 ImageList_Destroy (infoPtr->himl);
1341
Dimitrie O. Paun7de279a2003-09-22 21:32:33 +00001342 Free (infoPtr);
Robert Shearmancdb263e2004-08-25 17:33:01 +00001343 SetWindowLongPtrA (hwnd, 0, 0);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001344 return 0;
1345}
1346
1347
Patrik Stridvall896889f1999-05-08 12:50:36 +00001348static inline LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001349HEADER_GetFont (HWND hwnd)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001350{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001351 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001352
1353 return (LRESULT)infoPtr->hFont;
1354}
1355
1356
1357static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001358HEADER_LButtonDblClk (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001359{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001360 POINT pt;
1361 UINT flags;
1362 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001363
Vincent Béron9a624912002-05-31 23:06:46 +00001364 pt.x = (INT)LOWORD(lParam);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001365 pt.y = (INT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001366 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001367
Eric Kohlcad17ff1999-03-12 17:42:50 +00001368 if ((GetWindowLongA (hwnd, GWL_STYLE) & HDS_BUTTONS) && (flags == HHT_ONHEADER))
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001369 HEADER_SendHeaderNotify (hwnd, HDN_ITEMDBLCLICKA, nItem,0);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001370 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN))
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001371 HEADER_SendHeaderNotify (hwnd, HDN_DIVIDERDBLCLICKA, nItem,0);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001372
1373 return 0;
1374}
1375
1376
1377static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001378HEADER_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001379{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001380 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1381 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001382 POINT pt;
1383 UINT flags;
1384 INT nItem;
1385 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001386
Vincent Béron9a624912002-05-31 23:06:46 +00001387 pt.x = (INT)LOWORD(lParam);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001388 pt.y = (INT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001389 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001390
Eric Kohlcad17ff1999-03-12 17:42:50 +00001391 if ((dwStyle & HDS_BUTTONS) && (flags == HHT_ONHEADER)) {
1392 SetCapture (hwnd);
Vincent Béron9a624912002-05-31 23:06:46 +00001393 infoPtr->bCaptured = TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001394 infoPtr->bPressed = TRUE;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001395 infoPtr->iMoveItem = nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001396
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001397 infoPtr->items[nItem].bDown = TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001398
1399 /* Send WM_CUSTOMDRAW */
Eric Kohlcad17ff1999-03-12 17:42:50 +00001400 hdc = GetDC (hwnd);
1401 HEADER_RefreshItem (hwnd, hdc, nItem);
1402 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001403
Alexandre Julliarda099a551999-06-12 15:45:58 +00001404 TRACE("Pressed item %d!\n", nItem);
Vincent Béron9a624912002-05-31 23:06:46 +00001405 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001406 else if ((flags == HHT_ONDIVIDER) || (flags == HHT_ONDIVOPEN)) {
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001407 if (!(HEADER_SendHeaderNotify (hwnd, HDN_BEGINTRACKA, nItem,0))) {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001408 SetCapture (hwnd);
Vincent Béron9a624912002-05-31 23:06:46 +00001409 infoPtr->bCaptured = TRUE;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001410 infoPtr->bTracking = TRUE;
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001411 infoPtr->iMoveItem = nItem;
1412 infoPtr->nOldWidth = infoPtr->items[nItem].cxy;
1413 infoPtr->xTrackOffset = infoPtr->items[nItem].rect.right - pt.x;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001414
Eric Kohlcad17ff1999-03-12 17:42:50 +00001415 if (!(dwStyle & HDS_FULLDRAG)) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001416 infoPtr->xOldTrack = infoPtr->items[nItem].rect.right;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001417 hdc = GetDC (hwnd);
1418 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
1419 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001420 }
1421
Alexandre Julliarda099a551999-06-12 15:45:58 +00001422 TRACE("Begin tracking item %d!\n", nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001423 }
1424 }
1425
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001426 return 0;
1427}
1428
1429
1430static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001431HEADER_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001432{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001433 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Aric Stewart3054b762000-06-11 20:39:14 +00001434 /*
1435 *DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
1436 */
Alexandre Julliarda3960291999-02-26 11:11:13 +00001437 POINT pt;
1438 UINT flags;
1439 INT nItem, nWidth;
1440 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001441
Alexandre Julliard9d615962003-09-17 04:28:28 +00001442 pt.x = (INT)(SHORT)LOWORD(lParam);
1443 pt.y = (INT)(SHORT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001444 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001445
1446 if (infoPtr->bPressed) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001447 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001448 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001449 hdc = GetDC (hwnd);
1450 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
1451 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001452
Eric Kohlcad17ff1999-03-12 17:42:50 +00001453 HEADER_SendClickNotify (hwnd, HDN_ITEMCLICKA, infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001454 }
Uwe Bonnes018c6542000-10-19 22:26:17 +00001455 else if (flags == HHT_ONHEADER)
1456 {
1457 HEADER_ITEM *lpItem;
1458 INT newindex = HEADER_IndexToOrder(hwnd,nItem);
1459 INT oldindex = HEADER_IndexToOrder(hwnd,infoPtr->iMoveItem);
1460
1461 TRACE("Exchanging [index:order] [%d:%d] [%d:%d]\n",
1462 infoPtr->iMoveItem,oldindex,nItem,newindex);
Bill Medland69f18272002-07-16 01:14:46 +00001463 lpItem= &infoPtr->items[nItem];
Uwe Bonnes018c6542000-10-19 22:26:17 +00001464 lpItem->iOrder=oldindex;
1465
Bill Medland69f18272002-07-16 01:14:46 +00001466 lpItem= &infoPtr->items[infoPtr->iMoveItem];
Uwe Bonnes018c6542000-10-19 22:26:17 +00001467 lpItem->iOrder = newindex;
1468
1469 infoPtr->bRectsValid = FALSE;
1470 InvalidateRect(hwnd, NULL, FALSE);
1471 /* FIXME: Should some WM_NOTIFY be sent */
Vincent Béron9a624912002-05-31 23:06:46 +00001472 }
Uwe Bonnes018c6542000-10-19 22:26:17 +00001473
Alexandre Julliarda099a551999-06-12 15:45:58 +00001474 TRACE("Released item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001475 infoPtr->bPressed = FALSE;
1476 }
1477 else if (infoPtr->bTracking) {
Alexandre Julliarda099a551999-06-12 15:45:58 +00001478 TRACE("End tracking item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001479 infoPtr->bTracking = FALSE;
1480
Ulrich Czekalla361eebb2000-12-15 20:54:41 +00001481 HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem,HDI_WIDTH);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001482
Aric Stewart3054b762000-06-11 20:39:14 +00001483 /*
1484 * we want to do this even for HDS_FULLDRAG because this is where
1485 * we send the HDN_ITEMCHANGING and HDN_ITEMCHANGED notifications
1486 *
1487 * if (!(dwStyle & HDS_FULLDRAG)) {
1488 */
1489
Eric Kohlcad17ff1999-03-12 17:42:50 +00001490 hdc = GetDC (hwnd);
1491 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
Aric Stewart3054b762000-06-11 20:39:14 +00001492 ReleaseDC (hwnd, hdc);
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001493 if (HEADER_SendHeaderNotify(hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem, HDI_WIDTH))
Eric Kohl4718b6d2000-12-13 01:52:23 +00001494 {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001495 infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
Eric Kohl4718b6d2000-12-13 01:52:23 +00001496 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001497 else {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001498 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001499 if (nWidth < 0)
1500 nWidth = 0;
1501 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
Aric Stewart3054b762000-06-11 20:39:14 +00001502 }
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001503
Eric Kohlcad17ff1999-03-12 17:42:50 +00001504 HEADER_SetItemBounds (hwnd);
Vitaliy Margolen4cf764f2004-09-13 18:05:02 +00001505 InvalidateRect(hwnd, NULL, TRUE);
1506 HEADER_SendHeaderNotify(hwnd, HDN_ITEMCHANGEDA, infoPtr->iMoveItem, HDI_WIDTH);
Vincent Béron9a624912002-05-31 23:06:46 +00001507 /*
Aric Stewart3054b762000-06-11 20:39:14 +00001508 * }
1509 */
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001510 }
1511
1512 if (infoPtr->bCaptured) {
1513 infoPtr->bCaptured = FALSE;
1514 ReleaseCapture ();
Eric Kohlcad17ff1999-03-12 17:42:50 +00001515 HEADER_SendSimpleNotify (hwnd, NM_RELEASEDCAPTURE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001516 }
1517
1518 return 0;
1519}
1520
1521
1522static LRESULT
Eric Kohl40f29ee2000-11-25 03:07:01 +00001523HEADER_NotifyFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
1524{
1525 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1526
1527 switch (lParam)
1528 {
1529 case NF_QUERY:
1530 return infoPtr->nNotifyFormat;
1531
1532 case NF_REQUERY:
1533 infoPtr->nNotifyFormat =
1534 SendMessageA ((HWND)wParam, WM_NOTIFYFORMAT,
1535 (WPARAM)hwnd, (LPARAM)NF_QUERY);
1536 return infoPtr->nNotifyFormat;
1537 }
1538
1539 return 0;
1540}
1541
1542
1543static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001544HEADER_MouseMove (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001545{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001546 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
1547 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001548 POINT pt;
1549 UINT flags;
1550 INT nItem, nWidth;
1551 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001552
Alexandre Julliard9d615962003-09-17 04:28:28 +00001553 pt.x = (INT)(SHORT)LOWORD(lParam);
1554 pt.y = (INT)(SHORT)HIWORD(lParam);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001555 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001556
Eric Kohlcad17ff1999-03-12 17:42:50 +00001557 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001558 if (flags & (HHT_ONHEADER | HHT_ONDIVIDER | HHT_ONDIVOPEN))
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001559 infoPtr->iHotItem = nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001560 else
1561 infoPtr->iHotItem = -1;
Chris Morgan3cbc1682000-06-04 01:34:31 +00001562 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001563 }
1564
1565 if (infoPtr->bCaptured) {
1566 if (infoPtr->bPressed) {
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001567 if ((nItem == infoPtr->iMoveItem) && (flags == HHT_ONHEADER))
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001568 infoPtr->items[infoPtr->iMoveItem].bDown = TRUE;
1569 else
1570 infoPtr->items[infoPtr->iMoveItem].bDown = FALSE;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001571 hdc = GetDC (hwnd);
1572 HEADER_RefreshItem (hwnd, hdc, infoPtr->iMoveItem);
1573 ReleaseDC (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001574
Alexandre Julliarda099a551999-06-12 15:45:58 +00001575 TRACE("Moving pressed item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001576 }
1577 else if (infoPtr->bTracking) {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001578 if (dwStyle & HDS_FULLDRAG) {
Vitaliy Margolen4cf764f2004-09-13 18:05:02 +00001579 if (HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem, HDI_WIDTH))
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001580 {
Aric Stewart3054b762000-06-11 20:39:14 +00001581 nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
1582 if (nWidth < 0)
1583 nWidth = 0;
1584 infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001585 HEADER_SendHeaderNotify(hwnd, HDN_ITEMCHANGEDA, infoPtr->iMoveItem, HDI_WIDTH);
1586 }
Eric Kohlcad17ff1999-03-12 17:42:50 +00001587 HEADER_SetItemBounds (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001588 }
1589 else {
Eric Kohlcad17ff1999-03-12 17:42:50 +00001590 hdc = GetDC (hwnd);
1591 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001592 infoPtr->xOldTrack = pt.x + infoPtr->xTrackOffset;
1593 if (infoPtr->xOldTrack < infoPtr->items[infoPtr->iMoveItem].rect.left)
1594 infoPtr->xOldTrack = infoPtr->items[infoPtr->iMoveItem].rect.left;
Vincent Béron9a624912002-05-31 23:06:46 +00001595 infoPtr->items[infoPtr->iMoveItem].cxy =
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001596 infoPtr->xOldTrack - infoPtr->items[infoPtr->iMoveItem].rect.left;
Eric Kohlcad17ff1999-03-12 17:42:50 +00001597 HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
1598 ReleaseDC (hwnd, hdc);
Ulrich Czekallaf235a7b2000-11-25 01:25:46 +00001599 HEADER_SendHeaderNotify (hwnd, HDN_TRACKA, infoPtr->iMoveItem, HDI_WIDTH);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001600 }
1601
Alexandre Julliarda099a551999-06-12 15:45:58 +00001602 TRACE("Tracking item %d!\n", infoPtr->iMoveItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001603 }
1604 }
1605
Eric Kohlcad17ff1999-03-12 17:42:50 +00001606 if ((dwStyle & HDS_BUTTONS) && (dwStyle & HDS_HOTTRACK)) {
Alexandre Julliarda099a551999-06-12 15:45:58 +00001607 FIXME("hot track support!\n");
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001608 }
1609
1610 return 0;
1611}
1612
1613
1614static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001615HEADER_Paint (HWND hwnd, WPARAM wParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001616{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001617 HDC hdc;
1618 PAINTSTRUCT ps;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001619
Eric Kohlcad17ff1999-03-12 17:42:50 +00001620 hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam;
1621 HEADER_Refresh (hwnd, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001622 if(!wParam)
Eric Kohlcad17ff1999-03-12 17:42:50 +00001623 EndPaint (hwnd, &ps);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001624 return 0;
1625}
1626
1627
1628static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001629HEADER_RButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001630{
Pascal Lessardce527de2000-02-29 22:04:00 +00001631 BOOL bRet;
1632 POINT pt;
1633
1634 pt.x = LOWORD(lParam);
1635 pt.y = HIWORD(lParam);
1636
1637 /* Send a Notify message */
1638 bRet = HEADER_SendSimpleNotify (hwnd, NM_RCLICK);
1639
1640 /* Change to screen coordinate for WM_CONTEXTMENU */
1641 ClientToScreen(hwnd, &pt);
1642
1643 /* Send a WM_CONTEXTMENU message in response to the RBUTTONUP */
1644 SendMessageA( hwnd, WM_CONTEXTMENU, (WPARAM) hwnd, MAKELPARAM(pt.x, pt.y));
Vincent Béron9a624912002-05-31 23:06:46 +00001645
Pascal Lessardce527de2000-02-29 22:04:00 +00001646 return bRet;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001647}
1648
1649
1650static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001651HEADER_SetCursor (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001652{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001653 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001654 POINT pt;
1655 UINT flags;
1656 INT nItem;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001657
Alexandre Julliarda099a551999-06-12 15:45:58 +00001658 TRACE("code=0x%X id=0x%X\n", LOWORD(lParam), HIWORD(lParam));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001659
Alexandre Julliarda3960291999-02-26 11:11:13 +00001660 GetCursorPos (&pt);
Eric Kohlcad17ff1999-03-12 17:42:50 +00001661 ScreenToClient (hwnd, &pt);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001662
Eric Kohlcad17ff1999-03-12 17:42:50 +00001663 HEADER_InternalHitTest (hwnd, &pt, &flags, &nItem);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001664
1665 if (flags == HHT_ONDIVIDER)
Alexandre Julliarda3960291999-02-26 11:11:13 +00001666 SetCursor (infoPtr->hcurDivider);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001667 else if (flags == HHT_ONDIVOPEN)
Alexandre Julliarda3960291999-02-26 11:11:13 +00001668 SetCursor (infoPtr->hcurDivopen);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001669 else
Alexandre Julliarda3960291999-02-26 11:11:13 +00001670 SetCursor (infoPtr->hcurArrow);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001671
1672 return 0;
1673}
1674
1675
1676static LRESULT
Eric Kohlcad17ff1999-03-12 17:42:50 +00001677HEADER_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001678{
Eric Kohlcad17ff1999-03-12 17:42:50 +00001679 HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001680 TEXTMETRICA tm;
1681 HFONT hFont, hOldFont;
1682 HDC hdc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001683
Alexandre Julliarda3960291999-02-26 11:11:13 +00001684 infoPtr->hFont = (HFONT)wParam;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001685
Alexandre Julliarda3960291999-02-26 11:11:13 +00001686 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject (SYSTEM_FONT);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001687
Alexandre Julliarda3960291999-02-26 11:11:13 +00001688 hdc = GetDC (0);
1689 hOldFont = SelectObject (hdc, hFont);
1690 GetTextMetricsA (hdc, &tm);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001691 infoPtr->nHeight = tm.tmHeight + VERT_BORDER;
Alexandre Julliarda3960291999-02-26 11:11:13 +00001692 SelectObject (hdc, hOldFont);
1693 ReleaseDC (0, hdc);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001694
Martin Fuchs33bdf532000-04-28 14:46:36 +00001695 infoPtr->bRectsValid = FALSE;
Vincent Béron9a624912002-05-31 23:06:46 +00001696
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001697 if (lParam) {
Chris Morgan3cbc1682000-06-04 01:34:31 +00001698 InvalidateRect(hwnd, NULL, FALSE);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001699 }
1700
1701 return 0;
1702}
1703
1704
Patrik Stridvall26ffb3c1999-07-31 14:41:43 +00001705static LRESULT WINAPI
Alexandre Julliarda3960291999-02-26 11:11:13 +00001706HEADER_WindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001707{
Michael Stefaniuc353529b2002-10-23 22:19:10 +00001708 TRACE("hwnd=%p msg=%x wparam=%x lParam=%lx\n", hwnd, msg, wParam, lParam);
Gerard Patela1b2fc22000-05-10 01:34:53 +00001709 if (!HEADER_GetInfoPtr (hwnd) && (msg != WM_CREATE))
1710 return DefWindowProcA (hwnd, msg, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001711 switch (msg) {
Eric Kohl40f29ee2000-11-25 03:07:01 +00001712/* case HDM_CLEARFILTER: */
1713
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001714 case HDM_CREATEDRAGIMAGE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001715 return HEADER_CreateDragImage (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001716
1717 case HDM_DELETEITEM:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001718 return HEADER_DeleteItem (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001719
Eric Kohl40f29ee2000-11-25 03:07:01 +00001720/* case HDM_EDITFILTER: */
1721
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +00001722 case HDM_GETBITMAPMARGIN:
1723 return HEADER_GetBitmapMargin(hwnd);
Eric Kohl40f29ee2000-11-25 03:07:01 +00001724
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001725 case HDM_GETIMAGELIST:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001726 return HEADER_GetImageList (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001727
Alexandre Julliarda3960291999-02-26 11:11:13 +00001728 case HDM_GETITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001729 return HEADER_GetItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001730
Alexandre Julliarda3960291999-02-26 11:11:13 +00001731 case HDM_GETITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001732 return HEADER_GetItemW (hwnd, wParam, lParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001733
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001734 case HDM_GETITEMCOUNT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001735 return HEADER_GetItemCount (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001736
1737 case HDM_GETITEMRECT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001738 return HEADER_GetItemRect (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001739
Vincent Béron9a624912002-05-31 23:06:46 +00001740 case HDM_GETORDERARRAY:
Uwe Bonnes018c6542000-10-19 22:26:17 +00001741 return HEADER_GetOrderArray(hwnd, wParam, lParam);
1742
Eric Kohl8d2933d1998-11-22 18:12:12 +00001743 case HDM_GETUNICODEFORMAT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001744 return HEADER_GetUnicodeFormat (hwnd);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001745
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001746 case HDM_HITTEST:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001747 return HEADER_HitTest (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001748
Alexandre Julliarda3960291999-02-26 11:11:13 +00001749 case HDM_INSERTITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001750 return HEADER_InsertItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001751
Alexandre Julliarda3960291999-02-26 11:11:13 +00001752 case HDM_INSERTITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001753 return HEADER_InsertItemW (hwnd, wParam, lParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001754
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001755 case HDM_LAYOUT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001756 return HEADER_Layout (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001757
Eric Kohl40f29ee2000-11-25 03:07:01 +00001758 case HDM_ORDERTOINDEX:
1759 return HEADER_OrderToIndex(hwnd, wParam);
1760
Maxime Bellengé5b99b3d2003-10-14 20:13:42 +00001761 case HDM_SETBITMAPMARGIN:
1762 return HEADER_SetBitmapMargin(hwnd, wParam);
Eric Kohl40f29ee2000-11-25 03:07:01 +00001763
1764/* case HDM_SETFILTERCHANGETIMEOUT: */
1765
1766/* case HDM_SETHOTDIVIDER: */
1767
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001768 case HDM_SETIMAGELIST:
Eric Kohl4718b6d2000-12-13 01:52:23 +00001769 return HEADER_SetImageList (hwnd, (HIMAGELIST)lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001770
Alexandre Julliarda3960291999-02-26 11:11:13 +00001771 case HDM_SETITEMA:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001772 return HEADER_SetItemA (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001773
Alexandre Julliarda3960291999-02-26 11:11:13 +00001774 case HDM_SETITEMW:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001775 return HEADER_SetItemW (hwnd, wParam, lParam);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001776
Eric Kohl40f29ee2000-11-25 03:07:01 +00001777 case HDM_SETORDERARRAY:
1778 return HEADER_SetOrderArray(hwnd, wParam, lParam);
1779
Eric Kohl8d2933d1998-11-22 18:12:12 +00001780 case HDM_SETUNICODEFORMAT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001781 return HEADER_SetUnicodeFormat (hwnd, wParam);
Alexandre Julliardd30dfd21998-09-27 18:28:36 +00001782
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001783 case WM_CREATE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001784 return HEADER_Create (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001785
1786 case WM_DESTROY:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001787 return HEADER_Destroy (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001788
1789 case WM_ERASEBKGND:
1790 return 1;
1791
1792 case WM_GETDLGCODE:
1793 return DLGC_WANTTAB | DLGC_WANTARROWS;
1794
1795 case WM_GETFONT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001796 return HEADER_GetFont (hwnd);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001797
1798 case WM_LBUTTONDBLCLK:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001799 return HEADER_LButtonDblClk (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001800
1801 case WM_LBUTTONDOWN:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001802 return HEADER_LButtonDown (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001803
1804 case WM_LBUTTONUP:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001805 return HEADER_LButtonUp (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001806
1807 case WM_MOUSEMOVE:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001808 return HEADER_MouseMove (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001809
Eric Kohl40f29ee2000-11-25 03:07:01 +00001810 case WM_NOTIFYFORMAT:
1811 return HEADER_NotifyFormat (hwnd, wParam, lParam);
Eric Kohl8d2933d1998-11-22 18:12:12 +00001812
Martin Fuchs33bdf532000-04-28 14:46:36 +00001813 case WM_SIZE:
1814 return HEADER_Size (hwnd, wParam);
Vincent Béron9a624912002-05-31 23:06:46 +00001815
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001816 case WM_PAINT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001817 return HEADER_Paint (hwnd, wParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001818
1819 case WM_RBUTTONUP:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001820 return HEADER_RButtonUp (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001821
1822 case WM_SETCURSOR:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001823 return HEADER_SetCursor (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001824
1825 case WM_SETFONT:
Eric Kohlcad17ff1999-03-12 17:42:50 +00001826 return HEADER_SetFont (hwnd, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001827
1828 default:
Bill Medland69f18272002-07-16 01:14:46 +00001829 if ((msg >= WM_USER) && (msg < WM_APP))
Alexandre Julliarda099a551999-06-12 15:45:58 +00001830 ERR("unknown msg %04x wp=%04x lp=%08lx\n",
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001831 msg, wParam, lParam );
Alexandre Julliarda3960291999-02-26 11:11:13 +00001832 return DefWindowProcA (hwnd, msg, wParam, lParam);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001833 }
1834 return 0;
1835}
1836
1837
Eric Kohl9d8e8641998-10-24 10:49:27 +00001838VOID
Patrik Stridvall9e61c1c1999-06-12 08:27:49 +00001839HEADER_Register (void)
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001840{
Alexandre Julliarda3960291999-02-26 11:11:13 +00001841 WNDCLASSA wndClass;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001842
Alexandre Julliarda3960291999-02-26 11:11:13 +00001843 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001844 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
Robert Shearman8d28e032004-11-06 03:49:03 +00001845 wndClass.lpfnWndProc = HEADER_WindowProc;
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001846 wndClass.cbClsExtra = 0;
1847 wndClass.cbWndExtra = sizeof(HEADER_INFO *);
Alexandre Julliardcf526442003-09-10 03:56:47 +00001848 wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROW);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001849 wndClass.lpszClassName = WC_HEADERA;
Vincent Béron9a624912002-05-31 23:06:46 +00001850
Alexandre Julliarda3960291999-02-26 11:11:13 +00001851 RegisterClassA (&wndClass);
Alexandre Julliarddadf78f1998-05-17 17:13:43 +00001852}
1853
Eric Kohl9d8e8641998-10-24 10:49:27 +00001854
1855VOID
Patrik Stridvall9e61c1c1999-06-12 08:27:49 +00001856HEADER_Unregister (void)
Eric Kohl9d8e8641998-10-24 10:49:27 +00001857{
Francois Gougetd2667a42002-12-02 18:10:57 +00001858 UnregisterClassA (WC_HEADERA, NULL);
Eric Kohl9d8e8641998-10-24 10:49:27 +00001859}