/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Всяко-разные отображалки // // t_Edit2 отображение первичного массива слов // t_ViewAntwort отображение вариантов перевода // t_Edit3 отображение структуры фразы // t_EditPart редактор частей речи // t_EditForm редактор грамматических форм // t_EditForm1 редактор грамматических форм (вспомогательный) // t_SlowoView отображение массива словарей // t_SlowoView1 отображение грамматических форм, присутствующих в словаре // // Анисимов Д.В. сегодня /***************************************************************************/ # include # include # include # include # include # include # include "core.h" # include "edit2.h" # include "debug.h" # include "path.h" # include "word.h" extern t_Debug Debug ; extern t_Path Path ; extern t_AddWord AddWord ; extern t_Slowo2 *SlowoT ; extern short *i_FormatT ; char *name_struct( e_Type Type, char Half, short i_struct ); void sprint_param( char *Str, short Length, short i_struct, t_Form &Form, char Halb); /***************************************************************************/ // абстрактный класс списка // /***************************************************************************/ t_SelectWin :: t_SelectWin( void ) : t_Win( ) { restart(); f_slave=0 ; } /***************************************************************************/ t_SelectWin :: ~t_SelectWin( void ) { ; } /***************************************************************************/ void t_SelectWin :: restart( void ) { Begin = 0 ; Begin_X = 0 ; PY = 0 ; } /***************************************************************************/ void t_SelectWin :: begin( void ){ ; } void t_SelectWin :: end ( void ){ ; } /***************************************************************************/ e_WinMsg t_SelectWin :: loop( void ) { short sx,sy ; short ZZ,key1,key2 ; static short sx1,sy1 ; s_get_size( sx1,sy1 ); begin(); while( 1 ) { s_get_size( sx,sy ); if( sx!=sx1 || sy!=sy1 ) { sx1=sx ; sy1=sy ; return WM_RESIZE ; } paint( ); s_getch( &key1,&key2 ) ; ZZ=s_shiftstatus(); if( 1==hot_key( ZZ,key1,key2 ) ) continue ; if( 0!=(ZZ&(S_Shift_L|S_Shift_R)) ) { switch( key2 ) { // -------------- переход в другие окна ------------ case S_key_F2 : end(); return WM_FIRST ; case S_key_F3 : return WM_SRC ; case S_key_F4 : return WM_DST ; case S_key_F5 : end(); return WM_DEBUG ; // case S_key_F6 : end(); return WM_PATH ; } } switch( key1 ) { case S_key_Back : if( f_slave==0 ){ end(); return WM_ESC ; } case S_key_Esc : end(); return WM_ESC ; case 0: { switch( key2 ) { case S_key_Up : if( PY>0 ) PY-- ; if( PY0 ) PY-- ; if( PYVariant.j<=DC.i_variant ) return ; Form0=VV->Variant[DC.i_variant].Form ; Core.antwort().make( DC.i_word,DC.i_struct,DC.i_variant,Form0 ) ; pAnt=&Core.antwort() ; if( Halb==0 ) make_vision( &Vision1, &pAnt->tree1(),0 ); else make_vision( &Vision1, &pAnt->tree2(),0 ); for( max_level=i=0 ; ij<=i_tree ) return ; if( i_tree==0 ) { Vision->j=0 ; sp=0 ; } T=&Tree->list[i_tree] ; sp++ ; V.i_tree=i_tree ; V.level =sp ; Vision->add( V ); if( IF_SELECT( T->type ) ) make_vision( Vision, Tree, T->down ); if( IF_STRUCT( T->type ) || IF_UNORDER( T->type ) ) for( i=0 ; in_down ; i++ ) make_vision( Vision, Tree, T->down+i ); sp-- ; } /***************************************************************************/ void t_Edit3 :: paint1( short i, char current ) { short i1,i_tree,z,L ; char c,*s1,*s2,Str[200],Str1[100] ; t_Tree *T ; t_Struct *S ; t_TreeList *Tree ; t_VisionList *Vision=&Vision1 ; short p1,p2 ; p1=y1+size_y/2 ; p2=x1+size_x/2 ; if( 0==Core.fn_word() || Core.variants( 0,Grammar.i_all() )->Variant.j==0 ) { // ----------- Синтаксический разбор не произведен ---------- s_rame2_F( p1-1,p2-19,p1+1,p2+19,0x70 ); s_text_yxf( p1,p2-18 ,0x70, "Синтаксический разбор не произведен" ); return ; } strcpy( Str,emptystr(199) ); if( Halb==0 ) Tree =&pAnt->tree1() ; else Tree =&pAnt->tree2() ; MaxY =Vision->j ; if( current ) c=0x70 ; else c=0x07 ; // --------- начепятать имя структуры -------------- if( MaxY<=Begin+i || Vision->j<=Begin+i ) return ; i_tree=Vision->list[Begin+i].i_tree ; T=Tree->list + i_tree ; s1=name_struct( T->type,Halb,T->i_struct ); strncpy( Str+3*Vision->list[Begin+i].level,s1,strlen(s1) ); // --------- напечатать само слово ---------------- if( T->type==TWORD || T->type==TCONST || T->type==TCONST1 ) { // в случае с TCONST1 - неряшливость if( Halb==1 ) s2=pAnt->tree2()[i_tree].Str ; else s2=Core.from()[pAnt->tree1()[i_tree].i_word].Str ; strncpy( Str+3*max_level+20,s2,strlen(s2) ); } // --------- начепятать параметры ------------------ sprint_param( Str1, 100, T->i_struct, T->Form, Halb ); z=3*max_level+40 ; L=strlen( Str1 ); L=min( L,200-z-1 ); strncpy( Str+z,Str1,L ); Str[Begin_X+size_x-2]=0 ; s_text_yxf( y1+i,x1+1,c, emptystr(size_x-1) ); s_text_yxf( y1+i,x1+1,c,Str+Begin_X ); // -------- опознать ситуацию, когда слова нет в грамматическом словаре ---- if( Halb==1 && 0<=T->i_struct ) { if( T->type==TWORD ) { short xx,l ; strcpy( Str,pAnt->tree2()[i_tree].Str1 ); s2=Str ; l=strlen(s2); if( Str[l-1]==' ' ) Str[l-1]=0 ; i1=i_FormatT[T->i_struct] ; if( 0<=i1 ) { if( 0>SlowoT[i1].word_exist( Str ) ) { xx=3*max_level+20-Begin_X ; if( xx<0 ) { if( l<=-xx ) Str[0]=0 ; else s2=Str-xx ; xx=0 ; } s_text_yxf( y1+i,x1+1+xx,0x0e,s2 ); } } } } } /***************************************************************************/ char t_Edit3 :: hot_key( short SS, short key1, short key2 ) { switch( key1 ) { case S_key_Enter : { t_EditForm EditForm( PY,Halb ); s_save( y1, x1, y2, x2 ); EditForm.set_name( "Форма слова" ); EditForm.set_pos( x1, y1, x2, y2 ); EditForm.loop( ); s_restore( ); } break ; case 0 : if( key2==S_key_F1 ) Window_help( (void *)"src.html") ; return 0 ; default : return 0 ; } return 1 ; } /***************************************************************************/ // редактор частей речи // /***************************************************************************/ t_EditPart :: t_EditPart( short i_word ) { short i,i1,j ; e_Type t ; t_Variants *VV ; for( i=j=0 ; iVariant.j ; i1++ ) { if( 99<=j ) break ; Tag[j].i_struct=i ; Tag[j].i_slowo =VV->Variant[i1].i_slowo ; Tag[j].i_slowo1=VV->Variant[i1].i_slowo1 ; Tag[j].Form =VV->Variant[i1].Form ; j++ ; } } Word= Core.from()[i_word].Str ; MaxY=j ; for( i=0 ; iName ; strncpy( Str+3,s1,strlen(s1) ); if( present[Begin+i]==1 ) Str[1]='*' ; else Str[1]=' ' ; //Str1=Perevod.translate_word_s( Word, i_struct ); Str1=Perevod.translate_word_i( Word, Tag[Begin+i].i_slowo,Tag[Begin+i].i_slowo1 ); strncpy( Str+20,Str1,strlen(Str1) ); // --------- начепятать параметры ------------------ for( i1=0,z=40 ; i1Param.j ; i1++ ) { if( Tag[Begin+i].Form.value[i1]<0 ) s1="@0" ; //НеЗадан else { short i2,i3 ; i2 = S->Param[i1].param ; i3 = Tag[Begin+i].Form.value[i1] ; s1 = Grammar.from().Param[i2].Value[i3].Name ; } strncpy( Str+z,s1,strlen(s1) ); z+=strlen(s1)+1 ; } Str[size_x]=0 ; s_text_yxf( y1+i,x1+1,c,Str ); } /***************************************************************************/ char t_EditPart :: hot_key( short SS, short key1, short key2 ) { if( key1==0 && key2==S_key_F1 ) Window_help( (void *)"first.html") ; return 0 ; } /***************************************************************************/ /* редактор грамматических форм */ /***************************************************************************/ t_EditForm :: t_EditForm( short i_tree, char Halb ) { t_Tree *T ; t_TreeList *Tree ; if( Halb==0 ) { Tree =&Core.antwort().tree1() ; T =&Tree->list[i_tree] ; SParam=&Grammar[T->i_struct].From.Param ; LParam=&Grammar.from().Param ; } else { Tree =&Core.antwort().tree2() ; T =&Tree->list[i_tree] ; SParam=&Grammar[T->i_struct].To.Param ; LParam=&Grammar.to().Param ; } MaxY=SParam->j ; value=T->Form.value ; } /***************************************************************************/ void t_EditForm :: paint1( short i, char current ) { char c,*s1,*s2,*s3,Str[200] ; if( current ) c=0x70 ; else c=0x07 ; s1=emptystr( size_x ); s_text_yxf( y1+i,x1+1 ,c, s1 ); if( MaxY<=Begin+i ) return ; t_Param *P1=&LParam->list[SParam->list[i].param] ; s2=P1->Name ; if( value[i]<0 ) s3="@0" ; else s3=P1->Value[value[i]].Name ; sprintf( Str,"%10s %10s",s2,s3 ); s_text_yxf( y1+i,x1+1 ,c, Str ); } /***************************************************************************/ char t_EditForm :: hot_key( short SS, short key1, short key2 ) { switch( key1 ) { case S_key_Enter : { t_Param *P1=&LParam->list[SParam->list[PY].param] ; t_EditForm1 EditForm1( P1,&value[PY] ); s_save( y1, x1, y2, x2 ); s_rame2_F( y1, x1, y2, x2, 0x0f ); s_text_yxf( y1, x1+3, name_Color, "Задание параметра" ); EditForm1.set_pos( x1, y1, x2, y2 ); EditForm1.loop( ); s_restore( ); } break ; default : return 0 ; } return 1 ; } /***************************************************************************/ // редактор грамматических форм (вспомогательный) // /***************************************************************************/ t_EditForm1 :: t_EditForm1( t_Param *_Param, char *_Value ) { Param = _Param ; Value = _Value ; PY = *Value ; MaxY=Param->Value.j ; } /***************************************************************************/ void t_EditForm1 :: paint1( short i, char current ) { char c,*s1 ; if( current ) c=0x70 ; else c=0x07 ; s1=emptystr( size_x ); s_text_yxf( y1+i,x1+1 ,c, s1 ); if( MaxY<=Begin+i ) return ; s_text_yxf( y1+i,x1+3 ,c, Param->Value[Begin+i].Name ); } /***************************************************************************/ char t_EditForm1 :: hot_key( short SS, short key1, short key2 ) { switch( key1 ) { case S_key_Enter : *Value=PY ; break ; default : return 0 ; } return 1 ; } /***************************************************************************/ // отображение массива словарей // /***************************************************************************/ t_SlowoView :: t_SlowoView( void ) { n_From=Grammar.from().Format.j ; MaxY =n_From+Grammar.to().Format.j ; } /***************************************************************************/ void t_SlowoView :: paint_begin( void ) { n_From=Grammar.from().Format.j ; MaxY =n_From+Grammar.to().Format.j ; s_text_yxf( y1-1,x1+3 ,name_Color, "Грамматические словари" ); paint_hotkey( n_Line-1, 0, hk_Dicts ); } /***************************************************************************/ void t_SlowoView :: paint1( short i, char current ) { char c,*s1,*s2,Str[100] ; short i_part ; if( current ) c=0x70 ; else c=0x07 ; s1=emptystr( size_x ); s_text_yxf( y1+i,x1+1 ,c, s1 ); if( MaxY<=Begin+i ) return ; if( ii_part] ; Param =&Grammar.from().Param ; } else { Format=&Grammar.to().Format[SS-n_From] ; Part =&Grammar.to().Part[Format->i_part] ; Param =&Grammar.to().Param ; } MaxY=Format->Record.j ; } /***************************************************************************/ void t_SlowoView1 :: paint_begin( void ) { char *s,Str[200]="",Str1[50] ; short i ; for( i=0 ; iParam.j ; i++ ) { if( Part->Param[i].Dir==1 ) continue ; s=Param->list[Part->Param[i].param].Name ; sprintf( Str1," %-10s",s ); strcat( Str,Str1 ); } Str[Begin_X+size_x-7]=0 ; s_text_yxf( y1-1,x1+7 ,0x0f, Str+Begin_X ); sprintf( Str,"%s( %s )",Format->Name,Part->Name ); s_text_yxf( y1-2,x1+2, name_Color,Str ); } /***************************************************************************/ void t_SlowoView1 :: paint1( short _i, char current ) { char c,*s,Str[200]="",Str1[20] ; short i,i1,v ; t_Param *P ; if( current ) c=0x70 ; else c=0x07 ; s=emptystr( size_x ); s_text_yxf( y1+_i,x1+1 ,c, s ); if( MaxY<=Begin+_i ) return ; i=Begin+_i ; sprintf( Str," %-3d",i ); for( i1=0 ; i1Param.j ; i1++ ) { if( Part->Param[i1].Dir==1 ) continue ; P=&Param->list[Part->Param[i1].param] ; v=Format->Record[i].value[i1] ; if( v<0 ) s="@0" ; else s=P->Value[ v ].Name ; sprintf( Str1," %-10s",s ); strcat( Str,Str1 ); } Str[Begin_X+size_x-2]=0 ; s_text_yxf( y1+_i,x1+3 ,c, Str+Begin_X ); } /************************************************************************/ // дать имя конструкции /************************************************************************/ char *name_struct( e_Type type, char Half, short i_struct ) { char *s1 ; if( type==TCONST ) s1="@0"; else if( type==TCONST1 ) s1="@1"; else if( type==TWORD0 ) s1="@00"; else { if( Half==0 ) s1=Grammar[i_struct].From.Name ; else s1=Grammar[i_struct].To.Name ; } return s1 ; } /************************************************************************/ // напечатать значения параметров /************************************************************************/ void sprint_param( char *Str, short Length, short i_struct, t_Form &Form, char Halb) { short i1,i2,i3 ; char *s1 ; t_Param1List *Param ; Str[0]=0 ; if( i_struct<0 ) return ; if( Halb==0 ) Param=&Grammar[i_struct].From.Param ; else Param=&Grammar[i_struct].To.Param ; for( i1=0 ; i1j ; i1++ ) { if( Form.value[i1]<0 ) s1="@0" ; // НеЗадан else { short i2,i3 ; i2 = Param->list[i1].param ; i3 = Form.value[i1] ; if( Halb==0 ) { if( i3<0 || Grammar.from().Param[i2].Value.j<=i3 ) s1="ошибка" ; else s1=Grammar.from().Param[i2].Value[i3].Name ; } else { if( i3<0 || Grammar.to().Param[i2].Value.j<=i3 ) s1="ошибка" ; else s1=Grammar.to().Param[i2].Value[i3].Name ; } } strcat( Str,s1 ); strcat( Str," "); } } DEFINE_LIST_BTYPE( t_Vision, t_VisionList )