/***************************************************************************/
//              "Меркурий"-"Правда" - open source переводчик
//          распространяется в соответсвии с лицензией GNU v 2.0
//
//                       удобные штучки для интерфейса
//     Анисимов Д.В.                                         сегодня
/***************************************************************************/

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <malloc.h>
# include "mylib.h"
# include "video.h"
# include "color.h"
# include "window.h"

short kommand_yxf1( short y, short x, char **str, short n_str );
e_WinMsg kommand_yxf( short y, short x, char f, char *str, short lenght,
		   char EIN, char **str1=NULL, short n_str1=0 );

/***************************************************************************/
/*                      Выдать сообщение об ошибке                         */
/***************************************************************************/
void figna( char *str )
{  short i,j,x,y,y_i,n_str,l_str,r1,sx,sy ;
   char str1[80] ;

   j=0 ; l_str=0 ;
   for( n_str=1,i=0 ; i<512 ; i++ )
   {   if( str[i]==0 )
       {  if( i-j>l_str ) l_str=i-j ;
	  break ;
       }
       if( str[i]=='\n' )
       {  if( i-j>l_str ) l_str=i-j ;
	  n_str++ ; j=i ;
       }
   }
   s_get_size( sx, sy );
   x=sx/2-l_str/2-1 ; y=sy/2-n_str/2-2 ;

   s_save( y,x,y+n_str+1,x+l_str+2 ) ;
   s_rame1_F( y,x,y+n_str+1,x+l_str+2,0x70 ) ;
   for( y_i=0,r1=0 ; y_i<n_str ; y_i++ )
   {   for( i=r1,j=0 ; i<512 ; i++ )
       {   if( str[i]==0 || str[i]=='\n' ){  str1[j]=0 ; r1=i+1 ; break ;  }
	   str1[j++]=str[i] ;
       }
       s_text_yxf( y+y_i+1,x+1,0x70,str1 ) ;
   }
{  short key1,key2 ;
   s_getch( &key1,&key2 );

}
   s_restore( ) ;
}
/***************************************************************************/
//                          Выдать сообщение
/***************************************************************************/
void message( char *str )
{  short i,j,x,y,y_i,n_str,l_str,r1,sx,sy ;
   char str1[80] ;

   j=0 ; l_str=0 ;
   for( n_str=1,i=0 ; i<512 ; i++ )
   {   if( str[i]==0 )
       {  if( i-j>l_str ) l_str=i-j ;
	  break ;
       }
       if( str[i]=='\n' )
       {  if( i-j>l_str ) l_str=i-j ;
	  n_str++ ; j=i ;
       }
   }
   s_get_size( sx, sy );
   x=sx/2-l_str/2-1 ; y=sy/2-n_str/2-2 ;
   s_rame1_F( y,x,y+n_str+1,x+l_str+2,0x70 ) ;
   for( y_i=0,r1=0 ; y_i<n_str ; y_i++ )
   {   for( i=r1,j=0 ; i<512 ; i++ )
       {   if( str[i]==0 || str[i]=='\n' ){  str1[j]=0 ; r1=i+1 ; break ;  }
	   str1[j++]=str[i] ;
       }
       s_text_yxf( y+y_i+1,x+1,0x70,str1 ) ;
   }
   s_redraw();
   s_refresh();
}
/***************************************************************************/
/*                   Задать вопрос и получить ответ                        */
/***************************************************************************/
short fragen( char *str )
{  short i,j,x,y,y_i,n_str,l_str,r1,ret ;
   short taste1,taste2 ;
   char  str1[80] ;

   j=0 ; l_str=0 ;
   for( n_str=1,i=0 ; i<512 ; i++ )
   {   if( str[i]==0 )
       {  if( i-j>l_str ) l_str=i-j ;
	  break ;
       }
       if( str[i]=='\n' )
       {  if( i-j>l_str ) l_str=i-j ;
	  n_str++ ; j=i ;
       }
   }
   x=38-l_str/2 ; y=12-n_str/2 ;
   s_save( y,x,y+n_str+1,x+l_str+2 ) ;
   s_rame1_F( y,x,y+n_str+1,x+l_str+2,0x70 ) ;
   for( y_i=0,r1=0 ; y_i<n_str ; y_i++ )
   {   for( i=r1,j=0 ; i<512 ; i++ )
       {   if( str[i]==0 || str[i]=='\n' ){  str1[j]=0 ; r1=i+1 ; break ;  }
	   str1[j++]=str[i] ;
       }
       s_text_yxf( y+y_i+1,x+1,0x70,str1 ) ;
   }

M1:s_getch( &taste1,&taste2 );
   switch( taste1 )
   {  case '1': ret = 1 ; break ;
      case '0': ret = 0 ; break ;
      case S_key_Esc: ret = S_key_Esc ; break ;
      default : goto M1 ;
   }
   s_restore( ) ;

   return ret ;
}
/***************************************************************************/
/*                            Ввести строку                                */
/***************************************************************************/
e_WinMsg kommand_yxf( short y, short x, char f, char *str, short lenght, char EIN,
		   char **str1, short n_str1 )
{  short i,p=0,key1,key2,REG=1,L ;
   char alt_str[80] ;

strcpy( alt_str,str ) ;
L=strlen( str ) ;

while( 1==1 )
{
   s_text_yxf1( y,x,f,str ) ;
   s_text_yxf( y,x+L+2,f,emptystr(lenght-L-2) ) ;
   s_goto_xy( y,x+p+1 );

   s_getch( &key1,&key2 );
   if( key1==0 )
   {   switch(key2)
       {  case S_key_Left : if( p>0 ) p-- ; break ;
	  case S_key_Right: if( p<L && str[p+1]!=0 ) p++ ; break ;
	  case S_key_Up   : if( (EIN&0x01)==0 ) break ;
			    return WM_PREV ;
	  case S_key_Down : if( (EIN&0x01)==0 ) break ;
			    return WM_NEXT ;
	  case S_key_Del  :
		    if( str[p]==0 || p>=L ) break ;
		    for( i=p ; i<L && str[i]!=0 ; i++ )
		       str[i]=str[i+1] ;
		    str[L]=0 ; L-- ; break ;
	  case S_key_Ins :
		    if(REG==0) {  REG=1 ;  }
		       else    {  REG=0 ;  }
		    break ;
	  case S_key_Home: p=0 ; break ;
	  case S_key_End:
		   for( p=0 ; str[p]!=0 && p<lenght ; p++ ) ;
		   for( p=p-1; str[p-1]==' ' ; p-- ) ;
		   /*if( str[p]==0 ){ str[p]=' '; str[p+1]=0 ; }*/
		   break ;
	  case S_key_F1:
		   if( (EIN&0x02)==0 )
		       return WM_HELP ;
		   else
		   {   short i ;
		       i=kommand_yxf1( y,x,str1,n_str1 );
		       if( 0<=i )
		       {  strcpy( str,str1[i] );
			  L=strlen( str );
		       }
		       break ;
		   }
	 default: ;
       }
   }
   else
   {  switch( key1 )
      {  case  8: if(p>0)
    /* Zuruck  */ {  for( i=(--p) ; i<L && str[i]!=0 ; i++ )
		       str[i]=str[i+1];
		     L-- ;
		  }  break ;
	 case '\r': goto AUSGANG ;
	 case S_key_Esc:
		  strcpy( str,alt_str ) ;
		  return WM_ESC ;
	 default: if( REG==1 )
		  {  if( L<lenght )
		     {   for( i=L ; i>=p ; i-- ) str[i+1]=str[i] ;
			 str[p]=(char )key1 ; p++ ; L++ ;
		     }else
		     if( p<lenght )
		     {   for( i=lenght-2 ; i>=p ; i-- ) str[i+1]=str[i] ;
			 str[p]=(char )key1 ; p++ ;
		     }
		  }
		  if( REG==0 && p<lenght )
		  {   str[p]=(char )key1 ;
		      if( p>=L ){ str[p+1]=0 ; L=p+1 ; }
		      p++ ;
		  }
       }
   }
}
AUSGANG:
return WM_OK ;
}
/***************************************************************************/

/***************************************************************************/
short kommand_yxf1( short y, short x, char **str, short n_str )
{  short i,PY=0 ;
   short key1,key2 ;
   char  c ;

   s_save(    y,x,y+n_str+1,x+40 ) ;
   s_rame1_F( y,x,y+n_str+1,x+40,0x70 ) ;

   while( 1 )
   {
      for( i=0 ; i<n_str ; i++ )
      {   if( i==PY ) c=v_curs_Color ;
	      else    c=v_menu_Color ;
	  s_text_yxf( y+i+1,x+1,c,emptystr(38) ) ;
	  s_text_yxf( y+i+1,x+1,c,str[i] ) ;
      }
      s_getch( &key1,&key2 );
      if( key1==0 )
      {   switch( key2 )
	  {   case S_key_Up   :
		   PY-- ; if( PY<0  ) PY=n_str-1 ;
		   break ;
	      case S_key_Down :
		   PY++ ; if( n_str<PY ) PY=0 ;
		   break ;
	  }
      }
      else
      {   switch( key1 )
	  {
	     case '\r':      goto Ende ;
	     case S_key_Esc: PY=-1 ; goto Ende ;
	  }
      }
   }
   Ende:
   s_restore( );
   return PY ;
}