annotate foosdk/sdk/libPPUI/CListControl.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 // ================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // Main CListControl implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // For ready-to-use CListControl specializations,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // see CListControlSimple.h and CListControlOwnerData.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 // ================================================================================
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 #pragma comment(lib, "uxtheme.lib")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #include <list>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #include <vector>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #include <set>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 #include <string>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #include <map>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #include "CMiddleDragImpl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #include "wtl-pp.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 #include "gesture.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #include "gdiplus_helpers.h"
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 #define CListControl_ScrollWindowFix
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 #ifdef CListControl_ScrollWindowFix
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 #define WS_EX_COMPOSITED_CListControl 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 #define WS_EX_COMPOSITED_CListControl WS_EX_COMPOSITED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 #endif
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 typedef std::function< bool ( UINT, DWORD, CPoint ) > CaptureProc_t;
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 typedef CWinTraits<WS_VSCROLL | WS_HSCROLL | WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_COMPOSITED_CListControl> CListControlTraits;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 class CListControlImpl : public CWindowImpl<CListControlImpl,CWindow,CListControlTraits> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 typedef uint64_t groupID_t;
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 CListControlImpl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 static const wchar_t* GetWndClassName() { return L"libPPUI:CListControl"; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 DECLARE_WND_CLASS_EX(GetWndClassName(), CS_DBLCLKS, (-1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 // Wrapper around CWindowImpl::Create().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 // Creates CListControl replacing another dialog control with the specified ID.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 // Note that m_dlgWantEnter is set to false by this method, as it's typically unwanted in dialogs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 HWND CreateInDialog( CWindow wndDialog, UINT replaceControlID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 HWND CreateInDialog(CWindow wndDialog, UINT replaceControlID, CWindow wndReplace);
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 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 MSG_SIZE_ASYNC = WM_USER + 13,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 MSG_EXEC_DEFERRED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 UserMsgBase
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 static UINT msgSetDarkMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 const UINT MSG_SET_DARK = msgSetDarkMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 static void wndSetDarkMode(CWindow wndListControl, bool bDark);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 BEGIN_MSG_MAP_EX(CListControlImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 MESSAGE_HANDLER_EX(MSG_EXEC_DEFERRED, OnExecDeferred);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 MSG_WM_PAINT(OnPaint)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 MSG_WM_PRINTCLIENT(OnPrintClient);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 MESSAGE_HANDLER(WM_VSCROLL,OnVScroll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 MESSAGE_HANDLER(WM_HSCROLL,OnHScroll);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 MESSAGE_HANDLER(WM_SIZE,OnSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 MESSAGE_HANDLER(WM_MOUSEHWHEEL,OnHWheel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 MESSAGE_HANDLER(WM_MOUSEWHEEL,OnVWheel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 MESSAGE_HANDLER(WM_LBUTTONDOWN,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 MESSAGE_HANDLER(WM_RBUTTONDOWN,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 MESSAGE_HANDLER(WM_MBUTTONDOWN,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 MESSAGE_HANDLER(WM_LBUTTONDBLCLK,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 MESSAGE_HANDLER(WM_RBUTTONDBLCLK,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 MESSAGE_HANDLER(WM_MBUTTONDBLCLK,SetFocusPassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 MESSAGE_HANDLER(WM_CREATE,OnCreatePassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 MSG_WM_ERASEBKGND(OnEraseBkgnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 MESSAGE_HANDLER(MSG_SIZE_ASYNC,OnSizeAsync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 MESSAGE_HANDLER(WM_GESTURE, OnGesture)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 MSG_WM_THEMECHANGED(OnThemeChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 MESSAGE_HANDLER_EX( WM_GETDLGCODE, OnGetDlgCode )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 MESSAGE_HANDLER_EX( MSG_SET_DARK, OnSetDark )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 MSG_WM_KEYDOWN(OnKeyDown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual void ReloadData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 virtual void ReloadItems(pfc::bit_array const & mask);
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 //! Hookable function called in response to reordering of items. Redraws the view and updates internal data to reflect the change.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 virtual void OnItemsReordered( const size_t * order, size_t count );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 //! Hookable function called in response to removal of items. Redraws the view and updates internal data to reflect the change.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 virtual void OnItemsRemoved(pfc::bit_array const& mask, size_t oldCount) { (void)mask; (void)oldCount; ReloadData(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 //! Hookable function called in response to insertion of items. Redraws the view and updates internal data to reflect the change.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 virtual void OnItemsInsertedEx(pfc::bit_array const& mask, size_t oldCount, size_t newCount, bool bSelect) { (void)mask; (void)oldCount; (void) newCount; (void)bSelect; ReloadData(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 void OnItemsInserted(size_t at, size_t count, bool bSelect);
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 //! Helper around OnItemsRemoved()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 void OnItemRemoved(size_t which);
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 void ReloadItem(size_t i) { ReloadItems( pfc::bit_array_one(i) ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void OnViewAreaChanged() {OnViewAreaChanged(GetViewOrigin());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void OnViewAreaChanged(CPoint p_originOverride);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void UpdateGroupHeader2(size_t atItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void UpdateItems(const pfc::bit_array & p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void UpdateItemsAndHeaders(const pfc::bit_array & p_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 void UpdateItem(t_size p_item) {UpdateItems(pfc::bit_array_one(p_item));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 void UpdateItemsAll() {Invalidate();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 void EnsureItemVisible(t_size p_item, bool bUser = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 void EnsureHeaderVisible2(size_t atItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 virtual void EnsureVisibleRectAbs(const CRect & p_rect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 CRect GetItemRect(t_size p_item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 bool GetGroupHeaderRect2(size_t atItem,CRect & p_rect) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 CRect GetItemRectAbs(t_size p_item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 int GetItemOffsetAbs(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 int GetItemOffsetAbs2(size_t from, size_t to) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 int GetItemBottomOffsetAbs(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 int GetItemHeightCached(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 int GetItemContentHeightCached(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 bool GetGroupHeaderRectAbs2(size_t atItem,CRect & p_rect) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 CPoint GetViewOrigin() const {return m_viewOrigin;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 CPoint GetViewOffset() const {return GetViewOrigin() - GetClientOrigin();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 CPoint PointAbsToClient(CPoint pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 CPoint PointClientToAbs(CPoint pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 CRect RectAbsToClient(CRect rc) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 CRect RectClientToAbs(CRect rc) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 int GetViewAreaWidth() const {return GetItemWidth();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 int GetViewAreaHeight() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 CRect GetViewAreaRectAbs() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 CRect GetViewAreaRect() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 CRect GetValidViewOriginArea() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 bool GetItemRangeAbs(const CRect & p_rect,t_size & p_base,t_size & p_count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 bool GetItemRangeAbsInclHeaders(const CRect & p_rect,t_size & p_base,t_size & p_count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 bool GetItemRange(const CRect & p_rect,t_size & p_base,t_size & p_count) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 void MoveViewOriginNoClip(CPoint p_target);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 void MoveViewOrigin(CPoint p_target);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 CPoint ClipViewOrigin(CPoint p_origin) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 void MoveViewOriginDelta(CPoint p_delta) {MoveViewOrigin( GetViewOrigin() + p_delta );}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 void MoveViewOriginDeltaNoClip(CPoint p_delta) {MoveViewOriginNoClip( GetViewOrigin() + p_delta );}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 bool ItemFromPoint(CPoint const & p_pt, t_size & p_item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 size_t ItemFromPoint(CPoint const& pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 bool GroupHeaderFromPoint2(CPoint const & p_pt,size_t & p_atItem) const {return GroupHeaderFromPointAbs2( PointClientToAbs(p_pt),p_atItem);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 bool ItemFromPointAbs(CPoint const & p_pt,t_size & p_item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 size_t ItemFromPointAbs(CPoint const& p_pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 bool GroupHeaderFromPointAbs2(CPoint const & p_pt,size_t & p_atItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 size_t IndexFromPointAbs(CPoint pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 size_t IndexFromPointAbs(int ptY) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 size_t ResolveGroupRange2(t_size p_base) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 bool ResolveGroupRangeCached(size_t itemInGroup, size_t & outBegin, size_t & outEnd) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 virtual int GetGroupHeaderHeight() const {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 virtual int GetItemHeight() const {return 0;}
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 // Variable height items - return -1 to use generic.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 // This is intended to be used scarcely. Layout engine assumes that majority of items use the generic height.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 // Heavy use of variable height items on large data sets will lead to performance issues.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 virtual int GetItemHeight2(size_t which) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 // Companion to GetItemHeight2(), returns portion of GetItemHeight2()-defined item which the item content actually occupies
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 virtual int GetItemHeight2Content(size_t which, int iHeight) const { (void)which; return iHeight; }
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 virtual int GetMinGroupHeight() const { return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 virtual int GetMinGroupHeight2(size_t itemInGroup) const { (void)itemInGroup; return GetMinGroupHeight(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 void MinGroupHeight2Changed(size_t itemInGroup, bool reloadWhole = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void MinGroupHeight2ChangedForGroup(groupID_t group, bool reloadWhole = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 virtual int GetItemWidth() const {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 virtual t_size GetItemCount() const {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 bool IsItemFirstInGroupCached(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 bool IsItemFirstInGroup(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 bool IsItemLastInGroup(size_t item) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 virtual groupID_t GetItemGroup(t_size p_item) const { (void)p_item; return 0; }
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 virtual void RenderRect(const CRect& p_rect, CDCHandle p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 //override optionally
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 virtual void 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
179 //override optionally
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 virtual void RenderGroupHeader2(size_t p_item,const CRect & p_headerRect,const CRect & p_updateRect,CDCHandle p_dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 virtual void RenderGroupOverlay(size_t baseItem, const CRect& p_groupWhole, const CRect& p_updateRect, CDCHandle p_dc) { (void)baseItem; (void)p_groupWhole; (void)p_updateRect; (void)p_dc; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 void UpdateGroupOverlayByID(groupID_t groupID, int xFrom = 0, int xTo = -1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 bool GetGroupOverlayRectAbs(size_t atItem, CRect & outRect);
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 //called by default RenderItem implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 virtual void RenderItemText(t_size p_item, const CRect& p_itemRect, const CRect& p_updateRect, CDCHandle p_dc, bool allowColors) { (void)p_item; (void)p_itemRect; (void)p_updateRect; (void)p_dc; (void)allowColors; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 //called by default RenderItem implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 virtual void RenderGroupHeaderText2(size_t p_item, const CRect& p_headerRect, const CRect& p_updateRect, CDCHandle p_dc) { (void)p_item; (void)p_headerRect; (void)p_updateRect; (void)p_dc; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 virtual void RenderItemBackground(CDCHandle p_dc,const CRect & p_itemRect,size_t item, uint32_t bkColor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 virtual void RenderGroupHeaderBackground(CDCHandle p_dc,const CRect & p_headerRect,int iGroup);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 virtual void RenderBackground( CDCHandle dc, CRect const & rc );
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 virtual void OnViewOriginChange(CPoint p_delta) { (void)p_delta; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 // RenderOverlay2 takes rect in client coords, not absolute
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 // p_dc operates on client coords also
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 virtual void RenderOverlay2(const CRect& p_updaterect, CDCHandle p_dc) { (void)p_updaterect; (void)p_dc; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 virtual bool FixedOverlayPresent() {return 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 virtual CRect GetClientRectHook() 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 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 colorText = COLOR_WINDOWTEXT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 colorBackground = COLOR_WINDOW,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 colorHighlight = COLOR_HOTLIGHT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 colorSelection = COLOR_HIGHLIGHT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 virtual COLORREF GetSysColorHook( int colorIndex ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! Called by CListControlWithSelectionBase.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 virtual void OnItemClicked(t_size item, CPoint pt) { (void)item; (void)pt; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 //! Called by CListControlWithSelectionBase.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 virtual void OnGroupHeaderClicked(groupID_t groupId, CPoint pt) { (void)groupId; (void)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 //! Return true to indicate that some area of the control has a special purpose and clicks there should not trigger changes in focus/selection.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 virtual bool OnClickedSpecialHitTest(CPoint pt) { (void)pt; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 virtual bool OnClickedSpecial(DWORD status, CPoint pt) { (void)status; (void)pt; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 virtual bool AllowScrollbar(bool vertical) const { (void)vertical; return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 CPoint GetClientOrigin() const {return GetClientRectHook().TopLeft();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 int GetVisibleHeight() const { return GetClientRectHook().Height(); }
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 bool IsItemVisible(size_t which) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 //! Returns first visible item, first invisible item, begin-end style
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 std::pair<size_t, size_t> GetVisibleRange() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 CRect GetVisibleRectAbs() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 return this->RectClientToAbs(GetClientRectHook());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 bool IsSameItemOrHeaderAbs(const CPoint & p_point1, const CPoint & p_point2) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 void AddItemToUpdateRgn(HRGN p_rgn, t_size p_index) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 void AddGroupHeaderToUpdateRgn2(HRGN p_rgn, size_t atItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 t_size InsertIndexFromPoint(const CPoint & p_pt) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 //! Translate point to insert location for drag and drop. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 //! Made virtual so it can be specialized to allow only specific drop locations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 virtual t_size InsertIndexFromPointEx(const CPoint & pt, bool & bInside) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 virtual void ListHandleResize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 //! Can smooth-scroll *now* ? Used to suppress smooth scroll on temporary basis due to specific user operations in progress
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 virtual bool CanSmoothScroll() const { return true; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 //! Is smooth scroll enabled by user?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 virtual bool UserEnabledSmoothScroll() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 virtual bool ToggleSelectedItemsHook(pfc::bit_array const& mask) { (void)mask; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 SIZE GetDPI() const { return this->m_dpi;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 // Should this control take enter key in dialogs or not?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 // Default to true for compatibility with existing code - but when used in dialogs, you'll want it set to false to hit [OK] with enter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 // Note that CreateInDialog() sets this to false. Change it later if you want enter key presses to reach this control in a dialog.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 bool m_dlgWantEnter = true;
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 bool WantReturn() const { return m_dlgWantEnter; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 void SetWantReturn(bool v) { m_dlgWantEnter = v; }
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 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 rowStyleGrid = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 rowStyleFlat,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 rowStylePlaylist,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 rowStylePlaylistDelimited,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 rowStyleDefault = rowStylePlaylistDelimited
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 void SetPlaylistStyle() {SetRowStyle(rowStylePlaylist);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 void SetRowStyle(unsigned v) { if (m_rowStyle == v) return; this->m_rowStyle = v; if (m_hWnd) Invalidate(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 void SetFlatStyle() {SetRowStyle(rowStyleFlat);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 unsigned m_rowStyle = rowStyleDefault;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 bool DelimitColumns() const { return m_rowStyle == rowStyleGrid || m_rowStyle == rowStylePlaylistDelimited; }
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 static COLORREF BlendGridColor( COLORREF bk, COLORREF tx );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 static COLORREF BlendGridColor( COLORREF bk );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 COLORREF GridColor();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 void SetDarkMode(bool bDark);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 virtual void RefreshDarkMode();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 bool GetDarkMode() const { return m_darkMode; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 LRESULT OnSetDark(UINT, WPARAM, LPARAM);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 int HandleWheel(int & p_accum,int p_delta, bool bHoriz);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 void PaintContent(CRect rcPaint, HDC dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 void OnPrintClient(HDC dc, UINT uFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 void OnPaint(CDCHandle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 LRESULT OnVScroll(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 LRESULT OnHScroll(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 LRESULT OnSize(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 LRESULT OnSizeAsync(UINT,WPARAM,LPARAM,BOOL&) {ListHandleResize();return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 LRESULT OnVWheel(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 LRESULT OnHWheel(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 LRESULT OnGesture(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 LRESULT SetFocusPassThru(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 LRESULT OnCreatePassThru(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 BOOL OnEraseBkgnd(CDCHandle);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 LRESULT OnGetDlgCode(UINT, WPARAM, LPARAM);
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 void OnThemeChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 int GetScrollThumbPos(int which);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 void RefreshSliders();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 void RefreshSlider(bool p_vertical);
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 void OnSizeAsync_Trigger();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 static LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 bool MouseWheelFromHook(UINT msg, LPARAM data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 bool m_suppressMouseWheel = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 int m_wheelAccumX = 0, m_wheelAccumY = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 CPoint m_viewOrigin = CPoint(0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 bool m_sizeAsyncPending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 CPoint m_gesturePoint;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 // Prepares group header & variable height item data for view with the specified origin and current client size
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 // Returns true if layout cache has changed, false otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 // Updates ptOrigin if necessary
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 bool PrepLayoutCache(CPoint & ptOrigin, size_t indexLo = SIZE_MAX, size_t indexHi = SIZE_MAX);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 std::map<size_t, int> m_varItemHeights;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 std::set<size_t> m_groupHeaders;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 size_t FindGroupBaseCached(size_t itemFor) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 size_t FindGroupBase(size_t itemFor) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 size_t FindGroupBase(size_t itemFor, groupID_t group) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 // Grouped layout mode toggle
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 // Default mode is greedy, probes whole list layout in advance (no glitches when scrolling)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 // In special conditions when probing is expensive, greedy mode should be turned off
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 bool m_greedyGroupLayout = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 pfc::map_t<pfc::string8, CTheme, pfc::comparator_strcmp> m_themeCache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 CTheme & themeFor( const char * what );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 CTheme & theme() { return themeFor("LISTVIEW");}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 const SIZE m_dpi = QueryScreenDPIEx();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 CGestureAPI m_gestureAPI;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 bool m_ensureVisibleUser = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 void defer( std::function<void () > f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 LRESULT OnExecDeferred(UINT, WPARAM, LPARAM);
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 // Overlays our stuff on top of generic DoDragDrop call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 // Currently catches mouse wheel messages in mid-drag&drop and handles them in our view.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 HRESULT DoDragDrop(LPDATAOBJECT pDataObj, LPDROPSOURCE pDropSource, DWORD dwOKEffects, LPDWORD pdwEffect);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 bool paintInProgress() const { return m_paintInProgress; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 bool m_defferredMsgPending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 std::list<std::function<void ()> > m_deferred;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 bool m_darkMode = false;
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 bool m_paintInProgress = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 class CListControlFontOps : public CListControlImpl {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 typedef CListControlImpl TParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 CListControlFontOps();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 BEGIN_MSG_MAP_EX(CListControlFontOps)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 MESSAGE_HANDLER(WM_GETFONT,OnGetFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 MESSAGE_HANDLER(WM_SETFONT,OnSetFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 CHAIN_MSG_MAP(TParent);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 CFontHandle GetFont() const { return m_font; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 void SetFont(HFONT font, bool bUpdateView = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 CFontHandle GetGroupHeaderFont() const {return (HFONT)m_groupHeaderFont;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 virtual double GroupHeaderFontScale() const { return 1.25; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 virtual int GroupHeaderFontWeight(int origVal) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 //return pfc::min_t<int>(FW_BLACK, origVal + 200);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 return origVal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 //! Overridden implementations should always forward the call to the base class.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 virtual void OnSetFont(bool bUpdatingView) { (void)bUpdatingView; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 int GetGroupHeaderHeight() const override {return m_groupHeaderHeight;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 int GetItemHeight() const override {return m_itemHeight;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 LRESULT OnSetFont(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 LRESULT OnGetFont(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 void UpdateGroupHeaderFont();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 void CalculateHeights();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 int m_itemHeight, m_groupHeaderHeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 CFontHandle m_font;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 CFont m_groupHeaderFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 #include "CListControlHeaderImpl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 #include "CListControlTruncationTooltipImpl.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 typedef CMiddleDragImpl<CListControlTruncationTooltipImpl> CListControl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405