annotate foosdk/sdk/libPPUI/CListControlHeaderImpl.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 "CListControl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "CListControlHeaderImpl.h" // redundant but makes intelisense quit showing false errors
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "CListControl-Cells.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "PaintUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "GDIUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "win32_utility.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "DarkMode.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include <vssym32.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 static constexpr int lineBelowHeaderCY = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 // Prevent erratic behavior of header control
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 static constexpr uint32_t columnWidthSanityLimit = 10000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 static uint32_t columWidthToPixels(uint32_t user) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 PFC_ASSERT(user <= CListControlHeaderImpl::columnWidthMax);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 return user < columnWidthSanityLimit ? user : columnWidthSanityLimit;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 static bool testDrawLineBelowHeader() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 // Win10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 return IsWindows10OrGreater();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void CListControlHeaderImpl::OnThemeChangedPT() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (m_header) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 auto dark = GetDarkMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 if (dark != m_headerDark) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 m_headerDark = dark;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 DarkMode::ApplyDarkThemeCtrl(m_header, dark, L"ItemsView");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
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 this->SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void CListControlHeaderImpl::InitializeHeaderCtrl(DWORD flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 PFC_ASSERT(IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 PFC_ASSERT(!IsHeaderEnabled());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 m_headerDark = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 WIN32_OP_D( m_header.Create(*this,NULL,NULL,WS_CHILD | flags) != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 m_header.SetFont( GetFont() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 InjectParentEraseHandler(m_header);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 this->OnThemeChangedPT();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 if (testDrawLineBelowHeader()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 WIN32_OP_D( m_headerLine.Create( *this, NULL, NULL, WS_CHILD ) != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 InjectParentEraseHandler(m_headerLine);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 UpdateHeaderLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void CListControlHeaderImpl::UpdateHeaderLayout() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 CRect client; WIN32_OP_D( GetClientRect(client) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 int cw_old = m_clientWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 m_clientWidth = client.Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if (IsHeaderEnabled()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 auto rc = client;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 rc.left -= GetViewOffset().x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 WINDOWPOS wPos = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 HDLAYOUT layout = {&rc, &wPos};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (m_header.Layout(&layout)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 m_header.SetWindowPos(wPos.hwndInsertAfter,wPos.x,wPos.y,wPos.cx,wPos.cy,wPos.flags | SWP_SHOWWINDOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (m_headerLine != NULL) m_headerLine.SetWindowPos(m_header, wPos.x, wPos.y + wPos.cy, wPos.cx, lineBelowHeaderCY, wPos.flags | SWP_SHOWWINDOW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 m_header.ShowWindow(SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (m_headerLine != NULL) m_headerLine.ShowWindow(SW_HIDE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 if ( cw_old != m_clientWidth) Invalidate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 int CListControlHeaderImpl::GetItemWidth() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (IsHeaderEnabled()) return m_itemWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 else return m_clientWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 LRESULT CListControlHeaderImpl::OnSizePassThru(UINT,WPARAM,LPARAM) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 UpdateHeaderLayout();
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 ProcessAutoWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void CListControlHeaderImpl::OnViewOriginChange(CPoint p_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 TParent::OnViewOriginChange(p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if (p_delta.x != 0) UpdateHeaderLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 void CListControlHeaderImpl::SetHeaderFont(HFONT font) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 if (IsHeaderEnabled()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_header.SetFont(font); UpdateHeaderLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 LRESULT CListControlHeaderImpl::OnHeaderCustomDraw(LPNMHDR hdr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 LPNMCUSTOMDRAW nmcd = reinterpret_cast<LPNMCUSTOMDRAW>(hdr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if ( m_header != NULL && this->GetDarkMode() && nmcd->hdr.hwndFrom == m_header) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 switch (nmcd->dwDrawStage)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 case CDDS_PREPAINT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 return CDRF_NOTIFYITEMDRAW;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 case CDDS_ITEMPREPAINT:
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 CDCHandle dc(nmcd->hdc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 dc.SetTextColor(0xdedede);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 dc.SetBkColor(0x191919); // disregarded anyway
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 return CDRF_DODEFAULT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 SetMsgHandled(FALSE); return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 LRESULT CListControlHeaderImpl::OnDividerDoubleClick(int,LPNMHDR hdr,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 const NMHEADER * info = (const NMHEADER *) hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 if (info->iButton == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 AutoColumnWidth((t_size)info->iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 LRESULT CListControlHeaderImpl::OnHeaderItemClick(int,LPNMHDR p_hdr,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 const NMHEADER * info = (const NMHEADER *) p_hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 if (info->iButton == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 OnColumnHeaderClick((t_uint32)info->iItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 LRESULT CListControlHeaderImpl::OnHeaderItemChanged(int,LPNMHDR p_hdr,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 const NMHEADER * info = (const NMHEADER*) p_hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (info->pitem->mask & (HDI_WIDTH | HDI_ORDER)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if(!m_ownColumnsChange) ProcessColumnsChange();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 LRESULT CListControlHeaderImpl::OnHeaderEndDrag(int,LPNMHDR hdr,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 NMHEADER * info = (NMHEADER*) hdr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 return OnColumnHeaderDrag(info->iItem,info->pitem->iOrder) ? TRUE : FALSE;
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 bool CListControlHeaderImpl::OnColumnHeaderDrag(t_size index, t_size newPos) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 index = GetSubItemOrder(index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 const t_size count = this->GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if ( count == 0 ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 std::vector<size_t> perm; perm.resize(count); pfc::create_move_items_permutation(&perm[0],count, pfc::bit_array_one(index), (int) newPos - (int) index );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 std::vector<int> order, newOrder; order.resize(count); newOrder.resize(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 WIN32_OP_D(m_header.GetOrderArray((int)count, &order[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 for(t_size walk = 0; walk < count; ++walk) newOrder[walk] = order[perm[walk]];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 WIN32_OP_D(m_header.SetOrderArray((int)count, &newOrder[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 t_size CListControlHeaderImpl::SubItemFromPointAbs(CPoint pt) const {
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 auto order = GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 const t_size colCount = order.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 size_t item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if (! ItemFromPointAbs(pt, item ) ) item = SIZE_MAX;
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 long xWalk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 for(t_size _walk = 0; _walk < colCount; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 const t_size walk = (t_size) order[_walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 size_t span = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 if (item != SIZE_MAX) span = this->GetSubItemSpan(item, walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 PFC_ASSERT( span == 1 || _walk == walk );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 if ( walk + span > colCount ) span = colCount - walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 long width = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 for( size_t sub = 0; sub < span; ++ sub ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 width += (long)this->GetSubItemWidth(walk + sub);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 if (xWalk + width > pt.x) return walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 xWalk += width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 _walk += span;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 return SIZE_MAX;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 bool CListControlHeaderImpl::OnClickedSpecial(DWORD status, CPoint pt) {
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 const DWORD maskButtons = MK_LBUTTON | MK_RBUTTON | MK_MBUTTON | MK_XBUTTON1 | MK_XBUTTON2;
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 if ( (status & maskButtons) != MK_LBUTTON ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (!GetCellTypeSupported()) return false;
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 size_t item; size_t subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 if (! this->GetItemAtPointAbsEx( this->PointClientToAbs(pt), item, subItem ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 auto cellType = GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 if ( !CellTypeReactsToMouseOver( cellType ) ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 auto rcHot = CellHotRect( item, subItem, cellType );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if (!rcHot.PtInRect( pt )) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 SetPressedItem(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 mySetCapture([=](UINT msg, DWORD newStatus, CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 if (msg == WM_MOUSELEAVE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 ClearPressedItem(); return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 }
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 CRect rc = this->GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 if (!rc.PtInRect(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 ClearPressedItem(); return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 size_t newItem, newSubItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 if (!this->GetItemAtPointAbsEx(this->PointClientToAbs(pt), newItem, newSubItem) || newItem != item || newSubItem != subItem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 ClearPressedItem(); return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 DWORD buttons = newStatus & maskButtons;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 if (buttons == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 // button released?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 this->defer( [=] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 OnSubItemClicked(item, subItem, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 ClearPressedItem(); return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 if (buttons != MK_LBUTTON) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 // another button pressed?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 ClearPressedItem(); return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
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 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 bool CListControlHeaderImpl::CellTypeUsesSpecialHitTests( cellType_t ct ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 if ( ct == nullptr ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 return ct->SuppressRowSelect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 bool CListControlHeaderImpl::OnClickedSpecialHitTest(CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 if ( ! GetCellTypeSupported() ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 auto ct = GetCellTypeAtPointAbs( PointClientToAbs( pt ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return CellTypeUsesSpecialHitTests(ct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 void CListControlHeaderImpl::OnItemClicked(t_size item, CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 t_size subItem = SubItemFromPointAbs( PointClientToAbs( pt ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 if (subItem != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 if ( this->GetCellTypeSupported() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 auto ct = this->GetCellType(item, subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 // we don't handle hyperlink & button clicks thru here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 if (CellTypeUsesSpecialHitTests(ct)) return;
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 OnSubItemClicked(item, subItem, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 std::vector<int> CListControlHeaderImpl::GetColumnOrderArray() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 const size_t cCount = this->GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 std::vector<int> order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if ( cCount > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 order.resize(cCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (IsHeaderEnabled()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 PFC_ASSERT(m_header.IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 PFC_ASSERT(m_header.GetItemCount() == (int)cCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 WIN32_OP_D(m_header.GetOrderArray((int)cCount, &order[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 for (size_t c = 0; c < cCount; ++c) order[c] = (int)c;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
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 return order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 void CListControlHeaderImpl::RenderItemText(t_size item,const CRect & itemRect,const CRect & updateRect,CDCHandle dc, bool allowColors) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 int xWalk = itemRect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 CRect subItemRect(itemRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 auto order = GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 const size_t cCount = order.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 SelectObjectScope fontScope(dc,GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 for(t_size _walk = 0; _walk < cCount; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 const t_size walk = order[_walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 size_t span = GetSubItemSpan(item, walk);
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 PFC_ASSERT( walk == _walk || span == 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 int width = GetSubItemWidth(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 if ( span > 1 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 if ( walk + span > cCount ) span = cCount - walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 for( size_t extraWalk = 1; extraWalk < span; ++ extraWalk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 width += GetSubItemWidth(walk + extraWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 subItemRect.left = xWalk; subItemRect.right = xWalk + width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 CRect test;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 if (test.IntersectRect(itemRect, subItemRect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 CRect subUpdate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 if (subUpdate.IntersectRect(subItemRect, updateRect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 DCStateScope scope(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 if (dc.IntersectClipRect(subItemRect) != NULLREGION) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 RenderSubItemText(item, walk, subItemRect, subUpdate, dc, allowColors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 xWalk += width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 _walk += span;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 t_size CListControlHeaderImpl::GetSubItemOrder(t_size subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if ( ! IsHeaderEnabled( ) ) return subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 HDITEM hditem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 hditem.mask = HDI_ORDER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 WIN32_OP_D( m_header.GetItem( (int) subItem, &hditem ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 return (t_size) hditem.iOrder;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 }
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 size_t CListControlHeaderImpl::GetSubItemSpan(size_t row, size_t column) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 (void)row; (void)column;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 uint32_t CListControlHeaderImpl::GetSubItemWidth(t_size subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 if ( ! IsHeaderEnabled( ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 // Should be overridden for custom columns layout
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 PFC_ASSERT( GetColumnCount() == 1 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 PFC_ASSERT( subItem == 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 return GetItemWidth();
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 if ( subItem < m_colRuntime.size() ) return m_colRuntime[subItem].m_widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 PFC_ASSERT( !"bad column idx");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 int CListControlHeaderImpl::GetHeaderItemWidth( int which ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 HDITEM hditem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 hditem.mask = HDI_WIDTH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 WIN32_OP_D( m_header.GetItem( which, &hditem) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 return hditem.cxy;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 void CListControlHeaderImpl::OnColumnsChanged() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 if ( IsHeaderEnabled() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 for( size_t walk = 0; walk < m_colRuntime.size(); ++ walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 m_colRuntime[walk].m_widthPixels = GetHeaderItemWidth( (int) walk );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 RecalcItemWidth();
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 this->OnViewAreaChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 void CListControlHeaderImpl::ResetColumns(bool update) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 m_colRuntime.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 m_itemWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 PFC_ASSERT(IsHeaderEnabled());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 int count = m_header.GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 if (count <= 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 m_header.DeleteItem(count - 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 if (update) OnColumnsChanged();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 void CListControlHeaderImpl::SetColumn( size_t which, const char * label, DWORD fmtFlags, bool updateView) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 PFC_ASSERT( IsHeaderEnabled() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 pfc::stringcvt::string_os_from_utf8 labelOS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 HDITEM item = {};
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 if (label != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 if (which < m_colRuntime.size()) m_colRuntime[which].m_text = label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 labelOS.convert(label);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 item.mask |= HDI_TEXT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 item.pszText = const_cast<TCHAR*>(labelOS.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 if (fmtFlags != UINT32_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 item.mask |= HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 item.fmt = fmtFlags | HDF_STRING;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 }
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 m_header.SetItem( (int) which, &item );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 if (updateView) OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 void CListControlHeaderImpl::GetColumnText(size_t which, pfc::string_base & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 if (which < m_colRuntime.size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 out = m_colRuntime[which].m_text.c_str();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 out = "";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 void CListControlHeaderImpl::ResizeColumn(t_size index, t_uint32 userWidth, bool updateView) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 PFC_ASSERT( IsHeaderEnabled() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 PFC_ASSERT( index < m_colRuntime.size() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 auto& rt = m_colRuntime[index];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 rt.m_userWidth = userWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 if (rt.autoWidth()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 this->ProcessAutoWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 auto widthPixels = columWidthToPixels(userWidth);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 rt.m_widthPixels = widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 item.mask = HDI_WIDTH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 item.cxy = widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 { pfc::vartoggle_t<bool> scope(m_ownColumnsChange, true); m_header.SetItem((int)index, &item); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 RecalcItemWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 if (updateView) OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 void CListControlHeaderImpl::DeleteColumns( pfc::bit_array const & mask, bool updateView ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 int nDeleted = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 const size_t oldCount = GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 mask.for_each(true, 0, oldCount, [&] (size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 int iDelete = (int) idx - nDeleted;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 bool bDeleted = m_header.DeleteItem( iDelete );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 PFC_ASSERT( bDeleted );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 if ( bDeleted ) ++ nDeleted;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 pfc::remove_mask_t( m_colRuntime, mask );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 ColumnWidthFix();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 if (updateView) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 bool CListControlHeaderImpl::DeleteColumn(size_t index, bool update) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 PFC_ASSERT( IsHeaderEnabled() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 if (!m_header.DeleteItem( (int) index )) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 pfc::remove_mask_t( m_colRuntime, pfc::bit_array_one( index ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 ColumnWidthFix();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 if (update) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 return true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 void CListControlHeaderImpl::SetSortIndicator( size_t whichColumn, bool isUp ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 HeaderControl_SetSortIndicator( GetHeaderCtrl(), (int) whichColumn, isUp );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 void CListControlHeaderImpl::ClearSortIndicator() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 HeaderControl_SetSortIndicator(GetHeaderCtrl(), -1, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 bool CListControlHeaderImpl::HaveAutoWidthContentColumns() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 for( auto i = m_colRuntime.begin(); i != m_colRuntime.end(); ++ i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 if ( i->autoWidthContent() ) return true;
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 false;
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 bool CListControlHeaderImpl::HaveAutoWidthColumns() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 for( auto i = m_colRuntime.begin(); i != m_colRuntime.end(); ++ i ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 if ( i->autoWidth() ) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 void CListControlHeaderImpl::AddColumnEx( const char * label, uint32_t widthPixelsAt96DPI, DWORD fmtFlags, bool update ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 uint32_t w = widthPixelsAt96DPI;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 if ( w <= columnWidthMax ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 w = MulDiv( w, m_dpi.cx, 96 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 AddColumn( label, w, fmtFlags, update );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 void CListControlHeaderImpl::AddColumnDLU( const char * label, uint32_t widthDLU, DWORD fmtFlags, bool update ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 uint32_t w = widthDLU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 if ( w <= columnWidthMax ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 w = ::MapDialogWidth( GetParent(), w );
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 AddColumn( label, w, fmtFlags, update );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 void CListControlHeaderImpl::AddColumnF( const char * label, float widthF, DWORD fmtFlags, bool update) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 uint32_t w = columnWidthMax;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 if ( widthF >= 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 w = pfc::rint32( widthF * m_dpi.cx / 96.0f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 AddColumn( label, w, fmtFlags, update );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 void CListControlHeaderImpl::AddColumn(const char * label, uint32_t userWidth, DWORD fmtFlags,bool update) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 // userWidth is either UINT32_MAX or desired width in pixels
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 PFC_ASSERT(IsWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 if (! IsHeaderEnabled( ) ) InitializeHeaderCtrl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 uint32_t widthPixels = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 pfc::stringcvt::string_os_from_utf8 labelOS(label);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 item.mask = HDI_TEXT | HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 if ( userWidth <= columnWidthMax ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 widthPixels = columWidthToPixels(userWidth);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 item.cxy = widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 item.mask |= HDI_WIDTH;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 item.pszText = const_cast<TCHAR*>(labelOS.get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 item.fmt = HDF_STRING | fmtFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 int iColumn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 WIN32_OP_D( (iColumn = m_header.InsertItem(m_header.GetItemCount(),&item) ) >= 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 colRuntime_t rt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531 rt.m_text = label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 rt.m_userWidth = userWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 m_itemWidth += widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 rt.m_widthPixels = widthPixels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 m_colRuntime.push_back( std::move(rt) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 if (update) OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 ProcessAutoWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 float CListControlHeaderImpl::GetColumnWidthF(size_t subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 auto w = GetSubItemWidth(subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 return (float) w * 96.0f / (float)m_dpi.cx;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 void CListControlHeaderImpl::RenderBackground(CDCHandle dc, CRect const& rc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 __super::RenderBackground(dc,rc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 if ( m_drawLineBelowHeader && IsHeaderEnabled()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 CRect rcHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 if (m_header.GetWindowRect(rcHeader)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 // Draw a grid line below header
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 int y = rcHeader.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 if ( y >= rc.top && y < rc.bottom ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 CDCPen pen(dc, GridColor());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 SelectObjectScope scope(dc, pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 dc.MoveTo(rc.left, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 dc.LineTo(rc.right, y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 }
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 CRect CListControlHeaderImpl::GetClientRectHook() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 CRect rcClient = __super::GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 if (m_header != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 PFC_ASSERT( m_header.IsWindow() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 CRect rcHeader;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 if (m_header.GetWindowRect(rcHeader)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 int h = rcHeader.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 if ( m_headerLine != NULL ) h += lineBelowHeaderCY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 rcClient.top = pfc::min_t(rcClient.bottom,rcClient.top + h);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 return rcClient;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 CRect CListControlHeaderImpl::GetItemTextRectHook(size_t, size_t, CRect const & rc) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 return GetItemTextRect( rc );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 CRect CListControlHeaderImpl::GetItemTextRect(const CRect & itemRect) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 CRect rc ( itemRect );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 rc.DeflateRect(GetColumnSpacing(),0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 return rc;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590 void CListControlHeaderImpl::SetColumnSort(t_size which, bool isUp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591 HeaderControl_SetSortIndicator(m_header,(int)which,isUp);
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 void CListControlHeaderImpl::SetColumnFormat(t_size which, DWORD format) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 item.mask = HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 item.fmt = HDF_STRING | format;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 WIN32_OP_D( m_header.SetItem((int)which,&item) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 DWORD CListControlHeaderImpl::GetColumnFormat(t_size which) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 if (!IsHeaderEnabled()) return HDF_LEFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 HDITEM hditem = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 hditem.mask = HDI_FORMAT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 WIN32_OP_D( m_header.GetItem( (int) which, &hditem) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 return hditem.fmt;
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 BOOL CListControlHeaderImpl::OnSetCursor(CWindow, UINT nHitTest, UINT message) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 (void)nHitTest;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 if ( message != 0 && GetCellTypeSupported() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 CPoint pt( (LPARAM) GetMessagePos() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613 WIN32_OP_D( ScreenToClient( &pt ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 size_t item, subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 if (GetItemAtPointAbsEx(this->PointClientToAbs(pt), item, subItem)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 auto ct = GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 if (CellTypeReactsToMouseOver(ct)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 auto rc = CellHotRect(item, subItem, ct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 if (PtInRect(rc, pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 auto cursor = ct->HotCursor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 if (cursor) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 SetCursor(cursor); return TRUE;
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 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 SetMsgHandled(FALSE); return FALSE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 bool CListControlHeaderImpl::GetItemAtPointAbsEx(CPoint pt, size_t & outItem, size_t & outSubItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 size_t item, subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 if (ItemFromPointAbs(pt, item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 subItem = SubItemFromPointAbs(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 if (subItem != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 outItem = item; outSubItem = subItem; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 CListControlHeaderImpl::cellType_t CListControlHeaderImpl::GetCellTypeAtPointAbs(CPoint pt) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 size_t item, subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 if ( GetItemAtPointAbsEx( pt, item, subItem) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 return GetCellType( item, subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 return nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 }
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 CListCell * CListControlHeaderImpl::GetCellType( size_t item, size_t subItem ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 (void)item; (void)subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 return &PFC_SINGLETON(CListCell_Text);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 void CListControlHeaderImpl::RenderSubItemText(t_size item, t_size subItem,const CRect & subItemRect,const CRect & updateRect,CDCHandle dc, bool allowColors) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 (void)updateRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 const auto cellType = GetCellType( item, subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 if ( cellType == nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 pfc::string_formatter label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 const bool bHaveText = GetSubItemText(item,subItem,label);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 if (! bHaveText ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 label = ""; //sanity
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 pfc::stringcvt::string_os_from_utf8_fast labelOS ( label );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 CListCell::DrawContentArg_t arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 arg.darkMode = this->GetDarkMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 arg.hdrFormat = GetColumnFormat( subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 arg.subItemRect = subItemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 arg.dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 arg.text = labelOS.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 arg.allowColors = allowColors;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 bool bPressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 if ( cellType->IsToggle() ) bPressed = this->GetCellCheckState(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 else bPressed = (item == m_pressedItem) && (subItem == m_pressedSubItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 bool bHot = (item == m_hotItem) && ( subItem == m_hotSubItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 if ( bPressed ) arg.cellState |= CListCell::cellState_pressed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 if ( bHot ) arg.cellState|= CListCell::cellState_hot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 arg.rcText = GetItemTextRectHook(item, subItem, subItemRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 arg.rcHot = CellHotRect(item, subItem, cellType, subItemRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 auto strTheme = cellType->Theme();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 if ( strTheme != nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 arg.theme = themeFor( strTheme ).m_theme;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 arg.colorHighlight = GetSysColorHook(colorHighlight);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 arg.thisWnd = m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 if (this->IsSubItemGrayed( item, subItem ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 arg.cellState |= CListCell::cellState_disabled;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 }
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 if (this->RenderCellImageTest(item, subItem)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 arg.imageRenderer = [this, item, subItem](CDCHandle dc, const CRect& rc) { this->RenderCellImage(item, subItem, dc, rc); };
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 CFontHandle fontRestore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 CFont fontOverride;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 LOGFONT data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 if (dc.GetCurrentFont().GetLogFont(&data)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 if ( cellType->ApplyTextStyle( data, CellTextScale(item, subItem ), arg.cellState ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 if (fontOverride.CreateFontIndirect( & data )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 fontRestore = dc.SelectFont( fontOverride );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 cellType->DrawContent( arg );
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 if ( fontRestore != NULL ) dc.SelectFont( fontRestore );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716 void CListControlHeaderImpl::RenderGroupHeaderText2(size_t baseItem,const CRect & headerRect,const CRect & updateRect,CDCHandle dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 (void)updateRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 pfc::string_formatter label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 if (GetGroupHeaderText2(baseItem,label)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 SelectObjectScope fontScope(dc,GetGroupHeaderFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 pfc::stringcvt::string_os_from_utf8 cvt(label);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 CRect contentRect(GetItemTextRect(headerRect));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 dc.DrawText(cvt,(int)cvt.length(),contentRect,DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | DT_LEFT );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 SIZE txSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 const int lineSpacing = contentRect.Height() / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 if (dc.GetTextExtent(cvt,(int)cvt.length(),&txSize)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 if (txSize.cx + lineSpacing < contentRect.Width()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 const CPoint center = contentRect.CenterPoint();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 const CPoint pt1(contentRect.left + txSize.cx + lineSpacing, center.y), pt2(contentRect.right, center.y);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 const COLORREF lineColor = PaintUtils::BlendColor(dc.GetTextColor(),dc.GetBkColor(),25);
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 #ifndef CListControl_ScrollWindowFix
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 #error FIXME CMemoryDC needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 PaintUtils::DrawSmoothedLine(dc, pt1, pt2, lineColor, 1.0 * (double)m_dpi.cy / 96.0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 uint32_t CListControlHeaderImpl::GetOptimalColumnWidthFixed(const char * fixedText, bool pad) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 SelectObjectScope fontScope(dc, GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 GetOptimalWidth_Cache cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745 cache.m_dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 cache.m_stringTemp = fixedText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 uint32_t ret = cache.GetStringTempWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 if ( pad ) ret += this->GetColumnSpacing() * 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 t_uint32 CListControlHeaderImpl::GetOptimalSubItemWidth(t_size item, t_size subItem, GetOptimalWidth_Cache & cache) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 const t_uint32 base = this->GetColumnSpacing() * 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 if (GetSubItemText(item,subItem,cache.m_stringTemp)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 return base + cache.GetStringTempWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 return base;
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 t_uint32 CListControlHeaderImpl::GetOptimalWidth_Cache::GetStringTempWidth() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 if (m_stringTemp.replace_string_ex(m_stringTempFixAmpersands, "&", "&&") > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 m_convertTemp.convert(m_stringTempFixAmpersands);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 m_convertTemp.convert(m_stringTemp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 return PaintUtils::TextOutColors_CalcWidth(m_dc, m_convertTemp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 t_uint32 CListControlHeaderImpl::GetOptimalColumnWidth(t_size which, GetOptimalWidth_Cache & cache) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 const t_size totalItems = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 t_uint32 val = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 for(t_size item = 0; item < totalItems; ++item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 pfc::max_acc( val, GetOptimalSubItemWidth( item, which, cache ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 return val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 t_uint32 CListControlHeaderImpl::GetOptimalSubItemWidthSimple(t_size item, t_size subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 SelectObjectScope fontScope(dc, GetFont() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 GetOptimalWidth_Cache cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 cache.m_dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 return GetOptimalSubItemWidth(item, subItem, cache);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 }
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 LRESULT CListControlHeaderImpl::OnKeyDown(UINT,WPARAM wp,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 switch(wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 case VK_ADD:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 if (IsKeyPressed(VK_CONTROL)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 AutoColumnWidths();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 break;
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 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 uint32_t CListControlHeaderImpl::GetOptimalColumnWidth(size_t colIndex) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 SelectObjectScope fontScope(dc, GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 GetOptimalWidth_Cache cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 cache.m_dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 uint32_t ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 const auto itemCount = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 for (t_size walk = 0; walk < itemCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 pfc::max_acc(ret, GetOptimalSubItemWidth(walk, colIndex, cache));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 }
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 void CListControlHeaderImpl::AutoColumnWidths(const pfc::bit_array & mask, bool expandLast) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 PFC_ASSERT( IsHeaderEnabled() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 if (!IsHeaderEnabled()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 const t_size itemCount = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 if (itemCount == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 const t_size columnCount = (t_size) m_header.GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 if (columnCount == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 pfc::array_t<t_uint32> widths; widths.set_size(columnCount); widths.fill_null();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 SelectObjectScope fontScope(dc,GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 GetOptimalWidth_Cache cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 cache.m_dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 for(t_size walk = 0; walk < itemCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 for(t_size colWalk = mask.find_first(true,0,columnCount); colWalk < columnCount; colWalk = mask.find_next(true,colWalk,columnCount)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 pfc::max_acc(widths[colWalk], GetOptimalSubItemWidth(walk,colWalk,cache));
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 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 // Enforce limit
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 for (auto& walk : widths) walk = columWidthToPixels(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 if (expandLast) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 uint32_t usedWidth = 0; size_t lastCol = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 pfc::array_t<int> order; order.set_size(columnCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 WIN32_OP_D( m_header.GetOrderArray((int)columnCount,order.get_ptr()) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 for(size_t _walk = 0; _walk < columnCount; ++_walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 const size_t colWalk = (size_t) order[_walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 PFC_ASSERT( colWalk < columnCount );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 if (mask[colWalk]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 lastCol = colWalk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 usedWidth += widths[colWalk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 usedWidth += GetSubItemWidth(colWalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 }
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 if (lastCol != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 t_uint32 clientWidth = this->GetClientRectHook().Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 if (clientWidth > 0) --clientWidth; // $!@# scrollbar hack
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 if (usedWidth < clientWidth) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 widths[lastCol] += clientWidth - usedWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 for(t_size colWalk = mask.find_first(true,0,columnCount); colWalk < columnCount; colWalk = mask.find_next(true,colWalk,columnCount)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 ResizeColumn(colWalk,widths[colWalk],false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 ProcessColumnsChange();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 t_uint32 CListControlHeaderImpl::GetOptimalGroupHeaderWidth2(size_t baseItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 CWindowDC dc(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 SelectObjectScope fontScope(dc,GetGroupHeaderFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 GetOptimalWidth_Cache cache; cache.m_dc = dc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868 const t_uint32 base = this->GetColumnSpacing() * 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 if (GetGroupHeaderText2(baseItem,cache.m_stringTemp)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 return base + cache.GetStringTempWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 return base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 size_t CListControlHeaderImpl::GetColumnCount() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 if ( ! IsHeaderEnabled() ) return 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 int iHeaderCount = m_header.GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 PFC_ASSERT( m_colRuntime.size() == (size_t) iHeaderCount );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 return m_colRuntime.size();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 void CListControlHeaderImpl::ColumnWidthFix() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 if ( this->HaveAutoWidthColumns() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 ProcessAutoWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 RecalcItemWidth();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 void CListControlHeaderImpl::ProcessAutoWidth() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 if ( HaveAutoWidthColumns() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895 const int clientWidth = this->GetClientRectHook().Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 if ( ! this->HaveAutoWidthContentColumns( ) && clientWidth == m_itemWidth) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 const size_t count = GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 uint32_t totalNonAuto = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 size_t numAutoWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 for(size_t walk = 0; walk < count; ++ walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 if ( m_colRuntime[walk].autoWidth() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 ++ numAutoWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 totalNonAuto += GetSubItemWidth(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 }
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 int toDivide = clientWidth - totalNonAuto;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 if ( toDivide < 0 ) toDivide = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 size_t numLeft = numAutoWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 auto worker = [&] ( size_t iCol ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 auto & rt = m_colRuntime[iCol];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 int lo = this->GetOptimalColumnWidthFixed( rt.m_text.c_str() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 if ( rt.autoWidthContent() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 int lo2 = this->GetOptimalColumnWidth( iCol );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 if ( lo < lo2 ) lo = lo2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 int width = (int)(toDivide / numLeft);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 if ( width < lo ) width = lo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 HDITEM item = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 item.mask = HDI_WIDTH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 item.cxy = width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 WIN32_OP_D( m_header.SetItem( (int) iCol, &item ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 rt.m_widthPixels = width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 if ( toDivide > width ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 toDivide -= width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 toDivide = 0;
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 -- numLeft;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 for( size_t iCol = 0; iCol < count; ++ iCol ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 if (m_colRuntime[iCol].autoWidthContent() ) worker(iCol);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 for( size_t iCol = 0; iCol < count; ++ iCol ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 if ( m_colRuntime[iCol].autoWidthPlain() ) worker(iCol);
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 RecalcItemWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946 m_header.Invalidate();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 void CListControlHeaderImpl::RecalcItemWidth() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 int total = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 const t_size count = GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 for(t_size walk = 0; walk < count; ++walk) total += GetSubItemWidth(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 m_itemWidth = total;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 CRect CListControlHeaderImpl::GetSubItemRectAbs(t_size item,t_size subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 CRect rc = GetItemRectAbs(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 auto order = GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 const t_size colCount = order.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 for(t_size _walk = 0; _walk < colCount; ++_walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 const t_size walk = (t_size) order[_walk];
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 t_size width = this->GetSubItemWidth(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 if (subItem == walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 size_t span = GetSubItemSpan(item, walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 if ( walk + span > colCount ) span = colCount - walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 for( size_t extra = 1; extra < span; ++ extra ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 width += GetSubItemWidth( walk + extra);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 rc.right = rc.left + (long)width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 return rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 rc.left += (long)width;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 throw pfc::exception_invalid_params();
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 CRect CListControlHeaderImpl::GetSubItemRect(t_size item,t_size subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 return RectAbsToClient(GetSubItemRectAbs(item, subItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 void CListControlHeaderImpl::SetHotItem(size_t row, size_t column) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 if ( m_hotItem != row || m_hotSubItem != column ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989 const size_t total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 if (m_hotItem < total) InvalidateRect(GetSubItemRect(m_hotItem, m_hotSubItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 m_hotItem = row; m_hotSubItem = column;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 if (m_hotItem < total) InvalidateRect(GetSubItemRect(m_hotItem, m_hotSubItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 HotItemChanged(row, column);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 void CListControlHeaderImpl::SetPressedItem(size_t row, size_t column) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 if (m_pressedItem != row || m_pressedSubItem != column) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 if (m_pressedItem != SIZE_MAX) InvalidateRect(GetSubItemRect(m_pressedItem, m_pressedSubItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 m_pressedItem = row; m_pressedSubItem = column;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 if (m_pressedItem != SIZE_MAX) InvalidateRect(GetSubItemRect(m_pressedItem, m_pressedSubItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 PressedItemChanged(row, column);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 void CListControlHeaderImpl::SetCellCheckState(size_t item, size_t subItem, bool value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 ReloadItem(item); (void)subItem; (void)value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 // Subclass deals with keeping track of state
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 bool CListControlHeaderImpl::ToggleSelectedItemsHook(const pfc::bit_array & mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 if (this->GetCellTypeSupported() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 bool handled = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 bool setTo = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 mask.walk(GetItemCount(), [&](size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 auto ct = this->GetCellType(idx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 if ( ct != nullptr && ct->IsToggle() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 if ( ct->IsRadioToggle() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 if (!handled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 handled = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 setTo = !this->GetCellCheckState(idx, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 this->SetCellCheckState(idx, 0, setTo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 if (!handled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 handled = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 setTo = ! this->GetCellCheckState(idx,0);
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 this->SetCellCheckState(idx,0,setTo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 }
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 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 if (handled) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 return __super::ToggleSelectedItemsHook(mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 void CListControlHeaderImpl::OnSubItemClicked(t_size item, t_size subItem, CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 auto ct = GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 if (ct != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 if (ct->IsToggle()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 if (ct->HotRect(GetSubItemRect(item, subItem)).PtInRect(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 this->SetCellCheckState(item, subItem, !GetCellCheckState(item, subItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 } else if (ct->ClickToEdit()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 this->RequestEditItem(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 bool CListControlHeaderImpl::AllowTypeFindInCell(size_t item, size_t subItem) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 auto cell = GetCellType( item, subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056 if ( cell == nullptr ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 return cell->AllowTypeFind();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 bool CListControlHeaderImpl::CellTypeReactsToMouseOver(cellType_t ct) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 return ct != nullptr && ct->IsInteractive();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 CRect CListControlHeaderImpl::CellHotRect( size_t, size_t, cellType_t ct, CRect rcCell) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 if ( ct != nullptr ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 return ct->HotRect(rcCell);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 return rcCell;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 CRect CListControlHeaderImpl::CellHotRect(size_t item, size_t subItem, cellType_t ct) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 return CellHotRect( item, subItem, ct, GetSubItemRect( item, subItem ) );
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 void CListControlHeaderImpl::OnMouseMove(UINT nFlags, CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 const DWORD maskButtons = MK_LBUTTON | MK_RBUTTON | MK_MBUTTON | MK_XBUTTON1 | MK_XBUTTON2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 if (GetCellTypeSupported() && (nFlags & maskButtons) == 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 size_t item; size_t subItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 if (this->GetItemAtPointAbsEx( PointClientToAbs(pt), item, subItem)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 auto ct = this->GetCellType( item, subItem );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 if (CellTypeReactsToMouseOver(ct) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 auto rc = CellHotRect( item, subItem, ct );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 if ( PtInRect( rc, pt ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 const bool bTrack = ct != nullptr && ct->TracksMouseMove();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 SetHotItem(item, subItem);
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 if (bTrack) this->CellTrackMouseMove(item, subItem, WM_MOUSEMOVE, nFlags, pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 mySetCapture([=](UINT msg, DWORD newStatus, CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 if (msg == WM_MOUSELEAVE) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 this->ClearHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 }
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 if ((newStatus & maskButtons) != 0 || msg == WM_MOUSEWHEEL || msg == WM_MOUSEHWHEEL ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 // A button has been pressed or wheel has been moved
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 this->ClearHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 mySetCaptureMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 if ( ! PtInRect( rc, pt ) || item >= GetItemCount() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 // Left the rect
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 this->ClearHotItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 this->mySetCaptureMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 if (bTrack) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 this->CellTrackMouseMove(item, subItem, msg, newStatus, pt);
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 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 }
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 bool CListControlHeaderImpl::AllowScrollbar(bool vertical) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 if ( vertical ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 // vertical
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 // horizontal
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 if (! IsHeaderEnabled( ) ) return false; // no header?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 }
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 void CListControlHeaderImpl::OnDestroy() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 m_colRuntime.clear();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 m_header = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 m_headerLine = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 m_headerDark = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 uint32_t CListControlHeaderImpl::GetColumnsBlankWidth( size_t colExclude ) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 auto client = this->GetClientRectHook().Width();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 int item = GetItemWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 if (colExclude) item -= GetSubItemWidth(colExclude);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 if ( item < 0 ) item = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 if ( item < client ) return (uint32_t)( client - item );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 else return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 void CListControlHeaderImpl::SizeColumnToContent( size_t which, uint32_t minWidth ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 auto width = this->GetOptimalColumnWidth( which );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 if ( width < minWidth ) width = minWidth;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 this->ResizeColumn( which, width );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 void CListControlHeaderImpl::SizeColumnToContentFillBlank( size_t which ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 this->SizeColumnToContent( which, this->GetColumnsBlankWidth(which) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 HBRUSH CListControlHeaderImpl::OnCtlColorStatic(CDCHandle dc, CStatic wndStatic) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 if ( wndStatic == m_headerLine ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 COLORREF col = GridColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 dc.SetDCBrushColor( col );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 return (HBRUSH) GetStockObject(DC_BRUSH);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 }
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 void CListControlHeaderImpl::ReloadData() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 __super::ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 if ( this->HaveAutoWidthContentColumns( ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 this->ColumnWidthFix();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 void CListControlHeaderImpl::RenderGroupOverlay(size_t baseItem, const CRect& p_groupWhole, const CRect& p_updateRect, CDCHandle dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 CRect subItemRect = p_groupWhole;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 t_uint32 xWalk = p_groupWhole.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 auto order = GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 const size_t cCount = order.size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 for (t_size _walk = 0; _walk < cCount; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 const t_size walk = order[_walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 t_uint32 width = GetSubItemWidth(walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 subItemRect.left = xWalk; subItemRect.right = xWalk + width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 CRect subUpdate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 if (subUpdate.IntersectRect(subItemRect, p_updateRect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 DCStateScope scope(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 if (dc.IntersectClipRect(subItemRect) != NULLREGION) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 this->RenderGroupOverlayColumn(baseItem, walk, subItemRect, subUpdate, dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 }
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 xWalk += width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 _walk += 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199 void CListControlHeaderImpl::UpdateGroupOverlayColumnByID(groupID_t groupID, size_t subItem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 if (this->GetItemCount() == 0) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 CRect rc = this->GetSubItemRectAbs(0, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 this->UpdateGroupOverlayByID(groupID, rc.left, rc.right);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 void CListControlHeaderImpl::mySetCapture(CaptureProc_t proc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206 this->m_captureProc = proc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 this->TrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 void CListControlHeaderImpl::myReleaseCapture() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211 m_captureProc = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 void CListControlHeaderImpl::TrackMouseLeave() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 TRACKMOUSEEVENT tme = { sizeof(tme) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 tme.dwFlags = TME_LEAVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 tme.hwndTrack = m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 TrackMouseEvent(&tme);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 LRESULT CListControlHeaderImpl::MousePassThru(UINT msg, WPARAM wp, LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 auto p = m_captureProc; // create local ref in case something in mid-captureproc clears it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 if (p) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 CPoint pt(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 if (!p(msg, (DWORD)wp, pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 myReleaseCapture();
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 void CListControlHeaderImpl::OnMouseLeave() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 if (m_captureProc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 m_captureProc(WM_MOUSELEAVE, 0, -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 myReleaseCapture();
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 void CListControlHeaderImpl::OnKillFocus(CWindow) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 myReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 void CListControlHeaderImpl::OnWindowPosChanged(LPWINDOWPOS arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 if (arg->flags & SWP_HIDEWINDOW) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 myReleaseCapture();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 }
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 void CListControlHeaderImpl::RequestEditItem(size_t, size_t) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255 PFC_ASSERT(!"Please enable CListControl_EditImpl");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 void CListControlHeaderImpl::OnLButtonDblClk(UINT nFlags, CPoint point) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 if (this->GetCellTypeSupported()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 auto ptAbs = PointClientToAbs(point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 size_t item = this->ItemFromPointAbs(ptAbs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 size_t subItem = SubItemFromPointAbs(ptAbs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 if (item != SIZE_MAX && subItem != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 auto ct = GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 if (ct != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 if (ct->IsToggle()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 if (ct->HotRect(GetSubItemRect(item, subItem)).PtInRect(point)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 return; // disregard doubleclick on checkbox
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 SetMsgHandled(FALSE); // handle doubleclick
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
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 void CListControlHeaderImpl::RenderItemBackground(CDCHandle p_dc, const CRect& p_itemRect, size_t item, uint32_t bkColor) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 if (!this->DelimitColumns()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 __super::RenderItemBackground(p_dc, p_itemRect, item, bkColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 auto cnt = this->GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 const auto order = this->GetColumnOrderArray();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 uint32_t x = p_itemRect.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 for (size_t walk = 0; walk < cnt; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 const size_t sub = order[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 auto span = this->GetSubItemSpan(item, sub);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 PFC_ASSERT(span > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 uint32_t width = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 for (size_t walk2 = 0; walk2 < span; ++walk2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 width += this->GetSubItemWidth(sub + walk2);
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 CRect rc = p_itemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 rc.left = x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 x += width;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 rc.right = x;
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 CRect test;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 if (test.IntersectRect(rc, p_itemRect)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 DCStateScope s(p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 if (p_dc.IntersectClipRect(rc) != NULLREGION) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 __super::RenderItemBackground(p_dc, rc, item, bkColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 }
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 walk += span;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 }