annotate foosdk/sdk/libPPUI/CListControlWithSelection.h @ 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 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "CListControl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Implementation of focus/selection handling. Leaves maintaining focus/selection info to the derived class. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! Most classes should derive from CListControlWithSelectionImpl instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class CListControlWithSelectionBase : public CListControl {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 typedef CListControl TParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 CListControlWithSelectionBase() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 BEGIN_MSG_MAP_EX(CListControlWithSelectionBase)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 MSG_WM_CREATE(OnCreatePassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 MSG_WM_DESTROY(OnDestroyPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 CHAIN_MSG_MAP(TParent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 MESSAGE_HANDLER(WM_LBUTTONDBLCLK,OnLButtonDblClk)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 MESSAGE_HANDLER(WM_LBUTTONDOWN,OnButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 MESSAGE_HANDLER(WM_RBUTTONDOWN,OnButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 MESSAGE_HANDLER(WM_RBUTTONDBLCLK,OnButtonDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 MESSAGE_HANDLER(WM_RBUTTONUP,OnRButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 MESSAGE_HANDLER(WM_MOUSEMOVE,OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 MESSAGE_HANDLER(WM_LBUTTONUP,OnLButtonUp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 MESSAGE_HANDLER(WM_KEYDOWN,OnKeyDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 MESSAGE_HANDLER(WM_SYSKEYDOWN,OnKeyDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 MESSAGE_HANDLER(WM_SETFOCUS,OnFocus);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 MESSAGE_HANDLER(WM_KILLFOCUS,OnFocus);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 MESSAGE_HANDLER(WM_TIMER,OnTimer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 MESSAGE_HANDLER(WM_CAPTURECHANGED,OnCaptureChanged);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 MESSAGE_HANDLER(WM_GETDLGCODE,OnGetDlgCode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 MSG_WM_CHAR(OnChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 virtual void SetFocusItem(t_size index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual t_size GetFocusItem() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual void SetGroupFocusByItem(t_size item) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 virtual size_t GetGroupFocus2() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual bool IsItemSelected(t_size index) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 virtual void SetSelection(pfc::bit_array const & affected,pfc::bit_array const & status) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void SelectSingle(size_t which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void SetSelectionAt(size_t idx, bool bSel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 virtual bool SelectAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void SelectNone();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 virtual void RequestMoveSelection(int delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 bool MoveSelectionProbe(int delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 virtual void RequestReorder( size_t const * order, size_t count ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 virtual void RequestRemoveSelection() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 virtual void ExecuteDefaultAction(t_size index) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 virtual void ExecuteDefaultActionGroup(t_size base, t_size count) { (void)base; (void)count; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 virtual bool ExecuteCanvasDefaultAction(CPoint pt) { (void)pt; return false; }
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 virtual t_size GetSelectionStart() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 virtual void SetSelectionStart(t_size val) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Full hook for drag-drop loop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 virtual void RunDragDrop(const CPoint & p_origin,bool p_isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! Should RunDragDrop() be called at all?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 virtual bool IsDragDropSupported() {return QueryDragDropTypes() != 0;}
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 //! Notification, mandatory to call by SetFocusItem() implementation. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! If overridden by subclass, must call parent.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 virtual void OnFocusChanged(size_t oldFocus, size_t newFocus) { (void)oldFocus; (void)newFocus; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 virtual void OnFocusChangedGroup2(size_t baseItem) { (void)baseItem; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Notification, mandatory to call by SetSelection() implementation. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! If overridden by subclass, must call parent. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! Affected: Mask indicating what items ACTUALLY CHANGED, old state to be assumed opposite of new. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //! During this call, IsSelected() already returns new state.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 virtual void OnSelectionChanged(pfc::bit_array const& affected, pfc::bit_array const& status) { (void)affected; (void)status; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 dragDrop_reorder = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 dragDrop_external = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual uint32_t QueryDragDropTypes() const { return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 struct dragDropAccept_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 DWORD dwEFfect = DROPEFFECT_NONE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Show drop mark or not?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 bool showDropMark = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! Drop on item or insert into list?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 bool dropOnItem = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! Deprecated, use DragDropAccept2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 virtual DWORD DragDropAccept(IDataObject* obj, bool& showDropMark);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! Return info on what you can do with this IDataObject.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual dragDropAccept_t DragDropAccept2(IDataObject*);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 virtual pfc::com_ptr_t<IDataObject> MakeDataObject();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! Called upon drop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //! @param pt Drop point in screen coordinates.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual void OnDrop(IDataObject* obj, CPoint pt) { (void)obj; (void)pt; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 virtual DWORD DragDropSourceEffects() { return DROPEFFECT_MOVE | DROPEFFECT_COPY;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 virtual void DragDropSourceSucceeded(DWORD effect) { (void)effect; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 virtual void AdjustSelectionRect(size_t item, CRect& rc) { (void)item; (void)rc; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 bool GroupFocusActive() const {return GetGroupFocus2() != SIZE_MAX;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 void RenderOverlay2(const CRect & p_updaterect,CDCHandle p_dc) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 bool IsItemFocused(t_size index) const {return GetFocusItem() == index;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 bool IsGroupHeaderFocused2(size_t atItem) const {return GetGroupFocus2() == atItem;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 void ToggleSelection(pfc::bit_array const & mask);
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 size_t GetSelectedCount(pfc::bit_array const & mask,size_t max = SIZE_MAX) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 size_t GetSelectedCount() const {return GetSelectedCount(pfc::bit_array_true());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 size_t GetSingleSel() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 size_t GetFirstSelected() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 size_t GetLastSelected() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! Execute default action per focus or selection depending on what's focused/selected
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 virtual void ExecuteDefaultActionByFocus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 void FocusToUpdateRgn(HRGN rgn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 //! Self-contained minimal drag and drop implementation for reordering list items only; dummy IDataObject presented. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Call from your override of RunDragDrop(), if p_isRightClick is false / left button clicked, never with right button clicked. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! On success, use MakeDropReorderPermutation() to fetch the permutation to apply to your content.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 bool RunReorderDragDrop(CPoint ptOrigin, CPoint & ptDrop);
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 bool MakeDropReorderPermutation(pfc::array_t<t_size> & out, CPoint ptDrop) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 size_t GetPasteTarget( const CPoint * ptPaste = nullptr ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! Fix coordinates of context menu point handed by WM_CONTEXTMENU, turn (-1,-1) into something that makes sense. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 //! Input & output in screen coordinates, per WM_CONTEXTMENU conventions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 CPoint GetContextMenuPoint(LPARAM lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 CPoint GetContextMenuPoint(CPoint ptGot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! Import context menu point coordinates: turn (-1,-1) to something that makes sense; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Returns false if clicked point was outside client area so WM_CONTEXTMENU should be left unhandled.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 bool GetContextMenuPoint2(CPoint & ptInOut);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! Returns center-of-focused-item point for context menu, in screen coordinates.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 CPoint GetContextMenuPointDefault();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 void ToggleDDScroll(bool p_state);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 void AbortSelectDragMode() {AbortSelectDragMode(false);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 void RenderDropMarkerByOffset2(int offset,CDCHandle p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 void RenderDropMarker2(CDCHandle dc, t_size item, bool bInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 bool RenderDropMarkerClipped2(CDCHandle dc, const CRect & update, t_size item, bool bInside);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 CRect DropMarkerRect(int offset) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 int DropMarkerOffset(t_size marker) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 void AddDropMarkToUpdateRgn(HRGN p_rgn, t_size p_index, bool bInside = false) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 CRect DropMarkerUpdateRect(t_size index,bool bInside) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 bool GetFocusRect(CRect & p_rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 bool GetFocusRectAbs(CRect & p_rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 bool IsOwnDDActive() const {return m_ownDDActive;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 SIZE DropMarkerMargin() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void MakeDropMarkerPen(CPen & out) const;
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 void EnsureVisibleRectAbs(const CRect & p_rect) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 virtual size_t EvalTypeFind();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 virtual bool AllowRangeSelect() const { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 size_t GetDropMark( ) const { return m_dropMark; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 bool IsDropMarkInside( ) const { return m_dropMarkInside; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void SetDropMark( size_t idx, bool bInside );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 void ClearDropMark() { SetDropMark(SIZE_MAX, false); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 int OnCreatePassThru(LPCREATESTRUCT lpCreateStruct);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 void OnDestroyPassThru();
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 struct TDDScrollControl {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 bool m_timerActive = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 enum {KTimerID = 0x35bb25af,KTimerPeriod = 25};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 static constexpr unsigned
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 KSelectionTimerID = 0xad8abd04,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 KSelectionTimerPeriod = 50;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 LRESULT OnFocus(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 LRESULT OnKeyDown(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 LRESULT OnLButtonDblClk(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 LRESULT OnButtonDown(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 LRESULT OnRButtonUp(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 LRESULT OnMouseMove(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 LRESULT OnLButtonUp(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 LRESULT OnTimer(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 LRESULT OnCaptureChanged(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 LRESULT OnGetDlgCode(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void RunTypeFind();
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 void OnKeyDown_HomeEndHelper(bool isEnd, int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 void OnKeyDown_SetIndexHelper(int p_index, int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 void OnKeyDown_SetIndexDeltaHelper(int p_delta, int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 void OnKeyDown_SetIndexDeltaLineHelper(int p_delta, int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 void OnKeyDown_SetIndexDeltaPageHelper(int p_delta, int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 void SelectGroupHelper2(size_t p_groupBase,int p_keys);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 void HandleDragSel(const CPoint & p_pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 void AbortSelectDragMode(bool p_lostCapture);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 void InitSelectDragMode(const CPoint & p_pt,bool p_rightClick = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 void ToggleRangeSelection(pfc::bit_array const & mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 void ToggleGroupSelection2(size_t p_item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 void HandleDDScroll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 void PrepareDragDrop(const CPoint & p_point,bool p_isRightClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 void AbortPrepareDragDropMode(bool p_lostCapture = false);
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 bool TypeFindCheck(DWORD ts = GetTickCount()) const;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 // Spacebar handler
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 void ToggleSelectedItems();
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 void RenderItem(t_size p_item,const CRect & p_itemRect,const CRect & p_updateRect,CDCHandle p_dc) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 void RenderGroupHeader2(size_t baseItem,const CRect & p_headerRect,const CRect & p_updateRect,CDCHandle p_dc) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 void RenderSubItemText(t_size item, t_size subItem,const CRect & subItemRect,const CRect & updateRect,CDCHandle dc, bool allowColors) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 bool m_selectDragMode = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 CPoint m_selectDragOriginAbs, m_selectDragCurrentAbs;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 bool m_selectDragChanged, m_selectDragMoved;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 TDDScrollControl m_ddScroll;
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 bool m_prepareDragDropMode = false, m_prepareDragDropModeRightClick = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 bool m_noEnsureVisible = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 CPoint m_prepareDragDropOrigin;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 bool ShouldBeginDrag(CPoint ptRef, CPoint ptNow) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 bool m_ownDDActive = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 bool m_drawThemeText = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 pfc::string8 m_typeFind; DWORD m_typeFindTS = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 size_t m_dropMark = SIZE_MAX; bool m_dropMarkInside = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 //! CListControlWithSelectionImpl implements virtual methods of CListControlWithSelectionBase,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 //! maintaining focus/selection info for you.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 class CListControlWithSelectionImpl : public CListControlWithSelectionBase {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 public:
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 enum { selectionSupportNone = 0, selectionSupportSingle, selectionSupportMulti };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 unsigned m_selectionSupport = selectionSupportMulti;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 void SetSelectionModeNone() { m_selectionSupport = selectionSupportNone; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 void SetSelectionModeSingle() { m_selectionSupport = selectionSupportSingle; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 void SetSelectionModeMulti() { m_selectionSupport = selectionSupportMulti; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 bool IsSingleSelect() const { return m_selectionSupport == selectionSupportSingle; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 CListControlWithSelectionImpl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 void SetFocusItem(t_size index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 t_size GetFocusItem() const {return m_groupFocus ? SIZE_MAX : m_focus;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 void SetGroupFocusByItem(t_size item) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 size_t GetGroupFocus2() const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 bool IsItemSelected(t_size index) const {return index < m_selection.get_size() ? m_selection[index] : false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 void SetSelection(pfc::bit_array const & affected,pfc::bit_array const & status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 virtual bool CanSelectItem(size_t index) const { (void)index; return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 t_size GetSelectionStart() const {return m_selectionStart;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 void SetSelectionStart(t_size val) {m_selectionStart = val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 void SelHandleReorder(const t_size * order, t_size count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 void SelHandleRemoval(const pfc::bit_array & mask, t_size oldCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 void SelHandleInsertion(t_size base, t_size count, bool select);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 void 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
260 void SelHandleReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 void ReloadData() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 size_t _DebugGetItemCountSel() const { return m_selection.get_size(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 virtual void OnItemsReordered( const size_t* order, size_t count ) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 virtual void OnItemsRemoved( pfc::bit_array const & mask, size_t oldCount ) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 virtual void OnItemsInsertedEx(pfc::bit_array const& mask, size_t oldCount, size_t newCount, bool bSelect) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 pfc::bit_array_bittable GetSelectionMask() const; // returns a standalone object holding a copy of the state
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 pfc::bit_array_table GetSelectionMaskRef() const; // returns a TEMPORARY object referencing this list's internal data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 bool SelectAll() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 const bool* GetSelectionArray() { RefreshSelectionSize(); return m_selection.get_ptr(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 bool AllowRangeSelect() const override { return m_selectionSupport == selectionSupportMulti; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 void SetSelectionImpl(pfc::bit_array const & affected,pfc::bit_array const & status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 void RefreshSelectionSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 void RefreshSelectionSize(t_size size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 pfc::array_t<bool> m_selection;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 size_t m_focus = SIZE_MAX, m_selectionStart = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 bool m_groupFocus = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 };