annotate foosdk/sdk/libPPUI/CListControlHeaderImpl.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 class CListCell;
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 class CListControlHeaderImpl : public CListControlFontOps {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 typedef CListControlFontOps TParent;
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 CListControlHeaderImpl() {}
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 BEGIN_MSG_MAP_EX(CListControlHeaderImpl)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 MSG_WM_THEMECHANGED(OnThemeChangedPT)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 MSG_WM_LBUTTONDBLCLK(OnLButtonDblClk)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 MESSAGE_RANGE_HANDLER_EX(WM_MOUSEFIRST, WM_MOUSELAST, MousePassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 MSG_WM_MOUSELEAVE(OnMouseLeave)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 MSG_WM_CTLCOLORSTATIC(OnCtlColorStatic);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 MESSAGE_HANDLER(WM_KEYDOWN,OnKeyDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 MESSAGE_HANDLER(WM_SYSKEYDOWN,OnKeyDown);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 MESSAGE_HANDLER_EX(WM_SIZE,OnSizePassThru);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 NOTIFY_CODE_HANDLER(HDN_ITEMCHANGED,OnHeaderItemChanged);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 NOTIFY_CODE_HANDLER(HDN_ENDDRAG,OnHeaderEndDrag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 NOTIFY_CODE_HANDLER(HDN_ITEMCLICK,OnHeaderItemClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 NOTIFY_CODE_HANDLER(HDN_DIVIDERDBLCLICK,OnDividerDoubleClick);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 NOTIFY_CODE_HANDLER_EX(NM_CUSTOMDRAW, OnHeaderCustomDraw);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 MSG_WM_SETCURSOR(OnSetCursor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 MSG_WM_MOUSEMOVE(OnMouseMove)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 MSG_WM_DESTROY(OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 MSG_WM_ENABLE(OnEnable)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 MSG_WM_KILLFOCUS(OnKillFocus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 MSG_WM_WINDOWPOSCHANGED(OnWindowPosChanged)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 CHAIN_MSG_MAP(TParent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 END_MSG_MAP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 typedef uint32_t cellState_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 typedef CListCell * cellType_t;
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 int GetHeaderItemWidth( int which );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void InitializeHeaderCtrl(DWORD flags = HDS_FULLDRAG);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void InitializeHeaderCtrlSortable() {InitializeHeaderCtrl(HDS_FULLDRAG | HDS_BUTTONS);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 CHeaderCtrl GetHeaderCtrl() const {return m_header;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void SetSortIndicator( size_t whichColumn, bool isUp );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void ClearSortIndicator();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 bool IsHeaderEnabled() const {return m_header.m_hWnd != NULL;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void ResetColumns(bool update = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 static constexpr uint32_t columnWidthMax = (uint32_t)INT32_MAX,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 columnWidthAuto = UINT32_MAX,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 columnWidthAutoUseContent = UINT32_MAX - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void AddColumn(const char * label, uint32_t widthPixels, DWORD fmtFlags = HDF_LEFT,bool update = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 //! Extended AddColumn, specifies width in pixels @ 96DPI instead of screen-specific pixels
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 void AddColumnEx( const char * label, uint32_t widthPixelsAt96DPI, DWORD fmtFlags = HDF_LEFT, bool update = true );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! Extended AddColumn, specifies width in Dialog Length Units (DLU), assumes parent of this list to be a dialog window.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void AddColumnDLU( const char * label, uint32_t widthDLU, DWORD fmtFlags = HDF_LEFT, bool update = true );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Extended AddColumn, specifies width as floating-point value of pixels at 96DPI. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 //! For DPI-safe storage of user's column widths.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void AddColumnF( const char * label, float widthF, DWORD fmtFlags = HDF_LEFT, bool update = true );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void AddColumnAutoWidth( const char * label, DWORD fmtFlags = HDF_LEFT, bool bUpdate = true) { AddColumn(label, columnWidthAuto, fmtFlags, bUpdate); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 bool DeleteColumn(size_t index, bool updateView = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void DeleteColumns( pfc::bit_array const & mask, bool updateView = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void ResizeColumn(t_size index, t_uint32 widthPixels, bool updateView = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 void SetColumn( size_t which, const char * title, DWORD fmtFlags = HDF_LEFT, bool updateView = true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 void GetColumnText(size_t which, pfc::string_base & out) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 uint32_t GetOptimalColumnWidth( size_t index ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 uint32_t GetOptimalColumnWidthFixed( const char * fixedText, bool pad = true) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 uint32_t GetColumnsBlankWidth( size_t colExclude = SIZE_MAX ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void SizeColumnToContent( size_t which, uint32_t minWidth );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void SizeColumnToContentFillBlank( size_t which );
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 //! If creating a custom headerless multi column scheme, override these to manipulate your columns
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual size_t GetColumnCount() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 virtual uint32_t GetSubItemWidth(size_t subItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Returns column width as a floating-point value of pixels at 96DPI. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! For DPI-safe storage of user's column widths.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 float GetColumnWidthF( size_t subItem ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! Indicate how many columns a specific row/column cell spans\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! This makes sense only if the columns can't be user-reordered
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual size_t GetSubItemSpan(size_t row, size_t column) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 t_size GetSubItemOrder(t_size subItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 int GetItemWidth() const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void SetHeaderFont(HFONT font);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 CRect GetClientRectHook() const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 void RenderBackground(CDCHandle dc, CRect const& rc) override;
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 struct GetOptimalWidth_Cache {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! For temporary use.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 pfc::string8_fastalloc m_stringTemp, m_stringTempFixAmpersands;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! For temporary use.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 pfc::stringcvt::string_wide_from_utf8_t<pfc::alloc_fast_aggressive> m_convertTemp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Our DC for measuring text. Correct font pre-selected.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 CDCHandle m_dc;
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 t_uint32 GetStringTempWidth();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 void UpdateHeaderLayout();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void OnViewOriginChange(CPoint p_delta) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void RenderItemText(t_size item,const CRect & itemRect,const CRect & updateRect,CDCHandle dc, bool allowColors) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void RenderGroupHeaderText2(size_t baseItem,const CRect & headerRect,const CRect & updateRect,CDCHandle dc) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void RenderGroupOverlay(size_t baseItem, const CRect& p_groupWhole, const CRect& p_updateRect, CDCHandle p_dc) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void UpdateGroupOverlayColumnByID(groupID_t groupID, size_t subItem);
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 //! Converts an item/subitem rect to a rect in which the text should be rendered, removing spacing to the left/right of the text.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 virtual CRect GetItemTextRectHook(size_t item, size_t subItem, CRect const & itemRect) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 CRect GetItemTextRect(CRect const & itemRect) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! Override for custom spacing to the left/right of the text in each column.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 virtual t_uint32 GetColumnSpacing() const {return MulDiv(4,m_dpi.cx,96);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Override for column-header-click sorting.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 virtual void OnColumnHeaderClick(t_size index) { (void)index; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Override to supply item labels.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 virtual bool GetSubItemText(t_size item, t_size subItem, pfc::string_base& out) const { (void)item; (void)subItem; (void)out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 //! Override if you support groups.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 virtual bool GetGroupHeaderText2(size_t baseItem, pfc::string_base& out) const { (void)baseItem; (void)out; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! Override optionally.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 virtual void RenderSubItemText(t_size item, t_size subItem,const CRect & subItemRect,const CRect & updateRect,CDCHandle dc, bool allowColors);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 virtual void RenderGroupOverlayColumn(size_t baseItem, size_t subItem, const CRect& p_groupWhole, const CRect& p_updateRect, CDCHandle p_dc) { (void)baseItem; (void)subItem; (void)p_groupWhole; (void)p_updateRect; (void)p_dc; }
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 virtual void OnColumnsChanged();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 virtual t_uint32 GetOptimalSubItemWidth(t_size item, t_size subItem, GetOptimalWidth_Cache & cache) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 virtual t_uint32 GetOptimalGroupHeaderWidth2(size_t baseItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 bool GetItemAtPointAbsEx( CPoint pt, size_t & outItem, size_t & outSubItem ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 cellType_t GetCellTypeAtPointAbs( CPoint pt ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 virtual cellType_t GetCellType( size_t item, size_t subItem ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 virtual bool AllowTypeFindInCell( size_t item, size_t subItem ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 virtual bool GetCellTypeSupported() const { return false; } // optimization hint, some expensive checks can be suppressed if cell types are not used for this view
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 virtual bool GetCellCheckState(size_t item, size_t subItem) const { (void)item; (void)subItem; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 virtual void SetCellCheckState(size_t item, size_t subItem, bool value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 virtual bool ToggleSelectedItemsHook(const pfc::bit_array & mask) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 virtual bool RenderCellImageTest(size_t item, size_t subItem) const { (void)item; (void)subItem; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 virtual void RenderCellImage(size_t item, size_t subItem, CDCHandle, const CRect&) const { (void)item; (void)subItem; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 t_uint32 GetOptimalColumnWidth(t_size which, GetOptimalWidth_Cache & cache) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_uint32 GetOptimalSubItemWidthSimple(t_size item, t_size subItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 void AutoColumnWidths(const pfc::bit_array & mask,bool expandLast = false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 void AutoColumnWidths() {AutoColumnWidths(pfc::bit_array_true());}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 void AutoColumnWidth(t_size which) {AutoColumnWidths(pfc::bit_array_one(which));}
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 virtual bool OnColumnHeaderDrag(t_size index, t_size newOrder);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 void OnItemClicked(t_size item, CPoint pt) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 virtual void OnSubItemClicked(t_size item, t_size subItem,CPoint pt);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 bool OnClickedSpecialHitTest(CPoint pt) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 bool OnClickedSpecial(DWORD status, CPoint pt) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 static bool CellTypeUsesSpecialHitTests( cellType_t ct );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 CRect GetSubItemRectAbs(t_size item,t_size subItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 CRect GetSubItemRect(t_size item,t_size subItem) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 t_size SubItemFromPointAbs(CPoint pt) const;
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 static bool CellTypeReactsToMouseOver( cellType_t ct );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 virtual CRect CellHotRect( size_t item, size_t subItem, cellType_t ct, CRect rcCell );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 CRect CellHotRect( size_t item, size_t subItem, cellType_t ct );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 virtual double CellTextScale(size_t item, size_t subItem) { (void)item; (void)subItem; return 1; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 virtual bool IsSubItemGrayed(size_t item, size_t subItem) { (void)item; (void)subItem; return !this->IsWindowEnabled(); }
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 virtual void CellTrackMouseMove(size_t item, size_t subItem, UINT msg, DWORD status, CPoint pt) { (void)item; (void)subItem; (void)msg; (void)status; (void)pt; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 // HDF_* constants for this column, override when not using list header control. Used to control text alignment.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 virtual DWORD GetColumnFormat(t_size which) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 void SetColumnFormat(t_size which,DWORD format);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 void SetColumnSort(t_size which, bool isUp);
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 std::vector<int> GetColumnOrderArray() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 bool AllowScrollbar(bool vertical) const override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void RenderItemBackground(CDCHandle p_dc,const CRect & p_itemRect,size_t item, uint32_t bkColor) override;
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 void ColumnWidthFix(); // Call RecalcItemWidth() / ProcessAutoWidth()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void ReloadData() override;
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 size_t HotItem() const { return m_hotItem; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 size_t HotSubItem() const { return m_hotSubItem; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 virtual void RequestEditItem(size_t item, size_t subItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 void OnLButtonDblClk(UINT nFlags, CPoint point);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 void OnThemeChangedPT();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 void OnEnable(BOOL) { Invalidate(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 HBRUSH OnCtlColorStatic(CDCHandle dc, CStatic wndStatic);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 void ProcessColumnsChange() { OnColumnsChanged();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 LRESULT OnSizePassThru(UINT,WPARAM,LPARAM);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 LRESULT OnHeaderItemClick(int,LPNMHDR,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 LRESULT OnHeaderCustomDraw(LPNMHDR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 LRESULT OnDividerDoubleClick(int,LPNMHDR,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 LRESULT OnHeaderItemChanged(int,LPNMHDR,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 LRESULT OnHeaderEndDrag(int,LPNMHDR,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 LRESULT OnKeyDown(UINT,WPARAM,LPARAM,BOOL&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 void OnDestroy();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 void OnMouseMove(UINT nFlags, CPoint point);
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 void RecalcItemWidth(); // FIXED width math
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 void ProcessAutoWidth(); // DYNAMIC width math
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 bool m_ownColumnsChange = false;
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 int m_itemWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 int m_clientWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 CHeaderCtrl m_header;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 bool m_headerDark = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 CStatic m_headerLine;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 bool HaveAutoWidthColumns() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 bool HaveAutoWidthContentColumns() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 struct colRuntime_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 bool m_autoWidth = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 bool m_autoWidthContent = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 int m_widthPixels = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 uint32_t m_userWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 std::string m_text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 bool autoWidth() const { return m_userWidth > columnWidthMax; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 bool autoWidthContent() const { return m_userWidth == columnWidthAutoUseContent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 bool autoWidthPlain() const { return m_userWidth == columnWidthAuto; }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 std::vector<colRuntime_t> m_colRuntime;
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 //for group headers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 GdiplusScope m_gdiPlusScope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 void SetPressedItem(size_t row, size_t column);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 void ClearPressedItem() {SetPressedItem(SIZE_MAX, SIZE_MAX);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 void SetHotItem( size_t row, size_t column );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 void ClearHotItem() { SetHotItem(SIZE_MAX, SIZE_MAX); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 virtual void HotItemChanged(size_t row, size_t column) { (void)row; (void)column; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 virtual void PressedItemChanged(size_t row, size_t column) { (void)row; (void)column; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 size_t m_pressedItem = SIZE_MAX, m_pressedSubItem = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 size_t m_hotItem = SIZE_MAX, m_hotSubItem = SIZE_MAX;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 // ==== mySetCapture stuff ====
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 // SetCapture()-like functionality used for tracking of hot fields.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 // Not a part of the API, do not reuse in subclasses.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 void mySetCapture(CaptureProc_t proc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 void myReleaseCapture();
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 void TrackMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 void mySetCaptureMsgHandled(BOOL v) { this->SetMsgHandled(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 CaptureProc_t m_captureProc;
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 OnMouseLeave();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 void OnKillFocus(CWindow);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 void OnWindowPosChanged(LPWINDOWPOS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 LRESULT MousePassThru(UINT, WPARAM, LPARAM);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 };