Added xxx_Unregister() functions to all common controls.
[wine.git] / dlls / comctl32 / listview.c
blobaacbae19c615de7abcdaea09fee445a2d6c65da8
1 /*
2 * Listview control
4 * Copyright 1998 Eric Kohl
6 * NOTES
7 * This is just a dummy control. An author is needed! Any volunteers?
8 * I will only improve this control once in a while.
9 * Eric <ekohl@abo.rhein-zeitung.de>
11 * TODO:
12 * - Most messages.
13 * - Most notifications.
16 #include "windows.h"
17 #include "commctrl.h"
18 #include "listview.h"
19 #include "win.h"
20 #include "debug.h"
23 #define LISTVIEW_GetInfoPtr(wndPtr) ((LISTVIEW_INFO *)wndPtr->wExtra[0])
26 static VOID
27 LISTVIEW_Refresh (WND *wndPtr, HDC32 hdc)
29 // LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
37 // << LISTVIEW_ApproximateViewRect >>
38 // << LISTVIEW_Arrange >>
39 // << LISTVIEW_CreateDragImage >>
42 static LRESULT
43 LISTVIEW_DeleteAllItems (WND *wndPtr)
45 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
46 INT32 nItem;
47 LISTVIEW_ITEM *lpItem;
48 NMLISTVIEW nmlv;
49 BOOL32 bNotify;
51 if (infoPtr->nItemCount == 0)
52 return TRUE;
54 TRACE (listview, "\n");
56 /* send LVN_DELETEALLITEMS notification */
57 ZeroMemory (&nmlv, sizeof (NMLISTVIEW));
58 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
59 nmlv.hdr.idFrom = wndPtr->wIDmenu;
60 nmlv.hdr.code = LVN_DELETEALLITEMS;
61 nmlv.iItem = -1;
62 bNotify =
63 !(BOOL32)SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
64 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
66 nmlv.hdr.code = LVN_DELETEITEM;
68 for (nItem = 0; nItem < infoPtr->nItemCount; nItem++) {
69 /* send notification */
70 if (bNotify) {
71 nmlv.iItem = nItem;
72 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
73 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
76 /* get item pointer */
77 lpItem = (LISTVIEW_ITEM*)DPA_GetPtr (infoPtr->hdpaItems, nItem);
78 if (lpItem) {
79 /* delete item strings */
80 if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACK32A))
81 COMCTL32_Free (lpItem->pszText);
83 /* free item data */
84 COMCTL32_Free (lpItem);
88 DPA_DeleteAllPtrs (infoPtr->hdpaItems);
89 infoPtr->nItemCount = 0;
91 return TRUE;
95 static LRESULT
96 LISTVIEW_DeleteColumn (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
98 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
99 INT32 nColumn = (INT32)wParam;
101 /* FIXME ??? */
102 if (infoPtr->nItemCount > 0)
103 return FALSE;
105 if (!SendMessage32A (infoPtr->hwndHeader, HDM_DELETEITEM, wParam, 0))
106 return FALSE;
108 infoPtr->nColumnCount--;
110 FIXME (listview, "semi stub!\n");
112 return TRUE;
116 static LRESULT
117 LISTVIEW_DeleteItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
119 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
120 INT32 nItem = (INT32)wParam;
121 LISTVIEW_ITEM *lpItem;
122 NMLISTVIEW nmlv;
124 if ((nItem < 0) || (nItem >= infoPtr->nItemCount))
125 return FALSE;
127 TRACE (listview, "(%d)\n", nItem);
129 /* send notification */
130 ZeroMemory (&nmlv, sizeof (NMLISTVIEW));
131 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
132 nmlv.hdr.idFrom = wndPtr->wIDmenu;
133 nmlv.hdr.code = LVN_DELETEITEM;
134 nmlv.iItem = nItem;
135 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
136 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
138 /* remove from item array */
139 lpItem = (LISTVIEW_ITEM*)DPA_DeletePtr (infoPtr->hdpaItems, nItem);
141 /* delete item strings */
142 if ((lpItem->pszText) && (lpItem->pszText != LPSTR_TEXTCALLBACK32A))
143 COMCTL32_Free (lpItem->pszText);
145 /* free item data */
146 COMCTL32_Free (lpItem);
148 infoPtr->nItemCount--;
150 return TRUE;
154 // << LISTVIEW_EditLabel >>
155 // << LISTVIEW_EnsureVisible >>
156 // << LISTVIEW_FindItem >>
159 static LRESULT
160 LISTVIEW_GetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
162 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
164 return infoPtr->clrBk;
168 // << LISTVIEW_GetBkImage >>
169 // << LISTVIEW_GetCallbackMask >>
172 static LRESULT
173 LISTVIEW_GetColumn32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
175 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
176 LPLVCOLUMN32A lpcol = (LPLVCOLUMN32A)lParam;
177 INT32 nIndex = (INT32)wParam;
178 HDITEM32A hdi;
180 if (!lpcol)
181 return FALSE;
183 TRACE (listview, "(%d %p)\n", nIndex, lpcol);
185 ZeroMemory (&hdi, sizeof(HDITEM32A));
187 if (lpcol->mask & LVCF_FMT)
188 hdi.mask |= HDI_FORMAT;
190 if (lpcol->mask & LVCF_WIDTH)
191 hdi.mask |= HDI_WIDTH;
193 if (lpcol->mask & LVCF_TEXT)
194 hdi.mask |= (HDI_TEXT | HDI_FORMAT);
196 if (lpcol->mask & LVCF_IMAGE)
197 hdi.mask |= HDI_IMAGE;
199 if (lpcol->mask & LVCF_ORDER)
200 hdi.mask |= HDI_ORDER;
202 if (!SendMessage32A (infoPtr->hwndHeader, HDM_GETITEM32A,
203 wParam, (LPARAM)&hdi))
204 return FALSE;
206 if (lpcol->mask & LVCF_FMT) {
207 lpcol->fmt = 0;
209 if (hdi.fmt & HDF_LEFT)
210 lpcol->fmt |= LVCFMT_LEFT;
211 else if (hdi.fmt & HDF_RIGHT)
212 lpcol->fmt |= LVCFMT_RIGHT;
213 else if (hdi.fmt & HDF_CENTER)
214 lpcol->fmt |= LVCFMT_CENTER;
216 if (hdi.fmt & HDF_IMAGE)
217 lpcol->fmt |= LVCFMT_COL_HAS_IMAGES;
220 if (lpcol->mask & LVCF_WIDTH)
221 lpcol->cx = hdi.cxy;
223 if ((lpcol->mask & LVCF_TEXT) && (lpcol->pszText) && (hdi.pszText))
224 lstrcpyn32A (lpcol->pszText, hdi.pszText, lpcol->cchTextMax);
226 if (lpcol->mask & LVCF_IMAGE)
227 lpcol->iImage = hdi.iImage;
229 if (lpcol->mask & LVCF_ORDER)
230 lpcol->iOrder = hdi.iOrder;
232 return TRUE;
236 // << LISTVIEW_GetColumn32W >>
237 // << LISTVIEW_GetColumnOrderArray >>
240 __inline__ static LRESULT
241 LISTVIEW_GetColumnWidth (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
243 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
244 HDITEM32A hdi;
246 hdi.mask = HDI_WIDTH;
247 if (SendMessage32A (infoPtr->hwndHeader, HDM_GETITEM32A,
248 wParam, (LPARAM)&hdi))
249 return hdi.cxy;
251 return 0;
255 // << LISTVIEW_GetCountPerPage >>
256 // << LISTVIEW_GetEditControl >>
257 // << LISTVIEW_GetExtendedListviewStyle >>
260 __inline__ static LRESULT
261 LISTVIEW_GetHeader (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
263 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
265 return infoPtr->hwndHeader;
269 // << LISTVIEW_GetHotCursor >>
270 // << LISTVIEW_GetHotItem >>
271 // << LISTVIEW_GetHoverTime >>
274 static LRESULT
275 LISTVIEW_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
277 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
279 TRACE (listview, "(0x%08x)\n", wParam);
281 switch (wParam) {
282 case LVSIL_NORMAL:
283 return (LRESULT)infoPtr->himlNormal;
285 case LVSIL_SMALL:
286 return (LRESULT)infoPtr->himlSmall;
288 case LVSIL_STATE:
289 return (LRESULT)infoPtr->himlState;
292 return (LRESULT)NULL;
296 // << LISTVIEW_GetISearchString >>
299 static LRESULT
300 LISTVIEW_GetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
302 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
303 LPLVITEM32A lpItem = (LPLVITEM32A)lParam;
304 LISTVIEW_ITEM *lpRow, *lpSubItem;
306 if (!lpItem)
307 return FALSE;
309 if ((lpItem->iItem < 0) || (lpItem->iItem >= infoPtr->nItemCount))
310 return FALSE;
312 if ((lpItem->iSubItem < 0) || (lpItem->iSubItem >= infoPtr->nColumnCount))
313 return FALSE;
315 FIXME (listview, "(%d %d %p)\n",
316 lpItem->iItem, lpItem->iSubItem, lpItem);
318 lpRow = DPA_GetPtr (infoPtr->hdpaItems, lpItem->iItem);
319 if (!lpRow)
320 return FALSE;
322 lpSubItem = &lpRow[lpItem->iSubItem];
323 if (!lpSubItem)
324 return FALSE;
326 if (lpItem->mask & LVIF_STATE)
327 lpItem->state = lpSubItem->state & lpItem->stateMask;
329 if (lpItem->mask & LVIF_TEXT) {
330 if (lpSubItem->pszText == LPSTR_TEXTCALLBACK32A)
331 lpItem->pszText = LPSTR_TEXTCALLBACK32A;
332 else
333 Str_GetPtr32A (lpSubItem->pszText, lpItem->pszText,
334 lpItem->cchTextMax);
337 if (lpItem->mask & LVIF_IMAGE)
338 lpItem->iImage = lpSubItem->iImage;
340 if (lpItem->mask & LVIF_PARAM)
341 lpItem->lParam = lpSubItem->lParam;
343 if (lpItem->mask & LVIF_INDENT)
344 lpItem->iIndent = lpSubItem->iIndent;
346 return TRUE;
350 // << LISTVIEW_GetItem32W >>
353 __inline__ static LRESULT
354 LISTVIEW_GetItemCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
356 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
357 return infoPtr->nItemCount;
361 static LRESULT
362 LISTVIEW_GetItemPosition (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
364 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
365 LPPOINT32 lpPt = (LPPOINT32)lParam;
366 INT32 nIndex = (INT32)wParam;
368 if (!lpPt)
369 return FALSE;
370 if ((nIndex < 0) || (nIndex >= infoPtr->nItemCount))
371 return FALSE;
373 FIXME (listview, "returning position [0,0]!\n");
374 lpPt->x = 0;
375 lpPt->y = 0;
377 return TRUE;
381 // << LISTVIEW_GetItemRect >>
382 // << LISTVIEW_GetItemSpacing >>
383 // << LISTVIEW_GetItemState >>
386 static LRESULT
387 LISTVIEW_GetItemText32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
389 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
390 LPLVITEM32A lpItem = (LPLVITEM32A)lParam;
391 INT32 nItem = (INT32)wParam;
392 LISTVIEW_ITEM *lpRow, *lpSubItem;
394 TRACE (listview, "(%d %p)\n", nItem, lpItem);
396 lpRow = DPA_GetPtr (infoPtr->hdpaItems, lpItem->iItem);
397 if (!lpRow)
398 return 0;
400 lpSubItem = &lpRow[lpItem->iSubItem];
401 if (!lpSubItem)
402 return 0;
404 if (lpSubItem->pszText == LPSTR_TEXTCALLBACK32A) {
405 lpItem->pszText = LPSTR_TEXTCALLBACK32A;
406 return 0;
408 else
409 return Str_GetPtr32A (lpSubItem->pszText, lpItem->pszText,
410 lpItem->cchTextMax);
414 // << LISTVIEW_GetItemText32A >>
417 static LRESULT
418 LISTVIEW_GetNextItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
420 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
421 INT32 nStart = (INT32)wParam;
422 UINT32 uFlags = (UINT32)LOWORD(lParam);
424 FIXME (listview, "(%d, 0x%x): semi stub!\n", nStart, uFlags);
426 if (infoPtr->nItemCount <= 0)
427 return -1;
429 /* just a simple (preliminary) hack */
430 if (nStart == -1)
431 return 0;
432 else if (nStart < infoPtr->nItemCount - 1)
433 return nStart + 1;
434 else
435 return -1;
437 return -1;
441 // << LISTVIEW_GetNumberOfWorkAreas >>
442 // << LISTVIEW_GetOrigin >>
445 static LRESULT
446 LISTVIEW_GetSelectedCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
448 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
450 TRACE (listview, ": empty stub (returns 0)!\n");
452 return 0;
456 // << LISTVIEW_GetSelectionMark >>
459 static LRESULT
460 LISTVIEW_GetStringWidth32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
462 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
463 LPSTR lpsz = (LPSTR)lParam;
464 HFONT32 hFont, hOldFont;
465 HDC32 hdc;
466 SIZE32 size;
468 if (!lpsz)
469 return 0;
471 TRACE (listview, "(%s)\n", lpsz);
473 hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT);
474 hdc = GetDC32 (0);
475 hOldFont = SelectObject32 (hdc, hFont);
476 GetTextExtentPoint32A (hdc, lpsz, lstrlen32A(lpsz), &size);
477 SelectObject32 (hdc, hOldFont);
478 ReleaseDC32 (0, hdc);
480 TRACE (listview, "-- ret=%d\n", size.cx);
482 return (LRESULT)size.cx;
488 __inline__ static LRESULT
489 LISTVIEW_GetTextBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
491 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
493 return infoPtr->clrTextBk;
497 __inline__ static LRESULT
498 LISTVIEW_GetTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
500 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
502 return infoPtr->clrText;
506 static LRESULT
507 LISTVIEW_InsertColumn32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
509 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
510 LPLVCOLUMN32A lpcol = (LPLVCOLUMN32A)lParam;
511 INT32 nIndex = (INT32)wParam;
512 HDITEM32A hdi;
513 INT32 nResult;
515 if ((!lpcol) || (infoPtr->nItemCount > 0))
516 return -1;
518 FIXME (listview, "(%d %p): semi stub!\n", nIndex, lpcol);
520 ZeroMemory (&hdi, sizeof(HDITEM32A));
522 if (lpcol->mask & LVCF_FMT) {
523 if (nIndex == 0)
524 hdi.fmt |= HDF_LEFT;
525 else if (lpcol->fmt & LVCFMT_LEFT)
526 hdi.fmt |= HDF_LEFT;
527 else if (lpcol->fmt & LVCFMT_RIGHT)
528 hdi.fmt |= HDF_RIGHT;
529 else if (lpcol->fmt & LVCFMT_CENTER)
530 hdi.fmt |= HDF_CENTER;
532 if (lpcol->fmt & LVCFMT_COL_HAS_IMAGES)
533 hdi.fmt |= HDF_IMAGE;
535 hdi.mask |= HDI_FORMAT;
538 if (lpcol->mask & LVCF_WIDTH) {
539 hdi.mask |= HDI_WIDTH;
540 hdi.cxy = lpcol->cx;
543 if (lpcol->mask & LVCF_TEXT) {
544 hdi.mask |= (HDI_TEXT | HDI_FORMAT);
545 hdi.pszText = lpcol->pszText;
546 hdi.fmt |= HDF_STRING;
549 if (lpcol->mask & LVCF_IMAGE) {
550 hdi.mask |= HDI_IMAGE;
551 hdi.iImage = lpcol->iImage;
554 if (lpcol->mask & LVCF_ORDER) {
555 hdi.mask |= HDI_ORDER;
556 hdi.iOrder = lpcol->iOrder;
559 nResult = SendMessage32A (infoPtr->hwndHeader, HDM_INSERTITEM32A,
560 wParam, (LPARAM)&hdi);
561 if (nResult == -1)
562 return -1;
564 infoPtr->nColumnCount++;
566 return nResult;
570 // << LISTVIEW_InsertColumn32W >>
573 static LRESULT
574 LISTVIEW_InsertItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
576 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
577 LPLVITEM32A lpItem = (LPLVITEM32A)lParam;
578 LISTVIEW_ITEM *lpListItem;
579 INT32 nIndex;
580 NMLISTVIEW nmlv;
582 if (!lpItem)
583 return -1;
585 if ((!infoPtr->nColumnCount) || (lpItem->iSubItem))
586 return -1;
588 FIXME (listview, "(%d %p)\n", lpItem->iItem, lpItem);
589 FIXME (listview, "(%p %p)\n", infoPtr, infoPtr->hdpaItems);
591 lpListItem = (LISTVIEW_ITEM*)COMCTL32_Alloc (infoPtr->nColumnCount * sizeof(LISTVIEW_ITEM));
592 nIndex = DPA_InsertPtr (infoPtr->hdpaItems, lpItem->iItem, lpListItem);
593 if (nIndex == -1)
594 return -1;
596 if (lpItem->mask & LVIF_STATE)
597 lpListItem[0].state = lpItem->state;
599 if (lpItem->mask & LVIF_TEXT) {
600 if (lpItem->pszText == LPSTR_TEXTCALLBACK32A)
601 lpListItem[0].pszText = LPSTR_TEXTCALLBACK32A;
602 else
603 Str_SetPtr32A (&lpListItem[0].pszText, lpItem->pszText);
606 if (lpItem->mask & LVIF_IMAGE)
607 lpListItem[0].iImage = lpItem->iImage;
609 if (lpItem->mask & LVIF_PARAM)
610 lpListItem[0].lParam = lpItem->lParam;
612 if (lpItem->mask & LVIF_INDENT)
613 lpListItem[0].iIndent = lpItem->iIndent;
615 infoPtr->nItemCount++;
617 /* send notification */
618 ZeroMemory (&nmlv, sizeof (NMLISTVIEW));
619 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
620 nmlv.hdr.idFrom = wndPtr->wIDmenu;
621 nmlv.hdr.code = LVN_INSERTITEM;
622 nmlv.iItem = nIndex;
623 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
624 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
626 return nIndex;
630 // << LISTVIEW_InsertItem32W >>
633 static LRESULT
634 LISTVIEW_RedrawItems (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
636 // LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
638 FIXME (listview, "(%d - %d): empty stub!\n",
639 (INT32)wParam, (INT32)lParam);
641 return TRUE;
646 static LRESULT
647 LISTVIEW_SetBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
649 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
651 if (!infoPtr)
652 return FALSE;
654 /* set background color */
655 TRACE (listview, "0x%06lx\n", (COLORREF)lParam);
656 infoPtr->clrBk = (COLORREF)lParam;
658 return TRUE;
662 static LRESULT
663 LISTVIEW_SetColumn32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
665 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
666 LPLVCOLUMN32A lpcol = (LPLVCOLUMN32A)lParam;
667 INT32 nIndex = (INT32)wParam;
668 HDITEM32A hdi;
670 if (!lpcol)
671 return -1;
673 FIXME (listview, "(%d %p): semi stub!\n", nIndex, lpcol);
675 ZeroMemory (&hdi, sizeof(HDITEM32A));
677 if (lpcol->mask & LVCF_FMT) {
678 if (nIndex == 0)
679 hdi.fmt |= HDF_LEFT;
680 else if (lpcol->fmt & LVCFMT_LEFT)
681 hdi.fmt |= HDF_LEFT;
682 else if (lpcol->fmt & LVCFMT_RIGHT)
683 hdi.fmt |= HDF_RIGHT;
684 else if (lpcol->fmt & LVCFMT_CENTER)
685 hdi.fmt |= HDF_CENTER;
687 if (lpcol->fmt & LVCFMT_COL_HAS_IMAGES)
688 hdi.fmt |= HDF_IMAGE;
690 hdi.mask |= HDI_FORMAT;
693 if (lpcol->mask & LVCF_WIDTH) {
694 hdi.mask |= HDI_WIDTH;
695 hdi.cxy = lpcol->cx;
698 if (lpcol->mask & LVCF_TEXT) {
699 hdi.mask |= (HDI_TEXT | HDI_FORMAT);
700 hdi.pszText = lpcol->pszText;
701 hdi.fmt |= HDF_STRING;
704 if (lpcol->mask & LVCF_IMAGE) {
705 hdi.mask |= HDI_IMAGE;
706 hdi.iImage = lpcol->iImage;
709 if (lpcol->mask & LVCF_ORDER) {
710 hdi.mask |= HDI_ORDER;
711 hdi.iOrder = lpcol->iOrder;
714 return (LRESULT)SendMessage32A (infoPtr->hwndHeader, HDM_SETITEM32A,
715 wParam, (LPARAM)&hdi);
721 static LRESULT
722 LISTVIEW_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
724 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
725 HIMAGELIST himlTemp = 0;
727 TRACE (listview, "(0x%08x 0x%08lx)\n", wParam, lParam);
729 switch (wParam) {
730 case LVSIL_NORMAL:
731 himlTemp = infoPtr->himlNormal;
732 infoPtr->himlNormal = (HIMAGELIST)lParam;
733 return (LRESULT)himlTemp;
735 case LVSIL_SMALL:
736 himlTemp = infoPtr->himlSmall;
737 infoPtr->himlSmall = (HIMAGELIST)lParam;
738 return (LRESULT)himlTemp;
740 case LVSIL_STATE:
741 himlTemp = infoPtr->himlState;
742 infoPtr->himlState = (HIMAGELIST)lParam;
743 return (LRESULT)himlTemp;
746 return (LRESULT)NULL;
751 static LRESULT
752 LISTVIEW_SetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
754 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
755 LPLVITEM32A lpItem = (LPLVITEM32A)lParam;
756 LISTVIEW_ITEM *lpRow, *lpSubItem;
757 NMLISTVIEW nmlv;
759 if (!lpItem)
760 return FALSE;
762 if ((lpItem->iItem < 0) || (lpItem->iItem >= infoPtr->nItemCount))
763 return FALSE;
765 if ((lpItem->iSubItem < 0) || (lpItem->iSubItem >= infoPtr->nColumnCount))
766 return FALSE;
768 /* send LVN_ITEMCHANGING notification */
769 ZeroMemory (&nmlv, sizeof (NMLISTVIEW));
770 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
771 nmlv.hdr.idFrom = wndPtr->wIDmenu;
772 nmlv.hdr.code = LVN_ITEMCHANGING;
773 nmlv.iItem = lpItem->iItem;
774 nmlv.iSubItem = lpItem->iSubItem;
775 nmlv.uChanged = lpItem->mask;
777 if (!SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
778 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv))
779 return FALSE;
781 TRACE (listview, "(%d %d %p)\n",
782 lpItem->iItem, lpItem->iSubItem, lpItem);
784 lpRow = DPA_GetPtr (infoPtr->hdpaItems, lpItem->iItem);
785 if (!lpRow)
786 return FALSE;
788 lpSubItem = &lpRow[lpItem->iSubItem];
789 if (!lpSubItem)
790 return FALSE;
792 if (lpItem->mask & LVIF_STATE)
793 lpSubItem->state = (lpSubItem->state & lpItem->stateMask) | lpItem->state;
795 if (lpItem->mask & LVIF_TEXT) {
796 if (lpItem->pszText == LPSTR_TEXTCALLBACK32A) {
797 if ((lpSubItem->pszText) &&
798 (lpSubItem->pszText != LPSTR_TEXTCALLBACK32A))
799 COMCTL32_Free (lpSubItem->pszText);
800 lpSubItem->pszText = LPSTR_TEXTCALLBACK32A;
802 else {
803 if (lpSubItem->pszText == LPSTR_TEXTCALLBACK32A)
804 lpSubItem->pszText = NULL;
805 Str_SetPtr32A (&lpSubItem->pszText, lpItem->pszText);
809 if (lpItem->mask & LVIF_IMAGE)
810 lpSubItem->iImage = lpItem->iImage;
812 if (lpItem->mask & LVIF_PARAM)
813 lpSubItem->lParam = lpItem->lParam;
815 if (lpItem->mask & LVIF_INDENT)
816 lpSubItem->iIndent = lpItem->iIndent;
818 /* send LVN_ITEMCHANGED notification */
819 nmlv.hdr.code = LVN_ITEMCHANGED;
820 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
821 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
823 return TRUE;
827 // << LISTVIEW_SetItem32W >>
828 // << LISTVIEW_SetItemCount >>
831 static LRESULT
832 LISTVIEW_SetItemPosition (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
834 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
835 INT32 nIndex = (INT32)wParam;
837 if ((nIndex < 0) || (nIndex >= infoPtr->nItemCount))
838 return FALSE;
840 FIXME (listview, "setting position [%d, %d]!\n",
841 (INT32)LOWORD(lParam), (INT32)HIWORD(lParam));
843 /* FIXME: set position */
845 return TRUE;
849 static LRESULT
850 LISTVIEW_SetTextBkColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
852 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
854 if (!infoPtr)
855 return FALSE;
857 /* set text background color */
858 TRACE (listview, "0x%06lx\n", (COLORREF)lParam);
859 infoPtr->clrTextBk = (COLORREF)lParam;
861 return TRUE;
865 static LRESULT
866 LISTVIEW_SetTextColor (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
868 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
870 if (!infoPtr)
871 return FALSE;
873 /* set text color */
874 TRACE (listview, "0x%06lx\n", (COLORREF)lParam);
875 infoPtr->clrText = (COLORREF)lParam;
877 return TRUE;
882 static LRESULT
883 LISTVIEW_SortItems (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
885 // LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
887 FIXME (listview, "empty stub!\n");
889 /* fake success */
890 return TRUE;
896 static LRESULT
897 LISTVIEW_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
899 /* info structure is created at NCCreate */
900 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
901 LOGFONT32A logFont;
902 DWORD dwStyle = WS_CHILD | WS_VISIBLE;
904 TRACE (listview, "styles 0x%08lx 0x%08lx\n",
905 wndPtr->dwStyle, wndPtr->dwExStyle);
907 /* initialize info structure */
908 infoPtr->clrBk = CLR_NONE;
909 infoPtr->clrText = RGB(0, 0, 0); /* preliminary */
910 infoPtr->clrTextBk = RGB(255, 255, 255); /* preliminary */
912 if (!(wndPtr->dwStyle & LVS_REPORT) ||
913 (wndPtr->dwStyle & LVS_NOCOLUMNHEADER))
914 dwStyle |= HDS_HIDDEN;
915 if (!(wndPtr->dwStyle & LVS_NOSORTHEADER))
916 dwStyle |= HDS_BUTTONS;
918 /* create header */
919 infoPtr->hwndHeader =
920 CreateWindow32A (WC_HEADER32A, "", dwStyle,
921 0, 0, 0, 0, wndPtr->hwndSelf,
922 (HMENU32)0, wndPtr->hInstance, NULL);
924 /* get default font (icon title) */
925 SystemParametersInfo32A (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
926 infoPtr->hDefaultFont = CreateFontIndirect32A (&logFont);
927 infoPtr->hFont = infoPtr->hDefaultFont;
929 /* set header font */
930 SendMessage32A (infoPtr->hwndHeader, WM_SETFONT,
931 (WPARAM32)infoPtr->hFont, (LPARAM)TRUE);
933 infoPtr->hdpaItems = DPA_Create (10);
935 return 0;
939 static LRESULT
940 LISTVIEW_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
942 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
944 /* delete all items */
945 LISTVIEW_DeleteAllItems (wndPtr);
947 /* destroy dpa */
948 DPA_Destroy (infoPtr->hdpaItems);
950 /* destroy header */
951 if (infoPtr->hwndHeader)
952 DestroyWindow32 (infoPtr->hwndHeader);
954 /* destroy font */
955 infoPtr->hFont = (HFONT32)0;
956 if (infoPtr->hDefaultFont)
957 DeleteObject32 (infoPtr->hDefaultFont);
961 return 0;
965 static LRESULT
966 LISTVIEW_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
968 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
970 if (infoPtr->clrBk == CLR_NONE) {
971 return SendMessage32A (GetParent32 (wndPtr->hwndSelf),
972 WM_ERASEBKGND, wParam, lParam);
974 else {
975 HBRUSH32 hBrush = CreateSolidBrush32 (infoPtr->clrBk);
976 FillRect32 ((HDC32)wParam, &infoPtr->rcList, hBrush);
977 DeleteObject32 (hBrush);
978 return FALSE;
981 return TRUE;
985 __inline__ static LRESULT
986 LISTVIEW_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
988 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
990 return infoPtr->hFont;
994 // << LISTVIEW_HScroll >>
995 // << LISTVIEW_KeyDown >>
998 static LRESULT
999 LISTVIEW_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1001 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1002 NMHDR nmh;
1004 FIXME (listview, "semi stub!\n");
1006 nmh.hwndFrom = wndPtr->hwndSelf;
1007 nmh.idFrom = wndPtr->wIDmenu;
1008 nmh.code = NM_KILLFOCUS;
1010 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1011 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmh);
1013 infoPtr->bFocus = FALSE;
1015 return 0;
1019 static LRESULT
1020 LISTVIEW_LButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1022 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1023 NMLISTVIEW nmlv;
1025 FIXME (listview, "semi stub!\n");
1027 ZeroMemory (&nmlv, sizeof(NMLISTVIEW));
1028 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
1029 nmlv.hdr.idFrom = wndPtr->wIDmenu;
1030 nmlv.hdr.code = NM_DBLCLK;
1031 nmlv.iItem = -1;
1032 nmlv.iSubItem = 0;
1033 nmlv.ptAction.x = (INT32)LOWORD(lParam);
1034 nmlv.ptAction.y = (INT32)HIWORD(lParam);
1036 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1037 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
1039 return 0;
1043 static LRESULT
1044 LISTVIEW_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1046 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1047 NMLISTVIEW nmlv;
1049 FIXME (listview, "semi stub!\n");
1051 ZeroMemory (&nmlv, sizeof(NMLISTVIEW));
1052 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
1053 nmlv.hdr.idFrom = wndPtr->wIDmenu;
1054 nmlv.hdr.code = NM_CLICK;
1055 nmlv.iItem = -1;
1056 nmlv.iSubItem = 0;
1057 nmlv.ptAction.x = (INT32)LOWORD(lParam);
1058 nmlv.ptAction.y = (INT32)HIWORD(lParam);
1060 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1061 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
1063 if (!infoPtr->bFocus)
1064 SetFocus32 (wndPtr->hwndSelf);
1066 return 0;
1070 static LRESULT
1071 LISTVIEW_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1073 LISTVIEW_INFO *infoPtr;
1075 /* allocate memory for info structure */
1076 infoPtr = (LISTVIEW_INFO *)COMCTL32_Alloc (sizeof(LISTVIEW_INFO));
1077 wndPtr->wExtra[0] = (DWORD)infoPtr;
1079 if (infoPtr == NULL) {
1080 ERR (listview, "could not allocate info memory!\n");
1081 return 0;
1084 if ((LISTVIEW_INFO*)wndPtr->wExtra[0] != infoPtr) {
1085 ERR (listview, "pointer assignment error!\n");
1086 return 0;
1089 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
1093 static LRESULT
1094 LISTVIEW_NCDestroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1096 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1101 /* free list view info data */
1102 COMCTL32_Free (infoPtr);
1104 return 0;
1108 static LRESULT
1109 LISTVIEW_Notify (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1111 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1112 LPNMHDR lpnmh = (LPNMHDR)lParam;
1114 if (lpnmh->hwndFrom == infoPtr->hwndHeader) {
1116 FIXME (listview, "WM_NOTIFY from header!\n");
1118 else {
1120 FIXME (listview, "WM_NOTIFY from unknown source!\n");
1123 return 0;
1127 static LRESULT
1128 LISTVIEW_Paint (WND *wndPtr, WPARAM32 wParam)
1130 HDC32 hdc;
1131 PAINTSTRUCT32 ps;
1133 hdc = wParam==0 ? BeginPaint32 (wndPtr->hwndSelf, &ps) : (HDC32)wParam;
1134 LISTVIEW_Refresh (wndPtr, hdc);
1135 if (!wParam)
1136 EndPaint32 (wndPtr->hwndSelf, &ps);
1137 return 0;
1141 static LRESULT
1142 LISTVIEW_RButtonDblClk (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1144 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1145 NMLISTVIEW nmlv;
1147 FIXME (listview, "semi stub!\n");
1149 ZeroMemory (&nmlv, sizeof(NMLISTVIEW));
1150 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
1151 nmlv.hdr.idFrom = wndPtr->wIDmenu;
1152 nmlv.hdr.code = NM_RDBLCLK;
1153 nmlv.iItem = -1;
1154 nmlv.iSubItem = 0;
1155 nmlv.ptAction.x = (INT32)LOWORD(lParam);
1156 nmlv.ptAction.y = (INT32)HIWORD(lParam);
1158 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1159 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
1161 return 0;
1165 static LRESULT
1166 LISTVIEW_RButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1168 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1169 NMLISTVIEW nmlv;
1171 FIXME (listview, "semi stub!\n");
1173 ZeroMemory (&nmlv, sizeof(NMLISTVIEW));
1174 nmlv.hdr.hwndFrom = wndPtr->hwndSelf;
1175 nmlv.hdr.idFrom = wndPtr->wIDmenu;
1176 nmlv.hdr.code = NM_RCLICK;
1177 nmlv.iItem = -1;
1178 nmlv.iSubItem = 0;
1179 nmlv.ptAction.x = (INT32)LOWORD(lParam);
1180 nmlv.ptAction.y = (INT32)HIWORD(lParam);
1182 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1183 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmlv);
1185 return 0;
1189 static LRESULT
1190 LISTVIEW_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1192 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1193 NMHDR nmh;
1195 FIXME (listview, "semi stub!\n");
1197 nmh.hwndFrom = wndPtr->hwndSelf;
1198 nmh.idFrom = wndPtr->wIDmenu;
1199 nmh.code = NM_SETFOCUS;
1201 SendMessage32A (GetParent32 (wndPtr->hwndSelf), WM_NOTIFY,
1202 (WPARAM32)wndPtr->wIDmenu, (LPARAM)&nmh);
1204 infoPtr->bFocus = TRUE;
1206 return 0;
1210 static LRESULT
1211 LISTVIEW_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1213 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1214 HFONT32 hFont = (HFONT32)wParam;
1216 infoPtr->hFont = hFont ? hFont : infoPtr->hDefaultFont;
1218 /* set header font */
1219 SendMessage32A (infoPtr->hwndHeader, WM_SETFONT, wParam, lParam);
1221 /* reinitialize the listview */
1225 if (lParam) {
1226 /* force redraw */
1231 return 0;
1237 static LRESULT
1238 LISTVIEW_Size (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
1240 LISTVIEW_INFO *infoPtr = LISTVIEW_GetInfoPtr(wndPtr);
1242 GetClientRect32 (wndPtr->hwndSelf, &infoPtr->rcList);
1244 if (wndPtr->dwStyle & LVS_REPORT) {
1245 HDLAYOUT hl;
1246 WINDOWPOS32 wp;
1247 RECT32 rc;
1249 rc.top = 0;
1250 rc.left = 0;
1251 rc.right = LOWORD(lParam);
1252 rc.bottom = HIWORD(lParam);
1254 hl.prc = &rc;
1255 hl.pwpos = &wp;
1256 SendMessage32A (infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl);
1258 SetWindowPos32 (infoPtr->hwndHeader, wndPtr->hwndSelf,
1259 wp.x, wp.y, wp.cx, wp.cy, wp.flags);
1261 infoPtr->rcList.top += wp.cy;
1264 return 0;
1268 LRESULT WINAPI
1269 LISTVIEW_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam)
1271 WND *wndPtr = WIN_FindWndPtr(hwnd);
1273 switch (uMsg)
1275 // case LVM_APPROXIMATEVIEWRECT:
1276 // case LVM_ARRANGE:
1277 // case LVM_CREATEDRAGIMAGE:
1279 case LVM_DELETEALLITEMS:
1280 return LISTVIEW_DeleteAllItems (wndPtr);
1282 case LVM_DELETECOLUMN:
1283 return LISTVIEW_DeleteColumn (wndPtr, wParam, lParam);
1285 case LVM_DELETEITEM:
1286 return LISTVIEW_DeleteItem (wndPtr, wParam, lParam);
1288 // case LVM_EDITLABEL:
1289 // case LVM_ENSUREVISIBLE:
1290 // case LVM_FINDITEM:
1292 case LVM_GETBKCOLOR:
1293 return LISTVIEW_GetBkColor (wndPtr, wParam, lParam);
1295 // case LVM_GETBKIMAGE:
1296 // case LVM_GETCALLBACKMASK:
1298 case LVM_GETCOLUMN32A:
1299 return LISTVIEW_GetColumn32A (wndPtr, wParam, lParam);
1301 // case LVM_GETCOLUMN32W:
1302 // case LVM_GETCOLUMNORDERARRAY:
1304 case LVM_GETCOLUMNWIDTH:
1305 return LISTVIEW_GetColumnWidth (wndPtr, wParam, lParam);
1307 // case LVM_GETCOUNTPERPAGE:
1308 // case LVM_GETEDITCONTROL:
1309 // case LVM_GETEXTENDEDLISTVIEWSTYLE:
1311 case LVM_GETHEADER:
1312 return LISTVIEW_GetHeader (wndPtr, wParam, lParam);
1314 // case LVM_GETHOTCURSOR:
1315 // case LVM_GETHOTITEM:
1316 // case LVM_GETHOVERTIME:
1318 case LVM_GETIMAGELIST:
1319 return LISTVIEW_GetImageList (wndPtr, wParam, lParam);
1321 // case LVM_GETISEARCHSTRING:
1323 case LVM_GETITEM32A:
1324 return LISTVIEW_GetItem32A (wndPtr, wParam, lParam);
1326 // case LVM_GETITEM32W:
1328 case LVM_GETITEMCOUNT:
1329 return LISTVIEW_GetItemCount (wndPtr, wParam, lParam);
1331 case LVM_GETITEMPOSITION:
1332 return LISTVIEW_GetItemPosition (wndPtr, wParam, lParam);
1334 // case LVM_GETITEMRECT:
1335 // case LVM_GETITEMSPACING:
1336 // case LVM_GETITEMSTATE:
1338 case LVM_GETITEMTEXT32A:
1339 return LISTVIEW_GetItemText32A (wndPtr, wParam, lParam);
1341 // case LVM_GETITEMTEXT32W:
1343 case LVM_GETNEXTITEM:
1344 return LISTVIEW_GetNextItem (wndPtr, wParam, lParam);
1346 // case LVM_GETNUMBEROFWORKAREAS:
1347 // case LVM_GETORIGIN:
1349 case LVM_GETSELECTEDCOUNT:
1350 return LISTVIEW_GetSelectedCount (wndPtr, wParam, lParam);
1352 // case LVM_GETSELECTIONMARK:
1354 case LVM_GETSTRINGWIDTH32A:
1355 return LISTVIEW_GetStringWidth32A (wndPtr, wParam, lParam);
1357 // case LVM_GETSTRINGWIDTH32W:
1358 // case LVM_GETSUBITEMRECT:
1360 case LVM_GETTEXTBKCOLOR:
1361 return LISTVIEW_GetTextBkColor (wndPtr, wParam, lParam);
1363 case LVM_GETTEXTCOLOR:
1364 return LISTVIEW_GetTextColor (wndPtr, wParam, lParam);
1366 // case LVM_GETTOOLTIPS:
1367 // case LVM_GETTOPINDEX:
1368 // case LVM_GETUNICODEFORMAT:
1369 // case LVM_GETVIEWRECT:
1370 // case LVM_GETWORKAREAS:
1371 // case LVM_HITTEST:
1373 case LVM_INSERTCOLUMN32A:
1374 return LISTVIEW_InsertColumn32A (wndPtr, wParam, lParam);
1376 // case LVM_INSERTCOLUMN32W:
1378 case LVM_INSERTITEM32A:
1379 return LISTVIEW_InsertItem32A (wndPtr, wParam, lParam);
1381 // case LVM_INSERTITEM32W:
1383 case LVM_REDRAWITEMS:
1384 return LISTVIEW_RedrawItems (wndPtr, wParam, lParam);
1386 // case LVM_SCROLL:
1388 case LVM_SETBKCOLOR:
1389 return LISTVIEW_SetBkColor (wndPtr, wParam, lParam);
1391 // case LVM_SETBKIMAGE:
1392 // case LVM_SETCALLBACKMASK:
1394 case LVM_SETCOLUMN32A:
1395 return LISTVIEW_SetColumn32A (wndPtr, wParam, lParam);
1397 // case LVM_SETCOLUMN32W:
1398 // case LVM_SETCOLUMNORDERARRAY:
1399 // case LVM_SETCOLUMNWIDTH:
1400 // case LVM_SETEXTENDEDLISTVIEWSTYLE:
1401 // case LVM_SETHOTCURSOR:
1402 // case LVM_SETHOTITEM:
1403 // case LVM_SETHOVERTIME:
1404 // case LVM_SETICONSPACING:
1406 case LVM_SETIMAGELIST:
1407 return LISTVIEW_SetImageList (wndPtr, wParam, lParam);
1409 case LVM_SETITEM32A:
1410 return LISTVIEW_SetItem32A (wndPtr, wParam, lParam);
1412 // case LVM_SETITEM32W:
1413 // case LVM_SETITEMCOUNT:
1415 case LVM_SETITEMPOSITION:
1416 return LISTVIEW_SetItemPosition (wndPtr, wParam, lParam);
1418 // case LVM_SETITEMPOSITION32:
1419 // case LVM_SETITEMSTATE:
1420 // case LVM_SETITEMTEXT:
1421 // case LVM_SETSELECTIONMARK:
1423 case LVM_SETTEXTBKCOLOR:
1424 return LISTVIEW_SetTextBkColor (wndPtr, wParam, lParam);
1426 case LVM_SETTEXTCOLOR:
1427 return LISTVIEW_SetTextColor (wndPtr, wParam, lParam);
1429 // case LVM_SETTOOLTIPS:
1430 // case LVM_SETUNICODEFORMAT:
1431 // case LVM_SETWORKAREAS:
1433 case LVM_SORTITEMS:
1434 return LISTVIEW_SortItems (wndPtr, wParam, lParam);
1436 // case LVM_SUBITEMHITTEST:
1437 // case LVM_UPDATE:
1441 // case WM_CHAR:
1442 // case WM_COMMAND:
1444 case WM_CREATE:
1445 return LISTVIEW_Create (wndPtr, wParam, lParam);
1447 case WM_DESTROY:
1448 return LISTVIEW_Destroy (wndPtr, wParam, lParam);
1450 case WM_ERASEBKGND:
1451 return LISTVIEW_EraseBackground (wndPtr, wParam, lParam);
1453 case WM_GETDLGCODE:
1454 return DLGC_WANTTAB | DLGC_WANTARROWS;
1456 case WM_GETFONT:
1457 return LISTVIEW_GetFont (wndPtr, wParam, lParam);
1459 // case WM_HSCROLL:
1460 // case WM_KEYDOWN:
1462 case WM_KILLFOCUS:
1463 return LISTVIEW_KillFocus (wndPtr, wParam, lParam);
1465 case WM_LBUTTONDBLCLK:
1466 return LISTVIEW_LButtonDblClk (wndPtr, wParam, lParam);
1468 case WM_LBUTTONDOWN:
1469 return LISTVIEW_LButtonDown (wndPtr, wParam, lParam);
1471 // case WM_MOUSEMOVE:
1472 // return LISTVIEW_MouseMove (wndPtr, wParam, lParam);
1474 case WM_NCCREATE:
1475 return LISTVIEW_NCCreate (wndPtr, wParam, lParam);
1477 case WM_NCDESTROY:
1478 return LISTVIEW_NCDestroy (wndPtr, wParam, lParam);
1480 case WM_NOTIFY:
1481 return LISTVIEW_Notify (wndPtr, wParam, lParam);
1483 case WM_PAINT:
1484 return LISTVIEW_Paint (wndPtr, wParam);
1486 case WM_RBUTTONDBLCLK:
1487 return LISTVIEW_RButtonDblClk (wndPtr, wParam, lParam);
1489 case WM_RBUTTONDOWN:
1490 return LISTVIEW_RButtonDown (wndPtr, wParam, lParam);
1492 case WM_SETFOCUS:
1493 return LISTVIEW_SetFocus (wndPtr, wParam, lParam);
1495 case WM_SETFONT:
1496 return LISTVIEW_SetFont (wndPtr, wParam, lParam);
1498 // case WM_SETREDRAW:
1500 case WM_SIZE:
1501 return LISTVIEW_Size (wndPtr, wParam, lParam);
1503 // case WM_TIMER:
1504 // case WM_VSCROLL:
1505 // case WM_WINDOWPOSCHANGED:
1506 // case WM_WININICHANGE:
1508 default:
1509 if (uMsg >= WM_USER)
1510 ERR (listview, "unknown msg %04x wp=%08x lp=%08lx\n",
1511 uMsg, wParam, lParam);
1512 return DefWindowProc32A (hwnd, uMsg, wParam, lParam);
1514 return 0;
1518 VOID
1519 LISTVIEW_Register (VOID)
1521 WNDCLASS32A wndClass;
1523 if (GlobalFindAtom32A (WC_LISTVIEW32A)) return;
1525 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
1526 wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
1527 wndClass.lpfnWndProc = (WNDPROC32)LISTVIEW_WindowProc;
1528 wndClass.cbClsExtra = 0;
1529 wndClass.cbWndExtra = sizeof(LISTVIEW_INFO *);
1530 wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A);
1531 wndClass.hbrBackground = (HBRUSH32)(COLOR_WINDOW + 1);
1532 wndClass.lpszClassName = WC_LISTVIEW32A;
1534 RegisterClass32A (&wndClass);
1538 VOID
1539 LISTVIEW_Unregister (VOID)
1541 if (GlobalFindAtom32A (WC_LISTVIEW32A))
1542 UnregisterClass32A (WC_LISTVIEW32A, (HINSTANCE32)NULL);