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