//	ＡＩＧライブラリ　メニュー関数
//		Copyright (C) 1989-1994 by AIG-SOFT

#ifndef	__AIG_MENU__
#define	__AIG_MENU__	3

#include "mcolors.h"

/* メニュー構造体（システムバージョン２.１）*/
/* V2.0 : ビットフィールド */
/* V2.1 : unchar（高速化＋本体省メモリーのため）*/
typedef struct MENU_DATA { /* メニューモード */
	unchar	ms_mode;	/* メッセージモード (1) */
	
	unchar	remake;		/* non remake menu : 0=none,1=項目再表示なし,2=再表示 */
	
	unchar	popup;		/* popup (1) */
	unchar	popdown;	/* popdown : 0=none , 1=ESC only , 2=always */
	unchar	udmode;		/* popup/down mode : 01〜05 */
	
	unchar	mouse;		/* mouse use (1/2/3) */
	unchar	cursor;		/* カーソル on(1)/off(0) */
	unchar	direct;		/* direct key jump : 0=none,1=select only,2=select&[RET] */
	
	unchar	ex_top;		/* top exit (1) : [1]選択時にupを押すとﾘﾀｰﾝ */
	unchar	ex_last;	/* last exit(1) : [all]選択時にdownを押すとﾘﾀｰﾝ */
	
	unchar	scroll;		/* scroll mode : 0=jump , 1=smoth */
	
	unchar	md_non;		/* non select enable (1) */
	unchar	md_scnc;	/* select color -> normal color (1) */
	unchar	md_spcol;	/* 特殊色使用 (1) */
	
	unchar	md_cls;		/* 枠内クリア : 0=yes , 1=no */
	
	unchar	md_wxcut;	/* 固定枠幅モード (1=wxによる) */
	
	unchar	md_revlen;	/* 項目反転モード：0=menu len , 1=mlen */
	unchar	md_mes;		/* 項目表示モード：0=左 , 1=中央 , 2=右 */
	
	unchar	ti_mode;	/* タイトル表示モード : 0=左 , 1=中央 , 2=右 */
	unchar	ta_mode;	/* テイル表示モード   : 0=左 , 1=中央 , 2=右 */
	
	unchar	num;		/* 番号モード
					0=番号なし
					1=Ａ〜Ｚまたはﾀﾞｲﾚｸﾄｾﾚｸﾄｷｰの表示
					2=１〜９／Ａ−Ｚ
					3=１０進２桁１から
					4=１０進３桁１から
					5=１６進２桁０１から
				*/
	unchar	num0;		/* 番号は０から (1) */
	unchar	nums;		/* A-Z小文字 , １０進数上位桁０付き , １６進数小文字 */
	
	/* getline/date用 */
	unchar	auto_ret;	/* getline()各種モード設定 */
	unchar	key0;		/* 先行入力後カーソル位置/先行入力モード */
	
	/* 同時多項目選択用 */
	unchar	limit_over;	/* リミット数＋１の時の処理：0=ベル２回 , 1=リターン */
	unchar	re_select;	/* 既にセレクトされている項目を再セレクトした時の処理
					0=無視する
					1=ベルを１回鳴らす（=non select）
					2=取り消す
				*/
	unchar	n_init;		/* 初期化モード
		 			0=msatr[]の内容に従う
					1=sel[]の内容によって初期設定する
				*/
	
	unsint	resv;		/* 汎用利用領域：１６ビット分 */
	
	short	n_ret;		/* リターンモード
		       			 0=ESC/EXIT/limitでしかリターンしない
					>0=n_ret番目以降の項目を選択するとリターン
				 	   このn_ret番以降は選択されたことにならない
					-1=all番目を選択するとリターン
				 	   このall番は選択されたことにならない
					-2=msatr[1〜all]のbit11=1の項目が選択されたらリターン
				 	   bit11=1の項目は選択されたことにならない
				*/
	/* その他 */
	int	pwait;		/* メニューpopup/down速度 */
	
	unsint 	wx;		/* メニュー横幅 : 0=自動 , >0=その幅 */
	unsint	aline;		/* メニュー上空行数 */
	unsint	bline;		/* メニュー下空行数 */
	unsint	wy;		/* メニュー縦幅 : 0=自動 , >0=その幅(blineで調節) */
	unsint	lcol;		/* メニュー左空桁数 */
	unsint	rcol;		/* メニュー右空桁数 */
	unsint	wcol;		/* 項目段間桁数（wmenu時）*/
	
	unsint	resv2;		/*（現在は未使用）*/
	
	unsint	startx;		/* メニュー移動可能範囲 */
	unsint	starty;
	unsint	endx;
	unsint	endy;
	
	/* タイトル、テイル、セパレーター */
	unchar	*title;		/* タイトル  : ""=なし */
	unchar	*tale;		/* テイル    : ""=なし */
	unchar	*sep;		/* ":"文字列 : ""=なし */
	
	/* 枠線 */
	unsint	cwaku;		/* 枠線モード：0=なし,1=細,2=細２重,3=太,4=太２重,5=極太 */
				/* 枠なしは未サポート */
	unsint	wptrn;		/* 枠パターン */
	
	/* 操作キー */
	unchar	*keys;		/* （現在は使っていない）*/
	unsint	exits;		/* 緊急脱出キーの数 */
	int	*exit;		/* 緊急脱出キーデータのあるアドレス */
} _MENU_DATA;

/* リターン値格納用ワークエリア名定義 */
#define	MRCODE	9		/* メニュー内部データを返すint配列の要素数 */
#define	MRKy	rcode[0]	/* リターンしたキーコード */
#define	MEx	rcode[1]	/* メニュー枠右下Ｘ座標 */
#define MEy	rcode[2]	/* Ｙ座標 */
#define MLtsp	rcode[3]	/* llt+spの値 */
#define MSp	rcode[4]	/* リターンした時に指していたポイント */
#define MCx	rcode[5]	/* カーソルＸ座標 */
#define MCy	rcode[6]	/* カーソルＹ座標 */
#define MMx	rcode[7]	/* マウスＸ座標 */
#define MMy	rcode[8]	/* マウスＹ座標 */


#ifdef	__cplusplus
// 95/11 : G++対応
extern	"C" {
#endif
#ifdef	__PROTO_TYPE
	int	wmenu(int *,int *,int,int *,int *,int,int,int *,unchar **,int *
				,_MENU_DATA *,MCOLORS *,unchar *(*),int *);
	int	n_wmenu(int *,int *,int,int *,int *,int,int,int *,unchar **,int *
			,_MENU_DATA *,MCOLORS *,unchar *(*),int *,int,int *);
	int	cscmenu2(int *,int *,int,int *,int,int,unchar **,int *
				,_MENU_DATA *,MCOLORS *,unchar *(*),int *);
	int	cmenu2(int *,int *,int,int,unchar **,int *
				,_MENU_DATA *,MCOLORS *,unchar *(*),int *);
	int	cyesno2(int *,int *,int,_MENU_DATA *,MCOLORS *,unchar *(*),int *);
	int	ok(int *,int *,unchar *,int,int,int,int,MCOLORS *);
	int	tmenu(int *,int *,int,int,unchar **,int *
			,_MENU_DATA *,MCOLORS *,unchar *(*),int *);
	
	int	message0(int *,int *,unchar **,int,MCOLORS *,int);
	void	message1(int *,int *,unchar **,int,MCOLORS *,unchar *(*));
	int	err_mes(int *,int *,int,unchar *,unchar *,unchar *,MCOLORS *);
	int	exec_error(int *,int *,unchar *,MCOLORS *);
	
	int	mini_menu(int,int,int,int,unchar **,int *,_MENU_DATA *
				,MCOLORS *,int *,int (*)());
	
	int	cdt_input(int (*)(),int *,int *,unchar *,int *,int *,int *
			,_MENU_DATA *,MCOLORS *,unchar *(*),int *,int (*)());
	
	void	set_dmenu_data(_MENU_DATA *);
	void	set_dms_data(_MENU_DATA *);
	void	set_dget_data(_MENU_DATA *);
	void	set_dtmenu_data(_MENU_DATA *);
#else
	int	wmenu();
	int	n_wmenu();
	int	cscmenu2();
	int	cmenu2();
	int	cyesno2();
	int	ok();
	int	tmenu();
	
	int	message0();
	void	message1();
	int	err_mes();
	int	exec_error();
	
	int	mini_menu();
	
	int	cdt_input();
	
	void	set_dmenu_data();
	void	set_dms_data();
	void	set_dget_data();
	void	set_dtmenu_data();
#endif
#ifdef	__cplusplus
}
#endif

/* 関数定義 */
#define cdate_input(x,y,F,Y,M,D,md,cl,W,R,G) cdt_input(date_input,x,y,F,Y,M,D,md,cl,W,R,G)
#define ctime_input(x,y,F,H,M,s,md,cl,W,R,G) cdt_input(time_input,x,y,F,H,M,s,md,cl,W,R,G)

#endif
