#pragma once
#include "BKDImage.h"
#include "BKDAndos.h"
#include "BKDAodos.h"
#include "BKDCsidos3.h"
#include "BKDMikrodos.h"
#include "BKDMkdos.h"
#include "BKDNord.h"
#include "BKDRT11.h"
#include "BKDNCdos.h"

using namespace std;
#include <vector>


// CMyListCtrl

class CMyListCtrl : public CListCtrl
{
		DECLARE_DYNAMIC(CMyListCtrl)

		enum {LC_FNAME_POS = 0, LC_TYPE_POS, LC_BLK_SIZE_POS, LC_ADDRESS_POS, LC_SIZE_POS, LC_ATTR_POS, LC_SPECIFIC_POS};

	protected:
		CBKDImage *m_bkdImage;
		vector<CBKDImage *> m_vpImages; //тут будут храниться объекты, когда мы заходим в лог.диски

		PaneInfo m_PaneInfo;
		vector<PaneInfo> m_vSelItems;

		CString m_strCurrPath; //полный путь к файлу в образе. Нужен для экспорта структуры каталогов

		CFont m_fontBold;

		bool m_bSpecificColumn; //флаг создания колонки со специфическими для заданной ОС данными
		bool m_bCheckBinExtractStatus; //состояние чекбоксов "использовать формат бин"
		bool m_bCheckLogExtractStatus; //и "создавать лог извлечения" соответственно, проще их тут хранить, чем запрашивать сложными путями у родителя

	public:
		CMyListCtrl();
		virtual ~CMyListCtrl();

	public:
		void Init();
		bool SetImgName(const PARSE_RESULT &image, bool bLogDisk = false);
		bool ResetImgName(const PARSE_RESULT &image);
		void CloseImage();
		UINT GetImgFormatName();

		void ExtractSelected(const CString &strOutPath);
		void ViewSelected(bool bViewAsText = true);
		FILESAVE_STATUS AddFile(CString &str);


//-------------------всё, что касается лог.диска
		void ClearImgVector();
		void PushCurrentImg();
		bool PopCurrentImg();
		inline void CloseCurrentImage()
		{
			m_bkdImage->CloseFile();
		}
		inline void ReopenCurrentImage()
		{
			m_bkdImage->Reset();
		}
		inline ULONG GetBaseOffset() const
		{
			return m_bkdImage->GetBaseOffset();
		}
		inline ULONG GetImgSize() const
		{
			return m_bkdImage->GetImgSize();
		}
		inline bool GetImageOpenStatus() const
		{
			return m_bkdImage->GetImageOpenStatus();
		}
		inline void SetCheckBinExtractStatus(bool bStatus = false)
		{
			m_bCheckBinExtractStatus = bStatus;
		}
		inline void SetCheckLogExtractStatus(bool bStatus = false)
		{
			m_bCheckLogExtractStatus = bStatus;
		}
	protected:
		void OutDir(int iCurItem, int iCurDir);
		void RefreshDir();
		void OutCurrFilePath();
		void OutDiskInfo();

		void ClearAllRecord();

		void SetSpecificColumn();
		void AddSpecificColumn(UINT nID);
		void DelSpecificColumn();

		void StepIntoDir(FileRecord *fr);
		void StepUptoDir();

		static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
		void OutRecord(FileRecord *fr, int item);
		void ItemProcessing(int nItem, bool bViewAsText = true);
		void ClearSelectAll();
		void SetSelectAll();
		void SetSelectCurrent(int nItem);
		void SetSelectRange(int nFrom, int nTo);

		virtual void PreSubclassWindow();
	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 OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnDestroy();
		afx_msg void OnDropFiles(HDROP hDropInfo);
		afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult);
		DECLARE_MESSAGE_MAP()
};
