Specyfikacja Pakietu JEWL.IO

------------------------------------------------------------------------------
--                                                                          --
--                             J E W L . I O                                --
--                                                                          --
--   Rozszerzony pakiet Wejścia/Wyjścia dla początkujących używający        --
--   graficznych dialogów dla wejścia, który wypisuje także informację      --
--   dziennika to zwykłego wyjścia.                                         --
--                                                                          --
--   Poniższa dokumentacja zakłada, że jesteś obeznany z głównymi           --
--   możliwościami oferowanymi przez Ada.Text_IO.                            --
--                                                                          --
--   Prawa (C) John English 2000. Adres kontaktowy: je@brighton.ac.uk       --
--   To oprogramowanie zostało wydane zgodnie z założeniami GNU Powszechnej --
--   Licencji Publicznej i jest przeznaczone głównie dla użytku             --
--   edukacyjnego. Skontaktuj się z autorem by zgłosić błędy, sugestie      --
--   i modyfikacje.                                                         --
--                                                                          --
------------------------------------------------------------------------------

with Ada.Text_IO;

package JEWL.IO is

  ----------------------------------------------------------------------------
  --
  -- Kilka lokalnych nazw typów z Ada.Text_IO
  --
  subtype Positive_Count is Ada.Text_IO.Positive_Count;
  subtype File_Type      is Ada.Text_IO.File_Type;

  ----------------------------------------------------------------------------
  --
  -- Wyjątki, które pakiet może wywołać
  --
  Input_Cancelled : exception;      -- użytkownik anulował dialog wejścia

  ----------------------------------------------------------------------------
  --
  -- Procedury wyświetlające wiadomości
  --
  procedure Message (Text : in String);                 -- wiadomość informacyjna
  procedure Error   (Text : in String);                 -- wiadomość o błędzie
  function  Query   (Text : in String) return Boolean;  -- pytanie tak/nie

  ----------------------------------------------------------------------------
  --
  -- Przejście do nowej linii, jak w  Ada.Text_IO
  --
  procedure New_Line (Spacing : in Ada.Text_IO.Positive_Count := 1)
            renames Ada.Text_IO.New_Line;

  ----------------------------------------------------------------------------
  --
  -- Otwieranie i zamykanie plików, używając standardowych dialogów by pobrać nazwy plików
  --
  procedure Open   (File  : in out File_Type;   -- otwórz istniejący plik
                    Title : in String := "Wybierz plik wejściowy");
  procedure Create (File  : in out File_Type;   -- stwórz nowy plik
                    Title : in String := "Wybierz plik wyjściowy");
  procedure Append (File  : in out File_Type;   -- dopisz do istniejącego/nowego pliku
                    Title : in String := "Wybierz plik wyjściowy");
  procedure Close  (File   : in out Ada.Text_IO.File_Type)
                                renames Ada.Text_IO.Close;
                                                -- zamknij otwarty plik

  ----------------------------------------------------------------------------
  --
  --  Standardowe pozycjonowanie pliku i zapytania, jak w Ada.Text_IO
  --
  procedure New_Line    (File    : in Ada.Text_IO.File_Type;
                         Spacing : in Positive_Count := 1)
                                renames Ada.Text_IO.New_Line;
  procedure Skip_Line   (File    : in Ada.Text_IO.File_Type;
                         Spacing : in Positive_Count := 1)
                                renames Ada.Text_IO.Skip_Line;
  function  End_Of_Line (File    : in Ada.Text_IO.File_Type)
                         return Boolean
                                renames Ada.Text_IO.End_Of_Line;
  function  End_Of_File (File    : in Ada.Text_IO.File_Type)
                         return Boolean
                                renames Ada.Text_IO.End_Of_File;

  ----------------------------------------------------------------------------
  --
  --                     PODSTAWOWE OPERACJE WEJŚCIA/WYJŚCIA
  --
  --                              ---- WEJŚCIE ----
  --
  --  Dla każdego typu skalarnego (z podstawowymi pakietami dla enumeracji, typów
  --  całkowitych i zmiennoprzecinkowych i wsparcia dostarczonego jako standard dla
  --  Stringów, znaków (Character), Integer-ów, Float-ów, i Bool):
  --
  --  Get (Item    => X,       -- pobierz wartość do X,
  --       Default => Y,       -- z początkową domyślną wartością Y (opcjonalnie)
  --       Prompt  => Z);      -- wyświetlając Z jako echo (szept) (opcjonalnie),
  --
  --  Get (File    => F,
  --       Item    => X);      -- pobierz wartość do X z pliku F
  --
  --  Echo (szept) jest zawsze stringiem; domyślna wartość zależy od typów danych, które
  --  biorą udział. W przypadku Stringa moze dojść do dwuznaczności jako, że echo i 
  --  domyślne wartości są Stringami. Rekomendowany sposób to ustawienie parametrów
  --  jako "Prompt=>X" i "Default=>X", by uniknąć dwuznaczności.
  --
  --  Strings są trochę inne: istnieje funkcja, która pobiera String
  --  (unconstrained) i procedura, która pobiera wartość do String ale jednocześnie zwraca
  --  długość Stringa:
  --
  --  S := Get (Prompt  => Y,  -- opcjonalnie
  --            Default => Z); -- opcjonalnie
  --
  --  Get (Item    => X,       -- pobierz wartość do X,
  --       Length  => L,       -- którego długość wynosi L,
  --       Prompt  => Y,       -- wyświetlając Y jako echo (opcjonalnie),
  --       Default => Z);      -- z początkową domyślną wartością Z (opcjonalnie)
  --
  --  Get (File    => F,
  --       Item    => X,       -- pobierz wartość do X z pliku F,
  --       Length  => L);      -- której długość wynosi L
  --
  --                               ---- WYJŚCIE ----
  --
  --  Wartości mogą być wysłane do standardowego wyjścia lub do pliku, z lub bez nową
  --  linią na końcu:
  --
  --  Put (Item => X);         -- zapisz wartość X na standardowym wyjściu
  --  Put (File => F,
  --       Item => X);         -- zapisz wartość X do pliku
  --
  --  Put_Line (Item => X);    -- zapisz wartość X i nową linię na standardowym wyjściu
  --  Put_Line (File => F,
  --            Item => X);    -- zapisz wartość X i nową linię do pliku
  --
  --                            ---- Konwersja typów ----
  --
  --  S := To_String(X)        -- konwertuj nie-String do typu String
  --  S := S & X;              -- połącz String i X
  --  S := X & S;              -- połącz X i String
  --
  ----------------------------------------------------------------------------
  --
  --  Wejście Stringów i Znaków
  --
  function  Get (Prompt  : in  String := "Wpisz swój tekst:";
                 Default : in  String := "")
                 return String;     -- wyświetl dialog z nazwą (Prompt)
                                    -- i pole tekstowe (wartość początkowa domyślna)
                                    -- i zwróć zawartość pola tekstowego
                                    -- jako String (unconstrained)

  procedure Get (Item    : out String;
                 Length  : out Natural;
                 Prompt  : in  String := "Wpisz swój tekst:";
                 Default : in  String := "");
                                    -- użyj tego samego dialogu by pobrać string
                                    -- do zmiennej, maksymalna długość jest limitowana rozmiarem                                       -- Item i aktualną długością przechowywaną
                                    -- w Length, z wartością początkową
  procedure Get (File    : in Ada.Text_IO.File_Type;
                 Item    : out Character)
                                renames Ada.Text_IO.Get;
                                    -- pobierz znak z pliku, z Text_IO
  procedure Get (File    : in Ada.Text_IO.File_Type;
                 Item    : out String;
                 Length  : out Natural)
                                renames Ada.Text_IO.Get_Line;
                                    -- pobierz string i jego długość z pliku,
                                    -- z Text_IO

  ----------------------------------------------------------------------------
  --  Zmiana nazw dla zawartości z Ada.Text_IO
  ----------------------------------------------------------------------------

  procedure Get_Line (Item    : out String;
                      Length  : out Natural     ;
                      Prompt  : in  String := "Wpisz swój tekst:";
                      Default : in  String := "")  renames Get;

  procedure Get_Line (File    : in Ada.Text_IO.File_Type;
                      Item    : out String;
                      Length  : out Natural)       renames Get;

  ----------------------------------------------------------------------------
  --
  --  Wyjście Stringów i Znaków
  --
  procedure Put (Item    : in String)
                                renames Ada.Text_IO.Put;
                                    -- wypisuje string
  procedure Put (Item    : in Character)
                                renames Ada.Text_IO.Put;
                                    -- wypisuje znak
  procedure Put (File    : in Ada.Text_IO.File_Type;
                 Item    : in Character)
                                renames Ada.Text_IO.Put;
                                    -- zapisuj znak do pliku
  procedure Put (File    : in Ada.Text_IO.File_Type;
                 Item    : in String)
                                renames Ada.Text_IO.Put;
                                    -- zapisuje string do pliku

  ----------------------------------------------------------------------------
  --
  --  Wyjście Stringów i Znaków, z nową linią
  --
  procedure Put_Line (Item : in String)
                                renames Ada.Text_IO.Put_Line;
                                    -- wypisuje string i nową linię
  procedure Put_Line (Item : in Character);
                                    -- wypisuje znak i nową linię
  procedure Put_Line (File : in Ada.Text_IO.File_Type;
                      Item : in String)
                                renames Ada.Text_IO.Put_Line;
                                    -- zapisuje string i nową linię do pliku
  procedure Put_Line (File : in File_Type;
                      Item : in Character);
                                    -- zapisuj znak i nową linię do pliku

  ----------------------------------------------------------------------------
  --
  --               LICZBY CAŁKOWITE WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------
  --
  --  Liczby całkowite Wejście
  --
  procedure Get (Item    : out Integer;
                 Prompt  : in  String := "Wprowadź l. całkowitą:");
                                    -- wyświetl dialog z tekstem (Prompt)
                                    -- i puste pole tekstowe, które zwraca
                                    -- zawartość pola tekstowego jako liczbę całkowitą
  procedure Get (Item    : out Integer;
                 Default : in  Integer;
                 Prompt  : in  String := "Wprowadź l. całkowitą:");
                                    -- wyświetl dialog i pole tekstowe
                                    -- zainicjalizowane z wartością domyślną
  procedure Get (File    : in  File_Type;
                 Item    : out Integer);
                                    -- odczytaj liczbę całkowitą z pliku

  ----------------------------------------------------------------------------
  --
  --  Liczby całkowite Wyjście
  --
  procedure Put (Item    : in Integer);
                                    -- wypisz liczbę całkowitą
  procedure Put (File    : in File_Type;
                 Item    : in Integer);
                                    -- zapisz liczbę całkowitą do pliku

  ----------------------------------------------------------------------------
  --
  --  Liczby całkowite Wyjście z nową linią
  --
  procedure Put_Line (Item : in Integer);
                                    -- wypisz liczbę całkowitą i nową linię
  procedure Put_Line (File : in File_Type;
                      Item : in Integer);
                                    -- zapisz liczbę całkowitą i nową linię do pliku

  ----------------------------------------------------------------------------
  --
  --  Procedury zmiany typu liczb całkowitych
  --
  function  To_String (Item : Integer) return String;
                                    -- zmiana l. całkowitej na string
  function  "&" (Left    : String;
                 Right   : Integer)    return String;
                                    -- połącz String & l. całkowitą
  function  "&" (Left    : Integer;
                 Right   : String)     return String;
                                    -- połącz l. całkowitą & String

  ----------------------------------------------------------------------------
  --
  --           LICZBY ZMIENNOPRZECINKOWE WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------
  --
  --  Liczby zmiennoprzecinkowe Wejście
  --
  procedure Get (Item    : out Float;
                 Prompt  : in  String := "Wprowadź l. rzeczywistą:");
                                    -- wyświetl dialog z napisem (Prompt)
                                    -- i puste pole które zwraca zawartość
                                    -- jako liczbę zmiennoprzecinkową
  procedure Get (Item    : out Float;
                 Default : in  Float;
                 Prompt  : in  String := "Wprowadź l. rzeczywistą:");
                                    -- wyświetl ten sam dialog z polem tekstowym
                                    -- z zainicjalizowaną wartością domyślną
  procedure Get (File    : in  File_Type;
                 Item    : out Float);
                                    -- odczytaj l. zmiennoprzecinkową z pliku

  ----------------------------------------------------------------------------
  --
  --  Liczby zmiennoprzecinkowe Wyjście
  --
  procedure Put (Item    : in  Float);
  procedure Put (File    : in  File_Type;
                 Item    : in  Float);

  ----------------------------------------------------------------------------
  --
  --  Liczby zmiennoprzecinkowe Wyjście, z nową linią
  --
  procedure Put_Line (Item : in Float);
  procedure Put_Line (File : in File_Type;
                      Item : in Float);

  ----------------------------------------------------------------------------
  --
  --   Procedury zmiany typu liczb zmiennoprzecinkowych
  --
  function  To_String (Item : Float) return String;

  function  "&" (Left    : String;
                 Right   : Float)    return String;
  function  "&" (Left    : Float;
                 Right   : String)   return String;

  ----------------------------------------------------------------------------
  --
  --               Zmienne BOOL WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------
  --
  --  Bool Wejście
  --
  procedure Get (Item    : out Boolean;
                 Prompt  : in  String := "Tak czy nie?");
                                    -- Wyświetl dialog z przyciskami Tak/Nie/Anuluj
  procedure Get (Item    : out Boolean;
                 Default : in  Boolean;
                 Prompt  : in  String := "Tak");
                                    -- wyświetl dialog z polem zaznaczania
                                    -- inicjalizowany jak wyznaczono przez wartość domyślną
  procedure Get (File    : in  File_Type;
                 Item    : out Boolean);
                                    -- odczytaj Bool z pliku

  ----------------------------------------------------------------------------
  --
  --  Boolean Wyjście
  --
  procedure Put (Item    : in Boolean);
  procedure Put (File    : in File_Type;
                 Item    : in Boolean);

  ----------------------------------------------------------------------------
  --
  --  Boolean Wyjście, z nową linią
  --
  procedure Put_Line (Item : in Boolean);
  procedure Put_Line (File : in File_Type;
                      Item : in Boolean);

  ----------------------------------------------------------------------------
  --
  --  Procedury konwersji Bool
  --
  function  To_String (Item : Boolean) return String;

  function  "&" (Left    : String;
                 Right   : Boolean)    return String;
  function  "&" (Left    : Boolean;
                 Right   : String)     return String;

  ----------------------------------------------------------------------------
  --
  --             TYP WYLICZENIOWY WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------

  generic
    type Item_Type is (<>);
  package Enumeration_IO is

    --------------------------------------------------------------------------
    --
    --  Typ wyliczeniowy Wejście
    --
    procedure Get (Item    : out Item_Type;
                   Prompt  : in  String := "Wybierz wartość:");
                                    -- wyświetl dialog z tekstem (Prompt)
                                    -- i combobox z wartościami zaczynającymi
                                    -- się od typu Item_Type
    procedure Get (Item    : out Item_Type;
                   Default : in  Item_Type;
                   Prompt  : in  String := "Wybierz wartość:");
                                    -- wyświetl dialog z combobox
                                    -- zainicjalizowany z wartością domyślną
    procedure Get (File    : in  File_Type;
                   Item    : out Item_Type);
                                    -- odczytaj wartość Item_Type z pliku

    --------------------------------------------------------------------------
    --
    --  Typ wyliczeniowy Wyjście
    --
    procedure Put (Item    : in  Item_Type);
    procedure Put (File    : in File_Type;
                   Item    : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Typ wyliczeniowy Wyjście, z nową linią
    --
    procedure Put_Line (Item : in Item_Type);
    procedure Put_Line (File : in File_Type;
                        Item : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Procedury konwersji typu wyliczeniowego
    --
    function  To_String (Item : Item_Type) return String;

    function  "&" (Left    : String;
                   Right   : Item_Type)    return String;
    function  "&" (Left    : Item_Type;
                   Right   : String)       return String;

  end Enumeration_IO;

  ----------------------------------------------------------------------------
  --
  --         PODSTAWOWY TYP CAŁKOWITY WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------

  generic
    type Item_Type is range <>;
  package Integer_IO is

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ całkowity Wejście
    --
    procedure Get (Item    : out Item_Type;
                   Prompt  : in  String := "Wprowadź l. całkowitą:");
                                    -- wyświetl dialog z tekstem (Prompt)
                                    -- i puste pole tekstowe, które zwraca
                                    -- zawartość pola tekstowego jako Item_Type
                                    -- o wartości całkowitej
    procedure Get (Item    : out Item_Type;
                   Default : in  Item_Type;
                   Prompt  : in  String := "Wprowadź l. całkowitą:");
                                    -- wyświetl ten sam dialog
                                    -- zainicjalizowany wartością domyślną
    procedure Get (File    : in  File_Type;
                   Item    : out Item_Type);
                                    -- odczytaj wartość Item_Type z pliku

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ całkowity Wyjście
    --
    procedure Put (Item    : in  Item_Type);
    procedure Put (File    : in File_Type;
                   Item    : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ całkowity Wyjście, z nową linią
    --
    procedure Put_Line (Item : in Item_Type);
    procedure Put_Line (File : in File_Type;
                        Item : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Procedury konwersji podstawowego typu całkowitego
    --
    function  To_String (Item : Item_Type) return String;

    function  "&" (Left    : String;
                   Right   : Item_Type)    return String;
    function  "&" (Left    : Item_Type;
                   Right   : String)       return String;

  end Integer_IO;

  ----------------------------------------------------------------------------
  --
  --     PODSTAWOWY TYP ZMIENNOPRZECINKOWY WEJŚCIE, WYJŚCIE I KONWERSJA
  --
  ----------------------------------------------------------------------------

  generic
    type Item_Type is digits <>;
  package Float_IO is

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ zmiennoprzecinkowy Wejście
    --
    procedure Get (Item    : out Item_Type;
                   Prompt  : in  String := "Wprowadź l. zmiennoprzecinkową:");
                                    -- wyświetl dialog z tekstem (Prompt)
                                    -- i puste pole tekstowe, które zwraca
                                    -- zawartość pola tekstowego jako Item_Type
                                    -- o wartości zmiennoprzecinkowej
    procedure Get (Item    : out Item_Type;
                   Default : in  Item_Type;
                   Prompt  : in  String := "Wprowadź l. zmiennoprzecinkową:");
                                    -- wyświetl ten sam dialog z polem tekstowym
                                    -- zainicjalizowanym wartością domyślną
    procedure Get (File    : in  File_Type;
                   Item    : out Item_Type);
                                    -- read an Item_Type value from a file

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ zmiennoprzecinkowy Wyjście
    --
    procedure Put (Item    : in  Item_Type);
    procedure Put (File    : in File_Type;
                   Item    : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Podstawowy typ zmiennoprzecinkowy Wyjście, z nową linią
    --
    procedure Put_Line (Item : in Item_Type);
    procedure Put_Line (File : in File_Type;
                        Item : in Item_Type);

    --------------------------------------------------------------------------
    --
    --  Procedury konwersji podstawowego typu zmiennoprzecinkowego
    --
    function  To_String (Item : Item_Type) return String;

    function  "&" (Left    : String;
                   Right   : Item_Type)    return String;
    function  "&" (Left    : Item_Type;
                   Right   : String)       return String;

  end Float_IO;

end JEWL.IO;