Mercurial > foo_out_sdl
comparison foosdk/sdk/libPPUI/CListControlOwnerData.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 |
comparison
equal
deleted
inserted
replaced
| 0:e9bb126753e7 | 1:20d02a178406 |
|---|---|
| 1 #pragma once | |
| 2 | |
| 3 // ================================================================================ | |
| 4 // CListControlOwnerData | |
| 5 // ================================================================================ | |
| 6 // Forwards all list data retrieval and manipulation calls to a host object. | |
| 7 // Not intended for subclassing, just implement IListControlOwnerDataSource methods | |
| 8 // in your class. | |
| 9 // ================================================================================ | |
| 10 | |
| 11 #include "CListControlComplete.h" | |
| 12 | |
| 13 class CListControlOwnerData; | |
| 14 | |
| 15 class IListControlOwnerDataSource { | |
| 16 public: | |
| 17 typedef const CListControlOwnerData * ctx_t; | |
| 18 | |
| 19 | |
| 20 virtual size_t listGetItemCount( ctx_t ) = 0; | |
| 21 virtual pfc::string8 listGetSubItemText( ctx_t, size_t item, size_t subItem ) = 0; | |
| 22 virtual bool listCanReorderItems( ctx_t ) { return false; } | |
| 23 virtual bool listReorderItems( ctx_t, const size_t*, size_t) {return false;} | |
| 24 virtual bool listRemoveItems( ctx_t, pfc::bit_array const & ) {return false;} | |
| 25 virtual void listItemAction(ctx_t, size_t) {} | |
| 26 virtual void listSubItemClicked( ctx_t, size_t, size_t ) {} | |
| 27 virtual bool listCanSelectItem( ctx_t, size_t ) { return true; } | |
| 28 virtual pfc::string8 listGetEditField(ctx_t ctx, size_t item, size_t subItem, size_t & lineCount) { | |
| 29 lineCount = 1; return listGetSubItemText( ctx, item, subItem); | |
| 30 } | |
| 31 virtual void listSetEditField(ctx_t ctx, size_t item, size_t subItem, const char * val) {} | |
| 32 // Returns InPlaceEdit::KFlag* | |
| 33 virtual uint32_t listGetEditFlags(ctx_t ctx, size_t item, size_t subItem) {return 0;} | |
| 34 typedef InPlaceEdit::CTableEditHelperV2::autoComplete_t autoComplete_t; | |
| 35 typedef InPlaceEdit::CTableEditHelperV2::combo_t combo_t; | |
| 36 virtual autoComplete_t listGetAutoComplete(ctx_t, size_t item, size_t subItem) {return autoComplete_t();} | |
| 37 virtual combo_t listGetCombo(ctx_t, size_t item, size_t subItem) { return combo_t(); } | |
| 38 | |
| 39 virtual bool listIsColumnEditable( ctx_t, size_t ) { return false; } | |
| 40 virtual bool listKeyDown(ctx_t, UINT nChar, UINT nRepCnt, UINT nFlags) { return false; } | |
| 41 virtual bool listKeyUp(ctx_t, UINT nChar, UINT nRepCnt, UINT nFlags) { return false; } | |
| 42 | |
| 43 // Allow type-find in this view? | |
| 44 // Called prior to a typefind pass attempt, you can either deny entirely, or prepare any necessary data and allow it. | |
| 45 virtual bool listAllowTypeFind( ctx_t ) { return true; } | |
| 46 // Allow type-find in a specific item/column? | |
| 47 virtual bool listAllowTypeFindHere( ctx_t, size_t item, size_t subItem ) { return true ;} | |
| 48 | |
| 49 virtual void listColumnHeaderClick(ctx_t, size_t subItem) {} | |
| 50 | |
| 51 virtual void listBeforeDrawItemText( ctx_t, size_t item, CDCHandle dc ) {} | |
| 52 virtual bool listIsSubItemGrayed(ctx_t, size_t item, size_t subItem) { return false; } | |
| 53 | |
| 54 virtual void listSelChanged(ctx_t) {} | |
| 55 virtual void listFocusChanged(ctx_t) {} | |
| 56 | |
| 57 virtual void listColumnsChanged(ctx_t) {} | |
| 58 | |
| 59 virtual bool listEditCanAdvanceHere(ctx_t, size_t item, size_t subItem, uint32_t whatHappened) {(void) item; (void) subItem, (void) whatHappened; return true;} | |
| 60 | |
| 61 virtual uint32_t listQueryDragDropTypes(ctx_t) const { return 0; } | |
| 62 virtual DWORD listDragDropAccept(ctx_t, IDataObject* obj, bool& showDropMark) { return DROPEFFECT_NONE; } | |
| 63 virtual pfc::com_ptr_t<IDataObject> listMakeDataObject(ctx_t) {return nullptr;} | |
| 64 virtual void listOnDrop(ctx_t,IDataObject* obj, CPoint pt) {} | |
| 65 virtual DWORD listDragDropSourceEffects(ctx_t) { return DROPEFFECT_MOVE | DROPEFFECT_COPY; } | |
| 66 virtual void listDragDropSourceSucceeded(ctx_t,DWORD effect) {} | |
| 67 | |
| 68 virtual CListControl::groupID_t listItemGroup(ctx_t, size_t) { return 0; } | |
| 69 virtual pfc::string8 listGroupText(ctx_t, size_t /*baseItem*/) { return ""; } | |
| 70 }; | |
| 71 | |
| 72 class IListControlOwnerDataCells { | |
| 73 public: | |
| 74 typedef const CListControlOwnerData * cellsCtx_t; | |
| 75 virtual CListControl::cellType_t listCellType( cellsCtx_t, size_t item, size_t subItem ) = 0; | |
| 76 virtual size_t listCellSpan( cellsCtx_t, size_t item, size_t subItem ) {return 1;} | |
| 77 virtual bool listCellCheckState( cellsCtx_t, size_t item, size_t subItem ) {return false; } | |
| 78 virtual void listCellSetCheckState( cellsCtx_t, size_t item, size_t subItem, bool state ) {} | |
| 79 }; | |
| 80 | |
| 81 class CListControlOwnerData : public CListControlComplete { | |
| 82 public: | |
| 83 IListControlOwnerDataSource* const m_host; | |
| 84 size_t m_listControlOwnerDataTag = 0; | |
| 85 CListControlOwnerData( IListControlOwnerDataSource * h) : m_host(h) {} | |
| 86 | |
| 87 BEGIN_MSG_MAP_EX(CListControlOwnerData) | |
| 88 MSG_WM_KEYDOWN(OnKeyDown) | |
| 89 MSG_WM_KEYUP(OnKeyUp) | |
| 90 MSG_WM_SYSKEYDOWN(OnKeyDown) | |
| 91 MSG_WM_SYSKEYUP(OnKeyUp) | |
| 92 CHAIN_MSG_MAP(CListControlComplete) | |
| 93 END_MSG_MAP() | |
| 94 | |
| 95 using CListControl_EditImpl::TableEdit_Abort; | |
| 96 using CListControl_EditImpl::TableEdit_Start; | |
| 97 using CListControl_EditImpl::TableEdit_IsActive; | |
| 98 | |
| 99 bool CanSelectItem( size_t idx ) const override { | |
| 100 return m_host->listCanSelectItem( this, idx ); | |
| 101 } | |
| 102 size_t GetItemCount() const override { | |
| 103 return m_host->listGetItemCount( this ); | |
| 104 } | |
| 105 bool GetSubItemText(size_t item, size_t subItem, pfc::string_base & out) const override { | |
| 106 out = m_host->listGetSubItemText( this, item, subItem ); | |
| 107 return true; | |
| 108 } | |
| 109 void OnSubItemClicked( size_t item, size_t subItem, CPoint pt ) override { | |
| 110 __super::OnSubItemClicked(item, subItem, pt); // needed to toggle checkboxes etc | |
| 111 m_host->listSubItemClicked( this, item, subItem ); | |
| 112 } | |
| 113 | |
| 114 uint32_t QueryDragDropTypes() const override { | |
| 115 uint32_t ret = (m_host->listCanReorderItems(this)) ? dragDrop_reorder : 0; | |
| 116 ret |= m_host->listQueryDragDropTypes(this); | |
| 117 return ret; | |
| 118 } | |
| 119 | |
| 120 void RequestReorder( const size_t * order, size_t count) override { | |
| 121 if ( ! m_host->listReorderItems( this, order, count )) return; | |
| 122 this->OnItemsReordered( order, count ); | |
| 123 } | |
| 124 void RequestRemoveSelection() override { | |
| 125 auto mask = this->GetSelectionMask(); | |
| 126 size_t oldCount = GetItemCount(); | |
| 127 if ( ! m_host->listRemoveItems( this, mask ) ) return; | |
| 128 this->OnItemsRemoved( mask, oldCount ); | |
| 129 } | |
| 130 void ExecuteDefaultAction( size_t idx ) override { | |
| 131 m_host->listItemAction( this, idx ); | |
| 132 } | |
| 133 size_t EvalTypeFind() override { | |
| 134 if (! m_host->listAllowTypeFind(this) ) return SIZE_MAX; | |
| 135 return __super::EvalTypeFind(); | |
| 136 } | |
| 137 bool AllowTypeFindInCell( size_t item, size_t subItem ) const { | |
| 138 return __super::AllowTypeFindInCell( item, subItem ) && m_host->listAllowTypeFindHere( this, item, subItem ); | |
| 139 } | |
| 140 | |
| 141 groupID_t GetItemGroup(t_size p_item) const override { | |
| 142 return m_host->listItemGroup(this, p_item); | |
| 143 } | |
| 144 bool GetGroupHeaderText2(size_t baseItem, pfc::string_base& out) const override { | |
| 145 out = m_host->listGroupText(this, baseItem); | |
| 146 return true; | |
| 147 } | |
| 148 protected: | |
| 149 void OnFocusChanged(size_t oldFocus, size_t newFocus) override { | |
| 150 __super::OnFocusChanged(oldFocus, newFocus); | |
| 151 m_host->listFocusChanged(this); | |
| 152 } | |
| 153 void OnSelectionChanged(pfc::bit_array const & affected, pfc::bit_array const & status) { | |
| 154 __super::OnSelectionChanged(affected, status); | |
| 155 m_host->listSelChanged(this); | |
| 156 } | |
| 157 | |
| 158 void RenderItemText(t_size p_item,const CRect & p_itemRect,const CRect & p_updateRect,CDCHandle p_dc, bool allowColors) { | |
| 159 m_host->listBeforeDrawItemText(this, p_item, p_dc ); | |
| 160 __super::RenderItemText(p_item, p_itemRect, p_updateRect, p_dc, allowColors); | |
| 161 } | |
| 162 void TableEdit_SetField(t_size item, t_size subItem, const char * value) override { | |
| 163 m_host->listSetEditField(this, item, subItem, value); | |
| 164 } | |
| 165 void TableEdit_GetField(t_size item, t_size subItem, pfc::string_base & out, t_size & lineCount) override { | |
| 166 lineCount = 1; | |
| 167 out = m_host->listGetEditField(this, item, subItem, lineCount); | |
| 168 } | |
| 169 | |
| 170 t_uint32 TableEdit_GetEditFlags(t_size item, t_size subItem) const override { | |
| 171 auto ret = __super::TableEdit_GetEditFlags(item, subItem); | |
| 172 ret |= m_host->listGetEditFlags( this, item, subItem ); | |
| 173 return ret; | |
| 174 } | |
| 175 | |
| 176 combo_t TableEdit_GetCombo(size_t item, size_t subItem) override { | |
| 177 return m_host->listGetCombo(this, item, subItem); | |
| 178 } | |
| 179 autoComplete_t TableEdit_GetAutoCompleteEx(t_size item, t_size subItem) override { | |
| 180 return m_host->listGetAutoComplete( this, item, subItem ); | |
| 181 } | |
| 182 bool TableEdit_IsColumnEditable(t_size subItem) const override { | |
| 183 return m_host->listIsColumnEditable( this, subItem ); | |
| 184 } | |
| 185 void OnColumnHeaderClick(t_size index) override { | |
| 186 m_host->listColumnHeaderClick(this, index); | |
| 187 } | |
| 188 void OnColumnsChanged() override { | |
| 189 __super::OnColumnsChanged(); | |
| 190 m_host->listColumnsChanged(this); | |
| 191 } | |
| 192 bool IsSubItemGrayed(size_t item, size_t subItem) override { | |
| 193 return __super::IsSubItemGrayed(item, subItem) || m_host->listIsSubItemGrayed(this, item, subItem); | |
| 194 } | |
| 195 | |
| 196 DWORD DragDropAccept(IDataObject* obj, bool& showDropMark) override { return m_host->listDragDropAccept(this, obj, showDropMark); } | |
| 197 pfc::com_ptr_t<IDataObject> MakeDataObject() override { | |
| 198 auto ret = m_host->listMakeDataObject(this); | |
| 199 if (ret.is_empty()) ret = __super::MakeDataObject(); | |
| 200 return ret; | |
| 201 } | |
| 202 void OnDrop(IDataObject* obj, CPoint pt) override { return m_host->listOnDrop(this, obj, pt); } | |
| 203 DWORD DragDropSourceEffects() override { return m_host->listDragDropSourceEffects(this); } | |
| 204 void DragDropSourceSucceeded(DWORD effect) override { m_host->listDragDropSourceSucceeded(this, effect); } | |
| 205 | |
| 206 private: | |
| 207 bool TableEdit_CanAdvanceHere( size_t item, size_t subItem, uint32_t whatHappened ) const override { | |
| 208 return m_host->listEditCanAdvanceHere(this, item, subItem, whatHappened); | |
| 209 } | |
| 210 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { | |
| 211 bool handled = m_host->listKeyDown(this, nChar, nRepCnt, nFlags); | |
| 212 SetMsgHandled( !! handled ); | |
| 213 } | |
| 214 void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) { | |
| 215 bool handled = m_host->listKeyUp(this, nChar, nRepCnt, nFlags); | |
| 216 SetMsgHandled( !! handled ); | |
| 217 } | |
| 218 }; | |
| 219 | |
| 220 class CListControlOwnerDataCells : public CListControlOwnerData { | |
| 221 IListControlOwnerDataCells * const m_cells; | |
| 222 public: | |
| 223 CListControlOwnerDataCells( IListControlOwnerDataSource * source, IListControlOwnerDataCells * cells ) : CListControlOwnerData(source), m_cells(cells) {} | |
| 224 | |
| 225 bool GetCellTypeSupported() const override {return true; } | |
| 226 bool GetCellCheckState( size_t item, size_t subItem ) const override { | |
| 227 return m_cells->listCellCheckState( this, item, subItem ); | |
| 228 } | |
| 229 void SetCellCheckState( size_t item, size_t subItem, bool value ) override { | |
| 230 m_cells->listCellSetCheckState( this, item, subItem, value ); | |
| 231 __super::SetCellCheckState(item, subItem, value); | |
| 232 } | |
| 233 cellType_t GetCellType( size_t item, size_t subItem ) const override { | |
| 234 return m_cells->listCellType( this, item, subItem ); | |
| 235 } | |
| 236 size_t GetSubItemSpan(size_t row, size_t column) const override { | |
| 237 return m_cells->listCellSpan( this, row, column ); | |
| 238 } | |
| 239 }; |
