User Interface for CD Database Manager
WITH Ada.Text_IO;
WITH Screen;
WITH Compact;
PROCEDURE My_CD_Manager IS
------------------------------------------------------------------
--| shell of menu-driven user interface for CD record "database"
--| when correct input is entered, a message is displayed
--| instead of actually executing the command .
--|                                                              
--| Author: Michael B. Feldman, The George Washington University 
--| Last Modified: April 1996
------------------------------------------------------------------

  TYPE MenuValues IS (C,      -- Clear database
                      R,      -- Read database from disk
                      W,      -- Write database to disk
                      A,      -- Add a CD record
                      D,      -- Delete a CD record
                      F,      -- Find and display a CD record     
                      P,      -- Display all records
                      Q);     -- Quit the program

  PACKAGE Menu_IO IS
    NEW Ada.Text_IO.Enumeration_IO (Enum => MenuValues);

  MenuSelection : MenuValues;

BEGIN -- My_CD_Manager

  Screen.ClearScreen;

  LOOP -- main program loop

    -- First display the menu on the screen

    Screen.MoveCursor (Row => 5, Column => 20);
    Ada.Text_IO.Put (Item => "Select one of the operations below.");
    Screen.MoveCursor (Row => 7, Column => 20);
    Ada.Text_IO.Put (Item => "C  Clear the database");
    Screen.MoveCursor (Row => 8, Column => 20);
    Ada.Text_IO.Put (Item => "R  Read database from disk");
    Screen.MoveCursor (Row => 9, Column => 20);
    Ada.Text_IO.Put (Item => "W  Write database to disk");
    Screen.MoveCursor (Row => 10, Column => 20);
    Ada.Text_IO.Put (Item => "A  Add CD record to database");
    Screen.MoveCursor (Row => 11, Column => 20);
    Ada.Text_IO.Put (Item => "D  Delete CD record from database");
    Screen.MoveCursor (Row => 12, Column => 20);
    Ada.Text_IO.Put (Item => "F  Find a CD record in the database");
    Screen.MoveCursor (Row => 13, Column => 20);
    Ada.Text_IO.Put (Item => "P  Display all records in the database");
    Screen.MoveCursor (Row => 14, Column => 20);
    Ada.Text_IO.Put (Item => "Q  Exit the program");

    -- Now get a menu selection, robustly

    LOOP
      BEGIN -- exception handler block

        Screen.MoveCursor (Row => 16, Column => 20);
        Ada.Text_IO.Put ("Please type a command, then press Enter > ");

        -- this statement will raise Data_Error if input is invalid
        Menu_IO.Get (Item => MenuSelection);

        -- these statements will be executed only if the input is correct
        -- otherwise, control passes to exception handler
        Screen.MoveCursor (Row => 18, Column => 20);
        Ada.Text_IO.Put ("Thank you for correct input.");
        Ada.Text_IO.New_Line;
        EXIT;      -- valid data; go ahead to process it

      EXCEPTION    -- invalid data
        
        WHEN Ada.Text_IO.Data_Error =>
          Screen.Beep;
          Screen.MoveCursor (Row => 22, Column => 20);
          Ada.Text_IO.Put (Item => "                                 ");
          Screen.MoveCursor (Row => 22, Column => 20);
          Ada.Text_IO.Put (Item => "Value entered is not a command.");
          Ada.Text_IO.Skip_Line;
        WHEN OTHERS =>
          Screen.Beep;
          Screen.MoveCursor (Row => 22, Column => 20);
          Ada.Text_IO.Put (Item => "                                 ");
          Screen.MoveCursor (Row => 22, Column => 20);
          Ada.Text_IO.Put (Item => "Unknown error; try again, please.");
          Ada.Text_IO.Skip_Line;
        
      END;         -- of exception handler block

    END LOOP;

    -- Now select which command to dispatch

    Screen.MoveCursor (Row => 22, Column => 20);
    Ada.Text_IO.Put (Item => "                                   ");
    Screen.MoveCursor (Row =>22, Column => 20);
    CASE MenuSelection IS
      WHEN C =>
        Ada.Text_IO.Put (Item => "C entered; here we'd clear");
      WHEN R =>
        Ada.Text_IO.Put (Item => "R entered; here we'd add");
      WHEN W =>
        Ada.Text_IO.Put (Item => "W entered; here we'd delete");
      WHEN A =>
        Ada.Text_IO.Put (Item => "A entered; here we'd add");
      WHEN D =>
        Ada.Text_IO.Put (Item => "D entered; here we'd delete");
      WHEN F =>
        Ada.Text_IO.Put (Item => "F entered; here we'd find");
      WHEN P =>
        Ada.Text_IO.Put (Item => "P entered; here we'd display all");
      WHEN Q =>
        Ada.Text_IO.Put (Item => "Q entered; have a niiiiccce day.....");
        EXIT;   -- the main loop and quit the program
    END CASE;

    Ada.Text_IO.New_Line;

  END LOOP;

END My_CD_Manager;