with Ada.Text_Io ;
with Ada.Wide_Text_Io ;
with Ada.Characters.Handling ;
with Ada.Wide_Characters.Handling ;
with Ada.Strings.Fixed ;
with Ada.Strings.Wide_Fixed ;
with Ada.Calendar.Formatting ;
with Ada.Containers.Vectors;
with Ada.Directories;
with Ada.Unchecked_Deallocation;
procedure Edit is

      type String_Access is access all String;
   procedure String_Free is new Ada.Unchecked_Deallocation (String, String_Access);

   type Wide_Access is access all Wide_String;
   procedure Wide_Free is new Ada.Unchecked_Deallocation (Wide_String, Wide_Access);

   subtype Line_Index_Range is Natural range 0..132772;
   type Wide_Array is array (Line_Index_Range range <>) of Wide_Access;
   type Wide_Set (Lines_Max : Line_Index_Range) is tagged
      record
         Lines : Wide_Array(1..Lines_Max);
         Line_Last : Natural := 0;
      end record;

   procedure Add_Line (Set : in out Wide_Set;
                       Last : in out Line_Index_Range;
                       Line : in Wide_String);
   procedure Set_Free(Set : in out Wide_Set);

      procedure Add_Line (Set : in out Wide_Set;
                       Last : in out Line_Index_Range;
                       Line : in Wide_String) is
   begin
      Last := Set.Line_Last;
      if Last = Set.Lines'Last then
         Wide_Free (Set.Lines ( 1 ) );
         for Line in 1..Last - 1 loop
            Set.Lines(Line) := Set.Lines (Line + 1);
         end loop;
         Set.lines(Last) := new Wide_String ' (Line);
      else
         Set.Lines(Last+1) := new Wide_String ' (Line);
         Last := Last + 1;
      end if;
      Set.Line_Last := Last;
   end Add_Line;


   procedure Set_Free(Set : in out Wide_Set) is
   begin

      Set.Line_Last := 0;
      for Iter in Set.Lines ' range loop
         if Set.Lines(Iter) /= null then
            Wide_Free(Set.Lines(Iter));
         end if;
      end loop;

   end Set_Free;

   function Col_Count (Line : in Wide_String;To : in Natural;Txt : Boolean) return Natural is
      Count : Natural := 0;
   begin
      if To = 0 then
	 return To;
      end if;
      for Wchar in Line'First..To loop
	 case Line(Wchar) is
	    when Wide_Character'Val(9) =>
	       if Txt then
		  Count := Count + 7;
	       else
		  Count := Count + 3;
	       end if;
	    when others =>
	       Count := Count + 1;
	 end case;
      end loop;
      return Count;
   end Col_Count;
   
   function Txt (Ext : String) return Boolean is
   begin
      if Ext = "txt" then
	 return True;
      end if;
      return False;
   end Txt;


---------------------------------------------------------------------------------------------
   --
   -- Up_Arrow, Down_Arrow, Left_Arrow and Right_Arrow for Edit in Devel mode and Multi mode. --
   --
   --
   ---------------------------------------------------------------------------------------------
   
   
   
   function Count (Set : in Wide_Set;
		   Doc_Index : in Natural;			  
		   Line_index : in Natural; 
		   Wchar_Index : in Natural;
		   Line_Cur : in Line_Range;
		   Col_Cur : in Column_Range; 
		   Height : in Line_Range;
		   Width : in Column_Range) return Natural is

      Total_Lines : Natural := 0;      
   begin
      
  Line_Count :
      for I in Doc_Index+1..Line_Index loop
	 
	 declare
	    tmp : constant Wide_String := 
	      (Set.lines(I).all);
	    Line : constant Wide_String := Tmp(Tmp'First..Wide_Fixed.Index_Non_Blank((Tmp), Backward));
	    
	    Chars_Max : constant Positive := Width;
	    Lines_Max : constant Positive := Height;
	 begin
	    exit when (Total_Lines >= Height);
	    if Real_Length(Line) > 0 and Real_Length(Line) < (Chars_Max * Lines_Max) then
	       
	       for Line_Window in 0..Integer'min(Real_Length(Line)/Chars_Max, Lines_Max) loop		  
		  
		  Total_lines := Total_Lines + 1;
		  exit when (Total_Lines >= Height);
	       end loop;
	    else
	       Total_lines := Total_Lines + 1;
	       
	    end if;                           
	    
	 end;
	 exit when (Total_Lines >= Height);
      end loop Line_Count;
      return Total_Lines;
   end Count;
   
   
   
   
   procedure Up_Arrow (Set : in Wide_Set;
		       Doc_Index : in out Natural;			  
		       Line_index : in out Natural; 
		       Wchar_Index : in out Natural;
		       Line_Cur : in out Line_Range;
		       Col_Cur : in out Column_Range; 
		       Height : in Line_Range;
		       Width : in Column_Range) is      
      
      
      Total_Lines : Natural := 0;       
   begin
      Total_Lines := Count(Set, Doc_Index, Line_Index, 
			  Wchar_Index, Line_Cur, Col_Cur, Height, Width);
      if Line_Cur <= 1 and 
	Doc_Index >= 1 then
	 Doc_Index := Doc_Index - 1;
	 Line_Index := Line_Index - 1;
	 Line_Cur := 1;
	 Col_Cur := 1;
	 Wchar_Index := 0;
	 
	    
      elsif Line_Cur > 1 then
	 
	 if Wchar_Index - Width >= 1 then	    	    	    
	    Wchar_Index := (Wchar_Index - Width);
	    Line_Cur := Line_Cur - 1;
	    if Wchar_Index >= Width then
	       Col_Cur := (Wchar_Index rem Width);
	    elsif Wchar_Index >= 0 then
	       Col_Cur := Wchar_Index;
	    else
	       Col_Cur := 1;
	    end if;
	 else
	    Line_Index := Line_Index - 1;
	    Line_Cur := Line_Cur - 1;
	    Col_Cur := 1;
	    Wchar_Index := 0;
	 end if;
      else
	 W_Io.Put(Wide_Character'Val(7));
      end if;
	 
   end Up_Arrow;
   
   procedure Down_Arrow (Set : in Wide_Set;
			  Doc_Index : in out Natural;			  
			  Line_index : in out Natural; 
			  Wchar_Index : in out natural;
			  Line_Cur : in out Line_Range;
			  Col_Cur : in out Column_Range; 
			  Height : in Line_Range;
			  Width : in Column_Range) is      
      
      Total_Lines : Natural := 0;
      Cur : Line_Range := Line_Cur;
   begin
      
      
      if (Line_Cur >= (Height-2)) and ((Line_Index + 1) <= Set.Line_Last) then
	 
	 Line_Index := Line_Index + 1;
	 Wchar_Index := 0;
	 Doc_Index := Doc_Index + 1;
	 
	 Col_Cur := 1;
	 Total_Lines :=
	   Count(Set, Doc_Index, Line_Index, 
		 Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	 Line_Cur := Cur;
      elsif Line_Index + 1 <= Set.Line_Last then
	 Line_Index := Line_Index + 1;
	 Line_Cur := Line_Cur + 1;
	 Wchar_Index := 0;
	 
	 Col_Cur := 1;
	 
      elsif Real_Length(Set.Lines(Line_Index).all) >= (Width) then
	 
	 
	 if (Wchar_Index + Width) <= Real_Length(Set.Lines(Line_Index).all) then
	    Line_Cur := Line_Cur + 1;
	    Wchar_Index := Wchar_Index + Width;	    
	    Col_Cur := (Wchar_Index rem Width);	    
	 elsif Real_Length(Set.Lines(Line_Index).all) > width then	    
	    Line_Cur := Line_Cur + 1;
	    Wchar_Index := Real_Length(Set.Lines(Line_Index).all);
	    Col_Cur := (Wchar_Index rem Width);	    
	 else
	    Wchar_Index := 0;
	    Col_Cur := 1;
	 end if;
      else
	 Put(Wide_Character'Val(7));
      end if;
   end Down_Arrow;
   
   
   
   procedure At_Begin (Set : in Wide_Set;
		       Doc_Index : in out Natural;			  
		       Line_index : in out Natural; 
		       Wchar_Index : in out Natural;
		       Line_Cur : in out Line_Range;
		       Col_Cur : in out Column_Range; 
		       Height : in Line_Range;
		       Width : in Column_Range) is
      Total_Lines : Natural := 0;
   begin
      
      Wchar_Index := 0;
      
      Col_Cur := 1;
      Total_Lines := Count(Set, Doc_Index, Line_Index, 
			   Wchar_Index, Line_Cur, Col_Cur, Height, Width);
      
      Line_Cur := Total_Lines;
      
   end At_Begin;
   
   procedure At_End (Set : in Wide_Set;
		     Doc_Index : in out Natural;			  
		     Line_index : in out Natural; 
		     Wchar_Index : in out Natural;
		     Line_Cur : in out Line_Range;
		     Col_Cur : in out Column_Range; 
		     Height : in Line_Range;
		     Width : in Column_Range) is
      Total_Lines : Natural := 0;
   begin
      
      
      Wchar_Index := Set.Lines(Line_Index)'length;
      
      Total_Lines := Count(Set, Doc_Index, Line_Index, 
			   Wchar_Index, Line_Cur, Col_Cur, Height, Width);
      
      Col_Cur := Natural'Max(Wchar_Index mod Width, Wchar_Index) + 1;
      
      
      Line_Cur := Total_Lines;
      
   end At_End;
   
   

   procedure Right_Arrow (Set : in Wide_Set;
			  Doc_Index : in out Natural;			  
			  Line_index : in out Natural; 
			  Wchar_Index : in out Natural;
			  Line_Cur : in out Line_Range;
			  Col_Cur : in out Column_Range; 
			  Height : in Line_Range;
			  Width : in Column_Range) is      
      
      
      
      Done : Boolean := False;
      
      
      
      Total_Lines : Natural := 0;
      
   begin
      if Wchar_index + 1 > Real_Length(Set.Lines(Line_Index).all) then
	 if Line_Index + 1 > Set.Line_Last then
	    Put(Wide_Character'Val(7));
	 elsif Line_Cur = Height then
	    loop
	       
	       Total_Lines := Count(Set, Doc_Index, Line_Index + 1,
				    Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	       if Total_Lines > height then
		  Doc_Index := Doc_Index + 1;		  
	       end if;
	       
	       exit when Total_Lines <= Height;
	       
	    end loop;
	    
	    Line_Index := Line_Index + 1;
	    Total_Lines := Count(Set, Doc_Index, Line_Index - 1,
				 Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	    Col_Cur := 1;
	    Line_Cur := Total_Lines + 1;
	 else
	    
	    
	    
	    loop
	       
	       Total_Lines := Count(Set, Doc_Index, Line_Index + 1,
				    Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	       if Total_Lines > height then
		  Doc_Index := Doc_Index + 1;		  
	       end if;
	       
	       exit when Total_Lines <= Height;
	       
	    end loop;
	    Line_Index := Line_Index + 1;
	    
	    Total_Lines := Count(Set, Doc_Index, Line_Index - 1,
				 Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	    
	    Line_Cur := Total_Lines + 1;
	    Wchar_Index := 0;
	    Col_Cur := 1;
	 end if;
      elsif Wchar_Index < Set.Lines(Line_Index)'Length and (Wchar_Index + 1 = Width) then
	 Col_Cur := 1;
	 Line_Cur := Line_Cur + 1;
	 Wchar_Index := Wchar_Index + 1;
      elsif Wchar_Index < Set.Lines(Line_Index)'Length and (Wchar_Index + 1 > Width) then
	 Wchar_Index := Wchar_Index + 1;
	 if (Wchar_Index mod Width) = 0 then
	    Line_Cur := Line_Cur + 1;
	    Col_Cur := 1;
	 else
	    Col_Cur := (Wchar_Index mod Width) + 1;
	 end if;
      elsif Wchar_Index < Set.Lines(Line_Index)'Length then	 
	 Wchar_Index := Wchar_Index + 1;
	 Col_Cur := Col_Cur + 1;
      end if;
   end Right_Arrow;
   
   
   procedure Left_Arrow (Set : in Wide_Set;
			 Doc_Index : in out Natural;			  
			 Line_index : in out Natural; 
			 Wchar_Index : in out Natural;
			 Line_Cur : in out Line_Range;
			 Col_Cur : in out Column_Range; 
			 Height : in Line_Range;
			 Width : in Column_Range) is      
      
      Total_Lines : Natural := 0;      
   begin
      
      if (Col_Cur = 1) and Line_Cur = 1 then
	 if Doc_Index - 1 >= 0 then	       
	    Line_Index := Line_Index - 1;
	    Doc_Index := Doc_Index - 1;	       
	    Wchar_Index := Real_Length(Set.Lines(Line_Index).all);
	    
	    Total_Lines := Count(Set, Doc_Index, Line_Index, 
				 Wchar_Index, Line_Cur, Col_Cur, Height, Width);	    
	    Line_Cur := Total_Lines;
	    if (Wchar_Index mod Width) /= 0 then
	       Col_Cur := (Wchar_Index mod Width) + 1;
	    else
	       Col_Cur := 1;
	    end if;
	    
	    
	 else
	    W_Io.Put(Wide_Character'Val(7));
	 end if;
      elsif (Col_Cur = 1) and (Wchar_Index >= Width)  then	 
	 Wchar_index := Wchar_Index - 1;
	 Line_Cur := Line_Cur - 1;
	 if (Wchar_Index mod Width) /= 0 then
	    Col_Cur := (Wchar_Index mod Width) + 1;
	 else
	    Col_Cur := 1;
	 end if;
	 
      elsif Col_Cur = 1 then	 

	 loop
	    
	    Total_Lines := Count(Set, Doc_Index, Line_Index-1, 
				 Wchar_Index, Line_Cur, Col_Cur, Height, Width);
	    if Total_Lines > height then
	       Doc_Index := Doc_Index + 1;		  
	    end if;
	    
	    exit when Total_Lines <= Height;

	 end loop;
	 
	 Line_Index := Line_Index - 1;	 
	 Total_Lines := Count(Set, Doc_Index, Line_Index, 
			      Wchar_Index, Line_Cur, Col_Cur, Height, Width);	 
	 Line_Cur := Natural'Max(Line_Cur - 1, Total_Lines);
	 Wchar_Index := Real_Length(Set.Lines(Line_Index).all);
	 if (Wchar_Index mod Width) /= 0 then
	    Col_Cur := (Wchar_Index mod Width) + 1;
	 else
	    Col_Cur := 1;
	 end if;
	 
      elsif Wchar_index >= 1 then	 
	 Wchar_Index := Wchar_Index - 1;      
	 if (Wchar_Index mod Width) /= 0 then
	    Col_Cur := (Wchar_Index mod Width) + 1;
	 else
	    Col_Cur := 1;
	 end if;
	 
      else
	 W_Io.Put(Wide_Character'Val(7));
      end if;
      
      
      
   end Left_Arrow;



   type Docume_Record is tagged
      record
         Title    : String_Access; --
         Filename : String_Access; --
         Fullpath : String_Access;
         Unit     : String_Access; --
         Creation_Date : Time; --
         Last_Edition  : Time; --
         Openned       : Boolean := False; --
         Is_New_Doc    : Boolean := False;
         Size          : natural := 0;
         Owner         : String_Access;
      end record;

   type Docume_Access is access all Docume_Record;
   procedure Docume_Free (Docume : in out Docume_Access);
   procedure Docume_Free (Docume : in out Docume_Access) is
   begin
      if Docume /= null then
         String_Free(Docume.Title);
         String_Free(Docume.Filename);
         String_Free(Docume.Fullpath);
         String_Free(Docume.Unit);
         String_Free(Docume.Owner);
      end if;
   end Docume_Free;






   procedure New_Doc (Center : in Main_Interface_Record;
                      Lines_Table : in out Wide_Set;
                      Docume : out Docume_Access;
                      Filename : in String;
                      Version  : in Wide_String;
                      License : in Boolean;
                      Description : in Wide_string);

   procedure Open_Doc (Lines_Table : in out Wide_Set;
                       Docume : out Docume_Access;
                       Filename : in String);

   procedure Edit_Draw_Main_Win (Center : access Main_Interface_Record);

   procedure Devel_Draw_Docume (Docume : in Docume_Access; Win : in Window_Record; Initialized : in Boolean);
   function Troncate (Line : in Wide_String; Num_Char : in positive) return Wide_String is
      Head_Min : constant Natural := Positive'Min(Line'Length, Num_Char/2-8);
      Tail_Min : Constant Natural := Integer'min(Head_Min+1, Num_Char/2-8);

   begin
      if Line'length < Num_Char-5 then
         return Line;
      else
         return Head(Line, Head_Min) & "..." & Trim(Tail(Line(Tail_Min+5..Line'Last), Num_Char-5), Left);
      end if;
   end Troncate;

   procedure Devel_Draw_Docume (Docume : in Docume_Access; Win : in Window_Record; Initialized : in Boolean) is
   begin
      Draw_Text(Win, 1, 1, Yellow, "Title : ");
      if Docume /= null and then Docume.Title /= null then
         Draw_Text(Win, 1, 9, White, Troncate(Handling.To_Wide_String(Docume.Title.all), Columns/4-10));
      end if;
      Draw_Text(Win, 1, 5+Columns/4+2, Yellow, "Unit : ");
      if Docume /= null and then Docume.Unit /= null then
         Draw_Text(Win, 1, 10+Columns/4+9, white, Handling.To_Wide_String(Docume.Unit.all));
      end if;
      Draw_Text(Win, 1, 10+Columns/4+15, Yellow, "Created  : ");
      if Docume /= null then
         Draw_Text(Win, 1, 10+Columns/4+26, White, Handling.To_Wide_String(Formatting.Image(Docume.Creation_Date)));
      end if;
      Draw_Text(Win, 2, 1, Yellow, "Name : ");
      if Docume /= null and then Docume.Filename /= null then
         Draw_Text(Win, 2, 9,  White, Troncate(Handling.To_Wide_String(Docume.filename.all), Columns/4-10));
      end if;
      Draw_Text(Win, 2, 5+Columns/4+2, Yellow, "Openned : " );
      if Docume /= null and then Docume.Filename /= null then
         Draw_Text(Win, 2, 5+Columns/4+10,white, Handling.To_Wide_String(Boolean'Image(Docume.Openned)));
      end if;
      Draw_Text(Win, 2, 10+Columns/4+15, Yellow, "Modified : ");
      if Docume /= null then
         Draw_Text(Win, 2, 10+Columns/4+26, White, Handling.To_Wide_String(Formatting.Image(Docume.Last_Edition)));
      end if;
      Draw_Text(Win, 3, 1, Yellow, "Size : ");
      if Docume /= null then
         Draw_Text(Win, 3, 9, white, Handling.To_Wide_String(Natural'Image(Docume.Size)) & " without end_of_line.");
      end if;
      Draw_Text(Win, 3,  2+Columns/4+5, Yellow, "Owner : ");
      if Docume /= null and then Docume.Owner /= null then
         Draw_Text(Win, 3,  2+Columns/4+13, White, Handling.To_Wide_String(Docume.Owner.all));
      end if;

   end Devel_Draw_Docume;


   procedure Edit_Win_Init (Center : access Main_Interface_Record;Top : in Natur
al;Full : in boolean);
   procedure Save_Buffer(Docume : in Docume_Access; Lines_Table : in Wide_Set) is
   begin
      -- save buffer.
      declare
         File : W_Io.File_Type;
      begin
        
         W_Io.Create(File, W_Io.Out_File, Docume.Filename.all, Form => "WCEM=8");
        
         for Line_Iter in 1..Lines_Table.Line_Last+1 loop
            if Lines_Table.Lines(Line_Iter) /= null then
               begin
                
                  declare
                
                     Line : constant Wide_String :=
                       Lines_Table.Lines(Line_Iter).all;
                
                  begin
                
                     W_Io.Put_Line(File, Line);
                  end;
               end;
            end if;
         end loop;
         W_Io.Close(File);
      end;
   end Save_Buffer;


   procedure Highlight (Docume : in Docume_Access; Lines : out Wide_Set) is
      Result_Highlight : Result_Access;
      Deleted          : Boolean := False;
      File             : W_Io.File_Type;
   begin
      Set_Free(Lines);
      Result_Highlight := new Spawn_Result_Type '
        (Spawn("sh -c ""source-highlight -f esc256 -i " & Docume.Filename.all
                 & " -o .highlighted""", ".Out_File.txt"));

      if Result_Highlight /= null and then
        Result_Highlight.Wlines /= null then
         if  Index_Non_Blank (-Result_Highlight.Wlines(1)) = 0 then
            if Os_Lib.Is_Regular_File(".highlighted") then
               W_Io.Open(File, W_Io.In_File, ".highlighted", Form => "WCEM=8");
               while not W_Io.End_Of_File(File) loop
                  Lines.Lines(Lines.Line_Last + 1) := new Wide_String ' (W_Io.Get_Line(File));
                  Lines.Line_Last := Lines.Line_Last + 1;
               end loop;
               W_Io.Close(File);
            end if;
         end if;
      end if;

      Os_Lib.Delete_file(".highlighted", deleted);
      U_Array_Free(Result_Highlight.Wlines);
   end Highlight;

   procedure Open_Document (Doc_Name : in Wide_String; Table : in out Wide_Set;
Line_Last : out natural) is
      File : W_Io.File_Type;
   begin
      Set_Free(Table);
      W_Io.Open(File, W_Io.In_File, Handling.To_String(Doc_Name), Form => "WCEM=8");
      while not W_Io.End_Of_File(File) loop
         declare
            Wline : constant Wide_String := W_Io.Get_Line(File);
         begin
            Table.Lines(Line_Last + 1) := new Wide_String ' (Wline);
            Line_Last := Line_Last + 1;
         end;
      end loop;
      W_Io.Close(File);
      Table.Line_Last := Line_Last;
   end Open_Document;



   procedure Doc_Init (Center : in Main_Interface_Record;
                       Lines_Table : in out Wide_Set);

   function New_Wide_String (Title : in Wide_String;
                             Label : in Wide_String;
                             Length : in Positive;
                             Line, Col : in Positive;
                             Print : in Boolean) return Wide_String;

   type Main_Interface_Record;
   type Abstract_Mode is abstract tagged limited null record;
   type Mode_Enum is (Devel);
   type All_Mode(Name : Mode_Enum) is new Abstract_Mode with null record;

   type All_Access is access All_Mode'class;

   type Mode_Array is array (Natural range <>) of All_Access;

   type App_Access is access all Main_Interface_Record;


   type Devel_Record(App : App_Access);
   task type Devel_Process (Mode : access Devel_Record; App : App_Access) is
      --entry Initialize(App : in App_Access);
      entry Receive (Wchar : in Wide_Character);
      entry Halt;
      entry Suspend;
      entry Wake_Up(Top : in Natural);
      entry Refresh;
      entry Page_Up;
      entry Page_Down;
      entry Up_Arrow;
      entry Down_Arrow;
      entry Left_Arrow;
      entry Right_Arrow;
      entry Full_Screen;

      entry Del;

      entry Begin_Of;

      entry End_Of;

      entry Overwrite;

      entry Screen_Print;

   end Devel_Process;
   type Devel_Record(App : App_Access) is new All_Mode(Devel) with
      record
         Proc : Devel_Process(Devel_Record'Access, App);
      end record;

   task body Devel_Process is
      Text : Wide_Access := new Wide_String ' ("");
      Old_Length    : Natural := 0; -- save text'length
      Old_Total_Length    : Natural := 0; -- save total_type'image(total_sum)'length
      Old_Pwd   : Os_Lib.String_Access;
      Result : Result_Access;

      Last_Cmd : Int_Cmd_Enum := None;



      Width : constant Column_Range := (Columns/2)-5;
      Height : constant Column_Range := (Lines - 13);
      Screen_Lock : Binary_Semaphore(True, Default_Ceiling);

      Left_Buffer      : Wide_Access := new Wide_String ' ("");
      Wbuffer          : Wide_Access := new Wide_String ' ("");
      Wline            : Wide_Access := new Wide_String ' ("");
      Wline_Length     : Integer := 0;
      Line_Current_Pos : Natural := 0;
      Wchar_Index  : Natural := 0;
      Line_Cur : Positive := 1;
      Col_Cur  : Natural := 1;
      Is_Overwrite : Boolean := False;
      --Word_Number : Natural := 0;
      Total_Line : Natural := 0;
      Dialog_Buffer_Last : Line_Index_Range := 0;
      Empty_Win : Window_Record;



      Cmd_Line         : Wide_Access := new Wide_String ' ("");
      Cmd_Line_Length  : Natural := 0;
      Cmd_Current_Pos      : Natural := 0;

      Title_Line    : Wide_String(1..64) := (others => Wide_Character'Val(32));
      Title         : Wide_Access := new Wide_String ' ("");






      task Clocking is
         entry Halt;
         entry Refresh;
         entry suspend;
         entry start;
      end Clocking;
      task body Clocking is
        
         End_Of_Task : Boolean := False;
         Blink      : Boolean := False;
         Suspended : Boolean := True;
         Title_Cur  : Positive := 1;
         Sens       : Boolean := False;
         task Deamon is
            entry Halt;
         end Deamon;
         task body Deamon is
         begin
            loop
               select
                  accept Halt;
                  exit;
               or
                  delay 0.33;
                  select
                     Clocking.Refresh;
                  or
                     delay 1.0;
                  end select;
               end select;
            end loop;
         end deamon;
        
      begin
         accept Start;
         while not End_Of_Task loop
            loop
               select
                  accept Halt do
                     End_Of_Task := True;
                     Deamon.Halt;
                  end Halt;
                  exit;
               or
                  accept Suspend do
                     Suspended := True;
                  end Suspend;
               or
                  accept Refresh;
               or
                  accept Start do
                     if Title /= null and then
                       Title'Length > 0 then
                        Title_Cur := App.Left_View.W/2-Title'Length/2;
                        Title_Cur := 1;
                     end if;
                     Suspended := False;
                  end Start;
                  exit;
               end select;
            end loop;
        
        
        
        
            while not End_Of_Task loop
               select
                  accept Halt do
                     End_Of_Task := True;
                     Deamon.Halt;
                  end Halt;
                  exit;
               or
                  when not Suspended =>
                     accept Refresh do
                        Screen_Lock.Seize;

                        Put(Handling.To_Wide_String(Save_Cursor));

                        Draw_Text(App.Left_View.Win, 1, App.Left_View.Win.Win.W-21, Cyan, Handling.To_Wide_String(Formatting.Image(Clock)));
                        Put(Handling.To_Wide_String(Restore_Cursor));
                        declare
                           Wchar : Wide_Character := Wide_Character ' Val(32);
                        begin
                           if Wline /= null and then
                             Wline'Length >= 1 then


                              if Line_Current_Pos = 0 then
                                 Wchar := Wline(Wline'First);

                              elsif Line_Current_Pos = Wline'Length then
                                 Wchar := Wide_Character'Val(32);
                              else
                                 Wchar := Wline(Line_Current_Pos + 1);
                              end if;
                           end if;
                        
                           if not Blink then
                              if Is_Overwrite then

                                 Draw_Text(App.Document.Win, Line_cur, Col_Cur,
				 White, Handling.To_Wide_String(Reverse_Video & Handling.To_Character(Wchar)));
                                 Draw_Text(App.Document.Win, Line_cur, Col_Cur,
				 White, Handling.To_Wide_String(Normal_Mode));
                                 Draw_Text(App.Document.Win, Line_Cur, Col_Cur,White, "");
                              else
                                
                                 Draw_Text(App.Document.Win, Line_Cur, Col_Cur,White, "");
                              end if;
                           else
                        
                              Draw_Text(App.Document.Win, Line_Cur, Col_Cur, White, "");
                           end if;
                           Blink := not Blink;
                        end;

                        Screen_Lock.Release;
                     end Refresh;
                
               or
                  accept Suspend do
                     Suspended := True;
                  end Suspend;
                  exit;
               or
                  accept Start do
                     if Title /= null and then
                       Title'Length > 0 then
                        Title_Cur := App.Left_View.W/2-Title'Length/2;
                        Title_Cur := 1;

                     end if;
                     Suspended := False;
                  end Start;
               or
                
                
                  delay 0.2;
                
                  Title_Line := (others => Wide_Character'Val(32));

                  if Title /= null and then
                    Title'Length > 0 then

                     Replace_slice(Title_line, Title_Cur, 0, Title.all);

                     Screen_Lock.Seize;

                     Put(Handling.To_Wide_String(Save_Cursor));
                     Draw_Text(App.Left_View.Win, 1, 30, Yellow, Title_Line);

                     Put(Handling.To_Wide_String(Restore_Cursor));
                     Screen_Lock.Release;

                     if Sens then
                        if Title_Cur + Title'Length-1 <  60 then
                           Title_Cur := Title_Cur + 1;

                        else
                           Sens := not Sens;
                        end if;
                     else
                        if Title_Cur > 1 then
                           Title_Cur := Title_Cur - 1;
                        else
                           Sens := not Sens;
                        end if;

                     end if;
                  end if;
                
                
               end select;
            end loop;
        
         end loop;
      end Clocking;





      End_Of_This_Task : Boolean := False;
      Line_Index   : Natural := 1;
      Doc_Index    : Natural := 0;


      Line_Last : Natural := 0;

      Lines_Table : Wide_Set(32735);
      Lines_Set : Wide_Set(32735);
      Is_Full : Boolean := False;
      Done : Boolean := True;

      Buffer : Wide_Access;

      Success : Boolean := False;




      Errno : Integer := 0;

   begin
      Alias_Set.List(1) := Make("ls", "ls -C -p --color");
      Alias_Set.Index := 1;

      Initialize(Empty_Win, 1, 1, Lines, Columns,  black, black);
      Clocking.Start;
  Main_Loop:
      loop
         loop
        
            select

                  accept Receive (Wchar : in Wide_Character) do
                     if Is_control(Wchar) then
                        case Wchar is
                        
                           when Wide_Character'Val(9) =>
                        
                              if App.Current_Doc /= null then
                                 if App.Current_Doc.Unit.all = "adb" or
                                   App.Current_Doc.Unit.all = "ads" or
                                   App.Current_Doc.Unit.all = "ada" or
                                   App.Current_Doc.Unit.all = "c" or
                                   App.Current_Doc.Unit.all = "h" or
                                   App.Current_Doc.Unit.all = "pl" then
                                    if Wchar_Index = Wline_Length then
                                       Wbuffer := new Wide_String ' (Wline.all & "   ");
                                       Wide_Free(WLine);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Wline'Length-1;
                                       Wchar_Index := Wline'Length;
                                    elsif Line_Current_Pos = 0 then
                                       Wbuffer := new Wide_String ' ("   " & Wline.all);
                                       Wide_Free(WLine);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Line_Current_Pos + 3;
                                       Wchar_Index := Wchar_Index + 3;
                                    else
                                       Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos));
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & "   " & Wline(Line_Current_Pos+1..Wline'Last));
                                       Wide_Free(Wline);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Line_Current_Pos + 3;
                                       Wchar_Index := Wchar_Index + 3;
                                
                                    end if;
                                 else
                                    if Wchar_Index = Wline_Length then
                                       Wbuffer := new Wide_String ' (Wline.all & "       ");
                                       Wide_Free(WLine);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Wline'Length-1;
                                       Wchar_Index := Wline'Length;
                                    elsif Line_Current_Pos = 0 then
                                       Wbuffer := new Wide_String ' ("       " & Wline.all);
                                       Wide_Free(WLine);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Line_Current_Pos + 7;
                                       Wchar_Index := Wchar_Index + 7;
                                    else
                                       Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos));
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & "       " & Wline(Line_Current_Pos+1..Wline'Last));
                                       Wide_Free(Wline);
                                       Wline := new Wide_String ' (Wbuffer.all);
                                       Wide_Free(Wbuffer);
                                       Wline_Length := Wline'Length;
                                       Line_Current_Pos := Line_Current_Pos + 7;
                                       Wchar_Index := Wchar_Index + 7;
                                
                                    end if;
                                
                                
                                 end if;
                                 Lines_Table.Lines(Line_Index) := Wline;
                                 Line_Cur := Count (Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                 if ((Wchar_Index) mod Width) /= 0 then
                                    Col_Cur := ((Wchar_Index) mod Width) + 1;
                                 else
                                    Col_Cur := 1;
                                 end if;
                              else
                                 W_Io.Put(Wide_Character'Val(7));
                              end if;
                        
                           when Wide_Character'Val(10) =>
                        
                        
                              if Line_Index+1 <= Lines_Table.Lines'Last then

                                
                                
                                 if Lines_Table.Line_Last < Lines_Table.Lines'Length then
                                
                                    if Wchar_Index = Wline_Length then

                                       if Line_Index = Lines_Table.Line_Last then

                                          Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                          Line_Index := Line_Index + 1;
                                          Wline := new Wide_String ' ("");
                                          Lines_Table.Lines(Line_Index) := Wline;

                                       else
                                          for Line in reverse Line_Index .. Lines_Table.Line_Last loop
                                             Lines_Table.Lines(Line + 1) := Lines_Table.Lines(Line);
                                          end loop;
                                          Line_Index := Line_Index + 1;
                                          Wline := new Wide_String ' ("");
                                          Lines_Table.Lines(Line_Index) := Wline;
                                          Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                       end if;
                                    elsif Wchar_Index > 1 then
                                       Left_Buffer := new Wide_String ' (Wline(Wline'first..Wchar_Index-1));
                                       Wline := new Wide_String ' (Wline(Wchar_Index..Wline'Length));
                                       Wide_Free(Lines_Table.Lines(Line_Index));
                                       Lines_Table.Lines(Line_Index) := Left_Buffer;
                                
                                       for Line in reverse Line_Index .. Lines_Table.Line_Last loop
                                          Lines_Table.Lines(Line + 1) := Lines_Table.Lines(Line);
                                       end loop;
                                       Line_Index := Line_Index + 1;
                
                                       Lines_Table.Lines(Line_Index) := Wline;
                                       Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                    else
                                       Wbuffer := new Wide_String ' (Wline.all);
                                       Wline := new Wide_String ' ("");
                                       for Line in reverse Line_Index .. Lines_Table.Line_Last loop
                                          Lines_Table.Lines(Line + 1) := Lines_Table.Lines(Line);
                                       end loop;
                                       Lines_Table.Lines(Line_Index) := Wline ;
                                       Line_Index := Line_Index + 1;
                
                                       Lines_Table.Lines(Line_Index) := Wbuffer;
                                       Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                    end if;
                                    Wline := Lines_Table.Lines(Line_index);
                                    Wchar_Index := 0;
                                    Wline_Length := Wline'Length;
                                    Line_Current_Pos := 0;
                                    if Line_Cur >= Height then
                                       Doc_Index := Doc_Index + 1;
                                    else
                                       Line_Cur := Line_Cur + 1;
                                    end if;
                                    Col_Cur := 1;
                                 else
                                    W_Io.Put(Wide_Character'Val(7));
                                 end if;
                              else
                                 Line_Index := Line_Index + 1;
                                 Wline := new Wide_String ' ("");
                                 Lines_Table.Lines(Line_Index) := Wline;
                                 Lines_Table.Line_Last := Lines_Table.Line_Last+ 1;
                                 if Line_Cur >= Height then
                                    Doc_Index := Doc_Index + 1;
                                 else
                                    Line_Cur := Line_Cur + 1;
                                 end if;
                                 Col_Cur := 1;
                              end if;
                        
                        
                              Clocking.refresh;
                        
                           when Wide_Character'Val(12) =>

                              Screen_Lock.Seize;
                              Put(Save_Cursor);
                        
                        
                              Edit_Draw_Main_Win (App);
                              Draw_Window(App.Buffer.Win);
                        
                              Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                              Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                              Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet)
;





                              Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                              Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                              Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                              Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                              Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                              Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Natural'Image(255 - Wline_Length)));
                        
                              Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                              Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                              Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                              --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                              --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                              --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                              --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                              --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                              --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                              Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                              Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                              Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                              --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                              --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                              --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                              Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                              Draw_Text(App.Buffer.Win, 3, 88, white, " : ");

                              Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                        
                        

                        
                              if App.Doc_Initialized then
                                 Draw_Window(App.Document.Win);
                              end if;
                        

                        
                              if App.Doc_Initialized then
                                 Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                              else
                                 Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                              end if;

                              if App.Current_Doc /= null and then
                                App.Current_Doc.Openned then
                                 if App.Current_Doc.Filename /= null then
                                
                                    Save_Buffer(App.Current_Doc, Lines_Table);
                                
                                 end if;

                                 Set_Free(Lines_Set);

                                 Highlight(App.Current_Doc, Lines_Set);


                                 if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                                    raise Spec_Error;
                                 end if;

                              else

                                 Set_Free(Lines_Table);

                                 Doc_Init(App.all, Lines_Table);

                                 if not Print_Set(Lines_Table, App.Document.Win, Doc_Index, Total_Line) then
                                    raise Program_Error;
                                 end if;

                              end if;
                        
                        
                              Put(Restore_Cursor);
                              Screen_Lock.Release;

                              Clocking.Refresh;

                           when Wide_Character'Val(14) =>
                              Clocking.Suspend;


                              loop
                                 begin
                                    Draw_Window(Empty_Win);
                                    declare
                                       Filename : Wide_String :=
                                         New_Wide_String ("New file", "Filename: ",  64, Lines/2-2, Columns/4-40, True);
                                
                                
                                    begin
                                       Draw_Window(Empty_Win);
                                       declare
                                          Response : constant Wide_String :=
                                            (New_Wide_String
                                               ("License", "Include the Gnu Public Licence ? (y/o or n) : ",  50, Lines/2-2, Columns/4-50, True));
                                          License  : Boolean := False;
                                       begin
                                          if Response(1) = 'y' or
                                            Response(1) = 'Y'  or
                                            Response(1) = 'o' or
                                            Response(1) = 'O' then
                                             License := True;
                                          end if;

                                        
                                          if License then
                                             Draw_Window(Empty_Win);
                                             declare
                                                Description : Wide_String :=
                                                  New_Wide_String  ("Descrption", "Descr : ", 64, Lines/2-2, Columns/4-40, True);

                                             begin
                                                Draw_Window(Empty_Win);
                                                declare
                                                   Version : Wide_String :=
                                                     New_Wide_String  ("Version", "Version : ", 20, Lines/2-2, Columns/4-20, True);
                                                begin
                                                   Set_Free(Lines_Table);

                                                   Docume_Free(App.Current_Doc);
                                                   New_Doc (Center => App.all,
                                                            Lines_Table => Lines_Table,
                                                            Docume => App.Current_Doc,
                                                            Filename => Handling.To_String(Filename),
                                                            Version  => Version, License => True,
                                                            Description => Description);
                                                   App.Current_Doc.Owner := new String ' (App.User.Logname.all);
                                                
                                                   Wline := new Wide_String ' ("");

                                                   Lines_Table.lines(Lines_Table.Line_Last + 1) := Wline;
                                                
                                                   Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                                
                                                   App.Doc_Initialized := True;                                                
                                                
                                                   Doc_Index := 0;
                                                
                                                
                                                   Line_Cur := 1;
                                                   Col_Cur := 1;

                                                   Wchar_Index := 0;
                                                   Line_Current_Pos := 0;
                                                end;
                                             end;
                                          else
                                             Draw_Window(Empty_Win);
                                             declare
                                                Version : Wide_String :=
                                                  New_Wide_String  ("Version", "Version : ", 20, Lines/2-2, Columns/4-20, True);
                                             begin
                                                Set_Free(Lines_Table);

                                                Docume_Free(App.Current_Doc);
                                                New_Doc (Center => App.all,
                                                         Lines_Table => Lines_Table,
                                                         Docume => App.Current_Doc,
                                                         Filename => Handling.To_String(Filename),
                                                         Version => Version,
                                                         License => False,
                                                         Description => "");
                                                App.Current_Doc.Owner := new String ' (App.User.Logname.all);
                                                Wline := new Wide_String ' ("");
                                                Lines_Table.lines(Lines_Table.Line_Last + 1) := Wline;
                                                Lines_Table.Line_Last := Lines_Table.Line_Last + 1;
                                                App.Doc_Initialized := True;
                                                Doc_Index := 0;
                                                Line_Cur := 1;
                                                Col_Cur := 1;
                                                Wchar_Index := 0;
                                                Line_Current_Pos := 0;
                                             end;
                                        
                                          end if;
                                        

                                       exception
                                          when End_Error =>
                                             exit;
                                        
                                       end;
                                    exception
                                       when End_Error =>
                                          exit;
                                    end;
                                    Screen_Lock.Seize;
                                    Edit_Draw_Main_Win (App);
                                    Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                                    Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                                    Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);





                                    Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                                    Draw_Text(App.Buffer.Win, 2, 17, white, " :");
                                    Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                                    Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                                    Draw_Text(App.Buffer.Win, 3, 17, white, " :
");
                                    Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));

                                    Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                                    Draw_Text(App.Buffer.Win, 3, 65, white, " :");
                                    Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                                    --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                                    --  Draw_Text(App.Buffer.Win, 2, 39, white," : ");
                                    --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                                    --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                                    --  Draw_Text(App.Buffer.Win, 3, 39, white," : ");
                                    --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                                    Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                                    Draw_Text(App.Buffer.Win, 2, 64, white, " :");
                                    Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                                    --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                                    --  Draw_Text(App.Buffer.Win, 3, 64, white," : ");
                                    --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                                    Draw_Text(App.Buffer.Win, 3, 71, Cyan, " ; Overwrite");
                                    Draw_Text(App.Buffer.Win, 3, 83, white, " :");
                                    Draw_Text(App.Buffer.Win, 3, 86, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                                
                                    Screen_Lock.Release;
                                    exit;
                                 exception
                                    when W_Io.End_Error =>
                                       exit;
                                 end;
                              end loop;
                              Clocking.Start;

                              Done := False;
                           when Wide_Character'Val(15) =>
                              Clocking.Suspend;

                              loop
                                 begin
                                
                                    Draw_Window(Empty_Win);
                                    declare
                                       Filename : Wide_String :=
                                         New_Wide_String ("Open file", "Filename : ",  64, Lines/2-2, Columns/4-40, True);
                                    begin
                                
                                       Docume_Free(App.Current_Doc);

                                       Set_Free(Lines_Table);

                                       Open_Doc (Lines_Table => Lines_Table,
                                                 Docume => App.Current_Doc,
                                                 Filename => Handling.To_String(Filename));
                                       Wide_Free(Title);

                                       Title := new Wide_String ' (Troncate(Filename, 50));
                                       Clocking.Start;
                                       App.Doc_Initialized := True;

                                       if Lines_Table.Line_Last /= 0 then
                                          Wline := Lines_Table.Lines(1);
                                          Wline_Length := Real_Length(Wline.all);
                                       else
                                          Lines_Table.Lines(1) := Wline;
                                       end if;

                                       Line_Index := 1;
                                       Doc_Index := 0;
                                       Line_Current_Pos := 0;
                                       Line_Cur := 1;
                                       Col_Cur := 1;
                                       Wchar_Index := 0;
                                       exit ;
                                    exception
                                       when Spec_Error =>
                                          null;
                                        
                                    end;
                                 exception
                                    when End_Error =>
                                       exit;
                                 end;
                                
                                 Screen_Lock.Seize;
                                 Edit_Draw_Main_Win (App);

                                
                                 Draw_Text(App.Buffer.Win, 1, 2, cyan, "Is Document mode");
                                 Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                                 Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                                 Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                                 Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                                 Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                                 Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                                 Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s)left");
                                 Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                                 Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));

                                 Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                                 Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                                 Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                                 --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ;word max");
                                 --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                                 --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                                 --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ;Word number");
                                 --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                                 --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                                 Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                                 Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                                 Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));

                                 --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ;Lines count");
                                 --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                                 --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                                 Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                                 Draw_Text(App.Buffer.Win, 3, 88, white, " : ");

                                 Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                              end loop;
                        
                              Clocking.Start;

                              Done := False;

                           when Wide_Character'Val(127) =>
                              if Lines_Table.Lines(Line_Index) /= null then
                                 if Line_Current_Pos > 1 then
                                    case Is_Overwrite is
                                       when False =>
                                          if Line_Current_Pos > 2 then
                                             if Wline'Length >= 2 then
                                                Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos-1));
                                                if Line_Current_Pos < Wline'Length then
                                                   Wbuffer := new Wide_String '(Left_Buffer.all & Wline(Line_Current_Pos+1..Wline'Last));
                                                else
                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                end if;

                                             else
                                                Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos-1));
                                                Wbuffer := new Wide_String ' (Left_Buffer.all);
                                             end if;
                                        
                                          elsif Line_Current_Pos = 2 then
                                          Left_Buffer := new Wide_String ' (Wline(Wline'first..Wline'first));
                                             if Wline'Length >= 2 then
                                                Wbuffer := new Wide_String ' (Left_Buffer.all & Wline(Line_Current_Pos+1..Wline_Length));
                                             else
                                                Wbuffer := new Wide_String ' (Left_Buffer.all);
                                             end if;
                                          else
                                             if Wline'Length >= 2 then
                                                Left_Buffer := new Wide_String ' (Wline(Line_Current_Pos+1..Wline'Length));
                                                Wbuffer := new Wide_String ' (Left_Buffer.all);
                                             else
                                                Wbuffer := new Wide_String ' ("");
                                             end if;
                                          end if;

                                          Wide_Free(Wline);
                                          Wline := new Wide_String ' (Wbuffer.all);
                                          Wide_Free(Wbuffer);
                                          Wide_Free(Left_Buffer);
                                          Lines_Table.Lines(Line_Index) := Wline;
                                          Wchar_Index := Wchar_Index - 1;
                                          Line_Current_Pos := Line_Current_Pos - 1;
                                          Wline_Length := Wline'Length;
                                          Line_Cur := Count (Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                          if (Wchar_Index mod Width) /= 0 then
                                             Col_Cur := (Wchar_Index mod Width)+ 1;
                                          else
                                             Col_Cur := 1;
                                          end if;
                                       when True =>
                                          Wide_Fixed.Replace_Slice (Wline.all, Line_Current_Pos-1, Line_Current_Pos-1, " ");
                                          Line_Current_Pos := Line_Current_Pos - 1;
                                          Wchar_Index := Wchar_Index - 1;
                                          Line_Cur := Count (Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                          if (Wchar_Index mod Width) /= 0 then
                                             Col_Cur := (Wchar_Index mod Width)+ 1;
                                          else
                                             Col_Cur := 1;
                                          end if;
                                    end case;
                                 else
                                
                                    case Is_Overwrite is
                                       when False =>
                                          if Wline'Length = 0 then
                                             if Line_Index > 1 then

                                                if Wline'Length >= 1 then
                                                   Left_Buffer := new Wide_String ' (Lines_Table.Lines(Line_Index - 1).all & Wline(Wline'first..Line_Current_Pos));
                                                   if Line_Current_Pos < Wline'Length then
                                                      Wbuffer := new Wide_String ' (Left_Buffer.all & Wline(Line_Current_Pos+1..Wline'Last));
                                                   else
                                                      Wbuffer := new Wide_String ' (Left_Buffer.all);
                                                   end if;
                                                else
                                                   Left_Buffer := new Wide_String ' (Lines_Table.Lines(Line_Index - 1).all);

                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                end if;

                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                
                                                Wide_Free(Left_Buffer);
                
                                                Wide_Free(Lines_Table.Lines(Line_Index - 1));
                                                Lines_Table.Lines(Line_Index - 1) := Wline;
                                                if Line_Index < Lines_Table.Line_Last then
                                                   for Line in Line_Index + 1..Lines_Table.Line_Last loop
                                                      Lines_Table.Lines(Line-1):= Lines_Table.Lines(Line);
                                                   end loop;
                                                end if;
                                                Line_Index := Line_Index - 1;
                                                Lines_Table.Lines(Lines_Table.Line_Last) := null;
                                                Lines_Table.Line_Last := Lines_Table.Line_Last - 1;
                                                Wline_Length := Lines_Table.Lines(Line_Index)'Length;
                                                Wchar_Index := Wline_Length;
                                                Line_Current_Pos := Wchar_Index;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;

                                             else
                                                W_Io.Put(Wide_Character'Val(7));
                                             end if;

                                          elsif Line_Index > 1 then
                                             if Line_Current_Pos = 0 then

                                                Wchar_Index := Lines_Table.Lines(Line_Index - 1)'Length;

                                                if Wline'Length >= 1 then
                                                   Left_Buffer := new Wide_String ' (Lines_Table.Lines(Line_Index - 1).all & Wline.all);
                                                end if;

                                                Wline := new Wide_String ' (Left_Buffer.all);

                                                Wide_Free(Left_Buffer);
                
                                                Wide_Free(Lines_Table.Lines(Line_Index - 1));

                                                Lines_Table.Lines(Line_Index - 1) := Wline;
                                                if Line_Index < Lines_Table.Line_Last then
                                                   for Line in Line_Index + 1..Lines_Table.Line_Last loop
                                                      Lines_Table.Lines(Line-1):= Lines_Table.Lines(Line);
                                                   end loop;
                                                end if;
                                                Line_Index := Line_Index - 1;

                                                Lines_Table.Lines(Lines_Table.Line_Last) := null;
                                                Lines_Table.Line_Last := Lines_Table.Line_Last - 1;

                                                Wline_Length := Lines_Table.Lines(Line_Index)'Length;

                                                Line_Current_Pos := Wchar_Index;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);

                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;
                                             elsif Line_Current_Pos < Wline'Length then
                                                Wbuffer := new Wide_String ' (Wline(Line_Current_Pos+1..Wline'Last));
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                
                                                Lines_Table.Lines(Line_Index) := Wline;
                                             else

                                                Wbuffer := new Wide_String ' ("");
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                
                                                Lines_Table.Lines(Line_Index) := Wline;
                                             end if;

                                             Wide_Free(Left_Buffer);
                

                                             Wline_Length := Lines_Table.Lines(Line_Index)'Length;
                                             Wchar_Index := 0;
                                             Line_Current_Pos := 0;
                                             Col_Cur := 1;

                                          elsif Line_Index = 1 then
                                             if Line_Current_Pos > 2 then
                                                if Wline'Length >= 2 then
                                                   Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos-1));
                                                   if Line_Current_Pos < Wline'Length then
                                                      Wbuffer := new Wide_String ' (Left_Buffer.all & Wline(Line_Current_Pos+1..Wline'Last));
                                                   else
                                                      Wbuffer := new Wide_String ' (Left_Buffer.all);
                                                   end if;
                                                
                                                else
                                                   Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos-1));
                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                end if;
                                                Wide_Free(Wline);
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                                                Wide_Free(Left_Buffer);
                                                Lines_Table.Lines(Line_Index) := Wline;
                                                Wchar_Index := Wchar_Index - 1;
                                                Line_Current_Pos := Line_Current_Pos - 1;
                                                Wline_Length := Wline'Length;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;

                                             elsif Line_Current_Pos = 2 then
                                                Left_Buffer := new Wide_String ' (Wline(Wline'first..Wline'first));
                                                if Wline'Length >= 2 then
                                                   Wbuffer := new Wide_String '(Left_Buffer.all & Wline(Line_Current_Pos+1..Wline_Length));
                                                else
                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                end if;

                                                Wide_Free(Wline);
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                                                Wide_Free(Left_Buffer);
                                                Lines_Table.Lines(Line_Index) := Wline;
                                                Wchar_Index := Wchar_Index - 1;
                                                Line_Current_Pos := Line_Current_Pos - 1;
                                                Wline_Length := Wline'Length;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;

                                             elsif Line_Current_Pos = 1 then
                                                if Wline'Length >= 2 then
                                                   Left_Buffer := new Wide_String ' (Wline(Line_Current_Pos+1..Wline'Length));
                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                else

                                                   Wbuffer := new Wide_String '("");
                                                end if;
                                                Wide_Free(Wline);
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                                                Wide_Free(Left_Buffer);
                                                Lines_Table.Lines(Line_Index) := Wline;
                                                Wchar_Index := Wchar_Index - 1;
                                                Line_Current_Pos := Line_Current_Pos - 1;
                                                Wline_Length := Wline'Length;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;
                                             elsif Line_Current_Pos = 0 then
                                                if Wline'Length > 0 then
                                                   Left_Buffer := new Wide_String ' (Wline(Line_Current_Pos+1..Wline'Length));
                                                   Wbuffer := new Wide_String '(Left_Buffer.all);
                                                else

                                                   Wbuffer := new Wide_String '("");
                                                end if;
                                                Wide_Free(Wline);
                                                Wline := new Wide_String ' (Wbuffer.all);
                                                Wide_Free(Wbuffer);
                                                Wide_Free(Left_Buffer);
                                                Lines_Table.Lines(Line_Index) := Wline;
                                                Wline_Length := Wline'Length;
                                                Line_Cur := Count (Lines_Table,Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                                if (Wchar_Index mod Width) /= 0 then
                                                   Col_Cur := (Wchar_Index mod Width) + 1;
                                                else
                                                   Col_Cur := 1;
                                                end if;

                                             else
                                                W_Io.Put(Wide_Character'Val(7));
                                             end if;

                                        
                                        
                                          end if;
                                       when True =>
                                          if Line_Index > 1 then
                                        
                                             Left_Arrow(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, width);
                                             Wline_Length := Lines_Table.Lines(Line_Index)'Length;
                                             Wchar_Index := Wline_Length;
                                             Line_Current_Pos := Wchar_Index;
                                             Wide_Fixed.Replace_Slice (Wline.all, Line_Current_Pos-1, Line_Current_Pos-1, " ");
                                             Line_Current_Pos := Line_Current_Pos - 1;
                                        
                                             Line_Cur := Count (Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                                             if (Wchar_Index mod Width) /= 0 then
                                                Col_Cur := (Wchar_Index mod Width) + 1;
                                             else
                                                Col_Cur := 1;
                                             end if;
                                        
                                          else
                                             W_Io.Put(Wide_Character'Val(7));
                                          end if;
                                    end case;
                                 end if;
                              else
                                 W_Io.Put(Wide_Character'Val(7));
                                 -- beep...
                              end if;

                        
                           when others =>
                              null;
                        end case;

                        Screen_Lock.Seize;
                        Put(Save_Cursor);

                        if App.Doc_Initialized then
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                        else
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                        end if;

                        if App.Current_Doc /= null and then
                          App.Current_Doc.Openned then

                           if App.Current_Doc.Filename /= null then
                              Save_Buffer(App.Current_Doc, Lines_Table);
                           end if;
                           Set_Free(Lines_Set);

                           Highlight(App.Current_Doc, Lines_Set);

                           Draw_Window(App.Document.Win);

                           if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                              raise Spec_Error;
                           end if;

                        else

                           Set_Free(Lines_Table);
                           Doc_Init(App.all, Lines_Table);

                           if not Print_Set(Lines_Table, App.Document.Win, Doc_Index, Total_Line) then
                              raise Program_Error;
                           end if;
                        end if;

                        Put(Restore_Cursor);
                        Screen_Lock.Release;



                     else

                        if Wline /= null and then
                          Wline'Length = 256 then
                           Put(Wide_Character'Val(7));
                        else
                           if Wline'Length = 0 then
                              Wbuffer := new Wide_String ' (Wline.all & Wchar);
                              Wide_Free(Wline);
                              Wline := new Wide_String ' (Wbuffer.all);
                              Wide_Free(Wbuffer);
                        
                              Wchar_Index := Wline'Length;
                              Line_Current_Pos := Wline'Length;
                              Wline_Length := Wline'Length;
                           elsif Line_Current_Pos = Wline'Length then
                              Wbuffer := new Wide_String ' (Wline.all & Wchar);
                              Wide_Free(Wline);
                              Wline := new Wide_String ' (Wbuffer.all);
                              Wide_Free(Wbuffer);
                              Wline_Length := Wline'Length;
                              Line_Current_Pos := Wline_length;
                              Wchar_Index := Wline'Length;
                        
                        
                           else
                              if Line_Current_Pos > 1 then
                                 if not Is_Overwrite then
                                    Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos));
                                    if Wline'Length > Line_Current_Pos then
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & Wchar & Wline(Line_Current_Pos+1..Wline'Last));
                                    else
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & Wchar);
                                    end if;
                                    Wide_Free(Wline);
                                    Wline := new Wide_String ' (Wbuffer.all);
                                    Wide_Free(Wbuffer);

                                    Wide_Free(Left_Buffer);
                                    Wline_Length := Wline_Length + 1;
        
                                    Line_Current_Pos := Line_Current_Pos + 1;
                                    Wchar_Index := Wchar_Index + 1;
                                 else
                                    Wide_Fixed.Replace_Slice (Wline.all, Line_Current_Pos+1, Line_Current_Pos+1, Wchar & "");
                                    Line_Current_Pos := Line_Current_Pos + 1;
                                    Wchar_Index := Wchar_Index + 1;
                                
                                 end if;
                                
                                
                              elsif not Is_Overwrite then
                                 if Line_Current_Pos = 1 then
                                    Left_Buffer := new Wide_String ' (Wline(Wline'first..Line_Current_Pos));
                                    if Wline'Length > Line_Current_Pos then
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & Wchar & Wline(Line_Current_Pos+1..Wline'Last));
                                    else
                                       Wbuffer := new Wide_String ' (Left_Buffer.all & Wchar);
                                    end if;
                                    Wide_Free(Wline);
                                    Wline := new Wide_String ' (Wbuffer.all);
                                    Wide_Free(Wbuffer);

                                    Wide_Free(Left_Buffer);
                                    Wline_Length := Wline_Length + 1;
        
                                    Line_Current_Pos := Line_Current_Pos + 1;
                                    Wchar_Index := Wchar_Index + 1;
                                 else
                                    Wbuffer := new Wide_String ' (Wchar & Wline.all);
                                    Wide_Free(Wline);
                                    Wline := new Wide_String ' (Wbuffer.all);
                                    Wide_Free(Wbuffer);
                                    Wline_Length := Wline_Length + 1;

                                    Line_Current_Pos := Line_Current_Pos + 1;
                                    Wchar_Index := Wchar_Index + 1;
                                 end if;
                              else
                                 Wide_Fixed.Replace_Slice (Wline.all, Line_Current_Pos+1, Line_Current_Pos+1, Wchar & "");
                                 Line_Current_Pos := Line_Current_Pos + 1;
                                 Wchar_Index := Wchar_Index + 1;
                                
                              end if;
                           end if;
                           if ((Col_Cur + 1) mod Width) = 0 then
                              Line_Cur := Line_Cur + 1;
                              Col_Cur := 1;
                           else
                              Col_Cur := (Wchar_Index mod Width) + 1;
                           end if;
                        end if;

                        Lines_Table.Lines(Line_index) := Wline;

                        Screen_Lock.Seize;
                        Put(Save_Cursor);
                        if App.Doc_Initialized then
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                        else
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                        end if;

                        if App.Current_Doc /= null and then
                          App.Current_Doc.Openned then
                           if App.Current_Doc.Filename /= null then
                              Save_Buffer(App.Current_Doc, Lines_Table);
                           end if;

                           Set_Free(Lines_Set);
                           Highlight(App.Current_Doc, Lines_Set);

                           Draw_Window(App.Document.Win);
                           if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                              raise Spec_Error;
                           end if;

                        else
                           Set_Free(Lines_Table);
                           Doc_Init(App.all, Lines_Table);
                           if not Print_Set(Lines_Table, App.Document.Win, Doc_Index, Total_Line) then
                              raise Program_Error;
                           end if;
                        end if;

                        Put(Restore_Cursor);
                        Screen_Lock.Release;
                        Clocking.Refresh;
                     end if;

                     if not State then
                        Screen_Lock.Seize;

                        Put(Save_Cursor);
                        Draw_Window(App.Buffer.Win);

                        Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                        Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                        Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);




                        Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                        Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                        Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                        Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                        Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                        Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                        Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                        Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                        Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                        Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                        Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                        Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));
                        Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                        Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                        Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                        --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                        --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                        --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                        --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                        --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                        --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                        Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                        Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                        Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                        Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                        Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                        Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));
                        --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                        --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                        --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                        Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                        Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                        Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                        Put(Restore_Cursor);
                        Screen_Lock.Release;
                     else

                        Screen_Lock.Seize;
                        Put(Save_Cursor);



                        if App.Doc_Initialized then
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                        else
                           Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                        end if;

                        if App.Current_Doc /= null and then
                          App.Current_Doc.Openned then
                           if App.Current_Doc.Filename /= null then
                              Save_Buffer(App.Current_Doc, Lines_Table);
                           end if;

                           Set_Free(Lines_Set);
                           Highlight(App.Current_Doc, Lines_Set);

                           Draw_Window(App.Document.Win);

                           if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                              raise Spec_Error;
                           end if;

                        else

                           Set_Free(Lines_Table);
                           Doc_Init(App.all, Lines_Table);

                           if not Print_Set(Lines_Table, App.Document.Win, Doc_Index, Total_Line) then
                              raise Program_Error;
                           end if;

                        end if;
                        Screen_Lock.Release;

                     end if;
                  end Receive;
                  Clocking.Refresh;
                  if not Done then
                     if not Is_Full then
                        if App.desktop(2) /= null then
                           case App.desktop(2).Name is
                              when None =>
                                 null;
                              when Organizer =>
                                 Organizer_Record(App.Desktop(2).all).Proc.Wake_up(App.Columns/2);
                              when Manager =>
                                 Manager_Record(App.Desktop(2).all).Proc.Wake_up(App.Columns/2);
                              when others =>
                                 null;
                           end case;
                        end if;
                     end if;
                     Done :=True;
                  end if;
            or
               accept Halt  do
                  Clocking.Halt;

               end Halt;
               exit Main_Loop;
            or
               accept Full_Screen do
                  if Is_Full then
                     Draw_Window(Empty_Win);

                     Edit_Win_Init(App, 0, not Is_full);

                     if App.Current_Doc /= null and then
                       not App.Current_Doc.Openned then
                        Doc_Init(App.all, Lines_Table);
                     end if;

                     Initialize(App.Buffer.Win, Lines-5, 2, 5, Columns/2-2,  Cyan, White);

                  else
                     Draw_Window(Empty_Win);
                     Edit_Win_Init(App, 0, not Is_full);


                     if App.Current_Doc /= null and then
                       not App.Current_Doc.Openned then
                        Doc_Init(App.all, Lines_Table);
                     end if;
                     Initialize(App.Buffer.Win, Lines-5, 2, 5, Columns-2,  Cyan, White);
                
                  end if;
               end Full_Screen;
               Is_Full := not Is_Full;
               if not Is_Full then
                  if App.desktop(2) /= null then
                     case App.desktop(2).Name is
                        when None =>
                           null;
                        when Organizer =>
                           Organizer_Record(App.Desktop(2).all).Proc.Wake_up(App.Columns/2);
                        when Manager =>
                           Manager_Record(App.Desktop(2).all).Proc.Wake_up(App.Columns/2);
                        when others =>
                           null;
                     end case;
                  end if;
               end if;
               Screen_Lock.seize;
               Draw_Window(App.Buffer.Win);

               Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
               Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
               Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);





               Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
               Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
               Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
               Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
               Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
               Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
               Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
               Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
               Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
               Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
               Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
               Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
               Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

               Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
               Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
               Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

               --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
               --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
               --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
               --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
               --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
               --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
               Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
               Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
               Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
               Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
               Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
               Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

               --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
               --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
               --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
               Draw_Text(App.Buffer.Win, 3, 71, Cyan, " ; Overwrite");
               Draw_Text(App.Buffer.Win, 3, 83, white, " : ");
               Draw_Text(App.Buffer.Win, 3, 86, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

               Draw_Window(App.Doc_states.Win);
               if App.Current_Doc /= null and then
                 App.Current_Doc.Filename /= null then
                  App.Current_Doc.Openned := True;
                
                  if App.Doc_Initialized then
                
                     Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                  else

                     Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                  end if;

                  Set_Free(Lines_Set);

                  Highlight(App.Current_Doc, Lines_Set);

                  if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then

                     raise Spec_Error;
                  end if;
               end if;

               if not App.Doc_Initialized then
                  Set_Free(Lines_Table);
                  Doc_Init(App.all, Lines_Table);
                  if not Print_Set(Lines_Table, App.Document.Win, Doc_Index, Total_Line) then
                     raise Program_Error;
                  end if;
               else
                  Set_Free(Lines_Set);
                  Highlight(App.Current_Doc, Lines_Set);
                  Draw_Window(App.Document.Win);
                  if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                     raise Spec_Error;
                  end if;
               end if;

               Screen_Lock.Release;

               Clocking.Start;



               delay 0.25;

            or
               accept Wake_Up(Top : in Natural) do
                  null;
                
               end Wake_Up;
            or
        
               accept Suspend do

                  Clocking.Suspend;

               end Suspend;
               exit;
            or
               accept Page_Down do
                  Screen_Lock.Seize;
                  Put(Save_Cursor);

                  if Doc_Index + (Height /3 * 2) < Lines_Set.Line_Last then
                     Doc_Index := Doc_Index + (Height/3*2);
                     Line_Index := Line_Index + (Height/3*2);
                     if App.Doc_Initialized then

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                     end if;
                
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;
                  else
                     Put(Character'Val(7));
                  end if;
                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                  Put(Restore_Cursor);
                
                  Screen_Lock.Release;
               end Page_Down;
            or
               accept Page_Up do
                  Screen_Lock.Seize;
                  Put(Save_Cursor);
                
                  if Doc_Index - (Height /3 * 2) >= 0 then
                     Doc_Index := Doc_Index - (Height/3*2);
                     Line_Index := Line_Index - (Height/3*2);
                     Put(Save_Cursor);
                     if App.Doc_Initialized then

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                     end if;
                
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;
                  elsif Doc_Index /= 0  then
                     Doc_Index := 0;
                     if App.Doc_Initialized then

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                     end if;
                
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;
                  else
                     Put(Character'Val(7));
                  end if;
                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                
                  Put(Restore_Cursor);
                  Screen_Lock.Release;

               end Page_Up;
            or
               accept Up_Arrow do

                     Up_Arrow(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                     Wline := Lines_Table.Lines(Line_index);
                     Wline_Length := Real_Length(Wline.all);
                
                     Line_Current_Pos := Wchar_Index;
                     Screen_Lock.Seize;
                     Put(Save_Cursor);
                     if App.Doc_Initialized then

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                     end if;
                
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;

                     Draw_Window(App.Buffer.Win);

                     Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                     Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                     Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);


                



                     Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                     Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                     Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                     Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                     Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                     Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                     Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                     Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                     Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                     Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                     --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                     --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                     --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                     --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                     Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                     Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                     Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                     Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                     --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                     --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                     Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                     Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                     Put(Restore_Cursor);
                     Screen_Lock.Release;
                     Clocking.Refresh;

               end Up_Arrow;
        
            or
               accept Down_Arrow do

                  Down_Arrow(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                
                  Wline := Lines_Table.Lines(Line_index);
                
                  Wline_Length := Real_Length(Wline.all);

                  Line_Current_Pos := 0;
                  Screen_Lock.Seize;
                  Put(Save_Cursor);
                  if App.Doc_Initialized then
                
                     Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                  end if;
                  Draw_Window(App.Document.Win);
                  if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                     raise Spec_Error;
                  end if;
                
                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));
                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                  Put(Restore_Cursor);
                  Screen_Lock.Release;
                  Clocking.refresh;

               end Down_Arrow;
        
            or
               accept Left_Arrow do
                  Left_Arrow(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                
                
                
                  Wline := Lines_Table.Lines(Line_index);
                  Wline_Length := Real_Length(Wline.all);
                  declare
                     Count : Natural := Col_Count(Wline.all, Col_Cur-1, Txt(App.Current_Doc.Unit.all));
                  begin
                     if Count /= Wline_Length then
                        Col_Cur := Col_cur + (Count - Real_Length(Wline(Wline'First..Col_Cur-1)));
                     end if;
                  end;
                
                  Line_Current_Pos := Wchar_Index;
                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);


                



                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

                  Clocking.refresh;
                
               end Left_Arrow;
            or
               accept Right_Arrow do
                  Right_Arrow(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                
                
                
                  Wline := Lines_Table.Lines(Line_index);
                  Wline_Length := Real_Length(Wline.all);
                  declare
                     Count : Natural := Col_Count(Wline.all, Col_Cur-1, Txt(App.Current_Doc.Unit.all));
                  begin
                     if Count /= Wline_Length then
                        Col_Cur := Col_cur + (Count - Real_Length(Wline(Wline'First..Col_Cur-1)));

                     end if;
                  end;

                  Line_Current_Pos := Wchar_Index;
                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

                  Clocking.refresh;
                
               end Right_Arrow;
            or
               accept Begin_Of do
                  At_Begin(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                  Col_Cur := 1;
                  Wchar_Index := 0;
                
                
                  Line_Current_Pos := 0;
                
                  Screen_Lock.Seize;
                  Draw_Window(App.Document.Win);
                  if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                     raise Spec_Error;
                  end if;
                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

                  Screen_Lock.Release;
                  Clocking.Refresh;
               end Begin_Of;
            or
               accept End_Of do
                  Screen_Lock.Seize;
                  At_End(Lines_Table, Doc_Index, Line_Index, Wchar_Index, Line_Cur, Col_Cur, Height, Width);
                
                  if (Wchar_Index mod Width) /= 0 then
                     Col_Cur := (Wchar_Index mod Width) + 1;
                  else
                     Col_Cur := 1;
                  end if;


                  Line_Current_Pos := Wline'Last;
                
                  Wline := Lines_Table.Lines(Line_index);

                  Wchar_Index := Wline'Last;
                  Wline_Length := Real_Length(Wline.all);

                  declare
                     Count : Natural := Col_Count(Wline.all, Col_Cur-1, Txt(App.Current_Doc.Unit.all));
                  begin
                     if Count /= Wline_Length then

                        Col_cur := Col_cur + ((Count - Real_Length(Wline(Wline'First..Col_Cur-1)))-1);

                     end if;
                  end;

                
                  Draw_Window(App.Document.Win);

                  if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                     raise Spec_Error;
                  end if;

                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);






                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; Line_Index");
                  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(positive'Image(Line_index)));
                  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Line, Col");
                  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(positive'Image(Line_cur) & ", " & positive'Image(Col_cur)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                  Draw_Text(App.Buffer.Win, 2, 85, Cyan, " ; line_last");
                  Draw_Text(App.Buffer.Win, 2, 100, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 103, magenta, Handling.To_Wide_String(Natural'Image(Lines_Table.Line_last)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

                  Screen_Lock.Release;

                  Clocking.Refresh;
               end End_Of;
            or
               accept Del do
                  if Line_Current_Pos <= Wline'Length then
                     Wide_Free(Wbuffer);
                     if Line_Current_Pos+1 < Wline'Length then
                        Wbuffer := new Wide_String ' (Wline(WLine'First..Line_Current_Pos) & Wline(Line_Current_Pos+2..Wline'Length));
                     else
                        Wbuffer := new Wide_String ' (Wline(WLine'First..Line_Current_Pos));
                     end if;
                     WLine := new Wide_String ' (Wbuffer.all);
                     Wline_Length := Wline'Length;
                     Lines_Table.Lines(Line_Index) := Wline;
                     Wide_Free(Wbuffer);
                
                  elsif Line_Index < Lines_Table.Line_Last then
                     Wbuffer := new Wide_String ' (Wline.all & Lines_Table.Lines(Line_Index+1).all);
                     Wide_Free(Wline);
                     WLine := new Wide_String ' (Wbuffer.all);
                     Wline_Length := Wline'Length;
                     Wide_Free(Wbuffer);
                     Lines_Table.Lines(Line_Index) := Wline;
                     for I in Line_Index + 2 .. Lines_Table.Line_Last loop
                        Lines_Table.Lines(I) := Lines_Table.Lines(I+1);
                     end loop;
                     Lines_Table.Line_Last := Lines_Table.Line_Last-1;
                  else
                     W_Io.Put(Wide_Character'Val(7));
                  end if;
                  declare
                     Count : Natural := Col_Count(Wline.all, Col_Cur, Txt(App.Current_Doc.Unit.all));
                  begin
                     if Count /= Wline_Length then
                        Wline_Length := Wline_Length + (Count - Wline_Length);
                     end if;
                  end;

                  Screen_Lock.Seize;
                  Put(Save_Cursor);
                  if App.Doc_Initialized then
                     Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                  else
                     Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                  end if;
                
                  if App.Current_Doc /= null and then
                    App.Current_Doc.Openned then
                     if App.Current_Doc.Filename /= null then
                        Save_Buffer(App.Current_Doc, Lines_Table);
                     end if;
                     Set_Free(Lines_Set);
                     Highlight(App.Current_Doc, Lines_Set);
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;
                  else
                     Set_Free(Lines_Table);
                     Doc_Init(App.all, Lines_Table);
                     if not Print_Set(Lines_Table, App.Document.Win, Doc_Index,Total_Line) then
                        raise Program_Error;
                     end if;
                  end if;
                  Draw_Window(App.Buffer.Win);

                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);



                

                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));

                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));

                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));

                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));

                  Put(Restore_Cursor);
                  Screen_Lock.Release;
                  Clocking.Refresh;
               end Del;
            or
               accept Overwrite do
                  Is_Overwrite := not Is_Overwrite;
                  Draw_Window(App.Buffer.Win);
                  Screen_Lock.Seize;
                  Put(Save_Cursor);
                
                
                  Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                  Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                  Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);





                  Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                  Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                  Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                  Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));
                  --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                  --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                  --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                  --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                  Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                  Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                  Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));

                  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                  Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));
                
                  --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                  --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                  --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                  Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                  Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                  Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                  Put(Restore_Cursor);
                  Screen_Lock.Release;
                  Clocking.Refresh;
               end Overwrite;
            end select;
         end loop;
         loop
            select
        
               accept Halt do
                  Clocking.Halt;
                
               end Halt;
               exit Main_Loop;
            or
               accept Suspend do
                  Clocking.Suspend;
                
               end Suspend;
            or
               accept Wake_Up(Top : in Natural) do
                  Is_Full := False;
                
                
                  Screen_Lock.seize;
                  if App.Current_Doc /= null and then
                    not App.Current_Doc.Openned then
                     Doc_Init(App.all, Lines_Table);
                  end if;
                
                  Initialize(App.Buffer.Win, Lines-5, Top+2, 5, Columns/2-2,  Cyan, White);
                
                     Edit_Win_Init(App, Top, false);
                     Edit_Draw_Main_Win(App);
                     Draw_Window(App.Buffer.Win);

                     Draw_Text(App.Buffer.Win, 1, 22, white, " ; Alphabet");
                     Draw_Text(App.Buffer.Win, 1, 33, red, " : ");
                     Draw_Text(App.Buffer.Win, 1, 36, yellow, Alphabet);





                     Draw_Text(App.Buffer.Win, 2, 2, Cyan, "Chars max");
                     Draw_Text(App.Buffer.Win, 2, 17, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 20, magenta, Handling.To_Wide_String(Natural'Image(Columns-5)));
                     Draw_Text(App.Buffer.Win, 3, 2, Cyan, "Char(s) left");
                     Draw_Text(App.Buffer.Win, 3, 17, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 20, magenta, Handling.To_Wide_String(Integer'Image(255 - Wline_Length)));

                     --  Draw_Text(App.Buffer.Win, 2, 25, Cyan, " ; word max");
                     --  Draw_Text(App.Buffer.Win, 2, 39, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 2, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Sh_Max_Words)));
                     --  Draw_Text(App.Buffer.Win, 3, 25, Cyan, " ; Word number");
                     --  Draw_Text(App.Buffer.Win, 3, 39, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 3, 43, magenta, Handling.To_Wide_String(Word_Range'Image(Word_Number)));
                     Draw_Text(App.Buffer.Win, 2, 50, Cyan, " ; lines max");
                     Draw_Text(App.Buffer.Win, 2, 64, white, " : ");
                     Draw_Text(App.Buffer.Win, 2, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(2880)));
                
                     Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Line_Length ");
                     Draw_Text(App.Buffer.Win, 3, 65, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 69, magenta, Handling.To_Wide_String(Natural'Image(Wline_length)));

                     --  Draw_Text(App.Buffer.Win, 3, 50, Cyan, " ; Lines count");
                     --  Draw_Text(App.Buffer.Win, 3, 64, white, " : ");
                     --  Draw_Text(App.Buffer.Win, 3, 66, magenta, Handling.To_Wide_String(Line_Index_Range'Image(Dialog_Buffer_Last)));
                     Draw_Text(App.Buffer.Win, 3, 76, Cyan, " ; Overwrite");
                     Draw_Text(App.Buffer.Win, 3, 88, white, " : ");
                     Draw_Text(App.Buffer.Win, 3, 91, magenta, Handling.To_Wide_String(Boolean'Image(Is_Overwrite)));
                
                  end if;
                
                  Draw_Window(App.Doc_states.Win);
                  if App.Current_Doc /= null and then
                    App.Current_Doc.Filename /= null then
                     App.Current_Doc.Openned := True;

                     if App.Doc_Initialized then

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, True);
                     else

                        Devel_Draw_Docume(App.Current_Doc, App.Doc_States.Win, False);
                     end if;

                     Set_Free(Lines_Set);

                     Highlight(App.Current_Doc, Lines_Set);

                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then

                        raise Spec_Error;
                     end if;
                  end if;

                  if not App.Doc_Initialized then
                     Set_Free(Lines_Table);
                     Doc_Init(App.all, Lines_Table);
                     if not Print_Set(Lines_Table, App.Document.Win, Doc_Index,Total_Line) then
                        raise Program_Error;
                     end if;
                  else
                     Set_Free(Lines_Set);
                     Highlight(App.Current_Doc, Lines_Set);
                     Draw_Window(App.Document.Win);
                     if not Print_Set(Lines_Set, App.Document.Win, Doc_Index, Total_Line) then
                        raise Spec_Error;
                     end if;
                  end if;

                  Screen_Lock.Release;
                  if Top = 0 then
                     Clocking.Start;
                  end if;
               end Wake_Up;
        
               exit;
            end select;
         end loop;
      end loop Main_Loop;
      --W_Io.Put_Line("Planning process halted");
   end Devel_Process;

   procedure Print_Buffer (Spawn_Result : in Result_Access;File_Index : in Natural) is
      Line_Index : Natural := 0;
      --Result_Max_Lines : Positive := Win.Win.H;
      Line_Count : Natural := 0;
      --Term_Width : constant Natural := Win.Win.W-2;
      Term_Width : constant Natural := Columns/2-2;
   begin


      if Spawn_Result /= null and then Spawn_result.Wlines /= null then


     Print_Loop:
        
         --  for I in File_Index+1..Positive'min(File_Index+((Result_Max_Lines-5)),
         --                                  Spawn_Result.Wlines'Length) loop
         for I in File_Index+1..Spawn_Result.Wlines'Length loop
            declare
               tmp : constant Wide_String :=
                 (-Spawn_Result.Wlines(I));
               Line : constant Wide_String := Tmp(Tmp'First..Wide_Fixed.Index_Non_Blank((Tmp), Backward));
        
               Chars_Max : constant Positive := Term_Width;
               --Lines_Max : constant Positive := (Result_Max_Lines-5);
            begin
               if Real_Length(Line) > 0 then-- and Real_Length(Line) < (Chars_Max * Lines_Max) then
                                            --for Line_Window in Line_Index..Integer'min(Real_Length(Line)/Chars_Max, Lines_Max) loop
                  for Line_Window in Line_Index..Real_Length(Line)/Chars_Max loop
                     declare
                        B_Inf : constant Positive := Line_Window*Chars_Max + 1;
                        B_Sup : constant Positive := Integer'min((Line_Window +1)*Chars_Max, Real_Length(Line));
                     begin
                        if Real_length(Line) < Chars_max then
                           --Draw_Text(Win, Line_Count+1, 1, White, Line);
                           W_Io.Put_Line(Line);
                        else
                           --Draw_Text(Win, Line_Count+1, 1, White, Line(B_Inf..B_Sup));
                           W_Io.Put_Line(Line(B_Inf..B_Sup));
                        end if;
                     end;
                     Line_Count := Line_Count + 1;
                     --exit Print_Loop When Line_Count > (Result_Max_Lines-1);
                  end loop;
               else
                  Line_Count := Line_Count + 1;
               end if;
            end;
            --exit Print_Loop when Line_Count > (Result_Max_Lines-1);
         end loop Print_Loop;

      end if;


   end Print_Buffer;

   procedure Draw_Buffer (Spawn_Result : in Result_Access; Win : in Window_Record; File_Index : in Natural) is
      Line_Index : Natural := 0;
      Result_Max_Lines : Positive := Win.Win.H;
      Line_Count : Natural := 0;
      Term_Width : constant Natural := Win.Win.W-2;
   begin


      if Spawn_Result /= null and then Spawn_result.Wlines /= null then


     Print_Loop:
        
         for I in File_Index+1..Positive'min(File_Index+((Result_Max_Lines-5)),
                                             Spawn_Result.Wlines'Length) loop
            declare
               tmp : constant Wide_String :=
                 (-Spawn_Result.Wlines(I));
               Line : constant Wide_String := Tmp(Tmp'First..Wide_Fixed.Index_Non_Blank((Tmp), Backward));
        
               Chars_Max : constant Positive := Term_Width;
               Lines_Max : constant Positive := (Result_Max_Lines-5);
            begin
               if Real_Length(Line) > 0 and Real_Length(Line) < (Chars_Max * Lines_Max) then
                  for Line_Window in Line_Index..Integer'min(Real_Length(Line)/Chars_Max, Lines_Max) loop
                
                     declare
                        B_Inf : constant Positive := Line_Window*Chars_Max + 1;
                        B_Sup : constant Positive := Integer'min((Line_Window +1)*Chars_Max, Real_Length(Line));
                     begin
                        if Real_length(Line) < Chars_max then
                           Draw_Text(Win, Line_Count+1, 1, White, Line);
                        else
                           Draw_Text(Win, Line_Count+1, 1, White, Line(B_Inf..B_Sup));
                        end if;
                     end;
                     Line_Count := Line_Count + 1;
                     exit Print_Loop When Line_Count > (Result_Max_Lines-1);
                  end loop;
               else
                  Line_Count := Line_Count + 1;
               end if;
            end;
            exit Print_Loop when Line_Count > (Result_Max_Lines-1);
         end loop Print_Loop;

      end if;


   end Draw_Buffer;

   procedure Edit_Win_Init (Center : access Main_Interface_Record;Top : in Natural;Full : in boolean) is

      Doc_Height : Positive := ((Lines - 13));

   begin
      if not full then
         Initialize(Center.Left_view.Win, 1, Top+1, Lines, Columns/2, Blue, White);

         Initialize(Center.Doc_States.Win, 3, Top+2, 5, Columns/2-2, Blue, cyan);
        
         Initialize(Center.Document.Win, 8, Top+2, Doc_Height, Columns/2-2, White, Red);
      else
         Initialize(Center.Left_view.Win, 1, Top+1, Lines, Columns, Blue, White);

         Initialize(Center.Doc_States.Win, 3, Top+2, 5, Columns-2, Blue, cyan);
        
         Initialize(Center.Document.Win, 8, Top+2, Doc_Height, Columns-2, White, Red);
      end if;

   end Edit_Win_Init;



   function Set_Size (Lines_Table : in Wide_Set) return Natural is
      Count : Natural := 0;
   begin
      for Wline in 1..Lines_Table.Line_Last loop
         Count := Count + Lines_Table.Lines(Wline)'Length;
      end loop;
      return Count;
   end Set_Size;



   procedure Open_Doc (Lines_Table : in out Wide_Set;
                       Docume : out Docume_Access;
                       Filename : in String) is

      File : W_Io.File_Type;
      Line_Last    : Natural := 0;
      Dot_Index    : Natural := 0;
      Owner_result : Result_Access;
      Success      : Boolean := False;

      Errno        : Integer := 0;
   begin

      Line_Last := 0;
      Set_Free(Lines_Table);

      if Os_Lib.Is_Regular_File(Filename) then

         W_Io.Open(File, W_Io.In_File, Filename, Form => "WCEM=8");

         while not W_Io.End_Of_File(File) loop
            declare
               Wline : constant Wide_Access := new Wide_String ' (W_Io.Get_Line(File));
            begin

               Lines_Table.Lines(Line_Last + 1) := Wline;
               Line_Last := Line_Last + 1;
            end;
         end loop;

         Lines_Table.Line_Last := Line_Last;
        
         W_Io.Close(File);
        
        
        
         Docume := new Docume_Record;
        
         Docume.Creation_Date := Time_Of(1970, 1, 1, 0.0);
         Docume.Last_Edition := Clock;

         Docume.Filename := new String ' (Filename);
         declare
            Dir : Dir_Name_Str := Dir_Name (Filename);
         begin
            case Os_Constants.Target_Os is
               when Os_Constants.Other_Os =>
                
                  Docume.Fullpath := new String ' (Dir & Dir_Separator & Base_Name(Filename));
                

                  Owner_Result := new Spawn_Result_Type '
                    (Spawn("ls -l " & Docume.Filename.all, ".Out_File.txt"));
                

                
                  if ((Owner_Result /= null) and then
                        (Owner_Result.Wlines /= null)) then
                     declare
                        Line : constant Wide_String := (-Owner_Result.Wlines(1))
;
                        Top  : Natural := 0;
                        Bot  : Natural := 0;
                     begin
                        for I in 1..2 loop
                           Top := Index(Line(Top+1..Line'Last), " ");
                        end loop;
                        Bot := Index(Line(Top+1..Line'Last), " ");
                        Docume.Owner := new String ' (Handling.To_String(Line(Top+1..Bot-1)));
                     end;
                  end if;

               when Os_Constants.Windows =>
                
                  Docume.Fullpath := new String ' (Dir & Dir_Separator & Base_Name(Filename));
               when others =>
                  null;
            end case;
        
         end;
        
         Dot_Index := Fixed.Index(Filename, ".");
         if Dot_Index /= 0 then
            Docume.Title := new String ' (Base_Name(Filename, Filename(Dot_Index..Filename'Last)));
        
            Docume.Unit := new String ' (Filename(Dot_Index+1..Filename'Last));
         else
            Docume.Title := new String ' (Directories.Simple_Name(Filename));
            Docume.Unit := new String ' (Directories.Simple_Name(Filename));
         end if;
         Docume.Openned := True;
        
         Docume.Size := Set_Size(Lines_Table);

      else
        
         declare
        
            Not_Found : constant Wide_String := New_Wide_String("Open document : document not found.", "Press 'enter' to continue.", 30, lines/2-1, Columns/4-15, False);
         begin
            null;
         end;
         raise Spec_Error;
      end if;

   end Open_Doc;


   procedure New_Doc (Center : in Main_Interface_Record;
                      Lines_Table : in out Wide_Set;
                      Docume : out Docume_Access;
                      Filename : in String;
                      Version  : in Wide_String;
                      License : in Boolean;
                      Description : in Wide_string) is
      Dot_Index    : Natural := Fixed.Index(Filename, ".", Backward);
   begin
      for Line in 1..Lines_Table.Line_Last+1 loop
         Wide_Free(Lines_Table.Lines(Line));
      end loop;
      Lines_Table.Line_Last := 0;
      Docume := new Docume_Record;

      Docume.Title := new String ' (Base_Name(Filename, Filename(Dot_Index..Filename'Last)));

      Docume.Filename := new String ' (Filename);
      Docume.Creation_Date := Clock;
      Docume.Last_Edition := Clock;
      Dot_Index := Fixed.Index(Filename, ".");

      Docume.Unit := new String ' (Filename(Dot_Index+1..Filename'Last));

      Docume.Openned := True;
      if License then
         Lines_Table.Lines(1) := new Wide_String ' ("--" & ((80 - 27) * ' ') & Handling.To_Wide_String(Formatting.Image(Clock)));

         Lines_Table.Lines(2) := new Wide_String ' (("-- " & Handling.To_Wide_String(Docume.Title.all) & ' ' & Description & ' ' & (((80 - 8) - (Docume.Title'Length + Description'length + 2)) * ' ') & "--"));

         Lines_Table.Lines(3) :=
           new Wide_String ' ("-- " & Handling.To_Wide_String(Docume.Title.all)& ' ' & "Copyright (C)" &
                                Handling.To_Wide_String(Calendar.Year_Number'Image(Year(Clock))) & ' ' &
                                Handling.To_Wide_String(Center.User_Auth.Logname.all));

         Lines_Table.Lines(4) := new Wide_String ' (((80-3) * '-'));
         Lines_Table.Lines(5) := new Wide_String ' ("-- This program is free software; you can redistribute it and/or modify");
        
         Lines_Table.Lines(6) := new Wide_String ' ("-- it under the terms of the GNU General Public License as published by");
         Lines_Table.Lines(7) := new Wide_String ' ("-- the Free Software Foundation; either version 2 of the License, or");
         Lines_Table.Lines(8) := new Wide_String ' ("-- (at your option) any later version.");
         Lines_Table.Lines(9) := new Wide_String ' ("--");
         Lines_Table.Lines(10) := new Wide_String ' ("-- This program is distributed in the hope that it will be useful,");
         Lines_Table.Lines(11) := new Wide_String ' ("-- but WITHOUT ANY WARRANTY; without even the implied warranty of");
         Lines_Table.Lines(12) := new Wide_String ' ("-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the");
         Lines_Table.Lines(13) := new Wide_String ' ("-- GNU General Public License for more details.");
         Lines_Table.Lines(14) := new Wide_String ' ("");
         Lines_Table.Lines(15) := new Wide_String ' ("-- You should have received a copy of the GNU General Public License");
         Lines_Table.Lines(16) := new Wide_String ' ("-- along with this program; if not, write to the Free Software");
         Lines_Table.Lines(17):= new Wide_String ' ("-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA");
         Lines_Table.Lines(18) := new Wide_String ' (((80-3) * '-'));
         Lines_Table.Lines(19) := new Wide_String ' ("-- Date    := """ & Handling.To_Wide_String(Formatting.Image(Docume.Creation_Date)) & """");
         Lines_Table.Lines(20) := new Wide_String ' ("-- Version := """ & Version & """");
         Lines_Table.Line_Last := 20;
      end if;


   end New_Doc;


   procedure Doc_Init (Center : in Main_Interface_Record;
                       Lines_Table : in out Wide_Set) is
      Color     : constant String := Character'Val(27) & "[01;36m";
      Normal    : constant String := Character'Val(27) & "[00m";

   begin
      Lines_Table.Lines(1) := new Wide_String ' ("Hello " & Handling.To_Wide_String(Color & Center.User_Auth.Logname.all & Normal) &
                                                   " and welcome to Devel mode of Elhoim program.");

      Lines_Table.Lines(2) := new Wide_String ' ("For to create an new document, you must try Crtl+N.");
      Lines_Table.Lines(3) := new Wide_String ' ("For to open an existing document, you must try Ctrl+O.");
      Lines_Table.Lines(4) := new Wide_String ' ("For to save an openned document, you must try Ctrl+A.");
      Lines_Table.Lines(5) := new Wide_String ' ("");
      Lines_Table.Lines(6) := new Wide_String ' ("");
      Lines_Table.Lines(7) := new Wide_String ' ("When you create a new document, you must to give :");
      Lines_Table.Lines(8) := new Wide_String ' ("  - A name of file with 65 characters maximum.");
      Lines_Table.Lines(9) := new Wide_String ' ("  - If you want to initialize you document with an Gnu Public license,");
      Lines_Table.Lines(10) := new Wide_String ' ("    you must to give the description for your document.");
      Lines_Table.Lines(11) := new Wide_String ' ("The Gnu Public license is in Ada programming language commented text: ");
      Lines_Table.Lines(12) := new Wide_String ' ("");
      Lines_Table.Lines(13) := new Wide_String ' (((80-3) * '-'));
      Lines_Table.Lines(14) := new Wide_String ' ("-- This program is free software; you can redistribute it and/or modify");

      Lines_Table.Lines(15) := new Wide_String ' ("-- it under the terms of the GNU General Public License as published by");
      Lines_Table.Lines(16) := new Wide_String ' ("-- the Free Software Foundation; either version 2 of the License, or");
      Lines_Table.Lines(17) := new Wide_String ' ("-- (at your option) any later version.");
      Lines_Table.Lines(18) := new Wide_String ' ("--");
      Lines_Table.Lines(19) := new Wide_String ' ("-- This program is distributed in the hope that it will be useful,");
      Lines_Table.Lines(20) := new Wide_String ' ("-- but WITHOUT ANY WARRANTY; without even the implied warranty of");
      Lines_Table.Lines(21) := new Wide_String ' ("-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the");
      Lines_Table.Lines(22) := new Wide_String ' ("-- GNU General Public License for more details.");
      Lines_Table.Lines(23) := new Wide_String ' ("");
      Lines_Table.Lines(24) := new Wide_String ' ("-- You should have received a copy of the GNU General Public License");
      Lines_Table.Lines(25) := new Wide_String ' ("-- along with this program; if not, write to the Free Software");
      Lines_Table.Lines(26):= new Wide_String ' ("-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA");
      Lines_Table.Lines(27) := new Wide_String ' (((80-3) * '-'));

      Lines_Table.Line_Last := 27;
   end Doc_Init;



   procedure Edit_Draw_Main_Win (Center : access Main_Interface_Record) is
   begin
      Draw_Window(Center.Left_view.Win);

      Draw_Window(Center.Doc_States.Win);

      Draw_Window(Center.Document.Win);

      Draw_Window(Center.Buffer.Win);
   end Edit_Draw_Main_win;

   procedure Devel_Draw_Main_Win (Center : access Main_Interface_Record) is
   begin
      Draw_Window(Center.Left_view.Win);

      Draw_Window(Center.Doc_States.Win);

      Draw_Window(Center.Document.Win);

      Draw_Window(Center.Buffer.Win);

      Draw_Window(Center.Cmd.Win);
      Draw_Window(Center.Err.Win);
      Draw_Window(Center.Cmd_Result.Win);
   end Devel_Draw_Main_Win;




   ----------------------------------------------------
   --                   Auth mode                    --

   procedure Users_Read (Users : in out User_Set; filename : in string) is

      File : W_Io.File_Type;
      Iter : Natural := 0;


   begin
      W_Io.Open(File, W_Io.In_File, filename, Form => "WCEM=8");
      while not W_Io.End_Of_File(File) loop
         --Player_Type := Player_Enum'Value(Handling.To_String(W_Io.Get_Line(File)));
         declare
            user : User_Record;
         begin
            User.Logname := new String ' (Handling.To_String(W_Io.Get_Line(File)));
            User.Password := new String '(Handling.To_String(W_Io.Get_Line(File)));
            User.Identity.Full_Name := new Wide_String ' (W_Io.Get_Line(File));
            User.Identity.address := new Wide_String ' (W_Io.Get_Line(File));
            User.Identity.City_Code := new Wide_String ' (W_Io.Get_Line(File));
            User.Identity.City_Name := new Wide_String ' (W_Io.Get_Line(File));
            User.Identity.email := new Wide_String ' (W_Io.Get_Line(File));
            User.Identity.Web_Addr := new Wide_String ' (W_Io.Get_Line(File));
            Users.set(Iter + 1) := new User_Record ' (User);
            Iter := Iter + 1;
         end;
      end loop;
      Users.User_Last := Iter;
      W_Io.Close(File);
   end Users_Read;

   procedure Users_write (Users : in out User_Set; filename: in String) is

      File : W_Io.File_Type;

   begin

      W_Io.Create(File, W_Io.Out_File, filename, Form => "WCEM=8");

      for Iter in 1..Users.User_Last loop
         declare
            User : constant User_Record := Users.Set(Iter).all;
         begin
        
            if User.Logname /= null then
        
               W_Io.Put_Line(File, Handling.To_Wide_String(User.Logname.all));
        
               W_Io.Put_Line(File, Handling.To_Wide_String(User.Password.all));

               W_Io.Put_Line(File, User.Identity.Full_Name.all);

               W_Io.Put_Line(File, User.Identity.Address.all);

               W_Io.Put_Line(File, User.Identity.City_Code.all);

               W_Io.Put_Line(File, User.Identity.City_Name.all);

               W_Io.Put_Line(File, User.Identity.Email.all);

               if User.Identity.Web_Addr /= null then

                  W_Io.Put_Line(File, User.Identity.Web_Addr.all);
               else
                  W_Io.Put_Line(File, "");
               end if;
            else
        
               exit;
            end if;
        
         end;
      end loop;
      W_Io.Close(File);
   end Users_write;



   function New_Wide_String (Title : in Wide_String;
                             Label : in Wide_String;
                             Length : in Positive;
                             Line, Col : in Positive;
                             Print : in Boolean) return Wide_String is

      Line_Win : Window_Type :=
        (Line, Col, 5, Label'Length+3+Length+4, Single_Line_Frame, Cyan, Yellow);
      Wline     : Wide_Access := new Wide_String ' ("");
      Buff     : Wide_Access;
      Wchar    : Wide_Character := Wide_Character'Val(32);
   begin
      loop
         Draw_Window(line_Win);
         Draw(line_Win, 1, Line_Win.W/2-Title'length/2, yellow, Title);
         Draw(line_Win, 2, 2, cyan, Label);
         if Wline /= null and then
           Wline'Length > 0 then
            if Print then
               Draw(line_Win, 2, 2+Label'Length, white, Wline.all);
            else
               Draw(line_Win, 2, 2+Label'Length, red, ((Wline'Length * '*')));
            end if;
         end if;
         W_Io.Get_Immediate(Wchar);
         if Is_control(Wchar) then
            case Wchar is
               when Wide_Character'Val(10) =>
                  exit;
               when Wide_Character'Val(12) =>
                  null;
               when Wide_Character'Val(27) =>
                  raise W_Io.End_Error;
               when Wide_Character'Val(127) =>
                  if Wline /= null and then
                    Wline'Length > 0 then
                     Buff := new Wide_String ' (Wline(Wline'First..Wline'Last-1));
                     Wide_Free(Wline);
                     Wline := new Wide_String ' (Buff.all);
                     Wide_Free(Buff);
                  else
                     W_Io.Put(Wide_Character'Val(7));
                  end if;
               when others =>
                  null;
            end case;

         else
            if Wline /= null and then
              Wline'Length >= Length then
               W_Io.Put(Wide_Character'Val(7));
            else
               Buff := new Wide_String ' (Wline.all & Wchar);
               Wide_Free(Wline);
               Wline := new Wide_String ' (Buff.all);
               Wide_Free(Buff);
            end if;
         end if;
      end loop;
      return Wline.all;
   end New_Wide_String;

   type Main_Interface_Record is limited
      record
        
         Lines         : Line_Range := 67;
         Columns       : Column_Range := 240;
         Term    : Term_Enum := Linux;
         Mode    : Mode_Enum := Devel;
        
         ------------------------------------------------------------
         --                    Devel/Editor                        --
         Left_View        : Frame_Record;
         Buffer           : Frame_Record;
         Document         : Frame_Record;
         Doc_States       : Frame_Record;
         Doc_Initialized  : Boolean := False;
         Current_Doc      : Borg.Editor.Docume_Access;
         ------------------------------------------------------------
        
        
      end record;



   App    : aliased Main_Interface_Record;

begin
   null;
end Edit;