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