annotate foosdk/sdk/libPPUI/CListControlWithSelection.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 <vsstyle.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "CListControlWithSelection.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 "IDataObjectUtils.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include "SmartStrStr.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "CListControl-Cells.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 class bit_array_selection_CListControl : public pfc::bit_array {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 bit_array_selection_CListControl(CListControlWithSelectionBase const & list) : m_list(list) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 bool get(t_size n) const {return m_list.IsItemSelected(n);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 CListControlWithSelectionBase const & m_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
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 bool CListControlWithSelectionBase::SelectAll() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 SetSelection(pfc::bit_array_true(), pfc::bit_array_true() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void CListControlWithSelectionBase::SelectNone() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 SetSelection(pfc::bit_array_true(), pfc::bit_array_false() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 void CListControlWithSelectionBase::SetSelectionAt(size_t idx, bool bSel) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 if (bSel == this->IsItemSelected(idx)) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 this->SetSelection(pfc::bit_array_one(idx), pfc::bit_array_val(bSel));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void CListControlWithSelectionBase::SelectSingle(size_t which) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 this->SetFocusItem( which );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 SetSelection(pfc::bit_array_true(), pfc::bit_array_one( which ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 LRESULT CListControlWithSelectionBase::OnFocus(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 UpdateItems(pfc::bit_array_or(bit_array_selection_CListControl(*this), pfc::bit_array_one(GetFocusItem())));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void CListControlWithSelectionBase::OnKeyDown_SetIndexDeltaPageHelper(int p_delta, int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 const CRect rcClient = GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 int itemHeight = GetItemHeight();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if (itemHeight > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 int delta = rcClient.Height() / itemHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 if (delta < 1) delta = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 OnKeyDown_SetIndexDeltaHelper(delta * p_delta,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
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 void CListControlWithSelectionBase::OnKeyDown_HomeEndHelper(bool isEnd, int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (!isEnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //SPECIAL FIX - ensure first group header visibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 MoveViewOrigin(CPoint(GetViewOrigin().x,0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 const t_size itemCount = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 if (itemCount == 0) return;//don't bother
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 if ((p_keys & (MK_SHIFT|MK_CONTROL)) == (MK_SHIFT|MK_CONTROL)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 RequestMoveSelection( isEnd ? (int)itemCount : -(int)itemCount );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 OnKeyDown_SetIndexHelper(isEnd ? (int)(itemCount-1) : 0,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 void CListControlWithSelectionBase::OnKeyDown_SetIndexHelper(int p_index, int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 const t_size count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 t_size idx = (t_size)pfc::clip_t(p_index,0,(int)(count - 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 const t_size oldFocus = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 if (p_keys & MK_CONTROL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 SetFocusItem(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 } else if ((p_keys & MK_SHIFT) != 0 && this->AllowRangeSelect() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 t_size selStart = GetSelectionStart();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (selStart == pfc_infinite) selStart = oldFocus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (selStart == pfc_infinite) selStart = idx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 t_size selFirst, selCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 selFirst = pfc::min_t(selStart,idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 selCount = pfc::max_t(selStart,idx) + 1 - selFirst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 SetSelection(pfc::bit_array_true(), pfc::bit_array_range(selFirst,selCount));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 SetFocusItem(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 SetSelectionStart(selStart);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 SetFocusItem(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 SetSelection(pfc::bit_array_true(), pfc::bit_array_one(idx));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
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 CListControlWithSelectionBase::SelectGroupHelper2(size_t base,int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 size_t count = this->ResolveGroupRange2(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 if ( count > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if (p_keys & MK_CONTROL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 SetGroupFocusByItem(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 } /*else if (p_keys & MK_SHIFT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 } */else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 SetGroupFocusByItem(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 SetSelection(pfc::bit_array_true(), pfc::bit_array_range(base,count));
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void CListControlWithSelectionBase::OnKeyDown_SetIndexDeltaLineHelper(int p_delta, int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 if ((p_keys & (MK_SHIFT | MK_CONTROL)) == (MK_SHIFT|MK_CONTROL)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 this->RequestMoveSelection(p_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 const t_size total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 t_size current = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 const size_t focusGroupItem = this->GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (focusGroupItem != SIZE_MAX) current = focusGroupItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 if (current == pfc_infinite) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 OnKeyDown_SetIndexDeltaHelper(p_delta,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 return;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 const groupID_t currentGroup = GetItemGroup(current);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if (GroupFocusActive()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 if (p_delta < 0 && focusGroupItem > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 OnKeyDown_SetIndexHelper((int)(focusGroupItem-1), p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 } else if (p_delta > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 OnKeyDown_SetIndexHelper((int) current, p_keys);
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 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if ((p_keys & MK_SHIFT) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 OnKeyDown_SetIndexDeltaHelper(p_delta,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 } else if (p_delta < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (currentGroup == 0 || (current > 0 && currentGroup == GetItemGroup(current - 1))) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 OnKeyDown_SetIndexDeltaHelper(p_delta,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 SelectGroupHelper2(current, p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 } else if (p_delta > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 if (current + 1 >= total || currentGroup == GetItemGroup(current + 1)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 OnKeyDown_SetIndexDeltaHelper(p_delta,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 SelectGroupHelper2(current + 1, p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
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 }
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 CListControlWithSelectionBase::OnLButtonDblClk(UINT,WPARAM p_wp,LPARAM p_lp,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 CPoint pt(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if (OnClickedSpecialHitTest(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 return OnButtonDown(WM_LBUTTONDOWN, p_wp, p_lp, bHandled);
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 t_size item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if (ItemFromPoint(pt,item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 ExecuteDefaultAction(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 } else if (GroupHeaderFromPoint2(pt,item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 t_size count = this->ResolveGroupRange2(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (count > 0) ExecuteDefaultActionGroup(item, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 } else if (ExecuteCanvasDefaultAction(pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return OnButtonDown(WM_LBUTTONDOWN,p_wp,p_lp,bHandled);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
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 void CListControlWithSelectionBase::ExecuteDefaultActionByFocus() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 size_t groupFocus = this->GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 if ( groupFocus != SIZE_MAX ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 size_t count = this->ResolveGroupRange2(groupFocus);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if (count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 ExecuteDefaultActionGroup(groupFocus, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 size_t index = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 if (index != SIZE_MAX) this->ExecuteDefaultAction(index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
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 t_size CListControlWithSelectionBase::GetSingleSel() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 t_size total = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 t_size first = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 if (IsItemSelected(walk)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 if (first == SIZE_MAX) first = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 else return SIZE_MAX;
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 return first;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 t_size CListControlWithSelectionBase::GetSelectedCount(pfc::bit_array const & mask,t_size max) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 const t_size itemCount = this->GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 t_size found = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 for(t_size walk = mask.find_first(true,0,itemCount); walk < itemCount && found < max; walk = mask.find_next(true,walk,itemCount)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 if (IsItemSelected(walk)) ++found;
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 return found;
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 LRESULT CListControlWithSelectionBase::OnButtonDown(UINT p_msg,WPARAM p_wp,LPARAM p_lp,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 pfc::vartoggle_t<bool> l_noEnsureVisible(m_noEnsureVisible,true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (m_selectDragMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 AbortSelectDragMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 CPoint pt(p_lp);
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 if (OnClickedSpecial( (DWORD) p_wp, pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 size_t item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 const bool isRightClick = (p_msg == WM_RBUTTONDOWN || p_msg == WM_RBUTTONDBLCLK);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 const bool gotCtrl = (p_wp & MK_CONTROL) != 0 && !isRightClick;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 const bool gotShift = (p_wp & MK_SHIFT) != 0 && !isRightClick;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
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 const bool bCanSelect = !OnClickedSpecialHitTest( pt );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 const bool instaDrag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 const bool ddSupported = IsDragDropSupported();
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 if (GroupHeaderFromPoint2(pt, item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 t_size base = item,count = ResolveGroupRange2(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 if (AllowRangeSelect() && count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 SetGroupFocusByItem(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 pfc::bit_array_range groupRange(base,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 bool instaDragOverride = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 if (gotCtrl) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 ToggleRangeSelection(groupRange);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 } else if (gotShift) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 SetSelection(groupRange, pfc::bit_array_true());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 if (GetSelectedCount(groupRange) == count) instaDragOverride = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 else SetSelection(pfc::bit_array_true(),groupRange);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 if (ddSupported && (instaDrag || instaDragOverride)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 PrepareDragDrop(pt,isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 InitSelectDragMode(pt, isRightClick);
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 } else if (ItemFromPoint(pt,item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 const t_size oldFocus = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 const t_size selStartBefore = GetSelectionStart();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if ( bCanSelect ) SetFocusItem(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 if (gotShift && AllowRangeSelect() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (bCanSelect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 t_size selStart = selStartBefore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 if (selStart == pfc_infinite) selStart = oldFocus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 if (selStart == pfc_infinite) selStart = item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 SetSelectionStart(selStart);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 t_size selFirst, selCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 selFirst = pfc::min_t(selStart, item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 selCount = pfc::max_t(selStart, item) + 1 - selFirst;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 pfc::bit_array_range rangeMask(selFirst, selCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 pfc::bit_array_true trueMask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 SetSelection(gotCtrl ? pfc::implicit_cast<const pfc::bit_array&>(rangeMask) : pfc::implicit_cast<const pfc::bit_array&>(trueMask), rangeMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 //if (!instaDrag) InitSelectDragMode(pt, isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 if (gotCtrl) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 if (bCanSelect) SetSelection(pfc::bit_array_one(item), pfc::bit_array_val(!IsItemSelected(item)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 if (!instaDrag) InitSelectDragMode(pt, isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 if (!IsItemSelected(item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 if (bCanSelect) SetSelection(pfc::bit_array_true(), pfc::bit_array_one(item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 if (ddSupported && instaDrag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 PrepareDragDrop(pt,isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 InitSelectDragMode(pt, isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 if (ddSupported) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 PrepareDragDrop(pt,isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 InitSelectDragMode(pt, isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if (!gotShift && !gotCtrl && bCanSelect) SelectNone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 InitSelectDragMode(pt, isRightClick);
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 void CListControlWithSelectionBase::ToggleRangeSelection(pfc::bit_array const & mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 SetSelection(mask, pfc::bit_array_val(GetSelectedCount(mask,1) == 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 void CListControlWithSelectionBase::ToggleGroupSelection2(size_t base) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 size_t count = this->ResolveGroupRange2(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 if (count > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 ToggleRangeSelection(pfc::bit_array_range(base, count));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 LRESULT CListControlWithSelectionBase::OnRButtonUp(UINT,WPARAM,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 AbortPrepareDragDropMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 AbortSelectDragMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 bool CListControlWithSelectionBase::ShouldBeginDrag(CPoint ptRef, CPoint ptNow) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 auto threshold = PP::queryDragThresholdForDPI(this->GetDPI());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 return abs(ptNow.x - ptRef.x) > threshold.cx || abs(ptNow.y - ptRef.y) > threshold.cy;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 LRESULT CListControlWithSelectionBase::OnMouseMove(UINT,WPARAM,LPARAM p_lp,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if (m_prepareDragDropMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 if (ShouldBeginDrag(m_prepareDragDropOrigin, CPoint(p_lp))) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 AbortPrepareDragDropMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 if (!m_ownDDActive) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 pfc::vartoggle_t<bool> ownDD(m_ownDDActive,true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 RunDragDrop( PointClientToAbs( m_prepareDragDropOrigin ),m_prepareDragDropModeRightClick);
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 } else if (m_selectDragMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 HandleDragSel(CPoint(p_lp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 return 0;
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 LRESULT CListControlWithSelectionBase::OnLButtonUp(UINT,WPARAM p_wp,LPARAM p_lp,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 const bool wasPreparingDD = m_prepareDragDropMode;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 AbortPrepareDragDropMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 CPoint pt(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 const bool gotCtrl = (p_wp & MK_CONTROL) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 const bool gotShift = (p_wp & MK_SHIFT) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 bool click = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 bool processSel = wasPreparingDD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 if (m_selectDragMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 processSel = !m_selectDragMoved;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 AbortSelectDragMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 if (processSel) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 click = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 if (!OnClickedSpecialHitTest(pt) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 size_t item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 if (GroupHeaderFromPoint2(pt, item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 t_size base = item, count = ResolveGroupRange2(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 if ( count > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 if (gotCtrl) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 SetSelection(pfc::bit_array_true(), pfc::bit_array_range(base, count));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 } else if (ItemFromPoint(pt, item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 const t_size selStartBefore = GetSelectionStart();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 if (gotCtrl) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 } else if (gotShift) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 SetSelectionStart(selStartBefore);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 SetSelection(pfc::bit_array_true(), pfc::bit_array_one(item));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 if (click && !gotCtrl && !gotShift) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 size_t item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 if (GroupHeaderFromPoint2(pt,item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 OnGroupHeaderClicked(GetItemGroup(item),pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 } else if (ItemFromPoint(pt,item)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 OnItemClicked(item,pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 }
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 void CListControlWithSelectionBase::OnKeyDown_SetIndexDeltaHelper(int p_delta, int p_keys) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 size_t focus = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 if (this->GroupFocusActive()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 focus = this->GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 focus = GetFocusItem();
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 int target = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 if (focus != SIZE_MAX) target = (int) focus + p_delta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 OnKeyDown_SetIndexHelper(target,p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 static int _get_keyflags() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 int ret = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 if (IsKeyPressed(VK_CONTROL)) ret |= MK_CONTROL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 if (IsKeyPressed(VK_SHIFT)) ret |= MK_SHIFT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 LRESULT CListControlWithSelectionBase::OnKeyDown(UINT,WPARAM p_wp,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 switch(p_wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 case VK_NEXT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 OnKeyDown_SetIndexDeltaPageHelper(1,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 case VK_PRIOR:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 OnKeyDown_SetIndexDeltaPageHelper(-1,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 case VK_DOWN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 OnKeyDown_SetIndexDeltaLineHelper(1,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 case VK_UP:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 OnKeyDown_SetIndexDeltaLineHelper(-1,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 case VK_HOME:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 OnKeyDown_HomeEndHelper(false,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 case VK_END:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 OnKeyDown_HomeEndHelper(true,_get_keyflags());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 case VK_SPACE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 if (!TypeFindCheck()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 ToggleSelectedItems();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 case VK_RETURN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 ExecuteDefaultActionByFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 case VK_DELETE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 if (GetHotkeyModifierFlags() == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 RequestRemoveSelection();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 case 'A':
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 if (GetHotkeyModifierFlags() == MOD_CONTROL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 if (SelectAll()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 return 0;
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 // otherwise unhandled
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 void CListControlWithSelectionBase::ToggleSelectedItems() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 if (ToggleSelectedItemsHook(bit_array_selection_CListControl(*this))) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 if (GroupFocusActive()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 ToggleGroupSelection2(this->GetGroupFocus2());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 const t_size focus = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446 if (focus != pfc_infinite) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 ToggleRangeSelection(pfc::bit_array_range(focus, 1));
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 LRESULT CListControlWithSelectionBase::OnTimer(UINT,WPARAM p_wp,LPARAM,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 switch((DWORD)p_wp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 case (DWORD)KSelectionTimerID:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 if (m_selectDragMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 if (GetCursorPos(&pt) && ScreenToClient(&pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 const CRect client = GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 CPoint delta(0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 if (pt.x < client.left) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 delta.x = pt.x - client.left;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 } else if (pt.x > client.right) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 delta.x = pt.x - client.right;
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 if (pt.y < client.top) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 delta.y = pt.y - client.top;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 } else if (pt.y > client.bottom) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 delta.y = pt.y - client.bottom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 }
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 MoveViewOriginDelta(delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 HandleDragSel(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 }
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 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 case TDDScrollControl::KTimerID:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 HandleDDScroll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485 bool CListControlWithSelectionBase::MoveSelectionProbe(int delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 pfc::array_t<size_t> order; order.set_size(GetItemCount());
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 bit_array_selection_CListControl sel(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 pfc::create_move_items_permutation(order.get_ptr(), order.get_size(), sel, delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 for( size_t w = 0; w < order.get_size(); ++w ) if ( order[w] != w ) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 void CListControlWithSelectionBase::RequestMoveSelection(int delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 pfc::array_t<size_t> order; order.set_size(GetItemCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 bit_array_selection_CListControl sel(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 pfc::create_move_items_permutation(order.get_ptr(), order.get_size(), sel, delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 }
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 this->RequestReorder(order.get_ptr(), order.get_size());
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 if (delta < 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504 size_t idx = GetFirstSelected();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 if (idx != pfc_infinite) EnsureItemVisible(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 size_t idx = GetLastSelected();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 if (idx != pfc_infinite) EnsureItemVisible(idx);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 void CListControlWithSelectionBase::ToggleSelection(pfc::bit_array const & mask) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 const t_size count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 pfc::bit_array_bittable table(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 for(t_size walk = mask.find_first(true,0,count); walk < count; walk = mask.find_next(true,walk,count)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 table.set(walk,!IsItemSelected(walk));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 this->SetSelection(mask,table);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521 static HRGN FrameRectRgn(const CRect & rect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 CRect exterior(rect); exterior.InflateRect(1,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 CRgn rgn; rgn.CreateRectRgnIndirect(exterior);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 CRect interior(rect); interior.DeflateRect(1,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 if (!interior.IsRectEmpty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526 CRgn rgn2; rgn2.CreateRectRgnIndirect(interior);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 rgn.CombineRgn(rgn2,RGN_DIFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 return rgn.Detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 void CListControlWithSelectionBase::HandleDragSel(const CPoint & p_pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 const CPoint pt = PointClientToAbs(p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 if (m_selectDragMoved || ShouldBeginDrag(m_selectDragCurrentAbs, pt)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 if (!this->AllowRangeSelect()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537 // simplified
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538 m_selectDragCurrentAbs = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 if (pt != m_selectDragOriginAbs) m_selectDragMoved = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 return;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 CRect rcOld(m_selectDragOriginAbs,m_selectDragCurrentAbs); rcOld.NormalizeRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 m_selectDragCurrentAbs = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 CRect rcNew(m_selectDragOriginAbs,m_selectDragCurrentAbs); rcNew.NormalizeRect();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 CRgn rgn = FrameRectRgn(rcNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 CRgn rgn2 = FrameRectRgn(rcOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 rgn.CombineRgn(rgn2,RGN_OR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 rgn.OffsetRgn( - GetViewOffset() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 InvalidateRgn(rgn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 if (pt != m_selectDragOriginAbs) m_selectDragMoved = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 if (m_selectDragChanged || !IsSameItemOrHeaderAbs(pt,m_selectDragOriginAbs)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 m_selectDragChanged = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 const int keys = _get_keyflags();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 t_size base,count, baseOld, countOld;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 if (!GetItemRangeAbs(rcNew,base,count)) base = count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 if (!GetItemRangeAbs(rcOld,baseOld,countOld)) baseOld = countOld = 0;
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 pfc::bit_array_range rangeNew(base,count), rangeOld(baseOld,countOld);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 if (keys & MK_CONTROL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 ToggleSelection(pfc::bit_array_xor(rangeNew,rangeOld));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 } else if (keys & MK_SHIFT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 SetSelection(pfc::bit_array_or(rangeNew,rangeOld),rangeNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571 SetSelection(pfc::bit_array_true(),rangeNew);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574 if (ItemFromPointAbs(pt,base)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 const CRect rcVisible = GetVisibleRectAbs(), rcItem = GetItemRectAbs(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 if (rcItem.top >= rcVisible.top && rcItem.bottom <= rcVisible.bottom) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 SetFocusItem(base);
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 } else if (GroupHeaderFromPointAbs2(pt,base)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580 const CRect rcVisible = GetVisibleRectAbs();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581 CRect rcGroup;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 if (GetGroupHeaderRectAbs2(base,rcGroup)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 if (rcGroup.top >= rcVisible.top && rcGroup.bottom <= rcVisible.bottom) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 this->SetGroupFocusByItem(base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 void CListControlWithSelectionBase::InitSelectDragMode(const CPoint & p_pt,bool p_rightClick) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 // Perform the bookkeeping even if multiple selection is disabled, detection of clicks relies on it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594 (void)p_rightClick;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 SetTimer(KSelectionTimerID,KSelectionTimerPeriod);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 m_selectDragMode = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 m_selectDragOriginAbs = m_selectDragCurrentAbs = PointClientToAbs(p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 m_selectDragChanged = false; m_selectDragMoved = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 SetCapture();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 void CListControlWithSelectionBase::AbortSelectDragMode(bool p_lostCapture) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 if (m_selectDragMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 m_selectDragMode = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 CRect rcSelect(m_selectDragOriginAbs,m_selectDragCurrentAbs); rcSelect.NormalizeRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 rcSelect.OffsetRect( - GetViewOffset() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 if (!p_lostCapture) ::SetCapture(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 rcSelect.InflateRect(1,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 InvalidateRect(rcSelect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 KillTimer(KSelectionTimerID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 LRESULT CListControlWithSelectionBase::OnCaptureChanged(UINT,WPARAM,LPARAM,BOOL&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 AbortPrepareDragDropMode(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 AbortSelectDragMode(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 void CListControlWithSelectionBase::RenderOverlay2(const CRect & p_updaterect,CDCHandle p_dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 if (m_selectDragMode && this->AllowRangeSelect() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 CRect rcSelect(m_selectDragOriginAbs,m_selectDragCurrentAbs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624 rcSelect.NormalizeRect();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 rcSelect.OffsetRect(-GetViewOffset());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 PaintUtils::FocusRect(p_dc,rcSelect);
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 if (m_dropMark != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 RenderDropMarkerClipped2(p_dc, p_updaterect, m_dropMark, m_dropMarkInside);
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 TParent::RenderOverlay2(p_updaterect,p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 void CListControlWithSelectionBase::SetDropMark(size_t mark, bool inside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 if (mark != m_dropMark || inside != m_dropMarkInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 CRgn updateRgn; updateRgn.CreateRectRgn(0, 0, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 AddDropMarkToUpdateRgn(updateRgn, m_dropMark, m_dropMarkInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 m_dropMark = mark;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 m_dropMarkInside = inside;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 AddDropMarkToUpdateRgn(updateRgn, m_dropMark, m_dropMarkInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 RedrawWindow(NULL, updateRgn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 static int transformDDScroll(int p_value,int p_width, int p_dpi) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 if (p_dpi <= 0) p_dpi = 96;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 const double dpiMul = 96.0 / (double) p_dpi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 double val = (double)(p_width - p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 val *= dpiMul;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 val = pow(val,1.1) * 0.33;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 val /= dpiMul;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 return pfc::rint32(val);
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 CListControlWithSelectionBase::HandleDDScroll() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 CPoint position;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657 if (m_ddScroll.m_timerActive && GetCursorPos(&position)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 CRect client = GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 CPoint delta (0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 if (ClientToScreen(client)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 const CSize DPI = QueryScreenDPIEx();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 const int scrollZoneWidthBase = GetItemHeight() * 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 const int scrollZoneHeight = pfc::min_t<int>( scrollZoneWidthBase, client.Height() / 4 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 const int scrollZoneWidth = pfc::min_t<int>( scrollZoneWidthBase, client.Width() / 4 );
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 if (position.y >= client.top && position.y < client.top + scrollZoneHeight) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 delta.y -= transformDDScroll(position.y - client.top, scrollZoneHeight, DPI.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 } else if (position.y >= client.bottom - scrollZoneHeight && position.y < client.bottom) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 delta.y += transformDDScroll(client.bottom - position.y, scrollZoneHeight, DPI.cy);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 if (position.x >= client.left && position.x < client.left + scrollZoneWidth) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673 delta.x -= transformDDScroll(position.x - client.left, scrollZoneWidth, DPI.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 } else if (position.x >= client.right - scrollZoneWidth && position.x < client.right) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 delta.x += transformDDScroll(client.right - position.x, scrollZoneWidth, DPI.cx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 if (delta != CPoint(0,0)) MoveViewOriginDelta(delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 void CListControlWithSelectionBase::ToggleDDScroll(bool p_state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 if (p_state != m_ddScroll.m_timerActive) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685 if (p_state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 SetTimer(m_ddScroll.KTimerID,m_ddScroll.KTimerPeriod);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688 KillTimer(m_ddScroll.KTimerID);
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 m_ddScroll.m_timerActive = p_state;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 void CListControlWithSelectionBase::PrepareDragDrop(const CPoint & p_point,bool p_isRightClick) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 m_prepareDragDropMode = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 m_prepareDragDropOrigin = p_point;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 m_prepareDragDropModeRightClick = p_isRightClick;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 SetCapture();
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 void CListControlWithSelectionBase::AbortPrepareDragDropMode(bool p_lostCapture) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 if (m_prepareDragDropMode) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702 m_prepareDragDropMode = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 if (!p_lostCapture) ::SetCapture(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 void CListControlWithSelectionBase::RenderItem(t_size p_item,const CRect & p_itemRect,const CRect & p_updateRect,CDCHandle p_dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 //console::formatter() << "RenderItem: " << p_item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 const bool weHaveFocus = ::GetFocus() == m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 const bool isSelected = this->IsItemSelected(p_item);
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 const t_uint32 bkColor = GetSysColorHook(colorBackground);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 const t_uint32 hlColor = GetSysColorHook(colorSelection);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715 const t_uint32 bkColorUsed = isSelected ? (weHaveFocus ? hlColor : PaintUtils::BlendColor(hlColor,bkColor)) : bkColor;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 bool alternateTextColor = false, dtt = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 auto & m_theme = theme();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 CRect rcSelection = p_itemRect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720 this->AdjustSelectionRect(p_item, rcSelection);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 if (m_theme != NULL && isSelected && hlColor == GetSysColor(COLOR_HIGHLIGHT) && /*bkColor == GetSysColor(COLOR_WINDOW) && */ IsThemePartDefined(m_theme, LVP_LISTITEM, 0)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 //PaintUtils::RenderItemBackground(p_dc,p_itemRect,p_item+GetItemGroup(p_item),bkColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 DrawThemeBackground(m_theme, p_dc, LVP_LISTITEM, weHaveFocus ? LISS_SELECTED : LISS_SELECTEDNOTFOCUS, rcSelection, p_updateRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 // drawthemetext is acting whacky with dark mode
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725 if (!this->GetDarkMode()) dtt = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 this->RenderItemBackground(p_dc, rcSelection, p_item, bkColorUsed );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728 // PaintUtils::RenderItemBackground(p_dc,p_itemRect,p_item+GetItemGroup(p_item),bkColorUsed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 if (isSelected) alternateTextColor = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733 DCStateScope backup(p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 p_dc.SetBkMode(TRANSPARENT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 p_dc.SetBkColor(bkColorUsed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 p_dc.SetTextColor(alternateTextColor ? PaintUtils::DetermineTextColor(bkColorUsed) : this->GetSysColorHook(colorText));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 pfc::vartoggle_t<bool> toggle(m_drawThemeText, dtt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 RenderItemText(p_item,p_itemRect,p_updateRect,p_dc, !alternateTextColor);
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 if (IsItemFocused(p_item) && weHaveFocus) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 PaintUtils::FocusRect2(p_dc,rcSelection, bkColorUsed);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 void CListControlWithSelectionBase::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
747 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748 auto ct = GetCellType(item, subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 if ( ct == nullptr ) return;
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 if (m_drawThemeText && ct->AllowDrawThemeText() && !this->IsSubItemGrayed(item, subItem)) for(;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 pfc::string_formatter label;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753 if (!GetSubItemText(item,subItem,label)) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 const bool weHaveFocus = ::GetFocus() == m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 // const bool isSelected = this->IsItemSelected(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 pfc::stringcvt::string_os_from_utf8 cvt(label);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 if (PaintUtils::TextContainsCodes(cvt)) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 CRect clip = GetItemTextRect(subItemRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759 const t_uint32 format = PaintUtils::DrawText_TranslateHeaderAlignment(GetColumnFormat(subItem));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 DrawThemeText(theme(), dc, LVP_LISTITEM, weHaveFocus ? LISS_SELECTED : LISS_SELECTEDNOTFOCUS, cvt, (int)cvt.length(), DT_NOPREFIX | DT_END_ELLIPSIS | DT_SINGLELINE | DT_VCENTER | format, 0, clip);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 __super::RenderSubItemText(item, subItem, subItemRect, updateRect, dc, allowColors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 }
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 void CListControlWithSelectionBase::RenderGroupHeader2(size_t baseItem,const CRect & p_headerRect,const CRect & p_updateRect,CDCHandle p_dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 TParent::RenderGroupHeader2(baseItem,p_headerRect,p_updateRect,p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769 if (IsGroupHeaderFocused2(baseItem)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 PaintUtils::FocusRect(p_dc,p_headerRect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 CRect CListControlWithSelectionBase::DropMarkerUpdateRect(t_size index,bool bInside) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 if (index != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 CRect rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 if (bInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 rect = GetItemRect(index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 rect.InflateRect(DropMarkerMargin());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 rect = DropMarkerRect(DropMarkerOffset(index));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783 return rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 return CRect(0,0,0,0);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 void CListControlWithSelectionBase::AddDropMarkToUpdateRgn(HRGN p_rgn, t_size p_index, bool bInside) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 CRect rect = DropMarkerUpdateRect(p_index,bInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 if (!rect.IsRectEmpty()) PaintUtils::AddRectToRgn(p_rgn,rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 CRect CListControlWithSelectionBase::DropMarkerRect(int offset) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794 const int delta = MulDiv(5,m_dpi.cy,96);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 CRect rc(0,offset - delta,GetViewAreaWidth(), offset + delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 rc.InflateRect(DropMarkerMargin());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 return rc;
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 int CListControlWithSelectionBase::DropMarkerOffset(t_size marker) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 return (marker > 0 ? this->GetItemBottomOffsetAbs(marker-1): 0) - GetViewOffset().y;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 bool CListControlWithSelectionBase::RenderDropMarkerClipped2(CDCHandle dc, const CRect & update, t_size item, bool bInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 CRect markerRect = DropMarkerUpdateRect(item,bInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 CRect affected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 if (affected.IntersectRect(markerRect,update)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 DCStateScope state(dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 if (dc.IntersectClipRect(affected)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 RenderDropMarker2(dc,item,bInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 void CListControlWithSelectionBase::RenderDropMarker2(CDCHandle dc, t_size item, bool bInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 if (item != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 if (bInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 CPen pen; MakeDropMarkerPen(pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 SelectObjectScope penScope(dc,pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822 const CRect rc = GetItemRect(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 dc.MoveTo(rc.left,rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 dc.LineTo(rc.right,rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 dc.LineTo(rc.right,rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 dc.LineTo(rc.left,rc.bottom);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 dc.LineTo(rc.left,rc.top);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 RenderDropMarkerByOffset2(DropMarkerOffset(item),dc);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834 SIZE CListControlWithSelectionBase::DropMarkerMargin() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 const int penDeltaX = MulDiv(5 /* we don't know how to translate CreatePen units... */,m_dpi.cx,96);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836 const int penDeltaY = MulDiv(5 /* we don't know how to translate CreatePen units... */,m_dpi.cy,96);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 SIZE s = {penDeltaX,penDeltaY};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 return s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 void CListControlWithSelectionBase::MakeDropMarkerPen(CPen & out) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 WIN32_OP_D( out.CreatePen(PS_SOLID,3,GetSysColorHook(colorText)) != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 void CListControlWithSelectionBase::RenderDropMarkerByOffset2(int offset,CDCHandle p_dc) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 CPen pen; MakeDropMarkerPen(pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 const int delta = MulDiv(5,m_dpi.cy,96);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 SelectObjectScope penScope(p_dc,pen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 const int width = GetViewAreaWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 if (width > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 const int vx = this->GetViewOffset().x;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 const int left = -vx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 const int right = width - 1 - vx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 p_dc.MoveTo(left,offset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 p_dc.LineTo(right,offset);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 p_dc.MoveTo(left,offset-delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856 p_dc.LineTo(left,offset+delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 p_dc.MoveTo(right,offset-delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 p_dc.LineTo(right,offset+delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 void CListControlWithSelectionBase::FocusToUpdateRgn(HRGN rgn) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 size_t focusItem = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 if (focusItem != SIZE_MAX) AddItemToUpdateRgn(rgn,focusItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 size_t focusGroup = GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 if (focusGroup != SIZE_MAX) AddGroupHeaderToUpdateRgn2(rgn,focusGroup);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 void CListControlWithSelectionImpl::ReloadData() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 if ( GetItemCount() != m_selection.get_size() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 this->SelHandleReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 __super::ReloadData();
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 CListControlWithSelectionImpl::GetGroupFocus2() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 return (m_groupFocus && m_focus < GetItemCount()) ? m_focus : SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 void CListControlWithSelectionImpl::SetSelectionImpl(pfc::bit_array const & affected, pfc::bit_array const & status) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 const t_size total = m_selection.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 pfc::bit_array_flatIndexList toUpdate;
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 // Only fire UpdateItems for stuff that's both on-screen and actually changed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 // Firing for whole affected mask will repaint everything when selecting one item
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 t_size base, count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 if (!GetItemRangeAbs(GetVisibleRectAbs(), base, count)) { base = count = 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 affected.walk( total, [&] (size_t idx) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 if ( m_selection[idx] != status[idx] && this->CanSelectItem(idx) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 m_selection[idx] = status[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 if ( idx >= base && idx < base+count ) toUpdate.add(idx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 if ( toUpdate.get_count() > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 UpdateItems(toUpdate);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 // Fire subclassable method ONLY WITH ITEMS THAT CHANGED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 // We provide no other means for them to know old state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 this->OnSelectionChanged(toUpdate, status );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 void CListControlWithSelectionImpl::SetSelection(pfc::bit_array const & affected, pfc::bit_array const & status) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 RefreshSelectionSize();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 if ( m_selectionSupport == selectionSupportNone ) return;
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 if ( m_selectionSupport == selectionSupportSingle ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 size_t single = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 bool selNone = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 const size_t total = m_selection.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 for( size_t walk = 0; walk < total; ++ walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 if ( affected.get(walk) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 if ( status.get(walk) && single == SIZE_MAX ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 single = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 } else if ( IsItemSelected( walk ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 selNone = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 if ( single < total ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926 SetSelectionImpl( pfc::bit_array_true(), pfc::bit_array_one( single ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 } else if ( selNone ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 this->SetSelectionImpl( pfc::bit_array_true(), pfc::bit_array_false() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931 SetSelectionImpl( affected, status );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 }
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 }
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 void CListControlWithSelectionImpl::RefreshSelectionSize() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 RefreshSelectionSize(GetItemCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 void CListControlWithSelectionImpl::RefreshSelectionSize(t_size total) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 const t_size oldSize = m_selection.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 if (total != oldSize) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 m_selection.set_size(total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 for(t_size walk = oldSize; walk < total; ++walk) m_selection[walk] = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 void CListControlWithSelectionImpl::SetGroupFocusByItem(t_size item) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 CRgn update; update.CreateRectRgn(0,0,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 FocusToUpdateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 m_groupFocus = true; m_focus = item;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 FocusToUpdateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 InvalidateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955 CRect header;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 if (GetGroupHeaderRectAbs2(item,header)) EnsureVisibleRectAbs(header);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 this->OnFocusChangedGroup2( item );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 void CListControlWithSelectionImpl::SetFocusItem(t_size index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 CRgn update; update.CreateRectRgn(0,0,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 FocusToUpdateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 size_t oldFocus = m_focus;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 m_groupFocus = false; m_focus = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 FocusToUpdateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 InvalidateRgn(update);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 if ( index != SIZE_MAX ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 EnsureVisibleRectAbs(GetItemRectAbs(index));
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 SetSelectionStart(index);
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 this->OnFocusChanged(oldFocus, index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 static void UpdateIndexOnReorder(t_size & index, const t_size * order, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 index = pfc::permutation_find_reverse(order,count,index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 static void UpdateIndexOnRemoval(t_size & index, const pfc::bit_array & mask, t_size oldCount, t_size newCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 if (index >= oldCount || newCount == 0) {index = SIZE_MAX; return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 for(t_size walk = mask.find_first(true,0,oldCount); walk < newCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984 if (walk < index) --index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 else break;
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 if (index >= newCount) index = newCount - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 static void UpdateIndexOnInsert(size_t& index, pfc::bit_array const& mask, size_t newCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 if (index == SIZE_MAX) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 for (size_t walk = 0; walk < index; ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 size_t delta = mask.calc_count(true, walk, index - walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 walk = index; index += delta;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 static void UpdateIndexOnInsert(t_size & index, t_size base, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 if (index != SIZE_MAX && index >= base) index += count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 void CListControlWithSelectionImpl::SelHandleReorder(const t_size * order, t_size count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 RefreshSelectionSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 UpdateIndexOnReorder(m_focus,order,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 UpdateIndexOnReorder(m_selectionStart,order,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 pfc::array_t<bool> newSel; newSel.set_size(m_selection.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 for(t_size walk = 0; walk < m_selection.get_size(); ++walk) newSel[walk] = m_selection[order[walk]];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 m_selection = newSel;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 void CListControlWithSelectionImpl::SelHandleReset() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 RefreshSelectionSize(GetItemCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 for(t_size walk = 0; walk < m_selection.get_size(); walk++) m_selection[walk] = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015 m_focus = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 m_groupFocus = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 void CListControlWithSelectionImpl::SelHandleRemoval(const pfc::bit_array & mask, t_size oldCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 RefreshSelectionSize(oldCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 const t_size newCount = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 UpdateIndexOnRemoval(m_focus,mask,oldCount,newCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 UpdateIndexOnRemoval(m_selectionStart,mask,oldCount,newCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 pfc::remove_mask_t(m_selection,mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027 void CListControlWithSelectionImpl::SelHandleInsertion(pfc::bit_array const& mask, size_t oldCount, size_t newCount, bool select) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 PFC_ASSERT(newCount == GetItemCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 PFC_ASSERT(oldCount <= newCount); (void)oldCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 // To behave sanely in single-select mode, we'd have to alter selection of other items from here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 // Let caller worry and outright deny select requests in modes other than multisel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 if (m_selectionSupport != selectionSupportMulti) select = false;
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 UpdateIndexOnInsert(m_focus, mask, newCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 UpdateIndexOnInsert(m_selectionStart, mask, newCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 pfc::array_t<bool> newSel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 newSel.resize(newCount);
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 size_t inWalk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 for (size_t walk = 0; walk < newCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 bool v = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 if (mask[walk]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 v = select;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 } else if (inWalk < m_selection.get_size()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 v = m_selection[inWalk++];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 newSel[walk] = v;
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 m_selection = std::move(newSel);
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 void CListControlWithSelectionImpl::SelHandleInsertion(t_size base, t_size count, bool select) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 PFC_ASSERT(base + count <= GetItemCount());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 // To behave sanely in single-select mode, we'd have to alter selection of other items from here
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 // Let caller worry and outright deny select requests in modes other than multisel
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 if (m_selectionSupport != selectionSupportMulti) select = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 UpdateIndexOnInsert(m_focus,base,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 UpdateIndexOnInsert(m_selectionStart,base,count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 RefreshSelectionSize(GetItemCount() - count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 m_selection.insert_multi(select,base,count);
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
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 LRESULT CListControlWithSelectionBase::OnGetDlgCode(UINT,WPARAM,LPARAM p_lp,BOOL& bHandled) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 if (p_lp == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 return DLGC_WANTALLKEYS | DLGC_WANTCHARS | DLGC_WANTARROWS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 const MSG * pmsg = reinterpret_cast<const MSG *>(p_lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 switch(pmsg->message) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 case WM_KEYDOWN:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 case WM_KEYUP:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 switch(pmsg->wParam) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 case VK_ESCAPE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 case VK_TAB:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 return DLGC_WANTMESSAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 case WM_CHAR:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 return DLGC_WANTMESSAGE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089 bHandled = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090 return 0;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 bool CListControlWithSelectionBase::GetFocusRect(CRect & p_rect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 CRect temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 if (!GetFocusRectAbs(temp)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 p_rect = RectClientToAbs(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 bool CListControlWithSelectionBase::GetFocusRectAbs(CRect & p_rect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103 size_t item = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104 if (item != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 p_rect = this->GetItemRectAbs(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107 }
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 item = this->GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 if (item != SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 return this->GetGroupHeaderRectAbs2(item, p_rect);
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 return false;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 bool CListControlWithSelectionBase::GetContextMenuPoint2(CPoint& ptInOut) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118 CPoint ptInvalid(-1,-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 if (ptInOut == ptInvalid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 ptInOut = GetContextMenuPointDefault();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 return ptInOut != ptInvalid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 CRect rc = this->GetClientRectHook();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 WIN32_OP_D( ClientToScreen(rc) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 return !!rc.PtInRect(ptInOut);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126 }
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 CPoint CListControlWithSelectionBase::GetContextMenuPointDefault() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 CRect rect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 if (!GetFocusRectAbs(rect)) return CPoint(-1,-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 EnsureVisibleRectAbs(rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 CPoint pt = rect.CenterPoint() - GetViewOffset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 ClientToScreen(&pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 return pt;
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 CPoint CListControlWithSelectionBase::GetContextMenuPoint(CPoint ptGot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 if (ptGot.x == -1 && ptGot.y == -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 pt = GetContextMenuPointDefault();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 pt = ptGot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 return pt;
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 CPoint CListControlWithSelectionBase::GetContextMenuPoint(LPARAM lp) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 if (lp == -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 pt = GetContextMenuPointDefault();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 pt = lp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 return pt;
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 bool CListControlWithSelectionBase::MakeDropReorderPermutation(pfc::array_t<t_size> & out, CPoint ptDrop) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 t_size insertMark = InsertIndexFromPoint(ptDrop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 /*if (insertMark != this->GetFocusItem())*/ {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 const t_size count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 if (insertMark > count) insertMark = count;
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 t_size selBefore = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165 for(t_size walk = 0; walk < insertMark; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 if (IsItemSelected(walk)) selBefore++;
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 insertMark -= selBefore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 pfc::array_t<t_size> permutation, selected, nonselected;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 const t_size selcount = this->GetSelectedCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 selected.set_size(selcount); nonselected.set_size(count - selcount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 permutation.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 if (insertMark > nonselected.get_size()) insertMark = nonselected.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 for(t_size walk = 0, swalk = 0, nwalk = 0; walk < count; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 if (IsItemSelected(walk)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 selected[swalk++] = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 nonselected[nwalk++] = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 }
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 for(t_size walk = 0; walk < insertMark; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184 permutation[walk] = nonselected[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 for(t_size walk = 0; walk < selected.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 permutation[insertMark + walk] = selected[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 for(t_size walk = insertMark; walk < nonselected.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 permutation[selected.get_size() + walk] = nonselected[walk];
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 for(t_size walk = 0; walk < permutation.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 if (permutation[walk] != walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 out = permutation;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 return true;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 void CListControlWithSelectionBase::EnsureVisibleRectAbs(const CRect & p_rect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 if (!m_noEnsureVisible) TParent::EnsureVisibleRectAbs(p_rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 bool CListControlWithSelectionBase::TypeFindCheck(DWORD ts) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 if (m_typeFindTS == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 return ts - m_typeFindTS < 1000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212 void CListControlWithSelectionBase::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 (void)nRepCnt; (void)nFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 if (nChar < 32) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 m_typeFindTS = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219 const DWORD ts = GetTickCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 if (!TypeFindCheck(ts)) m_typeFind.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 if (nChar == ' ' && m_typeFind.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223 m_typeFindTS = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227 m_typeFindTS = ts;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 if (m_typeFindTS == 0) m_typeFindTS = UINT32_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 char temp[10] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 pfc::utf8_encode_char(nChar, temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 m_typeFind += temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 RunTypeFind();
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 static unsigned detectRepetition( pfc::string8 const & str ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 size_t count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 size_t walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 uint32_t first = 0;
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 while( walk < str.length() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 uint32_t current;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 auto delta = pfc::utf8_decode_char( str.c_str() + walk, current, str.length() - walk );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 if ( delta == 0 ) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 walk += delta;
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 if ( count == 0 ) first = current;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 else if ( first != current ) return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 ++ count;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 if ( count > 1 ) return first;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 size_t CListControlWithSelectionBase::EvalTypeFind() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 if ( GetItemCount() == 0 ) return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 static SmartStrStr tool;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261 const size_t itemCount = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 const size_t colCount = GetColumnCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263 pfc::string_formatter temp; temp.prealloc(1024);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 t_size searchBase = this->GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 if (searchBase >= itemCount) searchBase = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 size_t partial = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 size_t repetition = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 bool useRepetition = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 pfc::string8 strRepetitionChar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271 unsigned repChar = detectRepetition( m_typeFind );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 if ( repChar != 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 useRepetition = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 strRepetitionChar.add_char( repChar );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 }
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 for(t_size walk = 0; walk < itemCount; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 t_size index = (walk + searchBase) % itemCount;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 for(size_t cWalk = 0; cWalk < colCount; ++cWalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281 temp.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 if (AllowTypeFindInCell( index, cWalk )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 this->GetSubItemText(index, cWalk, temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 if ( temp.length() == 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 continue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 if (partial == SIZE_MAX) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 size_t matchAt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 if (tool.strStrEnd( temp, m_typeFind, & matchAt ) != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 if ( matchAt == 0 ) return index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 partial = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 if ( tool.matchHere( temp, m_typeFind ) ) return index;
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 if (useRepetition && index != searchBase) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 if ( tool.matchHere( temp, strRepetitionChar ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 useRepetition = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 repetition = index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 }
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 if (partial < itemCount) return partial;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308 if (repetition < itemCount) return repetition;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 void CListControlWithSelectionBase::RunTypeFind() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 size_t index = EvalTypeFind();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 if (index < GetItemCount() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315 this->SetFocusItem( index );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316 this->SetSelection(pfc::bit_array_true(), pfc::bit_array_one(index) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 MessageBeep(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 size_t CListControlWithSelectionBase::GetFirstSelected() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 const size_t count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 for( size_t w = 0; w < count; ++w ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325 if ( IsItemSelected(w) ) return w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 size_t CListControlWithSelectionBase::GetLastSelected() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 const size_t count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 for( size_t w = count - 1; (t_ssize) w >= 0; --w ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 if ( IsItemSelected(w) ) return w;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 return SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339 class CDropTargetImpl : public ImplementCOMRefCounter<IDropTarget> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 COM_QI_BEGIN()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342 COM_QI_ENTRY(IUnknown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 COM_QI_ENTRY(IDropTarget)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344 COM_QI_END()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 bool valid = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347 std::function<void(CPoint pt) > Track;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 std::function<DWORD (IDataObject*)> HookAccept;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1349 std::function<void (IDataObject*, CPoint pt)> HookDrop;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1350 std::function<void ()> HookLeave;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1351
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1352 DWORD m_effect = DROPEFFECT_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1354 HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1355 (void)grfKeyState; (void)pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1356 if (pDataObj == NULL || pdwEffect == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1357 if (!valid) return E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1358 if ( HookAccept ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1359 m_effect = HookAccept(pDataObj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1360 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1361 m_effect = DROPEFFECT_MOVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1362 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1363 *pdwEffect = m_effect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1364 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1365 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1366 HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1367 (void)grfKeyState;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1368 if (pdwEffect == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1369 if (!valid) return E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1370 if ( m_effect != DROPEFFECT_NONE ) Track(CPoint(pt.x, pt.y));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1371 *pdwEffect = m_effect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1372 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1373 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1374 HRESULT STDMETHODCALLTYPE DragLeave() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1375 if (HookLeave) HookLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1376 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1377 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1378 HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1379 (void)grfKeyState; (void)pdwEffect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1380 if ( HookDrop && m_effect != DROPEFFECT_NONE ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1381 HookDrop( pDataObj, CPoint(pt.x, pt.y) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1383 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1385 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1386
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1387 class CDropSourceImpl : public ImplementCOMRefCounter<IDropSource> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1388 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1389 CPoint droppedAt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1390 bool droppedAtValid = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1391 bool allowReorder = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1392
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1393 bool allowDragOutside = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1394 CWindow wndOrigin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1396 COM_QI_BEGIN()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1397 COM_QI_ENTRY(IUnknown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1398 COM_QI_ENTRY(IDropSource)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1399 COM_QI_END()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1401 HRESULT STDMETHODCALLTYPE GiveFeedback(DWORD dwEffect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1402 m_effect = dwEffect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1403 return DRAGDROP_S_USEDEFAULTCURSORS;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1406 HRESULT STDMETHODCALLTYPE QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1407
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1408 if (fEscapePressed || (grfKeyState & MK_RBUTTON) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1409 return DRAGDROP_S_CANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1410 } else if (!(grfKeyState & MK_LBUTTON)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1411 if (m_effect == DROPEFFECT_NONE) return DRAGDROP_S_CANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1413 CPoint pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1414 if (!GetCursorPos(&pt)) return DRAGDROP_S_CANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1415 bool bInside = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1416 if (wndOrigin) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1417 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1418 WIN32_OP_D(wndOrigin.GetWindowRect(rc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1419 bInside = rc.PtInRect(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1421 if (!allowDragOutside && !bInside) return DRAGDROP_S_CANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1422
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1423 if ( allowReorder && bInside) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1424 droppedAt = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1425 droppedAtValid = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1426 return DRAGDROP_S_CANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1427 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1428 return DRAGDROP_S_DROP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1429
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1430 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1431 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1432 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1433 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1434 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1435 DWORD m_effect = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1436 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1437 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1438
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1439 void CListControlWithSelectionBase::RunDragDrop(const CPoint & p_origin, bool p_isRightClick) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1440
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1441 uint32_t flags = this->QueryDragDropTypes();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1442 if ( flags == 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1443 PFC_ASSERT(!"How did we get here?");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1444 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1445 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1446 if ( flags == dragDrop_reorder ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1447 if ( p_isRightClick ) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1448 CPoint ptDrop;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1449 if ( RunReorderDragDrop( p_origin, ptDrop ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1450 pfc::array_t<size_t> order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1451 if (MakeDropReorderPermutation(order, ptDrop)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1452 this->RequestReorder(order.get_ptr(), order.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1453 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1454 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1455 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1456 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1457
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1458 auto obj = this->MakeDataObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1459 if (obj.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1460 PFC_ASSERT(!"How did we get here? No IDataObject");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1461 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1462 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1463
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1464 pfc::com_ptr_t<CDropSourceImpl> source = new CDropSourceImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1465 source->wndOrigin = m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1466 source->allowDragOutside = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1467 source->allowReorder = (flags & dragDrop_reorder) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1468
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1469 DWORD outEffect = DROPEFFECT_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1470 HRESULT status = DoDragDrop(obj.get_ptr(), source.get_ptr(), DragDropSourceEffects() , &outEffect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1471
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1472 if ( source->droppedAtValid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1473 CPoint ptDrop = source->droppedAt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1474 WIN32_OP_D(this->ScreenToClient(&ptDrop));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1475 pfc::array_t<size_t> order;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1476 if (MakeDropReorderPermutation(order, ptDrop)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1477 this->RequestReorder(order.get_ptr(), order.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1479 } else if (status == DRAGDROP_S_DROP) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1480 DragDropSourceSucceeded(outEffect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1481 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1484 pfc::com_ptr_t<IDataObject> CListControlWithSelectionBase::MakeDataObject() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1485 // return dummy IDataObject, presume derived transmits drag and drop payload by other means
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1486 using namespace IDataObjectUtils;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1487 return new ImplementCOMRefCounter< CDataObjectBase >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1488 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1489
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1490 bool CListControlWithSelectionBase::RunReorderDragDrop(CPoint ptOrigin, CPoint & ptDrop) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1491 (void)ptOrigin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1492 pfc::com_ptr_t<CDropSourceImpl> source = new CDropSourceImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1493 pfc::com_ptr_t<CDropTargetImpl> target = new CDropTargetImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1495 source->wndOrigin = m_hWnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1496 source->allowDragOutside = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1497 source->allowReorder = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1498
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1499 target->Track = [this](CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1500 WIN32_OP_D(this->ScreenToClient(&pt));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1501 size_t idx = this->InsertIndexFromPoint(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1502 this->SetDropMark(idx, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1503 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1505 if ( FAILED(RegisterDragDrop(*this, target.get_ptr())) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1506 // OleInitialize not called?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1507 PFC_ASSERT( !"Should not get here" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1508 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1509 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1510
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1511 pfc::onLeaving scope([=] { target->valid = false; RevokeDragDrop(*this); });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1512
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1513 using namespace IDataObjectUtils;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1514 pfc::com_ptr_t<IDataObject> dataobject = new ImplementCOMRefCounter< CDataObjectBase >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1515 DWORD outeffect = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1516
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1517 ToggleDDScroll(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1518 DoDragDrop(dataobject.get_ptr(), source.get_ptr(), DROPEFFECT_MOVE, &outeffect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1519 ClearDropMark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1520 ToggleDDScroll(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1521 if (source->droppedAtValid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1522 CPoint pt = source->droppedAt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1523 WIN32_OP_D( this->ScreenToClient( &pt ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1524 ptDrop = pt;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1525 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1526 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1527 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1528 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1529
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1530 int CListControlWithSelectionBase::OnCreatePassThru(LPCREATESTRUCT) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1531 const uint32_t flags = this->QueryDragDropTypes();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1532 if ( flags & dragDrop_external ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1533
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1534 pfc::com_ptr_t<CDropTargetImpl> target = new CDropTargetImpl();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1535
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1536 auto dda = std::make_shared<dragDropAccept_t>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1537
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1538 target->HookAccept = [this, flags, dda] ( IDataObject * obj ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1539 if (this->m_ownDDActive && (flags & dragDrop_reorder) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1540 // Do not generate OnDrop for reorderings
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1541 dda->showDropMark = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1542 dda->dwEFfect = DROPEFFECT_MOVE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1543 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1544 *dda = this->DragDropAccept2(obj);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1545 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1546 return dda->dwEFfect;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1547 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1548 target->HookDrop = [this, flags] ( IDataObject * obj, CPoint pt ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1549 this->ToggleDDScroll(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1550 this->ClearDropMark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1551 if ( this->m_ownDDActive ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1552 // Do not generate OnDrop for reorderings
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1553 if ( flags & dragDrop_reorder ) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1554 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1555 this->OnDrop( obj, pt );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1556 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1557 target->HookLeave = [this] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1558 this->ClearDropMark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1559 this->ToggleDDScroll(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1560 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1561
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1562 target->Track = [this, dda](CPoint pt) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1563 this->ToggleDDScroll(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1564 if ( dda->showDropMark ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1565 WIN32_OP_D(this->ScreenToClient(&pt));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1566 size_t idx = this->InsertIndexFromPoint(pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1567 if (dda->dropOnItem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1568 if (idx < this->GetItemCount()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1569 this->SetDropMark(idx, true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1570 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1571 this->ClearDropMark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1572 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1573 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1574 this->SetDropMark(idx, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1575 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1576
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1577 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1578 this->ClearDropMark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1579 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1580 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1582 RegisterDragDrop(*this, target.get_ptr() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1583 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1584 SetMsgHandled(FALSE); return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1585 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1586
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1587 void CListControlWithSelectionBase::OnDestroyPassThru() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1588 AbortSelectDragMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1589 ToggleDDScroll(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1590 RevokeDragDrop(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1591 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1592 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1593
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1594 size_t CListControlWithSelectionBase::GetPasteTarget(const CPoint * ptPaste) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1595 size_t target = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1596 if (ptPaste != nullptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1597 CPoint pt(*ptPaste); WIN32_OP_D(ScreenToClient(&pt));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1598 size_t groupBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1599 if (GroupHeaderFromPoint2(pt, groupBase)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1600 target = groupBase;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1601 } else if (ItemFromPoint(pt, target)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1602 auto rc = GetItemRect(target);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1603 auto height = rc.Height();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1604 if (height > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1605 double posInItem = (double)(pt.y - rc.top) / (double)height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1606 if (posInItem >= 0.5) ++target;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1607 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1608 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1609 } else if (GroupFocusActive()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1610 target = GetGroupFocus2();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1611 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1612 target = GetFocusItem();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1613 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1614 return target;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1615 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1616
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1617
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1618 pfc::bit_array_table CListControlWithSelectionImpl::GetSelectionMaskRef() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1619 return pfc::bit_array_table(m_selection.get_ptr(), m_selection.get_size());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1620 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1621 pfc::bit_array_bittable CListControlWithSelectionImpl::GetSelectionMask() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1622 pfc::bit_array_bittable ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1623 const auto count = GetItemCount();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1624 ret.resize( GetItemCount() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1625 for( size_t walk = 0; walk < count; ++ walk ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1626 ret.set(walk, IsItemSelected(walk));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1627 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1628 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1629 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1630
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1631 void CListControlWithSelectionImpl::OnItemsReordered( const size_t * order, size_t count) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1632 PFC_ASSERT( count == GetItemCount() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1633
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1634 SelHandleReorder( order, count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1635 __super::OnItemsReordered(order, count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1636 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1637
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1638 void CListControlWithSelectionImpl::OnItemsRemoved( pfc::bit_array const & mask, size_t oldCount) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1639 SelHandleRemoval(mask, oldCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1640 __super::OnItemsRemoved( mask, oldCount );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1641 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1642
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1643 void CListControlWithSelectionImpl::OnItemsInsertedEx(pfc::bit_array const& mask, size_t oldCount, size_t newCount, bool bSelect) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1644 SelHandleInsertion( mask, oldCount, newCount, bSelect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1645 __super::OnItemsInsertedEx( mask, oldCount, newCount, bSelect );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1646 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1647
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1648 bool CListControlWithSelectionImpl::SelectAll() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1649 if ( m_selectionSupport != selectionSupportMulti ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1650 return __super::SelectAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1651 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1652
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1653 DWORD CListControlWithSelectionBase::DragDropAccept(IDataObject* obj, bool& showDropMark) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1654 (void)obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1655 showDropMark = false; return DROPEFFECT_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1656 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1657
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1658 CListControlWithSelectionBase::dragDropAccept_t CListControlWithSelectionBase::DragDropAccept2(IDataObject* obj) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1659 dragDropAccept_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1660 ret.dwEFfect = this->DragDropAccept(obj, ret.showDropMark);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1661 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1662 }