#ifndef _COBJECTEDITTEXT_H_
#define _COBJECTEDITTEXT_H_
#include "CObjectText.h"
#include "CObjMessage.h"				//pour la classe CObjMessage

class CObjectEditText:public CObjectText
{
private:
	// les differents indexes pour la memorisation des sous-lignes
	// et lignes courantes
	unsigned int EDTFirstSubLine;			// premiere ligne au dessus du curseur
	unsigned int EDTCurrentSubLine;			// ligne courante
	unsigned int EDTCurrentIndex;			// indice courant

	unsigned int EDTBeginSubLineSelect;		// ligne du debut de selection
	unsigned int EDTBeginSelectIndex;		// indice du debut de selection
	
	unsigned int EDTnbCharVisible;			// nombre de characteres visibles dans la sous-ligne precedente

	// les differents indexes pour la memorisation des sous-colonnes (Attention :on raisonne en pixels
	int			 EDTCurrentHorizontalIndex;	// indice courant de la premiere sous-colonne
	
	// Le curseur
	Layer		*EDTlayerCursor;
	int			 EDTcursorPosX;				// position en X du curseur
	int			 EDTcursorPosY;				// position en Y du curesur
	int			 EDTcursorVisible;			// curesur visible ou pas
	int			 EDTcursorPreviousPosX;		// position du curseur en debut de selection
	int			 EDTlayerCursorColor;		// couleur du curseur
	int			 EDTlayerCursorSize;		// taille en hauteur du curseur
	int			 EDTlayerCursorCoeffTransp;	// coefficient de transdparence du curseur

	static int	 EDTnbEdit;
	static int	 EDTibeamCursor;
	int			 EDTpreviousCursor;
	
	// Le Timer pour le clignotement du curseur
	int			 EDTtimerCursorID;
	
	// Le Timer pour le scroll automatique
	int			 EDTtimerScrollID;
	int			 EDTtimerScrollDir;

	// Le Layer de Selection
	Layer		*EDTlayerSelect;
	int			 EDTselectColor;
	int			 EDTselectCoeff;
	int			 EDTselect;

	// Efface la zone de selection
	int RemoveSelectedZone(int FirstIndex,int LastIndex,int execwordwrap);

		// cree le layerCursor
	void CreateLayerCursor(int color,int size);
	
	// Initialise le layerCursor
	void InitLayerCursor(int color,int size,int coefftransp);

	// Evalue les coordonées du curseur
	void EvalCursorPosition(int p_font);

	// Evalue le buffer de selection
	void EvalSelectedZone(int p_font);
	
	// Evalue la coordonée x dans le referentiel visible
	int EvalPositionInHref(unsigned int index,unsigned int subline);
	
	// Evalue la coordonée y dans le referentiel visible
	int EvalPositionInVref(unsigned int firstsubline,unsigned int subline);
	
	// Evalue l'index de la sous ligne
	int SearchSubLine(int y,int FirstSubLine);

	// Renvoie l'index du curseur en fonction de sa coordonée
	int SearchIndex(int x,int SubLine,int p_font);
	
	// methodes de nettoyages du ctrl texte
	void EdtClearText(int p_tab,int always);	// nettoyage du texte
	
	// le copier-coller dans le presse papier
	int  CopyToClipboard();
	int  PasteFromClipboard(int p_tab);

	// centre l'edit texte sur le curseur
	int CenterOnCursor(int suppress,int p_tab);

	// renvoie 1 si le curseur est visible dans le referentiel courant
	// 0 sinon
	int CursorIsVisible();
	
	// les deux fonctions relatives au Scroll automatique
	void StartScroll(int dir);
	void StopScroll(int dir);
	int	 IsScroll(int dir);

	//  execution des reflexes
	int ExecuteReflexeChange(int redrawobject);
	int ExecuteReflexeValidation(int type,int redrawobject);

protected:
	
	//-----------------------------------------------------------
	// le curseur
	//-----------------------------------------------------------
	// affiche le curseur I
	virtual void ChangeCursorToBeam();
	// affiche l'ancien curseur
	virtual void RetrieveDefaultCursor();
	
	//-----------------------------------------------------------
	// les differentes fonctions relatives au evenements clavier
	//-----------------------------------------------------------

	// select all text
	virtual int KeySelectAll(int p_tab);
	// copy
	virtual int KeyCopy(int p_tab);
	// cut
	virtual int KeyCut(int p_tab);
	// paste
	virtual int KeyPaste(int p_tab);
	// home
	virtual int KeyHome(int p_tab);
	//end
	virtual int KeyEnd(int p_tab);
	//insert
	virtual int KeyInsert(int p_tab);
	//arrow left
	virtual int KeyArrowLeft(int p_tab);
	//arrow right
	virtual int KeyArrowRight(int p_tab);
	//arrow up
	virtual int KeyArrowUp(int p_tab);
	//arrow down
	virtual int KeyArrowDown(int p_tab);
	//delete
	virtual int KeySuppress(int p_tab);
	//suppres
	virtual int KeyBackspace(int p_tab);
	//all other
	virtual int KeyChar(UINT vk,int p_tab);
	// execution d'un reflexe suite au traitementd'une touche
	virtual void EndKey(int type);



public:
	// Constructeur-Destructeur
	CObjectEditText(container *,Layer *,int,int,int,int,int,int,int,int,int,int,int,int,char *,const char *,int,int);
	virtual ~CObjectEditText();
	
	// les methodes virtuelles
	virtual int IsMouseOnObject(int,int,int);
	virtual int CursorMove(int,int,int,int,int);
	virtual int CursorMoveIn(int,int,int,int,int);
	virtual int CursorMoveInWithBtnPushed(int,int,int,int,int);
	virtual int CursorMoveOut(int,int,int,int,int);
	virtual int CursorMoveOutWithBtnPushed(int,int,int,int,int);
	virtual int CursorMoveOutsideWithBtnPushed(int,int,int,int,int);
	virtual int ClickIn(int,int,int,int,int,int);
	virtual int UnClickIn(int,int,int,int,int,int);
	virtual int ClickOut(int,int,int,int,int,int);
	virtual int UnClickOut(int,int,int,int,int,int);
	virtual int DblClickIn(int,int,int,int,int,int);
	virtual int MouseWheel(int,int,int,int,int,int);
	virtual int KeyUp(UINT,int,UINT,int);
	virtual int KeyDown(UINT,int,int,UINT,int);
	virtual int SetFocus(int,int,int);
	virtual int KillFocus(int,int);

	virtual int Timer(int);

	virtual Layer *GetLayer(mmachine m,int p_tab);
	virtual Layer *GetLayerPart(mmachine m,Rect2D *area2redraw,int p_tab);
	
	int DestroyAllLayers();
	int ResizeLayer(int,int,int);

	// pour les liens entre objets
	virtual int handle(CObjMessage* msg);
	virtual int supports( int type );

	void SetPositionCursorAndScroll(int scrolltype,int suppress,int p_tab);
};

#endif //_COBJECTEDITTEXT_H_