/***************************************************************************/
//              "Меркурий"-"Правда" - open source переводчик
//          распространяется в соответсвии с лицензией GNU v 2.0
//
//                  Простенький такой текстовый редактор
//     Анисимов Д.В.                                         сегодня
/***************************************************************************/

# ifndef EDIT_H
# define EDIT_H

# include <stdio.h>
# include <stdlib.h>
# include <window.h>


struct t_KeyWord
{  char Begin[32], l_Begin ;
   char End[32],   l_End ;
   char f ;
};

/* --------------------------------- образ текста в памяти --------------- */

class t_Text
{
public: // не забыть убрать это безобразие
   char     *Text ;         // участок текста хранящийся в памяти
   long      Length ;       // длинна текста, хранящегося в памяти
   long      i_str,i_pos ;  // текущая строка и ее позиция
   long      str_Txt ;      // число строк в массиве Text
   char      fformat ;      // признак "спецформата"
public:
	  t_Text( void );
	 ~t_Text( void );
   void   init( char *Text );         // инициировать текст строкой
   void   clear( void );
   void   write_file( char *name );   // записать текст в файл
   char   read_file( char *name );    // прочитать тект из файла
   char   operator [] long i );
   long   length( );
   long   str_txt( );
   long   pos_str( long i_Str );              // начало строки i_Str
   char  *get_str( long i_Str );                 // прочесть из текста строку номер i_Str
   char  *get_str( long i_Str, char *Buf );      // прочесть строку номер i_Str в буфер
   void   put_str_ipos( long i_pos, char *str ); // вставить в текст строку str
   void   put_str_istr( long i_str, char *str ); // вставить в текст строку str
   long   get_text1( long Str1, long Str2, char *List ); // вытащить из текста кусок
   long   get_text2( long Str1, long Str2, char *List ); // вытащить из текста кусок без стирания
   void   put_text1( long Str1, char *List, long l_List );
   void   put_text1p( long Pos1, long Pos2, char *List ); // вставить фразу взамен
   void   insert_str( long PY );      // вставить пустую строку
   void   delete_str( long PY );      // удалить строку PY
   short  max_length_str( void );

   char*  get_frasa( long pos );
   char*  get_word_punkt( long pos );
   void   put_frasa( long pos, char *Frasa );
   long   next_frasa( long pos );
   long   prev_frasa( long pos );
   long   begin_frasa( long pos );
   long   end_frasa( long pos );
   char   (*is_const)( char *Str ); // функция определения "слова с точкой"
   long   get_pos_xy( long py, long px );
   void   get_xy_pos( long pos1, long *_py, long *_px );
} ;

/* --------- собственно редактор ---------------------------------------- */

class t_Edit : public t_Win
{
protected:
   t_Text *Text ;
   long    Begin_Y ;       /* первая строка, видимая в окне */
   short   Begin_X ;       /* первая позиция, видимая в окне */
   short   PX ;            /* положение курсора */
   long    PY ;            /* номер редактируемой строки */
   long    old_PY ;
   short   otm1,otm2,      /* номера выделеных символов */
           Otm1,Otm2 ;     /* номера выделеных символов (упорядоченные) */
   long    str1,str2,      /* номера выделеных строк */
           Str1,Str2 ;     /* номера выделеных строк (упорядоченные) */
   char    Str[256],       /* текущая строка */
           Buf[256] ;
   char    fview ;         // если fview==1 - то запрет редактирования
   char    REG ;           /* вставка-замена */
   char    Flag_b ;        /* флаг начала работы с буфером */   
   t_KeyWord *KeyWord ;     // слова, которые выделяются другим цветом
   long      n_KeyWord ;
public :
   void     begin( void );
   e_WinMsg main( void );
   e_WinMsg loop( short ZZ, short key1, short key2 );
   void     paint_main( void );                   // отобразить текст
   void     paint( long Otm1, long Otm2 );        // отобразить текст
   void     paint_current( short Otm1, short Otm2 );// отобразить строку
   void     set_string_color( char *Str, short x1, short y );
   short    hot_key( short Taste );               // обработка быстрых клавиш
   e_WinMsg int_to_msg( short i );
   void   raden_y3( );
   short  raden_Y( long PY );                   // действия связанные со сменой текущей строки
   short  raden_X( short px );                  // действия связанные со сменой текущей колонки
   void   delet_str1( short px );               // удалить из текущей строки символ
   void   insert_str1( short px, short key );   // добавить в текущую строку символ
   void   prepare_text( void );                 // подготовка текста перед вызовом меню
   short  beg_str( void );                      // вычислить начало строки
   short  end_str( void );                      // вычислить конец строки
   short  char_exist( short px );               // есть ли в строке символы
   short  key_WK( void );                       // реакция на клавишу Enter
   void   key_Delet( void );                    // реакция на клавишу Delete
   void   delet_str( short Otm1,short Otm2,char f=0 );   // удалить текст в буфер
   void   insert_str( short px );               // вставть буфер в текущую строку
   void   insert_Buf( long PY );                // вставть буфер
   void   delet_Buf( long Pos, long Length );
   void   find_forward( void );
   void   find_backward( void );
   void   goto_str( void );                     // пойти в заданную строку
   void   str_shift( char R );                  // сдвиг несколких строчек
   char   find1( void );
   char   find( char Richt );
   void   replace( void );
   void   replace1( void );
   void   get_str( void );                      // синхронизировать Str с Текстом
   void   set_text( t_Text *Text );
   void   init( char *_Text );
   void   set_view( char f );                   // установить флаг "только чтение"
   void   set_keyword( t_KeyWord *KeyWord, long n_KeyWord );
   t_Text *text();
} ;

# endif