/************************************

    Menu & Selecter Test Program

    1989.11.24

*************************************/
#include    <stdio.h>
#define MAIN
#include    "defs.h"

#define MAX_NOD     4       /* 最大数 */
#define MAX_TTL     12      /* タイトルの間隔 */
#define MAX_LEN     6       /* メユ−の間隔 */
#define MAX_MENU    16      /* (sizeof menu / sizeof(struct MENU)) */
/*
#define SHIFT(c)    (40*(c/7))
#define SKIP(c)     (c%7)
*/
#define SHIFT(c)    (0)
#define SKIP(c)     (c)

#define SEL_NOD     0
#define SET_VAL     1

#define PP_MENU     1

extern char *fnt_dir;
char    file[80];
struct MENU {
    int     *val;
    int	    old;
    int     max;
    char    mode;
    char    *ttl;
    char    *nod[MAX_MENU];
} menu[]={
    { &paper,0,3,  SEL_NOD,"用紙の選択","A5","B5","A4","B4" },
    { &yousi[DEFPP].yoko,0,300,SET_VAL,"横ｻｲｽﾞ m/m" },
    { &yousi[DEFPP].tate,0,370,SET_VAL,"縦ｻｲｽﾞ m/m" },
    { &yousi[DEFPP].spc,0,50, SET_VAL,"文字 間 隔" },
    { &yousi[DEFPP].lf,0,50, SET_VAL,"行  間  隔" },
    { &yousi[DEFPP].lmrg,0,500,SET_VAL,"左の 余 白" },
    { &yousi[DEFPP].lmax,0,500,SET_VAL,"印字 桁 数" },
    { &yousi[DEFPP].pmrg,0,500,SET_VAL,"上の 余 白" },
    { &yousi[DEFPP].pmax,0,500,SET_VAL,"印字 行 数" },
    { &page_flg,0,1,SEL_NOD,"ペ−ジ印字","する","しない" },
    { &kin_flg,0,1,SEL_NOD,"禁足 処 理","する","しない" },
    { &ryo_flg,0,1,SEL_NOD,"両面 印 刷","する","しない" },
    { &typ_flg,0,3,SEL_NOD,"ﾌﾟﾘﾝﾀ 種類","ｲﾒ-ｼﾞ","FM系","ESC/P","PC系" },
    { &fnt_flg,0,3,SEL_NOD,"ﾌｫﾝﾄ  種類","標準","明朝","まる","ゴジ" },
    { &printer[0].yoko,0,100,SET_VAL,"印字位置横" },
    { &printer[0].tate,0,100,SET_VAL,"印字位置縦" },
};

void    repchr(n,ch)
int     n,ch;
{
    while ( n-- > 0 )
	putch(ch);
}
void	pp_box(offx,offy)
int	offx,offy;
{
    int    i,j,x,y,ex,ey;

    if ( offx > 0 || offy > 0 )
	dsp_flg = TRUE;
    x = (yousi[paper].yoko * 225l) / 254 + GRA_OFFX + offx;
    y = (yousi[paper].tate * 225l) / 254 + GRA_OFFY + offy;
    line(GRA_OFFX+offx-1,GRA_OFFY+offy-1,x+1,y+1,PSET,0,BOX,LINE_1);
    line(GRA_OFFX+offx,GRA_OFFY+offy,x,y,PSET,15,FBOX,LINE_1);
    line(x+2,GRA_OFFY+offy,x+2,y+2,PSET,0,LINE,LINE_1);
    line(GRA_OFFX+offx,y+2,x+2,y+2,PSET,0,LINE,LINE_1);

    i = yousi[paper].spc + 24;
    j = yousi[paper].lf + 24;
    x = (printer[typ_flg].yoko * 1800L) / 254L;
    y = (printer[typ_flg].tate * 1800L) / 254L;
    x += (yousi[paper].lmrg * i);
    y += (yousi[paper].pmrg * j);
    ex = x + yousi[paper].lmax * i;
    ey = y + yousi[paper].pmax * j;

    x = (x >> 4) + GRA_OFFX + offx;
    y = (y >> 3) + GRA_OFFY + offy;
    ex = (ex >> 4) + GRA_OFFX + offx;
    ey = (ey >> 3) + GRA_OFFY + offy;

    line(x,y,ex,ey,PSET,0,SBOX,LINE_2);
}
void    paper_set()
{
    int     max;
    long    l;

    menu[PP_MENU+0].val = &yousi[paper].yoko;
    menu[PP_MENU+1].val = &yousi[paper].tate;
    menu[PP_MENU+2].val = &yousi[paper].spc;
    menu[PP_MENU+3].val = &yousi[paper].lf;
    menu[PP_MENU+4].val = &yousi[paper].lmrg;
    menu[PP_MENU+5].val = &yousi[paper].lmax;
    menu[PP_MENU+6].val = &yousi[paper].pmrg;
    menu[PP_MENU+7].val = &yousi[paper].pmax;

    l = ((yousi[paper].yoko - printer[typ_flg].yoko)* 1800l) / 127;
    max = l / (yousi[paper].spc + 24);
    if ( (menu[PP_MENU+5].max = max - yousi[paper].lmrg) < yousi[paper].lmax )
	yousi[paper].lmax = menu[PP_MENU+5].max;
    menu[PP_MENU+4].max = max - yousi[paper].lmax;

    l = ((yousi[paper].tate - printer[typ_flg].tate) * 1800l) / 254;
    max = l / (yousi[paper].lf + 24);
    if ( (menu[PP_MENU+7].max = max - yousi[paper].pmrg) < yousi[paper].pmax )
	yousi[paper].pmax = menu[PP_MENU+7].max;
    menu[PP_MENU+6].max = max - yousi[paper].pmax;

    if ( memcmp(&yousi[4],&yousi[paper],sizeof(YOUSI)) == 0 &&
	 memcmp(&printer[4],&printer[typ_flg],sizeof(PRINTER)) == 0 )
	return;

    if ( yousi[4].yoko != yousi[paper].yoko ||
	 yousi[4].tate != yousi[paper].tate ||
	 dsp_flg != FALSE )
	G_era();

    memcpy(&yousi[4],&yousi[paper],sizeof(YOUSI));
    memcpy(&printer[4],&printer[typ_flg],sizeof(PRINTER));
    pp_box(0,0);
    dsp_flg = FALSE;
}
int     input(x,y,max,arg)
int     x,y,max;
char    *arg;
{
    int     ch,len;

    locate(x,y); repchr(max,' ');
    len = strlen(arg);
    for ( ; ; ) {
	arg[len] = '\0';
	locate(x,y);
	printf("%-34s",arg);
	locate(x+len,y);
	echo(CUR_ON);
	ch = get_key();
	echo(CUR_OFF);
	if ( ch >= ' ' && len < max )
	    arg[len++] = ch;
	else if ( ch == '\x08' && len > 0 )
	    len--;
	else if ( ch < ' ' )
	    break;
    }
    arg[len] = '\0';
    return ch;
}
void    Set_menu(x,y)
int     x,y;
{
    int     i,j,ch;
    int     no=(-1),no_old=(-1);
    char    *p,*sel_file();

    paper_set();
    for ( i = 0 ; i < MAX_MENU ; i++ ) {
	locate(x+SHIFT(i),y+SKIP(i));
	color(no == i ? HIT_COL:STD_COL);
	printf("%s",menu[i].ttl);
	if ( menu[i].mode == SEL_NOD ) {
	    for ( j = 0 ; j <= menu[i].max ; j++ ) {
		locate(x+MAX_TTL+j*MAX_LEN+SHIFT(i),y+SKIP(i));
		color(*menu[i].val == j ? HIT_COL:STD_COL);
		printf("%s",menu[i].nod[j]);
	    }
	} else {
	    locate(x+MAX_TTL+SHIFT(i),y+SKIP(i));
	    printf("%d",*menu[i].val);
	}
	menu[i].old = *menu[i].val;
    }

    for ( ; ; ) {
	if ( no != no_old ) {
	    if ( no >= 0 ) {
		locate(x+SHIFT(no),y+SKIP(no));
		color(HIT_COL);
		printf("%s",menu[no].ttl);
		color(STD_COL);
	    }
	    if ( no_old >= 0 ) {
		locate(x+SHIFT(no_old),y+SKIP(no_old));
		color(STD_COL);
		printf("%s",menu[no_old].ttl);
	    }
            no_old = no;
	} else if ( no >= 0 ) {
	    if ( menu[no].mode == SEL_NOD &&
                 *menu[no].val != menu[no].old ) {
                locate(x+MAX_TTL+*menu[no].val*MAX_LEN+SHIFT(no),y+SKIP(no));
                color(HIT_COL);
		printf("%s",menu[no].nod[*menu[no].val]);
		locate(x+MAX_TTL+menu[no].old*MAX_LEN+SHIFT(no),y+SKIP(no));
                color(STD_COL);
                printf("%s",menu[no].nod[menu[no].old]);
                menu[no].old = *menu[no].val;
		if ( no == 0 )
		    paper_set();
		else if ( no == 12 ) {
		    menu[14].val = &printer[typ_flg].yoko;
		    menu[15].val = &printer[typ_flg].tate;
		}
	    }
	    for ( i = 0 ; i < MAX_MENU ; i++ ) {
		if ( menu[i].mode != SEL_NOD &&
                     *menu[i].val != menu[i].old ) {
		    paper_set();
		    locate(x+MAX_TTL+SHIFT(i),y+SKIP(i));
		    printf("%d   ",*menu[i].val);
		    menu[i].old = *menu[i].val;
		}
	    }
	}
/*      fflush(stdout); */
	if ( no >= 0 )
	    ch = get_key();
	else
	    ch = input(1,1,34,file);

	if ( ch == '\x1B' ) {
	    break;
	} else if ( ch == '\x0D' ) {
	    if ( (p = sel_file(file)) != NULL )
		file_out(p);
	} else if ( ch == '\x1E' ) {
	    if ( --no < (-1) )
		no = MAX_MENU - 1;
	} else if ( ch == '\x1F' ) {
	    if ( ++no >= MAX_MENU )
		no = (-1);
	} else if ( no >= 0 && ch == '\x1C' ) {
	    if ( (*menu[no].val += 1) > menu[no].max )
		*menu[no].val = 0;
	} else if ( no >= 0 && ch == '\x1D' ) {
            if ( (*menu[no].val -= 1) < 0 )
                *menu[no].val = menu[no].max;
        }
    }
}
void    main(argc,argv)
int     argc;
char    *argv[];
{
    G_init();
    if ( argc > 1 )
	fnt_dir = argv[1];
    wind(0,0,34,1);
    wind(0,2,34,MAX_MENU);
    wind(0,MAX_MENU+3,34,3);
    Set_menu(1,3);
}
