
// SpeechControlDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SpeechControl.h"
#include "SpeechControlDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define WM_RECOEVENT    WM_APP 

CSpeechControlDlg::CSpeechControlDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CSpeechControlDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	speechCommanding = new SpeechCommanding(IDC_EDIT1);
	
}

void CSpeechControlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSpeechControlDlg, CDialogEx)
	ON_WM_PAINT()
	ON_MESSAGE(WM_RECOEVENT, RecoEvent)
	ON_WM_QUERYDRAGICON()

	ON_WM_SYSCOMMAND()
END_MESSAGE_MAP()

BOOL CSpeechControlDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
	CoInitialize(NULL);
	speechCommanding->initializeDialog(this->m_hWnd);

	//Prostokat picture control.
	RECT rect;

	//Wpisujemy do zmiennej rect informacje o dodanym do okna picture control.
	GetDlgItem(IDC_GLWINDOW)->GetWindowRect(&rect);

	//Konwersja wspolrzednych okna na wspolrzedne klienta.
	ScreenToClient(&rect);

	//Stworzenie w naszym picture control okna OpenGL.
	openGLWindow.createOpenGL(rect, this);

	//Ustawienie timera na renderowanie.
	openGLWindow.timer = openGLWindow.SetTimer(1, 1, 0);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSpeechControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	CDialog::OnSysCommand(nID, lParam);
}

void CSpeechControlDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CSpeechControlDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

//Metoda obslugujaca zdarzenie rozpoznania mowy.
LRESULT CSpeechControlDlg::RecoEvent(WPARAM w, LPARAM l)
{
	//String zawierajacy tekst do wyswietlenia w oknie pomocy.
	LPCTSTR string = "Command list:\n1. Pan left\n2. Pan right\n3. Pan up\n4. Pan down\n5. Rotate left\n6. Rotate right\n7. Rotate up\n8. Rotate down\n9. Zoom in\n10. Zoom out\n11. Help\n12. Exit\n13. Load file\n\nYou can also add \"please\"\nafter any of these commands.";
	//Pobranie numeru rozpoznanej frazy.
	int res = speechCommanding->processRecognitionEvent();
	//Wykonanie akcji w zaleznosci od numeru frazy.
	switch (res)
	{
		case 1:
			//Przesuniece obiektu w lewo.
			openGLWindow.xPosition -= (float)0.05f * 10;
			break;
		case 2:
			//Przesuniecie obiektu w prawo.
			openGLWindow.xPosition += (float)0.05f * 10;
			break;
		case 3:
			//Przesuniecie obiektu w gore.
			openGLWindow.yPosition += (float)0.05f * 10;
			break;
		case 4:
			//Przesuniecie obiektu w dol.
			openGLWindow.yPosition -= (float)0.05f * 10;
			break;
		case 5:
			//Zamkniecie okna po uprzednim zwolnieniu list.
			openGLWindow.list.clear();
			openGLWindow.ver.clear();
			openGLWindow.vertexNormals.clear();
			openGLWindow.faces.clear();
			this->EndDialog(0);
			break;
		case 6:
			//Obrot obiektu w lewo.
			openGLWindow.yRotation -= 5;
			//Jesli kat jest mniejszy od -360 lub wiekszy od 360, to go zerujemy.
			if ((openGLWindow.yRotation > 360.0f) || (openGLWindow.yRotation < -360.0f))
			{
				openGLWindow.yRotation = 0.0f;
			}
			break;
		case 7:
			//Obrot obiektu w prawo.
			openGLWindow.yRotation += 5;
			//Jesli kat jest mniejszy od -360 lub wiekszy od 360, to go zerujemy.
			if ((openGLWindow.yRotation > 360.0f) || (openGLWindow.yRotation < -360.0f))
			{
				openGLWindow.yRotation = 0.0f;
			}
			break;
		case 8:
			//Obrot obiektu w gore.
			openGLWindow.xRotation -= 5;
			//Jesli kat jest mniejszy od -360 lub wiekszy od 360, to go zerujemy.
			if ((openGLWindow.xRotation > 360.0f) || (openGLWindow.xRotation < -360.0f))
			{
				openGLWindow.xRotation = 0.0f;
			}
			break;
		case 9:
			//Obrot obiektu w dol.
			openGLWindow.xRotation += 5;
			//Jesli kat jest mniejszy od -360 lub wiekszy od 360, to go zerujemy.
			if ((openGLWindow.xRotation > 360.0f) || (openGLWindow.xRotation < -360.0f))
			{
				openGLWindow.xRotation = 0.0f;
			}
			break;
		case 10:
			//Przyblizenie obiektu.
			openGLWindow.zoomScaling -= 1;
			break;
		case 11:
			//Oddalenie obiektu.
			openGLWindow.zoomScaling += 1;
			break;
		case 12:
			//Wyswietlenie okienka z lista komend.
			MessageBox(string, "Command list", MB_OK);
			break;
		case 13:
			//Otwarcie okna wczytywania pliku.
			CFileDialog fileDialog(TRUE, "*.*", NULL, OFN_HIDEREADONLY, "Obj Files: (*.obj)|*.obj|"); 
			if (fileDialog.DoModal() == IDOK)
			{
				//Pobranie sciezki do pliku.
				CString pathName = fileDialog.GetPathName();
				char *ptr = 0;
				ptr = pathName.GetBuffer(pathName.GetLength());	   
				pathName.ReleaseBuffer();

				//Wyzerowanie punktow skrajnych.
				openGLWindow.maxX = 0;
				openGLWindow.minX = 0;
				openGLWindow.maxY = 0;
				openGLWindow.minY = 0;
				openGLWindow.maxZ = 0;
				openGLWindow.minZ = 0;

				//Jesli wczesniej cos zostalo wczytane, to zerujemy listu.
				if (openGLWindow.ver.size() != 0)
				{
					openGLWindow.ver.clear();
					openGLWindow.faces.clear();
					openGLWindow.vertexNormals.clear();
				}

				//Wlasciwe czytanie z pliku.
				openGLWindow.ver = openGLWindow.loadFromFile(ptr);
				//Przygotowanie obiektu po wczytaniu.
				openGLWindow.prepareLoadedFile();
			}
			break;
	}
	openGLWindow.OnDraw(NULL);
	return 0;
}

