1370b324cSopenharmony_ci// Windows/Control/ListView.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#include "ListView.h" 6370b324cSopenharmony_ci 7370b324cSopenharmony_ci#ifndef _UNICODE 8370b324cSopenharmony_ciextern bool g_IsNT; 9370b324cSopenharmony_ci#endif 10370b324cSopenharmony_ci 11370b324cSopenharmony_cinamespace NWindows { 12370b324cSopenharmony_cinamespace NControl { 13370b324cSopenharmony_ci 14370b324cSopenharmony_cibool CListView::CreateEx(DWORD exStyle, DWORD style, 15370b324cSopenharmony_ci int x, int y, int width, int height, 16370b324cSopenharmony_ci HWND parentWindow, HMENU idOrHMenu, 17370b324cSopenharmony_ci HINSTANCE instance, LPVOID createParam) 18370b324cSopenharmony_ci{ 19370b324cSopenharmony_ci return CWindow::CreateEx(exStyle, WC_LISTVIEW, TEXT(""), style, x, y, width, 20370b324cSopenharmony_ci height, parentWindow, idOrHMenu, instance, createParam); 21370b324cSopenharmony_ci} 22370b324cSopenharmony_ci 23370b324cSopenharmony_ci/* note: LVITEM and LVCOLUMN structures contain optional fields 24370b324cSopenharmony_ci depending from preprocessor macros: 25370b324cSopenharmony_ci #if (_WIN32_IE >= 0x0300) 26370b324cSopenharmony_ci #if (_WIN32_WINNT >= 0x0501) 27370b324cSopenharmony_ci #if (_WIN32_WINNT >= 0x0600) 28370b324cSopenharmony_ci*/ 29370b324cSopenharmony_ci 30370b324cSopenharmony_cibool CListView::GetItemParam(unsigned index, LPARAM ¶m) const 31370b324cSopenharmony_ci{ 32370b324cSopenharmony_ci LVITEM item; 33370b324cSopenharmony_ci item.iItem = (int)index; 34370b324cSopenharmony_ci item.iSubItem = 0; 35370b324cSopenharmony_ci item.mask = LVIF_PARAM; 36370b324cSopenharmony_ci const bool res = GetItem(&item); 37370b324cSopenharmony_ci param = item.lParam; 38370b324cSopenharmony_ci return res; 39370b324cSopenharmony_ci} 40370b324cSopenharmony_ci 41370b324cSopenharmony_ciint CListView::InsertColumn(unsigned columnIndex, LPCTSTR text, int width) 42370b324cSopenharmony_ci{ 43370b324cSopenharmony_ci LVCOLUMN ci; 44370b324cSopenharmony_ci ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 45370b324cSopenharmony_ci ci.pszText = (LPTSTR)(void *)text; 46370b324cSopenharmony_ci ci.iSubItem = (int)columnIndex; 47370b324cSopenharmony_ci ci.cx = width; 48370b324cSopenharmony_ci return InsertColumn(columnIndex, &ci); 49370b324cSopenharmony_ci} 50370b324cSopenharmony_ci 51370b324cSopenharmony_ciint CListView::InsertItem(unsigned index, LPCTSTR text) 52370b324cSopenharmony_ci{ 53370b324cSopenharmony_ci LVITEM item; 54370b324cSopenharmony_ci item.mask = LVIF_TEXT | LVIF_PARAM; 55370b324cSopenharmony_ci item.iItem = (int)index; 56370b324cSopenharmony_ci item.lParam = (LPARAM)index; 57370b324cSopenharmony_ci item.pszText = (LPTSTR)(void *)text; 58370b324cSopenharmony_ci item.iSubItem = 0; 59370b324cSopenharmony_ci return InsertItem(&item); 60370b324cSopenharmony_ci} 61370b324cSopenharmony_ci 62370b324cSopenharmony_ciint CListView::SetSubItem(unsigned index, unsigned subIndex, LPCTSTR text) 63370b324cSopenharmony_ci{ 64370b324cSopenharmony_ci LVITEM item; 65370b324cSopenharmony_ci item.mask = LVIF_TEXT; 66370b324cSopenharmony_ci item.iItem = (int)index; 67370b324cSopenharmony_ci item.pszText = (LPTSTR)(void *)text; 68370b324cSopenharmony_ci item.iSubItem = (int)subIndex; 69370b324cSopenharmony_ci return SetItem(&item); 70370b324cSopenharmony_ci} 71370b324cSopenharmony_ci 72370b324cSopenharmony_ci#ifndef _UNICODE 73370b324cSopenharmony_ci 74370b324cSopenharmony_ciint CListView::InsertColumn(unsigned columnIndex, LPCWSTR text, int width) 75370b324cSopenharmony_ci{ 76370b324cSopenharmony_ci LVCOLUMNW ci; 77370b324cSopenharmony_ci ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 78370b324cSopenharmony_ci ci.pszText = (LPWSTR)(void *)text; 79370b324cSopenharmony_ci ci.iSubItem = (int)columnIndex; 80370b324cSopenharmony_ci ci.cx = width; 81370b324cSopenharmony_ci return InsertColumn(columnIndex, &ci); 82370b324cSopenharmony_ci} 83370b324cSopenharmony_ci 84370b324cSopenharmony_ciint CListView::InsertItem(unsigned index, LPCWSTR text) 85370b324cSopenharmony_ci{ 86370b324cSopenharmony_ci LVITEMW item; 87370b324cSopenharmony_ci item.mask = LVIF_TEXT | LVIF_PARAM; 88370b324cSopenharmony_ci item.iItem = (int)index; 89370b324cSopenharmony_ci item.lParam = (LPARAM)index; 90370b324cSopenharmony_ci item.pszText = (LPWSTR)(void *)text; 91370b324cSopenharmony_ci item.iSubItem = 0; 92370b324cSopenharmony_ci return InsertItem(&item); 93370b324cSopenharmony_ci} 94370b324cSopenharmony_ci 95370b324cSopenharmony_ciint CListView::SetSubItem(unsigned index, unsigned subIndex, LPCWSTR text) 96370b324cSopenharmony_ci{ 97370b324cSopenharmony_ci LVITEMW item; 98370b324cSopenharmony_ci item.mask = LVIF_TEXT; 99370b324cSopenharmony_ci item.iItem = (int)index; 100370b324cSopenharmony_ci item.pszText = (LPWSTR)(void *)text; 101370b324cSopenharmony_ci item.iSubItem = (int)subIndex; 102370b324cSopenharmony_ci return SetItem(&item); 103370b324cSopenharmony_ci} 104370b324cSopenharmony_ci 105370b324cSopenharmony_ci#endif 106370b324cSopenharmony_ci 107370b324cSopenharmony_cistatic LRESULT APIENTRY ListViewSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 108370b324cSopenharmony_ci{ 109370b324cSopenharmony_ci CWindow window(hwnd); 110370b324cSopenharmony_ci CListView2 *w = (CListView2 *)(window.GetUserDataLongPtr()); 111370b324cSopenharmony_ci if (w == NULL) 112370b324cSopenharmony_ci return 0; 113370b324cSopenharmony_ci return w->OnMessage(message, wParam, lParam); 114370b324cSopenharmony_ci} 115370b324cSopenharmony_ci 116370b324cSopenharmony_ciLRESULT CListView2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) 117370b324cSopenharmony_ci{ 118370b324cSopenharmony_ci #ifndef _UNICODE 119370b324cSopenharmony_ci if (g_IsNT) 120370b324cSopenharmony_ci return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam); 121370b324cSopenharmony_ci else 122370b324cSopenharmony_ci #endif 123370b324cSopenharmony_ci return CallWindowProc(_origWindowProc, *this, message, wParam, lParam); 124370b324cSopenharmony_ci} 125370b324cSopenharmony_ci 126370b324cSopenharmony_civoid CListView2::SetWindowProc() 127370b324cSopenharmony_ci{ 128370b324cSopenharmony_ci SetUserDataLongPtr((LONG_PTR)this); 129370b324cSopenharmony_ci #ifndef _UNICODE 130370b324cSopenharmony_ci if (g_IsNT) 131370b324cSopenharmony_ci _origWindowProc = (WNDPROC)SetLongPtrW(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc); 132370b324cSopenharmony_ci else 133370b324cSopenharmony_ci #endif 134370b324cSopenharmony_ci _origWindowProc = (WNDPROC)SetLongPtr(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc); 135370b324cSopenharmony_ci} 136370b324cSopenharmony_ci 137370b324cSopenharmony_ci/* 138370b324cSopenharmony_ciLRESULT CListView3::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) 139370b324cSopenharmony_ci{ 140370b324cSopenharmony_ci LRESULT res = CListView2::OnMessage(message, wParam, lParam); 141370b324cSopenharmony_ci if (message == WM_GETDLGCODE) 142370b324cSopenharmony_ci { 143370b324cSopenharmony_ci // when user presses RETURN, windows sends default (first) button command to parent dialog. 144370b324cSopenharmony_ci // we disable this: 145370b324cSopenharmony_ci MSG *msg = (MSG *)lParam; 146370b324cSopenharmony_ci WPARAM key = wParam; 147370b324cSopenharmony_ci bool change = false; 148370b324cSopenharmony_ci if (msg) 149370b324cSopenharmony_ci { 150370b324cSopenharmony_ci if (msg->message == WM_KEYDOWN && msg->wParam == VK_RETURN) 151370b324cSopenharmony_ci change = true; 152370b324cSopenharmony_ci } 153370b324cSopenharmony_ci else if (wParam == VK_RETURN) 154370b324cSopenharmony_ci change = true; 155370b324cSopenharmony_ci if (change) 156370b324cSopenharmony_ci res |= DLGC_WANTALLKEYS; 157370b324cSopenharmony_ci } 158370b324cSopenharmony_ci return res; 159370b324cSopenharmony_ci} 160370b324cSopenharmony_ci*/ 161370b324cSopenharmony_ci 162370b324cSopenharmony_ci}} 163