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

# ifndef PATH_H
# define PATH_H

# include <core.h>
# include <window.h>
# include <edit2.h>


struct t_Meaning
{
   char *Meaning ;      // смыслы t_aWord->meaning
   long  j_Meaning,
         l_Meaning ;

   t_Meaning();
  ~t_Meaning();
   long  set( char *str );
   char *get( long z );
};


struct t_pVariant
{   short  index ;        // сортировочный индекс
    short  i_down ;       // из какого потомка порожден
    t_aWordList aWord ;

    long word_to_aword( long i_word );
};

struct t_Path ;

// --------- элемент дерева поиска ------------------------

struct t_pTree
{  long   up,down,n_down ;
   long   first,last ;   // индекс первой и последней (включительно) Record, 
                         // входящих в это поддерево
   short  i_struct ;     // (пока не формируется!!!)
   short  i_aword ;      // номер aWord в искомой структуре
   short  i_last_aword ;
   short  i_slowo1 ;
   short  n_slowo ;
   char   ende ;
   char   fselect2 ;
   t_Path *Down ;       // дерево (для накопителя)
} ;


struct t_Path : public t_Win
{
   t_Path     *Up ;            // ссылка на вышестоящее дерево
   t_pVariant *Variant ;       // список вариантов перевода
   long        n_Variant ; 
   t_pTree    *Tree ;          // дерево вариантов перевода
   long        n_Tree ;   
   long        z_Tree,i_down ; // текущая вершина и "курсор потомка"
   t_aWord    *aWord ;
   t_Meaning   Meaning ;        // смыслы t_aWord->meaning

   char        StrUp  [LFRASA] ;
   char        Antwort[LFRASA] ;

public:
         t_Path( void );
	 t_Path( t_Path *Up, long z_Tree );
	 ~t_Path();
   void  del();
   void  make_tree( void );
   long  n_variant_calc( t_Path *Up, long z_Tree );
   void  make_variant1( void );
   void  make_variant2( t_Path *Up, long z_Tree );
   void  sort_variant();
   void  paint( );
   void  print1( char *Str1, long i_Node );
   void  print2( char *Str1, long i_Node, long i_down, long i_slowo1 );
   long  print3( char *Str1, long i_Node, long i_down, long i_slowo1 );
   char *print_serv( t_aWord *W, short i_slowo1 );
   e_WinMsg universe(  );
   e_WinMsg loop( void );
   void  split_down( long z_Tree, long i_down, long *i1, long *i2 );
   void  split_final( long z_Tree, long *i1, long *i2 );
   long  merge_down( long z_Tree, long i_down );
   void  print_variant( char *File );
   void  print_tree( char *Name );
   void  print_all(  );
   long  sou_length1( );
   long  sou_length( long i_word );
};

# endif