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

  1. /************************************
  2.  
  3.     Menu & Selecter Test Program
  4.  
  5.     1989.11.24
  6.  
  7. *************************************/
  8. #include    <stdio.h>
  9. #define MAIN
  10. #include    "defs.h"
  11.  
  12. #define MAX_NOD     4       /* 最大数 */
  13. #define MAX_TTL     12      /* タイトルの間隔 */
  14. #define MAX_LEN     6       /* メユ-の間隔 */
  15. #define MAX_MENU    16      /* (sizeof menu / sizeof(struct MENU)) */
  16. /*
  17. #define SHIFT(c)    (40*(c/7))
  18. #define SKIP(c)     (c%7)
  19. */
  20. #define SHIFT(c)    (0)
  21. #define SKIP(c)     (c)
  22.  
  23. #define SEL_NOD     0
  24. #define SET_VAL     1
  25.  
  26. #define PP_MENU     1
  27.  
  28. extern char *fnt_dir;
  29. char    file[80];
  30. struct MENU {
  31.     int     *val;
  32.     int        old;
  33.     int     max;
  34.     char    mode;
  35.     char    *ttl;
  36.     char    *nod[MAX_MENU];
  37. } menu[]={
  38.     { &paper,0,3,  SEL_NOD,"用紙の選択","A5","B5","A4","B4" },
  39.     { &yousi[DEFPP].yoko,0,300,SET_VAL,"横サイズ m/m" },
  40.     { &yousi[DEFPP].tate,0,370,SET_VAL,"縦サイズ m/m" },
  41.     { &yousi[DEFPP].spc,0,50, SET_VAL,"文字 間 隔" },
  42.     { &yousi[DEFPP].lf,0,50, SET_VAL,"行  間  隔" },
  43.     { &yousi[DEFPP].lmrg,0,500,SET_VAL,"左の 余 白" },
  44.     { &yousi[DEFPP].lmax,0,500,SET_VAL,"印字 桁 数" },
  45.     { &yousi[DEFPP].pmrg,0,500,SET_VAL,"上の 余 白" },
  46.     { &yousi[DEFPP].pmax,0,500,SET_VAL,"印字 行 数" },
  47.     { &page_flg,0,1,SEL_NOD,"ペ-ジ印字","する","しない" },
  48.     { &kin_flg,0,1,SEL_NOD,"禁足 処 理","する","しない" },
  49.     { &ryo_flg,0,1,SEL_NOD,"両面 印 刷","する","しない" },
  50.     { &typ_flg,0,3,SEL_NOD,"プリンタ 種類","イメ-ジ","FM系","ESC/P","PC系" },
  51.     { &fnt_flg,0,3,SEL_NOD,"フォント  種類","標準","明朝","まる","ゴジ" },
  52.     { &printer[0].yoko,0,100,SET_VAL,"印字位置横" },
  53.     { &printer[0].tate,0,100,SET_VAL,"印字位置縦" },
  54. };
  55.  
  56. void    repchr(n,ch)
  57. int     n,ch;
  58. {
  59.     while ( n-- > 0 )
  60.     putch(ch);
  61. }
  62. void    pp_box(offx,offy)
  63. int    offx,offy;
  64. {
  65.     int    i,j,x,y,ex,ey;
  66.  
  67.     if ( offx > 0 || offy > 0 )
  68.     dsp_flg = TRUE;
  69.     x = (yousi[paper].yoko * 225l) / 254 + GRA_OFFX + offx;
  70.     y = (yousi[paper].tate * 225l) / 254 + GRA_OFFY + offy;
  71.     line(GRA_OFFX+offx-1,GRA_OFFY+offy-1,x+1,y+1,PSET,0,BOX,LINE_1);
  72.     line(GRA_OFFX+offx,GRA_OFFY+offy,x,y,PSET,15,FBOX,LINE_1);
  73.     line(x+2,GRA_OFFY+offy,x+2,y+2,PSET,0,LINE,LINE_1);
  74.     line(GRA_OFFX+offx,y+2,x+2,y+2,PSET,0,LINE,LINE_1);
  75.  
  76.     i = yousi[paper].spc + 24;
  77.     j = yousi[paper].lf + 24;
  78.     x = (printer[typ_flg].yoko * 1800L) / 254L;
  79.     y = (printer[typ_flg].tate * 1800L) / 254L;
  80.     x += (yousi[paper].lmrg * i);
  81.     y += (yousi[paper].pmrg * j);
  82.     ex = x + yousi[paper].lmax * i;
  83.     ey = y + yousi[paper].pmax * j;
  84.  
  85.     x = (x >> 4) + GRA_OFFX + offx;
  86.     y = (y >> 3) + GRA_OFFY + offy;
  87.     ex = (ex >> 4) + GRA_OFFX + offx;
  88.     ey = (ey >> 3) + GRA_OFFY + offy;
  89.  
  90.     line(x,y,ex,ey,PSET,0,SBOX,LINE_2);
  91. }
  92. void    paper_set()
  93. {
  94.     int     max;
  95.     long    l;
  96.  
  97.     menu[PP_MENU+0].val = &yousi[paper].yoko;
  98.     menu[PP_MENU+1].val = &yousi[paper].tate;
  99.     menu[PP_MENU+2].val = &yousi[paper].spc;
  100.     menu[PP_MENU+3].val = &yousi[paper].lf;
  101.     menu[PP_MENU+4].val = &yousi[paper].lmrg;
  102.     menu[PP_MENU+5].val = &yousi[paper].lmax;
  103.     menu[PP_MENU+6].val = &yousi[paper].pmrg;
  104.     menu[PP_MENU+7].val = &yousi[paper].pmax;
  105.  
  106.     l = ((yousi[paper].yoko - printer[typ_flg].yoko)* 1800l) / 127;
  107.     max = l / (yousi[paper].spc + 24);
  108.     if ( (menu[PP_MENU+5].max = max - yousi[paper].lmrg) < yousi[paper].lmax )
  109.     yousi[paper].lmax = menu[PP_MENU+5].max;
  110.     menu[PP_MENU+4].max = max - yousi[paper].lmax;
  111.  
  112.     l = ((yousi[paper].tate - printer[typ_flg].tate) * 1800l) / 254;
  113.     max = l / (yousi[paper].lf + 24);
  114.     if ( (menu[PP_MENU+7].max = max - yousi[paper].pmrg) < yousi[paper].pmax )
  115.     yousi[paper].pmax = menu[PP_MENU+7].max;
  116.     menu[PP_MENU+6].max = max - yousi[paper].pmax;
  117.  
  118.     if ( memcmp(&yousi[4],&yousi[paper],sizeof(YOUSI)) == 0 &&
  119.      memcmp(&printer[4],&printer[typ_flg],sizeof(PRINTER)) == 0 )
  120.     return;
  121.  
  122.     if ( yousi[4].yoko != yousi[paper].yoko ||
  123.      yousi[4].tate != yousi[paper].tate ||
  124.      dsp_flg != FALSE )
  125.     G_era();
  126.  
  127.     memcpy(&yousi[4],&yousi[paper],sizeof(YOUSI));
  128.     memcpy(&printer[4],&printer[typ_flg],sizeof(PRINTER));
  129.     pp_box(0,0);
  130.     dsp_flg = FALSE;
  131. }
  132. int     input(x,y,max,arg)
  133. int     x,y,max;
  134. char    *arg;
  135. {
  136.     int     ch,len;
  137.  
  138.     locate(x,y); repchr(max,' ');
  139.     len = strlen(arg);
  140.     for ( ; ; ) {
  141.     arg[len] = '\0';
  142.     locate(x,y);
  143.     printf("%-34s",arg);
  144.     locate(x+len,y);
  145.     echo(CUR_ON);
  146.     ch = get_key();
  147.     echo(CUR_OFF);
  148.     if ( ch >= ' ' && len < max )
  149.         arg[len++] = ch;
  150.     else if ( ch == '\x08' && len > 0 )
  151.         len--;
  152.     else if ( ch < ' ' )
  153.         break;
  154.     }
  155.     arg[len] = '\0';
  156.     return ch;
  157. }
  158. void    Set_menu(x,y)
  159. int     x,y;
  160. {
  161.     int     i,j,ch;
  162.     int     no=(-1),no_old=(-1);
  163.     char    *p,*sel_file();
  164.  
  165.     paper_set();
  166.     for ( i = 0 ; i < MAX_MENU ; i++ ) {
  167.     locate(x+SHIFT(i),y+SKIP(i));
  168.     color(no == i ? HIT_COL:STD_COL);
  169.     printf("%s",menu[i].ttl);
  170.     if ( menu[i].mode == SEL_NOD ) {
  171.         for ( j = 0 ; j <= menu[i].max ; j++ ) {
  172.         locate(x+MAX_TTL+j*MAX_LEN+SHIFT(i),y+SKIP(i));
  173.         color(*menu[i].val == j ? HIT_COL:STD_COL);
  174.         printf("%s",menu[i].nod[j]);
  175.         }
  176.     } else {
  177.         locate(x+MAX_TTL+SHIFT(i),y+SKIP(i));
  178.         printf("%d",*menu[i].val);
  179.     }
  180.     menu[i].old = *menu[i].val;
  181.     }
  182.  
  183.     for ( ; ; ) {
  184.     if ( no != no_old ) {
  185.         if ( no >= 0 ) {
  186.         locate(x+SHIFT(no),y+SKIP(no));
  187.         color(HIT_COL);
  188.         printf("%s",menu[no].ttl);
  189.         color(STD_COL);
  190.         }
  191.         if ( no_old >= 0 ) {
  192.         locate(x+SHIFT(no_old),y+SKIP(no_old));
  193.         color(STD_COL);
  194.         printf("%s",menu[no_old].ttl);
  195.         }
  196.             no_old = no;
  197.     } else if ( no >= 0 ) {
  198.         if ( menu[no].mode == SEL_NOD &&
  199.                  *menu[no].val != menu[no].old ) {
  200.                 locate(x+MAX_TTL+*menu[no].val*MAX_LEN+SHIFT(no),y+SKIP(no));
  201.                 color(HIT_COL);
  202.         printf("%s",menu[no].nod[*menu[no].val]);
  203.         locate(x+MAX_TTL+menu[no].old*MAX_LEN+SHIFT(no),y+SKIP(no));
  204.                 color(STD_COL);
  205.                 printf("%s",menu[no].nod[menu[no].old]);
  206.                 menu[no].old = *menu[no].val;
  207.         if ( no == 0 )
  208.             paper_set();
  209.         else if ( no == 12 ) {
  210.             menu[14].val = &printer[typ_flg].yoko;
  211.             menu[15].val = &printer[typ_flg].tate;
  212.         }
  213.         }
  214.         for ( i = 0 ; i < MAX_MENU ; i++ ) {
  215.         if ( menu[i].mode != SEL_NOD &&
  216.                      *menu[i].val != menu[i].old ) {
  217.             paper_set();
  218.             locate(x+MAX_TTL+SHIFT(i),y+SKIP(i));
  219.             printf("%d   ",*menu[i].val);
  220.             menu[i].old = *menu[i].val;
  221.         }
  222.         }
  223.     }
  224. /*      fflush(stdout); */
  225.     if ( no >= 0 )
  226.         ch = get_key();
  227.     else
  228.         ch = input(1,1,34,file);
  229.  
  230.     if ( ch == '\x1B' ) {
  231.         break;
  232.     } else if ( ch == '\x0D' ) {
  233.         if ( (p = sel_file(file)) != NULL )
  234.         file_out(p);
  235.     } else if ( ch == '\x1E' ) {
  236.         if ( --no < (-1) )
  237.         no = MAX_MENU - 1;
  238.     } else if ( ch == '\x1F' ) {
  239.         if ( ++no >= MAX_MENU )
  240.         no = (-1);
  241.     } else if ( no >= 0 && ch == '\x1C' ) {
  242.         if ( (*menu[no].val += 1) > menu[no].max )
  243.         *menu[no].val = 0;
  244.     } else if ( no >= 0 && ch == '\x1D' ) {
  245.             if ( (*menu[no].val -= 1) < 0 )
  246.                 *menu[no].val = menu[no].max;
  247.         }
  248.     }
  249. }
  250. void    main(argc,argv)
  251. int     argc;
  252. char    *argv[];
  253. {
  254.     G_init();
  255.     if ( argc > 1 )
  256.     fnt_dir = argv[1];
  257.     wind(0,0,34,1);
  258.     wind(0,2,34,MAX_MENU);
  259.     wind(0,MAX_MENU+3,34,3);
  260.     Set_menu(1,3);
  261. }
  262.