annotate foosdk/sdk/libPPUI/listview_helper.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "stdafx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "win32_utility.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "win32_op.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "listview_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "CListViewCtrlEx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "CHeaderCtrlEx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 namespace listview_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 unsigned insert_item(HWND p_listview,unsigned p_index,const char * p_name,LPARAM p_param)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (p_index == ~0) p_index = ListView_GetItemCount(p_listview);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 pfc::stringcvt::string_os_from_utf8 os_string_temp(p_name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 item.mask = LVIF_TEXT | LVIF_PARAM;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 item.iItem = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 item.lParam = p_param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 item.pszText = const_cast<TCHAR*>(os_string_temp.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 LRESULT ret = SendMessage(p_listview,LVM_INSERTITEM,0,(LPARAM)&item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 PFC_ASSERT(ret >= 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 if (ret < 0) return UINT_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 else return (unsigned) ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 unsigned insert_item2(HWND p_listview, unsigned p_index, const char * col0, const char * col1, LPARAM p_param) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 unsigned i = insert_item( p_listview, p_index, col0, p_param );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (i != UINT_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 set_item_text( p_listview, i, 1, col1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 return i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 unsigned insert_item3(HWND p_listview, unsigned p_index, const char * col0, const char * col1, const char * col2, LPARAM p_param) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 unsigned i = insert_item( p_listview, p_index, col0, p_param );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 if (i != UINT_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 set_item_text( p_listview, i, 1, col1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 set_item_text( p_listview, i, 2, col2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 unsigned insert_column(HWND p_listview,unsigned p_index,const char * p_name,unsigned p_width_dlu)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 pfc::stringcvt::string_os_from_utf8 os_string_temp(p_name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 RECT rect = {0,0,(LONG)p_width_dlu,0};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 MapDialogRect(GetParent(p_listview),&rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 LVCOLUMN data = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 data.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 data.fmt = LVCFMT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 data.cx = rect.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 data.pszText = const_cast<TCHAR*>(os_string_temp.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 LRESULT ret = SendMessage(p_listview,LVM_INSERTCOLUMN,p_index,(LPARAM)&data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 PFC_ASSERT(ret >= 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 if (ret < 0) return UINT_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 else return (unsigned) ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void get_item_text(HWND p_listview,unsigned p_index,unsigned p_column,pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 enum {buffer_length = 1024*64};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 pfc::array_t<TCHAR> buffer; buffer.set_size(buffer_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 ListView_GetItemText(p_listview,p_index,p_column,buffer.get_ptr(),buffer_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 p_out = pfc::stringcvt::string_utf8_from_os(buffer.get_ptr(),buffer_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 bool set_item_text(HWND p_listview,unsigned p_index,unsigned p_column,const char * p_name)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 pfc::stringcvt::string_os_from_utf8 os_string_temp(p_name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 item.iItem = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 item.iSubItem = p_column;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 item.pszText = const_cast<TCHAR*>(os_string_temp.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 return SendMessage(p_listview,LVM_SETITEM,0,(LPARAM)&item) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 bool is_item_selected(HWND p_listview,unsigned p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 item.mask = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 item.iItem = p_index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 item.stateMask = LVIS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 if (!SendMessage(p_listview,LVM_GETITEM,0,(LPARAM)&item)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 return (item.state & LVIS_SELECTED) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 void set_item_selection(HWND p_listview,unsigned p_index,bool p_state)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 PFC_ASSERT( ::IsWindow(p_listview) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 item.stateMask = LVIS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 item.state = p_state ? LVIS_SELECTED : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 WIN32_OP_D( SendMessage(p_listview,LVM_SETITEMSTATE,(WPARAM)p_index,(LPARAM)&item) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 bool select_single_item(HWND p_listview,unsigned p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 LRESULT temp = SendMessage(p_listview,LVM_GETITEMCOUNT,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 if (temp < 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 ListView_SetSelectionMark(p_listview,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 unsigned n; const unsigned m = pfc::downcast_guarded<unsigned>(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 enum {mask = LVIS_FOCUSED | LVIS_SELECTED};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 ListView_SetItemState(p_listview,n,n == p_index ? mask : 0, mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 return ensure_visible(p_listview,p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 bool ensure_visible(HWND p_listview,unsigned p_index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 return SendMessage(p_listview,LVM_ENSUREVISIBLE,p_index,FALSE) ? true : false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void ListView_GetContextMenuPoint(HWND p_list,LPARAM p_coords,POINT & p_point,int & p_selection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 POINT pt = {(short)LOWORD(p_coords),(short)HIWORD(p_coords)};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 ListView_GetContextMenuPoint(p_list, pt, p_point, p_selection);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 void ListView_GetContextMenuPoint(HWND p_list,POINT p_coords,POINT & p_point,int & p_selection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (p_coords.x == -1 && p_coords.y == -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 int firstsel = ListView_GetFirstSelection(p_list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 if (firstsel >= 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 ListView_EnsureVisible(p_list, firstsel, FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 RECT rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 WIN32_OP_D( ListView_GetItemRect(p_list,firstsel,&rect,LVIR_BOUNDS) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 p_point.x = (rect.left + rect.right) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 p_point.y = (rect.top + rect.bottom) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 WIN32_OP_D( ClientToScreen(p_list,&p_point) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 RECT rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 WIN32_OP_D(GetClientRect(p_list,&rect));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 p_point.x = (rect.left + rect.right) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 p_point.y = (rect.top + rect.bottom) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 WIN32_OP_D(ClientToScreen(p_list,&p_point));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 p_selection = firstsel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 POINT pt = p_coords; // {(short)LOWORD(p_coords),(short)HIWORD(p_coords)};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 p_point = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 POINT client = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 WIN32_OP_D( ScreenToClient(p_list,&client) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 LVHITTESTINFO info = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 info.pt = client;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 p_selection = ListView_HitTest(p_list,&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 int ListView_GetFirstSelection(HWND p_listview) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 return ListView_GetNextItem(p_listview, -1, LVNI_SELECTED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 int ListView_GetSingleSelection(HWND p_listview) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 if (ListView_GetSelectedCount(p_listview) != 1) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 return ListView_GetFirstSelection(p_listview);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 int ListView_GetFocusItem(HWND p_listview) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 return ListView_GetNextItem(p_listview, -1, LVNI_FOCUSED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 bool ListView_IsItemSelected(HWND p_listview, int p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 return ListView_GetItemState(p_listview, p_index, LVIS_SELECTED) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 int ListView_GetColumnCount(HWND listView) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 HWND header = ListView_GetHeader(listView);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 PFC_ASSERT(header != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 return Header_GetItemCount(header);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 void ListView_FixContextMenuPoint(CListViewCtrl list, CPoint & coords) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 if (coords == CPoint(-1, -1)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 int selWalk = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 CRect rcClient; WIN32_OP_D(list.GetClientRect(rcClient));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 for (;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 selWalk = list.GetNextItem(selWalk, LVNI_SELECTED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 if (selWalk < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 WIN32_OP_D(list.GetWindowRect(&rc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 coords = rc.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 CRect rcItem, rcVisible;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 WIN32_OP_D(list.GetItemRect(selWalk, &rcItem, LVIR_BOUNDS));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 if (rcVisible.IntersectRect(rcItem, rcClient)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 coords = rcVisible.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 WIN32_OP_D(list.ClientToScreen(&coords));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 unsigned CListViewCtrlEx::GetColunnCount() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 return (unsigned) ListView_GetColumnCount( *this );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 unsigned CListViewCtrlEx::AddColumnEx(const wchar_t * name, unsigned widthDLU) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 return InsertColumnEx( GetColunnCount(), name, widthDLU );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 unsigned CListViewCtrlEx::InsertColumnEx(unsigned index, const wchar_t * name, unsigned widthDLU) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 RECT rect = { 0,0,(LONG)widthDLU,0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 MapDialogRect(GetParent(), &rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 LVCOLUMN data = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 data.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 data.fmt = LVCFMT_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 data.cx = rect.right;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 data.pszText = const_cast<wchar_t*>(name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 auto ret = this->InsertColumn(index, & data );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 if (ret < 0) return UINT_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 else return (unsigned)ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 void CListViewCtrlEx::FixContextMenuPoint(CPoint & pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 ListView_FixContextMenuPoint(*this, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 unsigned CListViewCtrlEx::InsertString(unsigned index, const wchar_t * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 item.iItem = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 item.pszText = const_cast<wchar_t*>(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 auto ret = InsertItem(&item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 if ( ret < 0 ) return UINT_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 else return (unsigned) ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 unsigned CListViewCtrlEx::InsertString8(unsigned index, const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 return InsertString(index, pfc::stringcvt::string_os_from_utf8( str ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 unsigned CListViewCtrlEx::AddString(const wchar_t * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 return InsertString(GetItemCount(), str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 unsigned CListViewCtrlEx::AddString8(const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 return AddString(pfc::stringcvt::string_os_from_utf8( str ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 void CListViewCtrlEx::SetItemText(unsigned iItem, unsigned iSubItem, const wchar_t * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 LVITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 item.iItem = iItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 item.iSubItem = iSubItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 item.pszText = const_cast<wchar_t*>(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 SetItem(&item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 void CListViewCtrlEx::SetItemText8(unsigned item, unsigned subItem, const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 SetItemText( item, subItem, pfc::stringcvt::string_os_from_utf8( str ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 DWORD CHeaderCtrlEx::GetItemFormat(int iItem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 item.mask = HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (!this->GetItem(iItem, &item)) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 return item.fmt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 void CHeaderCtrlEx::SetItemFormat(int iItem, DWORD flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 item.mask = HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 item.fmt = flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 SetItem(iItem, &item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 void CHeaderCtrlEx::SetItemSort(int iItem, int direction) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 DWORD fmtWas = GetItemFormat(iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 DWORD fmt = fmtWas & ~(HDF_SORTDOWN | HDF_SORTUP);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 if (direction > 0) fmt |= HDF_SORTDOWN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 else if (direction < 0) fmt |= HDF_SORTUP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if (fmt != fmtWas) SetItemFormat(iItem, fmt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 void CHeaderCtrlEx::SetSingleItemSort(int iItem, int direction) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 const int total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 for (int walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 SetItemSort(walk, walk == iItem ? direction : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 void CHeaderCtrlEx::ClearSort() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 SetSingleItemSort(-1,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 int CListViewCtrlEx::AddGroup(int iGroupID, const wchar_t * header) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 LVGROUP g = { sizeof(g) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 g.mask = LVGF_HEADER | LVGF_GROUPID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 g.pszHeader = const_cast<wchar_t*>( header );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 g.iGroupId = iGroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 return __super::AddGroup(&g);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 }