/***************************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// Редактор, заточенный под перевод
// Анисимов Д.В. сегодня
/***************************************************************************/
# include <stdio.h>
# include <malloc.h>
# include <string.h>
# include "mylib.h"
# include "video.h"
# include "resource.h"
# include "menu.h"
# include "face.h"
# include "edit1.h"
extern t_Resource Resource
;
/***************************************************************************/
t_EditTrans :: t_EditTrans( void ) : t_Edit()
{
Name[0]=0 ;
Text=&Text1 ;
begin();
}
/***************************************************************************/
t_EditTrans :: ~t_EditTrans( void )
{
;
}
/***************************************************************************/
void t_EditTrans :: set_name( char *S )
{ strcpy(Name,S) ;
}
/***************************************************************************/
void t_EditTrans :: write( char *_Name )
{
Text->write_file( _Name );
}
/***************************************************************************/
void t_EditTrans :: read( char *_Name )
{
Text->read_file( _Name );
PX=0 ; PY=old_PY=0 ;
Text->get_str( PY,Str );
}
/***************************************************************************/
e_WinMsg t_EditTrans :: main_loop( void )
{
short ZZ,key1,key2,Funk ; /* нажатая клавиша */
e_WinMsg r ;
null_menu( );
while( 1 )
{
paint_main( );
s_getch( &key1,&key2 ) ;
ZZ=s_shiftstatus();
if( key1==S_key_TabR ) return WM_NEXT ;
if( (ZZ&(S_Shift_L|S_Shift_R))!=0 )
{ if( key2==S_key_F3 ) { set_enum ( ); continue ; }
if( key2==S_key_F4 ) { set_enum1( "множ" ); continue ; }
if( key2==S_key_F5 ) { set_enum1( "сущ" ); continue ; }
if( key2==S_key_F6 ) { set_enum1( "прил" ); continue ; }
if( key2==S_key_F7 ) { set_enum1( "глагол" ); continue ; }
if( key2==S_key_F8 ) { set_enum1( "наречие" ); continue ; }
}
else
{
if( key1==0 )
{ switch( key2 )
{ case S_key_F1 : Window_help( (void *)"edit.html") ; continue ;
// ------------ переход в другие окна ------------
case S_key_F2 : return WM_FIRST ;
case S_key_F3 : return WM_SRC ;
case S_key_F4 : return WM_DST ;
case S_key_F5 : return WM_DEBUG ;
case S_key_F6 : return WM_PATH ;
case S_key_F9 : return WM_PATH2 ;
// ------------ трансляция -----------------------
case S_key_F7 : Windows.trans( ); continue ;
case S_key_F8 : Windows.trans_frasa(); continue ;
}
}
}
r=loop( ZZ,key1,key2 );
if( r!=WM_NULL1 ) return r ;
Funk=Resource.translate( ZZ,key1,key2 );
switch( Funk )
{ /*------------ обработка СТРЕЛОК -------------*/
case 0 :
case F_Paste :
case F_Cat :
case F_IncCopy :
case F_ShiftLeft :
case F_ShiftRight:
case F_Delete : prepare_text( ); break ;
case F_PrevFrasa : Windows.prev_frasa() ; break ;
case F_NextFrasa : Windows.next_frasa() ; break ;
}
}
}
/***************************************************************************/
long t_EditTrans :: current_pos( void )
{ return Text->pos_str(PY)+PX ; }
/***************************************************************************/
char
* t_EditTrans :: get_frasa( long i )
{ return Text->get_frasa( i ); }
/***************************************************************************/
void t_EditTrans :: put_frasa( long p, char *Frasa )
{ long i,z ;
char c ;
char Strtmp[1000] ;
for( i=z=0 ; Frasa[i]!=0 ; i++ )
{ c=Frasa[i] ;
if( 80<=(i-z) && (c==' ' || c=='\t') )
Frasa[i]='\n' ;
if( Frasa[i]=='\n' ) z=i ;
}
if( 990 <strlen(Frasa) )
Frasa[990]=0 ;
if( Text1.fformat==1 )
sprintf( Strtmp,"\\@@ { %s }",Frasa );
else strcpy( Strtmp,Frasa );
Text->put_frasa( p,Strtmp );
get_str();
}
/***************************************************************************/
void t_EditTrans :: next_frasa( void )
{ long p,p1 ;
long py,px ;
old_PY = PY ;
p=current_pos();
p1=Text->next_frasa( p );
Text->get_xy_pos( p1,&py,&px );
PY=py ; PX=px ;
raden_Y( PY ) ;
raden_X( PX ) ;
raden_y3( );
}
/***************************************************************************/
void t_EditTrans :: prev_frasa( void )
{ long p,p1 ;
long py,px ;
old_PY = PY ;
p=current_pos();
p1=Text->prev_frasa( p );
Text->get_xy_pos( p1,&py,&px );
PY=py ; PX=px ;
raden_Y( PY ) ;
raden_X( PX ) ;
}
/***************************************************************************/
void t_EditTrans :: set_funk_const( char (*is_const)( char *Str ) )
{
Text1.is_const=is_const ;
}
/***************************************************************************/
void t_EditTrans :: set_enum( void )
{ short i ;
if( Otm2<=Otm1 ) return ;
for( i=255 ; Otm2<i ; i-- )
Str[i]=Str[i-1] ;
Str[Otm2]='}' ;
for( i=255 ; Otm1<i ; i-- )
Str[i]=Str[i-10] ;
strncpy( Str+Otm1,"\\@= множ {",10 );
Otm2=Otm1-1 ;
}
/***************************************************************************/
void t_EditTrans :: set_enum1( char *pStr )
{ short i,d,f,z1,z2,L ;
char Str3[100] ;
L=strlen(pStr);
if( Otm2<=Otm1 )
{ // ----Shift не нажат --------------------
// ---- находимся ли мы внутри группы ----
for( f=0,i=PX ; 0<=i ; i-- )
{ if( Str[i]=='}' ) break ;
if( Str[i]=='{' ) { f=1 ; break ; }
if( Str[i]=='\\' && Str[i+1]=='@' && Str[i+2]=='=' )
{ f=1 ; break ; }
}
if( f==1 )
{ // ------ мы внутри группы ----------
for( i=PX ; 0<=i ; i-- )
if( Str[i]=='\\' && Str[i+1]=='@' && Str[i+2]=='=' )
{ z1=i ; break ; }
for( i=z1 ; i<256 ; i++ )
if( Str[i]=='{' )
{ z2=i ; break ; }
d=L+5-(z2-z1) ;
if( 0<d )
{ for( i=255 ; z1+4+d<i ; i-- )
Str[i]=Str[i-d] ;
}
else
{ for( i=z1+4 ; i-d<256 ; i++ )
Str[i]=Str[i-d] ;
}
strncpy( Str+z1+4,pStr,L );
prepare_text( );
return ;
}
else
{ // ------ мы вне группы ----------
for( i=PX ; 0<=i ; i-- )
if( Str[i]==' ' )
{ z1=i ; break ; }
for( i=z1+1 ; i<256 ; i++ )
if( Str[i]==' ' )
{ z2=i ; break ; }
Otm1=z1+1 ; Otm2=z2 ;
}
}
// ----Shift нажат -----------------------
for( i=255 ; Otm2<i ; i-- )
Str[i]=Str[i-1] ;
Str[Otm2]='}' ;
for( i=255 ; Otm1<i ; i-- )
Str[i]=Str[i-L-6] ;
sprintf( Str3,"\\@= %s {",pStr );
strncpy( Str+Otm1,Str3,strlen(Str3) );
Otm2=Otm1-1 ;
prepare_text( );
}