#ifndef _WINDOW_H_
#define _WINDOW_H_

#include "../x/Version.h"
#include "../x/scolplugin.h"
#include "../x/Objstr.h"

#include "Rect.h"
#include "CObjBufferWindows.h"




class Window
{
protected:
	int							Wx;
	int							Wy;
	int							WxSize;
	int							WySize;
	int							WFlags;
	void						ReplaceFlags(int,int);
public:

	//$LB (16/12/2003)
	PtrObjWindow        parent;
	
	//constructeur-destructeur de fenetre
	Window(int x,int y,int w,int h,int flags,char *name);
	virtual ~Window();
	
	// construction d'une fenetre
	// dans la pile avant _channel winparent x y w h flags name
	// dans la pile apres _channel win
	virtual int					ConstructWindow()=0;
	// destruction de la fenetre
	virtual int					DestructWindow(int p)=0;
	virtual int					SetReflexes()=0;

	// le blit
	virtual Rect2D				GetUpdatableRect()=0;
	virtual int					BlitBuffer(CObjBufferWindows* CoBuffer, int buf,int typeblit,
										   int dx,int dy,int dw,int dh,int sx,int sy
										   )=0;
	
	// modification du status de la fenetre
	int							UpdateSate(int);
	
	// les differentes methodes de la fenetre
	virtual int					Move(int x,int y)=0;
	virtual int					Size(int x,int y,int w,int h,int ext)=0;
	virtual int					SetName(char *)=0;
	virtual int					Show(int newstate=-1)=0;
	virtual int					Top()=0;
	virtual int					Enable(int val)=0;
	virtual int					SetFocus()=0;
	virtual int					GetSize(int *x,int *y,int *w,int *h,int ext)=0;

	// fonctions de gestions du curseur
	virtual int					CrCursor(const char *)=0;
	virtual int					DsCursor(int Cursor)=0;
	virtual int					ChangeCursor(int Cursor)=0;

	
	// fonctions diverses
	//renvoie l'etat de la fenetre
	virtual int					GetWindowState()=0;
	//renvoie la position du curseur par rapport au client
	virtual Point2D				GetCursorPosClient()=0;
	//renvoie la position du curseur par rapport à l'ecran
	virtual Point2D				GetCursorPosScreen()=0;
	//renvoie le rectangle de la zone client dans le referentiel scrren
	virtual Rect2D				GetClientInScreen()=0;
	// renvoie 1 si le point donné dans la fenetre, 0 sinon (si la fenetre est caché renvoie 0)
	virtual int					IsPointInWindow(Point2D)=0;
	// copie une chaine de charactere dans le presse papier
	virtual int					CopyToClipBoard(char *txt)=0;
	// recupere une chaine de charactere dans le presse papier
	virtual char				*GetFromClipBoard()=0;
};

#ifdef SCOL	// fenetre scol avec traitement externe des evenements
	
class WindowScol:public Window
{
protected:
	int Wid; // identificateur de la fenetre

	// Renvoie le pointeur Magma de la fenetre
	int					RetrieveMWin();
public:

	//constructeur-destructeur pour une fenetre Scol
						WindowScol(int parent,int x,int y,int w,int h,int flags,char *name);
	virtual				~WindowScol();

	virtual int			ConstructWindow();
	virtual int			DestructWindow(int p);
	int					SetReflexes();

	// le blit
	virtual int			BlitBuffer(CObjBufferWindows*,int,int,int,int,int,int,int,int)=0;
	virtual Rect2D		GetUpdatableRect()=0;
	
	
	// les differentes methodes de la fenetre
	int					Move(int x,int y);
	int					Size(int x,int y,int w,int h,int ext);
	int					SetName(char *name);
	int					Top();
	int					Enable(int val);
	int					SetFocus();
	int					GetSize(int *x,int *y,int *w,int *h,int ext);
	virtual int			Show(int newstate);
	
	// fonctions de gestions du curseur
	virtual int			CrCursor(const char *);
	virtual int			DsCursor(int Cursor);
	virtual int			ChangeCursor(int Cursor);
	
	virtual int			GetWindowState()=0;
	virtual Point2D		GetCursorPosClient()=0;
	virtual Point2D		GetCursorPosScreen()=0;
	virtual Rect2D		GetClientInScreen()=0;
	virtual int			IsPointInWindow(Point2D)=0;
	virtual int			CopyToClipBoard(char *txt)=0;
	virtual char		*GetFromClipBoard()=0;
};


class WindowScolWin:public WindowScol
{
private:
	// specific windows
	HWND				Whwnd;


public:
	
						WindowScolWin(mmachine m, int parent,int x,int y,int w,int h,int flags,char *name);
	virtual				~WindowScolWin();

	int					ConstructWindow();
	
	int					Show(int newstate);

	// le blit
	int					BlitBuffer(CObjBufferWindows*,int,int,int,int,int,int,int,int);
	//$LB (16/12/2003)
	int                 TransparentBlitBuffer (CObjBufferWindows*,int,int,int,int,int,int,int);

	Rect2D				GetUpdatableRect();
	
	// fonctions de gestions du curseur
	int					CrCursor(const char *);
	int					DsCursor(int Cursor);
	int					ChangeCursor(int Cursor);

	// fonctions diverses
	int					GetWindowState();
	Point2D				GetCursorPosClient();
	Point2D				GetCursorPosScreen();
	Rect2D				GetClientInScreen();
	int					IsPointInWindow(Point2D);
	int					CopyToClipBoard(char *txt);
	char				*GetFromClipBoard();
};





#else		// fenetre non scol avec traitement interne des evenements

#endif//SCOL



#endif //_WINDOW_H_