#include <windows.h>
#include "cstringtable.h"
#include <richedit.h>

#ifndef __DATALOGWINDOWCLASS
#define __DATALOGWINDOWCLASS

#define DATALOGWINDOW_COLORIZE_PASTE		1	//pri kopirovani clipboardu
#define DATALOGWINDOW_COLORIZE_ENTER		2	//pri stlacenom enteri
#define DATALOGWINDOW_COLORIZE_LINE			3	//aktualny riadok
#define DATALOGWINDOW_COLORIZE_SELECTION	4	//selekntutu cast
#define DATALOGWINDOW_COLORIZE_ALL			5	//vsetko

#define	DATALOGWINDOW_FONT_SIZE				15

class CDatalogWindow
{
	private:
		CStringTable *idbAtoms;//po kompilacii sa poslu atomy (pre hilighting)
		WNDPROC oldWindowProc;
		HWND hwnd;

		bool contentChanged;//zmena obsahu od posledneho ulozenia/nacitania?

		char *fileName;//meno editovaneho suboru
		int fileNameOfs;//ofset na meno suboru (fileName je aj s cestou)

		void wmKEYUP(int key);
		bool wmKEYDOWN(int key);//ak TRUE, treba zavolat oldWindowProc
		//void wmCHAR(char c);
		//bool wmLBUTTONDOWN();

		void* ReadInput(DWORD *sz);//vrati alokovanu pamat pre data z EDITu; treba ju potom uvolnit, velkost pamate ulozi do *sz
		void Colorize(DWORD flag);
		bool ctrlFlag;//v predchadzajucom volani wmKEYUP bol stlaceny ctrl
		bool stopNotify;//neposielaj notifikaciu pri zmene (interne zmeny)
		bool lessOperator;//kvoli detekcii <- = true, ak predchadzajuci nacitany znak bol <
		DWORD indexBeforePaste;//pri kopirovani z clipboardu si pamatam index na riadok, do ktoreho som 'pastoval'
		DWORD notifyAction;//pri wmNOTIFY sa vykona dana akcia
		HFONT hFont;
		CHARRANGE selChr;//pri seleknuti si zapamataj, co sa selektovalo, aby sa to pri deselektnuti prekreslilo
		DWORD GetFontHeight(DWORD size);
		//static DWORD WINAPI ColorizeAll(CDatalogWindow *_this);

	public:
		CDatalogWindow(HWND parent);
		~CDatalogWindow();

		void Evaluate();
		void DoResize();
		void ShowWindow(bool show);
		void wmNOTIFYfromParent(NMHDR*nmh);
		void wmCOMMANDfromParent(WPARAM wp);
		void Colorize();//prefarbi cely obsah okna, EDB atomy sa beru z nacitanej databazovej struktury a atomy zo SetIDBAtoms
		void ColorizeIDBAtoms();//znova prejde vstup a urci IDB atomy, ktore oznaci. EDB atomy sa beru z nacitaj struktury (nie na novo)
		void SetIDBAtoms(CStringTable *idbAtoms2Copy);
		HWND GetHandle();
		DWORD GetNumOfLines();
		bool Close();

		bool SaveToFile();//ulozi obsah okna do textoveho suboru
		void SaveToFileAs();//ulozi obsah okna do textoveho suboru
		void LoadFromFile();//nacita ..
		void NewFile();

		void RefreshFont();//nastavi znova velkost a typ pisma

		LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);
		static LRESULT CALLBACK StaticWindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);
};

#endif