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

#include "stdafx.h"
#include "OscillatorView.h"
#include "BKErrMsgSys.h"
#include "Config.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

// COscillatorlView

IMPLEMENT_DYNAMIC(COscillatorlView, CDockablePane)

COscillatorlView::COscillatorlView()
	: m_pBKOSC(nullptr)
	, m_nRenderType(-1)
{
}

COscillatorlView::~COscillatorlView()
{
}

BEGIN_MESSAGE_MAP(COscillatorlView, CDockablePane)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_DESTROY()
END_MESSAGE_MAP()


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

int COscillatorlView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDockablePane::OnCreate(lpCreateStruct) == -1)
	{
		return -1;
	}

	int ret = CreateOSC();

	if (ret == -1)
	{
		return ret;
	}
	else if (ret == 0)
	{
		CBKMessageBox(g_pstrErrors[BK_ERROR_NOCBKOSCSCRCREATE]);
		return -1;
	}

	return 0;
}

void COscillatorlView::OnSize(UINT nType, int cx, int cy)
{
	CDockablePane::OnSize(nType, cx, cy);
	AdjustLayout();
}

void COscillatorlView::AdjustLayout()
{
	if (GetSafeHwnd() == nullptr)
	{
		return;
	}

	CDockablePane::AdjustLayout();

	CRect rectClient;
	GetClientRect(rectClient);

	if (m_pBKOSC)
	{
		m_pBKOSC->SetWindowPos(nullptr, rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
	}
}

BOOL COscillatorlView::OnEraseBkgnd(CDC *pDC)
{
	return TRUE; //CDockablePane::OnEraseBkgnd(pDC);
}

void COscillatorlView::OnPaint()
{
	CPaintDC dc(this); //хоть эта штука и не используется в функции, но если её закомментировать, перерисовка перестанет работать.
	// Не вызывать CDockablePane::OnPaint() для сообщений рисования

	if (IsVisible())
	{
		if (m_pBKOSC)
		{
			m_pBKOSC->RedrawWindow();
		}
	}
}

//пересоздание объекта m_pBKOSC
bool COscillatorlView::ReCreateOSC()
{
	if (m_nRenderType != g_Config.m_nOscRenderType)
	{
		DeleteOSC();

		if (CreateOSC() == 1)
		{
			return true;
		}

		return false;
	}

	return true;
}

void COscillatorlView::DeleteOSC()
{
	if (m_pBKOSC)
	{
		m_pBKOSC->DestroyWindow();
		delete m_pBKOSC;
		m_pBKOSC = nullptr;
		m_nRenderType = -1;
	}
}


int COscillatorlView::CreateOSC()
{
	if (!m_pBKOSC)
	{
		m_nRenderType = -1;
		CRect rect;
		GetWindowRect(&rect);
		m_pBKOSC = new CBKOscScr(g_Config.m_nOscRenderType);

		if (m_pBKOSC)
		{
			if (!m_pBKOSC->Create(nullptr, _T("Oscillator"), WS_VISIBLE | WS_CHILD, CRect(0, 0, rect.Width(), rect.Height()), this, 0))
			{
				CBKMessageBox(g_pstrErrors[BK_ERROR_NOCBKOSCSCRINIT]);
				TRACE0("Не удалось создать объект Oscillator\n");
				return -1;      // не удалось создать
			}

			m_nRenderType = g_Config.m_nOscRenderType;
			AdjustLayout();
			return 1;
		}
		else
		{
			CBKMessageBox(g_pstrErrors[BK_ERROR_NOTENMEMR], MB_OK);
		}
	}

	return 0;
}


void COscillatorlView::OnDestroy()
{
	DeleteOSC();
	CDockablePane::OnDestroy();
}
