#pragma once

#include <afxcmn.h>


constexpr auto SORT2_WORD_WIDTH = 32; // ширина слова в битах
constexpr auto SORT2_TYPE_WIDTH = 4;  // ширина поля для типа в битах
constexpr auto SORT2_ITEM_WIDTH = SORT2_WORD_WIDTH - SORT2_TYPE_WIDTH; // ширина поля для номера элемента в битах
constexpr auto SORT2_TYPE_MASK = (1 << SORT2_TYPE_WIDTH) - 1;
constexpr auto SORT2_ITEM_MASK = (1 << SORT2_ITEM_WIDTH) - 1;

class CBKListCtrl : public CListCtrl
{
		DECLARE_DYNAMIC(CBKListCtrl)

	public:
		enum class MODE_CTRL {START, MAIN}; // режимы работы контрола.
		// номера колонок для основного режима
		enum { LC_FNAME_POS = 0, LC_TYPE_POS, LC_BLK_SIZE_POS, LC_ADDRESS_POS, LC_SIZE_POS, LC_ATTR_POS, LC_SPECIFIC_POS };
		// номера колонок для стартового режима
		enum { LC_FNAME_ST = 0, LC_SIZE_ST, LC_OSTYPE_ST, LC_SYSTYPE_ST };

	protected:
		CFont           m_fontBold, m_font;
		bool            m_bSpecificColumn{ false };
		MODE_CTRL       m_nWorkMode{ MODE_CTRL::START }; // текущий режим работы

		bool            m_bSelectAll{ false };
		int             m_nLastMouseClicked{ 0 };

		void            ClearSelectAll();
		void            SetSelectAll();
		void            SetSelectCurrent(int nItem);
		void            SetSelectRange(int nFrom, int nTo) const;

		void            StepTo(int nFlags, int nItem, bool bMM);
		void            MouseClick(int nItem);
		void            EnterTo(int nItem) const;
		void            ImgEnterTo(int nItem) const;
		void            StepLeft(int nItem, bool bMM);
		void            StepRight(int nItem, bool bMM);
		void            ChangeSelection(const int nItem, const int nNextItem, const bool bMM);

		virtual void    PreSubclassWindow() override;

	public:
		CBKListCtrl();
		virtual ~CBKListCtrl() override;

		void            Init(MODE_CTRL nMode = MODE_CTRL::MAIN);
		void            SetSpecificColumn(UINT nID);
		static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
		static int CALLBACK MyCompareProc2(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

	public:
		afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); // должно быть публичным
	protected:
		afx_msg void OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnLvnItemСhanged(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnDropFiles(HDROP hDropInfo);
		afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
		afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
		DECLARE_MESSAGE_MAP()
};

