/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Простенький такой текстовый редактор // Анисимов Д.В. сегодня /***************************************************************************/ # include <string.h> # include "mylib.h" # include "video.h" # include "resource.h" # include "color.h" # include "face.h" # include "edit.h" # include "menu.h" # define size_Tab 8 # define max_Length 1000000L # define max_Clip 100000L t_KeyWord KeyWord1[]= { { "\\@=",3, "}" ,1, 0x0e }, { "\\@@",3, "" ,0, 0x0a }, { "\\##",3, "" ,0, 0x0a }, { "{" ,1, "" ,0, 0x0a }, { "}" ,1, "" ,0, 0x0a } } ; /* ------------------------ все, что относится к режиму поиска и замены -- */ class t_Find { public : char sfind[256] ; // строка, которую надо найти char sreplace[256] ;// строка, на которую надо заменить char xlat[256] ; // соответствие больших и маленьких букв char Mass[2560] ; // предыдущие поиски char *prev_find[10] ;// предыдущие поиски char fxlat, fcontinue, fdirect, // направление поиска falles ; t_Find( void ); void opt( void ); void flag( short punkt ); } ; void set_cursor( int Reg ); char *emptystr( short n ); char str_recht( char *str ); static t_Find Find ; t_Resource Resource ; static char *Clip=NULL ; // клипборд, радактор все-таки static long l_Clip=0 ; // текущая длинна клипборда static char f_Clip=0 ; // признак, что в буфере больше одной строки /***************************************************************************/ /* */ /***************************************************************************/ void t_Edit :: begin( void ) { x1=1 ; x2=78 ; y1=2 ; y2=n_Line-2 ; size_y=y2-y1 ; size_x=x2-x1 ; Begin_X=0 ; PX=0 ; PY=0 ; otm1=0 ; otm2=-1 ; Otm1=0 ; Otm2=-1 ; str1=0 ; str2=-1 ; Str1=0 ; Str2=-1 ; REG =0 ; Flag_b=0 ; if( Clip==NULL ) Clip=(char *)Calloc( max_Clip,1 ); strcpy( Str,emptystr(255) ); KeyWord=NULL ; n_KeyWord=0 ; set_keyword( KeyWord1, 5 ); } /***************************************************************************/ e_WinMsg t_Edit :: main( void ) { short ZZ,key1,key2 ; /* нажатая клавиша */ e_WinMsg r ; null_menu( ) ; while( 1 ) { paint_main( ); s_getch( &key1,&key2 ) ; ZZ=s_shiftstatus(); r=loop( ZZ,key1,key2 ); if( r!=WM_NULL1 ) return r ; } /* while */ } /***************************************************************************/ e_WinMsg t_Edit :: loop( short ZZ, short key1, short key2 ) { short Funk,r ; old_PY = PY ; Funk=Resource.translate( ZZ,key1,key2 ); { short f ; f=hot_key( Funk ) ; if( 0==f || f==1 ) goto M1 ; } if( (ZZ & (S_Shift_L|S_Shift_R) ) != 0 ) { /* ---- если нажат Shift ---- */ if( Flag_b==0 ) { Flag_b=1 ; str2=str1=PY ; otm2=otm1=PX ; } } switch( Funk ) { case 0 : switch( key1 ) { case '\r': if( fview==1 ) { short i,j=0 ; for( i=PX ; 0<=i && Str[i]!=2 ; i-- ) if( Str[i]==1 ) goto M_No_Link ; if( i<0 ) goto M_No_Link ; for( i++ ; i<256 && Str[i]!=1 ; i++ ) Buf[j++]=Str[i] ; Buf[j]=0 ; init( HelpData.get_help( Buf ) ); Begin_Y=Begin_X=PY=old_PY=PX=0 ; return WM_NULL1 ; M_No_Link : break ; } PX=key_WK( ) ; break ; case S_key_Esc: if( fview==1 ) return WM_ESC ; prepare_text( ) ; r=menu( ) ; null_menu( ) ; if( r!=0 ) return int_to_msg( r ); break ; case 0 : break ; default : if( fview==1 ) break ; if( REG==0 ) insert_str1( PX,key1 ) ; else Str[PX]=(char)key1 ; if(PX<255) PX++ ; break ; case S_key_Back: if( fview==1 ) break ; if( PX>0 ) delet_str1( --PX ) ; break ; } break ; case F_Menu: if( fview==1 ) return WM_ESC ; prepare_text( ) ; r=menu( ) ; null_menu( ) ; if( r!=0 ) return int_to_msg( r ); break ; /*------------ обработка СТРЕЛОК -------------*/ case F_MLeft : if(PX>0 ) { PX--; otm2=PX; } break ; case F_MRight : if(PX<255) { PX++; otm2=PX; } break ; case F_MUp : if( PY>0 ) PY-- ; goto M_key1 ; case F_MDown : if( PY<Text->str_Txt-1 ) PY++ ; M_key1 : str2=PY ; otm1=otm2=0 ; break ; case F_MHome : PX=beg_str(); goto M_key2 ; case F_MEnd : PX=end_str() ; M_key2 : otm2=PX ; break ; case F_MPageUp: PY=max( PY-size_y,0 ) ; goto M_key3 ; case F_MPageDown: PY=min( PY+size_y,Text->str_Txt-1 ) ; M_key3 : str2=PY ; otm1=otm2=0 ; break ; case F_Paste : if( fview==1 ) break ; if( f_Clip ) { Text->put_text1( PY, Clip,l_Clip ); Text->get_str( PY,Str ); } else { insert_str( PX ) ; } break ; case F_Cat : case F_Copy : if( fview==1 ) break ; if( Str1<Str2 ) { if( Funk==F_Cat ) l_Clip=Text->get_text1( Str1,Str2, Clip ); else l_Clip=Text->get_text2( Str1,Str2, Clip ); f_Clip=1 ; str2=str1 ; PY=min( Str1,Text->str_Txt-1 ); Text->get_str( PY,Str ); old_PY = PY ; } else { if( Funk==F_Cat ) delet_str( Otm1,Otm2 ) ; else delet_str( Otm1,Otm2,1 ) ; otm2=otm1 ; PX=Otm1 ; f_Clip=0 ; } break ; case F_IncCopy : if( fview==1 ) break ; if( Str1<Str2 ) { l_Clip=Text->get_text2( Str1,Str2, Clip ); str2=str1 ; } else { for( short i=Otm1 ; i<=Otm2 ; i++ ) Clip[l_Clip++]=Str[i] ; Clip[l_Clip++]='\n' ; otm2=otm1 ; } break ; case F_BeginText : PY=0 ; break ; case F_EndText : PY=Text->str_Txt-1 ; break ; case F_ShiftLeft : if( fview==1 ) break ; str_shift(-1) ; break ; case F_ShiftRight: if( fview==1 ) break ; str_shift( 1) ; break ; case F_Left : if( PX>0 ) PX-- ; break ; case F_Right : if( PX<255 ) PX++ ; break ; case F_Up : if( PY>0 ) PY-- ; break ; case F_Down : if( PY<Text->str_Txt-1 ) PY++ ; break ; case F_Delete : if( fview==1 ) break ; if( 0==char_exist( PX ) ) key_Delet( ) ; else delet_str1( PX ) ; break ; case F_Insert : if(REG==0){ REG=1 ; } else{ REG=0 ; } break ; case F_Home : PX=beg_str() ; break ; case F_End : PX=end_str(); break ; case F_PageUp : PY=max( PY-size_y,0 ) ; break ; case F_PageDown : PY=min( PY+size_y,Text->str_Txt-1 ) ; break ; } /* switch(key1) */ if( ZZ==0 ) { if( Flag_b==1 ) { Flag_b=0 ; str2=str1 ; Str2=Str1-1 ; otm2=otm1 ; Otm2=Otm1-1 ; } } if( (ZZ & (S_Shift_L|S_Shift_R) ) != 0 || Funk==F_Copy ) { Otm1=min(otm1,otm2) ; Otm2=max(otm1,otm2) ; Str1=min(str1,str2) ; Str2=max(str1,str2) ; goto M1 ; } M1 : raden_Y( PY ) ; raden_X( PX ) ; return WM_NULL1 ; } /***************************************************************************/ void t_Edit :: paint_main( void ) { char s1[10] ; s_rame1_F( y1-1,x1-1,y2+1,x2+1,red_rame_Color ); s_text_yxf( y1-1,x1+10,0x07,Name ); if( Str1<Str2 ) { paint( Str1,Str2 ) ; Otm1=0 ; Otm2=255 ; } else { paint( 1,0 ) ; } paint_current( Otm1,Otm2 ) ; sprintf( s1,"%4ld:%3d",PY,PX ); s_text_yxf( n_Line-1,70,0x70,s1 ) ; if( REG==0 ) s_text_yxf( n_Line-1,1,0x70," F10 меню <Вставка> " ) ; else s_text_yxf( n_Line-1,1,0x70," F10 меню <Замена > " ) ; // ------- вот тут этот курсор --------- uchar t[2]={ 0x1f,0x1f }; s_color_yxt( y1+PY-Begin_Y,x1+PX-Begin_X,t,"0" ); s_goto_xy( y1+PY-Begin_Y,x1+PX-Begin_X ); } /***************************************************************************/ // нарисовать все строчки /***************************************************************************/ void t_Edit :: paint( long _Otm1, long _Otm2 ) { short i ; char f,*Str3 ; if( fview==0 ) { uchar t[2]={0x0a,0xa0 }; short i1 ; for( i=0 ; i<=size_y ; i++ ) { if( _Otm1<=Begin_Y+i && Begin_Y+i<=_Otm2 ) f=buf_Color ; else f=text_Color ; if( Begin_Y+i==PY ) Str3=Str ; else Str3=Text->get_str( Begin_Y+i,Buf ); s_text_yxfl( y1+i,x1,f,x2-x1+1,Str3+Begin_X ); if( Text->fformat ) set_string_color( Str3, x1, y1+i ); } } else { short i1,xx1,z,begin,end ; for( i=0 ; i<=size_y ; i++ ) { Str3=Text->get_str( Begin_Y+i,Buf ); s_text_yxfl( y1+i,x1,help_Color,x2-x1+1,Str3+Begin_X ); for( i1=0 ; i1<256 ; i1++ ) { if( Str3[i1]==2 ) { z=i1+1 ; f=link_Color ; Str3[i1]=' '; } if( Str3[i1]==3 ) { z=i1+1 ; f=bold_Color ; Str3[i1]=' '; } if( Str3[i1]==1 ) { Str3[i1]=' '; if( z<Begin_X+x2-x1 && Begin_X<i1 ) { begin=max( z-1 , Begin_X ); end =min( i1+1, Begin_X+x2-x1 ); xx1=begin-Begin_X ; s_text_yxfl( y1+i,x1+xx1,f,end-begin,Str3+begin ); } } } } } } /***************************************************************************/ // нарисовать одну (текущую) строчку /***************************************************************************/ void t_Edit :: paint_current( short _Otm1, short _Otm2 ) { short x11,L,i_Str ; uchar f ; if( fview==1 ) return ; i_Str=PY-Begin_Y ; s_text_yxfl( y1+i_Str,x1,text_Color,x2-x1+1,Str+Begin_X ); x11=x1+_Otm1-Begin_X ; L=min( _Otm2-_Otm1,x2-x11+1 ); if( fview==1 ) f=help_Color ; else f=buf_Color ; s_text_yxfl( y1+i_Str,x11,f,L,Str+_Otm1 ); if( Text->fformat ) set_string_color( Str, x1, y1+i_Str ); } /***************************************************************************/ void t_Edit :: set_string_color( char *_Str, short _x1, short y ) { short i,i1,i2,L ; char StrC[256] ; uchar t[2] ; for( i=0 ; i<256 ; i++ ) StrC[i]='0' ; for( i=Begin_X ; i<256 ; i++ ) { for( i1=0 ; i1<n_KeyWord ; i1++ ) { if( 0==strncmp( _Str+i,KeyWord[i1].Begin,KeyWord[i1].l_Begin )) { t[0]=KeyWord[i1].f ; if( KeyWord[i1].End[0]==0 ) L=KeyWord[i1].l_Begin ; else { L=256-i ; for( i2=i+1 ; i2<256 ; i2++ ) if( 0==strncmp( _Str+i2,KeyWord[i1].End,KeyWord[i1].l_End )) { L=i2-i ; break ; } } StrC[L]=0 ; s_foreground_yxt( y,_x1+i-Begin_X,t,StrC ); StrC[L]='0' ; } } } } /***************************************************************************/ void t_Edit :: str_shift( char R ) { long i,py ; char *S ; if( Str1<Begin_Y || Begin_Y+size_y<=Str2 ) return ; for( py=Str1 ; py<=Str2 ; py++ ) { S=Text->get_str( py-Begin_Y,Buf ); if( 0<R ) { for( i=255 ; 0<i ; i-- ) S[i]=S[i-1] ; S[0]=' '; } else { for( i=0 ; i<255 ; i++ ) S[i]=S[i+1] ; S[255]=' '; } Text->put_str_istr( py,Buf ); } Text->get_str( PY,Str ); } /***************************************************************************/ void t_Edit :: delet_str1( short px ) { short i ; for( i=px ; i<255 ; i++ ) Str[i]=Str[i+1] ; Str[255]=' '; } /***************************************************************************/ void t_Edit :: insert_str1( short px, short key ) { short i ; for( i=255 ; px<i ; i-- ) Str[i]=Str[i-1] ; Str[px]=(char )key ; } /***************************************************************************/ short t_Edit :: beg_str( void ) { short i ; for( i=0 ; i<255 ; i++ ) if( Str[i]!=' ') return i ; return 0 ; } /***************************************************************************/ short t_Edit :: end_str( void ) { short i ; for( i=255 ; 0<=i ; i-- ) if( Str[i]!=' ') return i+1 ; return 0 ; } /***************************************************************************/ short t_Edit :: char_exist( short px ) { short i ; for( i=px ; i<256 ; i++ ) if( Str[i]!=' ' ) return 1 ; return 0 ; } /***************************************************************************/ /* */ /***************************************************************************/ short t_Edit :: hot_key( short Taste ) { switch( Taste ) { case F_FindForward : find( 0 ); return 1 ; case F_FindBackward : find( 1 ); return 1 ; case F_Find : find1( ); return 1 ; case F_GoToLine : goto_str(); return 1 ; case F_Replace : replace( ); return 1 ; } return -1 ; } /***************************************************************************/ e_WinMsg t_Edit :: int_to_msg( short i ) { switch( i ) { case '1' : return WM_EDIT1 ; case '2' : return WM_EDIT2 ; case '3' : return WM_FIRST ; case '4' : return WM_SRC ; case '5' : return WM_DST ; case '6' : return WM_DEBUG ; case 'b' : return WM_PATH ; case 'c' : return WM_PATH2 ; case 'd' : return WM_ADD_WORD ; case '7' : return WM_GRAMMAR ; case '8' : return WM_SLOWO ; case '9' : return WM_BASE ; } return WM_NULL1 ; } /***************************************************************************/ void t_Edit :: prepare_text( void ) { Text->put_str_istr( PY,Str ); } /***************************************************************************/ void t_Edit :: get_str( void ) { Text->get_str( PY,Str ); } /***************************************************************************/ void t_Edit :: raden_y3( ) { if( PY<Begin_Y ) Begin_Y=PY ; if( Begin_Y+(y2-y1)<PY+3 ) Begin_Y=PY+3-(y2-y1) ; } /***************************************************************************/ short t_Edit :: raden_Y( long _PY ) { if( _PY==old_PY ) return 0 ; Text->put_str_istr( old_PY,Str ); Text->get_str( _PY,Str ); if( _PY<Begin_Y ) Begin_Y=_PY ; if( Begin_Y+(y2-y1)<_PY ) Begin_Y=_PY-(y2-y1) ; return 1 ; } /***************************************************************************/ /***************************************************************************/ short t_Edit :: raden_X( short px ) { if( px<Begin_X ) { Begin_X=px ; return 1 ; } if( px>=Begin_X+size_x ) { Begin_X=max(0,px-size_x) ; return 1 ; } return 0 ; } /***************************************************************************/ short t_Edit :: key_WK( void ) { short ret_x ; ret_x=beg_str() ; if( PX<ret_x ) ret_x=PX ; if( size_y<=PY-Begin_Y ) Begin_Y++ ; Str[255]=0 ; Text->insert_str( PY ); strcpy( Buf,emptystr(ret_x) ); strncpy( Buf+ret_x,Str+PX,256-PX ); Text->put_str_istr( PY+1, Buf ); Str[PX]=0 ; Text->put_str_istr( PY, Str ); PY++ ; Text->get_str( PY,Str ); old_PY=PY ; return ret_x ; } /***************************************************************************/ void t_Edit :: key_Delet( void ) { short i,px1 ; Text->get_str( PY+1,Buf ); for( px1=0 ; px1<256 ; px1++ ) if( Buf[px1]!=' ' ) break ; if( px1==256 ) px1=0 ; for( i=0 ; PX+i<256 ; i++ ) Str[PX+i]=Buf[px1+i] ; Text->delete_str( PY+1 ); } /***************************************************************************/ void t_Edit :: delet_str( short _Otm1, short _Otm2, char f ) { short i,j ; l_Clip=_Otm2-_Otm1 ; for( i=0 ; i<l_Clip ; i++ ) Clip[i]=Str[_Otm1+i] ; if( f==0 ) { for( j=_Otm1,i=_Otm2 ; i<256 ; i++ ) Str[j++]=Str[i] ; for( ; j<256 ; j++ ) Str[j]=' ' ; } f_Clip=0 ; } /***************************************************************************/ void t_Edit :: insert_str( short px ) { short i,L ; L=(short)l_Clip ; for( i=255 ; px+L<=i ; i-- ) Str[i]=Str[i-L] ; for( i=0 ; i<L ; i++ ) Str[px+i]=Clip[i] ; } /***************************************************************************/ void t_Edit :: goto_str( void ) { short i ; char Name1[40]="" ; s_save( 10,15,14,65 ) ; s_rame1_F( 10,15,14,65,h_menu_Color ) ; s_text_yxf( 11,20,h_menu_Color,"Введите номер строки" ) ; s_text_yxf( 12,20,h_curs_Color,emptystr( 40 ) ) ; if( WM_OK!=kommand_yxf( 12,20,h_curs_Color,Name1,40,0 ) ) return ; for( i=0 ; i<8 && Name1[i]!=0 ; i++ ) if( Name1[i]<'0' || '9'<Name1[i] ) goto M_Err ; if( i==0 || 6<i ) goto M_Err ; PY=atoi( Name1 ); M_Err: s_restore( ) ; } /***************************************************************************/ char t_Edit :: find1( void ) { char *S1 ; S1=Find.sfind ; if( Otm1<Otm2 ) { strncpy( S1,Str+Otm1,Otm2-Otm1 ); S1[Otm2-Otm1]=0 ; Otm2=Otm1-1 ; } else S1[0]=0 ; Find.opt( ); return find(0); } /***************************************************************************/ /* повторный поиск */ /***************************************************************************/ char t_Edit :: find( char Richt ) { short i,y,px,px1,py,size,L,n_Str ; char *S ; t_Find *f ; char strtmp[256] ; f=&Find ; if( f->sfind[0]==0 ) Find.opt( ); size = strlen( f->sfind ) ; if( size==0 ) return 0 ; n_Str=Text->str_Txt ; if( f->fxlat==1 ) { for( i=0 ; i<size ; i++ ) strtmp[i] = f->xlat[(uchar)(f->sfind[i])] ; } else strcpy( strtmp,f->sfind ); for( y=0 ; y<n_Str ; y++ ) { if( Richt==0 ) py=PY+y ; else py=PY-y ; if( py>=n_Str ) if( f->fcontinue!=0 ) py-=n_Str ; else break ; if( py<0 ) if( f->fcontinue!=0 ) py+=n_Str ; else break ; S = Text->get_str( py ) ; for( i=0 ; i<256 ; i++ ) if( S[i]==0 || S[i]=='\n' ) break ; L=i ; if( y==0 ) px=PX+1 ; else px=0 ; for( ; px+size<L ; px++ ) { if( f->fxlat==1 ) { for( i=0 ; i<size ; i++ ) if( f->xlat[(uchar)S[px+i]] != strtmp[i] ) goto M1 ; } else { for( i=0 ; i<size ; i++ ) if( S[px+i] != strtmp[i] ) goto M1 ; } for( i=0,px1=0 ; i<px ; i++ ) if( S[i]=='\t' ) px1+=size_Tab-1 ; PY=py ; PX=px+px1 ; return 1 ; M1: ; } } figna("Строка не найдена"); return 0 ; } /***************************************************************************/ void t_Edit :: replace( void ) { t_Find *f ; char r ; short taste,L ; f=&Find ; Find.opt( ); if( f->sfind[0]==0 || f->sreplace[0]==0 ) return ; L=strlen( f->sfind ); while( 1 ) { old_PY=PY ; r=find( f->fdirect ); if( r==0 ) break ; raden_Y( PY ); raden_X( PX ); if( f->falles==0 ) { Otm1=PX ; Otm2=PX+L ; paint_main( ); M3: taste=fragen( "Менять ? (1-Да 0-Нет Esc-Выход)"); switch( taste ) { case S_key_Esc: goto M1 ; case 1: break ; case 0: goto M2 ; default : goto M3 ; } } replace1( ); M2: ; } M1: old_PY=PY ; Otm1=0 ; Otm2=-1 ; } /***************************************************************************/ void t_Edit :: replace1( void ) { char *s,Buf1[256] ; short i,l1,l2,d ; t_Find *f ; f=&Find ; s=Text->get_str( PY ); for( i=0 ; i<256 ; i++ ) { if( s[i]==0 || s[i]=='\n' ) { Buf1[i]=0 ; break ; } Buf1[i]=s[i] ; } l1 = strlen( f->sfind ); l2 = strlen( f->sreplace ); d = l2-l1 ; if( d>0 ) for( i=256-d-1 ; PX<=i ; i-- ) Buf1[i+d] = Buf1[i] ; for( i=0 ; i<l2 ; i++ ) Buf1[PX+i] = f->sreplace[i] ; if( d<0 ) { for( i=PX+l2 ; i<256-l2 ; i++ ) Buf1[i] = Buf1[i-d] ; for( i=256-d-1 ; i<256 ; i++ ) Buf1[i] = ' ' ; } Text->put_str_istr( PY,Buf1 ); Text->get_str( PY,Str ); } /***************************************************************************/ void t_Edit :: set_text( t_Text *_Text ) { PX=0 ; PY=0 ; Text=_Text ; Text->get_str( PY,Str ); } /***************************************************************************/ void t_Edit :: init( char *_Text ) { Text->init( _Text ); PX=0 ; PY=0 ; Text->get_str( PY,Str ); } /***************************************************************************/ void t_Edit :: set_view( char f ) { fview=f ; } /***************************************************************************/ char t_Resource :: translate( short shift, short key1, short key2 ) { if( shift==0 ) { switch( key1 ) { case 0: switch( key2 ) { case S_key_Ins : return F_Insert ; case S_key_Del : return F_Delete ; case S_key_Home : return F_Home ; case S_key_End : return F_End ; case S_key_PgUp : return F_PageUp ; case S_key_PgDn : return F_PageDown ; case S_key_Left : return F_Left ; case S_key_Right: return F_Right ; case S_key_Up : return F_Up ; case S_key_Down : return F_Down ; case S_key_F10 : return F_Menu ; } break ; } } if( (shift&(S_Shift_L|S_Shift_R))!=0 ) { switch( key1 ) { case 0: switch( key2 ) { case S_key_Ins : return F_Paste ; case S_key_Del : return F_Cat ; case S_key_Home : return F_MHome ; case S_key_End : return F_MEnd ; case S_key_PgUp : return F_MPageUp ; case S_key_PgDn : return F_MPageDown ; case S_key_Left : return F_MLeft ; case S_key_Right: return F_MRight ; case S_key_Up : return F_MUp ; case S_key_Down : return F_MDown ; } break ; } } if( (shift&(S_Ctrl_L|S_Ctrl_R))!=0 ) { switch( key1 ) { case 0: switch( key2 ) { case S_key_Left : return F_PrevFrasa ; case S_key_Right: return F_NextFrasa ; } break ; } } return F_Nop ; } /***************************************************************************/ t_Find :: t_Find( void ) { short i ; char *x=xlat ; for( i=0 ; i<256 ; i++ ) { sfind[i]=0 ; sreplace[i]=0 ; } for( i=0 ; i<2560 ; i++ ) Mass[i]=0 ; for( i=0 ; i<10 ; i++ ) prev_find[i]=Mass+i*256 ; for( i=0 ; i<256 ; i++ ) xlat[i]=(char )i ; for( i=(uchar)'A' ; i<=(uchar)'Z' ; i++ ) xlat[i]=(char )(i+32) ; x[(uchar)'А']='а'; x[(uchar)'Б']='б'; x[(uchar)'В']='в'; x[(uchar)'Г']='г'; x[(uchar)'Д']='д'; x[(uchar)'Е']='е'; x[(uchar)'Ж']='ж'; x[(uchar)'З']='з'; x[(uchar)'И']='и'; x[(uchar)'Й']='й'; x[(uchar)'К']='к'; x[(uchar)'Л']='л'; x[(uchar)'М']='м'; x[(uchar)'Н']='н'; x[(uchar)'О']='о'; x[(uchar)'П']='п'; x[(uchar)'Р']='р'; x[(uchar)'С']='с'; x[(uchar)'Т']='т'; x[(uchar)'У']='у'; x[(uchar)'Ф']='ф'; x[(uchar)'Х']='х'; x[(uchar)'Ц']='ц'; x[(uchar)'Ч']='ч'; x[(uchar)'Ш']='ш'; x[(uchar)'Щ']='щ'; x[(uchar)'Ь']='ь'; x[(uchar)'Ы']='ы'; x[(uchar)'Ъ']='ъ'; x[(uchar)'Э']='э'; x[(uchar)'Ю']='ю'; x[(uchar)'Я']='я'; fxlat = 0 ; fcontinue = 0 ; fdirect = 0 ; falles = 0 ; } /***************************************************************************/ void t_Find :: opt( void ) { t_Find Alt ; short x0,punkt=0,key1,key2 ; x0=(s_get_sx( )-56)/2 ; s_save( 4,x0,10,x0+56 ) ; s_rame1_F( 4,x0,10,x0+56,v_menu_Color ) ; s_text_yxf( 5,x0+1,v_menu_Color,"Найти :" ) ; s_text_yxf( 6,x0+1,v_menu_Color,"Заменить на:" ) ; Alt=*this ; while( 1 ) { x0=(s_get_sx( )-56)/2 ; { short l1,l2 ; s_text_yxf1( 5,x0+12,v_menu_Color,sfind ) ; s_text_yxf1( 6,x0+12,v_menu_Color,sreplace ) ; l1=strlen(sfind); l2=strlen(sreplace); s_text_yxf( 5,x0+14+l1,v_menu_Color,emptystr(37-l1) ) ; s_text_yxf( 6,x0+14+l2,v_menu_Color,emptystr(37-l2) ) ; } flag( punkt ) ; key1=WM_NULL1 ; if( punkt==0 ) key1=kommand_yxf( 5,x0+12,v_curs_Color,sfind ,39,3,prev_find,10 ) ; if( punkt==1 ) key1=kommand_yxf( 6,x0+12,v_curs_Color,sreplace,39,1 ) ; switch( key1 ) { case WM_OK : { short i ; for( i=9 ; 0<i ; i-- ) strcpy( prev_find[i],prev_find[i-1] ); strcpy( prev_find[0],sfind ); } case WM_ESC : key2=0 ; break ; case WM_NEXT : key2=S_key_Down ; key1=0 ; break ; case WM_PREV : key2=S_key_Up ; key1=0 ; break ; case WM_NULL1 : s_getch( &key1,&key2 ) ; break ; } switch( key1 ) { case 0 : switch( key2 ) { case S_key_Up : if(punkt<=0) punkt=4 ; else punkt-- ; break ; case S_key_Down : if(punkt>=4) punkt=0 ; else punkt++ ; break ; } break ; case '\r' : s_restore( ) ; if( !str_recht(sfind) ) *this=Alt ; return ; case S_key_Esc : s_restore( ) ; *this=Alt ; return ; case ' ' : switch( punkt ) { case 2 : fxlat = !fxlat ; break ; case 3 : falles = !falles ; break ; case 4 : fdirect = !fdirect ; break ; } break ; } } } /***************************************************************************/ void t_Find :: flag( short punkt ) { char f ; short x0 ; x0=(s_get_sx( )-56)/2 ; if( punkt==2 ) f=v_curs_Color ; else f=v_menu_Color ; s_text_yxf( 7,x0+1,f,"[ ] Различать большие и малые" ) ; if( fxlat==0 ) s_text_yxf( 7,x0+2,f,"X" ) ; if( punkt==3 ) f=v_curs_Color ; else f=v_menu_Color ; if( falles!=0 ) s_text_yxf( 8,x0+1,f,"[ Заменить все ]" ) ; else s_text_yxf( 8,x0+1,f,"[ Найти и спросить ]" ) ; if( punkt==4 ) f=v_curs_Color ; else f=v_menu_Color ; if( fdirect==0 ) s_text_yxf( 9,x0+1,f,"[ Поиск вперед ]" ) ; else s_text_yxf( 9,x0+1,f,"[ Поиск назад ]" ) ; } /***************************************************************************/ char str_recht( char *str ) { short i ; for( i=0 ; str[i]!=0 && i<80 ; i++ ) if( str[i]!=' ' && str[i]!='\t' ) return 1 ; return 0 ; } /***************************************************************************/ void t_Edit :: find_forward( void ) { Find.opt( ); find( 0 ); } /***************************************************************************/ void t_Edit :: find_backward( void ) { Find.opt( ); find( 1 ); } /***************************************************************************/ t_Text * t_Edit :: text( void ) { return Text ; } /***************************************************************************/ void t_Edit :: set_keyword( t_KeyWord *_KeyWord, long _n_KeyWord ) { short i ; Free( KeyWord ); KeyWord=(t_KeyWord *)Calloc( _n_KeyWord,sizeof(t_KeyWord) ); for( i=0 ; i<_n_KeyWord ; i++ ) KeyWord[i]=_KeyWord[i] ; n_KeyWord=_n_KeyWord ; }