|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 11264 (0x2c00)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Multiple_Selection_Object_Editor_Menu, seg_0046fb
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
with New_Keys, Fonts, Window_Utilities;
with Window_Io;
with Set_Generic;
package body Multiple_Selection_Object_Editor_Menu is
package Element_Set is new Set_Generic (Element);
function Make return Menu_Definition is
begin
return null;
end Make;
function Find_Def (E : Element; Menu_Def : Menu_Definition)
return Menu_Definition is
Temp : Menu_Definition := Menu_Def;
begin
if Temp = null or Temp.Elem = E then
return Temp;
end if;
Temp := Temp.Next;
while Temp /= Menu_Def loop
if Temp.Elem = E then
return Temp;
else
Temp := Temp.Next;
end if;
end loop;
return Menu_Def;
end Find_Def;
function Get_Tail (Def : Menu_Definition) return Menu_Definition is
Temp : Menu_Definition := Def;
begin
if Temp = null then
return Temp;
else
loop
if Temp.Next = Def then
return Temp;
else
Temp := Temp.Next;
end if;
end loop;
end if;
end Get_Tail;
procedure Add (E : Element; To : in out Menu_Definition) is
Temp : Menu_Definition := Get_Tail (To);
begin
if To = null then
To := new Menu_Node'(E, 1, null, null);
To.Next := To;
To.Previous := To;
else
Temp.Next := new Menu_Node'(E, Temp.Line_Number + 1, null, Temp);
Temp.Next.Next := To;
To.Previous := Temp.Next;
end if;
end Add;
procedure Display_Menu (Menu : Menu_Window;
Font : Window_Io.Font := Window_Io.Normal;
Definition : Menu_Definition) is
Temp_Def : Menu_Definition := Definition;
begin
Window_Utilities.Home (Menu);
Window_Utilities.Erase (Menu);
Window_Utilities.Home (Menu);
Window_Io.Insert (Menu, Line_Image (Temp_Def.Elem), Font);
Window_Io.New_Line (Menu, 1);
Temp_Def := Temp_Def.Next;
while Temp_Def /= Definition loop
Window_Io.Insert (Menu, Line_Image (Temp_Def.Elem), Font);
Window_Io.New_Line (Menu, 1);
Temp_Def := Temp_Def.Next;
end loop;
Window_Io.Position_Cursor (Menu);
end Display_Menu;
procedure Create (Menu : Menu_Window;
Font : Window_Io.Font := Window_Io.Normal;
Definition : Menu_Definition) is
Current_Node : Menu_Definition := Definition;
Set_Iterator : Element_Set.Iterator;
My_Set : Element_Set.Set;
Iterator_Node : Menu_Definition;
Selected_Font : Window_Io.Font := Fonts.Inverse_Bold;
Redisplay_Necessary : Boolean;
package Raw renames Window_Io.Raw;
Character_Stream : Raw.Stream_Type;
One_Key : Raw.Key;
function "=" (A, B : Raw.Key) return Boolean renames Raw."=";
begin
Display_Menu (Menu, Font, Definition);
Raw.Open (Character_Stream);
Element_Set.Initialize (My_Set);
loop
Raw.Get (Character_Stream, One_Key);
if One_Key = New_Keys.Up then
Current_Node := Current_Node.Previous;
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
elsif One_Key = New_Keys.Down then
Current_Node := Current_Node.Next;
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
elsif One_Key = New_Keys.Left then
Element_Set.Add (My_Set, Current_Node.Elem);
Window_Io.Overwrite
(Menu, Line_Image (Current_Node.Elem), Selected_Font);
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
elsif One_Key = New_Keys.Right then
Element_Set.Delete (My_Set, Current_Node.Elem);
Window_Io.Overwrite
(Menu, Line_Image (Current_Node.Elem), Font);
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
elsif One_Key = New_Keys.Characters ('.') then
Element_Set.Init (Set_Iterator, My_Set);
while not Element_Set.Done (Set_Iterator) loop
Iterator_Node :=
Find_Def (Element_Set.Value (Set_Iterator), Definition);
Window_Io.Position_Cursor (Menu, Iterator_Node.Line_Number);
Window_Io.Overwrite
(Menu, Line_Image (Iterator_Node.Elem), Font);
Element_Set.Next (Set_Iterator);
end loop;
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
Element_Set.Make_Empty (My_Set);
elsif Is_Applicative_Key (One_Key) then
Raw.Close (Character_Stream);
if Element_Set.Is_Empty (My_Set) then
Apply (One_Key, Current_Node.Elem);
Window_Io.Overwrite
(Menu, Line_Image (Current_Node.Elem), Font);
else
Element_Set.Init (Set_Iterator, My_Set);
Element_Set.Make_Empty (My_Set);
while not Element_Set.Done (Set_Iterator) loop
Iterator_Node :=
Find_Def (Element_Set.Value (Set_Iterator),
Definition);
Apply (One_Key, Iterator_Node.Elem);
Element_Set.Add (My_Set, Iterator_Node.Elem);
Window_Io.Position_Cursor (Menu,
Iterator_Node.Line_Number);
Window_Io.Overwrite
(Menu, Line_Image (Iterator_Node.Elem),
Selected_Font);
Element_Set.Next (Set_Iterator);
end loop;
end if;
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
Raw.Open (Character_Stream);
elsif Is_Executable_Key (One_Key) then
Raw.Close (Character_Stream);
Execute (One_Key, Redisplay_Necessary);
if Redisplay_Necessary then
raise Redisplay_Required;
else
null;
end if;
Window_Io.Position_Cursor (Menu, Current_Node.Line_Number);
Raw.Open (Character_Stream);
elsif One_Key = New_Keys.User_Interrupt then
null;
elsif One_Key = Quit_Key then
Raw.Close (Character_Stream);
exit;
else
Window_Io.Bell (Menu);
end if;
end loop;
end Create;
end Multiple_Selection_Object_Editor_Menu;
nblk1=a
nid=0
hdr6=14
[0x00] rec0=27 rec1=00 rec2=01 rec3=004
[0x01] rec0=1f rec1=00 rec2=02 rec3=03a
[0x02] rec0=00 rec1=00 rec2=0a rec3=01a
[0x03] rec0=20 rec1=00 rec2=03 rec3=050
[0x04] rec0=00 rec1=00 rec2=09 rec3=00c
[0x05] rec0=1e rec1=00 rec2=04 rec3=02a
[0x06] rec0=13 rec1=00 rec2=05 rec3=024
[0x07] rec0=16 rec1=00 rec2=06 rec3=030
[0x08] rec0=18 rec1=00 rec2=07 rec3=03e
[0x09] rec0=0d rec1=00 rec2=08 rec3=000
tail 0x215004e9a815c6771fe7b 0x42a00088462061e03