#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;
		//$BLG: v4.6a7 - Add
		virtual int					TopMost(int lvl, int fcs)=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();
		//$BLG: v4.6a7 - Add
		int							TopMost(int lvl, int fcs);
		
		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 cparent,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_