home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 2
/
FreeSoftwareCollection2pd199x-jp.img
/
prnout
/
src
/
menu.c
< prev
next >
Wrap
Text File
|
1990-06-14
|
8KB
|
262 lines
/************************************
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);
}