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