#ifndef _COBJECTTEXT_H_
#define _COBJECTTEXT_H_

#include "CObjectBase.h"
#include "../x/Objstr.h"
#include "utils.h"


#include "Text.h"
#include "CObjLayerFont.h"
#include <list>

#define CT_LEFT			 (1<<(LAST_OBJ_FLAG+1))
#define CT_RIGHT		 (1<<(LAST_OBJ_FLAG+2))
#define CT_TOP			 (1<<(LAST_OBJ_FLAG+3))
#define CT_BOTTOM		 (1<<(LAST_OBJ_FLAG+4))
#define CT_CENTER		 (1<<(LAST_OBJ_FLAG+5))
													// les flags de creations
#define CT_LABEL         (1<<(LAST_OBJ_FLAG+7))		// label
#define CT_EDITLINE      (1<<(LAST_OBJ_FLAG+8))		// ligne editable
#define CT_MULTIEDITLINE (1<<(LAST_OBJ_FLAG+9))		// multi editable
#define CT_WORDWRAP		 (1<<(LAST_OBJ_FLAG+10))	// vordwrap
#define CT_MULTIFONT	 (1<<(LAST_OBJ_FLAG+11))	// multifont
#define CT_SELECT		 (1<<(LAST_OBJ_FLAG+12))	// label selectionnable
#define CT_PASSWORD		 (1<<(LAST_OBJ_FLAG+13))	// password

#define CT_NOCHANGE		 (1<<0)		// les flags de changment de position du scrollbar
#define CT_BEGIN		 (1<<1)		// lié au controle
#define CT_END			 (1<<2)

#define CT_VALIDENTER	 (1<<0)
#define CT_VALIDCLICK	 (1<<1)



#define DEBUG_OBJTEXT 0

class CObjectText:public CObjectBase 
{
protected:

	char*				TEXTforbiddenchar;			// les characteres que l'on ne peux pas frapper
	char*				TEXTauthorizedChars;		// les characteres autorisés uniquement

	Text*				TEXTtexte;					// le tableau de wrap

	int					TEXTtransp;					// couleur de transparence
	int					TEXTtexttransp;				// coeff de transparence du text

	unsigned int		TEXTFirstVisibleSubLine;	// la premiere ligne visible
	int					TEXTcyChar;					// hauteur de chaque ligne
	unsigned int		TEXTnbVisibleSubLines;		// nbre de lignes visibles
	
	// pour les scrolls
	unsigned int		TEXTnbVerticalScrollBarPos;		// le nombre total de lignes
	unsigned int		TEXTVerticalScrollBarIndex;		// la position du ScrollBar vertical

	unsigned int		TEXTnbHorizontalScrollBarPos;	// le nombre total de colonnes
	unsigned int		TEXTHorizontalScrollBarIndex;	// la position du ScrollBar horizontal

	int					nbScrollEvent;				// nbre Evenement du Scroll
	
	int					TEXTwordwrap;				// boolean indiquant si le texte doit etre wrappe ou non
	int					TEXTmultifont;				// boolean indiquant si le texte est multifont ou non
	int					TEXTclickvalidation;		// boolean indiquant si le le reflexe de validation doit s'executer sur le click

	CObjectText(container * cont,Layer *layer,int x,int y,int w,int h,int flags,int contflags,
		        int textcolor,int textshadowflag,int textshadowcolor,int transp,int transp_text,
				int p_font,char * texte,const char *forbiddenchar);
	virtual ~CObjectText();

	// la gestion des notifications pour le scroll lié

	// envoie une notification de changement de position du scrollbar
	int send_notification_scrollpos(int,int,int,int);
	
	// envoie une notification de changement de nombre de position du scrollbar vertical
	int send_notification_change_nblines(int,int);

	// envoie une notification de changement de nombre de position du scrollbar horizontal
	int send_notification_change_nbcolones(int,int);
	
	// descend de nbligne lignes au niveau du controle texte
	int GoDown(int nbligne,int p_tab,int notifylinks);
	
	// monte de nbligne lignes au niveau du controle texte
	int GoUp(int nbligne,int p_tab,int notifylinks);

	// scroll de nbpixels pixels sur la droite
	int GoRight(int nbpixels,int p_tab,int notifylinks);

	// scroll de nbchar characteres sur la gauche
	int GoLeft(int nbpixels,int p_tab,int notifylinks);

	// WordWrap à partir de l'Index IndexStart
	void WordWrapFromStartIndex(int IndexStart,int p_font);
	
	// nettoyage de tous le texte visible
	void ClearAllText(int p_tab);
	
	// positionne le scrollbar
	void SetScrollPositionVertical(int nIndex,int dir,int notifylinks);
	
	// positionne le scrollbar
	void SetScrollPositionHorizontal(int nIndex,int dir,int notifylinks);
	
	// evalue le nombre de position du scrollbar vertical
	void SetScrollNbLines(int notifylinks);

	// evalue le nombre de position du scrollbar horizontal
	void SetScrollNbColonnes(int notifylinks);

	// repaint le srcoll bar lié
	void RepaintLinkedScroll();

	// evalue le decalage suivant le flag du texte
	int EvalDecalageFlags(int IndexSubLine); 
	
	// Evalue le nombre de sous-lignes visibles à
	// partir de la sous-ligne d'index ndxSubLine
	int EvalNbVisibleSubLine(int ndxSubLine);

	// methode d' ecriture du texte dans le buffer de l'EditText
	void DrawObjectText(int IndexSubLine);

	
public:
	// les methodes virtuelles
	int IsMouseOnObject(int,int,int);
	int CursorMove(int,int,int,int,int);
	int CursorMoveIn(int,int,int,int,int);
	int CursorMoveInWithBtnPushed(int,int,int,int,int);
	int CursorMoveOut(int,int,int,int,int);
	int CursorMoveOutWithBtnPushed(int,int,int,int,int);
	int CursorMoveOutsideWithBtnPushed(int,int,int,int,int);
	int ClickIn(int,int,int,int,int,int);
	int UnClickIn(int,int,int,int,int,int);
	int ClickOut(int,int,int,int,int,int);
	int UnClickOut(int,int,int,int,int,int);
	int DblClickIn(int,int,int,int,int,int);
	int MouseWheel(int,int,int,int,int,int);
	int KeyUp(UINT,int,UINT,int);
	int KeyDown(UINT,int,int,UINT,int);
	int SetFocus(int,int,int);
	int KillFocus(int,int);

	int Timer( int timerID );

	Layer *GetLayer(mmachine m,int p_tab);
	Layer *GetLayerPart(mmachine m,Rect2D *area2redraw,int p_tab);
	virtual int DestroyAllLayers();
	virtual int ResizeLayer(int,int,int);

	int CanBeActiveObject();
	
	void SetText(char *newtext,PtrObjFont font,int textcolor,int coeff,int shadowflag,int shadowcolor,int scrolltype,int p_tab);
	void AddText(char *newtext,PtrObjFont font,int textcolor,int coeff,int shadowflag,int shadowcolor,int scrolltype,int p_tab);

	inline char *	GetText(){return TEXTtexte->getRealText();};		// attention il ne faut pas liberer le pointeur
	inline int		GetFirstVisibleLine(){return (int)TEXTFirstVisibleSubLine;};
	void			SetFirstVisibleLine(int,int,int);
	char *			GetLine(int Line);					// attention il faut liberer le pointeur
	int				GetLineCount();
	void			DelLine(int scrolltype,int line,int p_tab);
	void			SetForbiddenChar(char *newfor);
	void			SetClickValidation(int val);
	void			SetAuthorizedChars(char* newau);

	virtual void InitLinkedScrollBar(int);
	virtual void SetPositionCursorAndScroll(int scrolltype,int suppress,int p_tab);
	
	
private:
	void				      ScrollPositionAfterChangingText(int scrolltype,int suppress,int p_tab);	
    
    // referenced fonts
    CObjLayerFont*            TEXTrefFont; // big hack: the text actually is not in real multi-font mode

	

};

int _CRcompText(mmachine);
int _DScompText(mmachine);
int _CONVERTcompTextToObjNode(mmachine);
int _SETcompText(mmachine);
int _ADDcompText(mmachine);
int _GETcompText(mmachine);
int _GETcompTextLine(mmachine);
int _GETcompTextLineCount(mmachine);
int _GETcompTextFirstLine(mmachine);
int _SETcompTextFirstLine(mmachine);
int _DELcompTextLine(mmachine);
int _SETcompTextForbiddenChar(mmachine);
int _SETcompTextAuthorizedChar(mmachine);

int rflcompTextChange(mmachine);
int rflcompTextValidation(mmachine);
int _CBcompTextResizeResource(mmachine);
int _CBcompTextResize(mmachine);

#endif //_COBJECTTEXT_H_