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 &param) 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