#pragma once

#include "DumpListCtrl.h"
#include "EnterEditCtrl.h"
#include "Config.h"
#include "DocPaneDlgViewBase.h"
#include "BaseDialog.h"


class COctSpinButtonCtrl;
class COctalEdit : public CEdit
{
		DECLARE_DYNAMIC(COctalEdit)

		COctSpinButtonCtrl *m_pSpin;

	public:
		COctalEdit();
		virtual ~COctalEdit() override;
		void AttachSpin(COctSpinButtonCtrl *pSpin)
		{
			m_pSpin = pSpin;
		}
	protected:
		afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
		afx_msg void OnEnUpdate();
		DECLARE_MESSAGE_MAP()
};


class COctSpinButtonCtrl : public CSpinButtonCtrl
{
		DECLARE_DYNAMIC(COctSpinButtonCtrl)
		COctalEdit *m_pOctBuddy;
		bool m_bSpinChange;
	public:
		COctSpinButtonCtrl();
		virtual ~COctSpinButtonCtrl() override;
		void SetOctBuddy(COctalEdit *pOctBuddy);
		bool isSpinChange() const
		{
			return m_bSpinChange;
		}
	protected:
		afx_msg void OnDeltapos(NMHDR *pNMHDR, LRESULT *pResult);
		DECLARE_MESSAGE_MAP()
};





struct DISPLAY_MODE_PARAM
{
	DUMP_DISPLAY_MODE mode;
	UINT strID;
};

constexpr auto DISPLAY_MODES_NUM = 2;

class CMemDumpView : public CDocPaneDlgViewBase
{
		DECLARE_DYNAMIC(CMemDumpView)

		CDumpListCtrl   m_ListMemory;
		CEnterEdit      m_EditAddr;
		COctalEdit      m_EditAZSegment;

		CComboBox       m_cbWndList;
		CComboBox       m_cbWndAddr;

		COctSpinButtonCtrl m_spinAZSegment;
		const uint8_t        *m_pAZMemory; // указатель на начало массива памяти AZBK
		int             m_nAZSegment; // номер сегмента AZBK
		bool            m_bAZShowed; // флаг работы с памятью AZBK

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

		uint8_t        *m_pDmpEAPtr;    // указатель на начало окна в массиве m_pMemory
		VWinParam      *m_pV;

// Создание
	public:
		enum { IDD = IDD_MEMDUMP_DLG };
		CMemDumpView();
		virtual ~CMemDumpView() override;

// Реализация
	public:
		void            DisplayMemDump();

		uint16_t        GetAddress() const
		{
			return m_ListMemory.GetAddress();
		}
		void            SetAddress(const uint16_t addr);
		void            SetDumpWindows(VWinParam *pV, const int nPageListPos, const int nAddrListPos);

		int             GetDumpPageListPos() const;
		int             GetDumpAddrListPos() const;

		uint16_t        GetDebugMemDumpWord(const uint16_t dumpAddress) const;
		uint8_t         GetDebugMemDumpByte(const uint16_t dumpAddress) const;
		void            SetDebugMemDumpWord(const uint16_t dumpAddress, const uint16_t value) const;
		void            SetDebugMemDumpByte(const uint16_t dumpAddress, const uint8_t value) const;

		void            RefreshDump(uint8_t *pDmpEAPtr);

	protected:
		void            LoadFunc(uint16_t nLoadAddr = 0);
		void            ChangeViewDlg(const bool bAZBK);
		virtual void    DoDataExchange(CDataExchange *pDX) override;    // поддержка DDX/DDV
		void AFXAPI     DDX_OctText(CDataExchange *pDX, int nIDC, int &value);
		void AFXAPI     DDV_MyMinMaxInt(CDataExchange *pDX, int nIDC, int value, int minVal, int maxVal);
		// Созданные функции схемы сообщений
		LRESULT         OnDumpAddressChange(WPARAM wParam, LPARAM);
		LRESULT         OnDumpAddressUpdate(WPARAM, LPARAM);
		afx_msg LRESULT HandleInitDialog(WPARAM wp, LPARAM lp);
		afx_msg void    OnSetFocus(CWnd *pOldWnd);
		afx_msg void    OnBnClickedButtonDumpMode();
		afx_msg void    OnBnClickedButtonSaveDump();
		afx_msg void    OnBnClickedButtonLoadDump();
		afx_msg void    OnUpdateButton(CCmdUI *pCmdUI);
		afx_msg void    OnCbnSelchangeComboMdWindows();
		afx_msg void    OnCbnSelchangeComboMdWindaddr();
		afx_msg void    OnEnChangeEditMdAzseg();
		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 CBaseDialog
{
		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 CBaseDialog
{
		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()

};

