#pragma once
#include "DocPaneDlgViewBase.h"
#include "MultiEditListCtrl.h"


// константы списков: ширина колонок
constexpr auto COLUMN_WIDTH = 60;
// стандартное количество колонок (обычно в списке)
constexpr auto COLNUM_STD = 2;

static const DWORD BG_COLOR = ::GetSysColor(COLOR_BTNFACE);

// флаги, задающие валидные значения, 1 = значение есть, 0 = значения нет, и делать ничего не надо
constexpr DWORD COL_WIDTH = 1;
constexpr DWORD COL_COLOR = 2;
constexpr DWORD COL_VALUE = 4;
constexpr DWORD COL_EDITABLE = 8;

class CRegDumpDocPaneDlgViewHelper : public CDocPaneDlgViewBase
{
		DECLARE_DYNAMIC(CRegDumpDocPaneDlgViewHelper)

	public:
		// номера колонок для стандартного, лвухколоночного списка
		enum LSTSTD_COL : int
		{
			NAME = 0,
			VALUE
		};

		struct ColParam_t
		{
			DWORD       dwState{ 0 };   // флаги
			int         nWidth{ 0 };    // ширина колонки
			COLORREF    color{ 0 };     // цвет колонки
		};

		struct CellParam_t
		{
			DWORD       dwState{ 0 };   // флаги
			UINT        nIDStrValue{ 0 }; // значение в ячейке
			COLORREF    color{ 0 };     // цвет колонки
		};

		struct ListParam_t
		{
			CMultiEditListCtrl *pList{ nullptr };
			const std::span<const ColParam_t> pCP;
			const CellParam_t *pRP{ nullptr }; // а двумерный массив через span передать нельзя
			size_t      nCols{ 0 };
			size_t      nRows{ 0 };
			UINT        nGrpId{ 0 };
			bool        bVisible{ false };
		};

	protected:
		int             m_nPixelW{0};
		int             m_nPixelH{0};
		int             m_padX{ 0 };
		int             m_padY{ 0 };
		std::vector <ListParam_t> m_vList;

	public:
		CRegDumpDocPaneDlgViewHelper() = default;
		virtual ~CRegDumpDocPaneDlgViewHelper() override
		    = default;

		void CreateList(ListParam_t &p);
		void ReArrangeList(ListParam_t &p) const;

		// Вход: p - элемент параметров списка
		// Вход-Выход: ptLT - координата верхней левой точки списка, если 0 - то берутся текущие
		//              maxGW - максимальная ширина группы
		void ResizeList(ListParam_t &p, CPoint &ptLT, int &maxGW) const;

		void SetGrpWidth(CWnd *grp, const int width) const;
	protected:
		afx_msg LRESULT HandleInitDialog(WPARAM wp, LPARAM lp);

};

extern const std::array<CRegDumpDocPaneDlgViewHelper::ColParam_t, COLNUM_STD> arLSTCols;

