/*
 *	WEngine by eMan
 *  WWW : www.eman.wz.cz
 *  PATH : .\SDK\WCode\App\CBaseWin.cpp
 */

#include "stdafx.h"
#include "CBaseWin.h"
#include "../Config/CConfig.h"

static int number_win_win=0;
C_CONFIG_0 winConfig("eng_config.cfi"); //config.txt

//////////////////////////////////////////////////////////////////////////
// CONSTRUKTOR - bezparametricky konstruktor
//////////////////////////////////////////////////////////////////////////
C_BASE_WIN_0::C_BASE_WIN_0()
{
	Init();
	Create();
}

C_BASE_WIN_0::C_BASE_WIN_0(const char *cTitle,const char * cWnd)
{
	Init();
	Create(cTitle,cWnd);
}

//////////////////////////////////////////////////////////////////////////
// CONSTRUKTOR - ukazatel na fce(WndProc), titulek v okne, lpszClassName
//////////////////////////////////////////////////////////////////////////
C_BASE_WIN_0::C_BASE_WIN_0(pToWndProc p,const char *cTitle,const char * cWnd)
{
	Init();
	_pWndProc = p;
	Create(cTitle,cWnd);
}

//////////////////////////////////////////////////////////////////////////
// DESTRUKTOR - destruktor
//////////////////////////////////////////////////////////////////////////
C_BASE_WIN_0::~C_BASE_WIN_0()
{
	
}

//////////////////////////////////////////////////////////////////////////
// INIT - pred praci s tridou musi byt spusten,implicitne je v konstruk.
//////////////////////////////////////////////////////////////////////////
void C_BASE_WIN_0::Init()
{
	_pWndProc = WndProc;
	RECT r = {0,0,320,240};
	// LOAD CONFIG - predelat
		if(winConfig.LoadFile())
		{
			winConfig.LoadInteger("WIN_APP","rectL",(int&)r.left);
			winConfig.LoadInteger("WIN_APP","rectT",(int&)r.top);
			winConfig.LoadInteger("WIN_APP","rectR",(int&)r.right);
			winConfig.LoadInteger("WIN_APP","rectB",(int&)r.bottom);
		}else
		{
			// Error
			cError.ErrorMsg(0,true,true,"Nemuzu nacist configuracni soubor");
		}
	// END
	SetRect(r);

	this->SetNameP("Engine Base Code by eMan");
	this->SetNamePZ("z Z z");
	this->SetNamePL("Loading............");
}

//////////////////////////////////////////////////////////////////////////
// CREATE - vytvori WndClass ale nezaregistruje !!
//////////////////////////////////////////////////////////////////////////
int C_BASE_WIN_0::Create(const char *cTitle,const char * cWndName)
{
	if(number_win_win >= MAX_WINDOW_WIN) return 1;
	if(cTitle) SetNameP(cTitle);
	std::string nc;

	if(!cWndName)
	{ 
		char temp[255];
		sprintf(temp,"win_%d",number_win_win);
		nc = temp; 
	}else
	{
		nc = cWndName;
	}
	WNDCLASS wndclass;
	// WndClass Deklaration
	wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
	wndclass.lpfnWndProc   = (WNDPROC)_pWndProc;
	wndclass.cbClsExtra    = 0 ;
	wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = GetModuleHandle(NULL);
	wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
	wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
	wndclass.lpszMenuName  = NULL ;
	wndclass.lpszClassName = (LPTSTR)nc.c_str();
	this->SetWndClass(wndclass);
	this->SetNameClass(nc);
	this->SetBoolDis(false);
	this->InkNumWin();
	number_win_win++;
	return 0;
}

//////////////////////////////////////////////////////////////////////////
// WNDPROC - pokud uzivatel nezada vlastni WndProc,bude pouzita tato
//////////////////////////////////////////////////////////////////////////
LONG C_BASE_WIN_0::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{   
	HDC         hdc ;
	PAINTSTRUCT ps ;
	RECT        rect ; 
	
	C_BASE_0* pBase = g_MapMsg_win.GetPWnd(hWnd);
     
     switch (uMsg)
     {
     case WM_CREATE:
          
          return 0 ;    
		  
	case WM_LBUTTONDOWN:
		
		MessageBox(0,"",pBase->GetNameClass().c_str(),0);
			
		return 0;
     case WM_PAINT:
          hdc = BeginPaint (hWnd, &ps) ;
          
          GetClientRect (hWnd, &rect) ;
          
          DrawText (hdc, TEXT ("eMan Engine ver. 1.0.0.0"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
          
          EndPaint (hWnd, &ps) ;
          return 0 ;
          
     case WM_DESTROY:
           //PostQuitMessage(0);
          return 0 ;
     }
     return DefWindowProc (hWnd, uMsg, wParam, lParam) ;
}
//////////////////////////////////////////////////////////////////////////
// REGISTER - Zaregistruje tridu
//////////////////////////////////////////////////////////////////////////
bool C_BASE_WIN_0::Register()
{
	WNDCLASS w =GetWndClass();
	HINSTANCE hInstance =  w.hInstance;
	
	RECT rect = GetRect();
	std::string name_class = GetNameClass();
	std::string zahlavi = GetNameP();
	if (!RegisterClass (&GetWndClass()))
	{
		//MessageBox (NULL, TEXT ("Nepodařilo se zaregistrovat třídu"),name_class.c_str(), MB_ICONERROR);
		cError.ErrorMsg(ERROR_REGISTRED, true, true, name_class.c_str(), "Nepodařilo se zaregistrovat třídu");
		return FALSE;
	}
    HWND hwnd = CreateWindow (name_class.c_str(),                  // název třídy okna
                          zahlavi.c_str(),			// záhlaví okna
                          WS_OVERLAPPEDWINDOW,        // styl okna
                          rect.left,              // výchozí poloha x
                          rect.top,              // výchozé poloha y
                          rect.right,              // výchozí velikost x
                          rect.bottom,              // výchozí velikost y
                          NULL,                       // handle rodičovského okna
                          NULL,                       // handle nabídky okna
                          hInstance,                  // handle instance programu
                          0) ;                     // parametry pro vytvoření
	
	 ShowWindow(hwnd,1);
	 UpdateWindow(hwnd);
	 this->SetHwnd(hwnd);
	 g_MapMsg_win.Register(this);	 	
	 return TRUE;
}
