/***************************************************************************/
// "Меркурий"-"Правда" - 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 ;
}