// Copyright (C) 2003-2008 Dolphin Project.

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License 2.0 for more details.

// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/

// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/

#pragma once

#include "Globals.h"

#include <map>
#include "DisAsmListView.h"

class CRegisterDlg
	: public CDialogImpl<CRegisterDlg>, public CUpdateUI<CRegisterDlg>
{
	public:

		CRegisterDlg();

		enum { IDD = IDD_REGISTERDLG };

		virtual BOOL PreTranslateMessage(MSG* pMsg);
		virtual BOOL OnIdle();


		BEGIN_UPDATE_UI_MAP(CRegisterDlg)
		END_UPDATE_UI_MAP()

		BEGIN_MSG_MAP(CRegisterDlg)
		MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
		NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)

// 		COMMAND_ID_HANDLER(ID_STEP, OnStep)
// 		COMMAND_ID_HANDLER(ID_GO, OnGo)
// 		COMMAND_ID_HANDLER(ID_SHOW_REGISTER, OnShowRegisters)
		END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

		LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/);
		LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL & /*bHandled*/);
		LRESULT OnCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& _bHandled);


//	LRESULT OnStep(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
//	LRESULT OnGo(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
//	LRESULT OnShowRegisters(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);

		void CloseDialog(int nVal);

		void UpdateRegisterListView();


	private:

		CListViewCtrl m_RegisterListViewCtrl;

		static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);


		uint64 m_CachedCounter;
		uint16 m_CachedRegs[32];
		bool m_CachedRegHasChanged[32];
};
