1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Windows/Control/ListView.cpp 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h" 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "ListView.h" 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyextern bool g_IsNT; 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NWindows { 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NControl { 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CListView::CreateEx(DWORD exStyle, DWORD style, 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int x, int y, int width, int height, 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HWND parentWindow, HMENU idOrHMenu, 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HINSTANCE instance, LPVOID createParam) 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return CWindow::CreateEx(exStyle, WC_LISTVIEW, TEXT(""), style, x, y, width, 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky height, parentWindow, idOrHMenu, instance, createParam); 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CListView::GetItemParam(int index, LPARAM ¶m) const 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVITEM item; 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iItem = index; 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iSubItem = 0; 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.mask = LVIF_PARAM; 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bool aResult = GetItem(&item); 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky param = item.lParam; 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return aResult; 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::InsertColumn(int columnIndex, LPCTSTR text, int width) 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVCOLUMN ci; 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.pszText = (LPTSTR)text; 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.iSubItem = columnIndex; 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.cx = width; 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return InsertColumn(columnIndex, &ci); 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::InsertItem(int index, LPCTSTR text) 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVITEM item; 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.mask = LVIF_TEXT | LVIF_PARAM; 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iItem = index; 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.lParam = index; 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.pszText = (LPTSTR)text; 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iSubItem = 0; 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return InsertItem(&item); 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::SetSubItem(int index, int subIndex, LPCTSTR text) 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVITEM item; 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.mask = LVIF_TEXT; 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iItem = index; 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.pszText = (LPTSTR)text; 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iSubItem = subIndex; 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return SetItem(&item); 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::InsertColumn(int columnIndex, LPCWSTR text, int width) 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVCOLUMNW ci; 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.pszText = (LPWSTR)text; 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.iSubItem = columnIndex; 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ci.cx = width; 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return InsertColumn(columnIndex, &ci); 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::InsertItem(int index, LPCWSTR text) 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVITEMW item; 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.mask = LVIF_TEXT | LVIF_PARAM; 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iItem = index; 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.lParam = index; 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.pszText = (LPWSTR)text; 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iSubItem = 0; 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return InsertItem(&item); 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CListView::SetSubItem(int index, int subIndex, LPCWSTR text) 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LVITEMW item; 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.mask = LVIF_TEXT; 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iItem = index; 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.pszText = (LPWSTR)text; 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky item.iSubItem = subIndex; 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return SetItem(&item); 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic LRESULT APIENTRY ListViewSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CWindow window(hwnd); 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CListView2 *w = (CListView2 *)(window.GetUserDataLongPtr()); 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (w == NULL) 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return 0; 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return w->OnMessage(message, wParam, lParam); 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyLRESULT CListView2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_IsNT) 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam); 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return CallWindowProc(_origWindowProc, *this, message, wParam, lParam); 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyvoid CListView2::SetWindowProc() 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SetUserDataLongPtr((LONG_PTR)this); 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_IsNT) 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _origWindowProc = (WNDPROC)SetLongPtrW(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc); 125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _origWindowProc = (WNDPROC)SetLongPtr(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc); 128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/* 131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyLRESULT CListView3::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LRESULT res = CListView2::OnMessage(message, wParam, lParam); 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (message == WM_GETDLGCODE) 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // when user presses RETURN, windows sends default (first) button command to parent dialog. 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // we disable this: 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky MSG *msg = (MSG *)lParam; 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky WPARAM key = wParam; 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bool change = false; 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (msg) 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (msg->message == WM_KEYDOWN && msg->wParam == VK_RETURN) 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky change = true; 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else if (wParam == VK_RETURN) 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky change = true; 148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (change) 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky res |= DLGC_WANTALLKEYS; 150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return res; 152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/ 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}} 156