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
23bool CListView::GetItemParam(int index, LPARAM &param) const
24{
25  LVITEM item;
26  item.iItem = index;
27  item.iSubItem = 0;
28  item.mask = LVIF_PARAM;
29  bool aResult = GetItem(&item);
30  param = item.lParam;
31  return aResult;
32}
33
34int CListView::InsertColumn(int columnIndex, LPCTSTR text, int width)
35{
36  LVCOLUMN ci;
37  ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
38  ci.pszText = (LPTSTR)text;
39  ci.iSubItem = columnIndex;
40  ci.cx = width;
41  return InsertColumn(columnIndex, &ci);
42}
43
44int CListView::InsertItem(int index, LPCTSTR text)
45{
46  LVITEM item;
47  item.mask = LVIF_TEXT | LVIF_PARAM;
48  item.iItem = index;
49  item.lParam = index;
50  item.pszText = (LPTSTR)text;
51  item.iSubItem = 0;
52  return InsertItem(&item);
53}
54
55int CListView::SetSubItem(int index, int subIndex, LPCTSTR text)
56{
57  LVITEM item;
58  item.mask = LVIF_TEXT;
59  item.iItem = index;
60  item.pszText = (LPTSTR)text;
61  item.iSubItem = subIndex;
62  return SetItem(&item);
63}
64
65#ifndef _UNICODE
66
67int CListView::InsertColumn(int columnIndex, LPCWSTR text, int width)
68{
69  LVCOLUMNW ci;
70  ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
71  ci.pszText = (LPWSTR)text;
72  ci.iSubItem = columnIndex;
73  ci.cx = width;
74  return InsertColumn(columnIndex, &ci);
75}
76
77int CListView::InsertItem(int index, LPCWSTR text)
78{
79  LVITEMW item;
80  item.mask = LVIF_TEXT | LVIF_PARAM;
81  item.iItem = index;
82  item.lParam = index;
83  item.pszText = (LPWSTR)text;
84  item.iSubItem = 0;
85  return InsertItem(&item);
86}
87
88int CListView::SetSubItem(int index, int subIndex, LPCWSTR text)
89{
90  LVITEMW item;
91  item.mask = LVIF_TEXT;
92  item.iItem = index;
93  item.pszText = (LPWSTR)text;
94  item.iSubItem = subIndex;
95  return SetItem(&item);
96}
97
98#endif
99
100static LRESULT APIENTRY ListViewSubclassProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
101{
102  CWindow window(hwnd);
103  CListView2 *w = (CListView2 *)(window.GetUserDataLongPtr());
104  if (w == NULL)
105    return 0;
106  return w->OnMessage(message, wParam, lParam);
107}
108
109LRESULT CListView2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
110{
111  #ifndef _UNICODE
112  if (g_IsNT)
113    return CallWindowProcW(_origWindowProc, *this, message, wParam, lParam);
114  else
115  #endif
116    return CallWindowProc(_origWindowProc, *this, message, wParam, lParam);
117}
118
119void CListView2::SetWindowProc()
120{
121  SetUserDataLongPtr((LONG_PTR)this);
122  #ifndef _UNICODE
123  if (g_IsNT)
124    _origWindowProc = (WNDPROC)SetLongPtrW(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc);
125  else
126  #endif
127    _origWindowProc = (WNDPROC)SetLongPtr(GWLP_WNDPROC, (LONG_PTR)ListViewSubclassProc);
128}
129
130/*
131LRESULT CListView3::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
132{
133  LRESULT res = CListView2::OnMessage(message, wParam, lParam);
134  if (message == WM_GETDLGCODE)
135  {
136    // when user presses RETURN, windows sends default (first) button command to parent dialog.
137    // we disable this:
138    MSG *msg = (MSG *)lParam;
139    WPARAM key = wParam;
140    bool change = false;
141    if (msg)
142    {
143      if (msg->message == WM_KEYDOWN && msg->wParam == VK_RETURN)
144        change = true;
145    }
146    else if (wParam == VK_RETURN)
147      change = true;
148    if (change)
149      res |= DLGC_WANTALLKEYS;
150  }
151  return res;
152}
153*/
154
155}}
156