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