// C16KPageView.cpp: файл реализации
//

#include "stdafx.h"
#include "BK.h"
#include "16KPageView.h"
#include "SprWnd.h"
#include "Screen.h"
#include "Globals.h"

// C16KPageView

IMPLEMENT_DYNAMIC(C16KPageView, CWnd)

C16KPageView::C16KPageView(BYTE *buffer, size_t size, unsigned int num, const CString &strName)
	: m_pBuffer(buffer)
	, m_nBufSize(size)
	, m_nPageNum(num)
	, m_strScrName(strName)
	, m_bmCB(NULL)
	, m_bmBW(NULL)
	, m_bmSpr(NULL)
{
	m_pSprScr = new CScreen(g_Config.m_nScreenRenderType, m_pBuffer, m_nBufSize);

	if (m_pSprScr)
	{
		m_bColorMode = m_pSprScr->IsColorMode();
		m_bBWAdaptMode = m_pSprScr->IsAdaptMode();
	}
}

C16KPageView::~C16KPageView()
{
	SAFE_DELETE_OBJECT(m_bmCB);
	SAFE_DELETE_OBJECT(m_bmBW);
	SAFE_DELETE_OBJECT(m_bmSpr);
	SAFE_DELETE(m_pSprScr);
}

BEGIN_MESSAGE_MAP(C16KPageView, CWnd)
	ON_WM_CREATE()
	ON_COMMAND_RANGE(ID_BUTTON_16KPV_COLOR_MODE, ID_BUTTON_16KPV_COLOR_MODE_END, &OnViewColormode)
	ON_COMMAND_RANGE(ID_BUTTON_16KPV_BW_MODE, ID_BUTTON_16KPV_BW_MODE_END, &OnViewBWMode)
	ON_COMMAND_RANGE(ID_BUTTON_16KPV_SPRITE, ID_BUTTON_16KPV_SPRITE_END, &OnViewSprite)
	ON_WM_DESTROY()
END_MESSAGE_MAP()


// обработчики сообщений C16KPageView


int C16KPageView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == - 1)
	{
		return -1;
	}

	m_bmCB = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_COLOR_MODE_BTN));
	m_bmBW = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_BW_MODE_BTN));
	m_bmSpr = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP_SPRITE_BTN));
	CRect rect;
	GetWindowRect(rect);
	int x = rect.left;
	int y = rect.top;
	MoveWindow(x, y, x + SCREEN_WIDTH + VW16K_BUTTONPAD_WIDTH, SCREEN_HEIGHT + VW16K_BUTTON_SPACE, FALSE);
	//смастрячим кнопку смены цветного режима
	rect = CRect(SCREEN_WIDTH + VW16K_BUTTON_X, VW16K_BUTTON_Y, VW16K_BUTTON_WIDTH + SCREEN_WIDTH + VW16K_BUTTON_X, VW16K_BUTTON_HEIGHT + VW16K_BUTTON_Y);
	m_btnColorMode.Create(NULL,
	                      WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_CENTER,
	                      rect,
	                      this,
	                      ID_BUTTON_16KPV_COLOR_MODE + m_nPageNum
	                     );

	if (m_bmCB)
	{
		m_btnColorMode.SetBitmap(m_bmCB);
	}

	//смастрячим кнопку смены ЧБ режима
	rect.top += rect.bottom + VW16K_BUTTON_SPACE;
	rect.bottom = rect.top + VW16K_BUTTON_HEIGHT;
	m_btnBWMode.Create(NULL,
	                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_CENTER,
	                   rect,
	                   this,
	                   ID_BUTTON_16KPV_BW_MODE + m_nPageNum
	                  );

	if (m_bmBW)
	{
		m_btnBWMode.SetBitmap(m_bmBW);
	}

	//смастрячим кнопку открытия окошка спрайтового вида
	rect.bottom = SCREEN_HEIGHT - VW16K_BUTTON_Y;
	rect.top = rect.bottom - VW16K_BUTTON_HEIGHT;
	m_btnSprite.Create(NULL,
	                   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP | BS_CENTER,
	                   rect,
	                   this,
	                   ID_BUTTON_16KPV_SPRITE + m_nPageNum
	                  );

	if (m_bmSpr)
	{
		m_btnSprite.SetBitmap(m_bmSpr);
	}

	if (m_pSprScr)
	{
		//размеры - константа 512х256
		if (!m_pSprScr->Create(NULL, _T("BKScreen_") + m_strScrName,
		                       WS_VISIBLE | WS_CHILD,
		                       CRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT),
		                       this, 0)
		   )
		{
			TRACE(_T("Не удалось создать экран ") + m_strScrName + _T("\n"));
			return -1; // не удалось создать
		}
	}
	else
	{
		TRACE(_T("Недостаточно памяти для создания ") + m_strScrName + _T("\n"));
		return -1; // не удалось создать
	}

	m_btnBWMode.EnableWindow(!m_bColorMode);
	return 0;
}

void C16KPageView::Draw16KView()
{
	m_pSprScr->ReDrawScreen();
}

void C16KPageView::OnViewColormode(UINT id)
{
	if (id == ID_BUTTON_16KPV_COLOR_MODE + m_nPageNum)
	{
		m_bColorMode = !m_bColorMode;
		m_pSprScr->SetColorMode(m_bColorMode);
		m_btnBWMode.EnableWindow(!m_bColorMode);
	}
}

void C16KPageView::OnViewBWMode(UINT id)
{
	if (id == ID_BUTTON_16KPV_BW_MODE + m_nPageNum)
	{
		m_bBWAdaptMode = !m_bBWAdaptMode;
		m_pSprScr->SetAdaptMode(m_bBWAdaptMode);
	}
}

void C16KPageView::OnViewSprite(UINT id)
{
	if (id == ID_BUTTON_16KPV_SPRITE + m_nPageNum)
	{
		CSprWnd *m_pSprWnd = new CSprWnd(m_pBuffer, m_nBufSize); //обязательно создавать динамически.

		if (m_pSprWnd)
		{
			WNDCLASS wc;
			memset(&wc, 0, sizeof(wc));
			wc.style = CS_HREDRAW | CS_VREDRAW;
			wc.hInstance = AfxGetInstanceHandle();
			wc.lpfnWndProc = ::DefWindowProc;
			wc.lpszClassName = _T("MySprClass");
			wc.hbrBackground = (HBRUSH)::GetStockObject(GRAY_BRUSH);
			AfxRegisterClass(&wc);

			if (m_pSprWnd->Create(
			            _T("MySprClass"), //Имя класса виндовс
			            _T("SpriteView: ") + m_strScrName, //имя окна
			            WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, // window styles
			            CRect(0, 0, 200, 200), //размер окна
			            theApp.GetMainWnd(), //родитель окна
			            0,
			            WS_EX_TOOLWINDOW /*| WS_EX_OVERLAPPEDWINDOW*/ //extended window styles
			        ))
			{
				m_pSprWnd->ShowWindow(SW_SHOW);
			}
		}
	}
}

void C16KPageView::OnDestroy()
{
	SAFE_DELETE_OBJECT(m_bmCB);
	SAFE_DELETE_OBJECT(m_bmBW);
	SAFE_DELETE_OBJECT(m_bmSpr);
	m_pSprScr->DestroyWindow();
	SAFE_DELETE(m_pSprScr);
	CWnd::OnDestroy();
}
