with String_Utilities;
with Work_Order_Implementation;
with Window_Io;
with Io;
separate (Cm_Generic)
procedure Display (Work_Order : String := ">>ORDER NAME<<") is
    package Woi renames Work_Order_Implementation;
    use Woi;

    Order_Name   : constant String := Work_Order_Path & '.' & Work_Order;
    Order_Id     : Woi.Work_Order_Id;
    Order_Handle : Woi.Work_Order_Handle;
    Status       : Woi.Status;
    Last_Index   : Natural;
    Di           : Woi.Descriptor_Info_Record;

    Output    : Window_Io.File_Type;
    Bold_Font : Window_Io.Font := (Kind => Window_Io.Plain,
                                   Look => (Bold => True, others => False));

    procedure Display_Form_Header (F : Forms) is
    begin
        Window_Io.Insert (Output, "----------  ");
        --Window_Io.Insert (Output, Forms'Image (F));
        Window_Io.New_Line (Output, 2);

    end Display_Form_Header;

    procedure Window_It (Str : String) is
        Ind   : Natural;
        Start : Natural := Str'First;
    begin
        loop
            Ind := String_Utilities.Locate
                      (Character'Val (10), Str (Start .. Str'Last));
            if Ind = 0 then
                exit;
            end if;
            Window_Io.Insert (Output, Str (Start .. Ind - 1));
            Window_Io.New_Line (File => Output, Lines => 1);
            Start := Ind + 1;
        end loop;  
        Window_Io.Insert (Output, Str (Start .. Str'Last));
    end Window_It;
begin


    Work_Order_Control.Find (Order_Name, Order_Id, Status);
    Work_Order_Control.Open (The_Work_Order => Order_Id,
                             The_Handle     => Order_Handle,
                             Success        => Status);

    if Status = 0 then
        Window_Io.Create (Output, Window_Io.Out_File, Work_Order);

        for F in Forms loop
            Display_Form_Header (F);

            for I in Form_Array (F).Start_Item .. Form_Array (F).End_Item loop

                declare
                    Item_Field : Work_Order_Field_Operations.Field;
                    Set_Status : Woi.Status;
                begin
                    Work_Order_Field_Operations.Find
                       (Field_Name    => Items'Image (I),
                        The_Field     => Item_Field,
                        Success       => Set_Status,
                        In_Work_Order => Order_Handle);

                    Window_Io.Insert (Output, Items'Image (I),
                                      Image => Bold_Font);
                    Window_Io.Move_Cursor (File          => Output,
                                           Delta_Lines   => 0,
                                           Delta_Columns => 2,
                                           Offset        => 0);
                    if Set_Status = 0 then
                        Di := Work_Order_Field_Operations.Descriptor_Info
                                 (Item_Field);
                        if Di.Is_Vector then

                            Work_Order_Field_Operations.High_Index
                               (The_Field => Item_Field,
                                Result    => Last_Index,
                                Success   => Status);

                            for X in 1 .. Last_Index loop
                                Window_It (Work_Order_Field_Operations.Value
                                              (The_Field => Item_Field,
                                               Index     => X));
                            end loop;
                        else
                            Window_It (Work_Order_Field_Operations.Value
                                          (The_Field => Item_Field));

                        end if;
                    end if;
                    Window_Io.New_Line (File => Output, Lines => 2);
                end;
            end loop;
        end loop;

        Window_Io.Close (Output);
        Work_Order_Control.Close
           (The_Handle => Order_Handle, Success => Status);
    else
        Io.Put_Line (Io.Standard_Error, "Unable to display " & Work_Order);
    end if;

end Display;