
// MemDumpDlg.h : файл заголовка
//

#pragma once
#include "afxcmn.h"
#include "DumpListCtrl.h"
#include "EnterEditCtrl.h"
#include "GFResizeDialogHelper.h"

class CDebugger;

struct DISPLAY_MODE_PARAM
{
	DUMP_DISPLAY_MODE mode;
	UINT strID;
};

constexpr auto DISPLAY_MODES_NUM = 2;

// диалоговое окно CMemDumpDlg
class CMemDumpDlg : public CDialogEx
{
		CDebugger           *m_pDebugger;
		GFResizeDialogHelper m_Resizer;
		CDumpListCtrl        m_ListMemory;
		CEnterEdit           m_EditAddr;
		CFont                m_hFont;
		HACCEL               m_hAccelTable;
		CToolTipCtrl         m_ToolTip;

		CString              m_strDumpAddr;
		int                  m_nCurrentDDM; // индекс текущего режима
		static DISPLAY_MODE_PARAM m_dmArray[DISPLAY_MODES_NUM]; // в этом массиве

	public:
		CMemDumpDlg(CWnd *pParent = nullptr);  // стандартный конструктор
		virtual ~CMemDumpDlg() override;

		CSize               GetMinSize();

		enum { IDD = IDD_MEMDUMP_DLG };
		void                AttachDebugger(CDebugger *pDbgr);
		void                SetAddress(uint16_t addr);
		uint16_t            GetAddress()
		{
			return m_ListMemory.GetAddress();
		}
		uint16_t            GetDebugMemDumpWord(uint16_t dumpAddress);
		uint8_t             GetDebugMemDumpByte(uint16_t dumpAddress);

		void                DisplayMemDump()
		{
			m_ListMemory.RefreshItems();
		}

	protected:
		virtual void        DoDataExchange(CDataExchange *pDX) override;    // поддержка DDX/DDV
		virtual BOOL        PreTranslateMessage(MSG *pMsg) override;

		void                LoadFunc(uint16_t nLoadAddr = 0);

	protected:
		// Созданные функции схемы сообщений
		LRESULT OnDumpAddressChange(WPARAM wParam, LPARAM lParam);
		virtual BOOL OnInitDialog() override;
		virtual void OnOK() override;
		virtual void OnCancel() override;
		afx_msg void OnSize(UINT nType, int cx, int cy);
		afx_msg void OnSetFocus(CWnd *pOldWnd);
		afx_msg void OnGetMinMaxInfo(MINMAXINFO *lpMMI);
		afx_msg void OnLvnItemchangedMdMemory(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnBnClickedButtonDumpMode();
		afx_msg void OnBnClickedButtonSaveDump();
		afx_msg void OnBnClickedButtonLoadDump();
		DECLARE_MESSAGE_MAP()

};

struct SvDmpParam
{
	int nBgnAddr;
	int nLength;
	int nPage0;
	int nPage1;
	CRect rect;
	SvDmpParam()
		: nBgnAddr(0)
		, nLength(0)
		, nPage0(1)
		, nPage1(2)
	{};
};

class CSvDmpParamDlg : public CDialogEx
{
		DECLARE_DYNAMIC(CSvDmpParamDlg)
		// Создание
	public:
		CSvDmpParamDlg(SvDmpParam *pParam = nullptr, CWnd *pParent = nullptr);
		virtual ~CSvDmpParamDlg() override;
		// Данные диалогового окна

		enum { IDD = IDD_SVDMP_PARAM_DLG };

	protected:
		virtual void DoDataExchange(CDataExchange *pDX) override;   // поддержка DDX/DDV

		// Реализация
	protected:
		CEnterEdit m_EditBgnAddr;
		CEnterEdit m_EditEndAddr;
		CEnterEdit m_EditLength;
		int m_nBgnAddr;
		int m_nEndAddr;
		int m_nLength;
		CString m_strBgnAddr;
		CString m_strEndAddr;
		CString m_strLength;
		SvDmpParam *m_pParam;

		// Созданные функции схемы сообщений
		virtual BOOL OnInitDialog() override;
		virtual void OnOK() override;
		LRESULT OnEditChange(WPARAM wParam, LPARAM lParam);
		afx_msg void OnEnKillfocusEditSvdmpBgnaddr();
		afx_msg void OnEnKillfocusEditSvdmpEndaddr();
		afx_msg void OnEnKillfocusEditSvdmpLength();
		DECLARE_MESSAGE_MAP()

};

class CLdDmpParamDlg : public CDialogEx
{
		DECLARE_DYNAMIC(CLdDmpParamDlg)
		// Создание
	public:
		CLdDmpParamDlg(SvDmpParam *pParam = nullptr, CWnd *pParent = nullptr);
		virtual ~CLdDmpParamDlg() override;
		// Данные диалогового окна

		enum { IDD = IDD_LDDMP_PARAM_DLG };

	protected:
		virtual void DoDataExchange(CDataExchange *pDX) override;   // поддержка DDX/DDV

		// Реализация
	protected:
		CEnterEdit m_EditBgnAddr;
		CEnterEdit m_EditPG0;
		CEnterEdit m_EditPG1;
		int m_nBgnAddr;
		CString m_strBgnAddr;
		int m_nPg0, m_nPg1;
		SvDmpParam *m_pParam;

		// Созданные функции схемы сообщений
		virtual BOOL OnInitDialog() override;
		virtual void OnOK() override;
		LRESULT OnEditChange(WPARAM wParam, LPARAM lParam);
		afx_msg void OnEnKillfocusEditLddmpAddr();

		DECLARE_MESSAGE_MAP()

};

