home *** CD-ROM | disk | FTP | other *** search
/ PC Open 19 / pcopen19.iso / Zipped / PART231.ZIP / SOURCES.ZIP / PART_GUI.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-12  |  7.1 KB  |  303 lines

  1. #include "part.h"
  2.  
  3. #define FsX 12
  4. #define FsY 6
  5. #define FsW 66
  6. #define FsH 17
  7.  
  8. #define FmX 4
  9. #define FmY 14
  10. #define FmW 74
  11. #define FmH 5
  12.  
  13.  
  14. void select_system_type(struct part_long *p)
  15. {
  16.  char *buf, *tmp;
  17.  struct event ev;
  18.  int i, k, n, top, act, N, barpos;
  19.  
  20.  if( (buf=malloc(FsW*FsH*2))==0 ) { show_error(ERROR_MALLOC); return; }
  21.  if( (tmp=malloc(FsW))==0 ) { free(buf); show_error(ERROR_MALLOC); return; }
  22.  
  23.  save_window( FsX, FsY, FsW, FsH, buf);
  24.  border_window( Yellow+BakWhite, FsX, FsY, FsW, FsH, Border22f );
  25.  write_string( Black+BakWhite, FsX+2, FsY+1, HEADER_SYSTYPE );
  26.  for( i=0 ; i<FsW-4 ; i++ ) tmp[i]='─';
  27.  tmp[i]=0;
  28.  write_string( Yellow+BakWhite, FsX+2, FsY+2, tmp );
  29.  write_string( Yellow+BakWhite, FsX+28, FsY+FsH-1, " F1 - Help ");
  30.  write_string( Yellow+BakWhite, FsX+42, FsY+FsH-1, " INS - Custom code ");
  31.  
  32.  for( N=0 ; os_desc[N].os_id!=OS_UNKN /* valid ids */ ; N++ );
  33.  
  34.  /* N - number of records in table  */
  35.  /* n - number of records on screen */
  36.  
  37.  top=0;
  38.  act = ( os_desc[p->os_num].os_id==OS_UNKN ) ? 0 : p->os_num;
  39.  n = ( N<FsH-4 ) ? N : FsH-4;
  40.  
  41. #define BARX (FsX+FsW-3)
  42. #define BARY (FsY+3)
  43. #define BARLEN (n)  /* (n-2) */
  44.  
  45.  while(1)
  46.     {
  47.      if( act<top ) top=act;
  48.      if( act>=top+n ) top=act-n+1;
  49.      
  50.      for( i=0 ; i<n ; i++ )
  51.         {
  52.          sprintf_systype(tmp,top+i);
  53.          write_string( (top+i==act) ? (White+BakBlack) : (Black+BakWhite),
  54.                       FsX+2, FsY+3+i, tmp );
  55.         }
  56.  
  57. //     if( top>0 ) write_char( Yellow+BakWhite, BARX, BARY, '');
  58. //            else write_char( Yellow+BakWhite, BARX, BARY, ' ');
  59.  
  60. //     if( top+n<N ) write_char( Yellow+BakWhite, BARX, BARY+BARLEN, '');
  61. //              else write_char( Yellow+BakWhite, BARX, BARY+BARLEN, ' ');
  62.  
  63.      if( N!=n )
  64.        {
  65.         barpos=((float)(top))/(N-n)*(BARLEN-1);
  66.  
  67.         for( i=0 ; i<BARLEN ; i++ )
  68.           write_char( Yellow+BakWhite, BARX, BARY+i, (i!=barpos)?'░':'▓');
  69.        }
  70.  
  71.      move_cursor(1,25);
  72.  
  73.      get_event(&ev,EV_KEY);
  74.      
  75.      if( ev.key==27 ) /* ESC */
  76.        {
  77.         break;
  78.        }
  79.      
  80.      if( ev.key==13 ) /* Enter */
  81.        {
  82.         p->os_num=act;
  83.         p->os_id=os_desc[act].os_id;
  84.         break;
  85.        }
  86.      else if( ev.scan==0x3B00 )  /* F1 - Help */
  87.        {
  88.         sprintf(tmp,"os_id 0x%02X",os_desc[act].os_id);
  89.         html_view(HELP_TEXT,tmp);
  90.        }
  91.      else if( ev.scan==0x52E0 || ev.scan==0x5200 )     /* Insert */
  92.        {
  93.         if( enter_string(4,16,PROMPT_FSTYPE, FsW, tmp, 0) )
  94.           {
  95.            i=0;
  96.            sscanf(tmp,"%X",&i);
  97.            if( i!=0 && i<256 )
  98.              {
  99.               p->os_id=i;
  100.               for( i=0 ; os_desc[i].os_id!=p->os_id && os_desc[i].os_id!=OS_UNKN ; i++ );
  101.               p->os_num=i;
  102.               break;
  103.              }
  104.           }
  105.        }
  106.      else if( ev.scan==0x47E0 || ev.scan==0x4700 )     /* Home */
  107.        {
  108.         act=0;
  109.        }
  110.      else if( ev.scan==0x4FE0 || ev.scan==0x4F00 )    /* End */
  111.        {
  112.         act=N-1;
  113.        }
  114.      else if( ev.scan==0x50E0 || ev.scan==0x5000 )    /* down */
  115.        {
  116.         if( act<N-1 ) act++;
  117.        }
  118.      else if( ev.scan==0x48E0 || ev.scan==0x4800 )    /* up */
  119.        {
  120.         if( act>0 ) act--;
  121.        }
  122.      else if( ev.scan==0x49E0 || ev.scan==0x4900 )    /* PgUp */
  123.        {
  124.         act-=n;
  125.         if( act<0 ) act=0;
  126.        }
  127.      else if( ev.scan==0x51E0 || ev.scan==0x5100 )    /* PgDn */
  128.        {
  129.         act+=n;
  130.         if( act>=N ) act=N-1;
  131.        }
  132.      
  133.     }/* while(1) */
  134.  
  135.  load_window( FsX, FsY, FsW, FsH, buf );
  136.  free(buf);
  137.  free(tmp);
  138. }/* select_system_type */
  139.  
  140.  
  141. int enter_string(int x, int y, char *prompt, int maxlen, char *name, char *help_target)
  142. {
  143.  char *buf;
  144.  struct event ev;
  145.  int i, z, w, x2, strw;
  146.  
  147.  strw=min(min(maxlen,36),73-x-strlen(prompt));
  148.  w=strlen(prompt)+5+strw;
  149.  x2=x+strlen(prompt)+3;
  150.  
  151.  if( (buf=malloc(w*3*2))==0 )
  152.    {
  153.     show_error(ERROR_MALLOC);
  154.     return 0;
  155.    }
  156.  
  157.  save_window(x,y,w,3,buf);
  158.  border_window(Yellow+BakWhite,x,y,w,3, Border22f );
  159.  write_string(Black+BakWhite,x+2,y+1,prompt);
  160.  
  161.  if( help_target!=0 ) 
  162.     write_string( Yellow+BakWhite, x+w-14, y+2, " F1 - Help ");
  163.  
  164.  i=0;
  165.  while(1)
  166.     {
  167.      name[i]=0;
  168.      z=0;
  169.      if( i>strw ) z=i-strw;
  170.      clear_window(BrWhite+BakBlack,x2,y+1,strw,1);
  171.      write_string(BrWhite+BakBlack,x2,y+1,name+z);
  172.      move_cursor(x2+i-z,y+1);
  173.  
  174.      get_event( &ev, EV_KEY );
  175.      
  176.      if( ev.key==27 ) { z=0; break; }
  177.      if( ev.key==13 ) { z=1; break; }
  178.  
  179.      if( ev.key==8 )             /* BackSpace */
  180.        {
  181.         if( i>0 ) i--;
  182.        }
  183.      else if( ev.scan==0x3B00 && help_target!=0 )  /* F1 - Help */
  184.        {
  185.         html_view(HELP_TEXT,help_target);
  186.        }
  187.      else if( ev.key>=' ' && ev.key<=127 && i<maxlen-1 )
  188.        {
  189.         name[i]=ev.key;
  190.         i++;
  191.        }
  192.        
  193.     }/* while(1) */
  194.  
  195.  load_window(x,y,w,3,buf);
  196.  free(buf);
  197.  return z;
  198. }/* enter_string */
  199.  
  200.  
  201. void show_error(char *msg)
  202. {
  203.  int x, y=12, w, h=4;
  204.  struct event ev;
  205.  static char buf[4*80*2];
  206.  
  207.  w = strlen(msg)+6;
  208.  if( w%2==1 ) w++;
  209.  if( w>78 ) w=78;
  210.  x = (80-w)/2+1;
  211.  
  212.  save_window(x,y,w,h,buf);
  213.  border_window(Yellow+BakRed,x,y,w,h, Border22f );
  214.  
  215.  write_string( BrWhite+BakRed, x+3, y+1, msg );
  216.  write_string( Black+BakWhite, x+w/2-2, y+2," OK "  );
  217.  
  218.  get_event( &ev, EV_KEY );
  219.  
  220.  load_window(x,y,w,h,buf);
  221. }/* show_error */
  222.  
  223.  
  224. static char *format_buf;
  225. static int format_status;
  226.  
  227.  
  228. void format_progress_init(void)
  229. {
  230.  format_status=0;
  231. }/* format_progress_init */
  232.  
  233.  
  234. void format_progress_done(void)
  235. {
  236.  if( interactive==1 && format_status==1 )
  237.    {
  238.     load_window(FmX,FmY,FmW,FmH,format_buf);
  239.     free(format_buf);
  240.    }
  241. }/* format_progress_done */
  242.  
  243.  
  244. int format_progress(char *msg)
  245. {
  246.  struct event ev;
  247.  if( interactive==1 )
  248.    {
  249.     if( format_status==0 )
  250.       {
  251.        if( (format_buf=malloc(FsW*FsH*2))==0 )
  252.          { show_error(ERROR_MALLOC); return FORMAT_FAILED; }
  253.        move_cursor(1,25);
  254.        save_window(FmX,FmY,FmW,FmH,format_buf);
  255.        border_window(Yellow+BakWhite,FmX,FmY,FmW,FmH, Border22f );
  256.        write_string(Black+BakWhite,FmX+2+50,FmY+1,PRESS_ESC);
  257.        format_status=1;
  258.       }
  259.  
  260.     if( msg!=0 )
  261.       {
  262.        if( *msg=='^' )
  263.          {
  264.           clear_window(Black+BakWhite,FmX+2,FmY+1, 50, 1);
  265.           write_string(Black+BakWhite,FmX+2,FmY+1, msg+1);
  266.          }
  267.        else 
  268.          {
  269.           if( *msg=='\n' || *msg=='\r' ) msg++;
  270.           clear_window(Black+BakWhite,FmX+2+strlen(msg),FmY+3,70-strlen(msg),1);
  271.           write_string(Black+BakWhite,FmX+2,FmY+3, msg);
  272.          }
  273.       }
  274.    }/* interactive */
  275.  else
  276.    {
  277.     if( format_status==0 )
  278.       {
  279.        printf("%s\n",PRESS_ESC);
  280.        format_status=1;
  281.       }
  282.     if( msg!=0 )
  283.       {
  284.        if( msg[0]=='^' )
  285.          { printf("\n%s\n",msg+1); }
  286.        else if( msg[0]=='\r' )
  287.          { printf("%s",msg); clreol(); }
  288.       else 
  289.          { printf("\n%s",msg); clreol(); }
  290.       }
  291.    }
  292.  
  293.  get_event(&ev,EV_KEY|EV_NONBLOCK);
  294.      
  295.  if( ev.ev_type==EV_KEY && ev.key==27 )     /* ESC */
  296.    {
  297.     return FORMAT_CANCEL;
  298.    }
  299.  
  300.  return FORMAT_OK;
  301.  
  302. }/* format_progress */
  303.