/* ----------------------------------------------------------------------------
 * tw_view.h (c) 92 Michael Kraehe
 */

#ifndef TWVIEW
#define TWVIEW

extern int view_debug_expose;
extern int view_debug_init;
extern int view_debug_event;

/* ------------------------------------------------------------------------- */

extern int MausX;
extern int MausY;
extern int MausB;

/* ----------------------------------------------------------------------------
 * View Stuff
 */

class View {
	public:
		int x,y,b,h;
		int visible;
		View *parent;
		char *name;
		char *transaction;

		View(char *InitName,int InitX=0,int InitY=0,
			int InitB=0,int InitH=0);

		virtual int RealX(int vx);
		virtual int RealY(int vy);
		virtual void set_cursor(int cx,int cy);

		virtual void move(int MoveX,int MoveY);

		virtual void add(View *view);
		virtual void del(View *view);
		virtual void up(View *view);
		virtual void down(View *view);

		virtual void map(View *par = 0);
		virtual void unmap();
		virtual void resize(int SizB,int SizH);

		virtual void expose(int ExX,int ExY,int ExB,int ExH);
		virtual void full_expose();
		virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_in(int reason);
		virtual void focus_out(int reason);
	};

struct ViewList {
	View *view;
	struct ViewList *next;
	};

class ViewContainer : public View {
	public:
		struct ViewList *viewlist;

		ViewContainer(char *InitName,int InitX=0, int InitY=0,
			int InitB=0,int InitH=0);

		virtual void add(View *view);
		virtual void del(View *view);
		virtual void up(View *view);
		virtual void down(View *view);

		virtual View *find(int EvX,int EvY);

		virtual void resize(int SizB,int SizH);

		virtual void sub_expose(int ExX,int ExY,int ExB,int ExH);
		virtual void expose(int ExX,int ExY,int ExB,int ExH);
		virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_in(int reason);
	};

class ViewBack : public ViewContainer {
	public:
                char    **background;
                int	free_back;

                ViewBack(char *InitName,int InitX=0, int InitY=0,
			int InitB=0,int InitH=0);

		virtual void expose(int ExX,int ExY,int ExB,int ExH);
		virtual void back_expose(int ExX,int ExY,int ExB,int ExH);
	};

class ViewRoot : public ViewBack {
	public:
		View *focus;

		ViewRoot(char *Name);
		virtual ~ViewRoot();

		virtual void set_cursor(int cx,int cy);
		int eventloop();

		virtual void focus_out(int reason);
	};

extern ViewRoot VRoot;


/* ----------------------------------------------------------------------------
 * Field.h
 */

class ViewField : public View {
        public :
		Field *field;
		void (*check)(ViewField *v,int ch);
		char *editbuff;
		int  editflag;

                ViewField(char *InitName,
			void (*check)(ViewField *v,int ch),
			Field *InitField,
                        int InitX=0,int InitY=0,
                        int InitB=0,int InitH=0);

                virtual void expose(int ExX,int ExY,int ExB,int ExH);
                virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_out(int reason);
		virtual void focus_in(int reason);
                };

/* ----------------------------------------------------------------------------
 * Mask.h
 */

struct MaskLoad {
	char *name;
	char *buff;
	int  len;
	Field *((*konstr)(char *Name, char *Buff, int Len));
	void  (*check)(ViewField *v,int ch);
	char *trans;
	};

class ViewMask : public ViewBack {
        public:
                View    *focus;

                ViewMask(char *InitName,char **InitBackground,
			MaskLoad *InitLoad,
                        int InitX=0, int InitY=0,
                        int InitB=0, int InitH=0);
		virtual void load(MaskLoad *load);
                virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_in(int reason);
        };

/* ----------------------------------------------------------------------------
 * Menue.h
 */

class MenuButton : public View {
	public :
		void (*fnc)(MenuButton *p,int ch);
		View *param;

		MenuButton(char *InitName,void (*InitFnc)(MenuButton *v,int ch),
			View *InitParam,
                        int InitX=0, int InitY=0,
                        int InitB=0, int InitH=0);
		virtual void expose(int ExX,int ExY,int ExB,int ExH);
                virtual void event(int EvX,int EvY,int EvKey);
	};

struct MenuLoad {
	char *name;
	void (*fnc)(MenuButton *p,int ch);
	View *param;
	char *trans;
	};

class ViewMenu : public ViewContainer {
	public:
		ViewMenu *par_menu;

		ViewMenu(char *InitName, ViewMenu *ParMenu, MenuLoad *load); 

		virtual void expose(int ExX,int ExY,int ExB,int ExH);
		virtual void event(int EvX,int EvY,int EvKey);
		virtual void resize(int SizB,int SizH);
		virtual void focus_out(int reason);
	};

extern ViewMenu MainMenu;

/* ----------------------------------------------------------------------------
 * Scrolls
 */

class ViewScroll : public View {
	public :
		View *panner;
		int xo,yo;
		int freepos;
		int border;
		int footer;
		int header;

                ViewScroll(char *InitName,View *Panner,
			int InitX=0,int InitY=0, int InitB=0,int InitH=0);

		virtual void move(int MoveX,int MoveY);
		virtual int RealX(int vx);
		virtual int RealY(int vy);
		virtual void set_cursor(int cx,int cy);

		virtual void map(View *par = 0);
		virtual void unmap();

                virtual void resize(int SizB,int SizH);

                virtual void expose(int ExX,int ExY,int ExB,int ExH);
                virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_in(int reason);
	};

class ViewFramedMask : public ViewScroll {
	public :
                ViewFramedMask(char *InitName,char **InitBackground,
                        MaskLoad *InitLoad,
                        int InitX=0, int InitY=0,
                        int InitB=0, int InitH=0);
		virtual void map(View *par = 0);
		virtual void unmap();
	};

class ViewFramedText : public ViewScroll {
	public :
		int cur_x,cur_y;

                ViewFramedText(char *InitName, char **InitBackground,
                        int InitX=0, int InitY=0,
                        int InitB=0, int InitH=0);
                virtual void event(int EvX,int EvY,int EvKey);
		virtual void focus_in(int reason);
	};

struct ViewCursor_def {
	int first;
	Cursor *cursor;
	char *transaction;
	void (*check)(ViewField *v,int ch);
	char *keys[10];
	char *keynames[10];
	};

class ViewCursor : public ViewFramedMask {
	public :
		List *vcds;
		struct ViewCursor_def *vcd;

                ViewCursor(char *InitName,char **InitBackground,
                        MaskLoad *InitLoad, List *InitVcds,
                        int InitX=0, int InitY=0,
                        int InitB=0, int InitH=0);
                struct ViewCursor_def *find_vcd(int line);
                virtual void event(int EvX,int EvY,int EvKey);
		virtual void expose(int ExX,int ExY,int ExB,int ExH);
		virtual void focus_in(int reason);
	};

/* ----------------------------------------------------------------------------
 * Functions
 */

void SubMenu(MenuButton *m,int ch);
void MapMask(MenuButton *m,int ch);
void TwinExit(MenuButton *m,int ch);

void NextCursor(MenuButton *m,int ch);
void PrevCursor(MenuButton *m,int ch);
void LastCursor(MenuButton *m,int ch);
void CleanCursor(MenuButton *m,int ch);
void FirstCursor(MenuButton *m,int ch);
void AddCursor(MenuButton *m,int ch);

#endif
