annotate foosdk/sdk/libPPUI/CListControl-Subst.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 #include "CListControlComplete.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "CListControl-Subst.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "CWindowCreateAndDelete.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <pfc/string-conv-lite.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "ImplementOnFinalMessage.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "CListControl-Cells.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "windowLifetime.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define I_IMAGEREALLYNONE (-3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 static int safeFillText(wchar_t* psz, int cch, pfc::wstringLite const& text) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 int len = (int)text.length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 int lim = cch - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 if (len > lim) len = lim;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 for (int i = 0; i < len; ++i) psz[i] = text[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 psz[len] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
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 class CListControl_ListViewBase : public CListControlComplete {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 const DWORD m_style;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 DWORD m_listViewExStyle = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 CImageList m_imageLists[4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 bool m_groupViewEnabled = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 CListControl_ListViewBase(DWORD style) : m_style(style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (style & LVS_SINGLESEL) this->SetSelectionModeSingle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 else this->SetSelectionModeMulti();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 BEGIN_MSG_MAP_EX(CListControl_ListViewBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 MSG_WM_CREATE(OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 MESSAGE_HANDLER_EX(LVM_INSERTCOLUMN, OnInsertColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 MESSAGE_HANDLER_EX(LVM_DELETECOLUMN, OnDeleteColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 MESSAGE_HANDLER_EX(LVM_SETCOLUMN, OnSetColumn)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 MESSAGE_HANDLER_EX(LVM_SETCOLUMNWIDTH, OnSetColumnWidth)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 MESSAGE_HANDLER_EX(LVM_GETCOLUMNWIDTH, OnGetColumnWidth)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 MESSAGE_HANDLER_EX(LVM_GETCOLUMNORDERARRAY, OnGetColumnOrderArray)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 MESSAGE_HANDLER_EX(LVM_SETCOLUMNORDERARRAY, OnSetColumnOrderArray)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 MESSAGE_HANDLER_EX(LVM_GETITEMCOUNT, OnGetItemCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 MESSAGE_HANDLER_EX(LVM_GETITEMRECT, OnGetItemRect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 MESSAGE_HANDLER_EX(LVM_GETSUBITEMRECT, OnGetSubItemRect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 MESSAGE_HANDLER_EX(LVM_HITTEST, OnHitTest)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 MESSAGE_HANDLER_EX(LVM_GETITEMSTATE, OnGetItemState)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 MESSAGE_HANDLER_EX(LVM_SETITEMSTATE, OnSetItemState)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 MESSAGE_HANDLER_EX(LVM_GETNEXTITEM, OnGetNextItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 MESSAGE_HANDLER_EX(LVM_GETNEXTITEMINDEX, OnGetNextItemIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 MESSAGE_HANDLER_EX(LVM_SUBITEMHITTEST, OnSubItemHitTest)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 MESSAGE_HANDLER_EX(LVM_GETSELECTEDCOUNT, OnGetSelCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 MESSAGE_HANDLER_EX(LVM_GETHEADER, OnGetHeader)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 MESSAGE_HANDLER_EX(LVM_SETEXTENDEDLISTVIEWSTYLE, OnSetExtendedListViewStyle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 MESSAGE_HANDLER_EX(LVM_GETEXTENDEDLISTVIEWSTYLE, OnGetExtendedListViewStyle)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 MESSAGE_HANDLER_EX(LVM_ENSUREVISIBLE, OnEnsureVisible)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 MESSAGE_HANDLER_EX(LVM_SETIMAGELIST, OnSetImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 MESSAGE_HANDLER_EX(LVM_GETIMAGELIST, OnGetImageList)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 MESSAGE_HANDLER_EX(LVM_EDITLABEL, OnEditLabel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 MESSAGE_HANDLER_EX(LVM_GETSTRINGWIDTH, OnGetStringWidth)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 MESSAGE_HANDLER_EX(LVM_ENABLEGROUPVIEW, OnEnableGroupView)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 MESSAGE_HANDLER_EX(LVM_SCROLL, OnScroll)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 MESSAGE_HANDLER_EX(LVM_REDRAWITEMS, OnRedrawItems)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 MSG_WM_KEYDOWN(OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 MSG_WM_SYSKEYDOWN(OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 CHAIN_MSG_MAP(CListControlComplete)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 NMLVKEYDOWN arg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 arg.hdr = this->setupHdr(LVN_KEYDOWN);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 arg.wVKey = nChar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 sendNotify(&arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 LRESULT OnCreate(LPCREATESTRUCT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 // Adopt style flags of the original control to keep various ATL checks happy
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 DWORD style = GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 style = (style & 0xFFFF0000) | (m_style & 0xFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 SetWindowLong(GWL_STYLE, style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 LRESULT OnGetColumnWidth(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 return GetSubItemWidth(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 LRESULT OnSetColumnWidth(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (idx >= GetColumnCount()) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 // undocumented: low 16 bits must be used, or else testing against LVSCW_AUTOSIZE fails hard
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 // all macros sending LVM_SETCOLUMNWIDTH use low 16 bits of LPARAM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 int w = (short)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (this->IsHeaderless()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 if (w < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_headerlessColumns[idx] = UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 m_headerlessColumns[idx] = (uint32_t)w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 this->OnColumnsChanged();
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 uint32_t pass = (uint32_t)w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 if (w < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 if (w == LVSCW_AUTOSIZE_USEHEADER) pass = columnWidthAuto;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 else pass = columnWidthAutoUseContent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 this->ResizeColumn(idx, pass);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 LRESULT OnGetColumnOrderArray(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 int* out = (int*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 auto arr = this->GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 if ((size_t)wp != arr.size()) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 for (size_t w = 0; w < arr.size(); ++w) out[w] = arr[w];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 LRESULT OnSetColumnOrderArray(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 if (this->IsHeaderless()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 PFC_ASSERT(!"Implement and test me");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 auto hdr = GetHeaderCtrl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 WIN32_OP_D(hdr.SetOrderArray((int)wp, (int*)lp));
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 ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 LRESULT OnInsertColumn(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 auto col = reinterpret_cast<LVCOLUMN*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 if (IsHeaderless()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if (idx > m_headerlessColumns.size()) idx = m_headerlessColumns.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 uint32_t width = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 if (col->mask & LVCF_WIDTH) width = col->cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 m_headerlessColumns.insert(m_headerlessColumns.begin() + idx, width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 this->OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 if (this->GetHeaderCtrl() == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (m_style & LVS_NOSORTHEADER) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 this->InitializeHeaderCtrl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 this->InitializeHeaderCtrlSortable();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 PFC_ASSERT(this->GetHeaderCtrl().GetItemCount() == (int)this->GetColumnCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (idx != this->GetColumnCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 PFC_ASSERT(!"Arbitrary column insert not implemented, please add columns in order");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 return -1;
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 pfc::string8 label; int width = 0; DWORD format = HDF_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 if (col->mask & LVCF_TEXT) label = pfc::utf8FromWide(col->pszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 if (col->mask & LVCF_WIDTH) width = col->cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 if (col->mask & LVCF_FMT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 format = col->fmt & LVCFMT_JUSTIFYMASK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 this->AddColumn(label, width, format);
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 PFC_ASSERT(this->GetHeaderCtrl().GetItemCount() == (int)this->GetColumnCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 return idx;
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 LRESULT OnDeleteColumn(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (idx >= this->GetColumnCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 PFC_ASSERT(!"???"); return FALSE;
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 this->DeleteColumn(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 LRESULT OnSetColumn(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 if (idx >= this->GetColumnCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 PFC_ASSERT(!"???"); return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 auto col = reinterpret_cast<LVCOLUMN*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 if (col->mask & (LVCF_TEXT | LVCF_FMT)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 const char* pText = nullptr; DWORD format = UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 pfc::string8 strText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 if (col->mask & LVCF_TEXT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 strText = pfc::utf8FromWide(col->pszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 pText = strText.c_str();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 if (col->mask & LVCF_FMT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 format = col->fmt & LVCFMT_JUSTIFYMASK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 this->SetColumn(idx, pText, format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 if (col->mask & LVCF_WIDTH) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 this->ResizeColumn(idx, col->cx);
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 return TRUE;
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 LRESULT OnGetItemCount(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 return (LRESULT)this->GetItemCount();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 LRESULT OnGetItemRect(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 RECT* rc = (RECT*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 if (idx < GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 // LVIR_* not supported
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 * rc = GetItemRect(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 LRESULT OnGetSubItemRect(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 RECT* rc = (RECT*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 if (idx < GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 size_t subItem = (size_t)rc->top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 // LVIR_* not supported
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 *rc = GetSubItemRect(idx, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 return FALSE;
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 LRESULT OnHitTest(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 auto info = (LVHITTESTINFO*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 CPoint pt = this->PointClientToAbs(info->pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 size_t item = this->ItemFromPointAbs(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 size_t subItem = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 if (item != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 info->iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 size_t subItem = this->SubItemFromPointAbs(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 info->iSubItem = (subItem != SIZE_MAX) ? (int)subItem : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 return item != SIZE_MAX ? (LRESULT)item : (LRESULT)-1;
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 LRESULT OnSubItemHitTest(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 auto info = (LVHITTESTINFO*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 CPoint pt = this->PointClientToAbs(info->pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 size_t item = this->ItemFromPointAbs(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 size_t subItem = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (item != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 info->iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 subItem = this->SubItemFromPointAbs(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 info->iSubItem = (subItem != SIZE_MAX) ? (int)subItem : -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 return subItem != SIZE_MAX ? (LRESULT)subItem : (LRESULT)-1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 virtual void SetItemState(size_t idx, DWORD mask, DWORD state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 if (idx >= GetItemCount()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 if (mask & LVIS_FOCUSED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 if (state & LVIS_FOCUSED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 this->SetFocusItem(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 if (this->GetFocusItem() == idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 this->SetFocusItem(SIZE_MAX);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 if (mask & LVIS_SELECTED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (this->IsSingleSelect()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 if (state & LVIS_SELECTED) this->SelectSingle(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 this->SetSelectionAt(idx, (state & LVIS_SELECTED) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 LRESULT OnSetItemState(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 LVITEM* pItem = (LVITEM*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 if ((LONG_PTR)wp < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 if (pItem->stateMask & LVIS_FOCUSED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 if (pItem->state & LVIS_FOCUSED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 // makes no sense
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 this->SetFocusItem(SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 }
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 if (pItem->stateMask & LVIS_SELECTED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 if (pItem->state & LVIS_SELECTED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 this->SelectAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 this->SelectNone();
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 SetItemState(idx, pItem->stateMask, pItem->state);
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 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 virtual UINT GetItemState(size_t idx) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 UINT ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 if (idx == this->GetFocusItem()) ret |= LVIS_FOCUSED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 if (this->IsItemSelected(idx)) ret |= LVIS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 LRESULT OnGetItemState(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 LRESULT ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 if (idx < GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 ret |= (this->GetItemState(idx) & lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 LRESULT OnGetNextItemIndex(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 LVITEMINDEX* info = (LVITEMINDEX*)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 int item = (int)OnGetNextItem(LVM_GETNEXTITEM, info->iItem, lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 info->iItem = item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 return item >= 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 LRESULT OnGetNextItem(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 // GetSelectedIndex() :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 // return (int)::SendMessage(this->m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 const bool bVisible = (lp & LVNI_VISIBLEONLY) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 std::pair<size_t, size_t> range;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 if ( bVisible ) range = this->GetVisibleRange();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if ((lp & LVNI_STATEMASK) == LVNI_FOCUSED) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 size_t ret = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 if (bVisible) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 if (ret < range.first || ret >= range.second) ret = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 return (LRESULT)ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 const auto count = this->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 if (wp == (WPARAM)-1 && bVisible) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 // Simplified visible range search
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 for (size_t idx = range.first; idx < range.second; ++idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 if (this->GetItemState(idx) & lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 return (LRESULT)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 size_t base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 if ((LONG_PTR)wp < 0) base = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 else base = wp + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 for (size_t idx = base; idx < count; ++idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 if (bVisible) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 if (idx < range.first || idx >= range.second) continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 if (this->GetItemState(idx) & lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 return (LRESULT)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 LRESULT OnGetSelCount(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 return (LRESULT) this->GetSelectedCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 LRESULT OnGetHeader(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 return (LRESULT)GetHeaderCtrl().m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 LRESULT OnSetExtendedListViewStyle(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 DWORD ret = m_listViewExStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 DWORD set = (DWORD)lp, mask = (DWORD)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 if (mask == 0) mask = 0xFFFFFFFF;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 m_listViewExStyle = (m_listViewExStyle & ~mask) | (set & mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 this->SetRowStyle((m_listViewExStyle & LVS_EX_GRIDLINES) ? rowStyleGrid : rowStyleDefault);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 if (m_listViewExStyle != ret) ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 LRESULT OnGetExtendedListViewStyle(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 return m_listViewExStyle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 LRESULT OnEnsureVisible(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 if (idx < this->GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 (void)lp; // FIX ME partialOK?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 this->EnsureItemVisible(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 LRESULT OnSetImageList(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 LRESULT ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 if (idx < std::size(m_imageLists)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 auto& ref = m_imageLists[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 ret = (LRESULT)ref.m_hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 ref = (HIMAGELIST)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 LRESULT OnGetImageList(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 LRESULT ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 if (idx < std::size(m_imageLists)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 ret = (LRESULT)m_imageLists[idx].m_hImageList;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 LRESULT OnEditLabel(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 int index = (int)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 HWND ret = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 if (index < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 this->TableEdit_Abort(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 ret = this->TableEdit_Start((size_t)index, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 return (LRESULT)ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 LRESULT OnGetStringWidth(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 auto str = (const wchar_t*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 return this->GetOptimalColumnWidthFixed(pfc::utf8FromWide(str), false /* no pad */);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 LRESULT OnEnableGroupView(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 bool bEnable = (wp != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 if (bEnable == m_groupViewEnabled) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 m_groupViewEnabled = bEnable;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 LRESULT OnScroll(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 PFC_ASSERT(!"Implement me");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 LRESULT OnRedrawItems(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 size_t base = wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 size_t last = lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 if (last < base) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 size_t count = last + 1 - base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 this->UpdateItems(pfc::bit_array_range(base, count));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 bool TableEdit_CanAdvanceHere(size_t item, size_t subItem, uint32_t whatHappened) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 // Block line cycling with enter key
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 auto code = (whatHappened & InPlaceEdit::KEditMaskReason);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 if (code == InPlaceEdit::KEditEnter) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 return __super::TableEdit_CanAdvanceHere(item, subItem, whatHappened);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 bool TableEdit_IsColumnEditable(t_size subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 return subItem == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 NMHDR setupHdr(UINT code) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 return { m_hWnd, (UINT_PTR)this->GetDlgCtrlID(), code };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 LRESULT sendNotify(void* data) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 auto hdr = reinterpret_cast<const NMHDR*>(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 PFC_ASSERT(hdr->idFrom == (UINT_PTR) GetDlgCtrlID());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 return GetParent().SendMessage(WM_NOTIFY, hdr->idFrom, reinterpret_cast<LPARAM>(data));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 int getDispInfoImage(size_t item, size_t subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 NMLVDISPINFO info = { setupHdr(LVN_GETDISPINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 info.item.mask = LVIF_IMAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 info.item.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 info.item.iSubItem = (int)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 PFC_ASSERT(info.item.iImage != I_IMAGECALLBACK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 return info.item.iImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 pfc::string8 getDispInfoText(size_t item, size_t subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 NMLVDISPINFO info = { setupHdr(LVN_GETDISPINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 info.item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 info.item.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 info.item.iSubItem = (int)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 wchar_t buffer[1024] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 info.item.pszText = buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 info.item.cchTextMax = (int) std::size(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 if (info.item.pszText == LPSTR_TEXTCALLBACK || info.item.pszText == nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 PFC_ASSERT(!"WTF??"); return "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 return pfc::utf8FromWide(info.item.pszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 virtual LPARAM GetItemParam(size_t) { return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 void ExecuteDefaultAction(size_t idx) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 NMITEMACTIVATE info = { setupHdr(NM_DBLCLK) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 info.iItem = (int) idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 info.lParam = GetItemParam(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 void OnSubItemClicked(t_size item, t_size subItem, CPoint pt) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 __super::OnSubItemClicked(item, subItem, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 NMITEMACTIVATE info = { setupHdr(NM_CLICK) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 info.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 info.iSubItem = (int)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 info.ptAction = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 void OnFocusChanged(size_t oldFocus, size_t newFocus) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 __super::OnFocusChanged(oldFocus, newFocus);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 const auto count = this->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 if (oldFocus < count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 auto idx = oldFocus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 NMLISTVIEW info = { setupHdr(LVN_ITEMCHANGED) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 info.iItem = (int)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 info.lParam = this->GetItemParam(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 auto base = this->GetItemState(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 info.uOldState = base | LVIS_FOCUSED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 info.uNewState = base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 info.uChanged = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 this->sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 if (newFocus < count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 auto idx = newFocus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 NMLISTVIEW info = { setupHdr(LVN_ITEMCHANGED) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 info.iItem = (int)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 info.lParam = this->GetItemParam(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 auto base = this->GetItemState(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 info.uOldState = base & ~LVIS_FOCUSED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 info.uNewState = base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 info.uChanged = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 this->sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 void OnSelectionChanged(pfc::bit_array const& affected, pfc::bit_array const& status) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 __super::OnSelectionChanged(affected, status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 const auto count = this->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 const size_t focus = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 // LVN_ITEMCHANGING not supported, CListControl currently doesn't hand this info
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 affected.for_each(true, 0, count, [&](size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 bool sel_new = status[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 bool sel_old = !sel_new;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 NMLISTVIEW info = { setupHdr(LVN_ITEMCHANGED) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 info.iItem = (int)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 info.lParam = this->GetItemParam(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 info.uOldState = (sel_old ? LVIS_SELECTED : 0) | (idx == focus ? LVIS_FOCUSED : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541 info.uNewState = (sel_new ? LVIS_SELECTED : 0) | (idx == focus ? LVIS_FOCUSED : 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 info.uChanged = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 this->sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 void RequestReorder(size_t const* order, size_t count) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 void RequestRemoveSelection() override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 void OnColumnHeaderClick(t_size index) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 NMLISTVIEW info = { setupHdr(LVN_COLUMNCLICK) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 info.iItem = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 info.iSubItem = (int)index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 this->sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 bool IsHeaderless() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 return (m_style & LVS_NOCOLUMNHEADER) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 std::vector< uint32_t > m_headerlessColumns;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 size_t GetColumnCount() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 if (IsHeaderless()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 return m_headerlessColumns.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 return __super::GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 uint32_t GetSubItemWidth(size_t subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 if (IsHeaderless()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 if (subItem < m_headerlessColumns.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 auto v = m_headerlessColumns[subItem];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 if (v == UINT32_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 uint32_t nAuto = 0, wNormal = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 for (auto walk : m_headerlessColumns) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 if (walk == UINT32_MAX) ++nAuto;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 else wNormal += walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 PFC_ASSERT(nAuto > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 uint32_t wTotal = this->GetClientRectHook().Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 if (wTotal > wNormal) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 uint32_t autoTotal = wTotal - wNormal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 v = autoTotal / nAuto;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 v = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 return v;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 else return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 return __super::GetSubItemWidth(subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 bool GetCellTypeSupported() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 return useCheckBoxes();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 cellType_t GetCellType(size_t item, size_t subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 if (useCheckBoxes() && subItem == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 return &PFC_SINGLETON(CListCell_Checkbox);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 return __super::GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 bool useCheckBoxes() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 return (m_listViewExStyle & LVS_EX_CHECKBOXES) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 void TableEdit_SetField(t_size item, t_size subItem, const char* value) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 if (subItem != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 PFC_ASSERT(!"subItem should be zero");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 auto textW = pfc::wideFromUTF8(value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 NMLVDISPINFO info = { setupHdr(LVN_ENDLABELEDIT) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 info.item.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 info.item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 info.item.pszText = const_cast<wchar_t*>( textW.c_str() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 if (sendNotify(&info) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 SetSubItemText(item, subItem, value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 virtual void SetSubItemText(size_t item, size_t subItem, const char* text) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 virtual int GetItemImage(size_t item, size_t subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 return I_IMAGEREALLYNONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 CImageList GetImageList() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 return m_imageLists[LVSIL_SMALL];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 bool RenderCellImageTest(size_t item, size_t subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 return GetImageList() != NULL && GetItemImage(item, subItem) != I_IMAGEREALLYNONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 void RenderCellImage(size_t item, size_t subItem, CDCHandle dc, const CRect& rc) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 auto img = GetItemImage(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 auto imgList = GetImageList();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 if (img >= 0 && imgList) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 CSize size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 WIN32_OP_D(imgList.GetIconSize(size));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 CRect rc2 = rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 if (size.cx <= rc.Width() && size.cy <= rc.Height()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 auto cp = rc.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 rc2.left = cp.x - size.cx / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 rc2.top = cp.y - size.cy / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 rc2.right = rc2.left + size.cx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 rc2.bottom = rc2.top + size.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 imgList.DrawEx(img, dc, rc2, CLR_NONE, CLR_NONE, ILD_SCALE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 bool m_notifyItemDraw = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 UINT GetItemCDState(size_t which) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 UINT ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 DWORD state = GetItemState(which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 if (state & LVIS_FOCUSED) ret |= CDIS_FOCUS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 if (state & LVIS_SELECTED) ret |= CDIS_SELECTED;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 void RenderRect(const CRect& p_rect, CDCHandle p_dc) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 NMCUSTOMDRAW cd = { setupHdr(NM_CUSTOMDRAW) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 cd.dwDrawStage = CDDS_PREPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 cd.hdc = p_dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 cd.rc = p_rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 cd.dwItemSpec = UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 cd.uItemState = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 cd.lItemlParam = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 LRESULT status = sendNotify(&cd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 m_notifyItemDraw = (status & CDRF_NOTIFYITEMDRAW) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 if ((status & CDRF_SKIPDEFAULT) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 __super::RenderRect(p_rect, p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 cd.dwDrawStage = CDDS_POSTPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 sendNotify(&cd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 void RenderItem(t_size item, const CRect& itemRect, const CRect& updateRect, CDCHandle dc) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 NMCUSTOMDRAW cd = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 if (m_notifyItemDraw) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 cd = { setupHdr(NM_CUSTOMDRAW) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 cd.dwDrawStage = CDDS_ITEMPREPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 cd.hdc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 cd.rc = itemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 cd.dwItemSpec = (DWORD)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 cd.uItemState = GetItemCDState(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 cd.lItemlParam = GetItemParam(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 LRESULT status = sendNotify(&cd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 if (status & CDRF_SKIPDEFAULT) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 __super::RenderItem(item, itemRect, updateRect, dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 if (m_notifyItemDraw) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 cd.dwDrawStage = CDDS_ITEMPOSTPAINT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 sendNotify(&cd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 void RenderSubItemText(t_size item, t_size subItem, const CRect& subItemRect, const CRect& updateRect, CDCHandle dc, bool allowColors) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 __super::RenderSubItemText(item, subItem, subItemRect, updateRect, dc, allowColors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 class CListControl_ListViewOwnerData : public CListControl_ListViewBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 CListControl_ListViewOwnerData(DWORD style) : CListControl_ListViewBase(style) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 BEGIN_MSG_MAP_EX(CListControl_ListViewOwnerData)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 MESSAGE_HANDLER_EX(LVM_SETITEMCOUNT, OnSetItemCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 CHAIN_MSG_MAP(CListControl_ListViewBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 size_t m_itemCount = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 LRESULT OnSetItemCount(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 auto count = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 if (m_itemCount != count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 m_itemCount = count; ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 t_size GetItemCount() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 return m_itemCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 bool GetSubItemText(t_size item, t_size subItem, pfc::string_base& out) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 if (item < m_itemCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 out = this->getDispInfoText(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 int GetItemImage(size_t item, size_t subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 int ret = I_IMAGEREALLYNONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 if (subItem == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 ret = this->getDispInfoImage(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 void SetSubItemText(size_t item, size_t subItem, const char* text) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 auto textW = pfc::wideFromUTF8(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 NMLVDISPINFO info = { setupHdr(LVN_SETDISPINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 info.item.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 info.item.iSubItem = (int)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 info.item.mask = LVIF_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 info.item.pszText = const_cast<wchar_t*>(textW.c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 ReloadItem(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 class CListControl_ListView : public CListControl_ListViewBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 CListControl_ListView(DWORD style) : CListControl_ListViewBase(style) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 BEGIN_MSG_MAP_EX(CListControl_ListView)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 MESSAGE_HANDLER_EX(LVM_INSERTITEM, OnInsertItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 MESSAGE_HANDLER_EX(LVM_SETITEM, OnSetItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 MESSAGE_HANDLER_EX(LVM_SETITEMCOUNT, OnSetItemCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 MESSAGE_HANDLER_EX(LVM_GETITEM, OnGetItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 MESSAGE_HANDLER_EX(LVM_GETITEMTEXT, OnGetItemText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 MESSAGE_HANDLER_EX(LVM_INSERTGROUP, OnInsertGroup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 MESSAGE_HANDLER_EX(LVM_REMOVEGROUP, OnRemoveGroup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 MESSAGE_HANDLER_EX(LVM_GETGROUPCOUNT, OnGetGroupCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 MESSAGE_HANDLER_EX(LVM_GETGROUPINFO, OnGetGroupInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 MESSAGE_HANDLER_EX(LVM_SETGROUPINFO, OnSetGroupInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 MESSAGE_HANDLER_EX(LVM_GETGROUPINFOBYINDEX, OnGetGroupInfoByIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 MESSAGE_HANDLER_EX(LVM_REMOVEALLGROUPS, OnRemoveAllGroups)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 MESSAGE_HANDLER_EX(LVM_DELETEITEM, OnDeleteItem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 MESSAGE_HANDLER_EX(LVM_DELETEALLITEMS, OnDeleteAllItems)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 CHAIN_MSG_MAP(CListControl_ListViewBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 struct text_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 pfc::string8 text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 bool callback = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 struct rec_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 std::vector< text_t > text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 LPARAM param = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 int image = I_IMAGEREALLYNONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 bool checked = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 groupID_t groupID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 int LVGroupID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 std::vector<rec_t> m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 groupID_t m_groupIDGen = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 groupID_t groupIDGen() { return ++m_groupIDGen; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 struct group_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 int LVGroupID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 groupID_t GroupID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 pfc::string8 header;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 std::vector<group_t> m_groups;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 groupID_t groupFromLV(int LV) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 for (auto& g : m_groups) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 if (g.LVGroupID == LV) return g.GroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 t_size GetItemCount() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 return m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 bool GetSubItemText(t_size item, t_size subItem, pfc::string_base& out) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 if (item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 auto& r = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 if (subItem < r.text.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 auto& t = r.text[subItem];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 if (t.callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 out = getDispInfoText(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 out = t.text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 void SetSubItemText(size_t item, size_t subItem, const char* text) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 if (item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 auto& r = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 if (subItem < r.text.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 auto& t = r.text[subItem];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 t.callback = false; t.text = text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 ReloadItem(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 int GetItemImage(size_t item, size_t subItem) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 int ret = I_IMAGEREALLYNONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 if (subItem == 0 && item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 auto& r = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 ret = r.image;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 if (ret == I_IMAGECALLBACK) ret = this->getDispInfoImage(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 LPARAM GetItemParam(size_t item) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 LPARAM ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 if (item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 ret = m_content[item].param;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 static text_t makeText(const wchar_t* p) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 text_t text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 if (p == LPSTR_TEXTCALLBACK) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 text.callback = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 text.text = pfc::utf8FromWide(p);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 return text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 LRESULT OnSetItem(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 auto pItem = reinterpret_cast<LVITEM*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 size_t item = (size_t)pItem->iItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 const size_t total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 if (item >= total) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 size_t subItem = (size_t)pItem->iSubItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 if (subItem > 1024) return FALSE; // quick sanity
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 auto& rec = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 size_t width = subItem + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 if (rec.text.size() < width) rec.text.resize(width);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 bool bReload = false, bReloadAll = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 if (pItem->mask & LVIF_TEXT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 rec.text[subItem] = makeText(pItem->pszText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 bReload = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 if (pItem->mask & LVIF_IMAGE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 rec.image = pItem->iImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 bReload = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 if (pItem->mask & LVIF_PARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 rec.param = pItem->lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 if (pItem->mask & LVIF_GROUPID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 rec.LVGroupID = pItem->iGroupId;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 rec.groupID = groupFromLV(rec.LVGroupID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 if (m_groupViewEnabled) bReloadAll = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 if (bReloadAll) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 this->ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898 } else if (bReload) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 this->ReloadItem(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 if (pItem->mask & LVIF_STATE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 this->SetItemState(item, pItem->stateMask, pItem->state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 LRESULT OnInsertItem(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 auto pItem = reinterpret_cast<LVITEM*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 size_t item = (size_t)pItem->iItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 const size_t total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 if (item > total) item = total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 rec_t r;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 if (pItem->mask & LVIF_TEXT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 r.text = { makeText(pItem->pszText) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 if (pItem->mask & LVIF_GROUPID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 r.LVGroupID = pItem->iGroupId;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 r.groupID = groupFromLV(r.LVGroupID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 if (pItem->mask & LVIF_IMAGE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 r.image = pItem->iImage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 if (pItem->mask & LVIF_PARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 r.param = pItem->lParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 m_content.insert(m_content.begin() + item, std::move(r));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 if (m_groupViewEnabled) ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 else this->OnItemsInserted(item, 1, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 return (LRESULT)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 LRESULT OnSetItemCount(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 // It's not actually supposed to be called like this, LVM_SETITEMCOUNT is meant for ownerdata listviews
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 auto count = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 if (count != m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 m_content.resize(wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 LRESULT OnInsertGroup(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 LVGROUP* arg = (LVGROUP*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 if ((arg->mask & (LVGF_GROUPID | LVGF_HEADER)) != (LVGF_GROUPID | LVGF_HEADER)) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 auto LVGroupID = arg->iGroupId;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 for (auto& existing : m_groups) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 if (existing.LVGroupID == LVGroupID) return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 if (idx > m_groups.size()) idx = m_groups.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 group_t grp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 grp.LVGroupID = LVGroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 grp.GroupID = this->groupIDGen();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 grp.header = pfc::utf8FromWide(arg->pszHeader);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 m_groups.insert(m_groups.begin() + idx, std::move(grp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 // No reload data - adding of items does it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 return (LRESULT)idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 LRESULT OnRemoveGroup(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 int LVGroupID = (int)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 for (size_t walk = 0; walk < m_groups.size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 if (m_groups[walk].LVGroupID == LVGroupID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 m_groups.erase(m_groups.begin() + walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 void getGroupInfo(group_t const& in, LVGROUP* out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 if (out->mask & LVGF_HEADER) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 auto text = pfc::wideFromUTF8(in.header.c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 safeFillText(out->pszHeader, out->cchHeader, text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 if (out->mask & LVGF_GROUPID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 out->iGroupId = in.LVGroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 void setGroupInfo(group_t& grp, LVGROUP* in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 bool bReload = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 if (in->mask & LVGF_HEADER) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 grp.header = pfc::utf8FromWide(in->pszHeader);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 bReload = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 if (in->mask & LVGF_GROUPID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 grp.LVGroupID = in->iGroupId;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 bReload = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 if (bReload) this->ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 LRESULT OnGetGroupCount(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 return (LRESULT)m_groups.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 LRESULT OnGetGroupInfo(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 int LVGroupID = (int)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 auto out = (LVGROUP*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 for (auto& grp : m_groups) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 if (grp.LVGroupID == LVGroupID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 getGroupInfo(grp, out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 return LVGroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 LRESULT OnSetGroupInfo(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 int LVGroupID = (int)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 auto in = (LVGROUP*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 int ret = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 for (auto& grp : m_groups) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 if (grp.LVGroupID == LVGroupID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 setGroupInfo(grp, in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 ret = grp.LVGroupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 LRESULT OnGetGroupInfoByIndex(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 LVGROUP* out = (LVGROUP*)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 if (idx < m_groups.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 getGroupInfo(m_groups[idx], out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 LRESULT OnRemoveAllGroups(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 m_groups.clear(); return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 LRESULT OnDeleteItem(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 LRESULT rv = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 const size_t oldCount = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 if (idx < oldCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 m_content.erase(m_content.begin() + idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 this->OnItemsRemoved(pfc::bit_array_one(idx), oldCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 rv = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 LRESULT OnDeleteAllItems(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 m_content.clear(); ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 int fillText(size_t item, size_t subItem, LVITEM* pItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 pfc::wstringLite text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 if (item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 auto& r = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 if (subItem < r.text.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 auto& t = r.text[subItem];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 if (!t.callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 text = pfc::wideFromUTF8(t.text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 return safeFillText(pItem->pszText, pItem->cchTextMax, text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 LRESULT OnGetItem(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 auto pItem = reinterpret_cast<LVITEM*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 if (pItem->mask & LVIF_TEXT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 fillText(pItem->iItem, pItem->iSubItem, pItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 if (pItem->mask & LVIF_IMAGE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 size_t idx = pItem->iItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 auto& line = m_content[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 pItem->iImage = line.image;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 if (pItem->mask & LVIF_PARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 pItem->lParam = GetItemParam(pItem->iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 LRESULT OnGetItemText(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 auto item = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 auto pItem = reinterpret_cast<LVITEM*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 size_t subItem = (size_t)pItem->iSubItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 return fillText(item, subItem, pItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 bool GetCellCheckState(size_t item, size_t sub) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 if (sub == 0 && item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 rv = m_content[item].checked;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 void SetCellCheckState(size_t item, size_t sub, bool value) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 if (sub == 0 && item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 auto& rec = m_content[item];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 if (rec.checked != value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 auto oldState = this->GetItemState(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 rec.checked = value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 __super::SetCellCheckState(item, sub, value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 NMLISTVIEW info = { this->setupHdr(LVN_ITEMCHANGED) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 info.iItem = (int)item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 info.lParam = this->GetItemParam(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 info.uChanged = LVIF_STATE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 info.uOldState = oldState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 info.uNewState = this->GetItemState(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 this->sendNotify(&info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 UINT GetItemState(size_t idx) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 UINT ret = __super::GetItemState(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 if (useCheckBoxes() && idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 int nCheck = m_content[idx].checked ? 2 : 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 ret |= INDEXTOSTATEIMAGEMASK(nCheck);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 void SetItemState(size_t idx, DWORD mask, DWORD state) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 __super::SetItemState(idx, mask, state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 if (useCheckBoxes() && (mask & LVIS_STATEIMAGEMASK) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 int nCheck = ((state & LVIS_STATEIMAGEMASK) >> 12);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 this->SetCellCheckState(idx, 0, nCheck == 2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 groupID_t GetItemGroup(t_size p_item) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 if (m_groupViewEnabled && p_item < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 return m_content[p_item].groupID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 bool GetGroupHeaderText2(size_t baseItem, pfc::string_base& out) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 auto id = GetItemGroup(baseItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 if (id != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 for (auto& g : m_groups) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 if (id == g.GroupID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 out = g.header;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 HWND CListControl_ReplaceListView(HWND wndReplace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 CListViewCtrl src(wndReplace);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 const auto style = src.GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 HWND ret = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 if (style & LVS_REPORT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 const auto ctrlID = src.GetDlgCtrlID();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 CWindow parent = src.GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 DWORD headerStyle = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 if ((style & LVS_NOCOLUMNHEADER) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 auto header = src.GetHeader();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157 if (header) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 headerStyle = header.GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 if (style & LVS_OWNERDATA) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 auto obj = PP::newWindowObj<CListControl_ListViewOwnerData>(style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 ret = obj->CreateInDialog(parent, ctrlID, src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 PFC_ASSERT(ret != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 if (headerStyle != 0 && obj->GetHeaderCtrl() == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 obj->InitializeHeaderCtrl((headerStyle&(HDS_FULLDRAG | HDS_BUTTONS)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 PFC_ASSERT(src.GetItemCount() == 0); // transferring of items not yet implemented
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 auto obj = PP::newWindowObj<CListControl_ListView>(style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 ret = obj->CreateInDialog(parent, ctrlID, src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 PFC_ASSERT(ret != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 if (headerStyle != 0 && obj->GetHeaderCtrl() == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 obj->InitializeHeaderCtrl((headerStyle & (HDS_FULLDRAG | HDS_BUTTONS)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 // FIX ME WM_DELETEITEM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 class CListControl_ListBoxBase : public CListControlReadOnly {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 const DWORD m_style;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 CListControl_ListBoxBase(DWORD style) : m_style(style) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 // owner data not implemented
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 PFC_ASSERT((m_style & LBS_NODATA) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 if (m_style & LBS_NOSEL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 this->SetSelectionModeNone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 } else if (m_style & LBS_MULTIPLESEL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 this->SetSelectionModeMulti();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198 this->SetSelectionModeSingle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 BEGIN_MSG_MAP_EX(CListControl_ListBoxBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 MSG_WM_SETFOCUS(OnSetFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 MSG_WM_KILLFOCUS(OnKillFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 MESSAGE_HANDLER_EX(LB_SETCURSEL, OnSetCurSel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 MESSAGE_HANDLER_EX(LB_GETCURSEL, OnGetCurSel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 MESSAGE_HANDLER_EX(LB_GETITEMRECT, OnGetItemRect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 MESSAGE_HANDLER_EX(LB_SELECTSTRING, OnSelectString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 MESSAGE_HANDLER_EX(LB_ITEMFROMPOINT, OnItemFromPoint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 MESSAGE_HANDLER_EX(LB_GETSEL, OnGetSel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211 MESSAGE_HANDLER_EX(LB_SETSEL, OnSetSel)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212 MESSAGE_HANDLER_EX(LB_GETSELCOUNT, OnGetSelCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 MESSAGE_HANDLER_EX(LB_GETSELITEMS, OnGetSelItems)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 MESSAGE_HANDLER_EX(LB_SETCARETINDEX, OnSetCaretIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 MESSAGE_HANDLER_EX(LB_GETCARETINDEX, OnGetCaretIndex)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 MSG_WM_CREATE(OnCreate)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 CHAIN_MSG_MAP(CListControlReadOnly)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 LRESULT OnCreate(LPCREATESTRUCT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 // Adopt style flags of the original control to keep various ATL checks happy
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 DWORD style = GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 style = (style & 0xFFFF0000) | (m_style & 0xFFFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 SetWindowLong(GWL_STYLE, style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 void notifyParent(WORD code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 if (m_style & LBS_NOTIFY) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 GetParent().PostMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), code), (LPARAM)m_hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 LRESULT OnGetCurSel(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 return (LRESULT)this->GetSingleSel();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 LRESULT OnSetCurSel(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 this->SelectSingle((size_t)wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 LRESULT OnGetItemRect(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 if (idx < this->GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 *reinterpret_cast<RECT*>(lp) = this->GetItemRect(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 LRESULT OnSelectString(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 auto idx = this->SendMessage(LB_FINDSTRING, wp, lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 if (idx != LB_ERR) this->SelectSingle((size_t)idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 return idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 LRESULT OnItemFromPoint(UINT, WPARAM, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 CPoint pt(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 size_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 if (!this->ItemFromPoint(pt, ret)) return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 return (LRESULT)ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 LRESULT OnGetSel(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 if (idx < this->GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 return this->IsItemSelected(idx) ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 LRESULT OnSetSel(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 // Contrary to the other methods, index comes in LPARAM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 if (lp < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 if (wp) this->SelectAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 else this->SelectNone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 this->SetSelection(pfc::bit_array_one((size_t)lp), pfc::bit_array_val(wp != 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 LRESULT OnGetSelItems(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 int* out = reinterpret_cast<int*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 size_t outSize = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 size_t outWalk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 const size_t total = this->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 for (size_t walk = 0; walk < total && outWalk < outSize; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 if (this->IsItemSelected(walk)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 out[outWalk++] = (int)walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 return outWalk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 LRESULT OnGetSelCount(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 return (LRESULT)this->GetSelectedCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 LRESULT OnGetCaretIndex(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 size_t focus = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 if (focus == SIZE_MAX) return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 return (LRESULT)focus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 LRESULT OnSetCaretIndex(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 if (idx < this->GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 this->SetFocusItem(idx); return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 void OnSetFocus(HWND) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 notifyParent(LBN_SETFOCUS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 void OnKillFocus(HWND) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 notifyParent(LBN_KILLFOCUS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 void OnSelectionChanged(pfc::bit_array const& affected, pfc::bit_array const& status) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 __super::OnSelectionChanged(affected, status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 notifyParent(LBN_SELCHANGE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 void ExecuteDefaultAction(size_t idx) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 notifyParent(LBN_DBLCLK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 void RequestReorder(size_t const* order, size_t count) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 void RequestRemoveSelection() override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 class CListControl_ListBox : public CListControl_ListBoxBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 CListControl_ListBox(DWORD style) : CListControl_ListBoxBase(style) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 BEGIN_MSG_MAP_EX(CListControl_ListBox)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 MESSAGE_HANDLER_EX(LB_INSERTSTRING, OnInsertString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 MESSAGE_HANDLER_EX(LB_ADDSTRING, OnAddString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 MESSAGE_HANDLER_EX(LB_RESETCONTENT, OnResetContent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 MESSAGE_HANDLER_EX(LB_DELETESTRING, OnDeleteString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 MESSAGE_HANDLER_EX(LB_SETITEMDATA, OnSetItemData)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 MESSAGE_HANDLER_EX(LB_GETITEMDATA, OnGetItemData)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339 MESSAGE_HANDLER_EX(LB_GETCOUNT, OnGetCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 MESSAGE_HANDLER_EX(LB_FINDSTRING, OnFindString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 MESSAGE_HANDLER_EX(LB_FINDSTRINGEXACT, OnFindStringExact)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342 MESSAGE_HANDLER_EX(LB_SETCOUNT, OnSetCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 MESSAGE_HANDLER_EX(LB_INITSTORAGE, OnInitStorage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344 MESSAGE_HANDLER_EX(LB_GETTEXT, OnGetText)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345 MESSAGE_HANDLER_EX(LB_GETTEXTLEN, OnGetTextLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 CHAIN_MSG_MAP(CListControl_ListBoxBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349 struct rec_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 pfc::string8 text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351 LPARAM data = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354 std::vector<rec_t> m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 t_size GetItemCount() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 return m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359 bool isForceSorted() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 return (m_style & LBS_SORT) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 size_t AddStringSorted(pfc::string8 && str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 size_t ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 // FIX ME bsearch??
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 // even with bsearch it's still O(n) so it's pointless
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 while (ret < m_content.size() && pfc::stricmp_ascii(str, m_content[ret].text) > 0) ++ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 m_content.insert(m_content.begin() + ret, { std::move(str) });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 this->OnItemsInserted(ret, 1, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 static pfc::string8 importString(LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 return pfc::utf8FromWide(reinterpret_cast<const wchar_t*>(lp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 LRESULT OnInsertString(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 auto str = importString(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 if (isForceSorted()) return AddStringSorted(std::move(str));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 size_t at = wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 if (at > m_content.size()) at = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381 m_content.insert(m_content.begin() + at, { std::move(str) });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382 this->OnItemsInserted(at, 1, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 return at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 LRESULT OnAddString(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386 auto str = importString(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 if (isForceSorted()) return AddStringSorted(std::move(str));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388 size_t ret = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 m_content.push_back({ std::move(str) });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 this->OnItemsInserted(ret, 1, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 LRESULT OnResetContent(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 size_t oldCount = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395 if (oldCount > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 m_content.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 this->OnItemsRemoved(pfc::bit_array_true(), oldCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 LRESULT OnDeleteString(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 size_t idx = (size_t) wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404 m_content.erase(m_content.begin() + idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405 this->OnItemRemoved(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 return m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1412 LRESULT OnSetItemData(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1413 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415 m_content[idx].data = (size_t)lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1421 LRESULT OnGetItemData(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1422 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1423 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1424 return (LRESULT)m_content[idx].data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429 LRESULT OnGetCount(UINT, WPARAM, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1430 return (LRESULT)m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1431 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 LRESULT OnFindString(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 auto str = importString(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434 const auto total = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435 size_t first = (size_t)(wp + 1) % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436 for (size_t walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 size_t at = (first + walk) % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1438 if (pfc::string_has_prefix_i(m_content[at].text, str)) return (LRESULT)at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1439 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 LRESULT OnFindStringExact(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 auto str = importString(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444 const auto total = m_content.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 size_t first = (size_t)(wp + 1) % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446 for (size_t walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1447 size_t at = (first + walk) % total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1448 if (pfc::stringEqualsI_utf8(m_content[at].text, str)) return (LRESULT)at;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 LRESULT OnSetCount(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454 m_content.resize((size_t)wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1456 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1457 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1458 LRESULT OnInitStorage(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 m_content.reserve(m_content.size() + (size_t)wp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463 LRESULT OnGetText(UINT, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1465 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1466 auto out = reinterpret_cast<wchar_t*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 wcscpy(out, pfc::wideFromUTF8(m_content[idx].text.c_str()).c_str());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1468 return LB_OKAY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1469 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1473 LRESULT OnGetTextLen(UINT, WPARAM wp, LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1474 size_t idx = (size_t)wp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 if (idx < m_content.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 return pfc::wideFromUTF8(m_content[idx].text.c_str()).length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478 return LB_ERR;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 bool GetSubItemText(size_t item, size_t subItem, pfc::string_base& out) const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1483 PFC_ASSERT(subItem == 0); (void)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1484 PFC_ASSERT(item < m_content.size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 out = m_content[item].text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 HWND CListControl_ReplaceListBox(HWND wndReplace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492 CListBox src(wndReplace);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 const auto style = src.GetStyle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494 HWND ret = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 if ((style & LBS_NODATA) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496 PFC_ASSERT(src.GetCount() == 0); // transferring of items not yet implemented
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 const auto ctrlID = src.GetDlgCtrlID();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1498 CWindow parent = src.GetParent();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1499 auto obj = PP::newWindowObj<CListControl_ListBox>(style);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 ret = obj->CreateInDialog(parent, ctrlID, src);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1502 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1503 }