home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / pdl / gad.src < prev    next >
Encoding:
Text File  |  1988-05-03  |  1010.5 KB  |  24,108 lines

  1. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. --gks_specification_spec.ada
  3. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4. -- VERSION 85-11-06 08:00 by JB
  5. --
  6. -- THIS VERSION IS CALL COMPATIBLE WITH THE ANSI ADA TO GKS BINDING
  7. --
  8.    generic
  9.       type COORDINATE_TYPE is digits <> ;
  10.    package GKS_COORDINATE_SYSTEM is
  11.       ---------------------------------------------------------
  12.       -- The following structure declarations define the
  13.       -- various GKS coordinate system spaces:
  14.       --
  15.       -- LIMITS    : Coordinate system boundary values.
  16.       -- POINT     : Definition of point in coordinate system. 
  17.       -- VECTOR    : Definition of vector in coordinate system.
  18.       -- SIZE      : Character size in coordinate system.
  19.       -- RECTANGLE : Rectangle in coordinate system.
  20.       ---------------------------------------------------------
  21.      subtype POSITIVE_COORDINATE_TYPE is COORDINATE_TYPE ; 
  22.      subtype MAGNITUDE is COORDINATE_TYPE ; 
  23.  
  24.      type LIMITS is 
  25.         record 
  26.            MIN : COORDINATE_TYPE ; 
  27.            MAX : COORDINATE_TYPE ; 
  28.         end record ; 
  29.  
  30.       type POINT is 
  31.          record 
  32.             X : COORDINATE_TYPE ; 
  33.             Y : COORDINATE_TYPE ; 
  34.         end record ; 
  35.       type POINT_ARRAY is array ( integer range <> ) of POINT ; 
  36.  
  37.       type VECTOR is 
  38.          record 
  39.             X : COORDINATE_TYPE ; 
  40.             Y : COORDINATE_TYPE ; 
  41.          end record ; 
  42.  
  43.       type SIZE is 
  44.          record 
  45.             X : POSITIVE_COORDINATE_TYPE ; 
  46.             Y : POSITIVE_COORDINATE_TYPE ; 
  47.          end record ; 
  48.    
  49.       type RECTANGLE_LIMITS is 
  50.          record 
  51.             X : LIMITS ; 
  52.             Y : LIMITS ; 
  53.          end record ; 
  54.  
  55.    end GKS_COORDINATE_SYSTEM ;
  56.  
  57. with GKS_COORDINATE_SYSTEM ;
  58. package GKS_SPECIFICATION is 
  59. -- ==============================================================
  60. --  This package implements the type declarations for the
  61. --  version of the Graphical Kernel System (GKS) developed 
  62. --  by SYSCON Corporation for use with the Graphic Ada Designer.
  63. --  The specification is based on:
  64. --
  65. --      1) The Ada Phase I GKS developed by Harris Corp.
  66. --      2) Draft GKS Binding to ANSI Ada
  67. --
  68. --  The types and operations declared below, reflect the
  69. --  facilities required by the Graphic Ada Designer.  Unused
  70. --  operations may be commented out to reduce compilation
  71. --  overhead.
  72. -- ==============================================================
  73.  
  74. --
  75. -- Define required constants
  76. --
  77.  
  78.    -- File name of default error file
  79.    DEFAULT_ERROR_FILE : constant STRING := "GKS_ERROR_FILE.LIS" ;
  80.  
  81.    -- Define the maximum memory available
  82.    MAXIMUM_MEMORY_AVAILABLE : constant INTEGER := 32767 ;
  83.  
  84.    -- Define the maximum number of workstations in the system
  85.    MAX_WS_TYPE : constant INTEGER := 2 ; -- currently only envision & tek
  86.  
  87.    -- Define the decimal digits of floating point precision
  88.    PRECISION : constant POSITIVE := 5 ;
  89.  
  90.    -- Define the lower and upper boundaries of the WC system
  91.    MIN_WC : constant := 0.0 ;
  92.    MAX_WC : constant := 32_767.0 ;
  93.  
  94. --
  95. -- Define required types
  96. --
  97.  
  98.    -- This type defines an aspect source flag whose value indicates
  99.    -- whether individual attributes are to be used, or attributes as
  100.    -- specified in a bundle table.
  101.    type ASF is ( BUNDLED, INDIVIDUAL ) ;
  102.  
  103.    -- Defines a character expansion factor.  Factors are unitless,
  104.    -- and must be greater than zero.
  105.    type CHAR_EXPANSION is digits PRECISION ;
  106.  
  107.    -- Defines a character spacing factor. The factors are
  108.    -- unitless. A positive value incicates the amount of
  109.    -- space between characters in a text string, and a 
  110.    -- negative value indicates the amount of overlap between
  111.    -- characters in a text string.
  112.    type CHAR_SPACING is digits PRECISION ; 
  113.  
  114.    -- Indices in to color tables are of this type.
  115.    type COLOUR_INDEX is new Integer ; 
  116.  
  117.    -- Defines the range of possible intensities of a color.   
  118.    type INTENSITY is digits PRECISION range 0.0 .. 1.0 ;
  119.  
  120.    -- Defines the representation of a color as a
  121.    -- combination of intensities in an RGB color system.   
  122.    type COLOUR_REPRESENTATION is 
  123.       record 
  124.          RED   : INTENSITY ; 
  125.          GREEN : INTENSITY ; 
  126.          BLUE  : INTENSITY ; 
  127.       end record ; 
  128.  
  129.    -- Defines the type for a connection identifier.  The
  130.    -- string must correspond to an external device or
  131.    -- file as defined by the GKS implementation
  132.    subtype CONNECTION_ID is STRING(1..6) ;
  133.  
  134.    -- Defines the range of accuracy for Device Coordinate types   
  135.    type DC_TYPE is digits PRECISION ;
  136.    package DC is new GKS_COORDINATE_SYSTEM( DC_TYPE ) ;
  137.  
  138.    -- Logical input devices are referenced as device numbers
  139.    type DEVICE_NUMBER is new POSITIVE ;
  140.  
  141.    -- Defines the type for error file specification.  The name
  142.    -- used must conform to an external file name as defined for
  143.    -- the host system implementation.
  144.    subtype ERROR_FILE_TYPE is STRING ;
  145.  
  146.    -- Defines the range of error indicator values.
  147.    type ERROR_INDICATOR is new INTEGER ;
  148.  
  149.    -- Defines the status of a locator, stroke, valuator,
  150.    -- or string operation
  151.    type INPUT_STATUS is ( OK, NONE ) ;
  152.  
  153.    -- Defines the fill area interior styles.   
  154.    type INTERIOR_STYLE is 
  155.         ( HOLLOW, SOLID, PATTERN, HATCH ) ;
  156.  
  157.    -- Defines the types of line styles provided by GKS.
  158.    type LINE_TYPE is new Integer ; 
  159.  
  160.    -- Defines the type for markers provided by GKS.
  161.    type MARKER_TYPE is new Integer ; 
  162.  
  163.    -- Defines the type of the units of memory that may be
  164.    -- allocated for GKS
  165.    type MEMORY_UNITS is range 0..MAXIMUM_MEMORY_AVAILABLE ;
  166.    MAX_MEMORY_UNITS : constant MEMORY_UNITS := 32767 ;
  167.  
  168.    -- Defines the range of pick identifiers available
  169.    -- on an implementation
  170.    type PICK_ID is new POSITIVE ;
  171.  
  172.    -- Defines the status of a pick input operation for
  173.    -- the request function.
  174.    type PICK_REQUEST_STATUS is ( OK, NOPICK, NONE ) ;
  175.  
  176.    -- The type used for unitless scaling factors
  177.    type SCALE_FACTOR is digits PRECISION ; 
  178.    
  179.    -- Indicates whether a segment is detectable or not.
  180.    type SEGMENT_DETECTABILITY is ( UNDETECTABLE , DETECTABLE ) ; 
  181.    
  182.    -- Indicates whether a segment is highlighted or not
  183.    type SEGMENT_HIGHLIGHTING is ( NORMAL , HIGHLIGHTED ) ; 
  184.  
  185.    -- Defines the range of segment names.
  186.    type SEGMENT_NAME is new POSITIVE ;
  187.  
  188.    -- Defines the priority of a segment
  189.    type SEGMENT_PRIORITY is digits PRECISION range 0.0..1.0 ;
  190.    
  191.    -- Indicates whether a segment is visible or not.
  192.    type SEGMENT_VISIBILITY is ( VISIBLE , INVISIBLE ) ; 
  193.  
  194.    -- Defines the name of a GKS function detecting an error.
  195.    subtype SUBPROGRAM_NAME is STRING ;
  196.  
  197.    -- Defines the types of fonts provided by the implementation
  198.    type TEXT_FONT is new Integer ;
  199.  
  200.    -- The direction take by a text string
  201.    type TEXT_PATH is ( RIGHT , LEFT , UP , DOWN ) ; 
  202.  
  203.    -- The precision with which text appears
  204.    type TEXT_PRECISION is 
  205.         ( STRING_PRECISION ,
  206.           CHAR_PRECISION ,
  207.           STROKE_PRECISION ) ; 
  208.  
  209.    -- This type defines a record describing the text font and
  210.    -- precision aspect.
  211.    type TEXT_FONT_PRECISION is
  212.       record
  213.          FONT      : TEXT_FONT ;
  214.          PRECISION : TEXT_PRECISION ;
  215.       end record ;
  216.  
  217.    -- A normalization transformation number
  218.    type TRANSFORMATION_NUMBER is new Natural ;
  219.  
  220.    -- Defines the range of accuracy for World Coordinate types
  221.    type WC_TYPE is digits PRECISION range MIN_WC..MAX_WC ;
  222.    package WC is new GKS_COORDINATE_SYSTEM( WC_TYPE ) ;
  223.  
  224.    -- Defines the range of workstation identifiers
  225.    type WS_ID is new POSITIVE;
  226.  
  227.    -- The state of a workstation
  228.    type WS_STATE is ( INACTIVE, ACTIVE ) ;
  229.  
  230.    -- Range of values corresponding to valid workstation
  231.    -- types.  Constants specifying names for the various
  232.    -- types of workstations should be provided by an
  233.    -- implementation in the GKS_CONFIGURATION package
  234.    type WS_TYPE is range 1..MAX_WS_TYPE ;   
  235.  
  236. --***
  237. --
  238. -- The following definitions for GKS are non-standard.
  239. --
  240. --***
  241.  
  242.    -- Defines a locator input data record
  243.    type LOCATOR_DATA_RECORD is
  244.       record
  245.          T_B_D : NATURAL ;
  246.       end record ;
  247.  
  248.    -- Defines a pick input data record
  249.    type PICK_DATA_RECORD is
  250.       record
  251.          PICK_STATUS  : PICK_REQUEST_STATUS ;
  252.          PICK_SEGMENT : SEGMENT_NAME ;
  253.          OBJECT_ID    : PICK_ID ;
  254.       end record ;
  255.  
  256.    --{ This portion defines the GKS state list, the workstation state
  257.    --{ list, and the workstation description table.  The table 
  258.    --{ definitions contain only a subset of the table fields defined
  259.    --{ by GKS.  The defined table entries support the version of 
  260.    --{ GKS developed by SYSCON Corporation.
  261.  
  262.    -- a list containing all of the aspect source flags,
  263.    -- with componants indication the specific flag. The
  264.    -- flags are all initialized as individial.
  265.    type ASF_LIST is
  266.       record
  267.          -- Current line attributes
  268.          LINE_TYPE           : ASF := INDIVIDUAL ;
  269.          LINE_WIDTH          : ASF := INDIVIDUAL ;
  270.          LINE_COLOUR         : ASF := INDIVIDUAL ;
  271.          -- Current marker attributes
  272.          MARKER_TYPE         : ASF := INDIVIDUAL ;
  273.          MARKER_SIZE         : ASF := INDIVIDUAL ;
  274.          MARKER_COLOUR       : ASF := INDIVIDUAL ;
  275.          -- Current text attributes
  276.          TEXT_FONT_PRECISION : ASF := INDIVIDUAL ;
  277.          CHAR_EXPANSION      : ASF := INDIVIDUAL ;
  278.          CHAR_SPACING        : ASF := INDIVIDUAL ;
  279.          TEXT_COLOUR         : ASF := INDIVIDUAL ;
  280.          -- Current fill area attributes
  281.          INTERIOR_STYLE      : ASF := INDIVIDUAL ;
  282.          STYLE_INDEX         : ASF := INDIVIDUAL ;
  283.          FILL_AREA_COLOUR    : ASF := INDIVIDUAL ;
  284.       end record;
  285.  
  286.  
  287.    ---------------------------------------------------------------------
  288.    -- Determine type of generalized drawing primitive (GDP) requested.
  289.    --  All GDP functions based on a two point definition point list
  290.    --  to completely describe the location of the entity, the two points
  291.    --  define a box that is used for a rectangle or show the outer limits
  292.    --  of the circles location using the first (upper left) point as the
  293.    --  standard reference.
  294.    ---------------------------------------------------------------------
  295.  
  296.    -- Defines a type for selecting a generalized drawing primitive. 
  297.    type GDP_ID is new Integer ;
  298.  
  299.    -- Define identifiers for the circle and rectangle drawing function.
  300.    GDP_CIRCLE    : constant GDP_ID := 1 ;
  301.    GDP_RECTANGLE : constant GDP_ID := 2 ;
  302.  
  303.    -- ===================================================
  304.    -- escape function implementation support for package
  305.    -- GKS_NON_STANDARD.
  306.    -- ===================================================
  307.  
  308.    type ESCAPE_IDENTIFIER is 
  309.         ( ALPHA_BACKGROUND ,
  310.           ALPHA_WRITING ,
  311.           GRAPHIC_BACKGROUND ,
  312.           GRAPHICS_VISIBILITY ,
  313.           PRINT_SCREEN,
  314.           PRINT_WINDOW,
  315.           MAP_WINDOW_TO_VIEWPORT ,
  316.           SEGMENT_MOVEMENT ,
  317.           SELECT_WINDOW ) ;
  318.  
  319.    type ESCAPE_RECORD ( IDENTIFIER : ESCAPE_IDENTIFIER ) is
  320.       record
  321.          case IDENTIFIER is
  322.             when ALPHA_BACKGROUND | ALPHA_WRITING | GRAPHIC_BACKGROUND =>
  323.                COLOUR           : COLOUR_INDEX ;
  324.             when GRAPHICS_VISIBILITY =>
  325.                GRAPHICS_ON      : Boolean ;
  326.             when SEGMENT_MOVEMENT =>
  327.                SEGMENT          : SEGMENT_NAME ;
  328.                POSITION         : WC.POINT ;
  329.             when SELECT_WINDOW | PRINT_WINDOW =>
  330.                WINDOW           : Natural ;
  331.             when PRINT_SCREEN =>
  332.                null ;
  333.             when MAP_WINDOW_TO_VIEWPORT =>
  334.                VIEW_WINDOW_ID   : Natural ;
  335.                WINDOW_RECTANGLE ,
  336.                VIEW_RECTANGLE   : WC.RECTANGLE_LIMITS ;
  337.             when others =>
  338.                null ;
  339.          end case ; -- IDENTIFIER
  340.       end record ; -- ESCAPE_RECORD
  341.  
  342.    -- =========================================================
  343.  
  344.    -- GKS exceptions
  345.       -- STATE_ERRORs
  346.    GKS_ERROR_1 ,  -- GKS not in proper state: GKS should be in state GKCL
  347.    GKS_ERROR_2 ,  -- GKS not in proper state: GKS should be in state GKOP
  348.    GKS_ERROR_3 ,  -- GKS not in proper state: GKS should be in state WSAC
  349.    GKS_ERROR_4 ,  -- GKS not in proper state: GKS should be in state SGOP
  350.    GKS_ERROR_5 ,  -- GKS not in proper state: GKS should be 
  351.                   -- either in the state WSAC or in the state SGOP
  352.    GKS_ERROR_6 ,  -- GKS not in proper state: GKS should be 
  353.                   -- either in the state WSOP or in the state WSAC
  354.    GKS_ERROR_7 ,  -- GKS not in proper state: GKS should be
  355.                   -- in one of the states WSOP, WSAC, or SGOP
  356.    GKS_ERROR_8 ,  -- GKS not in proper state: GKS should be 
  357.                   -- in one of the states GKOP, WSOP, WSAC, or SGOP
  358.       -- WS_ERRORs
  359.    GKS_ERROR_20 , -- Specified workstation identifier is invalid
  360.    GKS_ERROR_21 , -- Specified connection identifier is invalid
  361.    GKS_ERROR_22 , -- Specified workstation type is invalid
  362.    GKS_ERROR_23 , -- Specified workstation type does not exist
  363.    GKS_ERROR_24 , -- Specified workstation is open
  364.    GKS_ERROR_25 , -- Specified workstation is not open
  365.    GKS_ERROR_26 , -- Workstation Independent Segment Storage is not open
  366.    GKS_ERROR_29 , -- Specified workstation is active
  367.    GKS_ERROR_30 , -- Specified workstation is not active
  368.    GKS_ERROR_31 , -- Specified workstation is of category MO
  369.    GKS_ERROR_32 , -- Specified workstation is not of category MO
  370.    GKS_ERROR_33 , -- Specified workstation is of category MI
  371.    GKS_ERROR_37 , -- Specified workstation is not of category OUTIN
  372.    GKS_ERROR_39 , -- Specified workstation is not category INPUT or OUTIN
  373.    GKS_ERROR_41 , -- Specified workstation cant't generate specified GDP
  374.       -- TRANSFORMATION_ERRORs
  375.    GKS_ERROR_50 , -- Transformation number is invalid
  376.    GKS_ERROR_51 , -- Rectangle definition is invalid
  377.    GKS_ERROR_52 , -- Viewport not within NDC unit square
  378.    GKS_ERROR_53 , -- WS window not within NDC unit Square
  379.    GKS_ERROR_54 , -- WS viewport not within display space 
  380.       -- OUTPUT_ATTRIBUTE_ERRORs
  381.    GKS_ERROR_60 , -- Polyline index is invalid
  382.    GKS_ERROR_66 , -- Polymarker index is invalid
  383.    GKS_ERROR_70 , -- marker index is invalid
  384.    GKS_ERROR_72 , -- text index is invalid
  385.    GKS_ERROR_75 , -- text font index is invalid
  386.    GKS_ERROR_77 , -- character expansion <= 0
  387.    GKS_ERROR_78 , -- character height <= 0
  388.    GKS_ERROR_79 , -- length of character up vector is 0
  389.    GKS_ERROR_80 , -- fill area index is invalid
  390.    GKS_ERROR_83 , -- interior style index is invalid
  391.    GKS_ERROR_85 , -- pattern index is invalid
  392.    GKS_ERROR_93 , -- color index is invalid
  393.       -- OUTPUT_PRIMITIVE_ERROR
  394.    GKS_ERROR_100 , -- number of points is invalid
  395.    GKS_ERROR_101 , -- invalid code in string
  396.    GKS_ERROR_102 , -- GDP identifier is invalid
  397.    GKS_ERROR_103 , -- contents of GDP data record is invalid
  398.    GKS_ERROR_104 , -- WS can't generate specified GDP
  399.    GKS_ERROR_105 , -- WS can't generate specified GDP transformation
  400.       -- SEGMENT_ERROR
  401.    GKS_ERROR_120 , -- Specified segment is invalid
  402.    GKS_ERROR_121 , -- Specified segment name already in use
  403.    GKS_ERROR_122 , -- Specified segment doesn't exist
  404.    GKS_ERROR_125 , -- Specified segment name already in use
  405.    GKS_ERROR_126 , -- segment priority is invalid
  406.       -- INPUT_ERRORs
  407.    GKS_ERROR_146 , -- contents of input data record are invalid
  408.    GKS_ERROR_147 , -- Input queue has overflowed
  409.    GKS_ERROR_150 , -- No input value of the correct class is in event report
  410.    GKS_ERROR_154 , -- length of string > buffer size
  411.       -- ESCAPE_ERROR
  412.    GKS_ERROR_180 , -- specified escape not supported
  413.    GKS_ERROR_181 , -- specified escape identification is invalid
  414.    GKS_ERROR_182 , -- escape data record is invalid
  415.       -- SYSTEM_ERROR
  416.    GKS_ERROR_300 , -- storage overflow in GKS
  417.    GKS_ERROR_301 , -- storage overflow in segment storage
  418.    GKS_ERROR_302 , -- input/output error while reading
  419.    GKS_ERROR_303 , -- input/output error while writing
  420.    GKS_ERROR_304 , -- input/output error while sending data to WS
  421.    GKS_ERROR_305 , -- input/output error while recieving data from WS
  422.    GKS_ERROR_306 , -- input/output error during library management
  423.    GKS_ERROR_307 , -- input/output error while reading WS description table
  424.    GKS_ERROR_308 , -- arithmetic error has occured
  425.       -- LANGUAGE_BINDING_ERROR
  426.    GKS_ERROR_2500 , -- invalid use of input data record
  427.       -- UNKNOWN_OTHER_ERROR
  428.    GKS_ERROR_2501  -- unknown GKS detected error
  429.                   : EXCEPTION ; 
  430.    
  431. end GKS_SPECIFICATION ;
  432. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  433. --graphics_data_spec.ada
  434. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  435. -- version 86-01-17 17:40 by JL
  436.  
  437. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  438.  
  439. package GRAPHICS_DATA is
  440. -- ================================================================
  441. -- 
  442. --  This package provides the data types containing the graphic
  443. --  information (location and attributes) for each entity in
  444. --  the graph.  Some of the data is device dependent, and hence
  445. --  this declaration is separated from the GRAPH_TREE_ACCESS_PACKAGE.
  446. --  The pointer to the owning TREE_NODE is maintained in a record
  447. --  which includes the record type declared below.  This data
  448. --  will be maintained in arrays, which will allow fairly fast
  449. --  searchs to be conducted.
  450. --
  451. -- ==================================================================
  452.  
  453.    ----------------------------------
  454.    --   The three windows of SKETCHER
  455.    ----------------------------------
  456.    type WINDOW_TYPE is 
  457.         ( GRAPH_VIEW_PORT,     -- The graph viewport window
  458.           MENU_VIEW_PORT ,     -- The command window
  459.           TEXT_VIEW_PORT ) ;   -- Text interaction window
  460.  
  461.    ------------------------------------------------
  462.    --  The angular direction used in whole degrees.
  463.    ------------------------------------------------
  464.    subtype ANGLE_TYPE is NATURAL range 1..360 ;
  465.  
  466.    --------------------------------------
  467.    --  ID number of a segment of objects.
  468.    --------------------------------------
  469.    NULL_SEGMENT : constant GKS_SPECIFICATION.SEGMENT_NAME :=
  470.                   GKS_SPECIFICATION.SEGMENT_NAME'first ;
  471.  
  472.    --------------------------------------
  473.    --  Define a list of segments.
  474.    --------------------------------------
  475.    type SEGMENT_LIST_TYPE is array( NATURAL range <> ) 
  476.         of GKS_SPECIFICATION.SEGMENT_NAME ;
  477.  
  478.    ---------------------------------------------------------
  479.    -- The following type declarations define the
  480.    -- graphics World Coordinate System space; these
  481.    -- type definitions differ from the GKS World Coordinate
  482.    -- types.
  483.    --
  484.    -- WC       : Definition for World Coordinate (WC) system variables.
  485.    -- LIMITS   : World coordinate system boundary values.
  486.    -- POINT    : Definition of point in world coordinate system. 
  487.    -- VECTOR   : Definition of vector in world coordinate system.
  488.    -- SIZE     : Character size in world coordinate system.
  489.    -- RECTANGLE: Rectangle in world coordinate system.
  490.    ---------------------------------------------------------
  491.    MAX_WC : constant NATURAL := 32_767 ;
  492.    MIN_WC : constant NATURAL :=      0 ;
  493.    subtype WC is NATURAL range MIN_WC..MAX_WC ;
  494.  
  495.    type LIMITS is 
  496.       record 
  497.          MIN : WC ; 
  498.          MAX : WC ; 
  499.       end record ; 
  500.  
  501.    type POINT is 
  502.       record 
  503.          X : WC ; 
  504.          Y : WC ; 
  505.       end record ; 
  506.    type POINT_LIST is array ( integer range <> ) of POINT ; 
  507.  
  508.    type VECTOR     is 
  509.       record 
  510.          X : WC ; 
  511.          Y : WC ; 
  512.       end record ; 
  513.  
  514.    type SIZE is 
  515.       record 
  516.          X : WC ; 
  517.          Y : WC ; 
  518.       end record ; 
  519.    
  520.    type RECTANGLE is 
  521.       record 
  522.          X : LIMITS ; 
  523.          Y : LIMITS ; 
  524.       end record ; 
  525.    
  526.    --------------------------------------
  527.    --  Define a null point
  528.    -------------------------------------
  529.    NULL_POINT : constant POINT := ( X => 0 , Y => 0 ) ;
  530.  
  531.    -------------------------------------------------------
  532.    --  The priority of viewing scale.
  533.    -------------------------------------------------------
  534.    subtype PRIORITY_TYPE is FLOAT range 0.0..1.0 ;
  535.  
  536.    -------------------------------------------------------
  537.    --  The scale factor to be utilized for software zoom.
  538.    -------------------------------------------------------
  539.    subtype SCALE_FACTOR_TYPE is NATURAL range 1..8 ;
  540.  
  541.    -------------------------------------------------------
  542.    --  Define the zoom direction.
  543.    -------------------------------------------------------
  544.    type ZOOM_DIRECTION is ( MAX_ZOOM_IN ,
  545.                             ZOOM_IN ,
  546.                             MAX_ZOOM_OUT ,
  547.                             ZOOM_OUT ) ;
  548.  
  549.    -------------------------------------------------------
  550.    --  Define the pan direction.
  551.    -------------------------------------------------------
  552.    type PAN_DIRECTION is ( MAX_PAN_LEFT ,
  553.                            PAN_LEFT ,
  554.                            MAX_PAN_RIGHT ,
  555.                            PAN_RIGHT ,
  556.                            MAX_PAN_UP ,
  557.                            PAN_UP ,
  558.                            PAN_DOWN ,
  559.                            MAX_PAN_DOWN ) ;
  560.  
  561.    -------------------------------------------------------
  562.    --  The line type to be utilized in drawing lines.
  563.    -------------------------------------------------------
  564.    type LINE_TYPE is 
  565.         ( SOLID, DASHED, DOTTED ) ;
  566.  
  567.    -------------------------------------------------------
  568.    --  End of line terminators for use in drawing connectors.
  569.    -------------------------------------------------------
  570.    type TERMINATOR_TYPE is 
  571.         ( NONE, LEFT_ARROW, RIGHT_ARROW, PLUS_SIGN ) ;
  572.  
  573.    ------------------------------------------------------------------
  574.    --  Define the available colors.
  575.    ------------------------------------------------------------------
  576.    type COLOR_TYPE is 
  577.         ( ORANGE, GREEN, YELLOW, VIOLET, RED, BLUE, 
  578.           BLACK, WHITE, BROWN, DARK_RED, CYAN, 
  579.           PINK, MAGENTA, PEACH, GRAY, DARK_PURPLE ) ;
  580.  
  581.    ----------------------------
  582.    -- Graphics data declaration
  583.    ----------------------------
  584.    type GRAPHICS_DATA_TYPE is
  585.       record
  586.          WINDOW        : WINDOW_TYPE := GRAPH_VIEW_PORT ;
  587.          LABEL_SEG_ID  : GKS_SPECIFICATION.SEGMENT_NAME := NULL_SEGMENT ;
  588.          LABEL2_SEG_ID : GKS_SPECIFICATION.SEGMENT_NAME := NULL_SEGMENT ;
  589.          SEGMENT_ID    : GKS_SPECIFICATION.SEGMENT_NAME := NULL_SEGMENT ;
  590.          LOCATION      : POINT := NULL_POINT ;
  591.          SIZE          : POINT := NULL_POINT ;
  592.          COLOR         : COLOR_TYPE := BLACK ;
  593.       end record ;
  594.  
  595.    ------------------------
  596.    --  GENERIC informations
  597.    ------------------------
  598.    type GENERIC_STATUS_TYPE is
  599.         ( NON_GENERIC, GENERIC_DECLARATION, GENERIC_INSTANTIATION ) ;
  600.  
  601.    ---------------------------------------
  602.    --  The possible Call Connection types.
  603.    ---------------------------------------
  604.    type CALL_CONNECTION_TYPE is
  605.         ( NO_CONNECTION, NORMAL, TIMED, CONDITIONAL ) ;
  606.  
  607.    ---------------------------------------
  608.    --  The possible label types, request point
  609.    --  scope checking of labels, an entry point
  610.    --  is considered as a LABEL_EXPORT
  611.    ---------------------------------------
  612.    type LABEL_CREATE_TYPE is
  613.         ( NOT_LABEL, LABEL_IMPORT, LABEL_EXPORT ) ;
  614.  
  615.    -------------------------------------------
  616.    -- General signal parameter for operations.
  617.    -------------------------------------------
  618.    type MODE_TYPE is ( ON , OFF ) ;
  619.    
  620.    ----------------------------------------------------
  621.    --  The Maximum nesting level for enclosing objects.
  622.    ----------------------------------------------------
  623.    MAX_NESTING_LEVEL : constant INTEGER := 6 ;
  624.  
  625.    type IMPORT_EXPORT_SYMBOL_TYPE is array (1..2) of STRING (1..1) ;
  626.  
  627.    PKG_DECL          : IMPORT_EXPORT_SYMBOL_TYPE := ("#","#") ;
  628.    VIRT_PKG_DECL     : IMPORT_EXPORT_SYMBOL_TYPE := ("%","%") ;
  629.    TYPE_DECL         : IMPORT_EXPORT_SYMBOL_TYPE := ("(",")") ;
  630.    OBJECT_DECL       : IMPORT_EXPORT_SYMBOL_TYPE := (":",":") ;
  631.    EXCEPTION_DECL    : IMPORT_EXPORT_SYMBOL_TYPE := ("<",">") ;
  632.    SUBPROG_DECL      : IMPORT_EXPORT_SYMBOL_TYPE := ("|","|") ;
  633.    PARAMS_DECL       : IMPORT_EXPORT_SYMBOL_TYPE := ("[","]") ;
  634.    TASK_ENTRY_DECL   : IMPORT_EXPORT_SYMBOL_TYPE := ("/","/") ;
  635.    SERIAL_ENTRY_DECL : IMPORT_EXPORT_SYMBOL_TYPE := ("/","}") ;
  636.    ENTRY_FAMILY_DECL : IMPORT_EXPORT_SYMBOL_TYPE := ("(",")") ;
  637.  
  638.    subtype INDICATOR_LENGTH_1 is STRING ( 1..1 ) ;
  639.    subtype INDICATOR_LENGTH_2 is STRING ( 1..2 ) ;
  640.    subtype INDICATOR_LENGTH_4 is STRING ( 1..4 ) ;
  641.  
  642.    FUNCTION_SYMBOL          : INDICATOR_LENGTH_1 := "=" ;
  643.    NORMAL_REFERENCE_SYMBOL  : INDICATOR_LENGTH_1 := ">" ;
  644.    VIRTUAL_REFERENCE_SYMBOL : INDICATOR_LENGTH_2 := ">>" ;
  645.    TIMED_CALL_SYMBOL        : INDICATOR_LENGTH_1 := "T" ;
  646.    CONDITIONAL_CALL_SYMBOL  : INDICATOR_LENGTH_1 := "C" ;
  647.    GUARDED_ENTRY_SYMBOL     : INDICATOR_LENGTH_1 := "*" ;
  648.    GENERIC_DECL_SYMBOL      : INDICATOR_LENGTH_2 := "gd" ;
  649.    GENERIC_INST_SYMBOL      : INDICATOR_LENGTH_2 := "gi" ;
  650.    DATA_ORIGIN_SYMBOL       : INDICATOR_LENGTH_1 := "V" ;
  651.    TASK_TYPE_SYMBOL         : INDICATOR_LENGTH_4 := "(tt)" ;
  652.  
  653.    ------------------------------------------------------------
  654.    --  This structure defines the shape to be drawn for 
  655.    --  each of the entities which can be graphed.
  656.    ------------------------------------------------------------
  657.    type SHAPE_TYPE is 
  658.         ( SINGLE_RECTANGLE,
  659.           STACKED_RECTANGLE,
  660.           SQUARE,
  661.           PARALLELOGRAM,
  662.           CIRCLE ) ;
  663.  
  664.    ------------------------------------------------------------
  665.    --  Define the supported graphic entities.
  666.    ------------------------------------------------------------
  667.    type GRAPHIC_ENTITY is
  668.         ( VIRTUAL_PKG_FIGURE,
  669.           PACKAGE_FIGURE,
  670.           SUBPROGRAM_FIGURE,
  671.           TASK_FIGURE,
  672.           BODY_FIGURE,
  673.           CALL_CONNECT_LINE,
  674.           DATA_CONNECT_LINE,
  675.           EXPORT_CONNECT_LINE ) ;
  676.  
  677.  
  678.    ------------------------------------------------------------
  679.    --  Define the supported graphic entities which consist of
  680.    --  a line, and those which consist a figure.
  681.    ------------------------------------------------------------
  682.    subtype LINE_ENTITY is GRAPHIC_ENTITY
  683.            range CALL_CONNECT_LINE..EXPORT_CONNECT_LINE ;
  684.  
  685.    subtype FIGURE_ENTITY is GRAPHIC_ENTITY
  686.            range VIRTUAL_PKG_FIGURE..BODY_FIGURE ;
  687.  
  688.    ------------------------------------------------------------
  689.    --  Define the arrays containing the current attributes for
  690.    --  each of the supported graphic entities.
  691.    ------------------------------------------------------------
  692.    type SHAPE_ARRAY is array ( FIGURE_ENTITY )  of SHAPE_TYPE ;
  693.  
  694.    type LINE_ARRAY  is array ( GRAPHIC_ENTITY ) of LINE_TYPE ;
  695.  
  696.    type COLOR_ARRAY is array ( GRAPHIC_ENTITY ) of COLOR_TYPE ;
  697.  
  698.    -------------------------------------------------------------------
  699.    -- Initialize the arrays containing the current attributes for
  700.    -- each of the supported graphic entities.
  701.    -------------------------------------------------------------------
  702.  
  703.    ENTITY_SHAPE : SHAPE_ARRAY := (
  704.      VIRTUAL_PKG_FIGURE => SHAPE_TYPE'( SINGLE_RECTANGLE ),
  705.      PACKAGE_FIGURE     => SHAPE_TYPE'( SINGLE_RECTANGLE ),
  706.      SUBPROGRAM_FIGURE  => SHAPE_TYPE'( STACKED_RECTANGLE ),
  707.      TASK_FIGURE        => SHAPE_TYPE'( PARALLELOGRAM ),
  708.      BODY_FIGURE        => SHAPE_TYPE'( CIRCLE ) );
  709.  
  710.    ENTITY_LINE : LINE_ARRAY := (
  711.      VIRTUAL_PKG_FIGURE => LINE_TYPE'( DASHED ),
  712.      PACKAGE_FIGURE     => LINE_TYPE'( SOLID ),
  713.      SUBPROGRAM_FIGURE  => LINE_TYPE'( SOLID ),
  714.      TASK_FIGURE        => LINE_TYPE'( SOLID ),
  715.      BODY_FIGURE        => LINE_TYPE'( SOLID ),
  716.      CALL_CONNECT_LINE  => LINE_TYPE'( SOLID ),
  717.      DATA_CONNECT_LINE  => LINE_TYPE'( DOTTED ) ,
  718.      EXPORT_CONNECT_LINE  => LINE_TYPE'( DOTTED ) );
  719.  
  720.    ENTITY_COLOR : COLOR_ARRAY := (
  721.      VIRTUAL_PKG_FIGURE => COLOR_TYPE'( BLACK ),
  722.      PACKAGE_FIGURE     => COLOR_TYPE'( BLACK ),
  723.      SUBPROGRAM_FIGURE  => COLOR_TYPE'( BLACK ),
  724.      TASK_FIGURE        => COLOR_TYPE'( BLACK ),
  725.      BODY_FIGURE        => COLOR_TYPE'( BLACK ),
  726.      CALL_CONNECT_LINE  => COLOR_TYPE'( BLACK ),
  727.      DATA_CONNECT_LINE  => COLOR_TYPE'( BLACK ) ,
  728.      EXPORT_CONNECT_LINE  => COLOR_TYPE'( BLACK ) );
  729.  
  730.    -------------------------------------------------
  731.    -- ICON Structure Definition
  732.    -------------------------------------------------
  733.    subtype ICON_TYPE is POSITIVE range 1 .. 100 ;
  734.  
  735.    -------------------------------------------------
  736.    -- offset constants for labels
  737.    -------------------------------------------------
  738.    DEFAULT_CHARACTER_HEIGHT  : constant WC := 200 ;
  739.    DEFAULT_CHARACTER_WIDTH   : constant WC := 150 ;
  740.    DEFAULT_CHARACTER_HEIGHT_SPACING : constant WC := 100 ;
  741.    DEFAULT_CHARACTER_WIDTH_SPACING : constant WC := 75 ;
  742.    CHARACTER_HEIGHT_OFFSET    : constant WC := 
  743.         DEFAULT_CHARACTER_HEIGHT + DEFAULT_CHARACTER_HEIGHT_SPACING ;
  744.    CHARACTER_WIDTH_OFFSET    : constant WC := 
  745.         DEFAULT_CHARACTER_WIDTH + DEFAULT_CHARACTER_WIDTH_SPACING ;
  746.    ENTITY_NAME_Y_OFFSET      : constant WC := CHARACTER_HEIGHT_OFFSET ;
  747.    IMPORT_EXPORT_X_OFFSET    : constant WC := ( 2 * CHARACTER_WIDTH_OFFSET ) -
  748.                                    ( DEFAULT_CHARACTER_WIDTH_SPACING / 2 ) ;
  749.    -- label_max_length does not include the identifying symbols
  750.    LABEL_MAX_LENGTH          : constant WC := 8 * CHARACTER_WIDTH_OFFSET ;
  751.    STACKED_SIZE              : constant WC := 
  752.          DEFAULT_CHARACTER_HEIGHT + ( 2 * DEFAULT_CHARACTER_HEIGHT_SPACING ) ;
  753.  
  754.    -------------------------------------------------
  755.    -- Exception raised when operator requests the
  756.    -- abort of an operation in the graphics window.
  757.    -------------------------------------------------
  758.    OPERATION_ABORTED_BY_OPERATOR : exception ;
  759.  
  760.    -------------------------------------------------
  761.    -- Exception raised when the list of available
  762.    -- segments is exhausted.
  763.    -------------------------------------------------
  764.    AVAILABLE_SEGMENTS_EXHAUSTED : exception ;
  765.  
  766. end GRAPHICS_DATA ;
  767. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  768. --tekdriver_spec.ada
  769. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  770. package TEKDRIVER is 
  771. --
  772. --  This package implements a device driver for the Tektronix
  773. --  4107 display terminal.
  774. --  The procedure names are derived from the descriptive command
  775. --  names specified in the "TEK Programmers Reference -
  776. --  4107/4109 Computer Display Terminal."
  777. --
  778. --  The only graphics input device supported is the joydisk.
  779. --
  780.  
  781.    -- Define control characters as strings of length one.
  782.    -- The strings are initialized in the package body.
  783.    ESC : STRING(1..1);
  784.    FF  : STRING(1..1);
  785.    FS  : STRING(1..1);
  786.    GS  : STRING(1..1);
  787.    US  : STRING(1..1);
  788.    CN  : STRING(1..1);
  789.  
  790.    -- Define the signature characters to be used in the locator
  791.    -- and pick reports.
  792.    LOCATOR_SIG_CHAR : constant CHARACTER := '[';
  793.    LOCATOR_TRM_CHAR : constant CHARACTER := ']';
  794.    PICK_SIG_CHAR    : constant CHARACTER := '{';
  795.    PICK_TRM_CHAR    : constant CHARACTER := '}';
  796.   
  797.    -- The range of valid values for segment identifiers.
  798.    -- -1 specifies all segments ( except segment 0 ).
  799.    -- 0 specifies the segment containing the cursor.
  800.    -- 1..32767 identifies a specific segment
  801.    subtype SEGMENT_IDENTIFIER is INTEGER range -1..32767;
  802.  
  803.    -- The range of valid values for view identifiers.
  804.    subtype VIEW_NUMBER is INTEGER range -1..64;
  805.  
  806.    -- The range of valid values for the color index.
  807.    -- Values greater than 15 are interpreted as color index 15
  808.    subtype COLOR_INDEX is NATURAL range 0..32767;
  809.    FIRST_COLOR       : constant COLOR_INDEX := 0 ;
  810.    LAST_COLOR        : constant COLOR_INDEX := 15 ;
  811.    DIALOG_LAST_COLOR : constant COLOR_INDEX := 7 ;
  812.  
  813.    -- The range of valid values for a color coordinate in the
  814.    -- RGB color coordinate model.
  815.    subtype COLOR_COORDINATE is NATURAL range 0..100;
  816.  
  817.    -- The range of valid values for line style.
  818.    subtype LINE_STYLE is NATURAL range 0..7;
  819.  
  820.    -- The range of valid values for the marker number.
  821.    subtype MARKER_NUMBER is NATURAL range 0..10;
  822.  
  823.    -- The range of valid surface number identifiers, and surface
  824.    -- priority identifiers
  825.    subtype SURFACE_NUMBER   is NATURAL range 1..4;
  826.    subtype SURFACE_PRIORITY is NATURAL range 1..4;
  827.    SURFACE_1  : constant SURFACE_NUMBER   := 1 ;
  828.    SURFACE_2  : constant SURFACE_NUMBER   := 2 ;
  829.    SURFACE_3  : constant SURFACE_NUMBER   := 3 ;
  830.    SURFACE_4  : constant SURFACE_NUMBER   := 4 ;
  831.    PRIORITY_1 : constant SURFACE_PRIORITY := 1 ;
  832.    PRIORITY_2 : constant SURFACE_PRIORITY := 2 ;
  833.    PRIORITY_3 : constant SURFACE_PRIORITY := 3 ;
  834.    PRIORITY_4 : constant SURFACE_PRIORITY := 4 ;
  835.  
  836.    -- The range of valid bit plane numbers; 
  837.    -- if number of planes is 0 the surface is not used.
  838.    subtype BIT_PLANES is NATURAL range 0..4;
  839.  
  840.    -- The range of the size of the input queue in bytes
  841.    subtype INPUT_QUEUE_SIZE is POSITIVE range 1..65535 ;
  842.  
  843.    -- The range of valid pick identification numbers.
  844.    subtype PICK_ID_IDENTIFIER is NATURAL range 0..32767;
  845.  
  846.    -- The range of valid segment priority numbers.
  847.    subtype PRIORITY_NUMBER is INTEGER range -32766..32767;
  848.  
  849.    -- Number of points whose position will be reported in a
  850.    -- GIN report sequence.
  851.    subtype NUMBER_OF_GIN_EVENTS is POSITIVE range 1..32767;
  852.  
  853.    -- Define string type for xy coordinates strings.
  854.    subtype XY_COORDINATES_STRING is STRING(1..5);
  855.  
  856.    -- Define string type for integer strings.
  857.    subtype TEK_INTEGER_STRING is STRING(1..3);
  858.  
  859.    -- The range of valid values for terminal X- and Y- coordinates.
  860.    TERMINAL_COORDINATE_MIN : constant NATURAL := 0 ;
  861.    TERMINAL_COORDINATE_MAX : constant NATURAL := 4095 ;
  862.    subtype TERMINAL_COORDINATE is NATURAL
  863.            range TERMINAL_COORDINATE_MIN..TERMINAL_COORDINATE_MAX ;
  864.  
  865.    -- The range of valid values for screen X- coordinates.
  866.    SCREEN_X_COORDINATE_MIN : constant NATURAL := 0 ;
  867.    SCREEN_X_COORDINATE_MAX : constant NATURAL := 4095 ;
  868.    subtype SCREEN_X_COORDINATE is NATURAL
  869.            range SCREEN_X_COORDINATE_MIN..SCREEN_X_COORDINATE_MAX ;
  870.  
  871.    -- The range of valid values for screen Y- coordinates.
  872.    SCREEN_Y_COORDINATE_MIN : constant NATURAL := 0 ;
  873.    SCREEN_Y_COORDINATE_MAX : constant NATURAL := 3071 ;
  874.    subtype SCREEN_Y_COORDINATE is NATURAL
  875.            range SCREEN_Y_COORDINATE_MIN..SCREEN_Y_COORDINATE_MAX ;
  876.  
  877.    type TERMINAL_POINT is
  878.       record
  879.          X : TERMINAL_COORDINATE ;
  880.          Y : TERMINAL_COORDINATE ;
  881.       end record;
  882.  
  883.    type SCREEN_POINT is
  884.       record
  885.          X : SCREEN_X_COORDINATE ;
  886.          Y : SCREEN_Y_COORDINATE ;
  887.       end record;
  888.  
  889.    -- Specifies whether the fill pattern covers the panel boundary,
  890.    -- or whether the boundary is drawing using the current line style.
  891.    type BOUNDARY is ( FILL_PATTERN, CURRENT_LINE_STYLE ) ;
  892.  
  893.    -- Specify the levels of error messages displayed by the terminal.
  894.    type ERROR_DISPLAY_LEVEL is ( DISPLAY_ALL, DISPLAY_WARNINGS,
  895.         DISPLAY_ERRORS, DISPLAY_FAILURES, NOTHING_DISPLAYED ) ;
  896.  
  897.    -- Specifies number of lines of text in visible in the dialog area.
  898.    subtype DIALOG_LINES is INTEGER  range 2..32;
  899.  
  900.    -- Specifies if dialog area should be enabled or disabled.
  901.    type DIALOG_MODE is ( DISABLE_DIALOG, ENABLE_DIALOG ) ;
  902.  
  903.    -- Specifies how many pages to copy when a hardcopy is requested
  904.    subtype NUMBER_OF_PAGES is INTEGER range 0..32767 ;
  905.  
  906.    -- Specifies hardcopy starting point
  907.    type PAGE_ORIGIN is ( FIRST_LINE, TOP_OF_BUFFER, BOTTOM_OF_BUFFER ) ;
  908.  
  909.    -- Specifies how form feed is interpreted during hardcopy operation
  910.    type FORM_FEED_INTERPRETATION is ( IGNORE_FF, MAX_LINES, NEW_PAGE ) ;
  911.  
  912.    -- Select the image size for a hardcopy operation
  913.    type IMAGE_SIZE is ( DEFAULT_SIZE, SMALLER_SIZE ) ;
  914.  
  915.    -- Specifies dialog area, segment, and view border visibility.
  916.    type VISIBILITY_MODE is ( INVISIBLE, VISIBLE ) ;
  917.  
  918.    -- Specifies surface visibility.
  919.    type SURFACE_VISIBILITY is (
  920.         SURFACE_INVISIBLE, SURFACE_VISIBLE, SURFACE_BLINKING ) ;
  921.  
  922.    -- Lock or unlock the zoom and pan modes.
  923.    type LOCKING_MODE is ( UNLOCK_KEYS, LOCK_KEYS ) ;
  924.  
  925.    -- Define the valid range for macro identifiers.
  926.    subtype MACRO_NUMBER is INTEGER range -150..32767 ;
  927.  
  928.    -- Determine how often the terminal sends an EOL string to the host
  929.    type EOM_FREQUENCY is ( LESS_FREQUENT, MORE_FREQUENT ) ;
  930.  
  931.    -- Specify whether or not the segment can be picked.
  932.    type DETECTABILITY is ( CANNOT_BE_PICKED, CAN_BE_PICKED ) ;
  933.  
  934.    -- Specify whether key macro expansion is enabled or disabled
  935.    type KEY_EXPANSION is ( DISABLED, ENABLED ) ;
  936.  
  937.    -- Specify whether or not segment is highlighted.
  938.    type HIGHLIGHTING is ( NOT_HIGHLIGHTED, HIGHLIGHTED ) ;
  939.  
  940.    -- Specifies whether or not the terminal is in snoopy mode.
  941.    type SNOOPY_MODE is ( IN_SNOOPY_MODE, NOT_IN_SNOOPY_MODE ) ;
  942.  
  943.    -- Specifies devices supported by this implementation.
  944.    type DEVICE_CODE is ( JOYDISK ) ;
  945.  
  946.    -- Specifies functions supported by this implementation.
  947.    type FUNCTION_CODE is ( LOCATOR, PICK ) ;
  948.  
  949.    -- Specifies how hard copy is to be produced.
  950.    -- COPY_SCREEN_X     - copies the entire screen
  951.    -- POSITIVE_HARDCOPY - produces positive copy of entire screen
  952.    -- DIALOG_AREA_COPY  - copies only the dialog area
  953.    type HARDCOPY_CODE is ( COPY_SCREEN_0, COPY_SCREEN_1,
  954.                             POSITIVE_HARDCOPY, DIALOG_AREA_COPY ) ;
  955.  
  956.    -- Specifies the copier type.
  957.    type COPIER_TYPE is ( MONOCHROME_PRINTER, TEK_4695 ) ;
  958.  
  959.    -- Specifies the terminal mode.
  960.    type TERMINAL_MODE is ( TEK, ANSI, EDIT, VT52 ) ;
  961.  
  962.    -- Specify the fill pattern for subsequent panels.  The values -15
  963.    -- through 0 fill a panel with a solid color indicated by the negative
  964.    -- value of a color index ( i.e. -3 means fill with color index 3 ).
  965.    subtype FILL_PATTERN_NUMBER is INTEGER range -15..16;
  966.  
  967.    -- Specifies graphtext character path.
  968.    type CHARACTER_DIRECTION is ( RIGHT, LEFT, UP, DOWN ) ;
  969.  
  970.    -- Specifies the color coordinate system used.
  971.    type COLOR_COORDINATE_SYSTEM is (
  972.               NO_COORDINATE_CHANGE, RGB, CMY, HLS ) ;
  973.  
  974.    -- Specifies the mode used when colors are place on top of each other.
  975.    type COLOR_OVERLAY_TYPE is (
  976.               NO_OVERLAY_CHANGE, OPAQUE, SUBTRACTIVE, ADDITIVE ) ;
  977.  
  978.    -- Specifies a record containing the definition of a color index
  979.    -- in terms of relative percentages.
  980.    type COLOR_RECORD is
  981.       record
  982.          RED   : COLOR_INDEX ;
  983.          GREEN : COLOR_INDEX ;
  984.          BLUE  : COLOR_INDEX ;
  985.       end record ;
  986.  
  987.    INITIAL_COLORS : array (
  988.                            FIRST_COLOR..LAST_COLOR ) of COLOR_RECORD :=
  989.       (  0 => ( RED => 100, GREEN => 100, BLUE => 100) ,   -- white  
  990.          1 => ( RED => 100, GREEN =>   0, BLUE =>   0) ,   -- red
  991.          2 => ( RED =>   0, GREEN => 100, BLUE =>   0) ,   -- green
  992.          3 => ( RED =>   0, GREEN =>   0, BLUE => 100) ,   -- blue
  993.          4 => ( RED => 100, GREEN =>  60, BLUE =>   0) ,   -- orange
  994.          5 => ( RED => 100, GREEN => 100, BLUE =>   0) ,   -- yellow
  995.          6 => ( RED =>  74, GREEN =>  60, BLUE =>  87) ,   -- violet
  996.          7 => ( RED =>   0, GREEN =>   0, BLUE =>   0) ,   -- black
  997.          8 => ( RED =>  47, GREEN =>   7, BLUE =>  47) ,   -- dark_purple
  998.          9 => ( RED =>  67, GREEN =>  34, BLUE =>   0) ,   -- brown
  999.         10 => ( RED =>  80, GREEN =>   0, BLUE =>   0) ,   -- dark_red
  1000.         11 => ( RED =>   0, GREEN => 100, BLUE => 100) ,   -- cyan
  1001.         12 => ( RED => 100, GREEN =>  27, BLUE =>  74) ,   -- pink
  1002.         13 => ( RED => 100, GREEN =>   0, BLUE => 100) ,   -- magenta
  1003.         14 => ( RED =>  94, GREEN =>  40, BLUE =>  60) ,   -- peach
  1004.         15 => ( RED =>  67, GREEN =>  67, BLUE =>  67) ) ; -- gray
  1005.  
  1006.    -- Specify labels for the initial system colors
  1007.    WHITE        : constant COLOR_INDEX := 0  ;
  1008.    RED          : constant COLOR_INDEX := 1  ;
  1009.    GREEN        : constant COLOR_INDEX := 2  ;
  1010.    BLUE         : constant COLOR_INDEX := 3  ;
  1011.    ORANGE       : constant COLOR_INDEX := 4  ;
  1012.    YELLOW       : constant COLOR_INDEX := 5  ;
  1013.    VIOLET       : constant COLOR_INDEX := 6  ;
  1014.    BLACK        : constant COLOR_INDEX := 7  ;
  1015.    DARK_PURPLE  : constant COLOR_INDEX := 8  ;
  1016.    BROWN        : constant COLOR_INDEX := 9  ;
  1017.    DARK_RED     : constant COLOR_INDEX := 10 ;
  1018.    CYAN         : constant COLOR_INDEX := 11 ;
  1019.    PINK         : constant COLOR_INDEX := 12 ;
  1020.    MAGENTA      : constant COLOR_INDEX := 13 ;
  1021.    PEACH        : constant COLOR_INDEX := 14 ;
  1022.    GRAY         : constant COLOR_INDEX := 15 ;
  1023.  
  1024.    -- Specifies whether operation is color or black and white.
  1025.    type COLOR_OPERATION_MODE is (
  1026.               NO_OPERATION_CHANGE, NORMAL_COLOR_OPERATION ) ;
  1027.  
  1028.    -- Specify rubberbanding modes.
  1029.    -- DISABLE  - disable rubberbanding
  1030.    -- ENABLE_1 - cause rubberbanding between most recent locator event
  1031.    --            and the current cursor position
  1032.    -- ENABLE_2 - cause initial rubberbanding between GIN display start
  1033.    --            point and current cursor position, subsequent same as 1
  1034.    type RUBBERBANDING_MODE is ( DISABLE, ENABLE_1, ENABLE_2 ) ;
  1035.  
  1036.    -- Specify string or stroke precision on graphtext characters.
  1037.    type GRAPHTEXT_PRECISION is ( FILLER, STRING_TEXT, STROKE_TEXT ) ;
  1038.  
  1039.    procedure BEGIN_PANEL_BOUNDARY ( FIRST_POINT   : in TERMINAL_POINT ;
  1040.                                     DRAW_BOUNDARY : in BOUNDARY ) ;
  1041.       -- Start a panel definition.
  1042.  
  1043.    procedure BEGIN_SEGMENT ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) ;
  1044.       -- Begin a new segment, and reset the current pick id to 1.
  1045.  
  1046.    procedure CANCEL ;
  1047.       -- Cancel terminal operations and several terminal
  1048.       -- parameters and modes.
  1049.  
  1050.    procedure CLEAR_DIALOG_SCROLL ;
  1051.       -- Erase the dialog buffer.
  1052.  
  1053.    procedure DEFINE_MACRO( MACRO : in MACRO_NUMBER ;
  1054.                            TEXT  : in STRING ) ;
  1055.       -- Create or delete volatile macros
  1056.  
  1057.    procedure DEFINE_MACRO( MACRO : in MACRO_NUMBER ) ;
  1058.       -- Delete volatile macros
  1059.  
  1060.    procedure DELETE_SEGMENT ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) ;
  1061.       -- Remove a segment from memory.
  1062.  
  1063.    procedure DELETE_VIEW ( VIEW_ID : in VIEW_NUMBER ) ;
  1064.       -- Delete the specified view.
  1065.  
  1066.    procedure DISABLE_GIN ;
  1067.       -- Disable all GIN devices.
  1068.  
  1069.    procedure DRAW ( POSITION : in TERMINAL_POINT ) ;
  1070.       -- Draw a vector from the current graphics position to the
  1071.       -- specified location.
  1072.  
  1073.    procedure DRAW_MARKER ( POSITION : in TERMINAL_POINT ) ;
  1074.       -- Draw a marker at the specified location.
  1075.  
  1076.    procedure ENABLE_DIALOG_AREA ( ENABLE_AREA : in DIALOG_MODE ) ;
  1077.       -- Enable or disable the dialog area.
  1078.  
  1079.    procedure ENABLE_GIN ( DEVICE           : in DEVICE_CODE ;
  1080.                           GIN_FUNCTION     : in FUNCTION_CODE ;
  1081.                           NUMBER_OF_EVENTS : in NUMBER_OF_GIN_EVENTS ) ;
  1082.       -- Enable the terminal for graphics
  1083.  
  1084.    procedure ENABLE_KEY_EXPANSION( EXPANSION : in KEY_EXPANSION ) ;
  1085.       -- Enables or disables key macros
  1086.  
  1087.    procedure END_PANEL ;
  1088.       -- Terminate a panel definition.
  1089.  
  1090.    procedure END_SEGMENT ;
  1091.       -- Terminate the segment currently being defined.
  1092.  
  1093.    procedure ENTER_ALPHA_MODE ;
  1094.       -- Place the terminal in alpha mode.
  1095.  
  1096.    procedure ENTER_BYPASS_MODE ;
  1097.       -- Place the terminal in bypass mode.
  1098.  
  1099.    procedure ENTER_MARKER_MODE ;
  1100.       -- Place the terminal in marker mode.
  1101.  
  1102.    procedure ENTER_VECTOR_MODE ;
  1103.       -- Place the terminal in vector mode.
  1104.  
  1105.    procedure GRAPHIC_TEXT ( TEXT : in STRING ) ;
  1106.       -- Write a string of graphtext starting at the current
  1107.       -- graphics position.
  1108.  
  1109.    procedure HARDCOPY ( COPY_CODE : in HARDCOPY_CODE ) ;
  1110.       -- Causes an attached hardcopy unit to make a copy of the terminal's
  1111.       -- screen or dialog area.
  1112.  
  1113.    procedure INCLUDE_COPY_OF_SEGMENT
  1114.                      ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) ;
  1115.       -- Copies another segment into the segment currently being
  1116.       -- defined
  1117.  
  1118.    procedure LOCK_VIEWING_KEYS ( LOCK_KEYS : in LOCKING_MODE ) ;
  1119.       -- Locks and unlocks the zoom and pan modes.
  1120.  
  1121.    procedure MOVE ( POSITION : in TERMINAL_POINT ) ;
  1122.       -- Set the current graphics position without drawing a vector.
  1123.  
  1124.    procedure PAGE ;
  1125.       -- Erase the screen except the dialog area.
  1126.  
  1127.    procedure RENAME_SEGMENT ( OLD_SEGMENT : in SEGMENT_IDENTIFIER ;
  1128.                               NEW_SEGMENT : in SEGMENT_IDENTIFIER ) ;
  1129.       -- Rename an existing segment.
  1130.  
  1131.    procedure RENEW_VIEW ( VIEW : in VIEW_NUMBER ) ;
  1132.       -- Erase the specified view and redraw all segments visible
  1133.       -- in that view.
  1134.  
  1135.    procedure REPORT_ERRORS ;
  1136.       -- Cause the terminal to send an error report to the host.
  1137.  
  1138.    procedure RESET ;
  1139.       -- Returns the terminal to its power_up condition.
  1140.  
  1141.    procedure SELECT_CODE ( MODE : in TERMINAL_MODE ) ;
  1142.       -- Cause the terminal to recognize Ansi, Tek, or VT52 mode
  1143.       -- command syntax.
  1144.  
  1145.    procedure SELECT_FILL_PATTERN ( 
  1146.                 FILL_PATTERN : in FILL_PATTERN_NUMBER ) ;
  1147.       -- Specifies the fill pattern for subsequent panels.
  1148.  
  1149.    procedure SELECT_HARDCOPY_INTERFACE ( COPIER : in COPIER_TYPE ) ;
  1150.       -- Select the copies type to be used in the HARDCOPY command.
  1151.  
  1152.    procedure SELECT_VIEW ( VIEW : in VIEW_NUMBER ) ;
  1153.       -- Specifies which view is the current view.
  1154.  
  1155.    procedure SET_ALPHA_CURSOR_INDICES (
  1156.                  FIRST_COLOR  : in COLOR_INDEX ;
  1157.                  SECOND_COLOR : in COLOR_INDEX ) ;
  1158.       -- Assigns specified color indices to the alpha cursor.
  1159.  
  1160.    procedure SET_BACKGROUND_COLOR (
  1161.                  FIRST_COLOR  : in COLOR_INDEX ;
  1162.                  SECOND_COLOR : in COLOR_INDEX ;
  1163.                  THIRD_COLOR  : in COLOR_INDEX ) ;
  1164.       -- Sets the color of the background surface which is behind all
  1165.       -- of the transparent writing surfaces.
  1166.  
  1167.    procedure SET_BORDER_VISIBILITY (
  1168.                  BORDER_VISIBLE : in VISIBILITY_MODE ) ;
  1169.       -- Controls the visibility of a border drawn around the current
  1170.       -- view's viewport.
  1171.  
  1172.    procedure SET_CHARACTER_PATH ( PATH : in CHARACTER_DIRECTION ) ;
  1173.       -- Specifies the direction to move after writing each
  1174.       -- graphtext character.
  1175.  
  1176.    procedure SET_COLOR_MODE ( COLOR_SYSTEM  : in COLOR_COORDINATE_SYSTEM ;
  1177.                               COLOR_OVERLAY : in COLOR_OVERLAY_TYPE ;
  1178.                               COLOR_OR_GRAY : in COLOR_OPERATION_MODE ) ;
  1179.       -- Set the color mode for the terminal.
  1180.  
  1181.    procedure SET_COPY_SIZE ( IMAGE : in IMAGE_SIZE ) ;
  1182.       -- Selects the copy size to produce a standard or reduced image.
  1183.  
  1184.    procedure SET_DIALOG_AREA_BUFFER_SIZE ( LINES : in DIALOG_LINES ) ;
  1185.       -- Specify the maximum number of lines of text stored in the
  1186.       -- dialog area buffer.
  1187.  
  1188.    procedure SET_DIALOG_AREA_COLOR_MAP (
  1189.                  COLOR_TO_UPDATE  : in COLOR_INDEX      ;
  1190.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  1191.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  1192.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) ;
  1193.       -- Specify the color assigned to a color index in the dialog area.
  1194.  
  1195.    procedure SET_DIALOG_AREA_HARDCOPY_ATTRIBUTES (
  1196.                  PAGES        : in NUMBER_OF_PAGES ;
  1197.                  ORIGIN       : in PAGE_ORIGIN ;
  1198.                  FF_INTERPRET : in FORM_FEED_INTERPRETATION ) ;
  1199.       -- Specifies the number of pages to be copied, the starting
  1200.       -- page, and how the form feed is interpreted.
  1201.  
  1202.    procedure SET_DIALOG_AREA_INDEX (
  1203.                  CHAR_INDEX              : in COLOR_INDEX ;
  1204.                  CHAR_BACKGROUND_INDEX   : in COLOR_INDEX ;
  1205.                  DIALOG_BACKGROUND_INDEX : in COLOR_INDEX ) ;
  1206.       -- Specify the color index for alphatext characters, character-cell
  1207.       -- background, and dialog area background.
  1208.  
  1209.    procedure SET_DIALOG_AREA_LINES ( LINES : in DIALOG_LINES ) ;
  1210.       -- Specify the maximum number of lines visible in the dialog area.
  1211.  
  1212.    procedure SET_DIALOG_AREA_VISIBILITY (
  1213.                 AREA_VISIBLE : in VISIBILITY_MODE ) ;
  1214.       -- Specifies whether the dialog area is visible or invisible.
  1215.  
  1216.    procedure SET_EOM_CHARACTERS ( FIRST_EOM  : in CHARACTER ;
  1217.                                   SECOND_EOM : in CHARACTER );
  1218.       -- Specifies the characters used to terminate messages.
  1219.  
  1220.    procedure SET_ERROR_THRESHOLD (
  1221.                  ERROR_DISPLAY : in ERROR_DISPLAY_LEVEL ) ;
  1222.       -- Specifies the levels of error messages the terminal displays
  1223.  
  1224.    procedure SET_GIN_CURSOR_COLOR (
  1225.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  1226.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  1227.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) ;
  1228.       -- Specifies the color mixture for the graphics crosshair cursor.
  1229.  
  1230.    procedure SET_GIN_DISPLAY_START_POINT ( 
  1231.                             DEVICE       : in DEVICE_CODE ;
  1232.                             GIN_FUNCTION : in FUNCTION_CODE ;
  1233.                             START_POINT  : in TERMINAL_POINT ) ;
  1234.       -- Specifies an initial point for GIN inking or GIN rubberbanding.
  1235.  
  1236.    procedure SET_GIN_RUBBERBANDING (
  1237.                 DEVICE        : in DEVICE_CODE ;
  1238.                 GIN_FUNCTION  : in FUNCTION_CODE ;
  1239.                 RUBBERBANDING : in RUBBERBANDING_MODE ) ;
  1240.       -- Turns rubberbanding on or off for all subsequent operations of
  1241.       -- the specified Locator function.
  1242.  
  1243.    procedure SET_GRAPHTEXT_PRECISION (
  1244.                 PRECISION : in GRAPHTEXT_PRECISION ) ;
  1245.       -- Selects string-precision or stroke-precision to draw graphtext
  1246.       -- characters.
  1247.  
  1248.    procedure SET_GRAPHTEXT_SIZE (
  1249.                  WIDTH   : in TERMINAL_COORDINATE ;
  1250.                  HEIGHT  : in TERMINAL_COORDINATE ;
  1251.                  SPACING : in TERMINAL_COORDINATE ) ;
  1252.       -- Set the size of graphics text.
  1253.  
  1254.    procedure SET_LINE_INDEX ( LINE_INDEX : in COLOR_INDEX ) ;
  1255.       -- Specify the color index for all subsequent lines,
  1256.       -- panel boundaries, and markers.
  1257.  
  1258.    procedure SET_LINE_STYLE ( LINE : in LINE_STYLE ) ;
  1259.       -- Specify the line style for subsequent lines and panel boundaries.
  1260.  
  1261.    procedure SET_MARKER_TYPE ( MARKER : in MARKER_NUMBER ) ;
  1262.       -- Specify the marker style.
  1263.  
  1264.    procedure SET_PICK_APERTURE (
  1265.                  APERTURE_WIDTH : in TERMINAL_COORDINATE ) ;
  1266.       -- Sets the size of the GIN cursor aperture used to pick segments.
  1267.  
  1268.    procedure SET_PICK_ID ( PICK_ID : in PICK_ID_IDENTIFIER ) ;
  1269.       -- Mark the next xy location added to the currently open segment
  1270.       -- as a pick point and assign the specified identification number.
  1271.  
  1272.    procedure SET_PIVOT_POINT ( PIVOT_POINT : in TERMINAL_POINT ) ;
  1273.       -- Specify the pivot point for subsequent segment definitions.
  1274.  
  1275.    procedure SET_QUEUE_SIZE (
  1276.                 QUEUE_SIZE : in INPUT_QUEUE_SIZE ) ;
  1277.       -- Specifies the size in bytes of the terminal's input queue
  1278.       -- for RS-232 communications.
  1279.  
  1280.    procedure SET_REPORT_EOM_FREQUENCY (
  1281.                 FREQUENCY : in EOM_FREQUENCY ) ;
  1282.       -- Specifies how often the terminal sends an EOL string to
  1283.       -- the host.
  1284.  
  1285.    procedure SET_REPORT_SIG_CHARACTER (
  1286.                             REPORT_TYPE   : in FUNCTION_CODE ;
  1287.                             SIG_CHAR      : in CHARACTER ;
  1288.                             TERM_SIG_CHAR : in CHARACTER );
  1289.       -- Assign the signature characters used within report messages
  1290.       -- that the terminal sends to the host.
  1291.  
  1292.    procedure SET_SEGMENT_DETECTABILITY ( SEGMENT    : in SEGMENT_IDENTIFIER ;
  1293.                                          DETECTABLE : in DETECTABILITY ) ;
  1294.       -- Set the detectability of a segment.
  1295.  
  1296.    procedure SET_SEGMENT_DISPLAY_PRIORITY ( SEGMENT  : in SEGMENT_IDENTIFIER ;
  1297.                                             PRIORITY : in PRIORITY_NUMBER ) ;
  1298.       -- Set the display priority of the specified segment.
  1299.  
  1300.    procedure SET_SEGMENT_HIGHLIGHTING ( SEGMENT   : in SEGMENT_IDENTIFIER ;
  1301.                                         HIGHLIGHT : in HIGHLIGHTING ) ;
  1302.       -- Turn highlighting on or off for the specified segment.
  1303.  
  1304.    procedure SET_SEGMENT_POSITION ( SEGMENT  : in SEGMENT_IDENTIFIER ;
  1305.                                     POSITION : in TERMINAL_POINT ) ;
  1306.       -- Move the segment pivot point to the specified position.
  1307.  
  1308.    procedure SET_SEGMENT_VISIBILITY ( SEGMENT    : in SEGMENT_IDENTIFIER ;
  1309.                                       VISIBILITY : in VISIBILITY_MODE ) ;
  1310.       -- Set the specified segment visible or invisible.
  1311.  
  1312.    procedure SET_SNOOPY_MODE ( SNOOPY : in SNOOPY_MODE ) ;
  1313.       -- Specifies whether or not the terminal is in snoopy mode.
  1314.  
  1315.    procedure SET_SURFACE_COLOR_MAP (
  1316.                  SURFACE          : in SURFACE_NUMBER   ;
  1317.                  COLOR_TO_UPDATE  : in COLOR_INDEX      ;
  1318.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  1319.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  1320.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) ;
  1321.       -- Sets the color map for the graphics region
  1322.  
  1323.    procedure SET_SURFACE_DEFINITIONS (
  1324.                  PLANES_IN_1 : in BIT_PLANES ;
  1325.                  PLANES_IN_2 : in BIT_PLANES ;
  1326.                  PLANES_IN_3 : in BIT_PLANES ;
  1327.                  PLANES_IN_4 : in BIT_PLANES ) ;
  1328.       -- Erases the screen and sets the number of surfaces and the
  1329.       -- number of bit planes in each surface.
  1330.  
  1331.    procedure SET_SURFACE_PRIORITIES (
  1332.                  SURFACE_A  : in SURFACE_NUMBER ;
  1333.                  PRIORITY_A : in SURFACE_PRIORITY ;
  1334.                  SURFACE_B  : in SURFACE_NUMBER ;
  1335.                  PRIORITY_B : in SURFACE_PRIORITY ;
  1336.                  SURFACE_C  : in SURFACE_NUMBER ;
  1337.                  PRIORITY_C : in SURFACE_PRIORITY ;
  1338.                  SURFACE_D  : in SURFACE_NUMBER ;
  1339.                  PRIORITY_D : in SURFACE_PRIORITY ) ;
  1340.       -- Sets the priority of the specified writing surface
  1341.  
  1342.    procedure SET_SURFACE_VISIBILITY (
  1343.                  SURFACE    : in SURFACE_NUMBER     ;
  1344.                  VISIBILITY : in SURFACE_VISIBILITY ) ;
  1345.       -- Set the visibility of a surface without affecting the
  1346.       -- surface priority.
  1347.  
  1348.    procedure SET_TEXT_INDEX ( TEXT_INDEX : in COLOR_INDEX ) ;
  1349.       -- Specify the color index for alphatext and graphtext in the
  1350.       -- graphics area.
  1351.  
  1352.    procedure SET_VIEW_ATTRIBUTES ( 
  1353.                  SURFACE      : in SURFACE_NUMBER ;
  1354.                  WIPE_INDEX   : in COLOR_INDEX ;
  1355.                  BORDER_INDEX : in COLOR_INDEX ) ;
  1356.       -- Sets the surface, wipe index, and border index for the
  1357.       -- current view.
  1358.  
  1359.    procedure SET_VIEWPORT ( FIRST_CORNER  : in SCREEN_POINT ;
  1360.                             SECOND_CORNER : in SCREEN_POINT ) ;
  1361.       -- Set the position of the current view's viewport in normalized
  1362.       -- screen coordinate space.
  1363.  
  1364.    procedure SET_WINDOW ( FIRST_CORNER  : in TERMINAL_POINT ;
  1365.                           SECOND_CORNER : in TERMINAL_POINT ) ;
  1366.       -- Set the boundaries of the current view's window in
  1367.       -- terminal space.
  1368.    --
  1369.    --   SUPPORT PROCEDURES
  1370.    --
  1371.    procedure TERMINAL_INITIALIZATION ;
  1372.       --  Initialize the Tektronix 4107 display terminal.
  1373.  
  1374.    procedure TERMINAL_TERMINATION ;
  1375.       --  Reset the Tektronix 4107 display terminal for the
  1376.       -- ANSI mode.
  1377.  
  1378.    procedure GRAPHICS_INPUT_REPORT (
  1379.                       KEY_PRESSED     : out CHARACTER ;
  1380.                       CURSOR_LOCATION : out TERMINAL_POINT ;
  1381.                       SEGMENT_NUMBER  : out SEGMENT_IDENTIFIER ;
  1382.                       PICK_ID_NUMBER  : out PICK_ID_IDENTIFIER ) ;
  1383.    -- Retrieve and interpret the graphics input report.
  1384.  
  1385.    procedure SEND_ESCAPE_SEQUENCE_TO_4107( CMD_TEXT : in STRING ) ;
  1386.       -- Send the received command sequence to the terminal.
  1387.  
  1388. end TEKDRIVER ;
  1389. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1390. --tekdriver_body.ada
  1391. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1392. with TEXT_IO; use TEXT_IO;
  1393.  
  1394. package body TEKDRIVER is 
  1395.  
  1396.    -- Zero and one integer parameters encoded in host syntax.
  1397.    -- LO-I integer values for zero and one.
  1398.    HOST_SYNTAX_ZERO : constant INTEGER := 2#01_1_0000#;
  1399.    HOST_SYNTAX_ONE  : constant INTEGER := 2#01_1_0001#;
  1400.  
  1401.    -- DEBUG_FILE_HANDLE : FILE_TYPE ;
  1402.  
  1403.    --   SUPPORT PROCEDURES
  1404.    --
  1405.    --   The following procedures are required to support the procedures
  1406.    --   which directly implement the 4107 commands.
  1407.  
  1408.    function HOST_XY ( COORDINATE_POINT : TERMINAL_POINT )
  1409.                      return XY_COORDINATES_STRING is
  1410.       -- Encode the x- and y- coordinate from the input parameter
  1411.       -- coordinate point into five ASCII characters.
  1412.  
  1413.       HI_X   : INTEGER range 2#01_00000#..2#01_11111# := 2#01_00000#;
  1414.       HI_Y   : INTEGER range 2#01_00000#..2#01_11111# := 2#01_00000#;
  1415.       LO_Y   : INTEGER range 2#11_00000#..2#11_11111# := 2#11_00000#;
  1416.       LO_X   : INTEGER range 2#10_00000#..2#10_11111# := 2#10_00000#;
  1417.       EXTRA  : INTEGER range 2#110_0000#..2#110_1111# := 2#110_0000#;
  1418.  
  1419.       type POINT is ( X, Y );
  1420.       type HI_LO is ( HIGH, LOW );
  1421.  
  1422.       INITIAL_XY : array( POINT ) of INTEGER range 0..4095 :=
  1423.            ( X => COORDINATE_POINT.X, Y => COORDINATE_POINT.Y );
  1424.  
  1425.       SHIFT_VALUES : constant array( HI_LO ) of INTEGER :=
  1426.            ( HIGH => 2**7, LOW => 2**2 );
  1427.  
  1428.       MASKED_VALUES : array( POINT, HI_LO ) of INTEGER;
  1429.  
  1430.       HOST_SYNTAX_XY : XY_COORDINATES_STRING;
  1431.  
  1432.    begin
  1433.  
  1434.       for XY in POINT
  1435.       loop
  1436.  
  1437.          for HL in HI_LO
  1438.          loop
  1439.  
  1440.             MASKED_VALUES( XY, HL) := INITIAL_XY( XY ) / SHIFT_VALUES( HL );
  1441.  
  1442.             if MASKED_VALUES( XY, HL ) > 0 then
  1443.                INITIAL_XY( XY ) := INITIAL_XY( XY )
  1444.                   - ( MASKED_VALUES( XY, HL ) * SHIFT_VALUES( HL ) );
  1445.             end if;
  1446.          end loop;
  1447.       end loop;
  1448.  
  1449.       HI_X := HI_X + MASKED_VALUES( X, HIGH );
  1450.       LO_X := LO_X + MASKED_VALUES( X, LOW  );
  1451.       HI_Y := HI_Y + MASKED_VALUES( Y, HIGH );
  1452.       LO_Y := LO_Y + MASKED_VALUES( Y, LOW  );
  1453.  
  1454.       EXTRA := EXTRA + ( INITIAL_XY( Y ) * ( 2**2 )) + INITIAL_XY( X );
  1455.  
  1456.       HOST_SYNTAX_XY(1) := CHARACTER'val( HI_Y );
  1457.       HOST_SYNTAX_XY(2) := CHARACTER'val( EXTRA );
  1458.       HOST_SYNTAX_XY(3) := CHARACTER'val( LO_Y );
  1459.       HOST_SYNTAX_XY(4) := CHARACTER'val( HI_X );
  1460.       HOST_SYNTAX_XY(5) := CHARACTER'val( LO_X );
  1461.  
  1462.       return HOST_SYNTAX_XY;
  1463.  
  1464.    end HOST_XY;
  1465.  
  1466.  
  1467.    function TERMINAL_XY ( XY_STRING : XY_COORDINATES_STRING )
  1468.                           return TERMINAL_POINT is
  1469.       -- Decode the x- and y- coordinates from the five ASCII
  1470.       -- characters into a coordinate point.
  1471.  
  1472.       -- Define enumeration type corresponding to received string bytes.
  1473.       type BYTES_TYPE is ( HI_Y, EXTRA, LO_Y, HI_X, LO_X );
  1474.  
  1475.       XY_BYTES     : BYTES_TYPE;
  1476.       XY_INTEGERS  : array( BYTES_TYPE ) of INTEGER range 0..2#11111#;
  1477.       FIRST_EXTRA  : INTEGER range 0..2#1111#;
  1478.       SECOND_EXTRA : INTEGER range 0..2#1111#;
  1479.       XY_POINT     : TERMINAL_POINT;
  1480.  
  1481.       TWO_TO_THE_SEVEN : constant INTEGER := 2**7;
  1482.       TWO_TO_THE_TWO   : constant INTEGER := 2**2;
  1483.  
  1484.    begin
  1485.  
  1486.       -- Convert received characters into integer equivalents.
  1487.       for BYTE in BYTES_TYPE
  1488.       loop
  1489.  
  1490.          XY_INTEGERS( BYTE ) :=
  1491.             CHARACTER'POS( XY_STRING( BYTES_TYPE'POS( BYTE ) + 1 )) - 32;
  1492.  
  1493.       end loop;
  1494.  
  1495.       FIRST_EXTRA  := XY_INTEGERS( EXTRA ) / TWO_TO_THE_TWO;
  1496.       SECOND_EXTRA := XY_INTEGERS( EXTRA ) -
  1497.                       ( FIRST_EXTRA * TWO_TO_THE_TWO );
  1498.  
  1499.       XY_POINT.X := ( XY_INTEGERS( HI_X ) * TWO_TO_THE_SEVEN ) +
  1500.               ( XY_INTEGERS( LO_X ) * TWO_TO_THE_TWO ) + SECOND_EXTRA;
  1501.  
  1502.       XY_POINT.Y := ( XY_INTEGERS( HI_Y ) * TWO_TO_THE_SEVEN ) +
  1503.               ( XY_INTEGERS( LO_Y ) * TWO_TO_THE_TWO ) + FIRST_EXTRA;
  1504.  
  1505.       return XY_POINT;
  1506.  
  1507.    end TERMINAL_XY;
  1508.  
  1509.  
  1510.    function HOST_INTEGERS ( X_VALUE : INTEGER ) 
  1511.                             return TEK_INTEGER_STRING is
  1512.       -- Encode the integer input parameter into three ASCII characters.
  1513.  
  1514.       X    : INTEGER range -32767..32767 := X_VALUE;
  1515.       HI_A : INTEGER range 2#1_000000#..2#1_111111# := 2#1_000000#;
  1516.       HI_B : INTEGER range 2#1_000000#..2#1_111111# := 2#1_000000#;
  1517.       LO_I : INTEGER range 2#1_0_0000#..2#1_1_1111# := 2#1_0_0000#;
  1518.  
  1519.       MASKED_VALUE : INTEGER range 0..2#1111_111111_1111#;
  1520.       HI_A_DIV     : constant INTEGER := 2**10;
  1521.       HI_B_DIV     : constant INTEGER := 2**4;
  1522.  
  1523.       HOST_SYNTAX_INT : TEK_INTEGER_STRING;
  1524.  
  1525.    begin
  1526.  
  1527.       if X < 0 then
  1528.          X := abs ( X );
  1529.       else
  1530.          LO_I := LO_I + 2#0_1_0000#;
  1531.       end if;
  1532.  
  1533.       MASKED_VALUE := X / HI_A_DIV;
  1534.       if MASKED_VALUE > 0 then
  1535.          X := X - ( MASKED_VALUE * HI_A_DIV );
  1536.          HI_A := HI_A + MASKED_VALUE;
  1537.          HOST_SYNTAX_INT(1) := CHARACTER'val( HI_A );
  1538.       else
  1539.          HOST_SYNTAX_INT(1) := STANDARD.ASCII.NUL ;
  1540.       end if;
  1541.  
  1542.       MASKED_VALUE := X / HI_B_DIV;
  1543.       if MASKED_VALUE > 0 then
  1544.          X := X - ( MASKED_VALUE * HI_B_DIV);
  1545.          HI_B := HI_B + MASKED_VALUE;
  1546.          HOST_SYNTAX_INT(2) := CHARACTER'val( HI_B );
  1547.       else
  1548.          HOST_SYNTAX_INT(2) := STANDARD.ASCII.NUL ;
  1549.       end if;
  1550.  
  1551.       LO_I := LO_I + X;
  1552.  
  1553.       HOST_SYNTAX_INT(3) := CHARACTER'val( LO_I );
  1554.  
  1555.       return HOST_SYNTAX_INT;
  1556.  
  1557.    end HOST_INTEGERS;
  1558.  
  1559.  
  1560.    function TERMINAL_INTEGERS ( INTEGER_STRING : TEK_INTEGER_STRING )
  1561.                               return INTEGER is
  1562.       -- Decode the integer string input parameter into an integer value.
  1563.  
  1564.       HI_A     : INTEGER range 0..2#1_011111#;
  1565.       HI_B     : INTEGER range 0..2#1_011111#;
  1566.       LO_I     : INTEGER range 0..2#1_1_1111#;
  1567.       SIGN_BIT : INTEGER range -1..1;
  1568.  
  1569.       TWO_TO_THE_TEN  : constant INTEGER := 2**10;
  1570.       TWO_TO_THE_FOUR : constant INTEGER := 2**4;
  1571.  
  1572.       INTEGER_REPORT  : INTEGER;
  1573.  
  1574.    begin
  1575.  
  1576.       HI_A := CHARACTER'POS( INTEGER_STRING( 1 )) - 32;
  1577.       HI_B := CHARACTER'POS( INTEGER_STRING( 2 )) - 32;
  1578.       LO_I := CHARACTER'POS( INTEGER_STRING( 3 )) - 32;
  1579.  
  1580.       -- If sign bit is zero then integer is negative;
  1581.       -- if sign bit is one then subtract sign bit.
  1582.       SIGN_BIT := LO_I / TWO_TO_THE_FOUR;
  1583.       if SIGN_BIT = 0 then
  1584.          SIGN_BIT := -1;
  1585.       else
  1586.          LO_I := LO_I - TWO_TO_THE_FOUR;
  1587.       end if;
  1588.  
  1589.       INTEGER_REPORT := ( HI_A * TWO_TO_THE_TEN )
  1590.                         + ( HI_B * TWO_TO_THE_FOUR )
  1591.                         + LO_I ;
  1592.       INTEGER_REPORT := INTEGER_REPORT * SIGN_BIT;
  1593.  
  1594.       return INTEGER_REPORT;
  1595.  
  1596.    end TERMINAL_INTEGERS;
  1597.  
  1598.  
  1599.    procedure SEND_TO_4107 ( CMD_TEXT : in STRING ) is
  1600.       -- Send the received command string to the 4107
  1601.  
  1602.    begin
  1603.       TEXT_IO.PUT( CMD_TEXT );
  1604.    end SEND_TO_4107;
  1605.  
  1606.    procedure SEND_ESCAPE_SEQUENCE_TO_4107( CMD_TEXT : in STRING ) is
  1607.       -- Send the received command sequence to the terminal.
  1608.    begin
  1609.       SEND_TO_4107( ESC & CMD_TEXT ) ;
  1610.    end SEND_ESCAPE_SEQUENCE_TO_4107 ;
  1611.  
  1612.    procedure TERMINAL_INITIALIZATION is
  1613.       --  Initialize the Tektronix 4107 display terminal.
  1614.  
  1615.       -- Number of dialog lines in the dialog area.
  1616.       DIALOG_AREA_LINES : constant DIALOG_LINES := 24;
  1617.  
  1618.       -- Delete all segments currently stored in the terminal.
  1619.       DELETE_ALL_SEGMENTS : constant SEGMENT_IDENTIFIER := -1;
  1620.  
  1621.       -- Delete all views from the terminal.
  1622.       DELETE_ALL_VIEWS : constant VIEW_NUMBER := -1;
  1623.  
  1624.       -- String used for macro expansion to lock out function keys
  1625.       EXPANSION_STRING : constant STRING := "A" ;
  1626.  
  1627.       -- Define constants for the keys not interpreted during GIN.
  1628.       UNSHIFTED_FUNCTION_1    : constant MACRO_NUMBER := 128 ;
  1629.       SHIFTED_FUNCTION_8      : constant MACRO_NUMBER := 143 ;
  1630.  
  1631.       CTRL_FUNCTION_1         : constant MACRO_NUMBER := -2  ;
  1632.       CTRL_SHIFTED_FUNCTION_8 : constant MACRO_NUMBER := -17 ;
  1633.  
  1634.       RETURN_KEY              : constant MACRO_NUMBER := 13  ;
  1635.       SHIFTED_RETURN_KEY      : constant MACRO_NUMBER := -49 ;
  1636.       CTRL_RETURN_KEY         : constant MACRO_NUMBER := -50 ;
  1637.       CTRL_SHIFTED_RETURN_KEY : constant MACRO_NUMBER := -51 ;
  1638.  
  1639.       ENTER_KEY               : constant MACRO_NUMBER := -68 ;
  1640.       SHIFTED_ENTER_KEY       : constant MACRO_NUMBER := -82 ;
  1641.       CTRL_ENTER_KEY          : constant MACRO_NUMBER := -96 ;
  1642.       CTRL_SHIFTED_ENTER_KEY  : constant MACRO_NUMBER := -110;
  1643.  
  1644.       -- Define the initial window boundaries.
  1645.       INITIAL_WINDOW_F_C : constant TERMINAL_POINT :=
  1646.                              ( X => 0, Y => 0 );
  1647.  
  1648.       INITIAL_WINDOW_S_C : constant TERMINAL_POINT :=
  1649.                              ( X => 4095, Y => 3130 );
  1650.  
  1651.       -- Define the initial viewport boundaries.
  1652.       INITIAL_VIEWPORT_F_C : constant SCREEN_POINT :=
  1653.                              ( X => 0, Y => 0 );
  1654.  
  1655.       INITIAL_VIEWPORT_S_C : constant SCREEN_POINT :=
  1656.                              ( X => 4095, Y => 3071 );
  1657.  
  1658.    begin
  1659.  
  1660.       -- CREATE ( DEBUG_FILE_HANDLE , TEXT_IO.OUT_FILE ,
  1661.       --   "TEKDRIVER_DEBUG.LISTING" );
  1662.  
  1663.       -- Cause the terminal to recognize Tek commands.
  1664.       SELECT_CODE( TEK );
  1665.  
  1666.       -- Delete all views.
  1667.       DELETE_VIEW ( DELETE_ALL_VIEWS );
  1668.  
  1669.       -- Delete all segments.
  1670.       DELETE_SEGMENT ( DELETE_ALL_SEGMENTS );
  1671.  
  1672.       -- Set the number of surfaces and the bit planes per surface.
  1673.       SET_SURFACE_DEFINITIONS ( 4, 0, 0, 0 ) ;
  1674.  
  1675.       -- Specify view 1 as current view
  1676.       SELECT_VIEW( 1 );
  1677.  
  1678.       -- Set the surface visibility and the view attributes
  1679.       SET_SURFACE_VISIBILITY( SURFACE_1, SURFACE_VISIBLE ) ;
  1680.       SET_VIEW_ATTRIBUTES( SURFACE_1, 0, 0 ) ;
  1681.  
  1682.       -- Set view border visibility
  1683.       SET_BORDER_VISIBILITY( INVISIBLE );
  1684.  
  1685.       -- Set the graphtext character path
  1686.       SET_CHARACTER_PATH( RIGHT ) ;
  1687.  
  1688.       -- Set the color mode for the terminal.
  1689.       SET_COLOR_MODE ( RGB,
  1690.                        NO_OVERLAY_CHANGE,
  1691.                        NO_OPERATION_CHANGE );
  1692.  
  1693.       -- Erase the dialog buffer.
  1694.       -- CLEAR_DIALOG_SCROLL;
  1695.  
  1696.       -- Set the color map for the graphics region
  1697.       for CURRENT_COLOR in FIRST_COLOR..LAST_COLOR
  1698.       loop 
  1699.          SET_SURFACE_COLOR_MAP( SURFACE_1, CURRENT_COLOR,
  1700.              INITIAL_COLORS( CURRENT_COLOR ).RED,
  1701.              INITIAL_COLORS( CURRENT_COLOR ).GREEN,
  1702.              INITIAL_COLORS( CURRENT_COLOR ).BLUE ) ;
  1703.       end loop ;
  1704.  
  1705.       -- Set the color map for the dialog area
  1706.       for CURRENT_COLOR in FIRST_COLOR..DIALOG_LAST_COLOR
  1707.       loop 
  1708.          SET_DIALOG_AREA_COLOR_MAP( CURRENT_COLOR,
  1709.              INITIAL_COLORS( CURRENT_COLOR ).RED,
  1710.              INITIAL_COLORS( CURRENT_COLOR ).GREEN,
  1711.              INITIAL_COLORS( CURRENT_COLOR ).BLUE ) ;
  1712.       end loop ;
  1713.  
  1714.       -- Specify the maximum number of lines visible in the dialog area.
  1715.       SET_DIALOG_AREA_LINES ( DIALOG_AREA_LINES );
  1716.  
  1717.       -- Specify the number of lines in the dialog buffer
  1718.       SET_DIALOG_AREA_BUFFER_SIZE( DIALOG_AREA_LINES );
  1719.  
  1720.       -- Set color index for alpha characters, character cell
  1721.       -- background, and dialog area background
  1722.       SET_DIALOG_AREA_INDEX( BLUE, 0, 0 ) ;
  1723.  
  1724.       -- Set line style to unbroken line and line color to white
  1725.       SET_LINE_STYLE( 0 ) ;
  1726.       SET_LINE_INDEX( BLUE ) ;
  1727.  
  1728.       -- Set color of background writing surface and specify the
  1729.       -- color indices for the alpha cursor
  1730.       SET_BACKGROUND_COLOR(
  1731.              INITIAL_COLORS( WHITE ).RED,
  1732.              INITIAL_COLORS( WHITE ).GREEN,
  1733.              INITIAL_COLORS( WHITE ).BLUE ) ;
  1734.       SET_ALPHA_CURSOR_INDICES( GREEN, RED ) ;
  1735.  
  1736.       -- Set the size of graphtext characters, and the text color index
  1737.       SET_GRAPHTEXT_SIZE( 20, 20 , 8 ) ;
  1738.       SET_TEXT_INDEX( BLUE ) ;
  1739.  
  1740.       -- Enable the dialog area, and set the dialog area visible
  1741.       ENABLE_DIALOG_AREA ( ENABLE_DIALOG );
  1742.       SET_DIALOG_AREA_VISIBILITY( VISIBLE );
  1743.  
  1744.       -- Set the current window boundaries.
  1745.       SET_WINDOW( INITIAL_WINDOW_F_C, INITIAL_WINDOW_S_C ); 
  1746.  
  1747.       -- Set the current viewport boundaries.
  1748.       SET_VIEWPORT ( INITIAL_VIEWPORT_F_C, INITIAL_VIEWPORT_S_C );
  1749.  
  1750.       -- Specify how often the terminal sends an EOL
  1751.       SET_REPORT_EOM_FREQUENCY( LESS_FREQUENT ) ;
  1752.  
  1753.       -- Assign the signature characters to be used within the
  1754.       -- locator report.
  1755.       SET_REPORT_SIG_CHARACTER ( LOCATOR, LOCATOR_SIG_CHAR,
  1756.                                           LOCATOR_TRM_CHAR );
  1757.  
  1758.       -- Assign the signature characters to be used within the
  1759.       -- pick report.
  1760.       SET_REPORT_SIG_CHARACTER ( PICK, PICK_SIG_CHAR,
  1761.                                        PICK_TRM_CHAR );
  1762.  
  1763.       -- Specify the characters used to terminate messages.
  1764.       SET_EOM_CHARACTERS ( STANDARD.ASCII.CR, STANDARD.ASCII.LF );
  1765.  
  1766.       -- Specify the color of the crosshair cursor
  1767.       SET_GIN_CURSOR_COLOR(
  1768.               INITIAL_COLORS( BLUE ).RED,
  1769.               INITIAL_COLORS( BLUE ).GREEN,
  1770.               INITIAL_COLORS( BLUE ).BLUE ) ;
  1771.  
  1772.       -- Define key expansion macros for the function keys, the
  1773.       -- return key and the enter key
  1774.       for MACRO_ID in UNSHIFTED_FUNCTION_1..SHIFTED_FUNCTION_8
  1775.       loop
  1776.          DEFINE_MACRO( MACRO_ID, EXPANSION_STRING ) ;
  1777.       end loop ;
  1778.  
  1779.       for MACRO_ID in reverse CTRL_FUNCTION_1..CTRL_SHIFTED_FUNCTION_8
  1780.       loop
  1781.          DEFINE_MACRO( MACRO_ID, EXPANSION_STRING ) ;
  1782.       end loop ;
  1783.  
  1784.       DEFINE_MACRO( RETURN_KEY, EXPANSION_STRING ) ;
  1785.       DEFINE_MACRO( SHIFTED_RETURN_KEY, EXPANSION_STRING ) ;
  1786.       DEFINE_MACRO( CTRL_RETURN_KEY, EXPANSION_STRING ) ;
  1787.       DEFINE_MACRO( CTRL_SHIFTED_RETURN_KEY, EXPANSION_STRING ) ;
  1788.  
  1789.       DEFINE_MACRO( ENTER_KEY, EXPANSION_STRING ) ;
  1790.       DEFINE_MACRO( SHIFTED_ENTER_KEY, EXPANSION_STRING ) ;
  1791.       DEFINE_MACRO( CTRL_ENTER_KEY, EXPANSION_STRING ) ;
  1792.       DEFINE_MACRO( CTRL_SHIFTED_ENTER_KEY, EXPANSION_STRING ) ;
  1793.  
  1794.       -- Disable macro key expansion
  1795.       ENABLE_KEY_EXPANSION( DISABLED ) ;
  1796.  
  1797.       -- Cause the terminal to recognize ANSI commands.
  1798.       SELECT_CODE( ANSI );
  1799.  
  1800.    end TERMINAL_INITIALIZATION ;
  1801.  
  1802.    procedure TERMINAL_TERMINATION is
  1803.       --  Reset the Tektronix 4107 display terminal for the
  1804.       -- ANSI mode.
  1805.    begin
  1806.  
  1807.       SELECT_CODE( TEK );
  1808.       RESET ;
  1809.       TEXT_IO.PUT_LINE("  ") ;
  1810.       delay 20.0 ;
  1811.  
  1812.    end TERMINAL_TERMINATION ;
  1813.  
  1814.    procedure GRAPHICS_INPUT_REPORT (
  1815.                       KEY_PRESSED     : out CHARACTER ;
  1816.                       CURSOR_LOCATION : out TERMINAL_POINT ;
  1817.                       SEGMENT_NUMBER  : out SEGMENT_IDENTIFIER ;
  1818.                       PICK_ID_NUMBER  : out PICK_ID_IDENTIFIER ) is
  1819.    -- Retrieve and interpret the graphics input report.
  1820.    -- The only graphics input device supported is the joydisk.
  1821.    -- The input functions supported are the LOCATOR and PICK
  1822.    --
  1823.    --      GIN PICK REPORT             GIN LOCATOR REPORT
  1824.    --
  1825.    --      EOM INDICATOR               EOM INDICATOR
  1826.    --      SIG CHAR                    SIG CHAR
  1827.    --      KEY PRESSED                 KEY PRESSED
  1828.    --      XY REPORT                   XY REPORT
  1829.    --      SEGMENT NUMBER              EOM INDICATOR
  1830.    --      PICK ID NUMBER              TERM SIG CHAR
  1831.    --      EOM INDICATOR               EOM INDICATOR
  1832.    --      TERM SIG CHAR
  1833.    --      EOM INDICATOR
  1834.    --
  1835.       GIN_ERROR : exception;
  1836.  
  1837.       -- GIN report string, report string size, and report type.
  1838.       GIN_STRING    : STRING(1..30) := ( others => ' ') ;
  1839.       GIN_CHAR_SIZE : NATURAL;
  1840.       REPORT_TYPE   : FUNCTION_CODE;
  1841.       PARAM_STRING  : XY_COORDINATES_STRING;
  1842.  
  1843.       -- Final GIN report item string and string size
  1844.       FINAL_STRING : STRING(1..10);
  1845.       FINAL_SIZE   : NATURAL;
  1846.  
  1847.    begin
  1848.  
  1849.       -- Retrieve GIN pick report.
  1850.       TEXT_IO.GET_LINE( GIN_STRING, GIN_CHAR_SIZE );
  1851.  
  1852.       -- TEXT_IO.PUT_LINE(GIN_STRING);
  1853.       -- TEXT_IO.PUT_LINE( " STRING SIZE = " &
  1854.       --        INTEGER'IMAGE(GIN_CHAR_SIZE));
  1855.  
  1856.       -- Disable macro key expansion
  1857.       ENABLE_KEY_EXPANSION( DISABLED ) ;
  1858.  
  1859.       -- Determine the type GIN report received from the signature
  1860.       -- character.  If the signature character is not recognized
  1861.       -- then raise the GIN error exception.
  1862.       if GIN_STRING( 1 ) = LOCATOR_SIG_CHAR then
  1863.          REPORT_TYPE := LOCATOR;
  1864.       elsif GIN_STRING( 1 ) = PICK_SIG_CHAR then
  1865.          REPORT_TYPE := PICK;
  1866.       else
  1867.          raise GIN_ERROR;
  1868.       end if;
  1869.  
  1870.       KEY_PRESSED     := GIN_STRING( 2 );
  1871.       if GIN_STRING( 2 ) /= ' ' then
  1872.          raise GIN_ERROR ;
  1873.       end if ;
  1874.  
  1875.       PARAM_STRING(1..5) := GIN_STRING( 3..7 ) ;
  1876.       CURSOR_LOCATION := TERMINAL_XY( PARAM_STRING );
  1877.  
  1878.       if REPORT_TYPE = LOCATOR then
  1879.          SEGMENT_NUMBER  := 0;
  1880.          PICK_ID_NUMBER  := 0;
  1881.       else
  1882.          SEGMENT_NUMBER  := TERMINAL_INTEGERS( GIN_STRING( 8..10 ) );
  1883.          PICK_ID_NUMBER  := TERMINAL_INTEGERS( GIN_STRING( 11..13 ) );
  1884.       end if;
  1885.  
  1886.    exception
  1887.       when GIN_ERROR =>
  1888.          -- TEXT_IO.PUT_LINE("INVALID STRING");
  1889.          -- PUT_LINE (DEBUG_FILE_HANDLE, GIN_STRING) ;
  1890.          -- PUT_LINE (DEBUG_FILE_HANDLE, "STRING SIZE = " & 
  1891.          --    INTEGER'IMAGE(GIN_CHAR_SIZE) );
  1892.  
  1893.          -- Disable all GIN devices.
  1894.          -- DISABLE_GIN ;
  1895.  
  1896.          raise ;
  1897.    end GRAPHICS_INPUT_REPORT ;
  1898.  
  1899.    --
  1900.    -- COMMAND PROCEDURES FOR THE TEKTRONIX 4107
  1901.    --
  1902.    procedure BEGIN_PANEL_BOUNDARY ( FIRST_POINT   : in TERMINAL_POINT ;
  1903.                                     DRAW_BOUNDARY : in BOUNDARY ) is
  1904.       -- Start a panel definition.
  1905.  
  1906.       CMD_STRING : STRING(1..9);
  1907.    begin
  1908.  
  1909.       CMD_STRING(1..3) := ESC & "LP";
  1910.       CMD_STRING(4..8) := HOST_XY( FIRST_POINT );
  1911.       CMD_STRING(9) := CHARACTER'val( HOST_SYNTAX_ZERO + 
  1912.                        BOUNDARY'POS( DRAW_BOUNDARY ));
  1913.       SEND_TO_4107( CMD_STRING );
  1914.  
  1915.    end BEGIN_PANEL_BOUNDARY ;
  1916.  
  1917.    procedure BEGIN_SEGMENT ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) is
  1918.       -- Begin a new segment, and reset the current pick id to 1.
  1919.  
  1920.       CMD_STRING : STRING(1..6);
  1921.    begin
  1922.  
  1923.       CMD_STRING(1..3) := ESC & "SO";
  1924.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT_ID );
  1925.       SEND_TO_4107( CMD_STRING );
  1926.    end BEGIN_SEGMENT ;
  1927.  
  1928.    procedure CANCEL is
  1929.       -- Cancel terminal operations and several terminal
  1930.       -- parameters and modes.
  1931.  
  1932.       CMD_STRING : constant STRING(1..3) := ESC & "KC";
  1933.    begin
  1934.  
  1935.       SEND_TO_4107( CMD_STRING );
  1936.    end CANCEL ;
  1937.  
  1938.    procedure CLEAR_DIALOG_SCROLL is
  1939.       -- Erase the dialog buffer.
  1940.  
  1941.       CMD_STRING : constant STRING(1..3) := ESC & "LZ";
  1942.    begin
  1943.  
  1944.       SEND_TO_4107( CMD_STRING );
  1945.    end CLEAR_DIALOG_SCROLL ;
  1946.  
  1947.    procedure DEFINE_MACRO( MACRO : in MACRO_NUMBER ;
  1948.                            TEXT  : in STRING ) is
  1949.       -- Create or delete volatile macros
  1950.  
  1951.       STRING_SIZE : constant INTEGER := 9 + ( 3 * TEXT'LENGTH );
  1952.       CMD_STRING : STRING(1..STRING_SIZE );
  1953.       FIRST_CHAR  : NATURAL ;
  1954.       SECOND_CHAR : NATURAL ;
  1955.    begin
  1956.  
  1957.       CMD_STRING(1..3) := ESC & "KD";
  1958.       CMD_STRING(4..6) := HOST_INTEGERS( MACRO ) ;
  1959.       CMD_STRING(7..9) := HOST_INTEGERS( TEXT'LENGTH ) ;
  1960.       for N in 1..TEXT'LENGTH
  1961.       loop
  1962.          FIRST_CHAR := NATURAL( 7 + ( N * 3 ));
  1963.          SECOND_CHAR := FIRST_CHAR + 2 ;
  1964.          CMD_STRING(FIRST_CHAR..SECOND_CHAR) :=
  1965.                HOST_INTEGERS( CHARACTER'pos(TEXT(N)));
  1966.       end loop ;                                                         
  1967.       SEND_TO_4107( CMD_STRING );
  1968.    end DEFINE_MACRO ;
  1969.  
  1970.    procedure DEFINE_MACRO( MACRO : in MACRO_NUMBER ) is
  1971.       -- Delete volatile macros
  1972.  
  1973.       CMD_STRING : STRING( 1..6 );
  1974.    begin
  1975.  
  1976.       CMD_STRING(1..3) := ESC & "KD";
  1977.       CMD_STRING(4..6) := HOST_INTEGERS( MACRO ) ;
  1978.                                                          
  1979.       SEND_TO_4107( CMD_STRING );
  1980.    end DEFINE_MACRO ;
  1981.  
  1982.    procedure DELETE_SEGMENT ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) is
  1983.       -- Remove a segment from memory.
  1984.  
  1985.       CMD_STRING : STRING(1..6);
  1986.    begin
  1987.  
  1988.       CMD_STRING(1..3) := ESC & "SK";
  1989.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT_ID );
  1990.       SEND_TO_4107( CMD_STRING );
  1991.    end DELETE_SEGMENT ;
  1992.  
  1993.    procedure DELETE_VIEW ( VIEW_ID : in VIEW_NUMBER ) is
  1994.       -- Delete the specified view.
  1995.  
  1996.       CMD_STRING : STRING(1..6);
  1997.    begin
  1998.  
  1999.       CMD_STRING(1..3) := ESC & "RK";
  2000.       CMD_STRING(4..6) := HOST_INTEGERS( VIEW_ID );
  2001.       SEND_TO_4107( CMD_STRING );
  2002.    end DELETE_VIEW ;
  2003.  
  2004.    procedure DISABLE_GIN is
  2005.       -- Disable all GIN devices.
  2006.       CMD_STRING : STRING(1..6);
  2007.    begin
  2008.  
  2009.       CMD_STRING(1..3) := ESC & "ID";
  2010.       CMD_STRING(4..6) := HOST_INTEGERS( -1 );
  2011.       SEND_TO_4107( CMD_STRING );
  2012.    end DISABLE_GIN ;
  2013.  
  2014.    procedure DRAW ( POSITION : in TERMINAL_POINT ) is
  2015.       -- Draw a vector from the current graphics position to the
  2016.       -- specified location.
  2017.  
  2018.       CMD_STRING : STRING(1..8);
  2019.    begin
  2020.  
  2021.       CMD_STRING(1..3) := ESC & "LG";
  2022.       CMD_STRING(4..8) := HOST_XY( POSITION );
  2023.       SEND_TO_4107( CMD_STRING );
  2024.    end DRAW ;
  2025.  
  2026.    procedure DRAW_MARKER ( POSITION : in TERMINAL_POINT ) is
  2027.       -- Draw a marker at the specified location.
  2028.  
  2029.       CMD_STRING : STRING(1..8);
  2030.    begin
  2031.  
  2032.       CMD_STRING(1..3) := ESC & "LH";
  2033.       CMD_STRING(4..8) := HOST_XY( POSITION );
  2034.       SEND_TO_4107( CMD_STRING );
  2035.    end DRAW_MARKER ;
  2036.  
  2037.    procedure ENABLE_DIALOG_AREA ( ENABLE_AREA : in DIALOG_MODE ) is
  2038.       -- Enable or disable the dialog area.
  2039.  
  2040.       CMD_STRING : STRING(1..4);
  2041.    begin
  2042.  
  2043.       CMD_STRING(1..3) := ESC & "KA";
  2044.       CMD_STRING(4) := CHARACTER'val( HOST_SYNTAX_ZERO + 
  2045.                        DIALOG_MODE'POS( ENABLE_AREA ));
  2046.       SEND_TO_4107( CMD_STRING );
  2047.    end ENABLE_DIALOG_AREA ;
  2048.  
  2049.    procedure ENABLE_GIN ( DEVICE           : in DEVICE_CODE ;
  2050.                           GIN_FUNCTION     : in FUNCTION_CODE ;
  2051.                           NUMBER_OF_EVENTS : in NUMBER_OF_GIN_EVENTS ) is
  2052.       -- Enable the terminal for graphics
  2053.  
  2054.       CMD_STRING : STRING(1..7);
  2055.    begin
  2056.  
  2057.       -- Enable macro key expansion
  2058.       ENABLE_KEY_EXPANSION( ENABLED ) ;
  2059.  
  2060.       CMD_STRING(1..3) := ESC & "IE";
  2061.       CMD_STRING(4)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2062.                           FUNCTION_CODE'POS( GIN_FUNCTION ) );
  2063.       CMD_STRING(5..7) := HOST_INTEGERS( NUMBER_OF_EVENTS );
  2064.                                                          
  2065.       SEND_TO_4107( CMD_STRING );
  2066.  
  2067.    end ENABLE_GIN ;
  2068.  
  2069.    procedure ENABLE_KEY_EXPANSION( EXPANSION : in KEY_EXPANSION ) is
  2070.       -- Enables or disables key macros
  2071.  
  2072.       CMD_STRING : STRING(1..4);
  2073.    begin
  2074.  
  2075.       CMD_STRING(1..3) := ESC & "KW";
  2076.       CMD_STRING(4)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2077.                           KEY_EXPANSION'POS( EXPANSION ) );
  2078.                                                          
  2079.       SEND_TO_4107( CMD_STRING );
  2080.    end ENABLE_KEY_EXPANSION ;
  2081.  
  2082.    procedure END_PANEL is
  2083.       -- Terminate a panel definition.
  2084.  
  2085.       CMD_STRING : constant STRING(1..3) := ESC & "LE";
  2086.    begin
  2087.  
  2088.       SEND_TO_4107( CMD_STRING );
  2089.    end END_PANEL ;
  2090.  
  2091.    procedure END_SEGMENT is
  2092.       -- Terminate the segment currently being defined.
  2093.  
  2094.       CMD_STRING : constant STRING(1..3) := ESC & "SC";
  2095.    begin
  2096.  
  2097.       SEND_TO_4107( CMD_STRING );
  2098.    end END_SEGMENT ;
  2099.  
  2100.    procedure ENTER_ALPHA_MODE is
  2101.       -- Place the terminal in marker mode.
  2102.  
  2103.       CMD_STRING : constant STRING(1..1) := US;
  2104.    begin
  2105.  
  2106.       SEND_TO_4107( CMD_STRING );
  2107.    end ENTER_ALPHA_MODE ;
  2108.  
  2109.    procedure ENTER_BYPASS_MODE is
  2110.       -- Place the terminal in bypass mode.
  2111.  
  2112.       CMD_STRING : constant STRING(1..1) := CN;
  2113.    begin
  2114.  
  2115.       SEND_TO_4107( CMD_STRING );
  2116.    end ENTER_BYPASS_MODE ;
  2117.  
  2118.    procedure ENTER_MARKER_MODE is
  2119.       -- Place the terminal in marker mode.
  2120.  
  2121.       CMD_STRING : constant STRING(1..1) := FS;
  2122.    begin
  2123.  
  2124.       SEND_TO_4107( CMD_STRING );
  2125.    end ENTER_MARKER_MODE ;
  2126.  
  2127.    procedure ENTER_VECTOR_MODE is
  2128.       -- Place the terminal in vector mode.
  2129.  
  2130.       CMD_STRING : constant STRING(1..1) := GS;
  2131.    begin
  2132.  
  2133.       SEND_TO_4107( CMD_STRING );
  2134.    end ENTER_VECTOR_MODE ;
  2135.  
  2136.    procedure GRAPHIC_TEXT ( TEXT : in STRING ) is
  2137.       -- Write a string of graphtext starting at the current
  2138.       -- graphics position.
  2139.  
  2140.       STRING_SIZE : constant INTEGER := 6 + TEXT'LENGTH;
  2141.       CMD_STRING : STRING(1..STRING_SIZE );
  2142.    begin
  2143.  
  2144.       CMD_STRING(1..3) := ESC & "LT";
  2145.       CMD_STRING(4..6) := HOST_INTEGERS( TEXT'LENGTH );
  2146.       CMD_STRING(7..STRING_SIZE) := TEXT(1..TEXT'LENGTH);
  2147.                                                          
  2148.       SEND_TO_4107( CMD_STRING );
  2149.    end GRAPHIC_TEXT ;
  2150.  
  2151.    procedure INCLUDE_COPY_OF_SEGMENT
  2152.                      ( SEGMENT_ID : in SEGMENT_IDENTIFIER ) is
  2153.       -- Copies another segment into the segment currently being
  2154.       -- defined
  2155.  
  2156.       CMD_STRING : STRING(1..6);
  2157.    begin
  2158.  
  2159.       CMD_STRING(1..3) := ESC & "LK";
  2160.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT_ID );
  2161.       SEND_TO_4107( CMD_STRING );
  2162.    end INCLUDE_COPY_OF_SEGMENT ;
  2163.  
  2164.    procedure HARDCOPY ( COPY_CODE : in HARDCOPY_CODE ) is
  2165.       -- Causes an attached hardcopy unit to make a copy of the terminal's
  2166.       -- screen or dialog area.
  2167.  
  2168.       CMD_STRING : STRING(1..6);
  2169.    begin
  2170.  
  2171.       CMD_STRING(1..3) := ESC & "KH";
  2172.       CMD_STRING(4..6) := HOST_INTEGERS(
  2173.                           HARDCOPY_CODE'POS( COPY_CODE ) );
  2174.       SEND_TO_4107( CMD_STRING );
  2175.    end HARDCOPY ;
  2176.  
  2177.    procedure LOCK_VIEWING_KEYS ( LOCK_KEYS : in LOCKING_MODE ) is
  2178.       -- Locks and unlocks the zoom and pan modes.
  2179.  
  2180.       CMD_STRING : STRING(1..4);
  2181.    begin
  2182.  
  2183.       CMD_STRING(1..3) := ESC & "RJ";
  2184.       CMD_STRING(4)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2185.                           LOCKING_MODE'POS( LOCK_KEYS) );
  2186.       SEND_TO_4107( CMD_STRING );
  2187.    end LOCK_VIEWING_KEYS ;
  2188.  
  2189.    procedure MOVE ( POSITION : in TERMINAL_POINT ) is
  2190.       -- Set the current graphics position without drawing a vector.
  2191.  
  2192.       CMD_STRING : STRING(1..8);
  2193.    begin
  2194.  
  2195.       CMD_STRING(1..3) := ESC & "LF";
  2196.       CMD_STRING(4..8) := HOST_XY( POSITION );
  2197.       SEND_TO_4107( CMD_STRING );
  2198.    end MOVE ;
  2199.  
  2200.    procedure PAGE is
  2201.       -- Erase the screen except the dialog area.
  2202.  
  2203.       CMD_STRING : constant STRING(1..2) := ESC & FF;
  2204.    begin
  2205.  
  2206.       SEND_TO_4107( CMD_STRING );
  2207.    end PAGE ;
  2208.  
  2209.    procedure RENAME_SEGMENT ( OLD_SEGMENT : in SEGMENT_IDENTIFIER ;
  2210.                               NEW_SEGMENT : in SEGMENT_IDENTIFIER ) is
  2211.       -- Rename an existing segment.
  2212.  
  2213.       CMD_STRING : STRING(1..9);
  2214.    begin
  2215.  
  2216.       CMD_STRING(1..3) := ESC & "SR";
  2217.       CMD_STRING(4..6) := HOST_INTEGERS( OLD_SEGMENT );
  2218.       CMD_STRING(7..9) := HOST_INTEGERS( NEW_SEGMENT );
  2219.       SEND_TO_4107( CMD_STRING );
  2220.    end RENAME_SEGMENT ;
  2221.  
  2222.    procedure RENEW_VIEW ( VIEW : in VIEW_NUMBER ) is
  2223.       -- Erase the specified view and redraw all segments visible
  2224.       -- in that view.
  2225.  
  2226.       CMD_STRING : STRING(1..6);
  2227.    begin
  2228.  
  2229.       CMD_STRING(1..3) := ESC & "KN";
  2230.       CMD_STRING(4..6) := HOST_INTEGERS( VIEW );
  2231.       SEND_TO_4107( CMD_STRING );
  2232.    end RENEW_VIEW ;
  2233.  
  2234.    procedure REPORT_ERRORS is
  2235.       -- Cause the terminal to send an error report to the host.
  2236.  
  2237.       CMD_STRING : constant STRING(1..3) := ESC & "KQ";
  2238.    begin
  2239.  
  2240.       SEND_TO_4107( CMD_STRING );
  2241.    end REPORT_ERRORS ;
  2242.  
  2243.    procedure RESET is
  2244.       -- Returns the terminal to its power_up condition.
  2245.  
  2246.       CMD_STRING : constant STRING(1..3) := ESC & "KV";
  2247.    begin
  2248.  
  2249.       SEND_TO_4107( CMD_STRING );
  2250.    end RESET ;
  2251.  
  2252.    procedure SELECT_CODE ( MODE : in TERMINAL_MODE ) is
  2253.       -- Cause the terminal to recognize Ansi, Tek, or VT52 mode
  2254.       -- command syntax.
  2255.  
  2256.       CMD_STRING : STRING(1..6);
  2257.    begin
  2258.  
  2259.       CMD_STRING(1..3) := ESC & "%!";
  2260.       CMD_STRING(4..6) := HOST_INTEGERS( TERMINAL_MODE'POS( MODE ) );
  2261.       SEND_TO_4107( CMD_STRING );
  2262.    end SELECT_CODE ;
  2263.  
  2264.    procedure SELECT_FILL_PATTERN ( 
  2265.                 FILL_PATTERN : in FILL_PATTERN_NUMBER ) is
  2266.       -- Specifies the fill pattern for subsequent panels.
  2267.  
  2268.       CMD_STRING : STRING(1..6);
  2269.    begin
  2270.  
  2271.       CMD_STRING(1..3) := ESC & "MP";
  2272.       CMD_STRING(4..6) := HOST_INTEGERS( FILL_PATTERN );
  2273.       SEND_TO_4107( CMD_STRING );
  2274.    end SELECT_FILL_PATTERN ;
  2275.  
  2276.    procedure SELECT_HARDCOPY_INTERFACE ( COPIER : in COPIER_TYPE ) is
  2277.       -- Select the copies type to be used in the HARDCOPY command.
  2278.  
  2279.       CMD_STRING : STRING(1..6);
  2280.    begin
  2281.  
  2282.       CMD_STRING(1..3) := ESC & "QD";
  2283.       CMD_STRING(4..6) := HOST_INTEGERS(
  2284.                           COPIER_TYPE'POS( COPIER ) );
  2285.       SEND_TO_4107( CMD_STRING );
  2286.    end SELECT_HARDCOPY_INTERFACE ;
  2287.  
  2288.    procedure SELECT_VIEW ( VIEW : in VIEW_NUMBER ) is
  2289.       -- Specifies which view is the current view.
  2290.  
  2291.       CMD_STRING : STRING(1..6);
  2292.    begin
  2293.  
  2294.       CMD_STRING(1..3) := ESC & "RC";
  2295.       CMD_STRING(4..6) := HOST_INTEGERS( VIEW );
  2296.       SEND_TO_4107( CMD_STRING );
  2297.    end SELECT_VIEW ;
  2298.  
  2299.    procedure SET_ALPHA_CURSOR_INDICES (
  2300.                  FIRST_COLOR  : in COLOR_INDEX ;
  2301.                  SECOND_COLOR : in COLOR_INDEX ) is
  2302.       -- Assigns specified color indices to the alpha cursor.
  2303.  
  2304.       CMD_STRING : STRING(1..9);
  2305.    begin
  2306.  
  2307.       CMD_STRING(1..3)   := ESC & "TD";
  2308.       CMD_STRING(4..6)   := HOST_INTEGERS( FIRST_COLOR );
  2309.       CMD_STRING(7..9)   := HOST_INTEGERS( SECOND_COLOR );
  2310.  
  2311.       SEND_TO_4107( CMD_STRING );
  2312.    end SET_ALPHA_CURSOR_INDICES ;
  2313.  
  2314.    procedure SET_BACKGROUND_COLOR (
  2315.                  FIRST_COLOR  : in COLOR_INDEX ;
  2316.                  SECOND_COLOR : in COLOR_INDEX ;
  2317.                  THIRD_COLOR  : in COLOR_INDEX ) is
  2318.       -- Sets the color of the background surface which is behind all
  2319.       -- of the transparent writing surfaces.
  2320.  
  2321.       CMD_STRING : STRING(1..12);
  2322.    begin
  2323.  
  2324.       CMD_STRING(1..3)   := ESC & "TB";
  2325.       CMD_STRING(4..6)   := HOST_INTEGERS( FIRST_COLOR );
  2326.       CMD_STRING(7..9)   := HOST_INTEGERS( SECOND_COLOR );
  2327.       CMD_STRING(10..12) := HOST_INTEGERS( THIRD_COLOR );
  2328.  
  2329.       SEND_TO_4107( CMD_STRING );
  2330.    end SET_BACKGROUND_COLOR ;
  2331.  
  2332.    procedure SET_BACKGROUND_INDICES (
  2333.                  TEXT_BACKGROUND_INDEX : in COLOR_INDEX ;
  2334.                  DASH_GAP_INDEX        : in COLOR_INDEX ) is
  2335.       -- Specifies the color index for the character backgrounds of
  2336.       -- string precision graphtext; also specifies the color index
  2337.       -- used for the gaps in dashed lines.
  2338.  
  2339.       CMD_STRING : STRING(1..9);
  2340.    begin
  2341.  
  2342.       CMD_STRING(1..3)   := ESC & "MB";
  2343.       CMD_STRING(4..6)   := HOST_INTEGERS( TEXT_BACKGROUND_INDEX );
  2344.       CMD_STRING(7..9)   := HOST_INTEGERS( DASH_GAP_INDEX );
  2345.  
  2346.       SEND_TO_4107( CMD_STRING );
  2347.    end SET_BACKGROUND_INDICES ;
  2348.  
  2349.    procedure SET_BORDER_VISIBILITY (
  2350.                  BORDER_VISIBLE : in VISIBILITY_MODE ) is
  2351.       -- Controls the visibility of a border drawn around the current
  2352.       -- view's viewport.
  2353.  
  2354.       CMD_STRING : STRING(1..6);
  2355.    begin
  2356.  
  2357.       CMD_STRING(1..3) := ESC & "RE";
  2358.       CMD_STRING(4..6) := HOST_INTEGERS(
  2359.                           VISIBILITY_MODE'POS( BORDER_VISIBLE ));
  2360.       SEND_TO_4107( CMD_STRING );
  2361.    end SET_BORDER_VISIBILITY ;
  2362.  
  2363.    procedure SET_CHARACTER_PATH ( PATH : in CHARACTER_DIRECTION ) is
  2364.       -- Specifies the direction to move after writing each
  2365.       -- graphtext character.
  2366.  
  2367.       CMD_STRING : STRING(1..6);
  2368.    begin
  2369.  
  2370.       CMD_STRING(1..3) := ESC & "MN";
  2371.       CMD_STRING(4..6) := HOST_INTEGERS(
  2372.                           CHARACTER_DIRECTION'POS( PATH ) );
  2373.       SEND_TO_4107( CMD_STRING );
  2374.    end SET_CHARACTER_PATH ;
  2375.  
  2376.    procedure SET_COLOR_MODE ( COLOR_SYSTEM  : in COLOR_COORDINATE_SYSTEM ;
  2377.                               COLOR_OVERLAY : in COLOR_OVERLAY_TYPE ;
  2378.                               COLOR_OR_GRAY : in COLOR_OPERATION_MODE ) is
  2379.       -- Set the color mode for the terminal.
  2380.  
  2381.       CMD_STRING : STRING(1..12);
  2382.    begin
  2383.  
  2384.       CMD_STRING(1..3) := ESC & "TM";
  2385.       CMD_STRING(4..6) := HOST_INTEGERS(
  2386.                           COLOR_COORDINATE_SYSTEM'POS( COLOR_SYSTEM ) );
  2387.       CMD_STRING(7..9) := HOST_INTEGERS(
  2388.                           COLOR_OVERLAY_TYPE'POS( COLOR_OVERLAY ) );
  2389.       CMD_STRING(10..12) := HOST_INTEGERS(
  2390.                           COLOR_OPERATION_MODE'POS( COLOR_OR_GRAY ) );
  2391.       SEND_TO_4107( CMD_STRING );
  2392.    end SET_COLOR_MODE ;
  2393.  
  2394.    procedure SET_COPY_SIZE ( IMAGE : in IMAGE_SIZE ) is
  2395.       -- Selects the copy size to produce a standard or reduced image.
  2396.  
  2397.       CMD_STRING : STRING(1..6);
  2398.    begin
  2399.  
  2400.       CMD_STRING(1..3) := ESC & "QA";
  2401.       CMD_STRING(4..6) := HOST_INTEGERS( IMAGE_SIZE'POS( IMAGE ) );
  2402.       SEND_TO_4107( CMD_STRING );
  2403.    end SET_COPY_SIZE ;
  2404.  
  2405.    procedure SET_DIALOG_AREA_BUFFER_SIZE ( LINES : in DIALOG_LINES ) is
  2406.       -- Specify the maximum number of lines of text stored in the
  2407.       -- dialog area buffer.
  2408.  
  2409.       CMD_STRING : STRING(1..6);
  2410.    begin
  2411.  
  2412.       CMD_STRING(1..3) := ESC & "LB";
  2413.       CMD_STRING(4..6) := HOST_INTEGERS( LINES );
  2414.       SEND_TO_4107( CMD_STRING );
  2415.    end SET_DIALOG_AREA_BUFFER_SIZE ;
  2416.  
  2417.  
  2418.    procedure SET_DIALOG_AREA_COLOR_MAP (
  2419.                  COLOR_TO_UPDATE  : in COLOR_INDEX      ;
  2420.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  2421.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  2422.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) is
  2423.       -- Specify the color assigned to a color index in the dialog area.
  2424.  
  2425.       CMD_STRING : STRING(1..18);
  2426.    begin
  2427.  
  2428.       CMD_STRING(1..3)   := ESC & "TF";
  2429.       CMD_STRING(4..6)   := HOST_INTEGERS( 4 );
  2430.       CMD_STRING(7..9)   := HOST_INTEGERS( COLOR_TO_UPDATE );
  2431.       CMD_STRING(10..12) := HOST_INTEGERS( RED_PERCENTAGE );
  2432.       CMD_STRING(13..15) := HOST_INTEGERS( GREEN_PERCENTAGE );
  2433.       CMD_STRING(16..18) := HOST_INTEGERS( BLUE_PERCENTAGE );
  2434.  
  2435.       SEND_TO_4107( CMD_STRING );
  2436.    end SET_DIALOG_AREA_COLOR_MAP ;
  2437.  
  2438.    procedure SET_DIALOG_AREA_HARDCOPY_ATTRIBUTES (
  2439.                  PAGES        : in NUMBER_OF_PAGES ;
  2440.                  ORIGIN       : in PAGE_ORIGIN ;
  2441.                  FF_INTERPRET : in FORM_FEED_INTERPRETATION ) is
  2442.       -- Specifies the number of pages to be copied, the starting
  2443.       -- page, and how the form feed is interpreted.
  2444.  
  2445.       CMD_STRING : STRING(1..12);
  2446.    begin
  2447.  
  2448.       CMD_STRING(1..3) := ESC & "QL";
  2449.       CMD_STRING(4..6) := HOST_INTEGERS( PAGES ) ;
  2450.       CMD_STRING(7..9) := HOST_INTEGERS( PAGE_ORIGIN'POS( ORIGIN ) );
  2451.       CMD_STRING(10..12) := HOST_INTEGERS(
  2452.                             FORM_FEED_INTERPRETATION'POS( FF_INTERPRET ) );
  2453.       SEND_TO_4107( CMD_STRING );
  2454.    end SET_DIALOG_AREA_HARDCOPY_ATTRIBUTES ;
  2455.  
  2456.    procedure SET_DIALOG_AREA_INDEX (
  2457.                  CHAR_INDEX              : in COLOR_INDEX ;
  2458.                  CHAR_BACKGROUND_INDEX   : in COLOR_INDEX ;
  2459.                  DIALOG_BACKGROUND_INDEX : in COLOR_INDEX ) is
  2460.       -- Specify the color index for alphatext characters, character-cell
  2461.       -- background, and dialog area background.
  2462.  
  2463.       CMD_STRING : STRING(1..12);
  2464.    begin
  2465.  
  2466.       CMD_STRING(1..3)   := ESC & "LI";
  2467.       CMD_STRING(4..6)   := HOST_INTEGERS( CHAR_INDEX );
  2468.       CMD_STRING(7..9)   := HOST_INTEGERS( CHAR_BACKGROUND_INDEX );
  2469.       CMD_STRING(10..12) := HOST_INTEGERS( DIALOG_BACKGROUND_INDEX );
  2470.                                                          
  2471.       SEND_TO_4107( CMD_STRING );
  2472.    end SET_DIALOG_AREA_INDEX ;
  2473.  
  2474.    procedure SET_DIALOG_AREA_LINES ( LINES : in DIALOG_LINES ) is
  2475.       -- Specify the maximum number of lines visible in the dialog area.
  2476.  
  2477.       CMD_STRING : STRING(1..6);
  2478.    begin
  2479.  
  2480.       CMD_STRING(1..3) := ESC & "LL";
  2481.       CMD_STRING(4..6) := HOST_INTEGERS( LINES );
  2482.       SEND_TO_4107( CMD_STRING );
  2483.    end SET_DIALOG_AREA_LINES ;
  2484.  
  2485.    procedure SET_DIALOG_AREA_VISIBILITY (
  2486.                 AREA_VISIBLE : in VISIBILITY_MODE ) is
  2487.       -- Specifies whether the dialog area is visible or invisible.
  2488.  
  2489.       CMD_STRING : STRING(1..6);
  2490.    begin
  2491.  
  2492.       CMD_STRING(1..3) := ESC & "LV";
  2493.       CMD_STRING(4..6) := HOST_INTEGERS(
  2494.                           VISIBILITY_MODE'POS( AREA_VISIBLE ) );
  2495.       SEND_TO_4107( CMD_STRING );
  2496.    end SET_DIALOG_AREA_VISIBILITY ;
  2497.  
  2498.    procedure SET_EOM_CHARACTERS ( FIRST_EOM  : in CHARACTER ;
  2499.                                   SECOND_EOM : in CHARACTER ) is
  2500.       -- Specifies the characters used to terminate messages.
  2501.  
  2502.       CMD_STRING : STRING(1..9);
  2503.    begin
  2504.  
  2505.       CMD_STRING(1..3) := ESC & "NC";
  2506.       CMD_STRING(4..6) := HOST_INTEGERS( CHARACTER'POS( FIRST_EOM ) );
  2507.       CMD_STRING(7..9) := HOST_INTEGERS( CHARACTER'POS( SECOND_EOM ) );
  2508.       SEND_TO_4107( CMD_STRING );
  2509.    end SET_EOM_CHARACTERS ;
  2510.  
  2511.    procedure SET_ERROR_THRESHOLD (
  2512.                  ERROR_DISPLAY : in ERROR_DISPLAY_LEVEL ) is
  2513.       -- Specifies the levels of error messages the terminal displays
  2514.  
  2515.       CMD_STRING : STRING(1..6);
  2516.    begin
  2517.  
  2518.       CMD_STRING(1..3) := ESC & "KT";
  2519.       CMD_STRING(4..6) := HOST_INTEGERS(
  2520.                           ERROR_DISPLAY_LEVEL'POS( ERROR_DISPLAY ) );
  2521.                                                          
  2522.       SEND_TO_4107( CMD_STRING );
  2523.    end SET_ERROR_THRESHOLD ;
  2524.  
  2525.  
  2526.    procedure SET_GIN_CURSOR_COLOR (
  2527.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  2528.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  2529.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) is
  2530.       -- Specifies the color mixture for the graphics crosshair cursor.
  2531.  
  2532.       CMD_STRING : STRING(1..12);
  2533.    begin
  2534.  
  2535.       CMD_STRING(1..3)   := ESC & "TC";
  2536.       CMD_STRING(4..6)   := HOST_INTEGERS( RED_PERCENTAGE );
  2537.       CMD_STRING(7..9)   := HOST_INTEGERS( GREEN_PERCENTAGE );
  2538.       CMD_STRING(10..12) := HOST_INTEGERS( BLUE_PERCENTAGE );
  2539.  
  2540.       SEND_TO_4107( CMD_STRING );
  2541.    end SET_GIN_CURSOR_COLOR ;
  2542.  
  2543.    procedure SET_GIN_DISPLAY_START_POINT ( 
  2544.                             DEVICE       : in DEVICE_CODE ;
  2545.                             GIN_FUNCTION : in FUNCTION_CODE ;
  2546.                             START_POINT  : in TERMINAL_POINT ) is
  2547.       -- Specifies an initial point for GIN inking or GIN rubberbanding.
  2548.  
  2549.       CMD_STRING : STRING(1..11);
  2550.    begin
  2551.  
  2552.       CMD_STRING(1..3) := ESC & "IX";
  2553.       CMD_STRING(4..6) := HOST_INTEGERS(
  2554.                           FUNCTION_CODE'POS( GIN_FUNCTION ) );
  2555.       CMD_STRING(7..11) := HOST_XY( START_POINT );
  2556.                                                          
  2557.       SEND_TO_4107( CMD_STRING );
  2558.    end SET_GIN_DISPLAY_START_POINT ;
  2559.  
  2560.    procedure SET_GIN_RUBBERBANDING (
  2561.                 DEVICE        : in DEVICE_CODE ;
  2562.                 GIN_FUNCTION  : in FUNCTION_CODE ;
  2563.                 RUBBERBANDING : in RUBBERBANDING_MODE ) is
  2564.       -- Turns rubberbanding on or off for all subsequent operations of
  2565.       -- the specified Locator function.
  2566.  
  2567.       CMD_STRING : STRING(1..9);
  2568.    begin
  2569.  
  2570.       CMD_STRING(1..3) := ESC & "IX";
  2571.       CMD_STRING(4..6) := HOST_INTEGERS(
  2572.                           FUNCTION_CODE'POS( GIN_FUNCTION ) );
  2573.       CMD_STRING(7..9) := HOST_INTEGERS(
  2574.                           RUBBERBANDING_MODE'POS( RUBBERBANDING ) );
  2575.                                                          
  2576.       SEND_TO_4107( CMD_STRING );
  2577.    end SET_GIN_RUBBERBANDING ;
  2578.  
  2579.    procedure SET_GRAPHTEXT_PRECISION (
  2580.                 PRECISION : in GRAPHTEXT_PRECISION ) is
  2581.       -- Selects string-precision or stroke-precision to draw graphtext
  2582.       -- characters.
  2583.  
  2584.       CMD_STRING : STRING(1..6);
  2585.    begin
  2586.  
  2587.       CMD_STRING(1..3) := ESC & "MQ";
  2588.       CMD_STRING(4..6) := HOST_INTEGERS(
  2589.                           GRAPHTEXT_PRECISION'POS( PRECISION ) );
  2590.                                                          
  2591.       SEND_TO_4107( CMD_STRING );
  2592.    end SET_GRAPHTEXT_PRECISION ;
  2593.  
  2594.    procedure SET_GRAPHTEXT_SIZE (
  2595.                  WIDTH   : in TERMINAL_COORDINATE ;
  2596.                  HEIGHT  : in TERMINAL_COORDINATE ;
  2597.                  SPACING : in TERMINAL_COORDINATE ) is
  2598.       -- Set the size of graphics text.
  2599.  
  2600.       CMD_STRING : STRING(1..12);
  2601.    begin
  2602.  
  2603.       CMD_STRING(1..3)   := ESC & "MC";
  2604.       CMD_STRING(4..6)   := HOST_INTEGERS( WIDTH ) ;
  2605.       CMD_STRING(7..9)   := HOST_INTEGERS( HEIGHT ) ;
  2606.       CMD_STRING(10..12) := HOST_INTEGERS( SPACING ) ;
  2607.                                                          
  2608.       SEND_TO_4107( CMD_STRING );
  2609.    end SET_GRAPHTEXT_SIZE ;
  2610.  
  2611.    procedure SET_LINE_INDEX ( LINE_INDEX : in COLOR_INDEX ) is
  2612.       -- Specify the color index for all subsequent lines,
  2613.       -- panel boundaries, and markers.
  2614.  
  2615.       CMD_STRING : STRING(1..6);
  2616.    begin
  2617.  
  2618.       CMD_STRING(1..3) := ESC & "ML";
  2619.       CMD_STRING(4..6) := HOST_INTEGERS( LINE_INDEX );
  2620.                                                          
  2621.       SEND_TO_4107( CMD_STRING );
  2622.    end SET_LINE_INDEX ;
  2623.  
  2624.    procedure SET_LINE_STYLE ( LINE : in LINE_STYLE ) is
  2625.       -- Specify the line style for subsequent lines and panel boundaries.
  2626.  
  2627.       CMD_STRING : STRING(1..6);
  2628.    begin
  2629.  
  2630.       CMD_STRING(1..3) := ESC & "MV";
  2631.       CMD_STRING(4..6) := HOST_INTEGERS(
  2632.                           LINE_STYLE'POS( LINE ) );
  2633.                                                          
  2634.       SEND_TO_4107( CMD_STRING );
  2635.    end SET_LINE_STYLE ;
  2636.  
  2637.    procedure SET_MARKER_TYPE ( MARKER : in MARKER_NUMBER ) is
  2638.       -- Specify the marker style.
  2639.  
  2640.       CMD_STRING : STRING(1..6);
  2641.    begin
  2642.  
  2643.       CMD_STRING(1..3) := ESC & "MM";
  2644.       CMD_STRING(4..6) := HOST_INTEGERS(
  2645.                           MARKER_NUMBER'POS( MARKER ) );
  2646.                                                          
  2647.       SEND_TO_4107( CMD_STRING );
  2648.    end SET_MARKER_TYPE ;
  2649.  
  2650.    procedure SET_PICK_APERTURE (
  2651.                  APERTURE_WIDTH : in TERMINAL_COORDINATE ) is
  2652.       -- Sets the size of the GIN cursor aperture used to pick segments.
  2653.  
  2654.       CMD_STRING : STRING(1..6);
  2655.    begin
  2656.  
  2657.       CMD_STRING(1..3) := ESC & "IA";
  2658.       CMD_STRING(4..6) := HOST_INTEGERS( APERTURE_WIDTH );
  2659.                                                          
  2660.       SEND_TO_4107( CMD_STRING );
  2661.    end SET_PICK_APERTURE ;
  2662.  
  2663.    procedure SET_PICK_ID ( PICK_ID : in PICK_ID_IDENTIFIER ) is
  2664.       -- Mark the next xy location added to the currently open segment
  2665.       -- as a pick point and assign the specified identification number.
  2666.  
  2667.       CMD_STRING : STRING(1..6);
  2668.    begin
  2669.  
  2670.       CMD_STRING(1..3) := ESC & "MI";
  2671.       CMD_STRING(4..6) := HOST_INTEGERS( PICK_ID );
  2672.                                                          
  2673.       SEND_TO_4107( CMD_STRING );
  2674.    end SET_PICK_ID ;
  2675.  
  2676.    procedure SET_PIVOT_POINT ( PIVOT_POINT : in TERMINAL_POINT ) is
  2677.       -- Specify the pivot point for subsequent segment definitions.
  2678.  
  2679.       CMD_STRING : STRING(1..8);
  2680.    begin
  2681.  
  2682.       CMD_STRING(1..3) := ESC & "SP";
  2683.       CMD_STRING(4..8) := HOST_XY( PIVOT_POINT );
  2684.                                                          
  2685.       SEND_TO_4107( CMD_STRING );
  2686.    end SET_PIVOT_POINT ;
  2687.  
  2688.    procedure SET_QUEUE_SIZE (
  2689.                 QUEUE_SIZE : in INPUT_QUEUE_SIZE ) is
  2690.       -- Specifies the size in bytes of the terminal's input queue
  2691.       -- for RS-232 communications.
  2692.  
  2693.       CMD_STRING : STRING(1..6);
  2694.    begin
  2695.  
  2696.       CMD_STRING(1..3) := ESC & "NQ";
  2697.       CMD_STRING(4..6) := HOST_INTEGERS( QUEUE_SIZE ) ;
  2698.       SEND_TO_4107( CMD_STRING );
  2699.    end SET_QUEUE_SIZE ;
  2700.  
  2701.    procedure SET_REPORT_EOM_FREQUENCY (
  2702.                 FREQUENCY : in EOM_FREQUENCY ) is
  2703.       -- Specifies how often the terminal sends an EOL string to
  2704.       -- the host
  2705.  
  2706.       CMD_STRING : STRING(1..6);
  2707.    begin
  2708.  
  2709.       CMD_STRING(1..3) := ESC & "IM";
  2710.       CMD_STRING(4..6) := HOST_INTEGERS(
  2711.                           EOM_FREQUENCY'POS( FREQUENCY ) );
  2712.       SEND_TO_4107( CMD_STRING );
  2713.    end SET_REPORT_EOM_FREQUENCY ;
  2714.  
  2715.    procedure SET_REPORT_SIG_CHARACTER (
  2716.                             REPORT_TYPE   : in FUNCTION_CODE ;
  2717.                             SIG_CHAR      : in CHARACTER ;
  2718.                             TERM_SIG_CHAR : in CHARACTER ) is
  2719.       -- Assign the signature characters used within report messages
  2720.       -- that the terminal sends to the host.
  2721.  
  2722.       CMD_STRING : STRING(1..10);
  2723.    begin
  2724.  
  2725.       CMD_STRING(1..3)  := ESC & "IS";
  2726.       CMD_STRING(4)     := CHARACTER'val( HOST_SYNTAX_ZERO +
  2727.                            FUNCTION_CODE'pos( REPORT_TYPE ) );
  2728.       CMD_STRING(5..7)  := HOST_INTEGERS(
  2729.                            CHARACTER'pos( SIG_CHAR ) );
  2730.       CMD_STRING(8..10) := HOST_INTEGERS(
  2731.                            CHARACTER'pos( TERM_SIG_CHAR ) );
  2732.  
  2733.       SEND_TO_4107( CMD_STRING );
  2734.    end SET_REPORT_SIG_CHARACTER ;
  2735.  
  2736.    procedure SET_SEGMENT_DETECTABILITY ( SEGMENT    : in SEGMENT_IDENTIFIER ;
  2737.                                          DETECTABLE : in DETECTABILITY ) is
  2738.       -- Set the detectability of a segment.
  2739.  
  2740.       CMD_STRING : STRING(1..7);
  2741.  
  2742.    begin
  2743.  
  2744.       CMD_STRING(1..3) := ESC & "SD";
  2745.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT );
  2746.       CMD_STRING(7)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2747.                           DETECTABILITY'POS( DETECTABLE ) );
  2748.                                                          
  2749.       SEND_TO_4107( CMD_STRING );
  2750.    end SET_SEGMENT_DETECTABILITY ;
  2751.  
  2752.    procedure SET_SEGMENT_DISPLAY_PRIORITY ( SEGMENT  : in SEGMENT_IDENTIFIER ;
  2753.                                             PRIORITY : in PRIORITY_NUMBER ) is
  2754.       -- Set the display priority of the specified segment.
  2755.  
  2756.       CMD_STRING : STRING(1..9);
  2757.    begin
  2758.  
  2759.       CMD_STRING(1..3) := ESC & "SS";
  2760.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT );
  2761.       CMD_STRING(7..9) := HOST_INTEGERS( PRIORITY );
  2762.                                                          
  2763.       SEND_TO_4107( CMD_STRING );
  2764.    end SET_SEGMENT_DISPLAY_PRIORITY ;
  2765.  
  2766.    procedure SET_SEGMENT_HIGHLIGHTING ( SEGMENT   : in SEGMENT_IDENTIFIER ;
  2767.                                         HIGHLIGHT : in HIGHLIGHTING ) is
  2768.       -- Turn highlighting on or off for the specified segment.
  2769.  
  2770.       CMD_STRING : STRING(1..7);
  2771.    begin
  2772.  
  2773.       CMD_STRING(1..3) := ESC & "SH";
  2774.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT );
  2775.       CMD_STRING(7)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2776.                           HIGHLIGHTING'POS( HIGHLIGHT ) );
  2777.                                                          
  2778.       SEND_TO_4107( CMD_STRING );
  2779.    end SET_SEGMENT_HIGHLIGHTING ;
  2780.  
  2781.    procedure SET_SEGMENT_POSITION ( SEGMENT  : in SEGMENT_IDENTIFIER ;
  2782.                                     POSITION : in TERMINAL_POINT ) is
  2783.       -- Move the segment pivot point to the specified position.
  2784.  
  2785.       CMD_STRING : STRING(1..11);
  2786.    begin
  2787.  
  2788.       CMD_STRING(1..3) := ESC & "SX";
  2789.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT );
  2790.       CMD_STRING(7..11) := HOST_XY( POSITION );
  2791.                                                          
  2792.       SEND_TO_4107( CMD_STRING );
  2793.    end SET_SEGMENT_POSITION ;
  2794.  
  2795.    procedure SET_SEGMENT_VISIBILITY ( SEGMENT    : in SEGMENT_IDENTIFIER ;
  2796.                                       VISIBILITY : in VISIBILITY_MODE ) is
  2797.       -- Set the specified segment visible or invisible.
  2798.  
  2799.       CMD_STRING : STRING(1..7);
  2800.    begin
  2801.  
  2802.       CMD_STRING(1..3) := ESC & "SV";
  2803.       CMD_STRING(4..6) := HOST_INTEGERS( SEGMENT );
  2804.       CMD_STRING(7)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2805.                           VISIBILITY_MODE'POS( VISIBILITY ) );
  2806.                                                          
  2807.       SEND_TO_4107( CMD_STRING );
  2808.    end SET_SEGMENT_VISIBILITY ;
  2809.  
  2810.    procedure SET_SNOOPY_MODE ( SNOOPY : in SNOOPY_MODE ) is
  2811.       -- Specifies whether or not the terminal is in snoopy mode.
  2812.  
  2813.       CMD_STRING : STRING(1..4);
  2814.    begin
  2815.  
  2816.       CMD_STRING(1..3) := ESC & "KS";
  2817.       CMD_STRING(4)    := CHARACTER'val( HOST_SYNTAX_ZERO +
  2818.                           SNOOPY_MODE'POS( SNOOPY ) );
  2819.                                                          
  2820.       SEND_TO_4107( CMD_STRING );
  2821.    end SET_SNOOPY_MODE ;
  2822.  
  2823.    procedure SET_SURFACE_COLOR_MAP (
  2824.                  SURFACE          : in SURFACE_NUMBER   ;
  2825.                  COLOR_TO_UPDATE  : in COLOR_INDEX      ;
  2826.                  RED_PERCENTAGE   : in COLOR_COORDINATE ;
  2827.                  GREEN_PERCENTAGE : in COLOR_COORDINATE ;
  2828.                  BLUE_PERCENTAGE  : in COLOR_COORDINATE ) is
  2829.       -- Sets the color map for the graphics region
  2830.  
  2831.       CMD_STRING : STRING(1..21);
  2832.    begin
  2833.  
  2834.       CMD_STRING(1..3)   := ESC & "TG";
  2835.       CMD_STRING(4..6)   := HOST_INTEGERS( SURFACE );
  2836.       CMD_STRING(7..9)   := HOST_INTEGERS( 4 );
  2837.       CMD_STRING(10..12) := HOST_INTEGERS( COLOR_TO_UPDATE );
  2838.       CMD_STRING(13..15) := HOST_INTEGERS( RED_PERCENTAGE );
  2839.       CMD_STRING(16..18) := HOST_INTEGERS( GREEN_PERCENTAGE );
  2840.       CMD_STRING(19..21) := HOST_INTEGERS( BLUE_PERCENTAGE );
  2841.  
  2842.       SEND_TO_4107( CMD_STRING );
  2843.    end SET_SURFACE_COLOR_MAP ;
  2844.  
  2845.    procedure SET_SURFACE_DEFINITIONS (
  2846.                  PLANES_IN_1 : in BIT_PLANES ;
  2847.                  PLANES_IN_2 : in BIT_PLANES ;
  2848.                  PLANES_IN_3 : in BIT_PLANES ;
  2849.                  PLANES_IN_4 : in BIT_PLANES ) is
  2850.       -- Erases the screen and sets the number of surfaces and the
  2851.       -- number of bit planes in each surface.
  2852.  
  2853.       CMD_STRING : STRING(1..18);
  2854.    begin
  2855.  
  2856.       CMD_STRING(1..3)   := ESC & "RD";
  2857.       CMD_STRING(4..6)   := HOST_INTEGERS( 4 );
  2858.       CMD_STRING(7..9)   := HOST_INTEGERS( PLANES_IN_1 );
  2859.       CMD_STRING(10..12) := HOST_INTEGERS( PLANES_IN_2 );
  2860.       CMD_STRING(13..15) := HOST_INTEGERS( PLANES_IN_3 );
  2861.       CMD_STRING(16..18) := HOST_INTEGERS( PLANES_IN_4 );
  2862.  
  2863.       SEND_TO_4107( CMD_STRING );
  2864.    end SET_SURFACE_DEFINITIONS ;
  2865.  
  2866.  
  2867.    procedure SET_SURFACE_PRIORITIES (
  2868.                  SURFACE_A  : in SURFACE_NUMBER ;
  2869.                  PRIORITY_A : in SURFACE_PRIORITY ;
  2870.                  SURFACE_B  : in SURFACE_NUMBER ;
  2871.                  PRIORITY_B : in SURFACE_PRIORITY ;
  2872.                  SURFACE_C  : in SURFACE_NUMBER ;
  2873.                  PRIORITY_C : in SURFACE_PRIORITY ;
  2874.                  SURFACE_D  : in SURFACE_NUMBER ;
  2875.                  PRIORITY_D : in SURFACE_PRIORITY ) is
  2876.       -- Sets the priority of the specified writing surface
  2877.  
  2878.       CMD_STRING : STRING(1..30);
  2879.    begin
  2880.  
  2881.       CMD_STRING(1..3)   := ESC & "RN";
  2882.       CMD_STRING(4..6)   := HOST_INTEGERS( 8 );
  2883.       CMD_STRING(7..9)   := HOST_INTEGERS( SURFACE_A );
  2884.       CMD_STRING(10..12) := HOST_INTEGERS( PRIORITY_A );
  2885.  
  2886.       CMD_STRING(13..15)   := HOST_INTEGERS( SURFACE_B );
  2887.       CMD_STRING(16..18) := HOST_INTEGERS( PRIORITY_B );
  2888.  
  2889.       CMD_STRING(19..21)   := HOST_INTEGERS( SURFACE_C );
  2890.       CMD_STRING(22..24) := HOST_INTEGERS( PRIORITY_C );
  2891.  
  2892.       CMD_STRING(25..27)   := HOST_INTEGERS( SURFACE_D );
  2893.       CMD_STRING(28..30) := HOST_INTEGERS( PRIORITY_D );
  2894.  
  2895.       SEND_TO_4107( CMD_STRING );
  2896.    end SET_SURFACE_PRIORITIES ;
  2897.  
  2898.    procedure SET_SURFACE_VISIBILITY (
  2899.                  SURFACE    : in SURFACE_NUMBER     ;
  2900.                  VISIBILITY : in SURFACE_VISIBILITY ) is
  2901.       -- Set the visibility of a surface without affecting the
  2902.       -- surface priority.
  2903.  
  2904.       CMD_STRING : STRING(1..10);
  2905.    begin
  2906.  
  2907.       CMD_STRING(1..3)   := ESC & "RI";
  2908.       CMD_STRING(4..6)   := HOST_INTEGERS( 2 );
  2909.       CMD_STRING(7..9)   := HOST_INTEGERS( SURFACE );
  2910.       CMD_STRING(10)     := CHARACTER'val( HOST_SYNTAX_ZERO +
  2911.                             SURFACE_VISIBILITY'POS( VISIBILITY ) );
  2912.  
  2913.       SEND_TO_4107( CMD_STRING );
  2914.    end SET_SURFACE_VISIBILITY ;
  2915.  
  2916.    procedure SET_TEXT_INDEX ( TEXT_INDEX : in COLOR_INDEX ) is
  2917.       -- Specify the color index for alphatext and graphtext in the
  2918.       -- graphics area.
  2919.  
  2920.       CMD_STRING : STRING(1..6);
  2921.    begin
  2922.  
  2923.       CMD_STRING(1..3) := ESC & "MT";
  2924.       CMD_STRING(4..6) := HOST_INTEGERS( TEXT_INDEX );
  2925.                                                          
  2926.       SEND_TO_4107( CMD_STRING );
  2927.    end SET_TEXT_INDEX ;
  2928.  
  2929.    procedure SET_VIEW_ATTRIBUTES ( 
  2930.                  SURFACE      : in SURFACE_NUMBER ;
  2931.                  WIPE_INDEX   : in COLOR_INDEX ;
  2932.                  BORDER_INDEX : in COLOR_INDEX ) is
  2933.       -- Sets the surface, wipe index, and border index for the
  2934.       -- current view.
  2935.  
  2936.       CMD_STRING : STRING(1..12);
  2937.    begin
  2938.  
  2939.       CMD_STRING(1..3)   := ESC & "RA";
  2940.       CMD_STRING(4..6)   := HOST_INTEGERS( SURFACE );
  2941.       CMD_STRING(7..9)   := HOST_INTEGERS( WIPE_INDEX );
  2942.       CMD_STRING(10..12) := HOST_INTEGERS( BORDER_INDEX );
  2943.                                                          
  2944.       SEND_TO_4107( CMD_STRING );
  2945.    end SET_VIEW_ATTRIBUTES ;
  2946.  
  2947.    procedure SET_VIEWPORT ( FIRST_CORNER  : in SCREEN_POINT ;
  2948.                             SECOND_CORNER : in SCREEN_POINT ) is
  2949.       -- Set the position of the current view's viewport in normalized
  2950.       -- screen coordinate space.
  2951.  
  2952.       CMD_STRING      : STRING(1..13);
  2953.       TERMINAL_CORNER : TERMINAL_POINT;
  2954.  
  2955.    begin
  2956.  
  2957.       CMD_STRING(1..3) := ESC & "RV";
  2958.  
  2959.       -- Perform explicit conversion of type SCREEN_POINT to
  2960.       -- type TERMINAL_POINT prior to calling the conversion routine.
  2961.       TERMINAL_CORNER.X := FIRST_CORNER.X;
  2962.       TERMINAL_CORNER.Y := TERMINAL_COORDINATE( FIRST_CORNER.Y );
  2963.       CMD_STRING(4..8)  := HOST_XY( TERMINAL_CORNER );
  2964.  
  2965.       TERMINAL_CORNER.X := SECOND_CORNER.X;
  2966.       TERMINAL_CORNER.Y := TERMINAL_COORDINATE( SECOND_CORNER.Y );
  2967.       CMD_STRING(9..13) := HOST_XY( TERMINAL_CORNER );
  2968.                                                          
  2969.       SEND_TO_4107( CMD_STRING );
  2970.    end SET_VIEWPORT ;
  2971.  
  2972.    procedure SET_WINDOW ( FIRST_CORNER  : in TERMINAL_POINT ;
  2973.                           SECOND_CORNER : in TERMINAL_POINT ) is
  2974.       -- Set the boundaries of the current view's window in
  2975.       -- terminal space.
  2976.  
  2977.       CMD_STRING : STRING(1..13);
  2978.    begin
  2979.  
  2980.       CMD_STRING(1..3) := ESC & "RW";
  2981.       CMD_STRING(4..8) := HOST_XY( FIRST_CORNER );
  2982.       CMD_STRING(9..13) := HOST_XY( SECOND_CORNER );
  2983.                                                          
  2984.       SEND_TO_4107( CMD_STRING );
  2985.    end SET_WINDOW ;
  2986.  
  2987. begin
  2988.  
  2989.    ESC(1) := STANDARD.ASCII.ESC;
  2990.    FF(1)  := STANDARD.ASCII.FF;
  2991.    FS(1)  := STANDARD.ASCII.FS;
  2992.    GS(1)  := STANDARD.ASCII.GS;
  2993.    US(1)  := STANDARD.ASCII.US;
  2994.    CN(1)  := STANDARD.ASCII.CAN;
  2995.  
  2996.    -- Increase the terminal input buffer size
  2997.    SELECT_CODE( TEK );
  2998.    SET_QUEUE_SIZE( 10000 ) ;
  2999.    --CANCEL;
  3000.    TERMINAL_INITIALIZATION ;
  3001.  
  3002.    -- Cause the terminal to recognize ANSI commands.
  3003.    SELECT_CODE( ANSI );
  3004.    
  3005. end TEKDRIVER ; 
  3006. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3007. --trace_pkg_spec.ada
  3008. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3009. -- version 85-07-24 16:00 by RAM
  3010.  
  3011. with TEXT_IO ;  use TEXT_IO ;
  3012.  
  3013. package TRACE_PKG is
  3014. ---------------------------------------------------------------------------
  3015. --
  3016. --  This package provides a procedure to write Trace messages to a
  3017. --  text output file.
  3018. --
  3019. ---------------------------------------------------------------------------
  3020.  
  3021.    procedure TRACE (MESSAGE: in STRING) ;
  3022.    ------------------------------------------------------------------------
  3023.    --  This procedure outputs the message to the trace file.
  3024.    ------------------------------------------------------------------------
  3025.  
  3026.    procedure CLOSE_TRACE_FILE ;
  3027.    ------------------------------------------------------------------------
  3028.    --  This procedure closes the trace file.
  3029.    ------------------------------------------------------------------------
  3030.  
  3031.    REQUEST_TRACE : Boolean ;
  3032.    ------------------------------------------------------------------------
  3033.    --  This is the globel flag to execute calls to trace, init in body.
  3034.    ------------------------------------------------------------------------
  3035.  
  3036. end TRACE_PKG ;
  3037. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3038. --trace_pkg_body.ada
  3039. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3040. -- version 85-11-26 10:15 by RAM
  3041.  
  3042. package body TRACE_PKG is
  3043.  
  3044.    TRACE_FILE_HANDLE : FILE_TYPE ;
  3045.  
  3046.    procedure TRACE (MESSAGE: in STRING) is
  3047.    ------------------------------------------------------------------------
  3048.    --  This procedure outputs the message to the trace file.
  3049.    ------------------------------------------------------------------------
  3050.    begin
  3051.       if not TEXT_IO.IS_OPEN( TRACE_FILE_HANDLE ) then
  3052.          --  Create the current trace file
  3053.          CREATE( TRACE_FILE_HANDLE , 
  3054.                  TEXT_IO.OUT_FILE , 
  3055.                  "CODE_TRACE_FILE.LISTING" );
  3056.       end if ;
  3057.  
  3058.       PUT_LINE (TRACE_FILE_HANDLE, MESSAGE) ;
  3059.    exception
  3060.       when others =>
  3061.          PUT_LINE (" error in TRACE_PKG") ;
  3062.    end TRACE ;
  3063.  
  3064.  
  3065.    procedure CLOSE_TRACE_FILE is
  3066.    ------------------------------------------------------------------------
  3067.    --  This procedure closes the trace file.
  3068.    ------------------------------------------------------------------------
  3069.    begin
  3070.       if TEXT_IO.IS_OPEN( TRACE_FILE_HANDLE ) then
  3071.          CLOSE (TRACE_FILE_HANDLE) ;
  3072.       end if ;
  3073.    end CLOSE_TRACE_FILE ;
  3074.  
  3075. begin
  3076.    -- initialize the value for request trace
  3077. ---   REQUEST_TRACE := True ;
  3078.    REQUEST_TRACE := False ;
  3079. end TRACE_PKG ;
  3080. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3081. --tree_data_spec.ada
  3082. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3083.    -- version 85-12-11 0840 by JL
  3084.  
  3085.    with GRAPHICS_DATA; use GRAPHICS_DATA;
  3086.  
  3087.    package TREE_DATA is
  3088.    -------------------------------------------------------------------------
  3089.    --
  3090.    -- This package provides the declarations and objects for the 
  3091.    -- Graph Tree which holds all the graphical, syntax, and
  3092.    -- semantic information required by the program.  The tree contains
  3093.    -- TREE, LIST and GRAPH nodes.  The TREE nodes represent Ada 
  3094.    -- entities (structures) and are connected in a hierarchal order (tree)
  3095.    -- indicating the scope of each entity.  The LIST nodes are used to
  3096.    -- store relationships (e.g., context clauses) and annotations (e.g.,
  3097.    -- exported type declarations).  The GRAPH nodes contain the graphical
  3098.    -- data associated with each TREE node.
  3099.    --
  3100.    -------------------------------------------------------------------------
  3101.    
  3102.       ----------------------------------------------------------------------   
  3103.       --  All of the Ada entities, one for each type of TREE node.
  3104.       ----------------------------------------------------------------------   
  3105.       type ENTITY_TYPE is (UNUSED,
  3106.                            ROOT,
  3107.                            TYPE_VIRTUAL_PACKAGE,
  3108.                            TYPE_PACKAGE,        
  3109.                            TYPE_PROCEDURE,      
  3110.                            TYPE_FUNCTION,       
  3111.                            TYPE_TASK,           
  3112.                            TYPE_ENTRY_POINT,
  3113.                            TYPE_BODY,
  3114.                            IMPORTED_VIRTUAL_PACKAGE,
  3115.                            IMPORTED_PACKAGE,
  3116.                            IMPORTED_PROCEDURE,
  3117.                            IMPORTED_FUNCTION,
  3118.                            EXPORTED_PROCEDURE,
  3119.                            EXPORTED_FUNCTION,
  3120.                            EXPORTED_ENTRY_POINT,
  3121.                            EXPORTED_TYPE,
  3122.                            EXPORTED_OBJECT,
  3123.                            EXPORTED_EXCEPTION,
  3124.                            CONNECTION_BY_CALL,
  3125.                            CONNECTION_FOR_DATA);
  3126.    
  3127.       ----------------------------------------------------------------------   
  3128.       --  ENTITY names
  3129.       ----------------------------------------------------------------------   
  3130.       MAXIMUM_NAME_LENGTH : constant POSITIVE := 80 ;
  3131.       subtype NAME_TYPE is STRING (1..MAXIMUM_NAME_LENGTH) ;
  3132.       NULL_NAME : constant NAME_TYPE := (others => ' ') ;
  3133.  
  3134.       ----------------------------------------------------------------------   
  3135.       --  GENERIC information
  3136.       ----------------------------------------------------------------------   
  3137.       type GENERIC_STATUS_TYPE is (NOT_GENERIC,
  3138.                                    GENERIC_DECLARATION,
  3139.                                    GENERIC_INSTANTIATION);
  3140.    
  3141.    
  3142.       ----------------------------------------------------------------------   
  3143.       --  TASK information
  3144.       ----------------------------------------------------------------------   
  3145.       type TASK_STATUS_TYPE is (NORMAL_TASK,
  3146.                                 TASK_TYPE_DECLARATION,
  3147.                                 TASK_TYPE_OBJECT);
  3148.    
  3149.    
  3150.       ----------------------------------------------------------------------   
  3151.       --  The ACCESS types
  3152.       ----------------------------------------------------------------------   
  3153.       -- The access type for GRAPH_NODEs, implemented as an
  3154.       -- index into GRAPH array.
  3155.       subtype GRAPH_NODE_ACCESS_TYPE is INTEGER; 
  3156.  
  3157.       -- The access type for LIST_NODEs, implemented as an
  3158.       -- index into LIST array.
  3159.       subtype LIST_NODE_ACCESS_TYPE is INTEGER;
  3160.  
  3161.       --  The access index of TREE_NODE_TYPEs.  A negative number
  3162.       --  will indicate a 'NULL' pointer.
  3163.       subtype TREE_NODE_ACCESS_TYPE is INTEGER;
  3164.    
  3165.       -- The access type for PROLOGUE_NODEs, implemented as an
  3166.       -- index into PROLOGUE array.
  3167.       subtype PROLOGUE_NODE_ACCESS_TYPE is INTEGER; 
  3168.  
  3169.       -- To be used to initialize the access values to indicate it
  3170.       -- is not currently pointing to anything.
  3171.       NULL_POINTER : INTEGER := -1;
  3172.    
  3173.       ----------------------------------------------------------------------   
  3174.       --  The graphical data for each tree node, stored in the 
  3175.       --  GRAPH_DATA_ARRAY.  A null OWNING_TREE_NODE indicates that
  3176.       --  the node is unused.
  3177.       ----------------------------------------------------------------------   
  3178.       type GRAPH_NODE_TYPE is
  3179.          record
  3180.             OWNING_TREE_NODE : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  3181.             DATA             : GRAPHICS_DATA.GRAPHICS_DATA_TYPE;
  3182.          end record;
  3183.    
  3184.       ----------------------------------------------------------------------   
  3185.       --  The PROLOGUE data for each tree node of type virtual package,
  3186.       --  package, procedure, function, and task.  A null OWNING_TREE_NODE 
  3187.       --  indicates that the node is unused.
  3188.       ----------------------------------------------------------------------   
  3189.       PROLOGUE_COUNT : constant NATURAL := 3 ;
  3190.       PROLOGUE_LINE_SIZE : constant NATURAL := 75 ;
  3191.       subtype PROLOGUE_LINE is STRING (1..PROLOGUE_LINE_SIZE) ; 
  3192.       type PROLOGUE_LINE_ARRAY is array (1..PROLOGUE_COUNT) of PROLOGUE_LINE ;
  3193.       type PROLOGUE_NODE_TYPE is 
  3194.          record
  3195.             OWNING_TREE_NODE : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  3196.             DATA             : PROLOGUE_LINE_ARRAY :=
  3197.                                    (others => (others => ' ')) ;
  3198.          end record;
  3199.    
  3200.    
  3201.       ----------------------------------------------------------------------   
  3202.       --  The LINE type is used to define connecting lines between
  3203.       --  graphic entities (Call, Export, and Ada 'Use' connections).
  3204.       --  A line is a series of points which define line segments
  3205.       --  comprising the connection line.
  3206.       ----------------------------------------------------------------------   
  3207.       MAXIMUM_NO_LINE_SEGMENTS : constant INTEGER := 20;
  3208.       subtype POINTS is GRAPH_NODE_ACCESS_TYPE;
  3209.       type LINE_TYPE is array (1..MAXIMUM_NO_LINE_SEGMENTS) of POINTS;
  3210.  
  3211.       NULL_LINE : constant LINE_TYPE := ( others => NULL_POINTER ) ;
  3212.  
  3213.  
  3214.       ----------------------------------------------------------------------   
  3215.       --  The various LISTS occuring in the tree are declared below.
  3216.       --  The list format to be used to create specific kinds of lists.
  3217.       --  A doubly linked list is required for forward and back tracing.
  3218.       ----------------------------------------------------------------------   
  3219.       --  The lists contained in a Tree Node.  The order of the Lists
  3220.       --  is the order of the List scan during a tree walk.
  3221.  
  3222.       type LIST_TYPE is (START,          -- for starting node list scans
  3223.                          CONTAINED_LIST,
  3224.                          CALLEE_LIST,
  3225.                          DATA_CONNECT_LIST,
  3226.                          ENTRY_LIST,
  3227.                          EXPORTED_LIST,
  3228.                          IMPORTED_LIST,
  3229.                          NULL_LIST);
  3230.  
  3231.       --  The list structures of the Tree are created from the list
  3232.       --  nodes declared below, which link Tree nodes.  Each List
  3233.       --  node is associated with a Tree node (ITEM), and hence a null
  3234.       --  ITEM indicates an unused node.
  3235.       type LIST_NODE_TYPE is
  3236.          record
  3237.             ITEM : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  3238.             PRIOR : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  3239.             NEXT : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  3240.             -- for use in Membership Lists
  3241.             REF_COUNT : NATURAL := 0;  -- count of refs by ITEM to List Owner
  3242.             MEMBER_OF : LIST_TYPE := NULL_LIST;  -- the refering list type
  3243.          end record;
  3244.    
  3245.       --  A list of all called entities and their connections.
  3246.       subtype CALLEE_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3247.       --  A list of all contained entities.
  3248.       subtype CONTAINED_ENTITY_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3249.       --  A list of all Data connections for an entity
  3250.       subtype DATA_CONNECT_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3251.       --  A list of all the entries for a task.
  3252.       subtype ENTRY_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3253.       --  A list of all exported entities.
  3254.       subtype EXPORTED_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3255.       --  A list of all imported entities.
  3256.       subtype IMPORTED_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3257.  
  3258.       ----------------------------------------------------------------------   
  3259.       --  The definition of the MEMBERSHIP list.
  3260.       ----------------------------------------------------------------------   
  3261.       -- The MEMBERSHIP list exists to maintain a back pointer for
  3262.       -- relations established by other lists.  The TREE_OPS package
  3263.       -- should be the only manipulator of this list.
  3264.       --
  3265.       -- The access type for the MEMBERSHIP list, is implemented as an
  3266.       -- index into LIST array.  This is done to minimize the number
  3267.       -- of node types to be handled.
  3268.  
  3269.       subtype MEMBERSHIP_LIST_TYPE is LIST_NODE_ACCESS_TYPE;
  3270.  
  3271.       ----------------------------------------------------------------------   
  3272.       --  The definition of the TREE node structure.  This data structure
  3273.       --  is combined using the LIST data structure to form a DIANA like
  3274.       --  syntax tree which stores the syntactical and semantic information
  3275.       --  concerning the Ada program which is represented by the OODD under
  3276.       --  construction.  A predefined Root Node is as the starting point
  3277.       --  of each Tree.
  3278.       ----------------------------------------------------------------------   
  3279.       type TREE_NODE_TYPE (NODE_TYPE: ENTITY_TYPE := UNUSED) is
  3280.          record
  3281.             NAME : NAME_TYPE := NULL_NAME;  -- the name of this node
  3282.             PARENT : TREE_NODE_ACCESS_TYPE := NULL_POINTER;  -- the parent
  3283.             GRAPH_DATA : GRAPH_NODE_ACCESS_TYPE := NULL_POINTER; 
  3284.             -------------------------------------------------------------------
  3285.             -- A list of all list nodes pointing to this node
  3286.             -------------------------------------------------------------------
  3287.             MEMBERSHIP : MEMBERSHIP_LIST_TYPE := NULL_POINTER;
  3288.             -------------------------------------------------------------------
  3289.             -- The Node Type specific data which includes lists pointing 
  3290.             -- to connected, contained, or related nodes, and which includes
  3291.             -- semantic information concerning the current node (e.g.,
  3292.             -- generic status of a subprogram).
  3293.             -------------------------------------------------------------------
  3294.             case NODE_TYPE is
  3295.                when ROOT | TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE |
  3296.                     TYPE_PROCEDURE | TYPE_FUNCTION | TYPE_TASK =>
  3297.                   CONTAINED_ENTITY_LIST : CONTAINED_ENTITY_LIST_TYPE := NULL_POINTER;
  3298.                   case NODE_TYPE is      
  3299.                      when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE |
  3300.                           TYPE_PROCEDURE | TYPE_FUNCTION | TYPE_TASK =>
  3301.                         PROLOGUE_PTR : PROLOGUE_NODE_ACCESS_TYPE := NULL_POINTER;
  3302.                         BODY_PTR : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  3303.                         DATA_CONNECT_LIST : DATA_CONNECT_LIST_TYPE := NULL_POINTER;
  3304.                         case NODE_TYPE is
  3305.                            when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE |
  3306.                                 TYPE_PROCEDURE | TYPE_FUNCTION =>
  3307.                               GENERIC_STATUS : GENERIC_STATUS_TYPE := NOT_GENERIC;
  3308.                               CU_INSTANTIATED : NAME_TYPE := NULL_NAME;
  3309.                               case NODE_TYPE is      
  3310.                                  when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  3311.                                     EXPORTED_LIST : EXPORTED_LIST_TYPE := NULL_POINTER;
  3312.                                     IMPORTED_LIST : IMPORTED_LIST_TYPE := NULL_POINTER;
  3313.                                  when TYPE_FUNCTION | TYPE_PROCEDURE =>
  3314.                                     HAS_PARAMETERS : BOOLEAN := FALSE;
  3315.                                  when others =>
  3316.                                     null;
  3317.                               end case;
  3318.                            when TYPE_TASK =>
  3319.                               TASK_STATUS : TASK_STATUS_TYPE := NORMAL_TASK;
  3320.                               ENTRY_LIST : ENTRY_LIST_TYPE := NULL_POINTER;
  3321.                            when others =>
  3322.                               null;
  3323.                         end case;
  3324.                      when others =>
  3325.                         null ;
  3326.                   end case ;
  3327.                when TYPE_ENTRY_POINT =>
  3328.                   IS_GUARDED : BOOLEAN := FALSE; -- for task entry points
  3329.                   WITH_PARAMETERS : BOOLEAN := FALSE;
  3330.                when TYPE_BODY =>
  3331.                   CALLEE_LIST : CALLEE_LIST_TYPE := NULL_POINTER;
  3332.                when EXPORTED_PROCEDURE | EXPORTED_FUNCTION |
  3333.                     EXPORTED_ENTRY_POINT | EXPORTED_TYPE | EXPORTED_OBJECT |
  3334.                     EXPORTED_EXCEPTION | CONNECTION_BY_CALL | 
  3335.                     CONNECTION_FOR_DATA =>
  3336.                   CALL_VARIETY : CALL_CONNECTION_TYPE := NO_CONNECTION;
  3337.                   CONNECTEE : TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  3338.                   LINE : LINE_TYPE := NULL_LINE ;
  3339.                when others =>
  3340.                   null;
  3341.             end case;
  3342.          end record;
  3343.  
  3344.       ----------------------------------------------------------------------   
  3345.       -- The arrays containing GRAPH, LIST, and TREE nodes.
  3346.       ----------------------------------------------------------------------   
  3347.       type GRAPH_ARRAY is array (GRAPH_NODE_ACCESS_TYPE range <>) 
  3348.          of GRAPH_NODE_TYPE;
  3349.       type LIST_ARRAY is array (LIST_NODE_ACCESS_TYPE range <>) 
  3350.          of LIST_NODE_TYPE;
  3351.       type TREE_ARRAY is array (TREE_NODE_ACCESS_TYPE range <>)
  3352.          of TREE_NODE_TYPE;
  3353.       type PROLOGUE_ARRAY is array (PROLOGUE_NODE_ACCESS_TYPE range <>)
  3354.          of PROLOGUE_NODE_TYPE;
  3355.  
  3356.       ----------------------------------------------------------------------   
  3357.       -- The size of the arrays
  3358.       ----------------------------------------------------------------------   
  3359.       MAX_GRAPH_NODES : constant GRAPH_NODE_ACCESS_TYPE := 199;
  3360.       MAX_LIST_NODES : constant LIST_NODE_ACCESS_TYPE := 199;
  3361.       MAX_TREE_NODES : constant TREE_NODE_ACCESS_TYPE := 99;
  3362.       MAX_PROLOGUE_NODES : constant PROLOGUE_NODE_ACCESS_TYPE := 99;
  3363.    
  3364.       ----------------------------------------------------------------------   
  3365.       -- The Primary array declarations
  3366.       ----------------------------------------------------------------------   
  3367.       GRAPH : GRAPH_ARRAY (1..MAX_GRAPH_NODES);
  3368.       LIST  : LIST_ARRAY (1..MAX_LIST_NODES);
  3369.       TREE  : TREE_ARRAY (1..MAX_TREE_NODES);
  3370.       PROLOGUE : PROLOGUE_ARRAY (1..MAX_PROLOGUE_NODES);
  3371.  
  3372.       ----------------------------------------------------------------------   
  3373.       -- Array containing the list of enclosed entities
  3374.       ----------------------------------------------------------------------   
  3375.       type ENCLOSED_ENTITIES_TYPE is array ( 1..MAX_LIST_NODES )
  3376.          of LIST_NODE_ACCESS_TYPE ;
  3377.  
  3378.       ----------------------------------------------------------------------   
  3379.       -- The Archive array declarations (used for recovery from 
  3380.       -- aborted operations).
  3381.       ----------------------------------------------------------------------   
  3382.       ARCHIVE_GRAPH : GRAPH_ARRAY (1..MAX_GRAPH_NODES);
  3383.       ARCHIVE_LIST  : LIST_ARRAY (1..MAX_LIST_NODES);
  3384.       ARCHIVE_TREE  : TREE_ARRAY (1..MAX_TREE_NODES);
  3385.       ARCHIVE_PROLOGUE : PROLOGUE_ARRAY (1..MAX_PROLOGUE_NODES);
  3386.  
  3387.       ----------------------------------------------------------------------   
  3388.       -- The Root Node of the TREE
  3389.       ----------------------------------------------------------------------   
  3390.       ROOT_NODE : constant TREE_NODE_ACCESS_TYPE := TREE'first ;
  3391.  
  3392.    end TREE_DATA;
  3393. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3394. --tree_data_body.ada
  3395. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3396.    -- version 85-08-06 1540 by JL
  3397.  
  3398.    package body TREE_DATA is
  3399.    begin
  3400.       -- initialize the root of the tree.
  3401.       TREE(ROOT_NODE) := (ROOT,              -- NODE_TYPE
  3402.                           NULL_NAME,         -- NAME
  3403.                           NULL_POINTER,      -- PARENT
  3404.                           NULL_POINTER,      -- GRAPH_DATA
  3405.                           NULL_POINTER,      -- MEMBERSHIP
  3406.                           NULL_POINTER);     -- CONTAINED_ENTITY_LIST
  3407.    end TREE_DATA;
  3408. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3409. --terminal_access_spec.ada
  3410. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3411. -- VERSION 85-11-06 14:15 by JNB
  3412.  
  3413. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  3414.  
  3415. package TERMINAL_ACCESS is
  3416. -- ==================================================================
  3417. --  This package implements a version of the Graphical
  3418. --  Kernel System (GKS) developed by SYSCON Corporation
  3419. --  for use to the target terminal type.
  3420. --  Calls to this package will originate only from package GKS.
  3421. --  The only calls originating from this package will be to
  3422. --  the target terminal drivers. This package is the standard interface
  3423. --  for all target terminal accesses.
  3424. -- ===================================================================
  3425.  
  3426.    package GKS_SPEC renames GKS_SPECIFICATION ;
  3427.  
  3428.    -------------------------------
  3429.    -- operations available to GKS
  3430.    -------------------------------
  3431.    type OPERATIONS_TYPE is 
  3432.         ( USE_BOX ,
  3433.           USE_CIRCLE ,
  3434.           USE_MARKER ,
  3435.           USE_POLYGON ,
  3436.           USE_POLYLINE ,
  3437.           USE_POLYMARKER ,
  3438.           USE_REG_POLYGON ,
  3439.           USE_TEXT ) ;
  3440.  
  3441.    -------------------------------------------------------------------
  3442.    -- dedicated operation to use for an object draw
  3443.    -------------------------------------------------------------------
  3444.    subtype CIRCLE_OPERATIONS_TYPE is OPERATIONS_TYPE
  3445.            range USE_CIRCLE..USE_CIRCLE ;
  3446.    subtype FILL_AREA_OPERATIONS_TYPE is OPERATIONS_TYPE
  3447.            range USE_POLYGON..USE_POLYGON ;
  3448.    subtype POLYLINE_OPERATIONS_TYPE is OPERATIONS_TYPE
  3449.            range USE_POLYLINE..USE_POLYLINE ;
  3450.    subtype POLYMARKER_OPERATIONS_TYPE is OPERATIONS_TYPE
  3451.            range USE_MARKER..USE_MARKER ;
  3452.    subtype RECTANGLE_OPERATIONS_TYPE is OPERATIONS_TYPE
  3453.            range USE_BOX..USE_BOX ;
  3454.    subtype TEXT_OPERATIONS_TYPE is OPERATIONS_TYPE
  3455.            range USE_TEXT..USE_TEXT ;
  3456.  
  3457.    -----------------------------------------
  3458.    -- kinds of segment operation to perform
  3459.    -----------------------------------------
  3460.    type SEGMENT_OPERATIONS_TYPE is 
  3461.         ( START ,
  3462.           FINISH ,
  3463.           DESTROY ,
  3464.           REDRAW ) ;
  3465.  
  3466.    ----------------------------------------------------------------
  3467.    -- record to congregate all parameters needed by draw procedure
  3468.    --
  3469.    --          type OBJECT_DATA_RECORD  field usage       --
  3470.    ---------------------------------------------------------
  3471.    --                      |            USE_ type         --
  3472.    --                      |--------------------------------
  3473.    --                      |   |   |   |   |- - POLYnnn - -|
  3474.    --       record         | B | C | M | T | G | L | M | R |
  3475.    --        field         | O | I | A | E | O | I | A | E |
  3476.    --                      | X | R | R | X | N | N | R | G |
  3477.    --                      |   | C | K | T |   | E | K | G |
  3478.    --                      |   | L | E |   |   |   | E | O |
  3479.    --                      |   | E | R |   |   |   | R | N |
  3480.    ------------------------- - - - - - - - - - - - - - - - -
  3481.    --  REFERENCE_POINT     | * | * | * | * |   |   |   | * |
  3482.    ------------------------- - - - - - - - - - - - - - - - -
  3483.    --  SIZE_POINT          | * | * |   |   |   |   |   | * |
  3484.    ------------------------- - - - - - - - - - - - - - - - -
  3485.    --  SIDES               |   |   |   |   |   |   |   | * |
  3486.    ------------------------- - - - - - - - - - - - - - - - -
  3487.    --  SHAPE_DATA_LIST     |   |   |   |   |   |   | * |   |
  3488.    ------------------------- - - - - - - - - - - - - - - - -
  3489.    --  TEXT                |   |   |   | * |   |   |   |   |
  3490.    ------------------------- - - - - - - - - - - - - - - - -
  3491.    -- POLY_SHAPE_DATA_LIST |   |   |   |   | * | * | * |   |
  3492.    ------------------------- - - - - - - - - - - - - - - - -
  3493.    type OBJECT_DATA_RECORD ( DESCRIPTION : OPERATIONS_TYPE ) is
  3494.       record
  3495.          case DESCRIPTION is -- 1
  3496.             when   USE_BOX    | USE_CIRCLE 
  3497.                  | USE_MARKER | USE_REG_POLYGON | USE_TEXT =>
  3498.                REFERENCE_POINT : GKS_SPEC.WC.POINT ;
  3499.                case DESCRIPTION is -- 2
  3500.                   when USE_BOX | USE_CIRCLE | USE_REG_POLYGON =>
  3501.                      SIZE_POINT : GKS_SPEC.WC.POINT ;
  3502.                      case DESCRIPTION is -- 3
  3503.                         when USE_REG_POLYGON =>
  3504.                            SIDES : Natural ;
  3505.                         when others => null ;
  3506.                      end case ; -- DESCRIPTION 3
  3507.                   when USE_TEXT =>
  3508.                      TEXT        : STRING ( 1..80 ) :=
  3509.                         "                    " & -- 20 SPACES 
  3510.                         "                    " & -- 20 SPACES 
  3511.                         "                    " & -- 20 SPACES 
  3512.                         "                    " ; -- 20 SPACES 
  3513.                      TEXT_LENGTH : Natural := 80 ;
  3514.                   when others => null ;
  3515.                end case ; -- DESCRIPTION 2
  3516.             when USE_POLYGON | USE_POLYLINE | USE_POLYMARKER =>
  3517.                SHAPE_DATA_LIST   : GKS_SPEC.WC.POINT_ARRAY ( 1..100 ) ;
  3518.                SHAPE_LIST_LENGTH : Natural ;
  3519.             when others =>
  3520.                null ;
  3521.          end case ; 
  3522.       end record ; 
  3523.  
  3524.    -------------------------
  3525.    -- kinds of styles to use
  3526.    -------------------------
  3527.    type STYLES_TYPE is 
  3528.         ( FILL_PATTERN ,
  3529.           LINE_PATTERN ,
  3530.           MARKER_PATTERN ) ;
  3531.  
  3532.    -------------------------------------------------------------------------
  3533.    -- Record type containing character size and space attributes.
  3534.    -------------------------------------------------------------------------
  3535.    type CHARACTER_ATTRIBUTES is
  3536.       record
  3537.          WIDTH   : WC_TYPE ;
  3538.          HEIGHT  : WC_TYPE ;
  3539.          SPACING : WC_TYPE ;
  3540.       end record ;
  3541.  
  3542.    -------------------------------------------------------------------------
  3543.    -- record type to congregate all parameters needed by set style procedure
  3544.    -------------------------------------------------------------------------
  3545.    type STYLE_RECORD ( DESCRIPTION : STYLES_TYPE ) is
  3546.       record
  3547.          case DESCRIPTION is
  3548.             when LINE_PATTERN   => LINE   : GKS_SPEC.LINE_TYPE ;
  3549.             when FILL_PATTERN   => FILL   : GKS_SPEC.INTERIOR_STYLE ;
  3550.             when MARKER_PATTERN => MARKER : GKS_SPEC.MARKER_TYPE ;
  3551.          end case ;
  3552.       end record ;
  3553.  
  3554.    type COLOR_OBJECTS is 
  3555.         ( ALPHA_COLOR ,
  3556.           ALPHA_BACKGROUND ,
  3557.           GRAPHIC_BACKGROUND ,
  3558.           FILL_COLOR ,
  3559.           LINE_COLOR ,
  3560.           MARKER_COLOR ,
  3561.           TEXT_COLOR ) ;
  3562.  
  3563.    ------------------------------------------------------
  3564.    -- dedicated color index parameter variable selectors
  3565.    ------------------------------------------------------
  3566.    subtype FOR_ALPHA_BACKGROUND_TYPE is COLOR_OBJECTS
  3567.            range ALPHA_BACKGROUND..ALPHA_BACKGROUND ;
  3568.    subtype FOR_ALPHA_WRITING_TYPE is COLOR_OBJECTS
  3569.            range ALPHA_COLOR..ALPHA_COLOR ;
  3570.    subtype FOR_GRAPHIC_BACKGROUND_TYPE is COLOR_OBJECTS
  3571.            range GRAPHIC_BACKGROUND..GRAPHIC_BACKGROUND ;
  3572.    subtype FOR_CHARACTER_COLOR_TYPE is COLOR_OBJECTS
  3573.            range TEXT_COLOR..TEXT_COLOR ;
  3574.    subtype FOR_FILL_STYLE_COLOR_TYPE is COLOR_OBJECTS
  3575.            range FILL_COLOR..FILL_COLOR ;
  3576.    subtype FOR_LINE_STYLE_COLOR_TYPE is COLOR_OBJECTS
  3577.            range LINE_COLOR..LINE_COLOR ;
  3578.    subtype FOR_MARKERS_COLOR_TYPE is COLOR_OBJECTS
  3579.            range MARKER_COLOR..MARKER_COLOR ;
  3580.  
  3581.    procedure CLOSE_TERMINAL ;
  3582.    -- =========================================================
  3583.    -- End graphics operations at terminal and cleanup.
  3584.    -- =========================================================
  3585.  
  3586.    procedure DEFINE_COLOR
  3587.              ( INDEX  : in GKS_SPEC.COLOUR_INDEX ;
  3588.                COLOUR : in GKS_SPEC.COLOUR_REPRESENTATION ) ;
  3589.    -- =========================================================
  3590.    -- Define the colour to be associated with a colour index on
  3591.    -- Effect : Redefines the entries in the colour look up table pointed
  3592.    --          at by the colour index.
  3593.    -- =========================================================
  3594.  
  3595.    procedure DRAW
  3596.              ( OBJECT_DEFINITION : in OBJECT_DATA_RECORD ) ;
  3597.    -- =========================================================
  3598.    -- draw the object described by the object definition
  3599.    -- =========================================================
  3600.  
  3601.    procedure GRAPHICS_SCREEN
  3602.              ( GRAPHICS_VISIBILITY : in Boolean ) ;
  3603.    -- =========================================================
  3604.    -- Turn the graphics screen on and off. 
  3605.    -- =========================================================
  3606.  
  3607.    procedure INIT_TERMINAL
  3608.              ( TERM_TYPE : out GKS_SPECIFICATION.WS_ID ) ;
  3609.    -- =========================================================
  3610.    -- Initialize the terminal for graphics operations.
  3611.    -- =========================================================
  3612.  
  3613.    procedure MAP_WINDOW_TO_VIEWPORT
  3614.              ( WINDOW               : in NATURAL ;
  3615.                UPPER_LEFT_WINDOW ,
  3616.                LOWER_RIGHT_WINDOW ,
  3617.                UPPER_LEFT_VIEWPORT ,
  3618.                LOWER_RIGHT_VIEWPORT : in GKS_SPEC.WC.POINT ) ;
  3619.    -- =========================================================
  3620.    -- Creates windows at the terminal.
  3621.    -- Effect : All subsequent window references will occur in the
  3622.    --          selected viewport.
  3623.    -- =========================================================
  3624.  
  3625.    procedure MOVE_SEGMENT
  3626.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  3627.                LOCATION   : in GKS_SPEC.WC.POINT ) ;
  3628.    -- =========================================================
  3629.    -- relocates segment
  3630.    -- Effect : Sets the reference point of the segment to new location.
  3631.    -- =========================================================
  3632.  
  3633.    procedure PLACE_CURSOR
  3634.              ( LOCATION : in GKS_SPEC.WC.POINT ) ;
  3635.    -- =========================================================
  3636.    -- Effect : Relocates the graphics cursor to the specified location.
  3637.    -- =========================================================
  3638.  
  3639.    procedure PRINT_SCREEN
  3640.              ( WINDOW : in NATURAL := 0 ) ;
  3641.    -- =========================================================
  3642.    -- Print all visible segments.
  3643.    -- Effect : For the specified workstation, all deferred actions are
  3644.    --          executed, the display surface is printed to the local
  3645.    --          printer attached to the terminal.
  3646.    -- =========================================================
  3647.  
  3648.    procedure REDRAW_ALL_SEGMENTS;
  3649.    -- =========================================================
  3650.    -- Redraw all visible segments stored.
  3651.    -- Effect : For the specified workstation, all deferred actions are
  3652.    --          executed, the display surface is cleared if not empty,
  3653.    --          and all visible segments are displayed.
  3654.    -- =========================================================
  3655.  
  3656.    procedure RENAME_SEGMENT
  3657.              ( OLD_SEGMENT_NAME : in GKS_SPEC.SEGMENT_NAME ;
  3658.                NEW_SEGMENT_NAME : in GKS_SPEC.SEGMENT_NAME ) ;
  3659.    -- =========================================================
  3660.    -- Change name of a segment
  3661.    -- Effect : Rename the specified segment.  The old segment name
  3662.    --          may be reused.
  3663.    -- =========================================================
  3664.  
  3665.    function REQUEST_LOCATOR
  3666.             ( DEVICE    : in  GKS_SPEC.DEVICE_NUMBER )
  3667.    return GKS_SPEC.WC.POINT ;
  3668.    -- =========================================================
  3669.    -- Request position in WC and normalization transformation number
  3670.    -- from a locator device
  3671.    -- Effect : Perform a request on the specified locator device.
  3672.    -- =========================================================
  3673.  
  3674.    function REQUEST_PICK
  3675.             ( DEVICE : in  GKS_SPEC.DEVICE_NUMBER )
  3676.    return GKS_SPEC.PICK_DATA_RECORD ;
  3677.    -- =========================================================
  3678.    -- Request segment name, pick identifier and pick status from a
  3679.    -- pick device
  3680.    -- Effect : Perform a request on the specified pick device.
  3681.    -- =========================================================
  3682.  
  3683.    procedure SEGMENT_OPERATION
  3684.              ( SELECTION  : in SEGMENT_OPERATIONS_TYPE ;
  3685.                SEGMENT_ID : in SEGMENT_NAME ) ;
  3686.    -- =========================================================
  3687.    -- FINISH Segment construction finished
  3688.    -- Effect : Close the currently open segment.  Primitives may no longer
  3689.    --          be added to the closed segment.
  3690.    -- START a segment and start constructing it
  3691.    -- Effect : Create a segment.  Subsequent calls to output primitive
  3692.    --          functions will place the primitives into the currently
  3693.    --          open segment.
  3694.    -- DESTROY a segment
  3695.    -- Effect : Delete all copies of the specified segment stored in
  3696.    --          GKS.  The segment name may be reused.
  3697.    -- REDRAW a visible segment.
  3698.    -- Effect : For the specified workstation, the visible segment
  3699.    --  is displayed.
  3700.    -- =========================================================
  3701.  
  3702.    procedure SET_CHARACTER_ATTRIBUTES
  3703.              ( CHARACTER_SIZE : in CHARACTER_ATTRIBUTES ) ;
  3704.    -- =========================================================
  3705.    -- Set the character attributes for graphic text output.
  3706.    -- Effect : The current character attributes ( height,
  3707.    --          width, and spacing ) are set to the specified
  3708.    --          values.
  3709.    -- =========================================================
  3710.  
  3711.    procedure SET_COLOR_INDEX
  3712.              ( FIGURE : in COLOR_OBJECTS;
  3713.                COLOUR : in GKS_SPEC.COLOUR_INDEX ) ;
  3714.    -- =========================================================
  3715.    -- Set the colour index for use with the figure type.
  3716.    -- Effect : The current figure colour index is set to the
  3717.    --          specified value.
  3718.    -- =========================================================
  3719.  
  3720.    procedure SET_CURRENT_WINDOW
  3721.              ( WINDOW : in NATURAL ) ;
  3722.    -- =========================================================
  3723.    -- Selects the current active window
  3724.    -- Effect : All subsequent drawing will occur in the new current
  3725.    -- window.
  3726.    -- =========================================================
  3727.  
  3728.    procedure SET_DETECTABILITY
  3729.              ( SEGMENT_ID    : in GKS_SPEC.SEGMENT_NAME ;
  3730.                DETECTABILITY : in GKS_SPEC.SEGMENT_DETECTABILITY ) ;
  3731.    -- =========================================================
  3732.    -- Mark segment undetectable or detectable
  3733.    -- Effect : Set the detectability attributes of the specified segment
  3734.    --          to DETECTABLE or UNDETECTABLE.
  3735.    -- =========================================================
  3736.  
  3737.    procedure SET_HIGHLIGHTING
  3738.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  3739.                HIGHLIGHT  : in GKS_SPEC.SEGMENT_HIGHLIGHTING ) ;
  3740.    -- =========================================================
  3741.    -- Mark segment normal or highlighted
  3742.    -- Effect : Set the highlighting attribute to the value
  3743.    --          HIGHLIGHTED or NORMAL.
  3744.    -- =========================================================
  3745.  
  3746.    procedure SET_SEGMENT_PRIORITY
  3747.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  3748.                PRIORITY   : in GKS_SPEC.SEGMENT_PRIORITY ) ;
  3749.    -- =========================================================
  3750.    -- Set priority of a segment
  3751.    -- Effect : Set the priority of the specified segment to the specified
  3752.    --          priority.  Priority is a value in the range 0 to 1.
  3753.    -- =========================================================
  3754.  
  3755.    procedure SET_STYLE
  3756.              ( STYLE_DEFINITION : STYLE_RECORD ) ;
  3757.    -- =========================================================
  3758.    -- Set the specified style type parameter for line, fill and marker.
  3759.    -- Effect : The current style type is set to the specified value.
  3760.    --      item     Linetypes:   markertypes:
  3761.    --        1  -     solid          dot
  3762.    --        2  -     dashed         plus sign
  3763.    --        3  -     dotted         asterisk
  3764.    --        4  -   * dashed-dotted  circle
  3765.    --        5  -                  * diagonal cross
  3766.    --    * - implementation dependent
  3767.    -- =========================================================
  3768.  
  3769.    procedure SET_TEXT_PATH
  3770.              ( PATH : in GKS_SPEC.TEXT_PATH ) ;
  3771.    -- =========================================================
  3772.    -- Select the text path RIGHT, LEFT, UP, or DOWN
  3773.    -- Effect : Set the text path of character strings to the specified
  3774.    --          values for all subsequent text output primitives until
  3775.    --          the values are reset by another call to this function.
  3776.    -- =========================================================
  3777.  
  3778.    procedure SET_TEXT_PRECISION
  3779.              ( PRECISION : in GKS_SPEC.TEXT_PRECISION ) ;
  3780.    -- =========================================================
  3781.    -- Set the text precision to string, char, or stroke precision.
  3782.    -- Effect : Set the text precision of character strings to
  3783.    --          the specified value for all subsequent text
  3784.    --          output primitives until the values are reset by
  3785.    --          another call to this function.
  3786.    -- =========================================================
  3787.  
  3788.    procedure SET_VISIBILITY
  3789.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  3790.                VISIBILITY : in GKS_SPEC.SEGMENT_VISIBILITY ) ;
  3791.    -- =========================================================
  3792.    -- Mark segment visible or invisible
  3793.    -- Effect : Set the visibility attributes of the specified segment
  3794.    --          to VISIBLE or INVISIBLE.
  3795.    -- =========================================================
  3796.  
  3797.    -- exception conditions to be handled by user packages
  3798.    LOCATOR_INPUT_ERROR : exception ;
  3799.  
  3800. end TERMINAL_ACCESS;
  3801. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3802. --terminal_access_tek_body.ada
  3803. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  3804.  
  3805. -- controlled by JERRY BAKER
  3806. -- VERSION 85-10-18 16:00 by JNB
  3807. --
  3808. -- Target display terminal is the TEKTRONIX 4107
  3809. --
  3810. with TEKDRIVER ; use TEKDRIVER ;
  3811. with MATH_LIB  ;
  3812. with TRACE_PKG ; use TRACE_PKG ;
  3813. with TEXT_IO   ; use TEXT_IO   ;
  3814. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  3815.  
  3816. package body TERMINAL_ACCESS is
  3817. -- ======================================================
  3818. --  The package body of TERMINAL_ACCESS implements the --
  3819. --  GKS operations which compose levels 0A through 1B. --
  3820. --                                                     --
  3821. --            Hardware Support Requirments             --
  3822. --     In addition to normal graphics support the      --
  3823. --     following additions are required.               --
  3824. --        SEGMENTS :                                   --
  3825. --            Open/Create            Close             --
  3826. --            Rename                 Delete            --
  3827. --        DRAWING :                                    --
  3828. --            Polylines              Text              --
  3829. --            Complex Fill Polygons  Polymarkers       --
  3830. -- ======================================================
  3831.  
  3832.    package TERMINAL_ACCESS_MATH is new MATH_LIB( FLOAT ) ;
  3833.  
  3834.    -- coordinate transformation scale constants.
  3835.    WORLD_SCREEN_X : constant FLOAT := FLOAT(
  3836.          FLOAT( TEKDRIVER.SCREEN_X_COORDINATE_MAX ) /
  3837.          FLOAT( GKS_SPEC.MAX_WC )) ;
  3838.    WORLD_SCREEN_Y : constant FLOAT := FLOAT(
  3839.          FLOAT( TEKDRIVER.SCREEN_Y_COORDINATE_MAX ) /
  3840.          FLOAT( GKS_SPEC.MAX_WC )) ;
  3841.    WORLD_MEMORY_X : constant FLOAT := FLOAT(
  3842.          FLOAT( TEKDRIVER.TERMINAL_COORDINATE_MAX ) /
  3843.          FLOAT( GKS_SPEC.MAX_WC )) ;
  3844.    WORLD_MEMORY_Y : constant FLOAT := FLOAT(
  3845.          FLOAT( TEKDRIVER.TERMINAL_COORDINATE_MAX ) /
  3846.          FLOAT( GKS_SPEC.MAX_WC )) ;
  3847.  
  3848.    -- variables to maintain the current state of reusable parameters
  3849.  
  3850.    CURRENT_CHAR_COLOR         : TEKDRIVER.COLOR_INDEX := 7 ;
  3851.    CURRENT_CHAR_BACKGROUND    : TEKDRIVER.COLOR_INDEX := 1 ;
  3852.    CURRENT_DIALOG_BACKGROUND  : TEKDRIVER.COLOR_INDEX := 0 ;
  3853.    CURRENT_GRAPHIC_BACKGROUND : TEKDRIVER.COLOR_INDEX := 0 ;
  3854.  
  3855.    -- Define the offset required to place the marker precisely
  3856.    -- on the displayed cursor.
  3857.    NEW_TEXT_LOCATION        : GKS_SPEC.WC.POINT ;
  3858.    CURRENT_CHARACTER_HEIGHT : GKS_SPEC.WC_TYPE := 0.0 ;
  3859.  
  3860.    CURRENT_FILL_PATTERN   : GKS_SPEC.INTERIOR_STYLE :=
  3861.                             GKS_SPEC.HOLLOW ;
  3862.    CURRENT_TEXT_PRECISION : GKS_SPEC.TEXT_PRECISION :=
  3863.                             GKS_SPEC.STROKE_PRECISION ;
  3864.  
  3865.    OPEN_SEGMENT_REQUESTED    : BOOLEAN := false ;
  3866.    CURRENT_SEGMENT           : TEKDRIVER.SEGMENT_IDENTIFIER ;
  3867.    CURSOR_SEGMENT            : constant TEKDRIVER.SEGMENT_IDENTIFIER := 0 ;
  3868.    INITIAL_HIGHLIGHT_SEGMENT : constant TEKDRIVER.SEGMENT_IDENTIFIER := 20000 ;
  3869.  
  3870.    GRAPHICS_VIEW        : constant TEKDRIVER.VIEW_NUMBER := 1 ;
  3871.    MENU_VIEW            : constant TEKDRIVER.VIEW_NUMBER := 2 ;
  3872.    CLEAR_SURFACE_1_VIEW : constant TEKDRIVER.VIEW_NUMBER := 3 ;
  3873.    CLEAR_SURFACE_2_VIEW : constant TEKDRIVER.VIEW_NUMBER := 4 ;
  3874.  
  3875.    CURRENT_VIEW  : TEKDRIVER.VIEW_NUMBER := MENU_VIEW ;
  3876.  
  3877.    INITIAL_HIGHLIGHT_VIEW  : constant TEKDRIVER.VIEW_NUMBER := 10 ;
  3878.    GRAPHICS_HIGHLIGHT_VIEW : constant TEKDRIVER.VIEW_NUMBER :=
  3879.                              INITIAL_HIGHLIGHT_VIEW + GRAPHICS_VIEW ;
  3880.    MENU_HIGHLIGHT_VIEW     : constant TEKDRIVER.VIEW_NUMBER :=
  3881.                              INITIAL_HIGHLIGHT_VIEW + MENU_VIEW ;
  3882.  
  3883.    HIGHEST_COLOR_INDEX  : constant TEKDRIVER.COLOR_INDEX := 15 ;
  3884.    HIGHEST_DIALOG_INDEX : constant TEKDRIVER.COLOR_INDEX := 7 ;
  3885.    BACKGROUND_INDEX     : constant TEKDRIVER.COLOR_INDEX := 0 ;
  3886.  
  3887.    HIGHLIGHT_COLOR      : constant GKS_SPEC.COLOUR_REPRESENTATION :=
  3888.       ( RED   => 1.00,
  3889.         GREEN => 0.27,
  3890.         BLUE  => 0.74 );
  3891.  
  3892.    WHITE_BACKGROUND     : constant GKS_SPEC.COLOUR_REPRESENTATION :=
  3893.       ( RED   => 1.00,
  3894.         GREEN => 1.00,
  3895.         BLUE  => 1.00 );
  3896.  
  3897.    -- Map the high color index values ( 8 - 15 ) into the low
  3898.    -- index values ( 0..7 ) 
  3899.    COLOR_INDEX_MAPPING : array ( GKS_SPEC.COLOUR_INDEX range 8..15 )
  3900.                          of TEKDRIVER.COLOR_INDEX :=
  3901.       ( 8  => 6,
  3902.         9  => 5,
  3903.         10 => 1,
  3904.         11 => 2,
  3905.         12 => 1,
  3906.         13 => 3,
  3907.         14 => 4,
  3908.         15 => 7 ) ;
  3909.  
  3910.    COLOR_REPRESENTATION : array( TEKDRIVER.COLOR_INDEX
  3911.                           range 0..HIGHEST_COLOR_INDEX ) of
  3912.                           GKS_SPEC.COLOUR_REPRESENTATION :=
  3913.       ( 0..HIGHEST_COLOR_INDEX  => ( RED   => 0.0,
  3914.                                      GREEN => 0.0,
  3915.                                      BLUE  => 0.0 )) ;
  3916.  
  3917.    GKS_LINE_TO_TEK_LINE : constant array(
  3918.                           GKS_SPEC.LINE_TYPE range 1..4 )
  3919.                           of TEKDRIVER.LINE_STYLE :=
  3920.        ( 1 => 0,    -- SOLID
  3921.          2 => 4,    -- DASHED
  3922.          3 => 1,    -- DOTTED
  3923.          4 => 2 ) ; -- DASHED-DOTTED
  3924.  
  3925.    GKS_MARKER_TO_TEK_MARKER : constant array(
  3926.                               GKS_SPEC.MARKER_TYPE range 1..5 )
  3927.                               of TEKDRIVER.MARKER_NUMBER :=
  3928.        ( 1 => 0,    -- DOT
  3929.          2 => 2,    -- PLUS SIGN
  3930.          3 => 3,    -- ASTERISK
  3931.          4 => 4,    -- CIRCLE
  3932.          5 => 5 ) ; -- DIAGONAL CROSS
  3933.  
  3934.    GKS_TEXT_PATH_TO_TEK_TEXT_PATH : constant array(
  3935.                                     GKS_SPEC.TEXT_PATH )
  3936.                                     of TEKDRIVER.CHARACTER_DIRECTION :=
  3937.        ( GKS_SPEC.RIGHT => TEKDRIVER.RIGHT,
  3938.          GKS_SPEC.LEFT  => TEKDRIVER.LEFT,
  3939.          GKS_SPEC.UP    => TEKDRIVER.UP,
  3940.          GKS_SPEC.DOWN  => TEKDRIVER.DOWN ) ;
  3941.  
  3942.    GKS_HIGHLIGHT_TO_TEK_HIGHLIGHT : constant array(
  3943.                                     GKS_SPEC.SEGMENT_HIGHLIGHTING )
  3944.                                     of TEKDRIVER.HIGHLIGHTING :=
  3945.        ( GKS_SPEC.NORMAL       => TEKDRIVER.NOT_HIGHLIGHTED,
  3946.          GKS_SPEC.HIGHLIGHTED  => TEKDRIVER.HIGHLIGHTED ) ;
  3947.  
  3948.    GKS_VISIBILITY_TO_TEK_VISIBILITY : constant array(
  3949.                                     GKS_SPEC.SEGMENT_VISIBILITY )
  3950.                                     of TEKDRIVER.VISIBILITY_MODE :=
  3951.        ( GKS_SPEC.VISIBLE    => TEKDRIVER.VISIBLE,
  3952.          GKS_SPEC.INVISIBLE  => TEKDRIVER.INVISIBLE ) ;
  3953.  
  3954.    GKS_DETECTABILITY_TO_TEK_DETECTABILITY : constant array(
  3955.                             GKS_SPEC.SEGMENT_DETECTABILITY )
  3956.                             of TEKDRIVER.DETECTABILITY :=
  3957.        ( GKS_SPEC.UNDETECTABLE    => TEKDRIVER.CANNOT_BE_PICKED,
  3958.          GKS_SPEC.DETECTABLE      => TEKDRIVER.CAN_BE_PICKED ) ;
  3959.  
  3960.    GKS_PRECISION_TO_TEK_PRECISION : constant array(
  3961.                                     GKS_SPEC.TEXT_PRECISION )
  3962.                                     of TEKDRIVER.GRAPHTEXT_PRECISION :=
  3963.        ( GKS_SPEC.STRING_PRECISION  => TEKDRIVER.STRING_TEXT,
  3964.          GKS_SPEC.CHAR_PRECISION    => TEKDRIVER.STROKE_TEXT,
  3965.          GKS_SPEC.STROKE_PRECISION  => TEKDRIVER.STROKE_TEXT ) ;
  3966.  
  3967. -- internal support functions
  3968.  
  3969.    function WORLD_TO_SCREEN
  3970.             ( WORLD_POINT : in GKS_SPEC.WC.POINT )
  3971.    return TEKDRIVER.SCREEN_POINT is
  3972.    -- =============================================
  3973.    -- converts the gks world coordinate point to
  3974.    -- a TEK screen coordinate point.
  3975.    -- =============================================
  3976.       TEK_SCREEN_POINT : TEKDRIVER.SCREEN_POINT ;
  3977.  
  3978.    begin -- WORLD_TO_SCREEN
  3979.          if TRACE_PKG.REQUEST_TRACE then
  3980.             TRACE_PKG.TRACE ( "TERMINAL_ACCESS.WORLD_TO_SCREEN" ) ;
  3981.          end if ;
  3982.  
  3983.       TEK_SCREEN_POINT.X := TEKDRIVER.SCREEN_X_COORDINATE(
  3984.           FLOAT( WORLD_POINT.X ) * WORLD_SCREEN_X ) ; 
  3985.       TEK_SCREEN_POINT.Y := TEKDRIVER.SCREEN_Y_COORDINATE(
  3986.           FLOAT( WORLD_POINT.Y ) * WORLD_SCREEN_Y ) ; 
  3987.  
  3988.       return TEK_SCREEN_POINT ;
  3989.    exception
  3990.       when others =>
  3991.          if TRACE_PKG.REQUEST_TRACE then
  3992.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.WORLD TO SCREEN ");
  3993.          end if ;
  3994.          raise ;
  3995.    end WORLD_TO_SCREEN ;
  3996.  
  3997.  
  3998.    function WORLD_TO_MEMORY
  3999.             ( WORLD_POINT : in GKS_SPEC.WC.POINT )
  4000.    return TEKDRIVER.TERMINAL_POINT is
  4001.    -- =============================================
  4002.    -- converts the gks world coordinate point to
  4003.    -- a TEK memory coordinate point.
  4004.    -- =============================================
  4005.       MEMORY_POINT : TEKDRIVER.TERMINAL_POINT ;
  4006.  
  4007.    begin -- WORLD_TO_MEMORY
  4008.          if TRACE_PKG.REQUEST_TRACE then
  4009.             TRACE_PKG.TRACE ( "TERMINAL_ACCESS.WORLD_TO_MEMORY" ) ;
  4010.          end if ;
  4011.  
  4012.       MEMORY_POINT.X := TEKDRIVER.TERMINAL_COORDINATE(
  4013.              FLOAT( WORLD_POINT.X ) * WORLD_MEMORY_X ) ; 
  4014.       MEMORY_POINT.Y :=  TEKDRIVER.TERMINAL_COORDINATE(
  4015.              FLOAT( WORLD_POINT.Y ) * WORLD_MEMORY_Y ) ; 
  4016.  
  4017.       return MEMORY_POINT ;
  4018.    exception
  4019.       when others =>
  4020.          if TRACE_PKG.REQUEST_TRACE then
  4021.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.WORLD TO MEMORY ");
  4022.          end if ;
  4023.          raise ;
  4024.    end WORLD_TO_MEMORY ;
  4025.  
  4026.    function WORLD_COORDINATE_TO_MEMORY
  4027.             ( WC_COORDINATE : in GKS_SPEC.WC_TYPE )
  4028.    return TEKDRIVER.TERMINAL_COORDINATE is
  4029.    -- =============================================
  4030.    -- converts the gks world coordinate value to
  4031.    -- a TEK memory coordinate value
  4032.    -- =============================================
  4033.       MEMORY_COORDINATE : TEKDRIVER.TERMINAL_COORDINATE ;
  4034.  
  4035.    begin -- WORLD_COORDINATE_TO_MEMORY
  4036.       if TRACE_PKG.REQUEST_TRACE then
  4037.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.WORLD_COORDINATE_TO_MEMORY" ) ;
  4038.       end if ;
  4039.  
  4040.       MEMORY_COORDINATE := TEKDRIVER.TERMINAL_COORDINATE(
  4041.              FLOAT( WC_COORDINATE ) * WORLD_MEMORY_X ) ; 
  4042.  
  4043.       return MEMORY_COORDINATE ;
  4044.    exception
  4045.       when others =>
  4046.          if TRACE_PKG.REQUEST_TRACE then
  4047.             TRACE_PKG.TRACE(
  4048.                " EXCEPTION IN TERMACCES.WORLD_COORDINATE_TO_MEMORY ");
  4049.          end if ;
  4050.          raise ;
  4051.    end WORLD_COORDINATE_TO_MEMORY ;
  4052.  
  4053.  
  4054.    function SCREEN_TO_WORLD
  4055.             ( TEK_SCREEN_POINT : in TEKDRIVER.SCREEN_POINT )
  4056.    return GKS_SPEC.WC.POINT is
  4057.    -- =============================================
  4058.    -- converts the TEK screen coordinate point
  4059.    -- to a gks world coordinate point.
  4060.    -- =============================================
  4061.       WORLD_POINT : GKS_SPEC.WC.POINT ;
  4062.  
  4063.    begin -- SCREEN_TO_WORLD
  4064.          if TRACE_PKG.REQUEST_TRACE then
  4065.             TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SCREEN_TO_WORLD") ;
  4066.          end if ;
  4067.  
  4068.       WORLD_POINT.X := GKS_SPEC.WC_TYPE(
  4069.             FLOAT( TEK_SCREEN_POINT.X ) / WORLD_SCREEN_X ) ;
  4070.       WORLD_POINT.Y := GKS_SPEC.WC_TYPE(
  4071.             FLOAT( TEK_SCREEN_POINT.Y ) / WORLD_SCREEN_Y ) ; 
  4072.       return WORLD_POINT ;
  4073.    exception
  4074.       when others =>
  4075.          if TRACE_PKG.REQUEST_TRACE then
  4076.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SCREEN TO WORLD ");
  4077.          end if ;
  4078.          raise ;
  4079.    end SCREEN_TO_WORLD ;
  4080.  
  4081.  
  4082.    function MEMORY_TO_WORLD
  4083.             ( MEMORY_POINT : in TEKDRIVER.TERMINAL_POINT )
  4084.    return GKS_SPEC.WC.POINT is
  4085.    -- =============================================
  4086.    -- converts the TEK memory coordinate point
  4087.    -- to a gks world coordinate point.
  4088.    -- =============================================
  4089.       WORLD_POINT : GKS_SPEC.WC.POINT ;
  4090.  
  4091.    begin -- MEMORY_TO_WORLD
  4092.          if TRACE_PKG.REQUEST_TRACE then
  4093.             TRACE_PKG.TRACE ( "TERMINAL_ACCESS.MEMORY_TO_WORLD") ;
  4094.          end if ;
  4095.  
  4096.       WORLD_POINT.X := GKS_SPEC.WC_TYPE(
  4097.             FLOAT( MEMORY_POINT.X ) / WORLD_MEMORY_X ) ; 
  4098.       WORLD_POINT.Y := GKS_SPEC.WC_TYPE(
  4099.             FLOAT( MEMORY_POINT.Y ) / WORLD_MEMORY_Y ) ; 
  4100.       return WORLD_POINT ;
  4101.    exception
  4102.       when others =>
  4103.          if TRACE_PKG.REQUEST_TRACE then
  4104.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.MEMORY TO WORLD ");
  4105.          end if ;
  4106.          raise ;
  4107.    end MEMORY_TO_WORLD ;
  4108.  
  4109.    procedure INIT_TERMINAL
  4110.              ( TERM_TYPE : out GKS_SPECIFICATION.WS_ID ) is
  4111.    -- =========================================================
  4112.    -- Initialize the terminal for graphics operations.
  4113.    -- =========================================================
  4114.       WORKSTATION : constant GKS_SPECIFICATION.WS_ID := 2 ;
  4115.       APERTURE_WIDTH : constant TEKDRIVER.TERMINAL_COORDINATE := 0 ;
  4116.  
  4117.       SCREEN_LOWER_LEFT_CORNER : TEKDRIVER.SCREEN_POINT :=
  4118.          ( X => TEKDRIVER.SCREEN_X_COORDINATE_MIN ,
  4119.            Y => TEKDRIVER.SCREEN_Y_COORDINATE_MIN ) ;
  4120.  
  4121.       SCREEN_UPPER_RIGHT_CORNER : TEKDRIVER.SCREEN_POINT :=
  4122.          ( X => TEKDRIVER.SCREEN_X_COORDINATE_MAX ,
  4123.            Y => TEKDRIVER.SCREEN_Y_COORDINATE_MAX ) ;
  4124.  
  4125.    begin 
  4126.       if TRACE_PKG.REQUEST_TRACE then
  4127.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.INIT_TERMINAL") ;
  4128.       end if ;
  4129.  
  4130.       -- notify GKS of graphics device type
  4131.       TERM_TYPE := WORKSTATION ;
  4132.  
  4133.       -- Initialize the 4107.
  4134.       TEKDRIVER.TERMINAL_INITIALIZATION ;
  4135.  
  4136.       -- Set surface invisible during initialization
  4137.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4138.  
  4139.       -- Define the bit planes associated with surfaces 1 & 2
  4140.       TEKDRIVER.SET_SURFACE_DEFINITIONS( 3, 1, 0, 0 ) ;
  4141.  
  4142.       TEKDRIVER.SET_SURFACE_VISIBILITY( TEKDRIVER.SURFACE_1,
  4143.                 TEKDRIVER.SURFACE_INVISIBLE );
  4144.       TEKDRIVER.SET_SURFACE_VISIBILITY( TEKDRIVER.SURFACE_2,
  4145.                 TEKDRIVER.SURFACE_INVISIBLE );
  4146.       TEKDRIVER.SET_SURFACE_PRIORITIES(
  4147.                 TEKDRIVER.SURFACE_1,
  4148.                 TEKDRIVER.PRIORITY_2,
  4149.                 TEKDRIVER.SURFACE_2,
  4150.                 TEKDRIVER.PRIORITY_1,
  4151.                 TEKDRIVER.SURFACE_3,
  4152.                 TEKDRIVER.PRIORITY_3,
  4153.                 TEKDRIVER.SURFACE_4,
  4154.                 TEKDRIVER.PRIORITY_4 );
  4155.  
  4156.       -- Define the views used to erase the screen during a print
  4157.       -- operation.  One view is defined for each utilized surface.
  4158.       TEKDRIVER.SELECT_VIEW( CLEAR_SURFACE_1_VIEW ) ;
  4159.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_1, 0, 0 ) ;
  4160.       TEKDRIVER.SET_VIEWPORT(
  4161.          SCREEN_LOWER_LEFT_CORNER, SCREEN_UPPER_RIGHT_CORNER ) ;
  4162.  
  4163.       TEKDRIVER.SELECT_VIEW( CLEAR_SURFACE_2_VIEW ) ;
  4164.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_2, 0, 0 ) ;
  4165.       TEKDRIVER.SET_VIEWPORT(
  4166.          SCREEN_LOWER_LEFT_CORNER, SCREEN_UPPER_RIGHT_CORNER ) ;
  4167.  
  4168.       -- Assign the menu and graphics views to surface 1, and
  4169.       -- the corresponding highlight views to surface 2
  4170.  
  4171.       TEKDRIVER.SELECT_VIEW( GRAPHICS_HIGHLIGHT_VIEW ) ;
  4172.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_2, 0, 0 ) ;
  4173.  
  4174.       TEKDRIVER.SELECT_VIEW( MENU_HIGHLIGHT_VIEW ) ;
  4175.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_2, 0, 0 ) ;
  4176.  
  4177.       TEKDRIVER.SELECT_VIEW( GRAPHICS_VIEW ) ;
  4178.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_1, 0, 0 ) ;
  4179.  
  4180.       TEKDRIVER.SELECT_VIEW( MENU_VIEW ) ;
  4181.       TEKDRIVER.SET_VIEW_ATTRIBUTES( SURFACE_1, 0, 0 ) ;
  4182.  
  4183.       TEKDRIVER.SET_ALPHA_CURSOR_INDICES( 
  4184.                 CURRENT_GRAPHIC_BACKGROUND, CURRENT_GRAPHIC_BACKGROUND ) ;
  4185.  
  4186.       -- Set the pick aperture to zero, and set the error threshold
  4187.       -- to display terminal failure messages.
  4188.       TEKDRIVER.SET_PICK_APERTURE( APERTURE_WIDTH ) ;
  4189.       TEKDRIVER.SET_ERROR_THRESHOLD( TEKDRIVER.DISPLAY_FAILURES ) ;
  4190.  
  4191.       -- Define the highlight color on surface 2
  4192.       TEKDRIVER.SET_SURFACE_COLOR_MAP(
  4193.          TEKDRIVER.SURFACE_2, TEKDRIVER.COLOR_INDEX( 1 ),
  4194.          TEKDRIVER.COLOR_COORDINATE( HIGHLIGHT_COLOR.RED   * 100.0 ) , 
  4195.          TEKDRIVER.COLOR_COORDINATE( HIGHLIGHT_COLOR.GREEN * 100.0 ) ,
  4196.          TEKDRIVER.COLOR_COORDINATE( HIGHLIGHT_COLOR.BLUE  * 100.0) ) ;
  4197.  
  4198.       -- Set terminal mode to ANSI and place cursor on bottom of screen
  4199.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4200.       TEKDRIVER.SEND_ESCAPE_SEQUENCE_TO_4107( "[24;1H" ) ;
  4201.  
  4202.    exception
  4203.       when others =>
  4204.          if TRACE_PKG.REQUEST_TRACE then
  4205.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.INIT TERMINAL ");
  4206.          end if ;
  4207.          raise ;
  4208.    end INIT_TERMINAL;
  4209.  
  4210.  
  4211.    procedure CLOSE_TERMINAL is
  4212.    -- =========================================================
  4213.    -- End graphics operations at terminal and cleanup.
  4214.    -- =========================================================
  4215.  
  4216.    begin 
  4217.       if TRACE_PKG.REQUEST_TRACE then
  4218.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.CLOSE_TERMINAL") ;
  4219.       end if ;
  4220.  
  4221.       TEKDRIVER.TERMINAL_TERMINATION ;
  4222.  
  4223.    exception
  4224.       when others =>
  4225.          if TRACE_PKG.REQUEST_TRACE then
  4226.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.CLOSE TERMINAL ");
  4227.          end if ;
  4228.          raise ;
  4229.    end CLOSE_TERMINAL;
  4230.  
  4231.  
  4232.    procedure GRAPHICS_SCREEN
  4233.              ( GRAPHICS_VISIBILITY : in Boolean ) is
  4234.    -- =========================================================
  4235.    -- Turn the graphics screen on and off. 
  4236.    -- =========================================================
  4237.       VISIBILITY : TEKDRIVER.SURFACE_VISIBILITY ;
  4238.    begin 
  4239.       if TRACE_PKG.REQUEST_TRACE then
  4240.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.GRAPHICS_SCREEN") ;
  4241.       end if ;
  4242.  
  4243.       -- Place TEK into graphics mode
  4244.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4245.  
  4246.       if GRAPHICS_VISIBILITY then
  4247.          VISIBILITY := TEKDRIVER.SURFACE_VISIBLE ;
  4248.       else
  4249.          VISIBILITY := TEKDRIVER.SURFACE_INVISIBLE ;
  4250.       end if ;
  4251.  
  4252.       TEKDRIVER.SET_SURFACE_VISIBILITY( TEKDRIVER.SURFACE_1, VISIBILITY ) ;
  4253.       TEKDRIVER.SET_SURFACE_VISIBILITY( TEKDRIVER.SURFACE_2, VISIBILITY ) ;
  4254.  
  4255.       -- Place TEK into ANSI mode
  4256.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4257.    exception
  4258.       when others =>
  4259.          if TRACE_PKG.REQUEST_TRACE then
  4260.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.GRAPHICS SCREEN ");
  4261.          end if ;
  4262.          raise ;
  4263.    end GRAPHICS_SCREEN ;
  4264.  
  4265.  
  4266.    procedure DRAW
  4267.              ( OBJECT_DEFINITION : in OBJECT_DATA_RECORD ) is
  4268.    -- =========================================================
  4269.    -- draw the object described by the object definition
  4270.    -- =========================================================
  4271.       HORIZONTAL_SIDE : TEKDRIVER.TERMINAL_COORDINATE ;
  4272.       VERTICAL_SIDE   : TEKDRIVER.TERMINAL_COORDINATE ;
  4273.       RADIUS          : TEKDRIVER.TERMINAL_COORDINATE ;
  4274.       OFFSET          : TEKDRIVER.TERMINAL_COORDINATE ;
  4275.       CENTER          : TEKDRIVER.TERMINAL_POINT ;
  4276.       START_POINT     : TEKDRIVER.TERMINAL_POINT ;
  4277.       STOP_POINT      : TEKDRIVER.TERMINAL_POINT ;
  4278.       NEW_POINT       : TEKDRIVER.TERMINAL_POINT ;
  4279.  
  4280.       UPPER_LEFT_PT   : GKS_SPEC.WC.POINT ;
  4281.       LOWER_RIGHT_PT  : GKS_SPEC.WC.POINT ;
  4282.       CURRENT_PT      : GKS_SPEC.WC.POINT ;
  4283.  
  4284.       COS_45 : constant FLOAT := 0.70710 ;
  4285.  
  4286.       function MAGNITUDE
  4287.                ( FIRST_X ,
  4288.                  FIRST_Y ,
  4289.                  SECOND_X ,
  4290.                  SECOND_Y : in FLOAT )
  4291.       return FLOAT is
  4292.       -- ====================================================
  4293.       -- produces the MAGNITUDE from first point to the second point.
  4294.       -- ====================================================
  4295.          A, B, C : FLOAT ;
  4296.  
  4297.       begin -- MAGNITUDE
  4298.          A := ABS ( FIRST_X - SECOND_X ) ;
  4299.          B := ABS ( FIRST_Y - SECOND_Y ) ;
  4300.          C := TERMINAL_ACCESS_MATH.SQRT ( A * A  +  B * B ) ;
  4301.          return C ;
  4302.       exception
  4303.          when others => raise ;
  4304.       end MAGNITUDE ;
  4305.  
  4306.    begin -- DRAW
  4307.       if TRACE_PKG.REQUEST_TRACE then
  4308.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.DRAW ");
  4309.          TRACE_PKG.TRACE ( "         OPERATION =>"
  4310.             & OPERATIONS_TYPE'Image(OBJECT_DEFINITION.DESCRIPTION) ) ;
  4311.       end if ;
  4312.  
  4313.       -- Place TEK into graphics mode
  4314.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4315.  
  4316.       TEKDRIVER.SELECT_VIEW (
  4317.          TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW ));
  4318.  
  4319.       case OBJECT_DEFINITION.DESCRIPTION is
  4320.          when USE_BOX | USE_CIRCLE | USE_MARKER |
  4321.               USE_REG_POLYGON | USE_TEXT =>
  4322.             UPPER_LEFT_PT  := OBJECT_DEFINITION.REFERENCE_POINT ;
  4323.          when USE_POLYGON | USE_POLYLINE | USE_POLYMARKER =>
  4324.             UPPER_LEFT_PT  := OBJECT_DEFINITION.SHAPE_DATA_LIST( 1 ) ;
  4325.       end case ;
  4326.  
  4327.       -- If no segment is currently open then set the reference point
  4328.       -- for the segment and open the segment.
  4329.       if OPEN_SEGMENT_REQUESTED then
  4330.          TEKDRIVER.SET_PIVOT_POINT( WORLD_TO_MEMORY( UPPER_LEFT_PT )) ;
  4331.          TEKDRIVER.BEGIN_SEGMENT( CURRENT_SEGMENT ) ;
  4332.          OPEN_SEGMENT_REQUESTED := false ;
  4333.       end if ;
  4334.  
  4335.       case OBJECT_DEFINITION.DESCRIPTION is
  4336.          when USE_BOX =>
  4337.             LOWER_RIGHT_PT := OBJECT_DEFINITION.SIZE_POINT ;
  4338.  
  4339.             if CURRENT_FILL_PATTERN = GKS_SPEC.SOLID then
  4340.                TEKDRIVER.BEGIN_PANEL_BOUNDARY(
  4341.                   WORLD_TO_MEMORY( UPPER_LEFT_PT ),
  4342.                   TEKDRIVER.CURRENT_LINE_STYLE ) ;
  4343.             else
  4344.                TEKDRIVER.MOVE( WORLD_TO_MEMORY( UPPER_LEFT_PT )) ;
  4345.             end if ;
  4346.  
  4347.             CURRENT_PT.X := LOWER_RIGHT_PT.X ;
  4348.             CURRENT_PT.Y := UPPER_LEFT_PT.Y ;
  4349.             TEKDRIVER.DRAW( WORLD_TO_MEMORY( CURRENT_PT )) ;
  4350.  
  4351.             TEKDRIVER.DRAW( WORLD_TO_MEMORY( LOWER_RIGHT_PT )) ;
  4352.  
  4353.             CURRENT_PT.X := UPPER_LEFT_PT.X ;
  4354.             CURRENT_PT.Y := LOWER_RIGHT_PT.Y ;
  4355.             TEKDRIVER.DRAW( WORLD_TO_MEMORY( CURRENT_PT )) ;
  4356.  
  4357.             if CURRENT_FILL_PATTERN = GKS_SPEC.SOLID then
  4358.                TEKDRIVER.END_PANEL ;
  4359.             else
  4360.                TEKDRIVER.DRAW( WORLD_TO_MEMORY( UPPER_LEFT_PT )) ;
  4361.             end if ;
  4362.  
  4363.          when USE_CIRCLE =>
  4364.             -- normalize points to terminal type
  4365.             START_POINT := WORLD_TO_MEMORY
  4366.                ( OBJECT_DEFINITION.REFERENCE_POINT ) ;
  4367.             STOP_POINT  := WORLD_TO_MEMORY
  4368.                ( OBJECT_DEFINITION.SIZE_POINT ) ;
  4369.             -- get the shortest side of the box
  4370.             HORIZONTAL_SIDE :=
  4371.                TEKDRIVER.TERMINAL_COORDINATE( MAGNITUDE
  4372.                ( FLOAT ( START_POINT.X ) ,
  4373.                  FLOAT ( STOP_POINT.Y ) ,
  4374.                  FLOAT ( STOP_POINT.X ) ,
  4375.                  FLOAT ( STOP_POINT.Y ) ) ) ;
  4376.             VERTICAL_SIDE :=
  4377.                TEKDRIVER.TERMINAL_COORDINATE( MAGNITUDE
  4378.                ( FLOAT ( START_POINT.X ) ,
  4379.                  FLOAT ( START_POINT.Y ) ,
  4380.                  FLOAT ( START_POINT.X ) ,
  4381.                  FLOAT ( STOP_POINT.Y ) ) ) ;
  4382.             if HORIZONTAL_SIDE < VERTICAL_SIDE then
  4383.                RADIUS := HORIZONTAL_SIDE / 2 ;
  4384.             else
  4385.                RADIUS := VERTICAL_SIDE / 2 ;
  4386.             end if ;
  4387.             -- get the center point from normalized box of
  4388.             -- a square from reference point
  4389.             CENTER.X := START_POINT.X + RADIUS ;
  4390.             CENTER.Y := START_POINT.Y - RADIUS ;
  4391.             OFFSET := TEKDRIVER.TERMINAL_COORDINATE(
  4392.                      FLOAT( RADIUS ) * COS_45 ) ;
  4393.  
  4394.             NEW_POINT.X := CENTER.X ;
  4395.             NEW_POINT.Y := CENTER.Y + RADIUS ;
  4396.             TEKDRIVER.MOVE( NEW_POINT ) ;
  4397.  
  4398.             NEW_POINT.X := CENTER.X + OFFSET ;
  4399.             NEW_POINT.Y := CENTER.Y + OFFSET ;
  4400.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4401.  
  4402.             NEW_POINT.X := CENTER.X + RADIUS ;
  4403.             NEW_POINT.Y := CENTER.Y ;
  4404.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4405.  
  4406.             NEW_POINT.X := CENTER.X + OFFSET ;
  4407.             NEW_POINT.Y := CENTER.Y - OFFSET ;
  4408.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4409.  
  4410.             NEW_POINT.X := CENTER.X ;
  4411.             NEW_POINT.Y := CENTER.Y - RADIUS ;
  4412.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4413.  
  4414.             NEW_POINT.X := CENTER.X - OFFSET ;
  4415.             NEW_POINT.Y := CENTER.Y - OFFSET ;
  4416.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4417.  
  4418.             NEW_POINT.X := CENTER.X - RADIUS ;
  4419.             NEW_POINT.Y := CENTER.Y ;
  4420.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4421.  
  4422.             NEW_POINT.X := CENTER.X - OFFSET ;
  4423.             NEW_POINT.Y := CENTER.Y + OFFSET ;
  4424.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4425.  
  4426.             NEW_POINT.X := CENTER.X ;
  4427.             NEW_POINT.Y := CENTER.Y + RADIUS ;
  4428.             TEKDRIVER.DRAW( NEW_POINT ) ;
  4429.  
  4430.          when USE_MARKER =>
  4431.             TEKDRIVER.DRAW_MARKER(
  4432.                WORLD_TO_MEMORY( OBJECT_DEFINITION.REFERENCE_POINT )) ;
  4433.          when USE_POLYGON =>
  4434.             null ;
  4435.          when USE_POLYLINE =>
  4436.  
  4437.             for COORDINATE in 1..OBJECT_DEFINITION.SHAPE_LIST_LENGTH
  4438.             loop
  4439.                NEW_POINT := WORLD_TO_MEMORY(
  4440.                     OBJECT_DEFINITION.SHAPE_DATA_LIST( COORDINATE )) ;
  4441.                if COORDINATE = 1 then
  4442.                   TEKDRIVER.MOVE( NEW_POINT ) ;
  4443.                else
  4444.                   TEKDRIVER.DRAW( NEW_POINT ) ;
  4445.                end if ;
  4446.             end loop ; 
  4447.          when USE_POLYMARKER =>
  4448.             for COORDINATE in 1..OBJECT_DEFINITION.SHAPE_LIST_LENGTH
  4449.             loop
  4450.                TEKDRIVER.DRAW_MARKER( WORLD_TO_MEMORY(
  4451.                     OBJECT_DEFINITION.SHAPE_DATA_LIST( COORDINATE ))) ;
  4452.             end loop ; 
  4453.          when USE_REG_POLYGON =>
  4454.             null ; -- not supported
  4455.          when USE_TEXT =>
  4456.  
  4457.             -- If the current text precision is stroke precision
  4458.             -- then add the graphic text offset constant to generate
  4459.             -- the point defining the text location.
  4460.             if CURRENT_TEXT_PRECISION = GKS_SPEC.STROKE_PRECISION then
  4461.  
  4462.                NEW_TEXT_LOCATION.X :=
  4463.                    OBJECT_DEFINITION.REFERENCE_POINT.X ;
  4464.  
  4465.                NEW_TEXT_LOCATION.Y :=
  4466.                    OBJECT_DEFINITION.REFERENCE_POINT.Y -
  4467.                    CURRENT_CHARACTER_HEIGHT ;
  4468.             else
  4469.                NEW_TEXT_LOCATION := OBJECT_DEFINITION.REFERENCE_POINT ;
  4470.             end if ;
  4471.  
  4472.             TEKDRIVER.MOVE( WORLD_TO_MEMORY( NEW_TEXT_LOCATION )) ;
  4473.  
  4474.             TEKDRIVER.GRAPHIC_TEXT(
  4475.                OBJECT_DEFINITION.TEXT( 1..OBJECT_DEFINITION.TEXT_LENGTH )) ;
  4476.          when others =>
  4477.             null ;
  4478.       end case ; -- OBJECT_DEFINITION.DESCRIPTION
  4479.  
  4480.       -- Place TEK into ANSI mode
  4481.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4482.    exception
  4483.       when others =>
  4484.          if TRACE_PKG.REQUEST_TRACE then
  4485.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.DRAW ");
  4486.          end if ;
  4487.          raise ;
  4488.    end DRAW ;
  4489.  
  4490.    procedure SET_CHARACTER_ATTRIBUTES
  4491.              ( CHARACTER_SIZE : in CHARACTER_ATTRIBUTES ) is
  4492.    -- =========================================================
  4493.    -- Set the character attributes for graphic text output.
  4494.    -- Effect : The current character attributes ( height,
  4495.    --          width, and spacing ) are set to the specified
  4496.    --          values.
  4497.    -- =========================================================
  4498.  
  4499.    begin -- SET_CHARACTER_ATTRIBUTES
  4500.  
  4501.       if TRACE_PKG.REQUEST_TRACE then
  4502.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_CHARACTER_ATTRIBUTES") ;
  4503.       end if ;
  4504.  
  4505.       -- Save current character height to allow location adjustment
  4506.       CURRENT_CHARACTER_HEIGHT := CHARACTER_SIZE.HEIGHT ;
  4507.  
  4508.       -- Place TEK into graphics mode
  4509.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4510.  
  4511.       -- Update the graph text attributes
  4512.       TEKDRIVER.SET_GRAPHTEXT_SIZE( 
  4513.          WORLD_COORDINATE_TO_MEMORY( CHARACTER_SIZE.WIDTH ),
  4514.          WORLD_COORDINATE_TO_MEMORY( CHARACTER_SIZE.HEIGHT ),
  4515.          WORLD_COORDINATE_TO_MEMORY( CHARACTER_SIZE.SPACING )) ;
  4516.  
  4517.       -- Place TEK into ANSI mode
  4518.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4519.    exception
  4520.       when others =>
  4521.          if TRACE_PKG.REQUEST_TRACE then
  4522.             TRACE_PKG.TRACE(
  4523.                " EXCEPTION IN TERMACCES.SET_CHARACTER_ATTRIBUTES ");
  4524.          end if ;
  4525.          raise ;
  4526.    end SET_CHARACTER_ATTRIBUTES ;
  4527.    
  4528.    procedure SET_COLOR_INDEX
  4529.              ( FIGURE : in COLOR_OBJECTS;
  4530.                COLOUR : in GKS_SPEC.COLOUR_INDEX ) is
  4531.    -- =========================================================
  4532.    -- Set the colour index for use with the figure type.
  4533.    -- Effect : The current figure colour index is set to the
  4534.    --          specified value.
  4535.    -- =========================================================
  4536.       INDEX : TEKDRIVER.COLOR_INDEX :=
  4537.               TEKDRIVER.COLOR_INDEX( COLOUR ) ;
  4538.       MAPPED_COLOUR : TEKDRIVER.COLOR_INDEX :=
  4539.                       TEKDRIVER.COLOR_INDEX( COLOUR ) ;
  4540.  
  4541.    begin -- SET_COLOR_INDEX
  4542.  
  4543.       if TRACE_PKG.REQUEST_TRACE then
  4544.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_COLOR_INDEX") ;
  4545.       end if ;
  4546.  
  4547.       if INDEX > HIGHEST_COLOR_INDEX then
  4548.          INDEX := HIGHEST_COLOR_INDEX ;
  4549.       end if ;
  4550.  
  4551.       -- Set the line and text colors to the specified color
  4552.       -- if the color is available.
  4553.       if INDEX > HIGHEST_DIALOG_INDEX then
  4554.          MAPPED_COLOUR := COLOR_INDEX_MAPPING( COLOUR ) ;
  4555.       end if ;
  4556.  
  4557.       -- Place TEK into graphics mode
  4558.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4559.  
  4560.       case FIGURE is
  4561.          when ALPHA_COLOR =>
  4562.             CURRENT_CHAR_COLOR := TEKDRIVER.COLOR_INDEX( COLOUR ) ;
  4563.             TEKDRIVER.SET_DIALOG_AREA_INDEX(
  4564.                       CURRENT_CHAR_COLOR,
  4565.                       5, 0 ) ;
  4566. --                      CURRENT_CHAR_BACKGROUND, 0 ) ;
  4567.  
  4568.  
  4569.          when ALPHA_BACKGROUND =>
  4570.             CURRENT_CHAR_BACKGROUND := TEKDRIVER.COLOR_INDEX( COLOUR ) ;
  4571.             TEKDRIVER.SET_DIALOG_AREA_INDEX(
  4572.                       CURRENT_CHAR_COLOR,
  4573.                       5, 0 ) ;
  4574. --                      CURRENT_CHAR_BACKGROUND, 0 ) ;
  4575.  
  4576.          when GRAPHIC_BACKGROUND =>
  4577.             TEKDRIVER.SET_ALPHA_CURSOR_INDICES( INDEX, INDEX ) ;
  4578.             TEKDRIVER.SET_SURFACE_COLOR_MAP( TEKDRIVER.SURFACE_1, INDEX,
  4579.                TEKDRIVER.COLOR_COORDINATE(
  4580.                   COLOR_REPRESENTATION( INDEX ).RED   * 100.0 ) ,
  4581.                TEKDRIVER.COLOR_COORDINATE(
  4582.                   COLOR_REPRESENTATION( INDEX ).GREEN * 100.0 ) ,
  4583.                TEKDRIVER.COLOR_COORDINATE(
  4584.                   COLOR_REPRESENTATION( INDEX ).BLUE  * 100.0 )) ;
  4585.  
  4586.             -- ************* experiment ******************
  4587.             if INDEX <= HIGHEST_DIALOG_INDEX then
  4588.                TEKDRIVER.SET_DIALOG_AREA_COLOR_MAP( INDEX,
  4589.                   TEKDRIVER.COLOR_COORDINATE(
  4590.                      COLOR_REPRESENTATION( INDEX ).RED   * 100.0 ) ,
  4591.                   TEKDRIVER.COLOR_COORDINATE(
  4592.                      COLOR_REPRESENTATION( INDEX ).GREEN * 100.0 ) ,
  4593.                   TEKDRIVER.COLOR_COORDINATE(
  4594.                      COLOR_REPRESENTATION( INDEX ).BLUE  * 100.0 )) ;
  4595.             end if ;
  4596.  
  4597.          when FILL_COLOR =>
  4598.             TEKDRIVER.SELECT_FILL_PATTERN( -1 * INDEX ) ;
  4599.  
  4600.          when LINE_COLOR =>
  4601.             TEKDRIVER.SET_LINE_INDEX( INDEX ) ;
  4602.  
  4603.          when MARKER_COLOR =>
  4604.             TEKDRIVER.SET_TEXT_INDEX( MAPPED_COLOUR ) ;
  4605.  
  4606.          when TEXT_COLOR =>
  4607.             TEKDRIVER.SET_TEXT_INDEX( MAPPED_COLOUR ) ;
  4608.  
  4609.          when others =>
  4610.             null ;
  4611.       end case ; -- FIGURE
  4612.  
  4613.       -- Place TEK into ANSI mode
  4614.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4615.    exception
  4616.       when others =>
  4617.          if TRACE_PKG.REQUEST_TRACE then
  4618.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET COLOR INDEX ");
  4619.          end if ;
  4620.          raise ;
  4621.    end SET_COLOR_INDEX;
  4622.  
  4623.  
  4624.    procedure SET_STYLE
  4625.              ( STYLE_DEFINITION : STYLE_RECORD ) is
  4626.    -- =========================================================
  4627.    -- Set the specified style type parameter for line, fill and marker.
  4628.    -- Effect : The current style type is set to the specified value.
  4629.    --      item     Linetypes:   markertypes:
  4630.    --        1  -     solid          dot
  4631.    --        2  -     dashed         plus sign
  4632.    --        3  -     dotted         asterisk
  4633.    --        4  -   * dashed-dotted  circle
  4634.    --        5  -                  * diagonal cross
  4635.    --    * - implementation dependent
  4636.    -- =========================================================
  4637.    begin -- SET_STYLE
  4638.       if TRACE_PKG.REQUEST_TRACE then
  4639.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_STYLE") ;
  4640.       end if ;
  4641.  
  4642.       -- Place TEK into graphics mode
  4643.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4644.  
  4645.       -- general screen control
  4646.       case STYLE_DEFINITION.DESCRIPTION is
  4647.          when LINE_PATTERN =>
  4648.             TEKDRIVER.SET_LINE_STYLE(
  4649.                       GKS_LINE_TO_TEK_LINE( STYLE_DEFINITION.LINE )) ;
  4650.          when FILL_PATTERN =>
  4651.            CURRENT_FILL_PATTERN := STYLE_DEFINITION.FILL ;
  4652.          when MARKER_PATTERN =>
  4653.             TEKDRIVER.SET_MARKER_TYPE(
  4654.                       GKS_MARKER_TO_TEK_MARKER( STYLE_DEFINITION.MARKER )) ;
  4655.  
  4656.       end case ; -- STYLE_DEFINITION.DESCRIPTION
  4657.  
  4658.       -- Place TEK into ANSI mode
  4659.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4660.    exception
  4661.       when others =>
  4662.          if TRACE_PKG.REQUEST_TRACE then
  4663.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET STYLE ");
  4664.          end if ;
  4665.          raise ;
  4666.    end SET_STYLE ;
  4667.  
  4668.  
  4669.     procedure SET_TEXT_PATH
  4670.              ( PATH : in GKS_SPEC.TEXT_PATH ) is
  4671.    -- =========================================================
  4672.    -- Select the text path RIGHT, LEFT, UP, or DOWN
  4673.    -- Effect : Set the text path of character strings to the specified
  4674.    --          values for all subsequent text output primitives until
  4675.    --          the values are reset by another call to this function.
  4676.    -- =========================================================
  4677.    begin 
  4678.       if TRACE_PKG.REQUEST_TRACE then
  4679.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_TEXT_PATH") ;
  4680.       end if ;
  4681.  
  4682.       -- Place TEK into graphics mode
  4683.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4684.  
  4685.       TEKDRIVER.SET_CHARACTER_PATH(
  4686.                 GKS_TEXT_PATH_TO_TEK_TEXT_PATH( PATH )) ;
  4687.  
  4688.       -- Place TEK into ANSI mode
  4689.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4690.  
  4691.    exception
  4692.       when others =>
  4693.          if TRACE_PKG.REQUEST_TRACE then
  4694.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET TEXT PATH ");
  4695.          end if ;
  4696.          raise ;
  4697.    end SET_TEXT_PATH ;
  4698.  
  4699.  
  4700.    procedure DEFINE_COLOR
  4701.              ( INDEX  : in GKS_SPEC.COLOUR_INDEX ;
  4702.                COLOUR : in GKS_SPEC.COLOUR_REPRESENTATION ) is
  4703.    -- =========================================================
  4704.    -- Define the colour to be associated with a colour index on
  4705.    -- Effect : Redefines the entries in the colour look up table pointed
  4706.    --          at by the colour index.
  4707.    -- =========================================================
  4708.       TEK_COLOR: TEKDRIVER.COLOR_INDEX :=
  4709.                  TEKDRIVER.COLOR_INDEX( INDEX ) ;
  4710.    begin -- DEFINE_COLOR
  4711.       if TEK_COLOR > HIGHEST_COLOR_INDEX then
  4712.          TEK_COLOR := HIGHEST_COLOR_INDEX ;
  4713.       end if ;
  4714.  
  4715.       if TRACE_PKG.REQUEST_TRACE then
  4716.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.DEFINE_COLOR") ;
  4717.       end if ;
  4718.  
  4719.       -- If the background color is being defined ( index = 0 ), then
  4720.       -- set the background color to white;
  4721.       -- Else save the received color specification.
  4722.       if TEK_COLOR = BACKGROUND_INDEX then
  4723.          COLOR_REPRESENTATION( BACKGROUND_INDEX ) := WHITE_BACKGROUND ;
  4724.       else
  4725.          COLOR_REPRESENTATION( TEK_COLOR ) := COLOUR ;
  4726.       end if ;
  4727.  
  4728.       -- Place TEK into graphics mode
  4729.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4730.  
  4731.       TEKDRIVER.SET_SURFACE_COLOR_MAP( TEKDRIVER.SURFACE_1, TEK_COLOR,
  4732.          TEKDRIVER.COLOR_COORDINATE( COLOUR.RED   * 100.0 ) ,
  4733.          TEKDRIVER.COLOR_COORDINATE( COLOUR.GREEN * 100.0 ),
  4734.          TEKDRIVER.COLOR_COORDINATE( COLOUR.BLUE  * 100.0 )) ;
  4735.  
  4736.       if TEK_COLOR <= HIGHEST_DIALOG_INDEX then
  4737.          TEKDRIVER.SET_DIALOG_AREA_COLOR_MAP( TEK_COLOR,
  4738.             TEKDRIVER.COLOR_COORDINATE( COLOUR.RED   * 100.0 ),
  4739.             TEKDRIVER.COLOR_COORDINATE( COLOUR.GREEN * 100.0 ),
  4740.             TEKDRIVER.COLOR_COORDINATE( COLOUR.BLUE  * 100.0 )) ;
  4741.       end if ;
  4742.  
  4743.       -- Place TEK into ANSI mode
  4744.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4745.  
  4746.    exception
  4747.       when others =>
  4748.          if TRACE_PKG.REQUEST_TRACE then
  4749.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.DEFINE COLOR ");
  4750.          end if ;
  4751.          raise ;
  4752.    end DEFINE_COLOR ;
  4753.  
  4754.    procedure PLACE_CURSOR
  4755.              ( LOCATION : in GKS_SPEC.WC.POINT ) is
  4756.    -- =========================================================
  4757.    -- Effect : Relocates the graphics cursor to the specified location.
  4758.    -- =========================================================
  4759.    begin
  4760.  
  4761.       if TRACE_PKG.REQUEST_TRACE then
  4762.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.PLACE_CURSOR") ;
  4763.       end if ;
  4764.       -- Place TEK into graphics mode
  4765.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4766.  
  4767.       TEKDRIVER.SET_SEGMENT_POSITION( CURSOR_SEGMENT,
  4768.                 WORLD_TO_MEMORY ( LOCATION ) ) ;
  4769.       -- Place TEK into ANSI mode
  4770.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4771.  
  4772.    end PLACE_CURSOR ;
  4773.  
  4774.    procedure PRINT_SCREEN
  4775.              ( WINDOW : in Natural := 0 ) is
  4776.    -- =========================================================
  4777.    -- Print all visible segments.
  4778.    -- Effect : For the specified workstation, all deferred actions are
  4779.    --          executed, the display surface is printed to the local
  4780.    --          printer attached to the terminal.
  4781.    -- =========================================================
  4782.    begin -- PRINT_SCREEN
  4783.  
  4784.       if TRACE_PKG.REQUEST_TRACE then
  4785.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.PRINT_SCREEN ") ;
  4786.       end if ;
  4787.  
  4788.       -- Place TEK into graphics mode
  4789.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4790.  
  4791.       -- Erase the utilized surfaces
  4792.       TEKDRIVER.RENEW_VIEW( CLEAR_SURFACE_1_VIEW ) ;
  4793.       TEKDRIVER.RENEW_VIEW( CLEAR_SURFACE_2_VIEW ) ;
  4794.  
  4795.       -- Redraw the request view
  4796.       TEKDRIVER.RENEW_VIEW( TEKDRIVER.VIEW_NUMBER( WINDOW ));
  4797.  
  4798.       -- Perform the print operation
  4799.       TEKDRIVER.SELECT_HARDCOPY_INTERFACE( TEKDRIVER.TEK_4695 ) ;
  4800.  
  4801.       -- TEKDRIVER.SET_COPY_SIZE( TEKDRIVER.SMALLER_SIZE ) ;
  4802.       TEKDRIVER.SET_COPY_SIZE( TEKDRIVER.DEFAULT_SIZE ) ;
  4803.  
  4804.       TEKDRIVER.SET_DIALOG_AREA_HARDCOPY_ATTRIBUTES (
  4805.          TEKDRIVER.NUMBER_OF_PAGES( 1 ),
  4806.          TEKDRIVER.FIRST_LINE,
  4807.          TEKDRIVER.IGNORE_FF ) ;
  4808.       TEKDRIVER.HARDCOPY( TEKDRIVER.POSITIVE_HARDCOPY ) ;
  4809.  
  4810.       -- Erase the displayed view
  4811.       TEKDRIVER.RENEW_VIEW( CLEAR_SURFACE_1_VIEW ) ;
  4812.  
  4813.       -- Place TEK into ANSI mode
  4814.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4815.  
  4816.    exception
  4817.       when others =>
  4818.          if TRACE_PKG.REQUEST_TRACE then
  4819.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.PRINT_SCREEN ");
  4820.          end if ;
  4821.          raise ;
  4822.    end PRINT_SCREEN ;
  4823.  
  4824.    function REQUEST_LOCATOR
  4825.              ( DEVICE : in  GKS_SPEC.DEVICE_NUMBER )
  4826.    return GKS_SPEC.WC.POINT is
  4827.    -- =========================================================
  4828.    -- Request position in WC and normalization transformation number
  4829.    -- from a locator device
  4830.    -- Effect : Perform a request on the specified locator device.
  4831.    -- =========================================================
  4832.       KEY_PRESSED     : CHARACTER ;
  4833.       CURSOR_LOCATION : TEKDRIVER.TERMINAL_POINT ;
  4834.       SEGMENT_NUMBER  : TEKDRIVER.SEGMENT_IDENTIFIER ;
  4835.       PICK_ID_NUMBER  : TEKDRIVER.PICK_ID_IDENTIFIER ;
  4836.       VALID_REPORT    : BOOLEAN := false ;
  4837.       POSITION        : GKS_SPEC.WC.POINT ;
  4838.  
  4839.    begin 
  4840.       if TRACE_PKG.REQUEST_TRACE then
  4841.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.REQUEST_LOCATOR") ;
  4842.       end if ;
  4843.  
  4844.       -- Place TEK into graphics mode
  4845.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4846.  
  4847.       while not VALID_REPORT
  4848.       loop
  4849.          begin
  4850.             TEKDRIVER.ENABLE_GIN(
  4851.                       TEKDRIVER.JOYDISK,
  4852.                       TEKDRIVER.LOCATOR,
  4853.                       TEKDRIVER.NUMBER_OF_GIN_EVENTS( 1 )) ;
  4854.  
  4855.             TEKDRIVER.GRAPHICS_INPUT_REPORT(
  4856.                       KEY_PRESSED,
  4857.                       CURSOR_LOCATION,
  4858.                       SEGMENT_NUMBER,
  4859.                       PICK_ID_NUMBER ) ;
  4860.  
  4861.             VALID_REPORT := true ;
  4862.          exception
  4863.             when others =>
  4864.             if TRACE_PKG.REQUEST_TRACE then
  4865.                TRACE_PKG.TRACE ( "TERMINAL_ACCESS.REQUEST_LOCATOR" &
  4866.                      " - INVALID LOCATOR INPUT ") ;
  4867.             end if ;
  4868.          end ;
  4869.       end loop ;
  4870.  
  4871.       POSITION   := MEMORY_TO_WORLD ( CURSOR_LOCATION ) ;
  4872.  
  4873.       -- Place TEK into ANSI mode
  4874.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4875.  
  4876.       return POSITION ;
  4877.    exception
  4878.       when others =>
  4879.          if TRACE_PKG.REQUEST_TRACE then
  4880.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.REQUEST LOCATOR ");
  4881.          end if ;
  4882.          raise ;
  4883.    end REQUEST_LOCATOR ;
  4884.  
  4885.  
  4886.    procedure SEGMENT_OPERATION
  4887.              ( SELECTION  : in SEGMENT_OPERATIONS_TYPE ;
  4888.                SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ) is
  4889.    -- =========================================================
  4890.    -- FINISH Segment construction finished
  4891.    -- Effect : Close the currently open segment.  Primitives may no longer
  4892.    --          be added to the closed segment.
  4893.    -- START a segment and start constructing it
  4894.    -- Effect : Create a segment.  Subsequent calls to output primitive
  4895.    --          functions will place the primitives into the currently
  4896.    --          open segment.
  4897.    -- DESTROY a segment
  4898.    -- Effect : Delete all copies of the specified segment stored in
  4899.    --          GKS.  The segment name may be reused.
  4900.    -- REDRAW a visible segment.
  4901.    -- Effect : For the specified workstation, the visible segment
  4902.    --  is displayed.
  4903.    -- =========================================================
  4904.       TERMINAL_SEGMENT : TEKDRIVER.SEGMENT_IDENTIFIER ;
  4905.  
  4906.    begin 
  4907.       if TRACE_PKG.REQUEST_TRACE then
  4908.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SEGMENT_OPERATION") ;
  4909.          TRACE_PKG.TRACE ( "            OPERATION =>"
  4910.             & SEGMENT_OPERATIONS_TYPE'Image ( SELECTION ) ) ;
  4911.          TRACE_PKG.TRACE ( "          GKS SEGMENT =>"
  4912.             & GKS_SPEC.SEGMENT_NAME'Image ( SEGMENT_ID ) ) ;
  4913.       end if ;
  4914.  
  4915.       -- Place TEK into graphics mode
  4916.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4917.  
  4918.       case SELECTION is
  4919.          when FINISH =>
  4920.             TEKDRIVER.END_SEGMENT ;
  4921.             TEKDRIVER.SET_SEGMENT_DETECTABILITY (
  4922.                       CURRENT_SEGMENT, TEKDRIVER.CAN_BE_PICKED ) ;
  4923.             TEKDRIVER.SET_SEGMENT_DISPLAY_PRIORITY ( CURRENT_SEGMENT,
  4924.                       TEKDRIVER.PRIORITY_NUMBER( CURRENT_SEGMENT )) ;
  4925.  
  4926.          when START =>
  4927.             CURRENT_SEGMENT := TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ) ;
  4928.             OPEN_SEGMENT_REQUESTED := true ;
  4929.  
  4930.          when DESTROY =>
  4931.  
  4932.             TEKDRIVER.SELECT_VIEW (
  4933.                TEKDRIVER.VIEW_NUMBER(
  4934.                CURRENT_VIEW + INITIAL_HIGHLIGHT_VIEW ));
  4935.  
  4936.             TEKDRIVER.DELETE_SEGMENT(
  4937.                       TEKDRIVER.SEGMENT_IDENTIFIER(
  4938.                       TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ) +
  4939.                       INITIAL_HIGHLIGHT_SEGMENT )) ;
  4940.  
  4941.             TEKDRIVER.SELECT_VIEW (
  4942.                TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW ));
  4943.  
  4944.             TEKDRIVER.DELETE_SEGMENT(
  4945.                       TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID )) ;
  4946.  
  4947.          when REDRAW =>
  4948.             TEKDRIVER.RENEW_VIEW( GRAPHICS_VIEW ) ;
  4949.  
  4950.          when others =>
  4951.             null ;
  4952.       end case ; -- SELECTION
  4953.  
  4954.       -- Place TEK into ANSI mode
  4955.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4956.  
  4957.    exception
  4958.       when others =>
  4959.          if TRACE_PKG.REQUEST_TRACE then
  4960.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SEGMENT OOPERATION ");
  4961.          end if ;
  4962.          raise ;
  4963.    end SEGMENT_OPERATION ;
  4964.  
  4965.  
  4966.    procedure MOVE_SEGMENT
  4967.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  4968.                LOCATION   : in GKS_SPEC.WC.POINT ) is
  4969.    -- =========================================================
  4970.    -- relocates segment
  4971.    -- Effect : Sets the reference point of the segment to new location.
  4972.    -- =========================================================
  4973.    begin 
  4974.       if TRACE_PKG.REQUEST_TRACE then
  4975.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.MOVE-SEGMENT") ;
  4976.       end if ;
  4977.       -- Place TEK into graphics mode
  4978.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  4979.  
  4980.       TEKDRIVER.SET_SEGMENT_POSITION(
  4981.                 TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ),
  4982.                 WORLD_TO_MEMORY ( LOCATION ) ) ;
  4983.       -- Place TEK into ANSI mode
  4984.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  4985.    exception
  4986.       when others =>
  4987.          if TRACE_PKG.REQUEST_TRACE then
  4988.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.MOVE SEGMENT ");
  4989.          end if ;
  4990.          raise ;
  4991.    end MOVE_SEGMENT ;
  4992.  
  4993.  
  4994.    procedure RENAME_SEGMENT
  4995.              ( OLD_SEGMENT_NAME : in GKS_SPEC.SEGMENT_NAME ;
  4996.                NEW_SEGMENT_NAME : in GKS_SPEC.SEGMENT_NAME ) is
  4997.    -- =========================================================
  4998.    -- Change name of a segment
  4999.    -- Effect : Rename the specified segment.  The old segment name
  5000.    --          may be reused.
  5001.    -- =========================================================
  5002.    begin 
  5003.       if TRACE_PKG.REQUEST_TRACE then
  5004.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.RENAME_SEGMENT") ;
  5005.       end if ;
  5006.       -- Place TEK into graphics mode
  5007.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5008.  
  5009.       TEKDRIVER.RENAME_SEGMENT(
  5010.                 TEKDRIVER.SEGMENT_IDENTIFIER( OLD_SEGMENT_NAME ),
  5011.                 TEKDRIVER.SEGMENT_IDENTIFIER( NEW_SEGMENT_NAME )) ;
  5012.       -- Place TEK into ANSI mode
  5013.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5014.  
  5015.    exception
  5016.       when others =>
  5017.          if TRACE_PKG.REQUEST_TRACE then
  5018.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.RENAME SEGMENT ") ;
  5019.          end if ;
  5020.          raise ;
  5021.    end RENAME_SEGMENT ;
  5022.  
  5023.  
  5024.    procedure SET_HIGHLIGHTING
  5025.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  5026.                HIGHLIGHT  : in GKS_SPEC.SEGMENT_HIGHLIGHTING ) is
  5027.    -- =========================================================
  5028.    -- Mark segment normal or highlighted
  5029.    -- Effect : Set the highlighting attribute to the value
  5030.    --          HIGHLIGHTED or NORMAL.
  5031.    -- =========================================================
  5032.  
  5033.    begin 
  5034.       if TRACE_PKG.REQUEST_TRACE then
  5035.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET-HIGHLIGHTING") ;
  5036.       end if ;
  5037.       -- Place TEK into graphics mode
  5038.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5039.  
  5040.       TEKDRIVER.SELECT_VIEW (
  5041.          TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW + INITIAL_HIGHLIGHT_VIEW ));
  5042.  
  5043.       if HIGHLIGHT = GKS_SPEC.HIGHLIGHTED then
  5044.  
  5045.          TEKDRIVER.BEGIN_SEGMENT(
  5046.             TEKDRIVER.SEGMENT_IDENTIFIER(
  5047.                TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ) +
  5048.                INITIAL_HIGHLIGHT_SEGMENT )) ;
  5049.          TEKDRIVER.INCLUDE_COPY_OF_SEGMENT(
  5050.             TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID )) ;
  5051.          TEKDRIVER.END_SEGMENT ;
  5052.  
  5053.       -- Set the segment highlight to normal by deleting the segment
  5054.       -- containing the redraw segment
  5055.       else
  5056.  
  5057.          TEKDRIVER.DELETE_SEGMENT(
  5058.             TEKDRIVER.SEGMENT_IDENTIFIER(
  5059.             TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ) +
  5060.                INITIAL_HIGHLIGHT_SEGMENT )) ;
  5061.  
  5062.       end if ;
  5063.  
  5064. --      TEKDRIVER.RENEW_VIEW(
  5065. --         TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW + INITIAL_HIGHLIGHT_VIEW ));
  5066.  
  5067.       TEKDRIVER.SELECT_VIEW ( CURRENT_VIEW ) ;
  5068.  
  5069.       -- Place TEK into ANSI mode
  5070.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5071.    exception
  5072.       when others =>
  5073.          if TRACE_PKG.REQUEST_TRACE then
  5074.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET HIGHLIGHTING ");
  5075.          end if ;
  5076.          raise ;
  5077.    end SET_HIGHLIGHTING;
  5078.  
  5079.    procedure SET_SEGMENT_PRIORITY
  5080.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  5081.                PRIORITY   : in GKS_SPEC.SEGMENT_PRIORITY ) is
  5082.    -- =========================================================
  5083.    -- Set priority of a segment
  5084.    -- Effect : Set the priority of the specified segment to the specified
  5085.    --          priority.  Priority is a value in the range 0 to 1.
  5086.    -- =========================================================
  5087.       TEK_PRIORITY : TEKDRIVER.PRIORITY_NUMBER :=
  5088.                      32767 * TEKDRIVER.PRIORITY_NUMBER( PRIORITY ) ;
  5089.    begin 
  5090.       if TRACE_PKG.REQUEST_TRACE then
  5091.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_SEGMENT_PRIORITY") ;
  5092.       end if ;
  5093.       -- Place TEK into graphics mode
  5094.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5095.  
  5096.       TEKDRIVER.SET_SEGMENT_DISPLAY_PRIORITY(
  5097.                 TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ),
  5098.                 TEK_PRIORITY ) ;
  5099.       -- Place TEK into ANSI mode
  5100.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5101.  
  5102.    exception
  5103.       when others =>
  5104.          if TRACE_PKG.REQUEST_TRACE then
  5105.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET SEGMENT PRIORITY ");
  5106.          end if ;
  5107.          raise ;
  5108.    end SET_SEGMENT_PRIORITY ;
  5109.  
  5110.  
  5111.    procedure REDRAW_ALL_SEGMENTS is
  5112.    -- =========================================================
  5113.    -- Redraw all visible segments stored.
  5114.    -- Effect : For the specified workstation, all deferred actions are
  5115.    --          executed, the display surface is cleared if not empty,
  5116.    --          and all visible segments are displayed.
  5117.    -- =========================================================
  5118.    begin 
  5119.       if TRACE_PKG.REQUEST_TRACE then
  5120.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.REDRAW_ALL_SEGMENTS") ;
  5121.       end if ;
  5122.       -- Place TEK into graphics mode
  5123.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5124.  
  5125.       -- Redraw all defined views
  5126.       TEKDRIVER.RENEW_VIEW( GRAPHICS_VIEW ) ;
  5127.       TEKDRIVER.RENEW_VIEW( MENU_VIEW ) ;
  5128.       TEKDRIVER.RENEW_VIEW( GRAPHICS_HIGHLIGHT_VIEW ) ;
  5129.       TEKDRIVER.RENEW_VIEW( MENU_HIGHLIGHT_VIEW ) ;
  5130.  
  5131.       -- Place TEK into ANSI mode
  5132.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5133.  
  5134.    exception
  5135.       when others =>
  5136.          if TRACE_PKG.REQUEST_TRACE then
  5137.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.REDRAW ALL SEGMENTS ");
  5138.          end if ;
  5139.          raise ;
  5140.    end REDRAW_ALL_SEGMENTS ;
  5141.  
  5142.  
  5143.    procedure SET_TEXT_PRECISION
  5144.              ( PRECISION : in GKS_SPEC.TEXT_PRECISION ) is
  5145.    -- =========================================================
  5146.    -- Set the text precision to string, char, or stroke precision.
  5147.    -- Effect : Set the text precision of character strings to
  5148.    --          the specified value for all subsequent text
  5149.    --          output primitives until the values are reset by
  5150.    --          another call to this function.
  5151.    -- =========================================================
  5152.    begin 
  5153.       if TRACE_PKG.REQUEST_TRACE then
  5154.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_TEXT_PRECISION") ;
  5155.       end if ;
  5156.       -- Place TEK into graphics mode
  5157.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5158.  
  5159.       -- Set the text precision
  5160.       TEKDRIVER.SET_GRAPHTEXT_PRECISION(
  5161.          GKS_PRECISION_TO_TEK_PRECISION ( PRECISION )) ;
  5162.  
  5163.       -- Place TEK into ANSI mode
  5164.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5165.  
  5166.    exception
  5167.       when others =>
  5168.          if TRACE_PKG.REQUEST_TRACE then
  5169.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET_TEXT_PRECISION ");
  5170.          end if ;
  5171.          raise ;
  5172.    end SET_TEXT_PRECISION ;
  5173.  
  5174.  
  5175.    procedure SET_VISIBILITY
  5176.              ( SEGMENT_ID : in GKS_SPEC.SEGMENT_NAME ;
  5177.                VISIBILITY : in GKS_SPEC.SEGMENT_VISIBILITY ) is
  5178.    -- =========================================================
  5179.    -- Mark segment visible or invisible
  5180.    -- Effect : Set the visibility attributes of the specified segment
  5181.    --          to VISIBLE or INVISIBLE.
  5182.    -- =========================================================
  5183.    begin 
  5184.       if TRACE_PKG.REQUEST_TRACE then
  5185.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_VISIBILITY") ;
  5186.       end if ;
  5187.       -- Place TEK into graphics mode
  5188.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5189.  
  5190.       TEKDRIVER.SELECT_VIEW (
  5191.          TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW + INITIAL_HIGHLIGHT_VIEW ));
  5192.  
  5193.       TEKDRIVER.SET_SEGMENT_VISIBILITY(
  5194.                 TEKDRIVER.SEGMENT_IDENTIFIER(
  5195.                 TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ) +
  5196.                 INITIAL_HIGHLIGHT_SEGMENT ),
  5197.                 GKS_VISIBILITY_TO_TEK_VISIBILITY( VISIBILITY )) ;
  5198.  
  5199.       TEKDRIVER.SELECT_VIEW (
  5200.          TEKDRIVER.VIEW_NUMBER( CURRENT_VIEW ));
  5201.  
  5202.       TEKDRIVER.SET_SEGMENT_VISIBILITY(
  5203.                 TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ),
  5204.                 GKS_VISIBILITY_TO_TEK_VISIBILITY( VISIBILITY )) ;
  5205.  
  5206.       -- Place TEK into ANSI mode
  5207.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5208.  
  5209.    exception
  5210.       when others =>
  5211.          if TRACE_PKG.REQUEST_TRACE then
  5212.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET VISIBILITY ");
  5213.          end if ;
  5214.          raise ;
  5215.    end SET_VISIBILITY ;
  5216.  
  5217.  
  5218.    function REQUEST_PICK
  5219.             ( DEVICE : in  GKS_SPEC.DEVICE_NUMBER )
  5220.    return GKS_SPEC.PICK_DATA_RECORD is
  5221.    -- =========================================================
  5222.    -- Request segment name, pick identifier and pick status from a
  5223.    -- pick device
  5224.    -- Effect : Perform a request on the specified pick device.
  5225.    -- =========================================================
  5226.       KEY_PRESSED     : CHARACTER ;
  5227.       CURSOR_LOCATION : TEKDRIVER.TERMINAL_POINT ;
  5228.       SEGMENT_NUMBER  : TEKDRIVER.SEGMENT_IDENTIFIER ;
  5229.       PICK_ID_NUMBER  : TEKDRIVER.PICK_ID_IDENTIFIER ;
  5230.       VALID_REPORT    : BOOLEAN := false ;
  5231.       POSITION        : GKS_SPEC.WC.POINT ;
  5232.       PICK_RECORD     : GKS_SPEC.PICK_DATA_RECORD ;
  5233.  
  5234.    begin 
  5235.       if TRACE_PKG.REQUEST_TRACE then
  5236.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.REQUEST_PICK") ;
  5237.       end if ;
  5238.       -- Place TEK into graphics mode
  5239.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5240.  
  5241.       while not VALID_REPORT
  5242.       loop
  5243.          begin
  5244.             TEKDRIVER.ENABLE_GIN(
  5245.                       TEKDRIVER.JOYDISK,
  5246.                       TEKDRIVER.PICK ,
  5247.                       TEKDRIVER.NUMBER_OF_GIN_EVENTS( 1 )) ;
  5248.  
  5249.             TEKDRIVER.GRAPHICS_INPUT_REPORT(
  5250.                       KEY_PRESSED,
  5251.                       CURSOR_LOCATION,
  5252.                       SEGMENT_NUMBER,
  5253.                       PICK_ID_NUMBER ) ;
  5254.  
  5255.             VALID_REPORT := true ;
  5256.          exception
  5257.             when others =>
  5258.             if TRACE_PKG.REQUEST_TRACE then
  5259.                TRACE_PKG.TRACE ( "TERMINAL_ACCESS.REQUEST_PICK" &
  5260.                      " - INVALID PICK INPUT ") ;
  5261.             end if ;
  5262.          end ;
  5263.       end loop ;
  5264.  
  5265.       -- Place TEK into ANSI mode
  5266.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5267.  
  5268.       PICK_RECORD.PICK_STATUS  := GKS_SPEC.PICK_REQUEST_STATUS'( OK ) ;
  5269.       PICK_RECORD.PICK_SEGMENT := GKS_SPEC.SEGMENT_NAME( SEGMENT_NUMBER ) ;
  5270.       PICK_RECORD.OBJECT_ID    := GKS_SPEC.PICK_ID( PICK_ID_NUMBER ) ;
  5271.       return PICK_RECORD ;
  5272.  
  5273.    exception
  5274.       when others =>
  5275.          if TRACE_PKG.REQUEST_TRACE then
  5276.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.REQUEST PICK ");
  5277.          end if ;
  5278.          raise ;
  5279.    end REQUEST_PICK ;
  5280.  
  5281.  
  5282.    procedure SET_DETECTABILITY
  5283.              ( SEGMENT_ID    : in GKS_SPEC.SEGMENT_NAME ;
  5284.                DETECTABILITY : in GKS_SPEC.SEGMENT_DETECTABILITY ) is
  5285.    -- =========================================================
  5286.    -- Mark segment undetectable or detectable
  5287.    -- Effect : Set the detectability attributes of the specified segment
  5288.    --          to DETECTABLE or UNDETECTABLE.
  5289.    -- =========================================================
  5290.    begin 
  5291.       if TRACE_PKG.REQUEST_TRACE then
  5292.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_DETECTABILITY") ;
  5293.       end if ;
  5294.       -- Place TEK into graphics mode
  5295.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5296.       TEKDRIVER.SET_SEGMENT_DETECTABILITY (
  5297.                 TEKDRIVER.SEGMENT_IDENTIFIER( SEGMENT_ID ),
  5298.                 GKS_DETECTABILITY_TO_TEK_DETECTABILITY( DETECTABILITY )) ;
  5299.  
  5300.       -- Place TEK into ANSI mode
  5301.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5302.    exception
  5303.       when others =>
  5304.          if TRACE_PKG.REQUEST_TRACE then
  5305.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET DETECTABILITY ");
  5306.          end if ;
  5307.          raise ;
  5308.    end SET_DETECTABILITY ;
  5309.  
  5310.    procedure MAP_WINDOW_TO_VIEWPORT
  5311.              ( WINDOW               : in NATURAL ;
  5312.                UPPER_LEFT_WINDOW ,
  5313.                LOWER_RIGHT_WINDOW ,
  5314.                UPPER_LEFT_VIEWPORT ,
  5315.                LOWER_RIGHT_VIEWPORT : in GKS_SPEC.WC.POINT ) is
  5316.    -- =========================================================
  5317.    -- Creates windows at the terminal.
  5318.    -- Effect : All subsequent window references will occur in the
  5319.    --          selected viewport.
  5320.    -- =========================================================
  5321.       TEK_UPPER_LEFT  : TEKDRIVER.TERMINAL_POINT ;
  5322.       TEK_LOWER_RIGHT : TEKDRIVER.TERMINAL_POINT ;
  5323.  
  5324.    begin 
  5325.       if TRACE_PKG.REQUEST_TRACE then
  5326.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.MAP_WINDOW_TO_VIEWPORT") ;
  5327.       end if ;
  5328.       -- Place TEK into graphics mode
  5329.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5330.  
  5331.       CURRENT_VIEW := TEKDRIVER.VIEW_NUMBER( WINDOW );
  5332.  
  5333.       TEKDRIVER.SELECT_VIEW ( INITIAL_HIGHLIGHT_VIEW +
  5334.                               TEKDRIVER.VIEW_NUMBER( WINDOW ));
  5335.  
  5336.       TEKDRIVER.SET_WINDOW( WORLD_TO_MEMORY( UPPER_LEFT_WINDOW ),
  5337.                             WORLD_TO_MEMORY( LOWER_RIGHT_WINDOW )) ;
  5338.  
  5339.       TEKDRIVER.SET_VIEWPORT( WORLD_TO_SCREEN( UPPER_LEFT_VIEWPORT ),
  5340.                               WORLD_TO_SCREEN( LOWER_RIGHT_VIEWPORT ));
  5341.  
  5342.       -- Redraw all segment in the view.
  5343.       TEKDRIVER.RENEW_VIEW ( INITIAL_HIGHLIGHT_VIEW +
  5344.                              TEKDRIVER.VIEW_NUMBER( WINDOW ));
  5345.  
  5346.       TEKDRIVER.SELECT_VIEW ( TEKDRIVER.VIEW_NUMBER( WINDOW ));
  5347.  
  5348.       TEKDRIVER.SET_WINDOW( WORLD_TO_MEMORY( UPPER_LEFT_WINDOW ),
  5349.                             WORLD_TO_MEMORY( LOWER_RIGHT_WINDOW )) ;
  5350.  
  5351.       TEKDRIVER.SET_VIEWPORT( WORLD_TO_SCREEN( UPPER_LEFT_VIEWPORT ),
  5352.                               WORLD_TO_SCREEN( LOWER_RIGHT_VIEWPORT ));
  5353.  
  5354.       -- Redraw all segment in the view.
  5355.       TEKDRIVER.RENEW_VIEW ( TEKDRIVER.VIEW_NUMBER( WINDOW ));
  5356.  
  5357.       -- Place TEK into ANSI mode
  5358.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5359.       if TRACE_PKG.REQUEST_TRACE then
  5360.          TRACE_PKG.TRACE ( "VIEWPORT.X = " & 
  5361.                NATURAL'IMAGE( NATURAL( UPPER_LEFT_VIEWPORT.X ) )) ;
  5362.          TRACE_PKG.TRACE ( "VIEWPORT.Y = " & 
  5363.                NATURAL'IMAGE( NATURAL( UPPER_LEFT_VIEWPORT.Y ) )) ;
  5364.       end if ;
  5365.  
  5366.    exception
  5367.       when others =>
  5368.          if TRACE_PKG.REQUEST_TRACE then
  5369.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.MAP WINDOW TO VIEWPORT ");
  5370.          end if ;
  5371.          raise ;
  5372.    end MAP_WINDOW_TO_VIEWPORT ;
  5373.  
  5374.  
  5375.    procedure SET_CURRENT_WINDOW
  5376.              ( WINDOW : in NATURAL ) is
  5377.    -- =========================================================
  5378.    -- Selects the current active window
  5379.    -- Effect : All subsequent drawing will occur in the new current
  5380.    -- window.
  5381.    -- =========================================================
  5382.    begin 
  5383.       if TRACE_PKG.REQUEST_TRACE then
  5384.          TRACE_PKG.TRACE ( "TERMINAL_ACCESS.SET_CURRENT_WINDOW") ;
  5385.       end if ;
  5386.  
  5387.       -- Place TEK into graphics mode
  5388.       TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5389.  
  5390.       CURRENT_VIEW := TEKDRIVER.VIEW_NUMBER( WINDOW );
  5391.  
  5392.       TEKDRIVER.SELECT_VIEW ( TEKDRIVER.VIEW_NUMBER( WINDOW ));
  5393.  
  5394.       -- Place TEK into ANSI mode
  5395.       TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5396.  
  5397.       -- Set the text precision as a function of the current window.
  5398.       If CURRENT_VIEW = GRAPHICS_VIEW then
  5399.          CURRENT_TEXT_PRECISION := GKS_SPEC.STROKE_PRECISION ;
  5400.       else -- current view is MENU_VIEW
  5401.          CURRENT_TEXT_PRECISION := GKS_SPEC.CHAR_PRECISION ;
  5402.       end if ;
  5403.  
  5404.    exception
  5405.       when others =>
  5406.          if TRACE_PKG.REQUEST_TRACE then
  5407.             TRACE_PKG.TRACE(" EXCEPTION IN TERMACCES.SET CURRENT WINDOW ");
  5408.          end if ;
  5409.          raise ;
  5410.    end SET_CURRENT_WINDOW ;
  5411.  
  5412. begin
  5413.    -- Place TEK into graphics mode
  5414.    TEKDRIVER.SELECT_CODE( TEKDRIVER.TEK ) ;
  5415.    -- Specify the number of lines available in ansi mode
  5416.    TEKDRIVER.SET_DIALOG_AREA_LINES( TEKDRIVER.DIALOG_LINES'( 24 )) ;
  5417.    -- Place TEK into ANSI mode
  5418.    TEKDRIVER.SELECT_CODE( TEKDRIVER.ANSI ) ;
  5419.  
  5420. end TERMINAL_ACCESS ;
  5421. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5422. --virtual_terminal_interface_spec.ada
  5423. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5424. -- version 85-07-16-1530 by JL
  5425.  
  5426. with SYSTEM     ;
  5427.  
  5428. package VIRTUAL_TERMINAL_INTERFACE is
  5429. -- ==================================================================
  5430. --
  5431. --  The VIRTUAL_TERMINAL_INTERFACE package provides a device
  5432. --  independent set of subprograms which provide alphanumeric text
  5433. --  services. The primary function of this package is to support
  5434. --  alphanumeric I/O to the alphanumeric window.
  5435. --
  5436. --  In particular this package will support a scroll region of two
  5437. --  lines on the bottom of the terminal screen for use in prompting
  5438. --  for and reading interactive text.
  5439. --
  5440. -- ===================================================================
  5441.  
  5442.    --{{ Suggested pragmas to speed performance of this critical
  5443.    --{{ low level interface
  5444.    -- pragma suppress ( division_check ) ;
  5445.    -- pragma suppress ( overflow_check ) ;
  5446.    -- pragma suppress ( index_check ) ;
  5447.    -- pragma suppress ( range_check ) ;
  5448.    -- pragma suppress ( length_check ) ;
  5449.  
  5450.    ------------------------------------------------------------
  5451.    --  One enumeration value for each possible keypad key value
  5452.    --  (including usage of the GOLD key).
  5453.    -------------------------------------------------------------
  5454.    type KEYPAD_KEY_TYPE is
  5455.         ( GOLD , PF2 , PF3 , PF4 , KP7 , KP8 , KP9 ,
  5456.           KPhypen , KP4 , KP5 , KP6 , KPcomma ,
  5457.           KP1 , KP2 , KP3 , KP0 , KPdot , ENTER ,
  5458.           GOLD_PF2 , GOLD_PF3 , GOLD_PF4 , GOLD_KP7 ,
  5459.           GOLD_KP8 , GOLD_KP9 , GOLD_KPhypen ,
  5460.           GOLD_KP4 , GOLD_KP5 , GOLD_KP6 , GOLD_KPcomma ,
  5461.           GOLD_KP1 , GOLD_KP2 , GOLD_KP3 , GOLD_KP0 ,
  5462.           GOLD_KPdot , GOLD_ENTER ,
  5463.           UP_ARROW , DOWN_ARROW , LEFT_ARROW , RIGHT_ARROW ) ;
  5464.  
  5465.    ----------------------------------------------------
  5466.    --  The type used to communication with from the
  5467.    --  graphics terminal operator .
  5468.    ----------------------------------------------------
  5469.    subtype USER_REQUEST  is STRING ( 1 .. 80 ) ;
  5470.    subtype USER_RESPONSE is STRING ( 1 .. 80 ) ;
  5471.  
  5472.    ------------------------------------------------------------
  5473.    -- The following declarations define various terminal screen
  5474.    -- I/O structures.
  5475.    --  ROW_TYPE    => screen row cursor position identifier.
  5476.    --  COLUMN_TYPE => screen column cursor position identifier.
  5477.    --  ESC         => String definition of an ASCII escape.
  5478.    --  DEL         => String definition of an ASCII delete.
  5479.    --  NUL         => String definition of an ASCII nul.
  5480.    ------------------------------------------------------------
  5481.    subtype ROW_TYPE    is INTEGER range 1 .. 24 ;
  5482.    subtype COLUMN_TYPE is INTEGER range 1 .. 132 ;
  5483.  
  5484.    MAXCOL  : constant COLUMN_TYPE := 80 ;
  5485.    MAXROW  : constant ROW_TYPE := 24 ;
  5486.  
  5487.    ------------------------------------------------
  5488.    -- Terminal Screen Format Operation Declarations
  5489.    ------------------------------------------------
  5490.    type FORMAT_FUNCTION is
  5491.         ( CLEAR_SCREEN , CENTER_A_LINE , CLEAR_A_LINE ) ;
  5492.  
  5493.    ------------------------------------------------
  5494.    -- Terminal Screen I/O Operation Declarations
  5495.    ------------------------------------------------
  5496.    type CURSOR_ADDRESS is
  5497.         ( READ_NO_ADDRESS , READ_WITH_ADDRESS ,
  5498.           WRITE_NO_ADDRESS , WRITE_WITH_ADDRESS ) ;
  5499.  
  5500.    type LOW_LEVEL_CRT_FUNCTIONS is
  5501.         ( SCREEN_WIDTH_80 ,       -- Max line characters = 80.
  5502.           SCREEN_WIDTH_132 ,
  5503.           NEXT_LINE ,             -- Sets cursor @ begining of the next line.
  5504.           SCROLL_UP ,             -- Scrolls the page text up one line.
  5505.           SCROLL_DOWN ,           -- Scrolls the page text down one line.
  5506.           HOME_CURSOR ,           -- Places cursor @ home position.
  5507.           ERASE_CURSOR_TO_EOL ,   -- Erases from cursor position
  5508.                                   --    to end of line.
  5509.           ERASE_BOL_TO_CURSOR ,   -- Erases from begining of line
  5510.                                   --    to cursor position.
  5511.           ERASE_CURSOR_LINE ,     -- Erases  all text on current line.
  5512.           ERASE_CURSOR_TO_EOS ,   -- Erases screen from cursor position
  5513.                                   --    to end of screen.
  5514.           ERASE_BOS_TO_CURSOR ,   -- Erases screen from begining of screen
  5515.                                   --    to cursor position.
  5516.           ERASE_CURSOR_SCREEN ,   -- Erases all text on current screen.
  5517.           BLINK_CHARS ,           -- Blink following characters.
  5518.           NEGATIVE_CHARS ,        -- Reverse image of following characters.
  5519.           CLEAR_ATTRIBUTES ,      -- Clear graphic attributes.
  5520.           ERASE_SCREEN ) ;        -- Erase Entire Screen
  5521.  
  5522.    procedure LOW_LEVEL_OPERATIONS
  5523.              ( FORMAT_FCT : in LOW_LEVEL_CRT_FUNCTIONS ) ;
  5524.    -- ===========================================================
  5525.    --  This routine provides the operations that provide the
  5526.    --  screen formatting capabilities identified in the Crt_Functions
  5527.    --  declaration list above.
  5528.    -- ===========================================================
  5529.  
  5530.    procedure SCROLLING_REGION
  5531.              ( TOP_LINE, BOTTOM_LINE : in POSITIVE ) ;
  5532.    -- =============================================================
  5533.    -- Defines the region of the screen used for text operations.
  5534.    -- =============================================================
  5535.  
  5536.    procedure MOVE_CURSOR_UP
  5537.              ( ROWS : in ROW_TYPE ) ;
  5538.    -- =============================================================
  5539.    -- Moves the alphanumeric cursor up n rows.
  5540.    -- =============================================================
  5541.  
  5542.    procedure MOVE_CURSOR_DOWN
  5543.              ( ROWS : in ROW_TYPE ) ;
  5544.    -- =============================================================
  5545.    -- Moves the alphanumeric cursor down n rows.
  5546.    -- =============================================================
  5547.  
  5548.    procedure MOVE_CURSOR_RIGHT
  5549.              ( COLUMNS : in COLUMN_TYPE ) ;
  5550.    -- =============================================================
  5551.    -- Moves the alphanumeric cursor right n columns.
  5552.    -- =============================================================
  5553.  
  5554.    procedure MOVE_CURSOR_LEFT
  5555.              ( COLUMNS : in COLUMN_TYPE ) ;
  5556.    -- =============================================================
  5557.    -- Moves the alphanumeric cursor left n columns.
  5558.    -- =============================================================
  5559.  
  5560.    procedure MOVE_CURSOR_TO
  5561.              ( ROW    : in ROW_TYPE ;
  5562.                COLUMN : in COLUMN_TYPE ) ;
  5563.    -- =============================================================
  5564.    -- Moves the alphanumeric cursor to a specified row
  5565.    --  and column location.
  5566.    -- =============================================================
  5567.  
  5568.    procedure VTI_INIT ;
  5569.    -- ===========================================================
  5570.    --  Initialize this version of the VIRTUAL_TERMINAL_INTERFACE
  5571.    --  with the terminal specific data required.
  5572.    -- ===========================================================
  5573.  
  5574.    procedure STRINGIO
  5575.              ( STRNG   : in out STRING ;
  5576.                ADDRESS : in     CURSOR_ADDRESS ;
  5577.                ROW     : in     ROW_TYPE ;
  5578.                COL     : in     COLUMN_TYPE ) ;
  5579.    -- =========================================================
  5580.    --   This routine performs string I/O operations as per
  5581.    --   the specified formal parameters.
  5582.    -- =========================================================
  5583.  
  5584.    procedure CHARACTERIO
  5585.              ( CHAR    : in out CHARACTER ;
  5586.                ADDRESS : in     CURSOR_ADDRESS ;
  5587.                ROW     : in     ROW_TYPE ;
  5588.                COL     : in     COLUMN_TYPE ) ;
  5589.    -- =========================================================
  5590.    --   This routine performs character I/O operations as per
  5591.    --   the specified formal parameters.
  5592.    -- =========================================================
  5593.  
  5594.    procedure INTEGERIO
  5595.              ( INT     : in out INTEGER ;
  5596.                ADDRESS : in     CURSOR_ADDRESS ;
  5597.                ROW     : in     ROW_TYPE ;
  5598.                COL     : in     COLUMN_TYPE ) ;
  5599.    -- =========================================================
  5600.    --   This routine performs integer I/O operations as per
  5601.    --   the specified formal parameters.
  5602.    -- =========================================================
  5603.  
  5604.    procedure REALIO
  5605.              ( REAL_NO : in out FLOAT ;
  5606.                ADDRESS : in     CURSOR_ADDRESS ;
  5607.                ROW     : in     ROW_TYPE ;
  5608.                COL     : in     COLUMN_TYPE ) ;
  5609.    -- =========================================================
  5610.    --   This routine performs real I/O operations as per
  5611.    --   the specified formal parameters.
  5612.    -- =========================================================
  5613.  
  5614.    procedure FORMAT_LINE
  5615.              ( STRNG   : in STRING ;
  5616.                FORMAT  : in FORMAT_FUNCTION  ;
  5617.                ROW     : in ROW_TYPE ) ;
  5618.    -- =========================================================
  5619.    --   This routine performs formatted string I/O operations
  5620.    --   as per the specified formal parameters.
  5621.    -- =========================================================
  5622.  
  5623.    function KEY_PAD_IO
  5624.      return KEYPAD_KEY_TYPE ;
  5625.    -- ===============================================================
  5626.    --  This routine provides keypad Input operations.
  5627.    -- ===============================================================
  5628.  
  5629. end VIRTUAL_TERMINAL_INTERFACE ;
  5630. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5631. --virtual_terminal_interface_body.ada
  5632. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  5633. -- version 85-11-22 15:55 by JB
  5634.  
  5635. with TRACE_PKG ; use TRACE_PKG ;
  5636. with TEXT_IO ;   use TEXT_IO ;
  5637.  
  5638. package body VIRTUAL_TERMINAL_INTERFACE is
  5639. --###################################################################
  5640. --
  5641. --  The VIRTUAL_TERMINAL_INTERFACE package provides a device
  5642. --  independent set of subprograms which provide alphanumeric text
  5643. --  services. The primary function of this package is to support
  5644. --  alphanumeric I/O to the alphanumeric window.
  5645. --
  5646. --  In particular this package will support a scroll region of two
  5647. --  lines on the bottom of the terminal screen for use in prompting
  5648. --  for and reading interactive text.
  5649. --
  5650. --  Provides the Envision terminal with the escape sequences for control
  5651. --  and manipulation of alphanumeric text on the alpha plane.
  5652. --
  5653. --  variable conventions
  5654. --    within sequences parens exist for reader clairity and denote
  5655. --    parameter variables to be replaced by values.
  5656. --        (c) : ASCII 0 plus offset (characters 0-9 & :,-,?)
  5657. --        (n) : ASCII 0 plus offset (characters 0-9)
  5658. --        (x1,y1,..,xn,yn) : coordinates, numbers seperated
  5659. --                  and terminated by non-alpha and
  5660. --                  non-numeric characters. ie ","
  5661. --        (nz) : single number variable, such as r-radius or
  5662. --            a-angle     
  5663. --
  5664. --####################################################################
  5665.  
  5666.    package INTEGER_IO is new TEXT_IO.INTEGER_IO( INTEGER ) ; use INTEGER_IO ;
  5667.    package FLOAT_IO is new TEXT_IO.FLOAT_IO( FLOAT ) ;       use FLOAT_IO   ;
  5668.  
  5669.    -------------------------------
  5670.    -- Local Declarations
  5671.    -------------------------------
  5672.    ESC     : STRING( 1..1 ) := ( 1 => ASCII.ESC ) ;
  5673.    ROW_ADJ : constant INTEGER := 0 ;
  5674.  
  5675.  
  5676.    procedure SEND_SEQUENCE
  5677.              ( ESC_SEQUENCE : in STRING ) is
  5678.    -- =======================================================
  5679.    --  This routine localizes the interface with the
  5680.    --  package Text_IO.
  5681.    -- =======================================================
  5682.    begin
  5683.       if TRACE_PKG.REQUEST_TRACE then
  5684.          TRACE_PKG.TRACE( "<ESCAPE>" & ESC_SEQUENCE ) ;
  5685.       end if ;
  5686.  
  5687.       TEXT_IO.PUT( ESC & ESC_SEQUENCE ) ;
  5688.       exception
  5689.          -- Trap Text_IO Exceptions Here
  5690.          when others => null ;
  5691.    end SEND_SEQUENCE ;
  5692.  
  5693.  
  5694.    procedure LOW_LEVEL_OPERATIONS
  5695.              ( FORMAT_FCT : in LOW_LEVEL_CRT_FUNCTIONS ) is
  5696.    -- ===========================================================
  5697.    --  This routine provides the operations that provide the
  5698.    --  screen formatting capabilities identified in the Crt_Functions
  5699.    --  declaration list above.
  5700.    --  SCREEN_WIDTH_80        ESCAPE => <ESC>[?3l
  5701.    --  SCREEN_WIDTH_132       ESCAPE => <ESC>[?3h
  5702.    --  NEXT_LINE              ESCAPE => <ESC>E
  5703.    --  SCROLL_UP              ESCAPE => <ESC>[S
  5704.    --  SCROLL_DOWN            ESCAPE => <ESC>M
  5705.    --  HOME_CURSOR            ESCAPE => <ESC>[H
  5706.    --  ERASE_CURSOR_TO_EOL    ESCAPE => <ESC>[K
  5707.    --  ERASE_BOL_TO_CURSOR    ESCAPE => <ESC>[1K
  5708.    --  ERASE_CURSOR_LINE      ESCAPE => <ESC>[2K
  5709.    --  ERASE_CURSOR_TO_EOS    ESCAPE => <ESC>[J
  5710.    --  ERASE_BOS_TO_CURSOR    ESCAPE => <ESC>[1J
  5711.    --  ERASE_CURSOR_SCREEN    ESCAPE => <ESC>[2J
  5712.    --  BLINK_CHARS            ESCAPE => <ESC>[5m
  5713.    --  NEGATIVE_CHARS         ESCAPE => <ESC>[7m
  5714.    --  CLEAR_ATTRIBUTES       ESCAPE => <ESC>[0m
  5715.    --  ERASE_SCREEN           ESCAPE => <ESC>[2J
  5716.  
  5717.    -- ===========================================================
  5718.    begin
  5719.       if TRACE_PKG.REQUEST_TRACE then
  5720.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS" ) ;
  5721.       end if ;
  5722.  
  5723.       case FORMAT_FCT is
  5724.         when SCREEN_WIDTH_80     => SEND_SEQUENCE( "[?3l" ) ;
  5725.         when SCREEN_WIDTH_132    => SEND_SEQUENCE( "[?3h" ) ;
  5726.         when NEXT_LINE           => SEND_SEQUENCE( "E" ) ;
  5727.         when SCROLL_UP           => SEND_SEQUENCE( "[1S" ) ;
  5728.         when SCROLL_DOWN         => SEND_SEQUENCE( "M" ) ;
  5729.         when HOME_CURSOR         => SEND_SEQUENCE( "[H" ) ;
  5730.         when ERASE_CURSOR_TO_EOL => SEND_SEQUENCE( "[K" ) ;
  5731.         when ERASE_BOL_TO_CURSOR => SEND_SEQUENCE( "[1K" ) ;
  5732.         when ERASE_CURSOR_LINE   => SEND_SEQUENCE( "[2K" ) ;
  5733.         when ERASE_CURSOR_TO_EOS => SEND_SEQUENCE( "[J" ) ;
  5734.         when ERASE_BOS_TO_CURSOR => SEND_SEQUENCE( "[1J" ) ;
  5735.         when ERASE_CURSOR_SCREEN => SEND_SEQUENCE( "[2J" ) ;
  5736.         when BLINK_CHARS         => SEND_SEQUENCE( "[5m" ) ;
  5737.         when NEGATIVE_CHARS      => SEND_SEQUENCE( "[7m" ) ;
  5738.         when CLEAR_ATTRIBUTES    => SEND_SEQUENCE( "[0m" ) ;
  5739.         when ERASE_SCREEN        => SEND_SEQUENCE( "[2J" ) ;
  5740.       end case ;
  5741.    end LOW_LEVEL_OPERATIONS ;
  5742.  
  5743.  
  5744.    function INT_IMAGE
  5745.             ( INT : in NATURAL )
  5746.    return STRING is
  5747.    --  This local funciton returns the ascii image of a
  5748.    --  natural number without a leading blank.
  5749.       LENGTH : INTEGER := INTEGER'IMAGE( INT )'LAST ;
  5750.    begin
  5751.       if TRACE_PKG.REQUEST_TRACE then
  5752.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.INT_IMAGE" ) ;
  5753.       end if ;
  5754.  
  5755.       return INTEGER'IMAGE( INT )(2..LENGTH) ;
  5756.    end INT_IMAGE ;
  5757.  
  5758.  
  5759.    procedure POSITION_CURSOR
  5760.              ( COL_NO : in     INTEGER ;
  5761.                ROW_NO : in     INTEGER ) is
  5762.    -- ===========================================================
  5763.    --  This routine positions the cursor at the specified screen
  5764.    --  location.  The subsequent output to the screen will begin
  5765.    --  at this location.
  5766.    -- ===========================================================
  5767.       ROW     : INTEGER ;
  5768.    begin
  5769.       if TRACE_PKG.REQUEST_TRACE then
  5770.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.POSITION_CURSOR" ) ;
  5771.       end if ;
  5772.  
  5773.       ROW := ROW_NO + ROW_ADJ ;
  5774.       SEND_SEQUENCE ("[" & INT_IMAGE(ROW) & ";" & INT_IMAGE(COL_NO) & "H");
  5775.    end POSITION_CURSOR ;
  5776.  
  5777.  
  5778.    procedure SCROLLING_REGION
  5779.              ( TOP_LINE, BOTTOM_LINE : in POSITIVE ) is
  5780.    -- =============================================================
  5781.    -- <ESC>[(t);(b)r
  5782.    -- Defines the region of the screen used for text operations.
  5783.    -- =============================================================
  5784.    begin
  5785.       if TRACE_PKG.REQUEST_TRACE then
  5786.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.SCROLLING_REGION" ) ;
  5787.       end if ;
  5788.  
  5789.       SEND_SEQUENCE
  5790.          ( "[" & INT_IMAGE( TOP_LINE ) & ";"
  5791.                & INT_IMAGE( BOTTOM_LINE ) & "r" ) ;
  5792.    end SCROLLING_REGION ;
  5793.  
  5794.  
  5795.    procedure MOVE_CURSOR_UP
  5796.              ( ROWS : in ROW_TYPE ) is
  5797.    -- =============================================================
  5798.    -- <ESC>[P(n)A
  5799.    -- Moves the alphanumeric cursor up n rows.
  5800.    -- =============================================================
  5801.    begin
  5802.       if TRACE_PKG.REQUEST_TRACE then
  5803.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.MOVE_CURSOR_UP" ) ;
  5804.       end if ;
  5805.  
  5806.       SEND_SEQUENCE( "[P" & INT_IMAGE( ROWS ) & "A" ) ;
  5807.    end MOVE_CURSOR_UP ;
  5808.  
  5809.  
  5810.    procedure MOVE_CURSOR_DOWN
  5811.              ( ROWS : in ROW_TYPE ) is
  5812.    -- =============================================================
  5813.    -- <ESC>[P(n)B
  5814.    -- Moves the alphanumeric cursor down n rows.
  5815.    -- =============================================================
  5816.    begin
  5817.       if TRACE_PKG.REQUEST_TRACE then
  5818.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.MOVE_CURSOR_DOWN" ) ;
  5819.       end if ;
  5820.  
  5821.       SEND_SEQUENCE( "[P" & INT_IMAGE( ROWS ) & "B" ) ;
  5822.    end MOVE_CURSOR_DOWN ;
  5823.  
  5824.  
  5825.    procedure MOVE_CURSOR_RIGHT
  5826.              ( COLUMNS : in COLUMN_TYPE ) is
  5827.    -- =============================================================
  5828.    -- <ESC>[P(n)C
  5829.    -- Moves the alphanumeric cursor right n columns.
  5830.    -- =============================================================
  5831.    begin
  5832.       if TRACE_PKG.REQUEST_TRACE then
  5833.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.MOVE_CURSOR_RIGHT" ) ;
  5834.       end if ;
  5835.  
  5836.       SEND_SEQUENCE( "[P" & INT_IMAGE( COLUMNS ) & "C" ) ;
  5837.    end MOVE_CURSOR_RIGHT ;
  5838.  
  5839.  
  5840.    procedure MOVE_CURSOR_LEFT
  5841.              ( COLUMNS : in COLUMN_TYPE ) is
  5842.    -- =============================================================
  5843.    -- <ESC>[P(n)D
  5844.    -- Moves the alphanumeric cursor left n columns.
  5845.    -- =============================================================
  5846.    begin
  5847.       if TRACE_PKG.REQUEST_TRACE then
  5848.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.MOVE_CURSOR_LEFT" ) ;
  5849.       end if ;
  5850.  
  5851.       SEND_SEQUENCE( "[P" & INT_IMAGE( COLUMNS ) & "D" ) ;
  5852.    end MOVE_CURSOR_LEFT ;
  5853.  
  5854.  
  5855.    procedure MOVE_CURSOR_TO
  5856.              ( ROW    : in ROW_TYPE ;
  5857.                COLUMN : in COLUMN_TYPE ) is
  5858.    -- =============================================================
  5859.    -- <ESC>[Pl;PcH   Pl=row Pc=column
  5860.    -- Moves the alphanumeric cursor to a specified row
  5861.    --  and column location.
  5862.    -- =============================================================
  5863.    begin
  5864.       if TRACE_PKG.REQUEST_TRACE then
  5865.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.MOVE_CURSOR_TO" ) ;
  5866.       end if ;
  5867.  
  5868.       POSITION_CURSOR( COLUMN , ROW ) ;
  5869.    end MOVE_CURSOR_TO ;
  5870.  
  5871.  
  5872.    procedure VTI_INIT is
  5873.    -- ===========================================================
  5874.    --  Initialize this version of the VIRTUAL_TERMINAL_INTERFACE
  5875.    --  with the terminal specific data required.
  5876.    -- ===========================================================
  5877.       CMD_STR : STRING( 1 .. 4 ) ;
  5878.    begin
  5879.       if TRACE_PKG.REQUEST_TRACE then
  5880.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.VTI_INIT" ) ;
  5881.       end if ;
  5882.  
  5883.       CMD_STR( 1 ) := ASCII.L_BRACKET ;
  5884.       CMD_STR( 2 ) := '?' ;
  5885.       CMD_STR( 3 ) := '3' ;
  5886.       CMD_STR( 4 ) := 'l' ; --{ Little L }
  5887.       SEND_SEQUENCE( CMD_STR ) ;
  5888.       LOW_LEVEL_OPERATIONS( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  5889.       LOW_LEVEL_OPERATIONS( LOW_LEVEL_CRT_FUNCTIONS'( HOME_CURSOR )) ;
  5890.    end VTI_INIT ;
  5891.  
  5892.  
  5893.    procedure STRINGIO
  5894.              ( STRNG   : in out STRING ;
  5895.                ADDRESS : in     CURSOR_ADDRESS ;
  5896.                ROW     : in     ROW_TYPE ;
  5897.                COL     : in     COLUMN_TYPE ) is
  5898.    -- =========================================================
  5899.    --   This routine performs string I/O operations as per
  5900.    --   the specified formal parameters. When reading, if a
  5901.    --   a return must be entered when using the DEC VAX.  If
  5902.    --   only a return is entered, then a blank string is passed.
  5903.    --   If the entered string is longer than the string length of
  5904.    --   parameter it is truncated.
  5905.    -- =========================================================
  5906.       COUNT       : NATURAL ;
  5907.       BIG_BUFFER  : STRING (1..255) := (others => ' ') ;
  5908.  
  5909.    begin
  5910.       if TRACE_PKG.REQUEST_TRACE then
  5911.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.STRING_IO" ) ;
  5912.       end if ;
  5913.  
  5914.       if ADDRESS = CURSOR_ADDRESS'( WRITE_WITH_ADDRESS ) or
  5915.          ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS  ) then
  5916.          POSITION_CURSOR( COL , ROW ) ;
  5917.       end if ;
  5918.       if ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS    ) or
  5919.          ADDRESS = CURSOR_ADDRESS'( READ_NO_ADDRESS ) then
  5920.          -- initialize Output String 
  5921.          for INDEX in STRNG'first..STRNG'last loop
  5922.             STRNG( INDEX ) := ' ' ;
  5923.          end loop ;
  5924.  
  5925. --         -- clear buffer of extra returns
  5926.   --       while END_OF_LINE and not END_OF_FILE loop
  5927.     --        TEXT_IO.SKIP_LINE ;
  5928.       --   end loop ;
  5929.  
  5930.          TEXT_IO.GET_LINE( BIG_BUFFER, COUNT ) ;
  5931.          if COUNT = 0 then
  5932.             null ;
  5933.          elsif COUNT < STRNG'length then
  5934.             STRNG (STRNG'first..STRNG'first+(COUNT-1)) := BIG_BUFFER (1..COUNT) ;
  5935.          else
  5936.             STRNG := BIG_BUFFER (1..STRNG'length) ;
  5937.          end if ;
  5938.  
  5939.       else
  5940.          TEXT_IO.PUT( STRNG ) ;
  5941.       end if ;
  5942.    end STRINGIO ;
  5943.  
  5944.  
  5945.    procedure CHARACTERIO
  5946.              ( CHAR    : in out CHARACTER ;
  5947.                ADDRESS : in     CURSOR_ADDRESS ;
  5948.                ROW     : in     ROW_TYPE ;
  5949.                COL     : in     COLUMN_TYPE ) is
  5950.    -- =========================================================
  5951.    --   This routine performs character I/O operations as per
  5952.    --   the specified formal parameters.
  5953.    -- =========================================================
  5954.    begin
  5955.       if TRACE_PKG.REQUEST_TRACE then
  5956.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.CHARACTERIO" ) ;
  5957.       end if ;
  5958.  
  5959.       if ADDRESS = CURSOR_ADDRESS'( WRITE_WITH_ADDRESS ) or
  5960.          ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS  ) then
  5961.          POSITION_CURSOR( COL , ROW ) ;
  5962.       end if ;
  5963.       if ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS ) or
  5964.          ADDRESS = CURSOR_ADDRESS'( READ_NO_ADDRESS   ) then
  5965.          TEXT_IO.GET( CHAR ) ;
  5966.       else
  5967.          TEXT_IO.PUT( CHAR ) ;
  5968.       end if ;
  5969.    end CHARACTERIO ;
  5970.  
  5971.  
  5972.    procedure INTEGERIO
  5973.              ( INT     : in out INTEGER ;
  5974.                ADDRESS : in     CURSOR_ADDRESS ;
  5975.                ROW     : in     ROW_TYPE ;
  5976.                COL     : in     COLUMN_TYPE ) is
  5977.    -- =========================================================
  5978.    --   This routine performs integer I/O operations as per
  5979.    --   the specified formal parameters.
  5980.    -- =========================================================
  5981.    begin
  5982.       if TRACE_PKG.REQUEST_TRACE then
  5983.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.INTEGERIO" ) ;
  5984.       end if ;
  5985.  
  5986.       if ADDRESS = CURSOR_ADDRESS'( WRITE_WITH_ADDRESS ) or
  5987.          ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS  ) then
  5988.          POSITION_CURSOR( COL , ROW ) ;
  5989.       end if ;
  5990.       if ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS ) or
  5991.          ADDRESS = CURSOR_ADDRESS'( READ_NO_ADDRESS   ) then
  5992.          INTEGER_IO.GET( INT ) ;
  5993.       else
  5994.          INTEGER_IO.PUT( INT ) ;
  5995.       end if ;
  5996.    end INTEGERIO ;
  5997.  
  5998.  
  5999.    procedure REALIO
  6000.              ( REAL_NO : in out FLOAT ;
  6001.                ADDRESS : in     CURSOR_ADDRESS ;
  6002.                ROW     : in     ROW_TYPE ;
  6003.                COL     : in     COLUMN_TYPE ) is
  6004.    -- =========================================================
  6005.    --   This routine performs real I/O operations as per
  6006.    --   the specified formal parameters.
  6007.    -- =========================================================
  6008.    begin
  6009.       if TRACE_PKG.REQUEST_TRACE then
  6010.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.REALIO" ) ;
  6011.       end if ;
  6012.  
  6013.       if ADDRESS = CURSOR_ADDRESS'( WRITE_WITH_ADDRESS ) or
  6014.          ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS  ) then
  6015.          POSITION_CURSOR( COL , ROW ) ;
  6016.       end if ;
  6017.       if ADDRESS = CURSOR_ADDRESS'( READ_WITH_ADDRESS ) or
  6018.          ADDRESS = CURSOR_ADDRESS'( READ_NO_ADDRESS   ) then
  6019.          FLOAT_IO.GET( REAL_NO ) ;
  6020.       else
  6021.          FLOAT_IO.PUT( REAL_NO ) ;
  6022.       end if ;
  6023.    end REALIO ;
  6024.  
  6025.  
  6026.    procedure FORMAT_LINE
  6027.              ( STRNG   : in STRING ;
  6028.                FORMAT  : in FORMAT_FUNCTION  ;
  6029.                ROW     : in ROW_TYPE ) is
  6030.    -- =========================================================
  6031.    --   This routine performs formatted string I/O operations
  6032.    --   as per the specified formal parameters.
  6033.    -- =========================================================
  6034.       COL_POS : COLUMN_TYPE := 1 ;
  6035.    begin
  6036.       if TRACE_PKG.REQUEST_TRACE then
  6037.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE" ) ;
  6038.       end if ;
  6039.  
  6040.       case FORMAT is
  6041.          when CLEAR_SCREEN  =>
  6042.             LOW_LEVEL_OPERATIONS( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  6043.             LOW_LEVEL_OPERATIONS( LOW_LEVEL_CRT_FUNCTIONS'( HOME_CURSOR )) ;
  6044.          when CENTER_A_LINE =>
  6045.             if STRNG'length > 78 then
  6046.                POSITION_CURSOR( COL_POS , ROW ) ;
  6047.             else
  6048.               COL_POS := ( 80 - STRNG'length )/2 ;
  6049.               POSITION_CURSOR( COL_POS , ROW ) ;
  6050.             end if ;
  6051.                TEXT_IO.PUT( STRNG ) ;
  6052.          when CLEAR_A_LINE  =>
  6053.             POSITION_CURSOR( COL_POS , ROW ) ;
  6054.             LOW_LEVEL_OPERATIONS
  6055.                ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_CURSOR_LINE )) ;
  6056.       end case ;
  6057.    end FORMAT_LINE ;
  6058.  
  6059.  
  6060.    function KEY_PAD_IO return KEYPAD_KEY_TYPE is
  6061.    -- ===============================================================
  6062.    --  This routine provides keypad Input operations.
  6063.    -- ===============================================================
  6064.       KEY_PAD_KEY : KEYPAD_KEY_TYPE := KEYPAD_KEY_TYPE'( ENTER ) ;
  6065.       WORK_CHAR   : CHARACTER ;
  6066.  
  6067.       procedure READ_CHAR (CHAR: out CHARACTER; KEY: out KEYPAD_KEY_TYPE ) is
  6068.       -- ==========================================
  6069.       --  perform a noecho character read and
  6070.       --  decode escape key sequences as necessary
  6071.       -- ==========================================
  6072.          CHAR1, CHAR2, OUT_CHAR : CHARACTER ;
  6073.          CHARS                  : STRING (1..2) ;
  6074.          GOLD_CHAR              : CHARACTER ;
  6075.          GOLD_KEY               : KEYPAD_KEY_TYPE ;
  6076.          VALID_ESCAPE_SEQUENCE  : BOOLEAN := TRUE ;
  6077.  
  6078.       begin  --{ Read_Char }
  6079.          TEXT_IO.GET ( OUT_CHAR ) ;
  6080.          CHAR := OUT_CHAR ;
  6081.          if OUT_CHAR = ASCII.ESC then
  6082.             --  process a potential escape code sequence
  6083.             TEXT_IO.GET ( CHARS ) ;
  6084.             CHAR1 := CHARS ( 1 ) ;
  6085.             CHAR2 := CHARS ( 2 ) ;
  6086.             case CHAR1 is
  6087.                when '[' =>
  6088.                   case CHAR2 is
  6089.                      --  when valid char, assign appropriate value to KEY
  6090.                      when 'A'    => KEY := UP_ARROW ;
  6091.                      when 'B'    => KEY := DOWN_ARROW ;
  6092.                      when 'C'    => KEY := RIGHT_ARROW ;
  6093.                      when 'D'    => KEY := LEFT_ARROW ;
  6094.                      when others => VALID_ESCAPE_SEQUENCE := FALSE;
  6095.                   end case;
  6096.                when 'O' =>
  6097.                   case CHAR2 is
  6098.                      --  when valid char, assign appropriate value to KEY
  6099.                      when 'l' => KEY := KPcomma;
  6100.                      when 'm' => KEY := KPhypen;
  6101.                      when 'n' => KEY := KPdot;
  6102.                      when 'p' => KEY := KP0;
  6103.                      when 'q' => KEY := KP1;
  6104.                      when 'r' => KEY := KP2;
  6105.                      when 's' => KEY := KP3;
  6106.                      when 't' => KEY := KP4;
  6107.                      when 'u' => KEY := KP5;
  6108.                      when 'v' => KEY := KP6;
  6109.                      when 'w' => KEY := KP7;
  6110.                      when 'x' => KEY := KP8;
  6111.                      when 'y' => KEY := KP9;
  6112.                      when 'M' => KEY := ENTER;
  6113.                      when 'P' => READ_CHAR (GOLD_CHAR,GOLD_KEY);
  6114.                         -- this is for the 'GOLD' key
  6115.                         if GOLD_CHAR = ASCII.NUL and 
  6116.                            GOLD_KEY in PF2..ENTER then
  6117.                            -- legitimate gold key entered
  6118.                            -- step thru to 'GOLD' range of KEYPAD_KEY_TYPE
  6119.                            for I in PF2..ENTER loop
  6120.                               GOLD_KEY := KEYPAD_KEY_TYPE'SUCC(GOLD_KEY);
  6121.                            end loop;
  6122.                            KEY := GOLD_KEY;
  6123.                         else
  6124.                            VALID_ESCAPE_SEQUENCE := FALSE;
  6125.                         end if;
  6126.                      when 'Q'    => KEY := PF2;
  6127.                      when 'R'    => KEY := PF3;
  6128.                      when 'S'    => KEY := PF4;
  6129.                      when others => VALID_ESCAPE_SEQUENCE := FALSE;
  6130.                   end case;
  6131.                when others => VALID_ESCAPE_SEQUENCE := FALSE;
  6132.             end case;
  6133.             if VALID_ESCAPE_SEQUENCE then
  6134.                CHAR := ASCII.NUL;
  6135.             else
  6136.                CHAR := ASCII.ESC;
  6137.             end if;
  6138.          end if;
  6139.       end READ_CHAR ;
  6140.  
  6141.    begin   --{ KEY_PAD_IO }
  6142.       if TRACE_PKG.REQUEST_TRACE then
  6143.          TRACE_PKG.TRACE( "VIRTUAL_TERMINAL_INTERFACE.KEY_PAD_IO" ) ;
  6144.       end if ;
  6145.  
  6146.       READ_CHAR( WORK_CHAR , KEY_PAD_KEY ) ;
  6147.       return KEY_PAD_KEY ;
  6148.    end KEY_PAD_IO ;
  6149.  
  6150.  
  6151. end VIRTUAL_TERMINAL_INTERFACE ;
  6152. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6153. --tree_ops_spec.ada
  6154. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6155.    -- version 11 Feb 1986 by JR  =>  change exception decl. to rename 
  6156.    -- version 85-11-05 14:20  by  JL
  6157.  
  6158.    with TREE_DATA;  use TREE_DATA;
  6159.    with GRAPHICS_DATA ;
  6160.  
  6161.    package TREE_OPS is
  6162.    --------------------------------------------------------------------------
  6163.    --  Declare the operations needed to use the TREE
  6164.    --------------------------------------------------------------------------
  6165.  
  6166.       -----------------------------------------------------------------------
  6167.       --  These subprograms manage the indices into the arrays of GRAPH,
  6168.       --  LIST, and TREE nodes.  The Get Node functions will return the
  6169.       --  index value and initialize the corresponding node to be the
  6170.       --  specified variant of the record.  The Release Node procedures
  6171.       --  mark the node being released as unused (and hence available for
  6172.       --  reuse).
  6173.       -----------------------------------------------------------------------
  6174.    
  6175.       function GET_NEW_GRAPH_NODE (OWNING_TREE: in TREE_NODE_ACCESS_TYPE)
  6176.                                   return GRAPH_NODE_ACCESS_TYPE;
  6177.       -- Get a new Graph Node, and set the OWNING_TREE_NODE field to
  6178.       -- the specified Tree Node.
  6179.       procedure RELEASE_GRAPH_NODE (NODE: in GRAPH_NODE_ACCESS_TYPE);
  6180.       -- This procedure releases the specified Graph Node.
  6181.    
  6182.       function GET_NEW_PROLOGUE_NODE (OWNING_TREE: in TREE_NODE_ACCESS_TYPE)
  6183.                                   return PROLOGUE_NODE_ACCESS_TYPE;
  6184.       -- Get a new PROLOGUE Node, and set the OWNING_TREE_NODE field to
  6185.       -- the specified Tree Node.
  6186.       procedure RELEASE_PROLOGUE_NODE (NODE: in PROLOGUE_NODE_ACCESS_TYPE);
  6187.       -- This procedure releases the specified PROLOGUE Node.
  6188.    
  6189.       function GET_NEW_LIST_NODE (ITEM: in TREE_NODE_ACCESS_TYPE)
  6190.                                  return LIST_NODE_ACCESS_TYPE;
  6191.       -- Get a new List Node, and set the ITEM field to the specified
  6192.       -- value.  The ITEM pointer must not be null, as this indicates
  6193.       -- an used List Node.
  6194.       procedure RELEASE_LIST_NODE (NODE: in LIST_NODE_ACCESS_TYPE);
  6195.       -- This procedure releases the specified list node.
  6196.  
  6197.    
  6198.       function GET_NEW_TREE_NODE (NODE_TYPE: in ENTITY_TYPE)
  6199.                                  return TREE_NODE_ACCESS_TYPE;
  6200.       -- Initialize the NODE to the correct type and set all values
  6201.       -- to NULL (or the equivalent);
  6202.       procedure RELEASE_TREE_NODE (NODE: in TREE_NODE_ACCESS_TYPE);
  6203.       -- This procedure deletes the specified TREE_NODE and all of
  6204.       -- its children (if any).  It will remove any dependencies
  6205.       -- which exist on this node as well.
  6206.    
  6207.       -----------------------------------------------------------------------
  6208.       -- The following types and subprograms provide the mechanism
  6209.       -- for walking the tree.
  6210.       -----------------------------------------------------------------------
  6211.  
  6212.       type WALK_STATE_TYPE is private ;
  6213.    
  6214.       procedure START_TREE_WALK (PARENT : in TREE_NODE_ACCESS_TYPE ;
  6215.                                  WALK_STATE : in out WALK_STATE_TYPE ) ;
  6216.       procedure TREE_WALK (WALK_STATE : in out WALK_STATE_TYPE ;
  6217.                            NEXT_NODE : out TREE_NODE_ACCESS_TYPE ) ;
  6218.       -- This procedure and function are used to walk the tree which
  6219.       -- has the Parent as its root.  The function TREE_WALK will
  6220.       -- return NULL_POINTER when all the children have been visited.
  6221.       -- The tree walk excludes the Membership list.  Only one tree
  6222.       -- walk can be executed at a time (it is not re-entrant).
  6223.  
  6224.       -----------------------------------------------------------------------
  6225.       -- The following subprograms provide operations to help
  6226.       -- use the tree.
  6227.       -----------------------------------------------------------------------
  6228.    
  6229.       procedure SET_PARENT (CHILD : in TREE_NODE_ACCESS_TYPE;
  6230.                             PARENT : in TREE_NODE_ACCESS_TYPE;
  6231.                             RELATION : IN LIST_TYPE);
  6232.       -- Set the Parent Field of the Child Node, and Place the
  6233.       -- Child in the specified List of the Parent.
  6234.  
  6235.    
  6236.       -----------------------------------------------------------------------
  6237.       -- These subprograms perform LIST manipulation functions
  6238.       -- and check to make sure that the LIST_NODE pointed to is
  6239.       -- the LIST header node (null back pointer).
  6240.       --
  6241.       -- The subprograms will also add or remove the corresponding 
  6242.       -- node from the MEMBERSHIP list of the TREE_NODE pointed to 
  6243.       -- by the node(s).
  6244.       -----------------------------------------------------------------------
  6245.    
  6246.       function GET_LIST_HEAD (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6247.                               REQUESTED_LIST: in LIST_TYPE)
  6248.                              return LIST_NODE_ACCESS_TYPE;
  6249.       -- Get the List Head for the REQUESTED_LIST of the specified
  6250.       -- Tree Node LIST_OWNER.  This function raises a constraint
  6251.       -- error if the REQUESTED_LIST is not valid for the node type
  6252.       -- of LIST_OWNER.
  6253.  
  6254.       procedure SET_LIST_HEAD (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6255.                                REQUESTED_LIST: in LIST_TYPE;
  6256.                                NEW_LIST_HEAD: in LIST_NODE_ACCESS_TYPE);
  6257.       -- Set the List Head for the REQUESTED_LIST of the specificed
  6258.       -- Tree Node LIST_OWNER.
  6259.  
  6260.       procedure DELETE_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6261.                              REQUESTED_LIST: in LIST_TYPE);
  6262.       -- Delete the entire REQUESTED_LIST, resulting in a NULL_POINTER
  6263.       -- for the LIST_HEAD.
  6264.    
  6265.       procedure ADD_NODE_TO_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6266.                                   REQUESTED_LIST: in LIST_TYPE;
  6267.                                   NODE_TO_BE_ADDED : in LIST_NODE_ACCESS_TYPE);
  6268.       -- Add the Node to the end of the current list.  Start a new
  6269.       -- LIST if the current one is NULL.  Place a reference to the
  6270.       -- LIST_OWNER in the MEMBERSHIP list of the ITEM of the list
  6271.       -- node NODE_TO_BE_ADDED.
  6272.    
  6273.       procedure REMOVE_NODE_FROM_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6274.                                        REQUESTED_LIST: in LIST_TYPE;
  6275.                                        NODE: in LIST_NODE_ACCESS_TYPE);
  6276.       -- Remove the specified node from the List.  Set LIST_HEAD to NULL
  6277.       -- if this is the last element being removed.  Remove the
  6278.       -- reference to the LIST_OWNER from the MEMBERSHIP list of the
  6279.       -- ITEM pointed to by the list node NODE.
  6280.    
  6281.       function FIND_NODE_REFERENCE (LIST_HEAD : in LIST_NODE_ACCESS_TYPE;
  6282.                                     NODE : in TREE_NODE_ACCESS_TYPE)
  6283.                                     return LIST_NODE_ACCESS_TYPE;
  6284.       -- Search the specified list for a reference to the specified node,
  6285.       -- and return the List Node with the reference.  If no reference is
  6286.       -- found, then return a NULL_POINTER.
  6287.  
  6288.       function NEXT_LIST_TO_SCAN (SCANNED_NODE: in TREE_NODE_ACCESS_TYPE;
  6289.                                   CURRENT_LIST : in LIST_TYPE := START)
  6290.                                   return LIST_TYPE;
  6291.       -- Return the type of the next list to be scanned for the node
  6292.       -- specified.  If no more lists are to be scanned, return a value
  6293.       -- of NULL_LIST.
  6294.  
  6295.       procedure BREAK_REFERENCE (FROM, TO: in TREE_NODE_ACCESS_TYPE) ;
  6296.       -- Remove the reference indication in the MEMBERSHIP_LIST of the
  6297.       -- TO node as being referenced by the FROM node.
  6298.  
  6299.       procedure MAKE_REFERENCE (FROM, TO: in TREE_NODE_ACCESS_TYPE) ;
  6300.       -- Place a reference indication in the MEMBERSHIP_LIST of the
  6301.       -- TO node as being referenced by the FROM node.
  6302.  
  6303.       procedure INITIALIZE_TREE ;
  6304.       -- intializes the tree to startup state
  6305.       -- including the reassigning of the root node
  6306.  
  6307.       -----------------------------------------------------------------------
  6308.       -- These are the exceptions which will occur if the operations fail.
  6309.       -----------------------------------------------------------------------
  6310.    
  6311.       INVALID_LIST_SPECIFIED : exception;
  6312.       INVALID_OPERATION_REQUESTED : exception;
  6313.       INVALID_NODE_SPECIFIED : exception;
  6314.       LIST_CORRUPTED : exception;  -- invalid list pointers detected
  6315.       MISMATCHED_DEPENDENCIES : exception;
  6316.       NODE_SUPPLY_EXHAUSTED : exception 
  6317.        renames GRAPHICS_DATA.OPERATION_ABORTED_BY_OPERATOR ;
  6318.        -- The renames allows a graceful handling of this exception
  6319.        -- which is announced directly in the allocation (GET_NEW_) procedures
  6320.       WALK_STACK_OVERFLOW : exception;
  6321.       TREE_CORRUPTED : exception;
  6322.    
  6323.    private
  6324.  
  6325.       -------------------------------------------------------------------------
  6326.       -- declare the types and objects needed to keep track of
  6327.       -- the tree walk
  6328.       -------------------------------------------------------------------------
  6329.  
  6330.       type WALK_ELEMENT_TYPE is
  6331.          record
  6332.             TREE_ID : TREE_NODE_ACCESS_TYPE;
  6333.             LIST_IN_PROGRESS : LIST_TYPE;
  6334.             NEXT_LIST_ELEMENT : LIST_NODE_ACCESS_TYPE;
  6335.             BODY_CHECKED : BOOLEAN;
  6336.          end record;
  6337.  
  6338.       STACK_SIZE : constant NATURAL := 20;
  6339.  
  6340.       type WALK_STACK_TYPE is array ( 1 .. STACK_SIZE ) of WALK_ELEMENT_TYPE ;
  6341.  
  6342.       type WALK_STATE_TYPE is 
  6343.          record
  6344.             WALK_STACK : WALK_STACK_TYPE ;
  6345.             STACK_PTR : NATURAL := 1;
  6346.          end record ;
  6347.  
  6348.    end TREE_OPS;
  6349. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6350. --tree_ops_body.ada
  6351. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  6352.    -- version 10 February 1986 by JL   => set .prior to null in set_list_head
  6353.    -- version 5 February 1986 by JL    => added release list node to remove node
  6354.    -- version 4 February 1986 by JR    => added error messages for node exhaust
  6355.    -- version 85-11-18 17:00 by JL
  6356.  
  6357.    with TRACE_PKG ;
  6358.    with GRAPHICS_DATA ;
  6359.    with GRAPHIC_DRIVER ;
  6360.    with VIRTUAL_TERMINAL_INTERFACE ;
  6361.  
  6362.    package body TREE_OPS is
  6363.    
  6364.       procedure DISPLAY_ERROR
  6365.                  ( DISPLAY_STRING : in STRING ) is
  6366.       -- =========================================================
  6367.       --  This procedure displays the received string to the
  6368.       --  operator, waits for an operator acknowledgement, and
  6369.       --  clears the displayed line.
  6370.       -- =========================================================
  6371.          use VIRTUAL_TERMINAL_INTERFACE ;
  6372.    
  6373.          DUMMY_POINT : GRAPHICS_DATA.POINT ;
  6374.          BLANK_LINE  : constant STRING := "  " ;
  6375.          CONTINUE    : constant STRING :=
  6376.                       " Press cursor control device to continue " ;
  6377.          OPERATOR_RESPONSE : STRING(1..1) ;
  6378.          BELL_STRING : constant String(1..1) := ( others => ASCII.BEL ) ;
  6379.       begin
  6380.    
  6381.          if TRACE_PKG.REQUEST_TRACE then
  6382.             TRACE_PKG.TRACE( " ERROR MESSAGE DISPLAYED :") ;
  6383.             TRACE_PKG.TRACE( DISPLAY_STRING ) ;
  6384.          end if ;
  6385.    
  6386.          -- ring the bell to get users attention
  6387.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6388.                  ( BELL_STRING,
  6389.                    FORMAT_FUNCTION'( CENTER_A_LINE ), ROW_TYPE( 24 )) ;
  6390.    
  6391.         -- clear the area surrounding the displayed error message
  6392.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6393.                 ( BLANK_LINE ,
  6394.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 9 )) ;
  6395.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6396.                 ( BLANK_LINE ,
  6397.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 10 )) ;
  6398.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6399.                 ( BLANK_LINE ,
  6400.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 11 )) ;
  6401.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6402.                 ( BLANK_LINE ,
  6403.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 12 )) ;
  6404.    
  6405.          -- display received string and continue message
  6406.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6407.                  ( DISPLAY_STRING,
  6408.                    FORMAT_FUNCTION'( CENTER_A_LINE ), ROW_TYPE( 10 )) ;
  6409.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6410.                  ( CONTINUE,
  6411.                    FORMAT_FUNCTION'( CENTER_A_LINE ), ROW_TYPE( 11 )) ;
  6412.    
  6413.         -- wait for operator acknowledgement 
  6414.           -- use locator for ack
  6415.         DUMMY_POINT := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  6416.    
  6417.         -- clear the messages
  6418.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6419.                 ( BLANK_LINE ,
  6420.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 10 )) ;
  6421.         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  6422.                 ( BLANK_LINE ,
  6423.                   FORMAT_FUNCTION'( CLEAR_A_LINE ), ROW_TYPE( 11 )) ;
  6424.    
  6425.       exception
  6426.          -- dont let the operator abort during display error
  6427.          when GRAPHICS_DATA.OPERATION_ABORTED_BY_OPERATOR =>
  6428.             null ;
  6429.          -- propogate any unknown error
  6430.          when others =>
  6431.             raise ;
  6432.    
  6433.       end DISPLAY_ERROR ;
  6434.  
  6435.  
  6436.       -------------------------------------------------------------------------
  6437.       -- The following subprograms provide operations to get and
  6438.       -- release nodes.
  6439.       -------------------------------------------------------------------------
  6440.    
  6441.       function GET_NEW_GRAPH_NODE (OWNING_TREE: in TREE_NODE_ACCESS_TYPE)
  6442.                                   return GRAPH_NODE_ACCESS_TYPE is
  6443.          -- Get a new Graph Node, and set the OWNING_TREE_NODE field to
  6444.          -- the specified Tree Node.
  6445.          NULL_NODE : GRAPH_NODE_TYPE ;  -- all fields preset to null values
  6446.          PTR       : GRAPH_NODE_ACCESS_TYPE := NULL_POINTER;
  6447.       begin
  6448.          -- check that OWNING_TREE is valid
  6449.          if OWNING_TREE < 0 or OWNING_TREE > MAX_TREE_NODES then
  6450.             raise INVALID_NODE_SPECIFIED;
  6451.          end if;
  6452.          -- search the GRAPH node array looking for an unused node
  6453.          for I in 1..MAX_GRAPH_NODES loop
  6454.             if GRAPH(I).OWNING_TREE_NODE = NULL_POINTER then
  6455.                -- found unused node
  6456.                PTR := I;
  6457.                exit;
  6458.             end if;
  6459.          end loop;
  6460.          if PTR = NULL_POINTER then
  6461.             -- no unused node available
  6462.             DISPLAY_ERROR (" UNABLE TO CONTINUE - Graph Node Supply Exhausted ") ;
  6463.             raise NODE_SUPPLY_EXHAUSTED;
  6464.          else
  6465.             -- initialize the node to null values
  6466.             GRAPH(PTR) := NULL_NODE ;
  6467.             -- set ownership of the Graph Node
  6468.             GRAPH(PTR).OWNING_TREE_NODE := OWNING_TREE;
  6469.             -- return the Graph Node found
  6470.             return PTR;
  6471.          end if;
  6472.       end GET_NEW_GRAPH_NODE;
  6473.  
  6474.       procedure RELEASE_GRAPH_NODE (NODE: in GRAPH_NODE_ACCESS_TYPE) is
  6475.       -- This procedure releases the specified Graph Node.
  6476.       begin
  6477.          -- check that NODE is valid
  6478.          if NODE < 0 or NODE > MAX_GRAPH_NODES then
  6479.             raise INVALID_NODE_SPECIFIED;
  6480.          else
  6481.             -- show the graph node as unused
  6482.             GRAPH(NODE).OWNING_TREE_NODE := NULL_POINTER;
  6483.          end if;
  6484.       end RELEASE_GRAPH_NODE;
  6485.    
  6486.       function GET_NEW_PROLOGUE_NODE (OWNING_TREE: in TREE_NODE_ACCESS_TYPE)
  6487.                                   return PROLOGUE_NODE_ACCESS_TYPE is
  6488.          -- Get a new PROLOGUE Node, and set the OWNING_TREE_NODE field to
  6489.          -- the specified Tree Node.
  6490.          NULL_NODE : PROLOGUE_NODE_TYPE ;  -- all fields preset to null values
  6491.          PTR       : PROLOGUE_NODE_ACCESS_TYPE := NULL_POINTER;
  6492.       begin
  6493.          -- check that OWNING_TREE is valid
  6494.          if OWNING_TREE < 0 or OWNING_TREE > MAX_TREE_NODES then
  6495.             raise INVALID_NODE_SPECIFIED;
  6496.          end if;
  6497.          -- search the PROLOGUE node array looking for an unused node
  6498.          for I in 1..MAX_PROLOGUE_NODES loop
  6499.             if PROLOGUE(I).OWNING_TREE_NODE = NULL_POINTER then
  6500.                -- found unused node
  6501.                PTR := I;
  6502.                exit;
  6503.             end if;
  6504.          end loop;
  6505.          if PTR = NULL_POINTER then
  6506.             -- no unused node available
  6507.             DISPLAY_ERROR (" UNABLE TO CONTINUE - Prologue Node Supply Exhausted ") ;
  6508.             raise NODE_SUPPLY_EXHAUSTED;
  6509.          else
  6510.             -- initialize the node to null values
  6511.             PROLOGUE(PTR) := NULL_NODE ;
  6512.             -- set ownership of the PROLOGUE Node
  6513.             PROLOGUE(PTR).OWNING_TREE_NODE := OWNING_TREE;
  6514.             -- return the PROLOGUE Node found
  6515.             return PTR;
  6516.          end if;
  6517.       end GET_NEW_PROLOGUE_NODE;
  6518.  
  6519.       procedure RELEASE_PROLOGUE_NODE (NODE: in PROLOGUE_NODE_ACCESS_TYPE) is
  6520.       -- This procedure releases the specified PROLOGUE Node.
  6521.       begin
  6522.          -- check that NODE is valid
  6523.          if NODE < 0 or NODE > MAX_PROLOGUE_NODES then
  6524.             raise INVALID_NODE_SPECIFIED;
  6525.          else
  6526.             -- show the PROLOGUE node as unused
  6527.             PROLOGUE(NODE).OWNING_TREE_NODE := NULL_POINTER;
  6528.          end if;
  6529.       end RELEASE_PROLOGUE_NODE;
  6530.    
  6531.       function GET_NEW_LIST_NODE (ITEM: in TREE_NODE_ACCESS_TYPE)
  6532.                                  return LIST_NODE_ACCESS_TYPE is
  6533.       -- Get a new List Node, and set the ITEM field to the specified
  6534.       -- value.  The ITEM pointer must not be null, as this indicates
  6535.       -- an used List Node.
  6536.          PTR : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  6537.       begin
  6538.          -- check that ITEM is valid
  6539.          if ITEM < 0 or ITEM > MAX_TREE_NODES then
  6540.             raise INVALID_NODE_SPECIFIED;
  6541.          end if;
  6542.          -- search the LIST node array looking for an unused node
  6543.          for I in 1..MAX_LIST_NODES loop
  6544.             if LIST(I).ITEM = NULL_POINTER then
  6545.                -- found unused node
  6546.                PTR := I;
  6547.                exit;
  6548.             end if;
  6549.          end loop;
  6550.          if PTR = NULL_POINTER then
  6551.             -- no unused node available
  6552.             DISPLAY_ERROR (" UNABLE TO CONTINUE - List Node Supply Exhausted ") ;
  6553.             raise NODE_SUPPLY_EXHAUSTED;
  6554.          else
  6555.             -- set the Item pointed to by the List Node, thereby
  6556.             -- marking it as used
  6557.             LIST(PTR).ITEM := ITEM;
  6558.             -- return the List Node found
  6559.             return PTR;
  6560.          end if;
  6561.       end GET_NEW_LIST_NODE;
  6562.  
  6563.       procedure RELEASE_LIST_NODE (NODE: in LIST_NODE_ACCESS_TYPE) is
  6564.          -- This procedure releases the specified list node.
  6565.          PTR : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  6566.       begin
  6567.          -- check that NODE is valid
  6568.          if NODE < 0 or NODE > MAX_LIST_NODES then
  6569.             raise INVALID_NODE_SPECIFIED;
  6570.          else
  6571.             -- show the graph node as unused
  6572.             LIST(NODE).ITEM := NULL_POINTER;
  6573.             -- set the NEXT and PRIOR fields to NULL
  6574.             LIST(NODE).NEXT := NULL_POINTER;
  6575.             LIST(NODE).PRIOR := NULL_POINTER;
  6576.          end if;
  6577.       end RELEASE_LIST_NODE;
  6578.    
  6579.       function GET_NEW_TREE_NODE (NODE_TYPE: in ENTITY_TYPE)
  6580.                                  return TREE_NODE_ACCESS_TYPE is
  6581.       -- Initialize the NODE to the correct type and set all values
  6582.       -- to NULL (or the equivalent).  This is accomplished by
  6583.       -- using nodes with the default values.
  6584.          PTR : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  6585.       begin
  6586.          -- check that ITEM is valid
  6587.          if NODE_TYPE = UNUSED or NODE_TYPE = ROOT then 
  6588.             raise INVALID_NODE_SPECIFIED;
  6589.          end if;
  6590.          -- search the LIST node array looking for an unused node
  6591.          for I in 1 .. MAX_TREE_NODES loop
  6592.             if TREE(I).NODE_TYPE = UNUSED then
  6593.                -- found unused node
  6594.                PTR := I;
  6595.                exit;
  6596.             end if;
  6597.          end loop;
  6598.          if PTR = NULL_POINTER then
  6599.             -- no unused node available
  6600.             DISPLAY_ERROR (" UNABLE TO CONTINUE - Tree Node Supply Exhausted ") ;
  6601.             raise NODE_SUPPLY_EXHAUSTED;
  6602.          else
  6603.             -- initialize the TREE Node
  6604.             declare
  6605.                NULL_NODE : TREE_NODE_TYPE ( NODE_TYPE ) ;
  6606.             begin
  6607.                TREE(PTR) := NULL_NODE ;
  6608.             end ;
  6609.             return PTR;
  6610.          end if;
  6611.       end GET_NEW_TREE_NODE;
  6612.  
  6613.       procedure EXTRACT_NODE_FROM_LIST (LIST_HEAD: in out LIST_NODE_ACCESS_TYPE;
  6614.                                         NODE: in LIST_NODE_ACCESS_TYPE);
  6615.  
  6616.       -----------------------------------------------------------------------
  6617.       -- A Local Utility
  6618.       -----------------------------------------------------------------------
  6619.  
  6620.       procedure REMOVE_REFERENCE (FROM: in TREE_NODE_ACCESS_TYPE;
  6621.                                   REFERENCED_NODE: in TREE_NODE_ACCESS_TYPE) is
  6622.          -- This procedure removes a reference to a node.  The
  6623.          -- original reference was stored in the MEMBERSHIP list 
  6624.          -- of the REFERENCED_NODE.
  6625.          CHECK_LIST : LIST_TYPE;
  6626.          LIST_HEAD : LIST_NODE_ACCESS_TYPE;
  6627.          LIST_PTR : LIST_NODE_ACCESS_TYPE;
  6628.          NULL_TREE_NODE : TREE_NODE_TYPE;  -- preset to null
  6629.          MEMBER : LIST_NODE_ACCESS_TYPE;
  6630.          NEXT_MEMBER : LIST_NODE_ACCESS_TYPE;
  6631.       begin
  6632.          if TRACE_PKG.REQUEST_TRACE then
  6633.             TRACE_PKG.TRACE (" in REMOVE_REFERENCE " & INTEGER'image(FROM) &
  6634.                              "   " & INTEGER'image(REFERENCED_NODE));
  6635.          end if ;
  6636.  
  6637.          case TREE(FROM).NODE_TYPE is
  6638.             when ROOT .. TYPE_TASK | TYPE_BODY =>
  6639.                -- remove the item from the list
  6640.                CHECK_LIST := START;
  6641.                loop
  6642.                   CHECK_LIST := NEXT_LIST_TO_SCAN (FROM, CHECK_LIST);
  6643.                   exit when CHECK_LIST = NULL_LIST;
  6644.                   LIST_HEAD := GET_LIST_HEAD (FROM, CHECK_LIST);
  6645.                   LIST_PTR := FIND_NODE_REFERENCE (LIST_HEAD,
  6646.                                                    REFERENCED_NODE);
  6647.                   if LIST_PTR /= NULL_POINTER then
  6648.                      -- extract and release the list node
  6649.                      EXTRACT_NODE_FROM_LIST (LIST_HEAD,
  6650.                                              LIST_PTR);
  6651.                      SET_LIST_HEAD (FROM, CHECK_LIST, LIST_HEAD);
  6652.                      RELEASE_LIST_NODE (LIST_PTR);
  6653.                   end if;
  6654.                end loop;
  6655.                if TREE(FROM).NODE_TYPE in TYPE_VIRTUAL_PACKAGE ..
  6656.                 TYPE_TASK then
  6657.                   if TREE(FROM).BODY_PTR = REFERENCED_NODE then
  6658.                      TREE(FROM).BODY_PTR := NULL_POINTER ;
  6659.                   end if ;
  6660.                end if ;
  6661.             when EXPORTED_PROCEDURE .. EXPORTED_FUNCTION | 
  6662.                  EXPORTED_TYPE .. EXPORTED_EXCEPTION =>
  6663.                -- remove the connection
  6664.                TREE(FROM).CALL_VARIETY := GRAPHICS_DATA.NO_CONNECTION;
  6665.                TREE(FROM).CONNECTEE := NULL_POINTER;
  6666.                -- release LINE graph nodes
  6667.                for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  6668.                   if TREE(FROM).LINE(I) /= NULL_POINTER then
  6669.                      RELEASE_GRAPH_NODE ( TREE(FROM).LINE(I) ) ;
  6670.                   else
  6671.                      exit ;
  6672.                   end if ;
  6673.                end loop ;
  6674.                TREE(FROM).LINE := NULL_LINE ;
  6675.             when EXPORTED_ENTRY_POINT =>
  6676.                -- for each node to be removed, remove all references 
  6677.                -- to the current node by processing the MEMBERSHIP list
  6678.                MEMBER := TREE(FROM).MEMBERSHIP;
  6679.                loop
  6680.                   exit when MEMBER = NULL_POINTER;
  6681.                   -- remove the reference
  6682.                   REMOVE_REFERENCE (LIST(MEMBER).ITEM, FROM);
  6683.                   -- determine the next member and release the current
  6684.                   -- list element
  6685.                   NEXT_MEMBER := LIST(MEMBER).NEXT;
  6686.                   RELEASE_LIST_NODE (MEMBER);
  6687.                   -- now process the next item in the MEMBERSHIP list
  6688.                   MEMBER := NEXT_MEMBER;
  6689.                end loop;
  6690.                -- release LINE graph nodes
  6691.                for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  6692.                   if TREE(FROM).LINE(I) /= NULL_POINTER then
  6693.                      RELEASE_GRAPH_NODE ( TREE(FROM).LINE(I) ) ;
  6694.                   else
  6695.                      exit ;
  6696.                   end if ;
  6697.                end loop ;
  6698.                -- no longer anything to connect to
  6699.                REMOVE_REFERENCE (TREE(FROM).PARENT, FROM);
  6700.                RELEASE_GRAPH_NODE ( TREE(FROM).GRAPH_DATA ) ;
  6701.                TREE(FROM) := NULL_TREE_NODE;
  6702.             when CONNECTION_BY_CALL .. CONNECTION_FOR_DATA =>
  6703.                -- release LINE graph nodes
  6704.                for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  6705.                   if TREE(FROM).LINE(I) /= NULL_POINTER then
  6706.                      RELEASE_GRAPH_NODE ( TREE(FROM).LINE(I) ) ;
  6707.                   else
  6708.                      exit ;
  6709.                   end if ;
  6710.                end loop ;
  6711.                -- remove list node for connection off parents list
  6712.                REMOVE_REFERENCE (TREE(FROM).PARENT, FROM);
  6713.                -- remove membership list reference in Connectee
  6714.                RELEASE_LIST_NODE (TREE(FROM).MEMBERSHIP);
  6715.                TREE(FROM) := NULL_TREE_NODE;
  6716.             when others =>
  6717.                null;
  6718.          end case;
  6719.       end REMOVE_REFERENCE;
  6720.  
  6721.       procedure RELEASE_TREE_NODE (NODE: in TREE_NODE_ACCESS_TYPE) is
  6722.          -- This procedure deletes the specified TREE_NODE and all of
  6723.          -- its children (if any).  It will remove any dependencies
  6724.          -- which exist on this node as well.
  6725.          MEMBER : LIST_NODE_ACCESS_TYPE;
  6726.          NEXT_MEMBER : LIST_NODE_ACCESS_TYPE;
  6727.          NULL_TREE_NODE : TREE_NODE_TYPE;  -- preset to null
  6728.          PTR : TREE_NODE_ACCESS_TYPE := NULL_POINTER;
  6729.          WALK_STATE : WALK_STATE_TYPE ;
  6730.       begin
  6731.          if TRACE_PKG.REQUEST_TRACE then
  6732.             TRACE_PKG.TRACE (" in RELEASE_TREE_NODE " & INTEGER'image(NODE));
  6733.          end if ;
  6734.  
  6735.          -- check that NODE is valid
  6736.          if NODE < 0 or NODE > MAX_TREE_NODES then
  6737.             raise INVALID_NODE_SPECIFIED;
  6738.          else
  6739.             -- release all the children by using the Tree Walk to
  6740.             -- scan all lists (except the Membership List)
  6741.             START_TREE_WALK ( NODE, WALK_STATE );
  6742.             loop
  6743.                TREE_WALK ( WALK_STATE, PTR ) ;
  6744.                exit when PTR = NULL_POINTER;
  6745.                -- for each node to be removed, remove all references 
  6746.                -- to the current node by processing the MEMBERSHIP list
  6747.                MEMBER := TREE(PTR).MEMBERSHIP;
  6748.                loop
  6749.                   exit when MEMBER = NULL_POINTER;
  6750.                   -- remove the reference
  6751.                   REMOVE_REFERENCE (LIST(MEMBER).ITEM, PTR);
  6752.                   -- determine the next member and release the current
  6753.                   -- list element
  6754.                   NEXT_MEMBER := LIST(MEMBER).NEXT;
  6755.                   RELEASE_LIST_NODE (MEMBER);
  6756.                   -- now process the next item in the MEMBERSHIP list
  6757.                   MEMBER := NEXT_MEMBER;
  6758.                end loop;
  6759.                -- release the associated Graph Node
  6760.                if TREE(PTR).GRAPH_DATA /= NULL_POINTER then
  6761.                   RELEASE_GRAPH_NODE (TREE(PTR).GRAPH_DATA);
  6762.                end if;
  6763.                -- release the associated Prologue Node
  6764.                if TREE(PTR).NODE_TYPE in TYPE_VIRTUAL_PACKAGE ..
  6765.                     TYPE_TASK and then
  6766.                          TREE(PTR).PROLOGUE_PTR /= NULL_POINTER then
  6767.                   RELEASE_PROLOGUE_NODE (TREE(PTR).PROLOGUE_PTR);
  6768.                end if;
  6769.                -- handle releases and reference removal for nodes
  6770.                -- with non-list type connections
  6771.                if TREE(PTR).NODE_TYPE in EXPORTED_PROCEDURE ..
  6772.                 CONNECTION_FOR_DATA then
  6773.                   -- release LINE graph nodes
  6774.                   for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  6775.                      if TREE(PTR).LINE(I) /= NULL_POINTER then
  6776.                         RELEASE_GRAPH_NODE ( TREE(PTR).LINE(I) ) ;
  6777.                      else
  6778.                         exit ;
  6779.                      end if ;
  6780.                   end loop ;
  6781.                   -- remove membership list reference in Connectee
  6782.                   BREAK_REFERENCE ( PTR, TREE(PTR).CONNECTEE ) ;
  6783.                end if ;
  6784.                -- delete the lists of the current node and mark as unused
  6785.                TREE(PTR) := NULL_TREE_NODE;
  6786.             end loop;
  6787.          end if;
  6788.       end RELEASE_TREE_NODE;
  6789.    
  6790.       -------------------------------------------------------------------------
  6791.       -- The following subprograms provide operations to help
  6792.       -- use the tree.
  6793.       -------------------------------------------------------------------------
  6794.    
  6795.       procedure SET_PARENT (CHILD : in TREE_NODE_ACCESS_TYPE;
  6796.                             PARENT : in TREE_NODE_ACCESS_TYPE;
  6797.                             RELATION : IN LIST_TYPE)is
  6798.          -- Set the Parent Field of the Child Node, and Place the
  6799.          -- Child in the specified List of the Parent.
  6800.          PTR : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  6801.       begin
  6802.          -- check that the CHILD and PARENT are valid
  6803.          if CHILD < 0 or CHILD > MAX_TREE_NODES or
  6804.             PARENT < 0 or PARENT > MAX_TREE_NODES then
  6805.             raise INVALID_NODE_SPECIFIED;
  6806.          end if;
  6807.          -- set the PARENT field in the CHILD
  6808.          TREE(CHILD).PARENT := PARENT;
  6809.          -- place the child in the appropriate List
  6810.          PTR := GET_NEW_LIST_NODE (CHILD);
  6811.          ADD_NODE_TO_LIST (PARENT, RELATION, PTR);
  6812.       end SET_PARENT;
  6813.  
  6814.       -------------------------------------------------------------------------
  6815.       --  The TREE WALK operations
  6816.       -------------------------------------------------------------------------
  6817.  
  6818.       procedure START_TREE_WALK (PARENT : in TREE_NODE_ACCESS_TYPE ;
  6819.                                  WALK_STATE : in out WALK_STATE_TYPE ) is
  6820.       -- This procedure is used to initialize a tree walk, by indicating
  6821.       -- that a tree walk is starting for the named parent.
  6822.          WALK_STACK : WALK_STACK_TYPE renames WALK_STATE.WALK_STACK ;
  6823.          STACK_PTR  : NATURAL renames WALK_STATE.STACK_PTR ;
  6824.       begin
  6825.          if TRACE_PKG.REQUEST_TRACE then
  6826.             TRACE_PKG.TRACE (" in START_TREE_WALK " & INTEGER'image(PARENT));
  6827.          end if ;
  6828.  
  6829.          -- check if PARENT is valid
  6830.          if ( PARENT < 0 or PARENT > MAX_TREE_NODES ) and then
  6831.           TREE(PARENT).NODE_TYPE = UNUSED then
  6832.             raise INVALID_NODE_SPECIFIED;
  6833.          else
  6834.             -- initialize the WALK_STACK for walk with PARENT
  6835.             STACK_PTR := 1;
  6836.             WALK_STACK(STACK_PTR).TREE_ID := PARENT;
  6837.             WALK_STACK(STACK_PTR).LIST_IN_PROGRESS := 
  6838.              NEXT_LIST_TO_SCAN (PARENT, START);
  6839.             WALK_STACK(STACK_PTR).NEXT_LIST_ELEMENT := NULL_POINTER;
  6840.             WALK_STACK(STACK_PTR).BODY_CHECKED := FALSE;
  6841.          end if;
  6842.       end START_TREE_WALK;
  6843.  
  6844.       procedure TREE_WALK (WALK_STATE : in out WALK_STATE_TYPE ;
  6845.                            NEXT_NODE : out TREE_NODE_ACCESS_TYPE ) is
  6846.          -- This function can be used to walk the tree which
  6847.          -- has the Parent as its root.  The function TREE_WALK will
  6848.          -- return NULL_POINTER when all the children have been visited.
  6849.          -- The tree walk excludes the Membership list.  This function
  6850.          -- is NOT reentrant, because it uses a static data structure.
  6851.          PTR : LIST_NODE_ACCESS_TYPE;
  6852.          WALK_STACK : WALK_STACK_TYPE renames WALK_STATE.WALK_STACK ;
  6853.          STACK_PTR  : NATURAL renames WALK_STATE.STACK_PTR ;
  6854.          VALID_BODY_PTR : BOOLEAN := FALSE;
  6855.  
  6856.          procedure PUSH_STACK (ITEM : in TREE_NODE_ACCESS_TYPE ) is
  6857.          begin
  6858.             if STACK_PTR < STACK_SIZE then
  6859.                STACK_PTR := STACK_PTR + 1;
  6860.             else
  6861.                raise WALK_STACK_OVERFLOW;
  6862.             end if;
  6863.             TRACE_PKG.TRACE (" push the Walk Stack " & INTEGER'image(STACK_PTR));
  6864.  
  6865.             WALK_STACK(STACK_PTR).TREE_ID := ITEM ;
  6866.             WALK_STACK(STACK_PTR).LIST_IN_PROGRESS := 
  6867.              NEXT_LIST_TO_SCAN ( ITEM, START);
  6868.             WALK_STACK(STACK_PTR).NEXT_LIST_ELEMENT := NULL_POINTER;
  6869.             WALK_STACK(STACK_PTR).BODY_CHECKED := FALSE;
  6870.          end PUSH_STACK ;
  6871.  
  6872.       begin
  6873.          if TRACE_PKG.REQUEST_TRACE then
  6874.             TRACE_PKG.TRACE (" in TREE_WALK, stack_ptr = " & 
  6875.                              INTEGER'image(STACK_PTR));
  6876.          end if ;
  6877.  
  6878.          -- if the Stack Pointer is zero then the walk is completed
  6879.          if STACK_PTR <= 0 then
  6880.             if TRACE_PKG.REQUEST_TRACE then
  6881.                TRACE_PKG.TRACE (" Tree Walk Complete *********** ");
  6882.             end if ;
  6883.  
  6884.             NEXT_NODE := NULL_POINTER ;
  6885.             return ;
  6886.          end if;
  6887.          -- search for the next node in the Tree Walk
  6888.          loop
  6889.             -- set PTR to the Next List Element to be processed
  6890.             PTR := WALK_STACK(STACK_PTR).NEXT_LIST_ELEMENT;
  6891.             -- if NULL then must be starting up on a list
  6892.             -- otherwise advance to next element in LIST_IN_PROGRESS
  6893.             if PTR = NULL_POINTER then
  6894.                PTR := GET_LIST_HEAD (WALK_STACK(STACK_PTR).TREE_ID,
  6895.                                      WALK_STACK(STACK_PTR).LIST_IN_PROGRESS);
  6896.             end if;
  6897.             -- if end of LIST (PTR now Null) then advance to next LIST
  6898.             if PTR = NULL_POINTER then  -- at end of List or Null List
  6899.                if WALK_STACK(STACK_PTR).LIST_IN_PROGRESS /= NULL_LIST then
  6900.                   -- set LIST_IN_PROGRESS to next list
  6901.                   WALK_STACK(STACK_PTR).LIST_IN_PROGRESS :=
  6902.                    NEXT_LIST_TO_SCAN (WALK_STACK(STACK_PTR).TREE_ID,
  6903.                                       WALK_STACK(STACK_PTR).LIST_IN_PROGRESS);
  6904.                else
  6905.                   -- have searched all children contained in lists 
  6906.                   -- of this node, so we check the body (if one exists
  6907.                   -- and hasn't already been checked) otherwise
  6908.                   -- were are done with this node
  6909.                   if not WALK_STACK(STACK_PTR).BODY_CHECKED then
  6910.                      -- check the body
  6911.                      WALK_STACK(STACK_PTR).BODY_CHECKED := TRUE;
  6912.                      VALID_BODY_PTR := FALSE;
  6913.                      begin
  6914.                         if TREE(WALK_STACK(STACK_PTR).TREE_ID).BODY_PTR /= 
  6915.                          NULL_POINTER then
  6916.                            VALID_BODY_PTR := TRUE;
  6917.                         end if;
  6918.                      exception
  6919.                         -- in case the BODY_PTR field not defined for this Node
  6920.                         when others =>
  6921.                            null;
  6922.                      end;
  6923.                      if VALID_BODY_PTR then
  6924.                         TRACE_PKG.TRACE (" NEXT WALK NODE (BODY) => ");
  6925.                         TRACE_PKG.TRACE
  6926.                          (INTEGER'image(TREE (WALK_STACK(STACK_PTR).TREE_ID).BODY_PTR));
  6927.  
  6928.                         WALK_STACK(STACK_PTR).NEXT_LIST_ELEMENT := NULL_POINTER ;
  6929.                         WALK_STACK(STACK_PTR).LIST_IN_PROGRESS := NULL_LIST ;
  6930.                         PUSH_STACK ( TREE(WALK_STACK(STACK_PTR).TREE_ID).BODY_PTR ) ;
  6931.                      end if;
  6932.                   else
  6933.                      -- we are done at this level.  Pop the stack and walk
  6934.                      -- that node.
  6935.                      STACK_PTR := STACK_PTR - 1;
  6936.                      -- return the next Tree Node to be examined in the Walk
  6937.                      TRACE_PKG.TRACE (" NEXT WALK NODE => ");
  6938.                      TRACE_PKG.TRACE
  6939.                       (INTEGER'image(WALK_STACK(STACK_PTR+1).TREE_ID));
  6940.                      NEXT_NODE := WALK_STACK(STACK_PTR+1).TREE_ID ;
  6941.                      return ;
  6942.                   end if;
  6943.                end if;
  6944.             else
  6945.                -- store the Next list element now, so that is the user
  6946.                -- of the Tree Walk deletes the current Tree node we can
  6947.                -- continue the walk.
  6948.                WALK_STACK(STACK_PTR).NEXT_LIST_ELEMENT := LIST(PTR).NEXT;
  6949.                -- if the Next list element is null, then advance to the
  6950.                -- next list
  6951.                if LIST(PTR).NEXT = NULL_POINTER then
  6952.                   WALK_STACK(STACK_PTR).LIST_IN_PROGRESS :=
  6953.                    NEXT_LIST_TO_SCAN (WALK_STACK(STACK_PTR).TREE_ID,
  6954.                                       WALK_STACK(STACK_PTR).LIST_IN_PROGRESS) ;
  6955.                end if ;
  6956.                -- check subtrees of current List element by pushing the stack
  6957.                PUSH_STACK ( LIST(PTR).ITEM ) ;
  6958.             end if;
  6959.          end loop;
  6960.       exception
  6961.          when others =>
  6962.             TRACE_PKG.TRACE (" exception trapped in  TREE_WALK ") ;
  6963.             raise ;
  6964.       end TREE_WALK;
  6965.    
  6966.       ----------------------------------------------------------------------
  6967.       -- These subprograms perform LIST manipulation functions
  6968.       -- and check to make sure that the LIST_NODE pointed to is
  6969.       -- the LIST header node (null back pointer).
  6970.       --
  6971.       -- The subprograms will also add or remove the corresponding 
  6972.       -- node from the MEMBERSHIP list of the TREE_NODE pointed to 
  6973.       -- by the node(s).
  6974.       ----------------------------------------------------------------------
  6975.    
  6976.       function GET_LIST_HEAD (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  6977.                               REQUESTED_LIST: in LIST_TYPE)
  6978.                              return LIST_NODE_ACCESS_TYPE is
  6979.          -- Get the List Head for the REQUESTED_LIST of the specified
  6980.          -- Tree Node LIST_OWNER.
  6981.       begin
  6982.          -- check the validity of the NODE
  6983.          if ( LIST_OWNER < 0 or LIST_OWNER > MAX_TREE_NODES ) and then
  6984.           TREE(LIST_OWNER).NODE_TYPE = UNUSED then
  6985.             raise INVALID_NODE_SPECIFIED;
  6986.          end if;
  6987.          case REQUESTED_LIST is
  6988.             when START | NULL_LIST =>
  6989.                return NULL_POINTER;
  6990.             when CALLEE_LIST =>
  6991.                return TREE(LIST_OWNER).CALLEE_LIST;
  6992.             when CONTAINED_LIST =>
  6993.                return TREE(LIST_OWNER).CONTAINED_ENTITY_LIST;
  6994.             when DATA_CONNECT_LIST =>
  6995.                return TREE(LIST_OWNER).DATA_CONNECT_LIST;
  6996.             when ENTRY_LIST =>
  6997.                return TREE(LIST_OWNER).ENTRY_LIST;
  6998.             when EXPORTED_LIST =>
  6999.                return TREE(LIST_OWNER).EXPORTED_LIST;
  7000.             when IMPORTED_LIST =>
  7001.                return TREE(LIST_OWNER).IMPORTED_LIST;
  7002.          end case;
  7003.       exception
  7004.          when others =>
  7005.             raise;
  7006.       end GET_LIST_HEAD;
  7007.  
  7008.       procedure SET_LIST_HEAD (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  7009.                                REQUESTED_LIST: in LIST_TYPE;
  7010.                                NEW_LIST_HEAD: in LIST_NODE_ACCESS_TYPE) is
  7011.          -- Set the List Head for the REQUESTED_LIST of the specified
  7012.          -- Tree Node LIST_OWNER.
  7013.       begin
  7014.          -- check the validity of the NODE
  7015.          if ( LIST_OWNER < 0 or LIST_OWNER > MAX_TREE_NODES ) and then
  7016.           TREE(LIST_OWNER).NODE_TYPE = UNUSED then
  7017.             raise INVALID_NODE_SPECIFIED;
  7018.          end if;
  7019.          -- set the prior pointer to null
  7020.          if NEW_LIST_HEAD /= NULL_POINTER then
  7021.             LIST( NEW_LIST_HEAD ).PRIOR := NULL_POINTER ;
  7022.          end if ;
  7023.          -- set the list head
  7024.          case REQUESTED_LIST is
  7025.             when START | NULL_LIST =>
  7026.                null;  -- not real lists so no action required
  7027.             when CALLEE_LIST =>
  7028.                TREE(LIST_OWNER).CALLEE_LIST := NEW_LIST_HEAD;
  7029.             when CONTAINED_LIST =>
  7030.                TREE(LIST_OWNER).CONTAINED_ENTITY_LIST := NEW_LIST_HEAD;
  7031.             when DATA_CONNECT_LIST =>
  7032.                TREE(LIST_OWNER).DATA_CONNECT_LIST := NEW_LIST_HEAD;
  7033.             when ENTRY_LIST =>
  7034.                TREE(LIST_OWNER).ENTRY_LIST := NEW_LIST_HEAD;
  7035.             when EXPORTED_LIST =>
  7036.                TREE(LIST_OWNER).EXPORTED_LIST := NEW_LIST_HEAD;
  7037.             when IMPORTED_LIST =>
  7038.                TREE(LIST_OWNER).IMPORTED_LIST := NEW_LIST_HEAD;
  7039.          end case;
  7040.       exception
  7041.          when others =>
  7042.             TRACE_PKG.TRACE (" error found in SET_LIST_HEAD - node type " &
  7043.                               ENTITY_TYPE'image(TREE(LIST_OWNER).NODE_TYPE));
  7044.             raise;
  7045.       end SET_LIST_HEAD;
  7046.  
  7047.       procedure DELETE_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  7048.                              REQUESTED_LIST: in LIST_TYPE) is
  7049.          -- Delete the entire REQUESTED_LIST, resulting in a NULL_POINTER
  7050.          -- for the LIST_HEAD.
  7051.          NEXT_PTR : LIST_NODE_ACCESS_TYPE := NULL_POINTER;
  7052.          PTR      : LIST_NODE_ACCESS_TYPE := GET_LIST_HEAD ( LIST_OWNER ,
  7053.                                                              REQUESTED_LIST);
  7054.       begin
  7055.          if TRACE_PKG.REQUEST_TRACE then
  7056.             TRACE_PKG.TRACE (" in DELETE_LIST " & INTEGER'image(LIST_OWNER) &
  7057.                              "  " & LIST_TYPE'image(REQUESTED_LIST));
  7058.          end if ;
  7059.  
  7060.          -- check that list exists
  7061.          while PTR /= NULL_POINTER loop
  7062.             -- store the next pointer
  7063.             NEXT_PTR := LIST(PTR).NEXT;
  7064.             -- remove the currently pointed to node using a call to
  7065.             -- REMOVE_NODE_FROM_LIST so that the MEMBERSHIP links
  7066.             -- will be correctly handled.
  7067.             REMOVE_NODE_FROM_LIST (LIST_OWNER, REQUESTED_LIST, PTR);
  7068.             -- set PTR to the next node
  7069.             PTR := NEXT_PTR;
  7070.          end loop;
  7071.       end DELETE_LIST;
  7072.    
  7073.       ------------------------------------------------------------------------
  7074.       -- A Local Insert
  7075.       ------------------------------------------------------------------------
  7076.  
  7077.       procedure INSERT_NODE_IN_LIST (LIST_HEAD: in out LIST_NODE_ACCESS_TYPE;
  7078.                                      NODE_TO_BE_ADDED: in LIST_NODE_ACCESS_TYPE)
  7079.       is
  7080.          -- Add the Node to the end of the current list.  Start a new
  7081.          -- LIST if the current one is NULL.  
  7082.          PTR : LIST_NODE_ACCESS_TYPE := LIST_HEAD;
  7083.       begin
  7084.          if TRACE_PKG.REQUEST_TRACE then
  7085.             TRACE_PKG.TRACE (" in INSERT_NODE " & INTEGER'image(LIST_HEAD) & 
  7086.                              "   " & INTEGER'image(NODE_TO_BE_ADDED));
  7087.          end if ;
  7088.  
  7089.          -- if LIST_HEAD is NULL then start the list
  7090.          if PTR = NULL_POINTER then
  7091.             LIST_HEAD := NODE_TO_BE_ADDED;
  7092.             -- make sure PRIOR and NEXT pointers are NULL
  7093.             LIST(NODE_TO_BE_ADDED).PRIOR := NULL_POINTER;
  7094.             LIST(NODE_TO_BE_ADDED).NEXT := NULL_POINTER;
  7095.          else
  7096.             -- check for a valid LIST and NODE
  7097.             if (PTR < 0 or PTR > MAX_LIST_NODES) then
  7098.                 raise INVALID_LIST_SPECIFIED;
  7099.             elsif (NODE_TO_BE_ADDED < 0 or NODE_TO_BE_ADDED > MAX_LIST_NODES) 
  7100.              and then LIST(NODE_TO_BE_ADDED).ITEM = NULL_POINTER then
  7101.                 raise INVALID_NODE_SPECIFIED;
  7102.             end if;
  7103.             -- find the end of the list
  7104.             loop
  7105.                 -- check if end of list
  7106.                if LIST(PTR).NEXT = NULL_POINTER then
  7107.                   exit;
  7108.                -- check for invalid list pointer
  7109.                elsif LIST(PTR).NEXT < 0 or LIST(PTR).NEXT > MAX_LIST_NODES then
  7110.                   raise LIST_CORRUPTED;
  7111.                else
  7112.                   -- set to the next list element
  7113.                   PTR := LIST(PTR).NEXT;
  7114.                end if;
  7115.             end loop;
  7116.             -- set the NEXT pointer of the old list end element
  7117.             LIST(PTR).NEXT := NODE_TO_BE_ADDED;
  7118.             -- set the PRIOR pointer of the new list end element
  7119.             LIST(NODE_TO_BE_ADDED).PRIOR := PTR;
  7120.          end if;
  7121.       end INSERT_NODE_IN_LIST;
  7122.    
  7123.       procedure ADD_NODE_TO_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  7124.                                   REQUESTED_LIST: in LIST_TYPE;
  7125.                                   NODE_TO_BE_ADDED: in LIST_NODE_ACCESS_TYPE)
  7126.       is
  7127.          -- Add the Node to the end of the current list.  Start a new
  7128.          -- LIST if the current one is NULL.  Place a reference to the
  7129.          -- LIST_OWNER in the MEMBERSHIP list of the ITEM of the list
  7130.          -- node NODE_TO_BE_ADDED.
  7131.          ITEM_PTR : TREE_NODE_ACCESS_TYPE;
  7132.          NEW_LIST_NODE : LIST_NODE_ACCESS_TYPE;
  7133.          PTR : LIST_NODE_ACCESS_TYPE := GET_LIST_HEAD (LIST_OWNER,
  7134.                                                        REQUESTED_LIST);
  7135.          REF_PTR : LIST_NODE_ACCESS_TYPE;
  7136.       begin
  7137.          if TRACE_PKG.REQUEST_TRACE then
  7138.             TRACE_PKG.TRACE (" in ADD_NODE " & INTEGER'image(LIST_OWNER) &
  7139.                              "   " & LIST_TYPE'image(REQUESTED_LIST) &
  7140.                              "   " & INTEGER'image(NODE_TO_BE_ADDED));
  7141.          end if ;
  7142.  
  7143.          -- Insert the node in the list specified and update the
  7144.          -- actual list head value in case it changed.
  7145.          INSERT_NODE_IN_LIST (PTR, NODE_TO_BE_ADDED);
  7146.          SET_LIST_HEAD (LIST_OWNER, REQUESTED_LIST, PTR);
  7147.  
  7148.          -- now add the LIST_OWNER to the MEMBERSHIP list of the
  7149.          -- TREE node pointed to by ITEM of NODE_TO_BE_ADDED.
  7150.          ITEM_PTR := LIST(NODE_TO_BE_ADDED).ITEM;
  7151.          if ITEM_PTR /= NULL_POINTER then
  7152.             PTR := TREE(ITEM_PTR).MEMBERSHIP;
  7153.             REF_PTR := FIND_NODE_REFERENCE (PTR, LIST_OWNER);
  7154.             if REF_PTR /= NULL_POINTER then
  7155.                -- A MEMBERSHIP reference already exists so just 
  7156.                -- increment the reference count
  7157.                LIST(REF_PTR).REF_COUNT := LIST(REF_PTR).REF_COUNT + 1;
  7158.             else
  7159.                -- add a node to the list
  7160.                NEW_LIST_NODE := GET_NEW_LIST_NODE (LIST_OWNER);
  7161.                INSERT_NODE_IN_LIST (TREE(ITEM_PTR).MEMBERSHIP, NEW_LIST_NODE);
  7162.                LIST(NEW_LIST_NODE).REF_COUNT := 1;
  7163.             end if;
  7164.          end if;
  7165.       exception
  7166.          when others =>
  7167.             TRACE_PKG.TRACE (" error found in ADD_NODE ");
  7168.             raise;
  7169.       end ADD_NODE_TO_LIST;
  7170.    
  7171.       ------------------------------------------------------------------------
  7172.       -- A Local Extract 
  7173.       ------------------------------------------------------------------------
  7174.  
  7175.       procedure EXTRACT_NODE_FROM_LIST (LIST_HEAD: in out LIST_NODE_ACCESS_TYPE;
  7176.                                         NODE: in LIST_NODE_ACCESS_TYPE) is
  7177.          -- Extract without altering the specified node from the List.  
  7178.          -- Set the LIST to NULL if this is the last element being removed.  
  7179.          PTR : LIST_NODE_ACCESS_TYPE := NODE;
  7180.       begin
  7181.          if TRACE_PKG.REQUEST_TRACE then
  7182.             TRACE_PKG.TRACE (" in EXTRACT_NODE " & INTEGER'image(LIST_HEAD) &
  7183.                              "   " & INTEGER'image(NODE));
  7184.          end if ;
  7185.  
  7186.          -- check for a valid NODE and LIST_HEAD
  7187.          if (PTR < 0 or PTR > MAX_LIST_NODES) or
  7188.             (LIST_HEAD < 0 or LIST_HEAD > MAX_LIST_NODES) then
  7189.              raise INVALID_LIST_SPECIFIED;
  7190.          end if;
  7191.          -- remove the NODE from the LIST by altering the PRIOR and NEXT
  7192.          -- pointers of the adjacent list elements
  7193.          if LIST(PTR).PRIOR /= NULL_POINTER then
  7194.             -- set the NEXT field to the PRIOR list element
  7195.             LIST(LIST(PTR).PRIOR).NEXT := LIST(PTR).NEXT;
  7196.          else
  7197.             -- Null PRIOR indicates is first member of List 
  7198.             -- so update the value of LIST_HEAD.
  7199.             LIST_HEAD := LIST(PTR).NEXT;
  7200.          end if;
  7201.          if LIST(PTR).NEXT /= NULL_POINTER then
  7202.             -- set the PRIOR field of the NEXT list element
  7203.             LIST(LIST(PTR).NEXT).PRIOR := LIST(PTR).PRIOR;
  7204.          end if;
  7205.       end EXTRACT_NODE_FROM_LIST;
  7206.    
  7207.       procedure REMOVE_NODE_FROM_LIST (LIST_OWNER: in TREE_NODE_ACCESS_TYPE;
  7208.                                        REQUESTED_LIST: in LIST_TYPE;
  7209.                                        NODE: in LIST_NODE_ACCESS_TYPE) is
  7210.          -- Remove and releases the specified node from the List.  Set the 
  7211.          -- LIST to NULL if this is the last element being removed.  Remove 
  7212.          -- and release the reference to the LIST_OWNER from the MEMBERSHIP 
  7213.          -- list of the ITEM pointed to by the list node NODE.
  7214.          LIST_HEAD : LIST_NODE_ACCESS_TYPE := GET_LIST_HEAD (LIST_OWNER,
  7215.                                                              REQUESTED_LIST);
  7216.          ITEM_PTR : TREE_NODE_ACCESS_TYPE;
  7217.          PTR : LIST_NODE_ACCESS_TYPE := NODE;
  7218.          REF_PTR : LIST_NODE_ACCESS_TYPE;
  7219.       begin
  7220.          if TRACE_PKG.REQUEST_TRACE then
  7221.             TRACE_PKG.TRACE (" in REMOVE_NODE " & INTEGER'image(LIST_OWNER) &
  7222.                              "   " & LIST_TYPE'image(REQUESTED_LIST) &
  7223.                              "   " & INTEGER'image(NODE));
  7224.          end if ;
  7225.  
  7226.          -- extract the node from the list specified and update the
  7227.          -- actual list head value in case it changed.
  7228.          EXTRACT_NODE_FROM_LIST (LIST_HEAD, NODE);
  7229.          SET_LIST_HEAD (LIST_OWNER, REQUESTED_LIST, LIST_HEAD);
  7230.  
  7231.          -- remove reference in MEMBERSHIP list of ITEM pointed to
  7232.          -- by the List Node to the LIST_OWNER.
  7233.          ITEM_PTR := LIST(PTR).ITEM;
  7234.          if ITEM_PTR /= NULL_POINTER then
  7235.             PTR := TREE(ITEM_PTR).MEMBERSHIP;
  7236.             REF_PTR := FIND_NODE_REFERENCE (PTR, LIST_OWNER);
  7237.             if REF_PTR /= NULL_POINTER then
  7238.                -- decrement the reference count
  7239.                if LIST(REF_PTR).REF_COUNT > 0 then
  7240.                   LIST(REF_PTR).REF_COUNT := LIST(REF_PTR).REF_COUNT - 1;
  7241.                end if;
  7242.                -- remove the node if the reference count is zero
  7243.                if LIST(REF_PTR).REF_COUNT = 0 then
  7244.                   EXTRACT_NODE_FROM_LIST (TREE(ITEM_PTR).MEMBERSHIP, REF_PTR);
  7245.                   -- free the list node from the membership list
  7246.                   RELEASE_LIST_NODE (REF_PTR);
  7247.                end if;
  7248.             end if;
  7249.          end if;
  7250.          -- free the list node from the requested list
  7251.          RELEASE_LIST_NODE( NODE ) ;
  7252.  
  7253.       end REMOVE_NODE_FROM_LIST;
  7254.    
  7255.       function FIND_NODE_REFERENCE (LIST_HEAD : in LIST_NODE_ACCESS_TYPE;
  7256.                                     NODE : in TREE_NODE_ACCESS_TYPE)
  7257.                                    return LIST_NODE_ACCESS_TYPE is
  7258.          -- Search the specified list for a reference to the specified node,
  7259.          -- and return the List Node with the reference.  If no reference is
  7260.          -- found, then return a NULL_POINTER.
  7261.  
  7262.          PTR : LIST_NODE_ACCESS_TYPE := LIST_HEAD;
  7263.       begin
  7264.          if TRACE_PKG.REQUEST_TRACE then
  7265.             TRACE_PKG.TRACE (" in FIND_NODE " & INTEGER'image(LIST_HEAD) &
  7266.                              "   " & INTEGER'image(NODE));
  7267.          end if ;
  7268.  
  7269.          -- check for an empty LIST
  7270.          if LIST_HEAD = NULL_POINTER then
  7271.             -- no reference to find
  7272.             return NULL_POINTER;
  7273.          -- check for a valid List Head
  7274.          elsif (PTR < 0 or PTR > MAX_LIST_NODES) then
  7275.              raise INVALID_LIST_SPECIFIED;
  7276.          end if;
  7277.          -- scan the list until NODE is found or the list ends
  7278.          loop
  7279.             if LIST(PTR).ITEM = NODE then
  7280.                return PTR;
  7281.             else
  7282.                -- check if end of list
  7283.                if LIST(PTR).NEXT = NULL_POINTER then
  7284.                   -- no reference to NODE in this List
  7285.                   return NULL_POINTER;
  7286.                -- check for invalid list pointer
  7287.                elsif LIST(PTR).NEXT <= 0 or LIST(PTR).NEXT > MAX_LIST_NODES then
  7288.                   if TRACE_PKG.REQUEST_TRACE then
  7289.                      TRACE_PKG.TRACE(" corrupted list found in FIND_NODE_REF ");
  7290.                   end if ;
  7291.  
  7292.                   raise LIST_CORRUPTED;
  7293.                -- set to the next list element
  7294.                else
  7295.                   PTR := LIST(PTR).NEXT;
  7296.                end if;
  7297.             end if;     
  7298.          end loop;
  7299.       end FIND_NODE_REFERENCE;
  7300.  
  7301.       function NEXT_LIST_TO_SCAN (SCANNED_NODE: in TREE_NODE_ACCESS_TYPE;
  7302.                                   CURRENT_LIST : in LIST_TYPE := START)
  7303.                                   return LIST_TYPE is
  7304.          -- Return the type of the next list to be scanned for the node
  7305.          -- specified.  If no more lists are to be scanned, return a value
  7306.          -- of NULL_LIST.
  7307.          DONE : BOOLEAN := FALSE;
  7308.          LIST_HEAD : LIST_NODE_ACCESS_TYPE;
  7309.          NEXT : LIST_TYPE := CURRENT_LIST;
  7310.       begin
  7311.          if CURRENT_LIST = NULL_LIST then
  7312.             -- all lists already scanned
  7313.             return NULL_LIST;
  7314.          else
  7315.             case TREE(SCANNED_NODE).NODE_TYPE is
  7316.                -- node types for which lists exist
  7317.                when ROOT .. TYPE_TASK | TYPE_BODY =>
  7318.                   loop
  7319.                      NEXT := LIST_TYPE'succ(NEXT);
  7320.                      if NEXT = NULL_LIST then
  7321.                         return NULL_LIST;
  7322.                      end if;
  7323.                      begin
  7324.                         LIST_HEAD := GET_LIST_HEAD (SCANNED_NODE, NEXT);
  7325.                         -- a list head is defined so return the value
  7326.                         DONE := TRUE;
  7327.                      exception
  7328.                         when others =>
  7329.                            -- list not defined for this node type so
  7330.                            -- try again
  7331.                            null;
  7332.                      end;
  7333.                      if DONE then
  7334.                         return NEXT;
  7335.                      end if;
  7336.                   end loop;
  7337.                when others =>
  7338.                   return NULL_LIST;
  7339.             end case;
  7340.          end if;
  7341.       end NEXT_LIST_TO_SCAN;
  7342.  
  7343.       procedure BREAK_REFERENCE (FROM, TO: in TREE_NODE_ACCESS_TYPE) is
  7344.          -- Remove the reference indication in the MEMBERSHIP_LIST of the
  7345.          -- TO node as being referenced by the FROM node.
  7346.          NEW_LIST_NODE : LIST_NODE_ACCESS_TYPE ;
  7347.          PTR : LIST_NODE_ACCESS_TYPE ;
  7348.          REF_PTR : LIST_NODE_ACCESS_TYPE ;
  7349.       begin
  7350.          -- remove reference in MEMBERSHIP list of TO indicating it
  7351.          -- was referenced by FROM
  7352.          if FROM /= NULL_POINTER and TO /= NULL_POINTER then
  7353.             PTR := TREE(TO).MEMBERSHIP;
  7354.             REF_PTR := FIND_NODE_REFERENCE ( PTR, FROM ) ;
  7355.             if REF_PTR /= NULL_POINTER then
  7356.                -- decrement the reference count
  7357.                if LIST(REF_PTR).REF_COUNT > 0 then
  7358.                   LIST(REF_PTR).REF_COUNT := LIST(REF_PTR).REF_COUNT - 1;
  7359.                end if;
  7360.                -- remove the node if the reference count is zero
  7361.                if LIST(REF_PTR).REF_COUNT = 0 then
  7362.                   EXTRACT_NODE_FROM_LIST ( TREE(TO).MEMBERSHIP, REF_PTR);
  7363.                   -- free the list node from the membership list
  7364.                   RELEASE_LIST_NODE ( REF_PTR ) ;
  7365.                end if;
  7366.             end if;
  7367.          end if;
  7368.       end BREAK_REFERENCE ;
  7369.  
  7370.       procedure MAKE_REFERENCE (FROM, TO: in TREE_NODE_ACCESS_TYPE) is
  7371.          -- Place a reference indication in the MEMBERSHIP_LIST of the
  7372.          -- TO node as being referenced by the FROM node.
  7373.          NEW_LIST_NODE : LIST_NODE_ACCESS_TYPE ;
  7374.          PTR : LIST_NODE_ACCESS_TYPE ;
  7375.          REF_PTR : LIST_NODE_ACCESS_TYPE ;
  7376.       begin
  7377.          -- now add the LIST_OWNER to the MEMBERSHIP list of the
  7378.          -- TREE node pointed to by ITEM of NODE_TO_BE_ADDED.
  7379.          if TO /= NULL_POINTER and FROM /= NULL_POINTER then
  7380.             PTR := TREE(TO).MEMBERSHIP;
  7381.             REF_PTR := FIND_NODE_REFERENCE (PTR, FROM );
  7382.             if REF_PTR /= NULL_POINTER then
  7383.                -- A MEMBERSHIP reference already exists so just 
  7384.                -- increment the reference count
  7385.                LIST(REF_PTR).REF_COUNT := LIST(REF_PTR).REF_COUNT + 1;
  7386.             else
  7387.                -- add a node to the list
  7388.                NEW_LIST_NODE := GET_NEW_LIST_NODE ( FROM );
  7389.                INSERT_NODE_IN_LIST (TREE(TO).MEMBERSHIP, NEW_LIST_NODE);
  7390.                LIST(NEW_LIST_NODE).REF_COUNT := 1;
  7391.             end if;
  7392.          end if;
  7393.       end MAKE_REFERENCE ;
  7394.  
  7395.       procedure INITIALIZE_TREE is
  7396.          -- initialize the tree by assigning all nodes
  7397.          -- to startup state
  7398.  
  7399.          NEW_TREE_NODE     : TREE_NODE_TYPE ;
  7400.          NEW_ROOT_NODE     : TREE_NODE_TYPE( ROOT ) ;
  7401.          NEW_GRAPH_NODE    : GRAPH_NODE_TYPE ;
  7402.          NEW_LIST_NODE     : LIST_NODE_TYPE ;
  7403.          NEW_PROLOGUE_NODE : PROLOGUE_NODE_TYPE ;
  7404.  
  7405.       begin
  7406.          TREE := (others => NEW_TREE_NODE ) ;
  7407.          GRAPH := (others => NEW_GRAPH_NODE ) ;
  7408.          LIST := (others => NEW_LIST_NODE ) ;
  7409.          PROLOGUE := (others => NEW_PROLOGUE_NODE ) ;
  7410.  
  7411.          TREE( ROOT_NODE ) := NEW_ROOT_NODE ;
  7412.  
  7413.       end INITIALIZE_TREE ;
  7414.  
  7415.    end TREE_OPS;
  7416. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7417. --tree_io_spec.ada
  7418. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7419. -- version 85-09-17 09:30 by RAM
  7420.  
  7421. with TREE_DATA;  use TREE_DATA;
  7422.  
  7423.    package TREE_IO is
  7424.    --  This package provides all the necessary operations to
  7425.    --  read and write the graph tree from the graphics
  7426.    --  files in the host file system.
  7427.    --  
  7428.    --  This package manipulates data files which consist of copies
  7429.    --  of the graph tree nodes.  The node types (GRAPH, TREE,
  7430.    --  and LIST) are stored in arrays in the package
  7431.    --  TREE_DATA.  This TREE_IO package will
  7432.    --  copy the graph tree by copying the arrays to the
  7433.    --  specified data file.
  7434.    --
  7435.    --  Requirements:
  7436.    --   1) provide the read and write operations needed to
  7437.    --      maintain the graphics files.
  7438.    --   2) detect corrupted data files.
  7439.    --
  7440.  
  7441.       -------------------------------------------------------------------
  7442.       -- parameters , types and objects for system file name development.   
  7443.  
  7444.       -- maximum size of complete filename
  7445.       MAX_FILE_ID_SIZE : constant Natural := 43 ; -- DEC VAX VMS version 4.1
  7446.  
  7447.       -- max size of extension
  7448.       MAX_EXTENSION_SIZE : constant Natural := 4 ;
  7449.  
  7450.       -- max size of file name part
  7451.       MAX_FILENAME_SIZE : constant Natural := MAX_FILE_ID_SIZE 
  7452.                                               - MAX_EXTENSION_SIZE ;
  7453.  
  7454.       --  type for the total file name including extension
  7455.       subtype TOTAL_FILENAME_TYPE is String ( 1..MAX_FILE_ID_SIZE ) ;
  7456.  
  7457.       --  type to hold filenames
  7458.       subtype FILENAME_TYPE is String ( 1..MAX_FILENAME_SIZE ) ;
  7459.    
  7460.       --  type to hold extension names
  7461.       subtype EXTENSION_TYPE is String ( 1..MAX_EXTENSION_SIZE ) ;
  7462.  
  7463.       --  null filename for setting FILENAME_TYPE objects
  7464.       NULL_FILENAME : FILENAME_TYPE ; -- initialized to ascii nul s
  7465.       -- aggragate assignment in body execution
  7466.    
  7467.       --  name of default file for initialization
  7468.       DEFAULT_FILENAME : FILENAME_TYPE ;
  7469.       -- aggragate assignment in body execution
  7470.  
  7471.       -- name of tree filename default extension
  7472.       TREE_EXTENSION : constant EXTENSION_TYPE := ".GPH" ;
  7473.  
  7474.       --  name of file containing original data used 
  7475.       DATA_FILENAME : FILENAME_TYPE ;
  7476.       -- aggragate assignment in body execution
  7477.  
  7478.       -- end of file name data
  7479.       -------------------------------------------------------------------
  7480.  
  7481.       --  the graphics data file control parameters
  7482.       type FILE_HANDLING_TYPE is (SAVE,
  7483.                                   NO_SAVE,
  7484.                                   PANIC_SAVE);
  7485.       FILE_HANDLING_ON_EXIT : FILE_HANDLING_TYPE := SAVE;
  7486.  
  7487.       function COMPLETE_FILE_NAME
  7488.                ( FILE_NAME : FILENAME_TYPE ;
  7489.                  EXTENSION : EXTENSION_TYPE )
  7490.       return TOTAL_FILENAME_TYPE ;
  7491.       -- use the file name to the first space and append the extension
  7492.       -- to create a valid system file name.
  7493.  
  7494.       procedure READ
  7495.                 ( FILE: in TOTAL_FILENAME_TYPE ) ;
  7496.       --  read the specified page into the arrays in
  7497.       --  the package TREE_DATA.  Set all necessary
  7498.       --  parameters based on the values in the file
  7499.       --  (possibly number of nodes).
  7500.    
  7501.       procedure WRITE
  7502.                 ( FILE: in TOTAL_FILENAME_TYPE ) ;
  7503.       --  Write the contents of the arrays in the
  7504.       --  package TREE_DATA to the specified file.
  7505.    
  7506.       INVALID_FILE_SPECIFIER : exception;
  7507.       FILE_OPERATION_FAILURE : exception;
  7508.    
  7509.    end TREE_IO;
  7510. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7511. --tree_io_body.ada
  7512. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7513. -- version 27 November 1985 by JR
  7514.  
  7515.    with DIRECT_IO;
  7516.    with TEXT_IO;
  7517.    with TRACE_PKG ;
  7518.    with GRAPHICS_DATA;  use GRAPHICS_DATA;
  7519.  
  7520.    package body TREE_IO is
  7521.  
  7522.       --  The following type is used to as the record format
  7523.       --  for reading and writing the tree to/from secondary
  7524.       --  storage.  The use of variant records is not allowed,
  7525.       --  so each record will contain a GRAPH, LIST, and TREE
  7526.       --  node.  If the number of nodes of each type varies,
  7527.       --  some space will be wasted.
  7528.       type DATA_RECORD_TYPE is ( NODE_RECORD, ATTRIBUTE_HEADER_RECORD ) ;
  7529.       type IO_NODE_TYPE( RECORD_TYPE : DATA_RECORD_TYPE := NODE_RECORD ) is
  7530.          record
  7531.             case RECORD_TYPE is
  7532.                when NODE_RECORD =>
  7533.                   GRAPH_NODE  : GRAPH_NODE_TYPE ;
  7534.                   LIST_NODE   : LIST_NODE_TYPE ;
  7535.                   PROLOGUE_NODE : PROLOGUE_NODE_TYPE ;  
  7536.                   TREE_NODE   : TREE_NODE_TYPE ;        -- the variant record
  7537.                                                         -- must be last
  7538.                when ATTRIBUTE_HEADER_RECORD =>
  7539.                   INIT_ENTITY_COLOR             : COLOR_ARRAY ;
  7540.                   INIT_ENTITY_LINE              : LINE_ARRAY ;
  7541.                   INIT_FUNCTION_SYMBOL          : INDICATOR_LENGTH_1 ;
  7542.                   INIT_NORMAL_REFERENCE_SYMBOL  : INDICATOR_LENGTH_1 ;
  7543.                   INIT_VIRTUAL_REFERENCE_SYMBOL : INDICATOR_LENGTH_2 ;
  7544.                   INIT_TIMED_CALL_SYMBOL        : INDICATOR_LENGTH_1 ;
  7545.                   INIT_CONDITIONAL_CALL_SYMBOL  : INDICATOR_LENGTH_1 ;
  7546.                   INIT_GUARDED_ENTRY_SYMBOL     : INDICATOR_LENGTH_1 ;
  7547.                   INIT_GENERIC_DECL_SYMBOL      : INDICATOR_LENGTH_2 ;
  7548.                   INIT_GENERIC_INST_SYMBOL      : INDICATOR_LENGTH_2 ;
  7549.                   INIT_TASK_TYPE_SYMBOL         : INDICATOR_LENGTH_4 ;
  7550.             end case ;
  7551.          end record ;
  7552.  
  7553.       package NODE_IO is new DIRECT_IO (IO_NODE_TYPE);
  7554.       use NODE_IO;
  7555.  
  7556.       FILE_HANDLE  : FILE_TYPE;
  7557.       IO_NODE      : IO_NODE_TYPE;
  7558.       IO_ATTRIBUTE : IO_NODE_TYPE(ATTRIBUTE_HEADER_RECORD) ;
  7559.       RECORD_COUNT : INTEGER;
  7560.  
  7561.       function COMPLETE_FILE_NAME
  7562.                ( FILE_NAME : FILENAME_TYPE ;
  7563.                  EXTENSION : EXTENSION_TYPE )
  7564.       return TOTAL_FILENAME_TYPE is
  7565.       -- use the file name to the first space and append the extension
  7566.       -- to create a valid system file name.
  7567.          FINISHED_NAME : TOTAL_FILENAME_TYPE ;
  7568.          FIRST_CHAR    : Natural := 0 ; 
  7569.          END_OF_NAME   : Natural := 0 ;
  7570.          NAME_LENGTH   : Natural := 0 ;
  7571.          FOUND_START   : Boolean := False ;
  7572.          SPACE         : constant CHARACTER := ' ' ;
  7573.       begin -- COMPLETE_FILE_NAME
  7574.          if TRACE_PKG.REQUEST_TRACE then
  7575.             TRACE_PKG.TRACE ( "TREE_IO.COMPLETE_FILE_NAME" &
  7576.                               " => [" & FILE_NAME & EXTENSION & "]" ) ;
  7577.          end if ;
  7578.    
  7579.          if FILE_NAME = NULL_FILENAME then
  7580.             return DEFAULT_FILENAME & EXTENSION ;
  7581.          else
  7582.             -- check each character in the name for a space or control character
  7583.             for I in FILE_NAME'Range loop
  7584.                if FILE_NAME( I ) = SPACE or FILE_NAME( I ) = ASCII.NUL then
  7585.                   if FOUND_START then
  7586.                      -- calc the size of the new file name
  7587.                      NAME_LENGTH := END_OF_NAME - FIRST_CHAR + 1 ;
  7588.                      -- send back the name with extension
  7589.                      return NULL_FILENAME( 1..MAX_FILENAME_SIZE-NAME_LENGTH )
  7590.                             & FILE_NAME( FIRST_CHAR..END_OF_NAME ) & EXTENSION ;
  7591.                      exit ;
  7592.                   else
  7593.                      -- all spaces so far
  7594.                      END_OF_NAME := I ;
  7595.                   end if ;
  7596.                else
  7597.                   if not FOUND_START then
  7598.                      FIRST_CHAR  := I ;
  7599.                      FOUND_START := True ;
  7600.                      END_OF_NAME := I ;
  7601.                   else
  7602.                      -- still a good name so keep checking
  7603.                      END_OF_NAME := I ;
  7604.                   end if ;
  7605.                end if ;
  7606.             end loop ;
  7607.             -- full name was used send back the name with extension
  7608.             return FILE_NAME & EXTENSION ;
  7609.          end if ;
  7610.       end COMPLETE_FILE_NAME ;
  7611.  
  7612.  
  7613.       procedure READ
  7614.                 ( FILE: in TOTAL_FILENAME_TYPE ) is
  7615.          --  read the specified page into the arrays in
  7616.          --  the package TREE_DATA.  Set all necessary
  7617.          --  parameters based on the values in the file
  7618.          --  (possibly number of nodes).
  7619.          INDEX : NATURAL := 0;
  7620.       begin
  7621.          -- try to open the file to be read
  7622.          begin
  7623.             OPEN (FILE_HANDLE, IN_FILE, FILE);
  7624.          exception
  7625.             when others =>
  7626. ---               TEXT_IO.PUT_LINE (" unable to open file ");  --Debug
  7627.                raise INVALID_FILE_SPECIFIER;
  7628.          end;
  7629.          -- compute the maximum number of records to be read
  7630.          RECORD_COUNT := MAX_GRAPH_NODES;
  7631.          if MAX_LIST_NODES > RECORD_COUNT then
  7632.             RECORD_COUNT := MAX_LIST_NODES;
  7633.          end if;
  7634.          if MAX_TREE_NODES > RECORD_COUNT then
  7635.             RECORD_COUNT := MAX_TREE_NODES;
  7636.          end if;
  7637.          if MAX_PROLOGUE_NODES > RECORD_COUNT then
  7638.             RECORD_COUNT := MAX_PROLOGUE_NODES;
  7639.          end if;
  7640.          -- read in attributes 
  7641.          READ (FILE_HANDLE, IO_ATTRIBUTE);
  7642.          ENTITY_COLOR             := IO_ATTRIBUTE.INIT_ENTITY_COLOR ;
  7643.          ENTITY_LINE              := IO_ATTRIBUTE.INIT_ENTITY_LINE ;
  7644.          FUNCTION_SYMBOL          := IO_ATTRIBUTE.INIT_FUNCTION_SYMBOL ;
  7645.          NORMAL_REFERENCE_SYMBOL  := IO_ATTRIBUTE.INIT_NORMAL_REFERENCE_SYMBOL ;
  7646.          VIRTUAL_REFERENCE_SYMBOL := IO_ATTRIBUTE.INIT_VIRTUAL_REFERENCE_SYMBOL ;
  7647.          TIMED_CALL_SYMBOL        := IO_ATTRIBUTE.INIT_TIMED_CALL_SYMBOL ;
  7648.          CONDITIONAL_CALL_SYMBOL  := IO_ATTRIBUTE.INIT_CONDITIONAL_CALL_SYMBOL ;
  7649.          GUARDED_ENTRY_SYMBOL     := IO_ATTRIBUTE.INIT_GUARDED_ENTRY_SYMBOL ;
  7650.          GENERIC_DECL_SYMBOL      := IO_ATTRIBUTE.INIT_GENERIC_DECL_SYMBOL ;
  7651.          GENERIC_INST_SYMBOL      := IO_ATTRIBUTE.INIT_GENERIC_INST_SYMBOL ;
  7652.          TASK_TYPE_SYMBOL         := IO_ATTRIBUTE.INIT_TASK_TYPE_SYMBOL ;
  7653.  
  7654.          -- read in the records
  7655.          loop
  7656.             -- compute the number of the record to be read
  7657.             INDEX := INDEX + 1;
  7658.             -- check if the number is valid and if it exists
  7659.             if END_OF_FILE (FILE_HANDLE) then
  7660.                exit;
  7661.             elsif INDEX > RECORD_COUNT then
  7662.                TEXT_IO.PUT_LINE (" too many records for the arrays ");
  7663.                exit;
  7664.             end if;
  7665.             -- read the record
  7666.             READ (FILE_HANDLE, IO_NODE);
  7667. ---            TEXT_IO.PUT ('.');             --Debug
  7668. ---            if INDEX mod 50 = 0 then       --Debug
  7669. ---               TEXT_IO.NEW_LINE;           --Debug
  7670. ---            end if;                        --Debug
  7671.             -- unpack the nodes from the IO_NODE record
  7672.             if INDEX <= MAX_GRAPH_NODES then
  7673.                GRAPH(INDEX) := IO_NODE.GRAPH_NODE;
  7674.             end if;
  7675.             if INDEX <= MAX_LIST_NODES then
  7676.                LIST(INDEX) := IO_NODE.LIST_NODE;
  7677.             end if;
  7678.             if INDEX <= MAX_TREE_NODES then
  7679.                TREE(INDEX) := IO_NODE.TREE_NODE;
  7680.             end if;
  7681.             if INDEX <= MAX_PROLOGUE_NODES then
  7682.                PROLOGUE(INDEX) := IO_NODE.PROLOGUE_NODE;
  7683.             end if;
  7684.          end loop;
  7685.          -- close the file
  7686.          CLOSE (FILE_HANDLE);
  7687. ---         TEXT_IO.NEW_LINE;                  --Debug
  7688.       exception
  7689.          when others =>
  7690.             if IS_OPEN (FILE_HANDLE) then
  7691.                CLOSE (FILE_HANDLE);
  7692.             end if;
  7693.             raise;
  7694.       end READ;
  7695.    
  7696.       procedure WRITE
  7697.                 ( FILE: in TOTAL_FILENAME_TYPE ) is
  7698.          --  Write the contents of the arrays in the
  7699.          --  package TREE_DATA to the specified file.
  7700.          INDEX : NATURAL := 0;
  7701.       begin
  7702.          -- compute the number of records to be written
  7703.          RECORD_COUNT := MAX_GRAPH_NODES;
  7704.          if MAX_LIST_NODES > RECORD_COUNT then
  7705.             RECORD_COUNT := MAX_LIST_NODES;
  7706.          end if;
  7707.          if MAX_TREE_NODES > RECORD_COUNT then
  7708.             RECORD_COUNT := MAX_TREE_NODES;
  7709.          end if;
  7710.          if MAX_PROLOGUE_NODES > RECORD_COUNT then
  7711.             RECORD_COUNT := MAX_PROLOGUE_NODES;
  7712.          end if;
  7713.          -- create the file to be written
  7714.          begin
  7715.             CREATE (FILE_HANDLE, 
  7716.                     OUT_FILE, 
  7717.                     FILE ,
  7718.                     FORM => "RECORD ; SIZE 512 " );
  7719.          exception
  7720.             when others =>
  7721.                raise INVALID_FILE_SPECIFIER;
  7722.          end;
  7723.          -- write out attributes 
  7724.          IO_ATTRIBUTE.INIT_ENTITY_COLOR             := ENTITY_COLOR ;
  7725.          IO_ATTRIBUTE.INIT_ENTITY_LINE              := ENTITY_LINE ;
  7726.          IO_ATTRIBUTE.INIT_FUNCTION_SYMBOL          := FUNCTION_SYMBOL ;
  7727.          IO_ATTRIBUTE.INIT_NORMAL_REFERENCE_SYMBOL  := NORMAL_REFERENCE_SYMBOL ;
  7728.          IO_ATTRIBUTE.INIT_VIRTUAL_REFERENCE_SYMBOL := VIRTUAL_REFERENCE_SYMBOL ;
  7729.          IO_ATTRIBUTE.INIT_TIMED_CALL_SYMBOL        := TIMED_CALL_SYMBOL ;
  7730.          IO_ATTRIBUTE.INIT_CONDITIONAL_CALL_SYMBOL  := CONDITIONAL_CALL_SYMBOL ;
  7731.          IO_ATTRIBUTE.INIT_GUARDED_ENTRY_SYMBOL     := GUARDED_ENTRY_SYMBOL ;
  7732.          IO_ATTRIBUTE.INIT_GENERIC_DECL_SYMBOL      := GENERIC_DECL_SYMBOL ;
  7733.          IO_ATTRIBUTE.INIT_GENERIC_INST_SYMBOL      := GENERIC_INST_SYMBOL ;
  7734.          IO_ATTRIBUTE.INIT_TASK_TYPE_SYMBOL         := TASK_TYPE_SYMBOL ;
  7735.          WRITE (FILE_HANDLE, IO_ATTRIBUTE);
  7736.  
  7737.          -- write out the records
  7738.          loop
  7739.             -- compute the number of the record to be written
  7740.             INDEX := INDEX + 1;
  7741.             -- exit when all the records have been written
  7742.             if INDEX > RECORD_COUNT then
  7743.                exit;
  7744.             end if;
  7745.             -- pack the nodes from the IO_NODE record
  7746.             if INDEX <= MAX_GRAPH_NODES then
  7747.                IO_NODE.GRAPH_NODE := GRAPH(INDEX);
  7748.             end if;
  7749.             if INDEX <= MAX_LIST_NODES then
  7750.                IO_NODE.LIST_NODE := LIST(INDEX);
  7751.             end if;
  7752.             if INDEX <= MAX_TREE_NODES then
  7753.                IO_NODE.TREE_NODE := TREE(INDEX);
  7754.             end if;
  7755.             if INDEX <= MAX_PROLOGUE_NODES then
  7756.                IO_NODE.PROLOGUE_NODE := PROLOGUE(INDEX);
  7757.             end if;
  7758.             -- write out the record
  7759.             WRITE (FILE_HANDLE, IO_NODE);
  7760. ---            TEXT_IO.PUT ('.');             --Debug
  7761. ---            if INDEX mod 50 = 0 then       --Debug
  7762. ---               TEXT_IO.NEW_LINE;           --Debug
  7763. ---            end if;                        --Debug
  7764.  
  7765.          end loop;
  7766.          -- close the file
  7767.          CLOSE (FILE_HANDLE);
  7768. ---         TEXT_IO.NEW_LINE;                 --Debug
  7769.       exception
  7770.          when others =>
  7771.             if IS_OPEN (FILE_HANDLE) then
  7772.                CLOSE (FILE_HANDLE);
  7773.             end if;
  7774.             raise;
  7775.       end WRITE;
  7776.    
  7777.    begin -- TREE_IO
  7778.       -- aggragate initialization of null filename
  7779.       for I in FILENAME_TYPE'First..FILENAME_TYPE'Last loop 
  7780.          NULL_FILENAME( I ) := ASCII.NUL ;
  7781.       end loop ;
  7782.       -- aggragate initialization of default filename
  7783.       for I in FILENAME_TYPE'First..FILENAME_TYPE'Last-8 loop 
  7784.          DEFAULT_FILENAME( I ) := ASCII.NUL ;
  7785.       end loop ;
  7786.       DEFAULT_FILENAME(FILENAME_TYPE'last-7..FILENAME_TYPE'Last) := "DATAFILE" ;
  7787.       -- aggragate initialization of initial data_filename
  7788.       DATA_FILENAME := DEFAULT_FILENAME ;
  7789.    end TREE_IO;
  7790. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7791. --gks_non_standard_spec.ada
  7792. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7793. -- VERSION 85-08-28 14:50 by RAM
  7794.  
  7795. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  7796.  
  7797. package GKS_NON_STANDARD is
  7798. -- ============================================================
  7799. --  This package implements a version of the Graphical
  7800. --  Kernel System (GKS) developed by SYSCON Corporation
  7801. --  for use with the Graphic Ada Designer.  The specification
  7802. --  is based on:
  7803. --
  7804. --      1) The Ada Phase I GKS developed by Harris Corp.
  7805. --      2) Draft GKS Binding to ANSI Ada
  7806. --
  7807. --  This implementation will initially be a partial subset,
  7808. --  with only those operations required by the Graphic Ada
  7809. --  Designer implemented.  Although the semantics of the
  7810. --  functions implemented are intended to be faithful to those
  7811. --  decribed in the GKS Binding, the goal of efficiency and
  7812. --  compactness may result in the implementation code ignoring
  7813. --  certain arguments (e.g., opening a workstation may be
  7814. --  unnecessary and implemented as a null operation).  The
  7815. --  code will directly manipulate primitives of the target
  7816. --  graphics device, without the intermediate operations
  7817. --  associated with GKS.  The implementation and utilization
  7818. --  of this package will be faithful enough to the real GKS,
  7819. --  to permit the Graphic Ada Designer to be easily converted
  7820. --  to using a real version of GKS.
  7821. --
  7822. -- NOTE : this partition contains the non standard gks operations
  7823. -- ============================================================
  7824.  
  7825.    ---------------------------------------------------------------------
  7826.    -- Determine type of generalized drawing primitive (GDP) requested.
  7827.    --  All GDP functions based on a two point definition point list
  7828.    --  to completely describe the location of the entity, the two points
  7829.    --  define a box that is used for a rectangle or show the outer limits
  7830.    --  of the circles location using the first (upper left) point as the
  7831.    --  standard reference.
  7832.    ---------------------------------------------------------------------
  7833.  
  7834.    package FROM_LEVEL_0A is
  7835.    -- ========================================================
  7836.    --  This packages declares the Level 0A operations of GKS.
  7837.    -- ========================================================
  7838.  
  7839.       procedure ESCAPE
  7840.                 ( ESCAPE_ID   : ESCAPE_IDENTIFIER ;
  7841.                   ESCAPE_DATA : ESCAPE_RECORD ) ;
  7842.       -- =====================================================
  7843.       -- A standard way of invoking non-standard features
  7844.       -- ISO/DIS 7942, section 5.2, page 86
  7845.       -- Effect : The specified non-standard specific escape
  7846.       --          function is invoked.
  7847.       -- =====================================================
  7848.  
  7849.       procedure GDP
  7850.                 ( POINTS          : in GKS_SPECIFICATION.WC.POINT_ARRAY ;
  7851.                   GDP_IDENTIFIER  : in GKS_SPECIFICATION.GDP_ID ) ;
  7852.       -- ================================================================
  7853.       -- Generate a generalized drawing primitive defined by a sequence
  7854.       -- of points in WC and a data record
  7855.       -- ISO/DIS 7942, section 5.3, page 91
  7856.       -- Effect : A generalized drawing primitive (GDP) of the type
  7857.       --          indicated by the GDP identifier is generated on the basis
  7858.       --          of the given points and the GDP data record.
  7859.       -- ================================================================
  7860.  
  7861.    end FROM_LEVEL_0A ;
  7862.  
  7863. end GKS_NON_STANDARD ;
  7864. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7865. --gks_non_standard_body.ada
  7866. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  7867. -- version 85-10-21 11:20 by RAM
  7868.  
  7869. with TERMINAL_ACCESS ; use TERMINAL_ACCESS ;
  7870. with TRACE_PKG       ; use TRACE_PKG ;
  7871.  
  7872. package body GKS_NON_STANDARD is
  7873. -- ===========================================================
  7874. --  The package body of GKS implements the operations which
  7875. --  compose levels 0A through 1B.
  7876. --
  7877. --        Terminal_Access Support Requirments          --
  7878. --     In addition to normal graphics support the      --
  7879. --     following additions are required.               --
  7880. --        SEGMENTS :                                   --
  7881. --            Open/Create            Close             --
  7882. --            Rename                 Delete            --
  7883. --            Priorities                               --
  7884. --        DRAWING :                                    --
  7885. --            Boxes                  Circles           --
  7886. --            Polylines              Text              --
  7887. --            Regular Polygons       Polymarkers       --
  7888. --            Complex Fill Polygons                    --
  7889. --
  7890. -- NOTE : this partition contains the non standard gks operations
  7891. ---------------------------------------------------------
  7892.  
  7893.    package TERM_ACC renames TERMINAL_ACCESS ;
  7894.  
  7895.    -----------------------------------------------------------------
  7896.    -- The following object declarations are to set the operation in
  7897.    --  the package terminal_access that will be used to draw each of
  7898.    --  indicated entities.
  7899.    ----------------------------------------------------------------
  7900.    FOR_CIRCLE     : constant TERM_ACC.CIRCLE_OPERATIONS_TYPE
  7901.                   := TERM_ACC.CIRCLE_OPERATIONS_TYPE'First ;
  7902.    FOR_FILL_AREA  : constant TERM_ACC.FILL_AREA_OPERATIONS_TYPE
  7903.                   := TERM_ACC.FILL_AREA_OPERATIONS_TYPE'First ;
  7904.    FOR_POLYLINE   : constant TERM_ACC.POLYLINE_OPERATIONS_TYPE
  7905.                   := TERM_ACC.POLYLINE_OPERATIONS_TYPE'First ;
  7906.    FOR_POLYMARKER : constant TERM_ACC.POLYMARKER_OPERATIONS_TYPE
  7907.                   := TERM_ACC.POLYMARKER_OPERATIONS_TYPE'First ;
  7908.    FOR_RECTANGLE  : constant TERM_ACC.RECTANGLE_OPERATIONS_TYPE
  7909.                   := TERM_ACC.RECTANGLE_OPERATIONS_TYPE'First ;
  7910.    FOR_TEXT       : constant TERM_ACC.TEXT_OPERATIONS_TYPE
  7911.                   := TERM_ACC.TEXT_OPERATIONS_TYPE'First ;
  7912.  
  7913.    -----------------------------------------------------------------
  7914.    -- The following object declarations are to set the indicator in
  7915.    --  the package terminal_access that will be used to draw each of
  7916.    --  indicated entity types color.
  7917.    ------------------------------------------------------------------
  7918.    FOR_ALPHA_BACKGROUND   : constant TERM_ACC.FOR_ALPHA_BACKGROUND_TYPE
  7919.                           := TERM_ACC.FOR_ALPHA_BACKGROUND_TYPE'First ;
  7920.    FOR_ALPHA_WRITING      : constant TERM_ACC.FOR_ALPHA_WRITING_TYPE
  7921.                           := TERM_ACC.FOR_ALPHA_WRITING_TYPE'First ;
  7922.    FOR_GRAPHIC_BACKGROUND : constant TERM_ACC.FOR_GRAPHIC_BACKGROUND_TYPE
  7923.                           := TERM_ACC.FOR_GRAPHIC_BACKGROUND_TYPE'First ;
  7924.    FOR_CHARACTER          : constant TERM_ACC.FOR_CHARACTER_COLOR_TYPE
  7925.                           := TERM_ACC.FOR_CHARACTER_COLOR_TYPE'First ;
  7926.    FOR_FILL_STYLE         : constant TERM_ACC.FOR_FILL_STYLE_COLOR_TYPE
  7927.                           := TERM_ACC.FOR_FILL_STYLE_COLOR_TYPE'First ;
  7928.    FOR_LINE_STYLE         : constant TERM_ACC.FOR_LINE_STYLE_COLOR_TYPE
  7929.                           := TERM_ACC.FOR_LINE_STYLE_COLOR_TYPE'First ;
  7930.    FOR_MARKERS            : constant TERM_ACC.FOR_MARKERS_COLOR_TYPE
  7931.                           := TERM_ACC.FOR_MARKERS_COLOR_TYPE'First ;
  7932.  
  7933.    package body FROM_LEVEL_0A is
  7934.    -- ===============================================================
  7935.    --  This package body implements the Level 0A operations of GKS.
  7936.    -- ===============================================================
  7937.  
  7938.  
  7939.       procedure ESCAPE
  7940.                 ( ESCAPE_ID   : ESCAPE_IDENTIFIER ;
  7941.                   ESCAPE_DATA : ESCAPE_RECORD ) is
  7942.       -- ===============================================================
  7943.       -- A standard way of invoking non-standard features
  7944.       -- ISO/DIS 7942, section 5.2, page 86
  7945.       -- Effect : The specified non-standard specific escape
  7946.       --          function is invoked.
  7947.       -- ===============================================================
  7948.          SEGMENT_ID         : SEGMENT_NAME ;
  7949.          UPPER_LEFT_VIEW ,
  7950.          LOWER_RIGHT_VIEW ,
  7951.          UPPER_LEFT_WINDOW ,
  7952.          LOWER_RIGHT_WINDOW : WC.POINT ;
  7953.  
  7954.       begin
  7955.          -- debug aid only
  7956.          if TRACE_PKG.REQUEST_TRACE then
  7957.            TRACE_PKG.TRACE( "GKS_PRIME.ESCAPE" ) ;
  7958.          end if ;
  7959.  
  7960.          case ESCAPE_ID is
  7961.             when ALPHA_BACKGROUND =>
  7962.                TERM_ACC.SET_COLOR_INDEX
  7963.                   ( FOR_ALPHA_BACKGROUND , ESCAPE_DATA.COLOUR ) ;
  7964.             when ALPHA_WRITING =>
  7965.                TERM_ACC.SET_COLOR_INDEX
  7966.                   ( FOR_ALPHA_WRITING , ESCAPE_DATA.COLOUR ) ;
  7967.             when GRAPHIC_BACKGROUND =>
  7968.                TERM_ACC.SET_COLOR_INDEX
  7969.                   ( FOR_GRAPHIC_BACKGROUND , ESCAPE_DATA.COLOUR ) ;
  7970.             when GRAPHICS_VISIBILITY =>
  7971.                TERM_ACC.GRAPHICS_SCREEN ( ESCAPE_DATA.GRAPHICS_ON ) ;
  7972.             when PRINT_SCREEN =>
  7973.                TERM_ACC.PRINT_SCREEN ;
  7974.             when PRINT_WINDOW =>
  7975.                TERM_ACC.PRINT_SCREEN( ESCAPE_DATA.WINDOW ) ;
  7976.             when SEGMENT_MOVEMENT =>
  7977.                -- load data from escape_record
  7978.                SEGMENT_ID  := ESCAPE_DATA.SEGMENT ;
  7979.                TERM_ACC.MOVE_SEGMENT ( SEGMENT_ID , ESCAPE_DATA.POSITION ) ;
  7980.             when SELECT_WINDOW =>
  7981.                TERM_ACC.SET_CURRENT_WINDOW ( ESCAPE_DATA.WINDOW ) ;
  7982.             when MAP_WINDOW_TO_VIEWPORT =>
  7983.                UPPER_LEFT_VIEW.X    := ESCAPE_DATA.VIEW_RECTANGLE.X.MIN ;
  7984.                UPPER_LEFT_VIEW.Y    := ESCAPE_DATA.VIEW_RECTANGLE.Y.MAX ;
  7985.                LOWER_RIGHT_VIEW.X   := ESCAPE_DATA.VIEW_RECTANGLE.X.MAX ;
  7986.                LOWER_RIGHT_VIEW.Y   := ESCAPE_DATA.VIEW_RECTANGLE.Y.MIN ;
  7987.                UPPER_LEFT_WINDOW.X  := ESCAPE_DATA.WINDOW_RECTANGLE.X.MIN ;
  7988.                UPPER_LEFT_WINDOW.Y  := ESCAPE_DATA.WINDOW_RECTANGLE.Y.MAX ;
  7989.                LOWER_RIGHT_WINDOW.X := ESCAPE_DATA.WINDOW_RECTANGLE.X.MAX ;
  7990.                LOWER_RIGHT_WINDOW.Y := ESCAPE_DATA.WINDOW_RECTANGLE.Y.MIN ;
  7991.                TERM_ACC.MAP_WINDOW_TO_VIEWPORT ( ESCAPE_DATA.VIEW_WINDOW_ID ,
  7992.                                                  UPPER_LEFT_WINDOW ,
  7993.                                                  LOWER_RIGHT_WINDOW ,
  7994.                                                  UPPER_LEFT_VIEW ,
  7995.                                                  LOWER_RIGHT_VIEW ) ;
  7996.             when others =>
  7997.                null ;
  7998.          end case ; -- ESCAPE_ID
  7999.       end ESCAPE ;
  8000.  
  8001.  
  8002.       procedure GDP
  8003.                 ( POINTS          : in WC.POINT_ARRAY ;
  8004.                   GDP_IDENTIFIER  : in GDP_ID ) is
  8005.       -- ===============================================================
  8006.       -- Generate a generalized drawing primitive defined by a sequence
  8007.       -- of points in WC and a data record
  8008.       -- ISO/DIS 7942, section 5.3, page 91
  8009.       -- Effect : A generalized drawing primitive (GDP) of the type
  8010.       --          indicated by the GDP identifier is generated on the
  8011.       --          basis of the given points and the GDP data record.
  8012.       -- ===============================================================
  8013.          GDP_CIRCLE_DATA    : TERM_ACC.OBJECT_DATA_RECORD( FOR_CIRCLE ) ;
  8014.          GDP_RECTANGLE_DATA : TERM_ACC.OBJECT_DATA_RECORD( FOR_RECTANGLE ) ;
  8015.          SIDES_FOR_CIRCLE   : constant NATURAL := 36 ;
  8016.       begin
  8017.          -- debug aid only
  8018.          if TRACE_PKG.REQUEST_TRACE then
  8019.            TRACE_PKG.TRACE( "GKS_PRIME.GDP" ) ;
  8020.          end if ;
  8021.  
  8022.          case GDP_IDENTIFIER is
  8023.             when GDP_RECTANGLE =>
  8024.                -- fill gdp_rectangle_data with specific data
  8025.                GDP_RECTANGLE_DATA.REFERENCE_POINT := POINTS ( 1 ) ;
  8026.                GDP_RECTANGLE_DATA.SIZE_POINT      := POINTS ( 2 ) ;
  8027.                TERM_ACC.DRAW ( GDP_RECTANGLE_DATA ) ;
  8028.             when GDP_CIRCLE =>
  8029.                -- fill gdp_circle_data with specific data
  8030.                GDP_CIRCLE_DATA.REFERENCE_POINT := POINTS ( 1 ) ;
  8031.                GDP_CIRCLE_DATA.SIZE_POINT      := POINTS ( 2 ) ;
  8032.                TERM_ACC.DRAW ( GDP_CIRCLE_DATA ) ;
  8033.             when others => null ;
  8034.          end case ;
  8035.       end GDP ;
  8036.  
  8037.    end FROM_LEVEL_0A ;
  8038.  
  8039. end GKS_NON_STANDARD ;
  8040. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8041. --gks_prime_spec.ada
  8042. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8043. -- VERSION 85-11-06 08:00 by JB
  8044.  
  8045. --
  8046. -- THIS VERSION IS CALL COMPATIBLE WITH HARRIS/ADA GKS
  8047.  
  8048. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  8049.  
  8050. package GKS_PRIME is
  8051. -- ============================================================
  8052. --  This package implements a version of the Graphical
  8053. --  Kernel System (GKS) developed by SYSCON Corporation
  8054. --  for use with the Graphic Ada Designer.  The specification
  8055. --  is based on:
  8056. --
  8057. --      1) The Ada Phase I GKS developed by Harris Corp.
  8058. --      2) Draft GKS Binding to ANSI Ada
  8059. --
  8060. --  This implementation will initially be a partial subset,
  8061. --  with only those operations required by the Graphic Ada
  8062. --  Designer implemented.  Although the semantics of the
  8063. --  functions implemented are intended to be faithful to those
  8064. --  decribed in the GKS Binding, the goal of efficiency and
  8065. --  compactness may result in the implementation code ignoring
  8066. --  certain arguments (e.g., opening a workstation may be
  8067. --  unnecessary and implemented as a null operation).  The
  8068. --  code will directly manipulate primitives of the target
  8069. --  graphics device, without the intermediate operations
  8070. --  associated with GKS.  The implementation and utilization
  8071. --  of this package will be faithful enough to the real GKS,
  8072. --  to permit the Graphic Ada Designer to be easily converted
  8073. --  to using a real version of GKS.
  8074. -- ============================================================
  8075.  
  8076.    package LEVEL_0A is
  8077.    -- ========================================================
  8078.    --  This packages declares the Level 0A operations of GKS.
  8079.    -- ========================================================
  8080.  
  8081.       procedure CLOSE_GKS ;
  8082.       -- ==============================================================
  8083.       -- Stop working with GKS
  8084.       -- ANS GKS section 5.2, page 74
  8085.       -- Effect : GKS is closed and all termination processing required
  8086.       --          by the implementation is performed.
  8087.       -- ==============================================================
  8088.  
  8089.       procedure CLOSE_WORKSTATION ( WS : in WS_ID ) ;
  8090.       -- =============================================================
  8091.       -- Release the connection between a workstation and GKS
  8092.       -- ANS GKS, section 5.2, page 75
  8093.       -- Effect : For the specified workstation, an implicit UPDATE
  8094.       --          WORKSTATION is performed, and the connection to the
  8095.       --          workstation is released.
  8096.       -- =============================================================
  8097.  
  8098.       procedure EMERGENCY_CLOSE_GKS ;
  8099.       -- ===============================================================
  8100.       -- Tries to close GKS in case of an error, saving as much information
  8101.       -- as possible
  8102.       -- ANS GKS, section 5.11, page 195
  8103.       -- Effect : GKS is emergency closed.  The function is called when it
  8104.       --          is not possible to recover from an error.
  8105.       -- ===============================================================
  8106.  
  8107.       procedure ERROR_HANDLING
  8108.                 ( ERROR_NUMBER : in ERROR_INDICATOR ;
  8109.                   ID           : in SUBPROGRAM_NAME ;
  8110.                   ERROR_FILE   : in STRING ) ;
  8111.       -- ===============================================================
  8112.       -- A procedure called by GKS when an error is detected.  It may be
  8113.       -- user supplied
  8114.       -- ANS GKS, section 5.11, page 195
  8115.       -- Effect : The GKS detected error is logged via a call to
  8116.       --          ERROR_LOGGING and control is returned to the GKS
  8117.       --          function where the error has been detected.
  8118.       -- ==============================================================
  8119.  
  8120.       procedure ERROR_LOGGING
  8121.                 ( EI : in ERROR_INDICATOR ;
  8122.                   NAME : in SUBPROGRAM_NAME ) ;
  8123.       -- ==============================================================
  8124.       -- A procedure called by the standard GKS error handling procedure.
  8125.       -- It prints an error message and function identification on the
  8126.       -- error file
  8127.       -- ANS GKS, section 5.11, page 196
  8128.       -- Effect : An error message and GKS function identification is
  8129.       --          written to the error file.
  8130.       -- ==============================================================
  8131.  
  8132.       procedure FILL_AREA ( FILL_AREA_POINTS : in WC.POINT_ARRAY ) ;
  8133.       -- ================================================================
  8134.       -- Generate a polygon which may be filled with a colour, a hatch or
  8135.       -- a pattern or may be hollow
  8136.       -- ANS GKS, section 5.3, page 83
  8137.       -- Effect : A FILL AREA primitive is generated, and the current values
  8138.       --          of the fill area attributes are bound to the primitive.
  8139.       --          The attributes are listed in section 4.4.2, page 21.
  8140.       -- ================================================================
  8141.  
  8142.       procedure OPEN_GKS
  8143.          ( ERROR_FILE       : in ERROR_FILE_TYPE := DEFAULT_ERROR_FILE ;
  8144.            AMOUNT_OF_MEMORY : in MEMORY_UNITS := MAX_MEMORY_UNITS ) ;
  8145.       -- =============================================================
  8146.       --  Start working with GKS
  8147.       --  ANS GKS, section 5.2, page 74
  8148.       -- Effect : GKS is opened and all initialization processing required
  8149.       --          by the implementation is performed.
  8150.       -- ==============================================================
  8151.  
  8152.       procedure OPEN_WORKSTATION
  8153.                 ( WS         : in WS_ID ;
  8154.                   CONNECTION : in CONNECTION_ID ;
  8155.                   TYPE_OF_WS : in WS_TYPE ) ;
  8156.       -- ============================================================
  8157.       -- Create a connection between a workstation and GKS
  8158.       -- ANS GKS, section 5.2, page 74
  8159.       -- Effect : Specifies the number to be used to identify the
  8160.       --          workstation, requests the specified connection to
  8161.       --          the workstation, and, if needed, clears the display
  8162.       --          surface.
  8163.       -- ============================================================
  8164.  
  8165.       procedure POLYLINE ( LINE_POINTS : in WC.POINT_ARRAY ) ;
  8166.       -- ============================================================
  8167.       -- Generate a polyline defined by points in WC
  8168.       -- ANS GKS, section 5.3, page 82
  8169.       -- Effect : A sequence of connected straight lines is generated,
  8170.       --          starting at the first point and ending at the last point.
  8171.       -- ============================================================
  8172.  
  8173.       procedure POLYMARKER ( MARKER_POINTS : in WC.POINT_ARRAY ) ;
  8174.       -- ============================================================
  8175.       -- Generate markers of a given type at positions in WC
  8176.       -- ANS GKS, section 5.3, page 82
  8177.       -- Effect : A sequence of markers is generated to identify all the
  8178.       --          given positions.
  8179.       -- ============================================================
  8180.  
  8181.       procedure SET_CHAR_EXPANSION_FACTOR( EXPANSION : in CHAR_EXPANSION ) ;
  8182.       -- ===================================================================
  8183.       -- Set the expansion factor used to determine character width.
  8184.       -- ANS GKS section 5.4, page 93
  8185.       -- Effect : The 'current character expansion factor' entry in the GKS
  8186.       --          state list is set to the value specified by the parameter.
  8187.       -- ===================================================================
  8188.  
  8189.       procedure SET_CHAR_SPACING( SPACING : in CHAR_SPACING ) ;
  8190.       -- ===================================================================
  8191.       -- Set the spacing between text characters.
  8192.       -- ANS GKS section 5.4, page 94
  8193.       -- Effect : The 'current character spacing' entry in the GKS state
  8194.       --          list is set to the value specified by the parameter.
  8195.       -- ===================================================================
  8196.  
  8197.       procedure SET_CHAR_HEIGHT( HEIGHT : in WC.MAGNITUDE ) ;
  8198.       -- ===================================================================
  8199.       -- Set the text characters height.
  8200.       -- ANS GKS section 5.4, page 94
  8201.       -- Effect : The 'current character height'entry in the GKS state
  8202.       --          list is set to the value specified by the parameter.
  8203.       -- ===================================================================
  8204.  
  8205.       procedure SET_COLOUR_REPRESENTATION
  8206.                 ( WS     : in WS_ID ;
  8207.                   INDEX  : in COLOUR_INDEX ;
  8208.                   COLOUR : in COLOUR_REPRESENTATION ) ;
  8209.       -- ============================================================
  8210.       -- Define the colour to be associated with a colour index on
  8211.       -- a workstation
  8212.       -- ANS GKS, section 5.4, page 105
  8213.       -- Effect : Redefines the entries in the colour look up table pointed
  8214.       --          at by the colour index.
  8215.       -- ============================================================
  8216.  
  8217.       procedure SET_FILL_AREA_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) ;
  8218.       -- ============================================================
  8219.       -- Set the fill area colour index for use when the corresponding
  8220.       -- ASF is INDIVIDUAL
  8221.       -- ANS GKS, section 5.4, page 98
  8222.       -- Effect : The current fill area colour index is set to the
  8223.       --          specified value.
  8224.       -- ============================================================
  8225.  
  8226.       procedure SET_FILL_AREA_INTERIOR_STYLE
  8227.                 ( STYLE : in INTERIOR_STYLE ) ;
  8228.       -- ============================================================
  8229.       -- Set the fill area interior style for use when the corresponding
  8230.       -- ASF is INDIVIDUAL
  8231.       -- ANS GKS, section 5.4, page 96
  8232.       -- Effect : The current fill area interior style is set to the
  8233.       --          specified value.
  8234.       -- ============================================================
  8235.  
  8236.       procedure SET_LINE_TYPE ( LINE : in LINE_TYPE ) ;
  8237.       -- ============================================================
  8238.       -- Set the linetype for use when the corresponding ASF
  8239.       -- is INDIVIDUAL
  8240.       -- ANS GKS, section 5.4, page 89
  8241.       -- Effect : The current line type is set to the specified value.
  8242.       -- Linetypes:
  8243.       --        1 - solid
  8244.       --        2  - dashed
  8245.       --        3  - dotted
  8246.       --        4  - dashed-dotted
  8247.       --        >4 - implementation dependent
  8248.       -- ============================================================
  8249.  
  8250.       procedure SET_MARKER_TYPE ( MARKER : in MARKER_TYPE ) ;
  8251.       -- ============================================================
  8252.       -- Set the marker type for use when the corresponding ASF
  8253.       -- is INDIVIDUAL
  8254.       -- ANS GKS, section 5.4, page 91
  8255.       -- Effect : The current marker type is set to the specified value.
  8256.       -- Marker types:
  8257.       --        1  - dot
  8258.       --        2  - plus sign
  8259.       --        3  - asterisk
  8260.       --        4  - circle
  8261.       --        5  - diagonal cross
  8262.       --        >5 - implementation dependent
  8263.       -- ============================================================
  8264.  
  8265.       procedure SET_POLYLINE_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) ;
  8266.       -- ============================================================
  8267.       -- Set the polyline colour index for use when the corresponding ASF
  8268.       -- is INDIVIDUAL
  8269.       -- ANS GKS, section 5.4, page 90
  8270.       -- Effect : The current polyline colour index is set to the
  8271.       --          specified value.
  8272.       -- ============================================================
  8273.  
  8274.       procedure SET_POLYMARKER_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) ;
  8275.       -- ============================================================
  8276.       -- Set the polymarker colour index for use when the corresponding
  8277.       -- ASF is INDIVIDUAL
  8278.       -- ANS GKS, section 5.4, page 92
  8279.       -- Effect : The current polymarker colour index is set to the
  8280.       --          specified value.
  8281.       -- ============================================================
  8282.  
  8283.       procedure SET_TEXT_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) ;
  8284.       -- ============================================================
  8285.       -- Set the text colour index for use when the corresponding
  8286.       -- ASF is INDIVIDUAL
  8287.       -- ANS GKS, section 5.4, page 94
  8288.       -- Effect : The current text colour index is set to the
  8289.       --          specified value.
  8290.       -- ============================================================
  8291.  
  8292.       procedure SET_TEXT_FONT_AND_PRECISION (
  8293.                    FONT_PRECISION : in TEXT_FONT_PRECISION ) ;
  8294.       -- ============================================================
  8295.       -- Set the text font and precision for use when the 
  8296.       -- corresponding ASF is INDIVIDUAL
  8297.       -- ANS GKS, section 5.4, page 94
  8298.       -- Effect : The 'current text font and precision' entry in the
  8299.       --          GKS state list is set to the value specified by
  8300.       --          the parameter.
  8301.       -- ============================================================
  8302.  
  8303.       procedure SET_TEXT_PATH ( PATH : in TEXT_PATH ) ;
  8304.       -- ============================================================
  8305.       -- Select the text path RIGHT, LEFT, UP, or DOWN
  8306.       -- ANS GKS, section 5.4, page 95
  8307.       -- Effect : Set the text path of character strings to the specified
  8308.       --          values for all subsequent text output primitives until
  8309.       --          the values are reset by another call to this function.
  8310.       -- ============================================================
  8311.  
  8312.       procedure SET_WINDOW
  8313.                 ( TRANSFORMATION : in TRANSFORMATION_NUMBER ;
  8314.                   WINDOW_LIMITS  : in WC.RECTANGLE_LIMITS ) ;
  8315.       -- ============================================================
  8316.       -- Set window in WC of a normalization transformation
  8317.       -- ANS GKS, section 5.5, page 107
  8318.       -- Effect : Defines a window for the specified normalization
  8319.       --          transformation.
  8320.       -- ============================================================
  8321.  
  8322.       procedure SET_WORKSTATION_VIEWPORT
  8323.                 ( WS                 : in WS_ID ;
  8324.                   WS_VIEWPORT_LIMITS : in DC.RECTANGLE_LIMITS ) ;
  8325.       -- ============================================================
  8326.       -- Set workstation viewport in DC
  8327.       -- ANS GKS, section 5.5, page 109
  8328.       -- Effect : Specifies where on the workstation display the view
  8329.       --          of NDC space will appear.
  8330.       -- ============================================================
  8331.  
  8332.       procedure TEXT
  8333.                 ( POSITION    : in WC.POINT ;
  8334.                   CHAR_STRING : in STRING ) ;
  8335.       -- ============================================================
  8336.       -- Generate a text string at the given position in WC
  8337.       -- ANS GKS, section 5.3, page 83
  8338.       -- Effect : Generates the specified text string at the specified
  8339.       --          position.
  8340.       -- ============================================================
  8341.  
  8342.    end LEVEL_0A ;
  8343.  
  8344.    package LEVEL_0B is
  8345.    -- ============================================================
  8346.    --  This package declares the GKS Level 0B operations.
  8347.    -- ============================================================
  8348.                         
  8349.       procedure INITIALISE_LOCATOR
  8350.                 ( WS                     : in WS_ID ;
  8351.                   DEVICE                 : in DEVICE_NUMBER ;
  8352.                   INITIAL_TRANSFORMATION : in TRANSFORMATION_NUMBER ;
  8353.                   INITIAL_POSITION       : in WC.POINT ;
  8354.                   ECHO_AREA              : in DC.RECTANGLE_LIMITS ;
  8355.                   DATA_RECORD            : in LOCATOR_DATA_RECORD ) ;
  8356.       -- ============================================================
  8357.       -- Initializes a device for the work station so that a request
  8358.       -- from the locator device can be made
  8359.       -- ANS GKS, section 5.7, page 119
  8360.       -- Effect : Initializes a request on the specified locator device.
  8361.       -- ============================================================
  8362.  
  8363.       procedure REQUEST_LOCATOR
  8364.                 ( WS             : in WS_ID ;
  8365.                   DEVICE         : in DEVICE_NUMBER ;
  8366.                   STATUS         : out INPUT_STATUS ;
  8367.                   TRANSFORMATION : out TRANSFORMATION_NUMBER ;
  8368.                   POSITION       : out WC.POINT ) ;
  8369.       -- ============================================================
  8370.       -- Request position in WC and normalization transformation number
  8371.       -- from a locator device
  8372.       -- ANS GKS, section 5.7, page 131
  8373.       -- Effect : Perform a request on the specified locator device.
  8374.       -- ============================================================
  8375.  
  8376.    end LEVEL_0B ;
  8377.  
  8378.    package LEVEL_1A is
  8379.    -- ============================================================
  8380.    --  This package declares the GKS Level 1A operations.
  8381.    -- ============================================================
  8382.  
  8383.       procedure CLOSE_SEGMENT ;
  8384.       -- ============================================================
  8385.       -- Segment construction finished
  8386.       -- ANS GKS, section 5.6, page 111
  8387.       -- Effect : Close the currently open segment.  Primitives may no longer
  8388.       --          be added to the closed segment.
  8389.       -- ============================================================
  8390.  
  8391.       procedure CREATE_SEGMENT ( SEGMENT : in SEGMENT_NAME ) ;
  8392.       -- ============================================================
  8393.       -- Create a segment and start constructing it
  8394.       -- ANS GKS, section 5.6, page 111
  8395.       -- Effect : Create a segment.  Subsequent calls to output primitive
  8396.       --          functions will place the primitives into the currently
  8397.       --          open segment.
  8398.       -- ============================================================
  8399.  
  8400.       procedure DELETE_SEGMENT ( SEGMENT : in SEGMENT_NAME ) ;
  8401.       -- ============================================================
  8402.       -- Delete a segment
  8403.       -- ANS GKS, section 5.6, page 112
  8404.       -- Effect : Delete all copies of the specified segment stored in
  8405.       --          GKS.  The segment name may be reused.
  8406.       -- ============================================================
  8407.  
  8408.       procedure REDRAW_ALL_SEGMENTS_ON_WORKSTATION
  8409.                 ( WS : in WS_ID ) ;
  8410.       -- ============================================================
  8411.       -- Redraw all visible segments stored on a workstation
  8412.       -- ANS GKS, section 5.2, page 77
  8413.       -- Effect : For the specified workstation, all deferred actions are
  8414.       --          executed, the display surface is cleared if not empty,
  8415.       --          and all visible segments are displayed.
  8416.       -- ============================================================
  8417.  
  8418.       procedure RENAME_SEGMENT
  8419.                 ( OLD_NAME : in SEGMENT_NAME ;
  8420.                   NEW_NAME : in SEGMENT_NAME ) ;
  8421.       -- ============================================================
  8422.       -- Change name of a segment
  8423.       -- ANS GKS, section 5.6, page 111
  8424.       -- Effect : Rename the specified segment.  The old segment name
  8425.       --          may be reused.
  8426.       -- ============================================================
  8427.  
  8428.       procedure SET_HIGHLIGHTING
  8429.                 ( SEGMENT       : in SEGMENT_NAME ;
  8430.                   HIGHLIGHTING  : in SEGMENT_HIGHLIGHTING ) ;
  8431.       -- ============================================================
  8432.       -- Mark segment normal or highlighted
  8433.       -- ANS GKS, section 5.6, page 116
  8434.       -- Effect : Set the highlighting attribute to the value
  8435.       --          HIGHLIGHTED or NORMAL.
  8436.       -- ============================================================
  8437.  
  8438.       procedure SET_SEGMENT_PRIORITY
  8439.                 ( SEGMENT  : in SEGMENT_NAME ;
  8440.                   PRIORITY : in SEGMENT_PRIORITY ) ;
  8441.       -- ============================================================
  8442.       -- Set priority of a segment
  8443.       -- ANS GKS, section 5.6, page 117
  8444.       -- Effect : Set the priority of the specified segment to the specified
  8445.       --          priority.  Priority is a value in the range 0 to 1.
  8446.       -- ============================================================
  8447.  
  8448.       procedure SET_VISIBILITY
  8449.                 ( SEGMENT    : in SEGMENT_NAME ;
  8450.                   VISIBILITY : in SEGMENT_VISIBILITY ) ;
  8451.       -- ============================================================
  8452.       -- Mark segment visible or invisible
  8453.       -- ANS GKS, section 5.6, page 116
  8454.       -- Effect : Set the visibility attributes of the specified segment
  8455.       --          to VISIBLE or INVISIBLE.
  8456.       -- ============================================================
  8457.  
  8458.    end LEVEL_1A ;
  8459.  
  8460.    package LEVEL_1B is
  8461.    -- ============================================================
  8462.    --  This package declares the GKS Level 1B operations.
  8463.    -- ============================================================
  8464.  
  8465.       procedure REQUEST_PICK
  8466.                 ( WS      : in WS_ID ;
  8467.                   DEVICE  : in DEVICE_NUMBER ;
  8468.                   STATUS  : out PICK_REQUEST_STATUS ;
  8469.                   SEGMENT : out SEGMENT_NAME ;
  8470.                   PICK    : out PICK_ID ) ;
  8471.       -- ============================================================
  8472.       -- Request segment name, pick identifier and pick status from a
  8473.       -- pick device
  8474.       -- ANS GKS5.7, section 5.7, page 134
  8475.       -- Effect : Perform a request on the specified pick device.
  8476.       -- ============================================================
  8477.  
  8478.       procedure SET_DETECTABILITY
  8479.                 ( SEGMENT       : in SEGMENT_NAME;
  8480.                   DETECTABILITY : in SEGMENT_DETECTABILITY ) ;
  8481.       -- ============================================================
  8482.       -- Mark segment undetectable or detectable
  8483.       -- ANS GKS, section 5.6, page 117
  8484.       -- Effect : Set the detectability attributes of the specified segment
  8485.       --          to DETECTABLE or UNDETECTABLE.
  8486.       -- ============================================================
  8487.  
  8488.    end LEVEL_1B ;
  8489.  
  8490. end GKS_PRIME ;
  8491. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8492. --gks_prime_body.ada
  8493. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8494. -- version 85-11-27 07:20 by RAM
  8495.  
  8496. with TEXT_IO         ; use TEXT_IO ;
  8497. with TERMINAL_ACCESS ; use TERMINAL_ACCESS ;
  8498. with TRACE_PKG       ; use TRACE_PKG ;
  8499.  
  8500. package body GKS_PRIME is
  8501. -- ===========================================================
  8502. --  The package body of GKS implements the operations which
  8503. --  compose levels 0A through 1B.
  8504. --
  8505. --        Terminal_Access Support Requirements         --
  8506. --     In addition to normal graphics support the      --
  8507. --     following additions are required.               --
  8508. --        SEGMENTS :                                   --
  8509. --            Open/Create            Close             --
  8510. --            Rename                 Delete            --
  8511. --            Priorities                               --
  8512. --        DRAWING :                                    --
  8513. --            Boxes                  Circles           --
  8514. --            Polylines              Text              --
  8515. --            Regular Polygons       Polymarkers       --
  8516. --            Complex Fill Polygons                    --
  8517. ---------------------------------------------------------
  8518.  
  8519.    package TERM_ACC renames TERMINAL_ACCESS ;
  8520.  
  8521.    -----------------------------------------------------------------
  8522.    -- The following object declarations are to set the operation in
  8523.    --  the package terminal_access that will be used to draw each of
  8524.    --  indicated entities.
  8525.    ----------------------------------------------------------------
  8526.    FOR_CIRCLE     : constant TERM_ACC.CIRCLE_OPERATIONS_TYPE
  8527.                   := TERM_ACC.CIRCLE_OPERATIONS_TYPE'First ;
  8528.    FOR_FILL_AREA  : constant TERM_ACC.FILL_AREA_OPERATIONS_TYPE
  8529.                   := TERM_ACC.FILL_AREA_OPERATIONS_TYPE'First ;
  8530.    FOR_POLYLINE   : constant TERM_ACC.POLYLINE_OPERATIONS_TYPE
  8531.                   := TERM_ACC.POLYLINE_OPERATIONS_TYPE'First ;
  8532.    FOR_POLYMARKER : constant TERM_ACC.POLYMARKER_OPERATIONS_TYPE
  8533.                   := TERM_ACC.POLYMARKER_OPERATIONS_TYPE'First ;
  8534.    FOR_RECTANGLE  : constant TERM_ACC.RECTANGLE_OPERATIONS_TYPE
  8535.                   := TERM_ACC.RECTANGLE_OPERATIONS_TYPE'First ;
  8536.    FOR_TEXT       : constant TERM_ACC.TEXT_OPERATIONS_TYPE
  8537.                   := TERM_ACC.TEXT_OPERATIONS_TYPE'First ;
  8538.  
  8539.    -----------------------------------------------------------------
  8540.    -- The following object declarations are to set the indicator in
  8541.    --  the package terminal_access that will be used to draw each of
  8542.    --  indicated entity types color.
  8543.    ------------------------------------------------------------------
  8544.    FOR_ALPHA_BACKGROUND   : constant TERM_ACC.FOR_ALPHA_BACKGROUND_TYPE
  8545.                           := TERM_ACC.FOR_ALPHA_BACKGROUND_TYPE'First ;
  8546.    FOR_ALPHA_WRITING      : constant TERM_ACC.FOR_ALPHA_WRITING_TYPE
  8547.                           := TERM_ACC.FOR_ALPHA_WRITING_TYPE'First ;
  8548.    FOR_GRAPHIC_BACKGROUND : constant TERM_ACC.FOR_GRAPHIC_BACKGROUND_TYPE
  8549.                           := TERM_ACC.FOR_GRAPHIC_BACKGROUND_TYPE'First ;
  8550.    FOR_CHARACTER          : constant TERM_ACC.FOR_CHARACTER_COLOR_TYPE
  8551.                           := TERM_ACC.FOR_CHARACTER_COLOR_TYPE'First ;
  8552.    FOR_FILL_STYLE         : constant TERM_ACC.FOR_FILL_STYLE_COLOR_TYPE
  8553.                           := TERM_ACC.FOR_FILL_STYLE_COLOR_TYPE'First ;
  8554.    FOR_LINE_STYLE         : constant TERM_ACC.FOR_LINE_STYLE_COLOR_TYPE
  8555.                           := TERM_ACC.FOR_LINE_STYLE_COLOR_TYPE'First ;
  8556.    FOR_MARKERS            : constant TERM_ACC.FOR_MARKERS_COLOR_TYPE
  8557.                           := TERM_ACC.FOR_MARKERS_COLOR_TYPE'First ;
  8558.  
  8559.    -------------------------
  8560.    -- current marker in use
  8561.    -------------------------
  8562.    POLYMARKER_TEXT : STRING ( 1..1 ) := "*" ;
  8563.  
  8564.    ---------------------
  8565.    -- GKS internal files
  8566.    ---------------------
  8567.    ERROR_HISTORY : TEXT_IO.FILE_TYPE ;
  8568.  
  8569.    ---------------------
  8570.    -- GKS state list
  8571.    ---------------------
  8572.    type GKS_STATE_LIST_RECORD is
  8573.       record
  8574.       CURRENT_CHARACTER_EXPANSION_FACTOR : CHAR_EXPANSION := 1.0 ;
  8575.       CURRENT_CHARACTER_SPACING          : CHAR_SPACING   := 0.0 ;
  8576.       CURRENT_CHARACTER_HEIGHT           : WC.MAGNITUDE   := 0.01 ;
  8577.       CURRENT_WINDOW                     : WC.RECTANGLE_LIMITS :=
  8578.          ( X => ( MIN => 0.0,
  8579.                   MAX => 32_767.0 ),
  8580.            Y => ( MIN => 0.0,
  8581.                   MAX => 32_767.0 )) ;
  8582.  
  8583.       -- The following state list entries are non standard.
  8584.       CURRENT_CHARACTER_WC_SPACING : WC_TYPE := 100.0 ;
  8585.       CURRENT_CHARACTER_WC_HEIGHT  : WC_TYPE := 100.0 ;
  8586.       CURRENT_CHARACTER_WC_WIDTH   : WC_TYPE := 100.0 ;
  8587.       CURRENT_WINDOW_HEIGHT        : WC_TYPE := 32_767.0 ;
  8588.    end record ;
  8589.  
  8590.    GKS_STATE_LIST : GKS_STATE_LIST_RECORD ;
  8591.  
  8592.    CURRENT_CHARACTER_WIDTH : constant WC.MAGNITUDE   := 0.01 ;
  8593.  
  8594.    GKS_ERROR_FILE : ERROR_FILE_TYPE( 1..DEFAULT_ERROR_FILE'Last ) ;
  8595.  
  8596.    package body LEVEL_0A is
  8597.    -- ===============================================================
  8598.    --  This package body implements the Level 0A operations of GKS.
  8599.    -- ===============================================================
  8600.  
  8601.       procedure CLOSE_GKS is
  8602.       -- ==============================================================
  8603.       -- Stop working with GKS
  8604.       -- ANS GKS section 5.2, page 74
  8605.       -- Effect : GKS is closed and all termination processing required
  8606.       --          by the implementation is performed.
  8607.       -- ==============================================================
  8608.  
  8609.       begin
  8610.          -- debug aid only
  8611.          if TRACE_PKG.REQUEST_TRACE then
  8612.            TRACE_PKG.TRACE ( "GKS_PRIME.CLOSE_GKS" ) ;
  8613.          end if ;
  8614.  
  8615.          -- internal GKS operations
  8616.          -- check if error file is open
  8617.          if TEXT_IO.IS_OPEN( ERROR_HISTORY ) then
  8618.             -- close error file
  8619.             TEXT_IO.CLOSE ( ERROR_HISTORY ) ;
  8620.          end if ;
  8621.       end CLOSE_GKS ;
  8622.  
  8623.  
  8624.       procedure CLOSE_WORKSTATION ( WS : in WS_ID ) is
  8625.       -- =============================================================
  8626.       -- Release the connection between a workstation and GKS
  8627.       -- ANS GKS, section 5.2, page 75
  8628.       -- Effect : For the specified workstation, an implicit UPDATE
  8629.       --          WORKSTATION is performed, and the connection to the
  8630.       --          workstation is released.
  8631.       -- =============================================================
  8632.       begin
  8633.          -- debug aid only
  8634.          if TRACE_PKG.REQUEST_TRACE then
  8635.            TRACE_PKG.TRACE( "GKS_PRIME.CLOSE_WORKSTATION" ) ;
  8636.          end if ;
  8637.  
  8638.          TERM_ACC.CLOSE_TERMINAL;
  8639.       end CLOSE_WORKSTATION ;
  8640.  
  8641.  
  8642.       procedure EMERGENCY_CLOSE_GKS is
  8643.       -- ===============================================================
  8644.       -- Tries to close GKS in case of an error, saving as much information
  8645.       -- as possible
  8646.       -- ANS GKS, section 5.11, page 195
  8647.       -- Effect : GKS is emergency closed.  The function is called when it
  8648.       --          is not possible to recover from an error.
  8649.       -- ===============================================================
  8650.       begin
  8651.          -- debug aid only
  8652.          if TRACE_PKG.REQUEST_TRACE then
  8653.            TRACE_PKG.TRACE( "GKS_PRIME.EMERGENCY_CLOSE_GKS" ) ;
  8654.          end if ;
  8655.  
  8656.          -- internal GKS operations
  8657.          -- check if error file is open
  8658.          if TEXT_IO.IS_OPEN( ERROR_HISTORY ) then
  8659.             -- close error file
  8660.             TEXT_IO.CLOSE ( ERROR_HISTORY ) ;
  8661.          end if ;
  8662.       end EMERGENCY_CLOSE_GKS ;
  8663.  
  8664.  
  8665.       procedure ERROR_HANDLING
  8666.                 ( ERROR_NUMBER : in ERROR_INDICATOR ;
  8667.                   ID           : in SUBPROGRAM_NAME ;
  8668.                   ERROR_FILE   : in STRING ) is
  8669.       -- ===============================================================
  8670.       -- A procedure called by GKS when an error is detected.  It may be
  8671.       -- user supplied
  8672.       -- ANS GKS, section 5.11, page 195
  8673.       -- Effect : The GKS detected error is logged via a call to
  8674.       --          ERROR_LOGGING and control is returned to the GKS
  8675.       --          function where the error has been detected.
  8676.       -- ==============================================================
  8677.       begin
  8678.          -- debug aid only
  8679.          if TRACE_PKG.REQUEST_TRACE then
  8680.            TRACE_PKG.TRACE( "GKS_PRIME.ERROR_HANDLING" ) ;
  8681.          end if ;
  8682.  
  8683.          --  internal GKS operations
  8684.          ERROR_LOGGING ( ERROR_NUMBER, ID ) ;
  8685.       end ERROR_HANDLING ;
  8686.  
  8687.  
  8688.       procedure ERROR_LOGGING
  8689.                 ( EI : in ERROR_INDICATOR ;
  8690.                   NAME : in SUBPROGRAM_NAME ) is
  8691.       -- ==============================================================
  8692.       -- A procedure called by the standard GKS error handling procedure.
  8693.       -- It prints an error message and function identification on the
  8694.       -- error file
  8695.       -- ANS GKS, section 5.11, page 196
  8696.       -- Effect : An error message and GKS function identification is
  8697.       --          written to the error file.
  8698.       -- ==============================================================
  8699.          STORAGE : constant TEXT_IO.FILE_MODE := OUT_FILE ;
  8700.       begin
  8701.          -- debug aid only
  8702.          if TRACE_PKG.REQUEST_TRACE then
  8703.            TRACE_PKG.TRACE( "GKS_PRIME.ERROR_LOGGING" ) ;
  8704.          end if ;
  8705.  
  8706.          -- check if error file is open
  8707.          if not TEXT_IO.IS_OPEN( ERROR_HISTORY ) then
  8708.             -- open error file
  8709.             TEXT_IO.CREATE( ERROR_HISTORY, STORAGE, GKS_ERROR_FILE ) ;
  8710.          end if ;
  8711.  
  8712.          -- internal GKS operations
  8713.          TEXT_IO.PUT_LINE( ERROR_HISTORY , ERROR_INDICATOR'IMAGE( EI )) ;
  8714.          TEXT_IO.PUT_LINE( ERROR_HISTORY , NAME ) ;
  8715.       end ERROR_LOGGING ;
  8716.  
  8717.  
  8718.       procedure FILL_AREA ( FILL_AREA_POINTS : in WC.POINT_ARRAY ) is
  8719.       -- ================================================================
  8720.       -- Generate a polygon which may be filled with a colour, a hatch or
  8721.       -- a pattern or may be hollow
  8722.       -- ANS GKS, section 5.3, page 83
  8723.       -- Effect : A FILL AREA primitive is generated, and the current values
  8724.       --          of the fill area attributes are bound to the primitive.
  8725.       --          The attributes are listed in section 4.4.2, page 21.
  8726.       -- ================================================================
  8727.          FILL_AREA_DATA     : TERM_ACC.OBJECT_DATA_RECORD( FOR_FILL_AREA ) ;
  8728.          MAGNITUDE          : constant NATURAL := FILL_AREA_POINTS'last ;
  8729.          EXTENDED_MAGNITUDE : constant NATURAL := MAGNITUDE + 1 ;
  8730.       begin
  8731.          -- debug aid only
  8732.          if TRACE_PKG.REQUEST_TRACE then
  8733.            TRACE_PKG.TRACE( "GKS_PRIME.FILL_AREA" ) ;
  8734.          end if ;
  8735.  
  8736.          -- fill fill_area_data with point list
  8737.          FILL_AREA_DATA.SHAPE_DATA_LIST
  8738.             ( FILL_AREA_POINTS'first..FILL_AREA_POINTS'last ) :=
  8739.             FILL_AREA_POINTS  ;
  8740.          FILL_AREA_DATA.SHAPE_LIST_LENGTH := MAGNITUDE ;
  8741.          case FOR_FILL_AREA is
  8742.             when USE_POLYGON =>
  8743.                TERM_ACC.DRAW ( FILL_AREA_DATA ) ;
  8744.             when others =>
  8745.                null;
  8746.          end case ;
  8747.       end FILL_AREA ;
  8748.  
  8749.  
  8750.       procedure OPEN_GKS
  8751.          ( ERROR_FILE       : in ERROR_FILE_TYPE := DEFAULT_ERROR_FILE ;
  8752.            AMOUNT_OF_MEMORY : in MEMORY_UNITS := MAX_MEMORY_UNITS ) is
  8753.       -- =============================================================
  8754.       --  Start working with GKS
  8755.       --  ANS GKS, section 5.2, page 74
  8756.       -- Effect : GKS is opened and all initialization processing required
  8757.       --          by the implementation is performed.
  8758.       -- ==============================================================
  8759.       begin
  8760.          -- debug aid only
  8761.          if TRACE_PKG.REQUEST_TRACE then
  8762.            TRACE_PKG.TRACE( "GKS_PRIME.OPEN_GKS" ) ;
  8763.          end if ;
  8764.  
  8765.          -- internal GKS operations
  8766.          GKS_ERROR_FILE := ERROR_FILE ;
  8767.       end OPEN_GKS ;
  8768.  
  8769.  
  8770.       procedure OPEN_WORKSTATION
  8771.                 ( WS         : in WS_ID ;
  8772.                   CONNECTION : in CONNECTION_ID ;
  8773.                   TYPE_OF_WS : in WS_TYPE ) is
  8774.       -- ============================================================
  8775.       -- Create a connection between a workstation and GKS
  8776.       -- ANS GKS, section 5.2, page 74
  8777.       -- Effect : Specifies the number to be used to identify the
  8778.       --          workstation, requests the specified connection to
  8779.       --          the workstation, and, if needed, clears the display
  8780.       --          surface.
  8781.       -- ============================================================
  8782.          CURRENT_WORKSTATION : WS_ID := WS ;
  8783.       begin
  8784.          -- debug aid only
  8785.          if TRACE_PKG.REQUEST_TRACE then
  8786.            TRACE_PKG.TRACE( "GKS_PRIME.OPEN_WORKSTATION" ) ;
  8787.          end if ;
  8788.  
  8789.          TERM_ACC.INIT_TERMINAL( CURRENT_WORKSTATION );
  8790.       end OPEN_WORKSTATION ;
  8791.  
  8792.  
  8793.       procedure POLYLINE ( LINE_POINTS : in WC.POINT_ARRAY ) is
  8794.       -- ============================================================
  8795.       -- Generate a polyline defined by points in WC
  8796.       -- ANS GKS, section 5.3, page 82
  8797.       -- Effect : A sequence of connected straight lines is generated,
  8798.       --          starting at the first point and ending at the last point.
  8799.       -- ============================================================
  8800.          POLYLINE_DATA : TERM_ACC.OBJECT_DATA_RECORD(
  8801.                          TERM_ACC.USE_POLYLINE ) ;
  8802.       begin
  8803.          -- debug aid only
  8804.          if TRACE_PKG.REQUEST_TRACE then
  8805.            TRACE_PKG.TRACE( "GKS_PRIME.POLYLINE" ) ;
  8806.          end if ;
  8807.  
  8808.          -- fill polyline_data with polyline specific data
  8809.          POLYLINE_DATA.
  8810.             SHAPE_DATA_LIST( LINE_POINTS'FIRST..LINE_POINTS'LAST ) :=
  8811.             LINE_POINTS ;
  8812.          POLYLINE_DATA.
  8813.             SHAPE_LIST_LENGTH := LINE_POINTS'LAST - LINE_POINTS'FIRST + 1 ;
  8814.          TERM_ACC.DRAW ( POLYLINE_DATA ) ;
  8815.       end POLYLINE ;
  8816.  
  8817.  
  8818.       procedure POLYMARKER ( MARKER_POINTS : in WC.POINT_ARRAY ) is
  8819.       -- ============================================================
  8820.       -- Generate markers of a given type at positions in WC
  8821.       -- ANS GKS, section 5.3, page 82
  8822.       -- Effect : A sequence of markers is generated to identify all the
  8823.       --          given positions.
  8824.       -- ============================================================
  8825.          POLYMARKER_DATA : TERM_ACC.OBJECT_DATA_RECORD( FOR_POLYMARKER ) ;
  8826.       begin
  8827.          -- debug aid only
  8828.          if TRACE_PKG.REQUEST_TRACE then
  8829.            TRACE_PKG.TRACE( "GKS_PRIME.POLYMARKER" ) ;
  8830.          end if ;
  8831.  
  8832.          case FOR_POLYMARKER is
  8833.             when USE_MARKER =>
  8834.                -- fill polymarker_data with marker specific data
  8835.                for I in 1..MARKER_POINTS'last loop
  8836.                   POLYMARKER_DATA.REFERENCE_POINT := MARKER_POINTS ( I ) ;
  8837.                   TERM_ACC.DRAW ( POLYMARKER_DATA ) ;
  8838.                end loop ;
  8839.             when others => null ;
  8840.          end case ;
  8841.       end POLYMARKER ;
  8842.  
  8843.  
  8844.       procedure SET_CHAR_EXPANSION_FACTOR( EXPANSION : in CHAR_EXPANSION ) is
  8845.       -- ===================================================================
  8846.       -- Set the expansion factor used to determine character width.
  8847.       -- ANS GKS section 5.4, page 93
  8848.       -- Effect : The 'current character expansion factor' entry in the GKS
  8849.       --          state list is set to the value specified by the parameter.
  8850.       -- ===================================================================
  8851.          SIZE_ATTRIBUTES : TERM_ACC.CHARACTER_ATTRIBUTES ;
  8852.       begin
  8853.          -- debug aid only
  8854.          if TRACE_PKG.REQUEST_TRACE then
  8855.            TRACE_PKG.TRACE( "GKS_PRIME.SET_CHAR_EXPANSION_FACTOR" ) ;
  8856.          end if ;
  8857.  
  8858.          -- Save received parameter and determine new character width
  8859.          GKS_STATE_LIST.CURRENT_CHARACTER_EXPANSION_FACTOR := EXPANSION ;
  8860.          GKS_STATE_LIST.CURRENT_CHARACTER_WC_WIDTH :=
  8861.             GKS_STATE_LIST.CURRENT_WINDOW_HEIGHT *
  8862.             WC_TYPE( CURRENT_CHARACTER_WIDTH ) *
  8863.             WC_TYPE( GKS_STATE_LIST.CURRENT_CHARACTER_EXPANSION_FACTOR ) ;
  8864.  
  8865.          -- Adjust display size of characters
  8866.          SIZE_ATTRIBUTES.WIDTH   :=
  8867.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_WIDTH ;
  8868.          SIZE_ATTRIBUTES.HEIGHT  :=
  8869.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_HEIGHT ;
  8870.          SIZE_ATTRIBUTES.SPACING :=
  8871.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_SPACING ;
  8872.  
  8873.          TERM_ACC.SET_CHARACTER_ATTRIBUTES( SIZE_ATTRIBUTES ) ;
  8874.  
  8875.       end SET_CHAR_EXPANSION_FACTOR ;
  8876.  
  8877.  
  8878.       procedure SET_CHAR_SPACING( SPACING : in CHAR_SPACING ) is
  8879.       -- ===================================================================
  8880.       -- Set the spacing between text characters.
  8881.       -- ANS GKS section 5.4, page 94
  8882.       -- Effect : The 'current character spacing' entry in the GKS state
  8883.       --          list is set to the value specified by the parameter.
  8884.       -- ===================================================================
  8885.          SIZE_ATTRIBUTES  : TERM_ACC.CHARACTER_ATTRIBUTES ;
  8886.          RECEIVED_SPACING : CHAR_SPACING := SPACING ;
  8887.       begin
  8888.          -- debug aid only
  8889.          if TRACE_PKG.REQUEST_TRACE then
  8890.            TRACE_PKG.TRACE( "GKS_PRIME.SET_CHAR_SPACING" ) ;
  8891.          end if ;
  8892.  
  8893.          -- Force a positive character expansion
  8894.          if RECEIVED_SPACING < 0.0 then
  8895.             RECEIVED_SPACING := 0.0 ;
  8896.          end if ;
  8897.  
  8898.          -- Save received parameter and determine new character spacing.
  8899.          GKS_STATE_LIST.CURRENT_CHARACTER_SPACING := RECEIVED_SPACING ;
  8900.          GKS_STATE_LIST.CURRENT_CHARACTER_WC_SPACING :=
  8901.             GKS_STATE_LIST.CURRENT_WINDOW_HEIGHT *
  8902.             WC_TYPE( GKS_STATE_LIST.CURRENT_CHARACTER_SPACING ) ;
  8903.  
  8904.          -- Adjust display size of characters
  8905.          SIZE_ATTRIBUTES.WIDTH   :=
  8906.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_WIDTH ;
  8907.          SIZE_ATTRIBUTES.HEIGHT  :=
  8908.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_HEIGHT ;
  8909.          SIZE_ATTRIBUTES.SPACING :=
  8910.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_SPACING ;
  8911.  
  8912.          TERM_ACC.SET_CHARACTER_ATTRIBUTES( SIZE_ATTRIBUTES ) ;
  8913.       end SET_CHAR_SPACING ;
  8914.  
  8915.  
  8916.       procedure SET_CHAR_HEIGHT( HEIGHT : in WC.MAGNITUDE ) is
  8917.       -- ===================================================================
  8918.       -- Set the text characters height.
  8919.       -- ANS GKS section 5.4, page 94
  8920.       -- Effect : The 'current character height'entry in the GKS state
  8921.       --          list is set to the value specified by the parameter.
  8922.       -- ===================================================================
  8923.          SIZE_ATTRIBUTES : TERM_ACC.CHARACTER_ATTRIBUTES ;
  8924.       begin
  8925.          -- debug aid only
  8926.          if TRACE_PKG.REQUEST_TRACE then
  8927.            TRACE_PKG.TRACE( "GKS_PRIME.SET_CHAR_HEIGHT" ) ;
  8928.          end if ;
  8929.  
  8930.          -- Save received parameter and determine new character spacing.
  8931.          GKS_STATE_LIST.CURRENT_CHARACTER_HEIGHT := HEIGHT ;
  8932.          GKS_STATE_LIST.CURRENT_CHARACTER_WC_HEIGHT :=
  8933.             GKS_STATE_LIST.CURRENT_WINDOW_HEIGHT *
  8934.             WC_TYPE( GKS_STATE_LIST.CURRENT_CHARACTER_HEIGHT ) ;
  8935.  
  8936.          -- Adjust display size of characters
  8937.          SIZE_ATTRIBUTES.WIDTH   :=
  8938.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_WIDTH ;
  8939.          SIZE_ATTRIBUTES.HEIGHT  :=
  8940.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_HEIGHT ;
  8941.          SIZE_ATTRIBUTES.SPACING :=
  8942.             GKS_STATE_LIST.CURRENT_CHARACTER_WC_SPACING ;
  8943.  
  8944.          TERM_ACC.SET_CHARACTER_ATTRIBUTES( SIZE_ATTRIBUTES ) ;
  8945.       end SET_CHAR_HEIGHT ;
  8946.  
  8947.  
  8948.       procedure SET_COLOUR_REPRESENTATION
  8949.                 ( WS     : in WS_ID ;
  8950.                   INDEX  : in COLOUR_INDEX ;
  8951.                   COLOUR : in COLOUR_REPRESENTATION ) is
  8952.       -- ============================================================
  8953.       -- Define the colour to be associated with a colour index on
  8954.       -- a workstation
  8955.       -- ANS GKS, section 5.4, page 105
  8956.       -- Effect : Redefines the entries in the colour look up table pointed
  8957.       --          at by the colour index.
  8958.       -- ============================================================
  8959.       begin
  8960.          -- debug aid only
  8961.          if TRACE_PKG.REQUEST_TRACE then
  8962.            TRACE_PKG.TRACE( "GKS_PRIME.SET_COLOUR_REPRESENTATION" ) ;
  8963.          end if ;
  8964.  
  8965.          TERM_ACC.DEFINE_COLOR( INDEX , COLOUR ) ;
  8966.       end SET_COLOUR_REPRESENTATION ;
  8967.  
  8968.  
  8969.       procedure SET_FILL_AREA_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) is
  8970.       -- ============================================================
  8971.       -- Set the fill area colour index for use when the corresponding
  8972.       -- ASF is INDIVIDUAL
  8973.       -- ANS GKS, section 5.4, page 98
  8974.       -- Effect : The current fill area colour index is set to the
  8975.       --          specified value.
  8976.       -- ============================================================
  8977.       begin
  8978.          -- debug aid only
  8979.          if TRACE_PKG.REQUEST_TRACE then
  8980.            TRACE_PKG.TRACE( " " ) ;
  8981.            TRACE_PKG.TRACE ( "GKS_PRIME.SET_FILL_AREA_COLOR_INDEX" ) ;
  8982.            TRACE_PKG.TRACE ( "       COLOR =>"
  8983.               & COLOUR_INDEX'Image ( COLOUR ) ) ;
  8984.          end if ;
  8985.  
  8986.          TERM_ACC.SET_COLOR_INDEX ( FOR_FILL_STYLE , COLOUR ) ;
  8987.       end SET_FILL_AREA_COLOUR_INDEX ;
  8988.  
  8989.  
  8990.       procedure SET_FILL_AREA_INTERIOR_STYLE
  8991.                 ( STYLE : in INTERIOR_STYLE ) is
  8992.       -- ============================================================
  8993.       -- Set the fill area interior style for use when the corresponding
  8994.       -- ASF is INDIVIDUAL
  8995.       -- ANS GKS, section 5.4, page 96
  8996.       -- Effect : The current fill area interior style is set to the
  8997.       --          specified value.
  8998.       -- ============================================================
  8999.          STYLE_DATA : TERM_ACC.STYLE_RECORD ( FILL_PATTERN ) ;
  9000.       begin
  9001.          -- debug aid only
  9002.          if TRACE_PKG.REQUEST_TRACE then
  9003.            TRACE_PKG.TRACE( "GKS_PRIME.SET_FILL_AREA_INTERIOR_STYLE" ) ;
  9004.          end if ;
  9005.  
  9006.          -- load style_data
  9007.          STYLE_DATA.FILL := STYLE ;
  9008.          TERM_ACC.SET_STYLE ( STYLE_DATA ) ;
  9009.       end SET_FILL_AREA_INTERIOR_STYLE ;
  9010.  
  9011.  
  9012.       procedure SET_LINE_TYPE ( LINE : in LINE_TYPE ) is
  9013.       -- ============================================================
  9014.       -- Set the linetype for use when the corresponding ASF
  9015.       -- is INDIVIDUAL
  9016.       -- ANS GKS, section 5.4, page 89
  9017.       -- Effect : The current line type is set to the specified value.
  9018.       -- Linetypes:
  9019.       --        1 - solid
  9020.       --        2  - dashed
  9021.       --        3  - dotted
  9022.       --        4  - dashed-dotted
  9023.       --        >4 - implementation dependent
  9024.       -- ============================================================
  9025.          STYLE_DATA : TERM_ACC.STYLE_RECORD ( LINE_PATTERN ) ;
  9026.       begin
  9027.          -- debug aid only
  9028.          if TRACE_PKG.REQUEST_TRACE then
  9029.            TRACE_PKG.TRACE( "GKS_PRIME.SET_LINE_TYPE" ) ;
  9030.          end if ;
  9031.  
  9032.          -- load style_data
  9033.          STYLE_DATA.LINE := LINE ;
  9034.          TERM_ACC.SET_STYLE ( STYLE_DATA ) ;
  9035.       end SET_LINE_TYPE ;
  9036.  
  9037.  
  9038.       procedure SET_MARKER_TYPE ( MARKER : in MARKER_TYPE ) is
  9039.       -- ============================================================
  9040.       -- Set the marker type for use when the corresponding ASF
  9041.       -- is INDIVIDUAL
  9042.       -- ANS GKS, section 5.4, page 91
  9043.       -- Effect : The current marker type is set to the specified value.
  9044.       -- Marker types:
  9045.       --        1  - dot
  9046.       --        2  - plus sign
  9047.       --        3  - asterisk
  9048.       --        4  - circle
  9049.       --        5  - diagonal cross
  9050.       --        >5 - implementation dependent
  9051.       -- ============================================================
  9052.          STYLE_DATA : TERM_ACC.STYLE_RECORD ( MARKER_PATTERN ) ;
  9053.       begin
  9054.          -- debug aid only
  9055.          if TRACE_PKG.REQUEST_TRACE then
  9056.            TRACE_PKG.TRACE( "GKS_PRIME.SET_MARKERTYPE" ) ;
  9057.          end if ;
  9058.  
  9059.          -- load style_data
  9060.          STYLE_DATA.MARKER := MARKER ;
  9061.          TERM_ACC.SET_STYLE ( STYLE_DATA ) ;
  9062.          case MARKER is
  9063.             when 1 => POLYMARKER_TEXT := "." ;
  9064.             when 2 => POLYMARKER_TEXT := "+" ;
  9065.             when 3 => POLYMARKER_TEXT := "*" ;
  9066.             when 4 => POLYMARKER_TEXT := "O" ;
  9067.             when 5 => POLYMARKER_TEXT := "X" ;
  9068.             when others => null;
  9069.          end case ; -- MARKER
  9070.       end SET_MARKER_TYPE ;
  9071.  
  9072.  
  9073.       procedure SET_POLYLINE_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) is
  9074.       -- ============================================================
  9075.       -- Set the polyline colour index for use when the corresponding ASF
  9076.       -- is INDIVIDUAL
  9077.       -- ANS GKS, section 5.4, page 90
  9078.       -- Effect : The current polyline colour index is set to the
  9079.       --          specified value.
  9080.       -- ============================================================
  9081.       begin
  9082.          -- debug aid only
  9083.          if TRACE_PKG.REQUEST_TRACE then
  9084.            TRACE_PKG.TRACE( "GKS_PRIME.SET_POLYLINE_COLOUR_INDEX" ) ;
  9085.          end if ;
  9086.  
  9087.          TERM_ACC.SET_COLOR_INDEX ( FOR_LINE_STYLE , COLOUR ) ;
  9088.       end SET_POLYLINE_COLOUR_INDEX ;
  9089.  
  9090.  
  9091.       procedure SET_POLYMARKER_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) is
  9092.       -- ============================================================
  9093.       -- Set the polymarker colour index for use when the corresponding
  9094.       -- ASF is INDIVIDUAL
  9095.       -- ANS GKS, section 5.4, page 92
  9096.       -- Effect : The current polymarker colour index is set to the
  9097.       --          specified value.
  9098.       -- ============================================================
  9099.       begin
  9100.          -- debug aid only
  9101.          if TRACE_PKG.REQUEST_TRACE then
  9102.            TRACE_PKG.TRACE( "GKS_PRIME.SET_POLYMARKER_COLOR_INDEX" ) ;
  9103.          end if ;
  9104.  
  9105.          TERM_ACC.SET_COLOR_INDEX ( FOR_MARKERS , COLOUR ) ;
  9106.       end SET_POLYMARKER_COLOUR_INDEX ;
  9107.  
  9108.  
  9109.       procedure SET_TEXT_COLOUR_INDEX ( COLOUR : in COLOUR_INDEX ) is
  9110.       -- ============================================================
  9111.       -- Set the text colour index for use when the corresponding
  9112.       -- ASF is INDIVIDUAL
  9113.       -- ANS GKS, section 5.4, page 94
  9114.       -- Effect : The current text colour index is set to the
  9115.       --          specified value.
  9116.       -- ============================================================
  9117.       begin
  9118.          -- debug aid only
  9119.          if TRACE_PKG.REQUEST_TRACE then
  9120.            TRACE_PKG.TRACE( "GKS_PRIME.SET_TEXT_COLOUR_INDEX" ) ;
  9121.          end if ;
  9122.  
  9123.          TERM_ACC.SET_COLOR_INDEX ( FOR_CHARACTER , COLOUR ) ;
  9124.       end SET_TEXT_COLOUR_INDEX ;
  9125.  
  9126.  
  9127.       procedure SET_TEXT_FONT_AND_PRECISION (
  9128.                    FONT_PRECISION : in TEXT_FONT_PRECISION ) is
  9129.       -- ============================================================
  9130.       -- Set the text font and precision for use when the 
  9131.       -- corresponding ASF is INDIVIDUAL
  9132.       -- ANS GKS, section 5.4, page 94
  9133.       -- Effect : The 'current text font and precision' entry in the
  9134.       --          GKS state list is set to the value specified by
  9135.       --          the parameter.
  9136.       -- ============================================================
  9137.       begin
  9138.          -- debug aid only
  9139.          if TRACE_PKG.REQUEST_TRACE then
  9140.            TRACE_PKG.TRACE( "GKS_PRIME.SET_TEXT_FONT_AND_PRECISION" ) ;
  9141.          end if ;
  9142.  
  9143.          TERM_ACC.SET_TEXT_PRECISION( FONT_PRECISION.PRECISION ) ;
  9144.       end SET_TEXT_FONT_AND_PRECISION ;
  9145.  
  9146.  
  9147.       procedure SET_TEXT_PATH ( PATH : in TEXT_PATH ) is
  9148.       -- ============================================================
  9149.       -- Select the text path RIGHT, LEFT, UP, or DOWN
  9150.       -- ANS GKS, section 5.4, page 95
  9151.       -- Effect : Set the text path of character strings to the specified
  9152.       --          values for all subsequent text output primitives until
  9153.       --          the values are reset by another call to this function.
  9154.       -- ============================================================
  9155.       begin
  9156.          -- debug aid only
  9157.          if TRACE_PKG.REQUEST_TRACE then
  9158.            TRACE_PKG.TRACE( "GKS_PRIME.SET_TEXT_PATH" ) ;
  9159.          end if ;
  9160.  
  9161.          TERM_ACC.SET_TEXT_PATH ( PATH ) ;
  9162.       end SET_TEXT_PATH ;
  9163.  
  9164.  
  9165.       procedure SET_WINDOW
  9166.                 ( TRANSFORMATION : in TRANSFORMATION_NUMBER ;
  9167.                   WINDOW_LIMITS  : in WC.RECTANGLE_LIMITS ) is
  9168.       -- ============================================================
  9169.       -- Set window in WC of a normalization transformation
  9170.       -- ANS GKS, section 5.5, page 107
  9171.       -- Effect : Defines a window for the specified normalization
  9172.       --          transformation.
  9173.       -- ============================================================
  9174.       begin
  9175.          -- debug aid only
  9176.          if TRACE_PKG.REQUEST_TRACE then
  9177.            TRACE_PKG.TRACE( "GKS_PRIME.SET_WINDOW" ) ;
  9178.          end if ;
  9179.  
  9180.          -- Save current window boundaries and determine window height.
  9181.          GKS_STATE_LIST.CURRENT_WINDOW := WINDOW_LIMITS ;
  9182.          GKS_STATE_LIST.CURRENT_WINDOW_HEIGHT :=
  9183.             GKS_STATE_LIST.CURRENT_WINDOW.Y.MAX -
  9184.             GKS_STATE_LIST.CURRENT_WINDOW.Y.MIN ;
  9185.  
  9186.       end SET_WINDOW ;
  9187.  
  9188.  
  9189.       procedure SET_WORKSTATION_VIEWPORT
  9190.                 ( WS                 : in WS_ID ;
  9191.                   WS_VIEWPORT_LIMITS : in DC.RECTANGLE_LIMITS ) is
  9192.       -- ============================================================
  9193.       -- Set workstation viewport in DC
  9194.       -- ANS GKS, section 5.5, page 109
  9195.       -- Effect : Specifies where on the workstation display the view
  9196.       --          of NDC space will appear.
  9197.       -- ============================================================
  9198.       begin
  9199.          -- debug aid only
  9200.          if TRACE_PKG.REQUEST_TRACE then
  9201.            TRACE_PKG.TRACE( "GKS_PRIME.SET_WORKSTATION_VIEWPORT" ) ;
  9202.          end if ;
  9203.       end SET_WORKSTATION_VIEWPORT ;
  9204.  
  9205.  
  9206.       procedure TEXT
  9207.                 ( POSITION    : in WC.POINT ;
  9208.                   CHAR_STRING : in STRING ) is
  9209.       -- ============================================================
  9210.       -- Generate a text string at the given position in WC
  9211.       -- ANS GKS, section 5.3, page 83
  9212.       -- Effect : Generates the specified text string at the specified
  9213.       --          position.
  9214.       -- ============================================================
  9215.          TEXT_DATA : TERM_ACC.OBJECT_DATA_RECORD ( FOR_TEXT ) ;
  9216.       begin
  9217.          -- debug aid only
  9218.          if TRACE_PKG.REQUEST_TRACE then
  9219.            TRACE_PKG.TRACE( "GKS_PRIME.TEXT" ) ;
  9220.          end if ;
  9221.  
  9222.          -- fill text_data with text specific data
  9223.          TEXT_DATA.REFERENCE_POINT                   := POSITION ;
  9224.          TEXT_DATA.TEXT_LENGTH := CHAR_STRING'Last - CHAR_STRING'First + 1 ;
  9225.          TEXT_DATA.TEXT ( 1..TEXT_DATA.TEXT_LENGTH ) := CHAR_STRING ;
  9226.          TERM_ACC.DRAW ( TEXT_DATA ) ;
  9227.       end TEXT ;
  9228.  
  9229.    end LEVEL_0A ;
  9230.  
  9231.    package body LEVEL_0B is
  9232.    -- ===============================================================
  9233.    --  This package body implements the GKS Level 0B operations.
  9234.    -- ===============================================================
  9235.  
  9236.       procedure INITIALISE_LOCATOR
  9237.                 ( WS                     : in WS_ID ;
  9238.                   DEVICE                 : in DEVICE_NUMBER ;
  9239.                   INITIAL_TRANSFORMATION : in TRANSFORMATION_NUMBER ;
  9240.                   INITIAL_POSITION       : in WC.POINT ;
  9241.                   ECHO_AREA              : in DC.RECTANGLE_LIMITS ;
  9242.                   DATA_RECORD            : in LOCATOR_DATA_RECORD ) is
  9243.       -- ============================================================
  9244.       -- Initializes a device for the work station so that a request
  9245.       -- from the locator device can be made
  9246.       -- ANS GKS, section 5.7, page 119
  9247.       -- Effect : Initializes a request on the specified locator device.
  9248.       -- ============================================================
  9249.       begin
  9250.          -- debug aid only
  9251.          if TRACE_PKG.REQUEST_TRACE then
  9252.            TRACE_PKG.TRACE( "GKS_PRIME.INITIALIZE_LOCATOR" ) ;
  9253.          end if ;
  9254.  
  9255.          TERM_ACC.PLACE_CURSOR( INITIAL_POSITION ) ;
  9256.       exception
  9257.          when LOCATOR_INPUT_ERROR =>
  9258.             raise GKS_ERROR_2501 ;
  9259.          when others =>
  9260.             raise GKS_ERROR_2501 ;
  9261.       end INITIALISE_LOCATOR ;
  9262.  
  9263.  
  9264.       procedure REQUEST_LOCATOR
  9265.                 ( WS             : in WS_ID ;
  9266.                   DEVICE         : in DEVICE_NUMBER ;
  9267.                   STATUS         : out INPUT_STATUS ;
  9268.                   TRANSFORMATION : out TRANSFORMATION_NUMBER ;
  9269.                   POSITION       : out WC.POINT ) is
  9270.       -- ============================================================
  9271.       -- Request position in WC and normalization transformation number
  9272.       -- from a locator device
  9273.       -- ANS GKS, section 5.7, page 131
  9274.       -- Effect : Perform a request on the specified locator device.
  9275.       -- ============================================================
  9276.       begin
  9277.          -- debug aid only
  9278.          if TRACE_PKG.REQUEST_TRACE then
  9279.            TRACE_PKG.TRACE( "GKS_PRIME.REQUEST_LOCATOR" ) ;
  9280.          end if ;
  9281.  
  9282.          POSITION := TERM_ACC.REQUEST_LOCATOR( DEVICE ) ;
  9283.       exception
  9284.          when LOCATOR_INPUT_ERROR =>
  9285.             raise GKS_ERROR_2501 ;
  9286.          when others =>
  9287.             raise GKS_ERROR_2501 ;
  9288.       end REQUEST_LOCATOR ;
  9289.  
  9290.    end LEVEL_0B ;
  9291.  
  9292.    package body LEVEL_1A is
  9293.    -- ===============================================================
  9294.    --  This package body implements the GKS Level 1A operations.
  9295.    -- ===============================================================
  9296.  
  9297.       procedure CLOSE_SEGMENT is
  9298.       -- ============================================================
  9299.       -- Segment construction finished
  9300.       -- ANS GKS, section 5.6, page 111
  9301.       -- Effect : Close the currently open segment.  Primitives may 
  9302.       --          no longer be added to the closed segment.
  9303.       -- ============================================================
  9304.          DUMMY_SEGMENT_ID : constant SEGMENT_NAME := 1 ;
  9305.          FINISH_SEGMENT   : constant TERM_ACC.
  9306.                             SEGMENT_OPERATIONS_TYPE := FINISH ;
  9307.       begin
  9308.          -- debug aid only
  9309.          if TRACE_PKG.REQUEST_TRACE then
  9310.            TRACE_PKG.TRACE( "GKS_PRIME.CLOSE_SEGMENT" ) ;
  9311.          end if ;
  9312.  
  9313.          TERM_ACC.SEGMENT_OPERATION( FINISH_SEGMENT , DUMMY_SEGMENT_ID ) ;
  9314.       end CLOSE_SEGMENT ;
  9315.  
  9316.  
  9317.       procedure CREATE_SEGMENT ( SEGMENT : in SEGMENT_NAME ) is
  9318.       -- ============================================================
  9319.       -- Create a segment and start constructing it
  9320.       -- ANS GKS, section 5.6, page 111
  9321.       -- Effect : Create a segment.  Subsequent calls to output primitive
  9322.       --          functions will place the primitives into the currently
  9323.       --          open segment.
  9324.       -- ============================================================
  9325.          START_SEGMENT : constant TERM_ACC.
  9326.                                   SEGMENT_OPERATIONS_TYPE := START ;
  9327.       begin
  9328.          -- debug aid only
  9329.          if TRACE_PKG.REQUEST_TRACE then
  9330.            TRACE_PKG.TRACE( "GKS_PRIME.CREATE_SEGMENT" ) ;
  9331.          end if ;
  9332.  
  9333.          TERM_ACC.SEGMENT_OPERATION( START_SEGMENT , SEGMENT ) ;
  9334.       end CREATE_SEGMENT ;
  9335.  
  9336.  
  9337.       procedure DELETE_SEGMENT ( SEGMENT : in SEGMENT_NAME ) is
  9338.       -- ============================================================
  9339.       -- Delete a segment
  9340.       -- ANS GKS, section 5.6, page 112
  9341.       -- Effect : Delete all copies of the specified segment stored in
  9342.       --          GKS.  The segment name may be reused.
  9343.       -- ============================================================
  9344.          DESTROY_SEGMENT : constant TERM_ACC.
  9345.                                     SEGMENT_OPERATIONS_TYPE := DESTROY ;
  9346.       begin
  9347.          -- debug aid only
  9348.          if TRACE_PKG.REQUEST_TRACE then
  9349.            TRACE_PKG.TRACE( "GKS_PRIME.DELETE_SEGMENT" ) ;
  9350.          end if ;
  9351.  
  9352.          TERM_ACC.SEGMENT_OPERATION ( DESTROY_SEGMENT , SEGMENT ) ;
  9353.       end DELETE_SEGMENT ;
  9354.  
  9355.  
  9356.       procedure REDRAW_ALL_SEGMENTS_ON_WORKSTATION ( WS : in WS_ID ) is
  9357.       -- ============================================================
  9358.       -- Redraw all visible segments stored on a workstation
  9359.       -- ANS GKS, section 5.2, page 77
  9360.       -- Effect : For the specified workstation, all deferred actions are
  9361.       --          executed, the display surface is cleared if not empty,
  9362.       --          and all visible segments are displayed.
  9363.       -- ============================================================
  9364.       begin
  9365.          -- debug aid only
  9366.          if TRACE_PKG.REQUEST_TRACE then
  9367.            TRACE_PKG.TRACE( "GKS_PRIME.REDRAW_ALL_SEGMENTS_ON_WKST" ) ;
  9368.          end if ;
  9369.  
  9370.          TERM_ACC.REDRAW_ALL_SEGMENTS ;
  9371.       end REDRAW_ALL_SEGMENTS_ON_WORKSTATION ;
  9372.  
  9373.  
  9374.       procedure RENAME_SEGMENT
  9375.                 ( OLD_NAME : in SEGMENT_NAME ;
  9376.                   NEW_NAME : in SEGMENT_NAME ) is
  9377.       -- ============================================================
  9378.       -- Change name of a segment
  9379.       -- ANS GKS, section 5.6, page 111
  9380.       -- Effect : Rename the specified segment.  The old segment name
  9381.       --          may be reused.
  9382.       -- ============================================================
  9383.       begin
  9384.          -- debug aid only
  9385.          if TRACE_PKG.REQUEST_TRACE then
  9386.            TRACE_PKG.TRACE( "GKS_PRIME.RENAME_SEGMENT" ) ;
  9387.          end if ;
  9388.  
  9389.          TERM_ACC.RENAME_SEGMENT ( OLD_NAME , NEW_NAME ) ;
  9390.       end RENAME_SEGMENT ;
  9391.  
  9392.  
  9393.       procedure SET_HIGHLIGHTING
  9394.                 ( SEGMENT       : in SEGMENT_NAME ;
  9395.                   HIGHLIGHTING  : in SEGMENT_HIGHLIGHTING ) is
  9396.       -- ============================================================
  9397.       -- Mark segment normal or highlighted
  9398.       -- ANS GKS, section 5.6, page 116
  9399.       -- Effect : Set the highlighting attribute to the value
  9400.       --          HIGHLIGHTED or NORMAL.
  9401.       -- ============================================================
  9402.       begin
  9403.          -- debug aid only
  9404.          if TRACE_PKG.REQUEST_TRACE then
  9405.            TRACE_PKG.TRACE( "GKS_PRIME.SET_HIGHLIGHTING" ) ;
  9406.          end if ;
  9407.  
  9408.          TERM_ACC.SET_HIGHLIGHTING ( SEGMENT, HIGHLIGHTING ) ;
  9409.       end SET_HIGHLIGHTING ;
  9410.  
  9411.  
  9412.       procedure SET_SEGMENT_PRIORITY
  9413.                 ( SEGMENT  : in SEGMENT_NAME ;
  9414.                   PRIORITY : in SEGMENT_PRIORITY ) is
  9415.       -- ============================================================
  9416.       -- Set priority of a segment
  9417.       -- ANS GKS, section 5.6, page 117
  9418.       -- Effect : Set the priority of the specified segment to the specified
  9419.       --          priority.  Priority is a value in the range 0 to 1.
  9420.       -- ============================================================
  9421.       begin
  9422.          -- debug aid only
  9423.          if TRACE_PKG.REQUEST_TRACE then
  9424.            TRACE_PKG.TRACE( "GKS_PRIME.SET_SEGMENT_PRIORITY" ) ;
  9425.          end if ;
  9426.  
  9427.          TERM_ACC.SET_SEGMENT_PRIORITY ( SEGMENT , PRIORITY ) ;
  9428.       end SET_SEGMENT_PRIORITY ;
  9429.  
  9430.  
  9431.       procedure SET_VISIBILITY
  9432.                 ( SEGMENT    : in SEGMENT_NAME ;
  9433.                   VISIBILITY : in SEGMENT_VISIBILITY ) is
  9434.       -- ============================================================
  9435.       -- Mark segment visible or invisible
  9436.       -- ANS GKS, section 5.6, page 116
  9437.       -- Effect : Set the visibility attributes of the specified segment
  9438.       --          to VISIBLE or INVISIBLE.
  9439.       -- ============================================================
  9440.       begin
  9441.          -- debug aid only
  9442.          if TRACE_PKG.REQUEST_TRACE then
  9443.            TRACE_PKG.TRACE( "GKS_PRIME.SET_VISIBILITY" ) ;
  9444.          end if ;
  9445.  
  9446.          TERM_ACC.SET_VISIBILITY ( SEGMENT, VISIBILITY ) ;
  9447.       end SET_VISIBILITY ;
  9448.  
  9449.    end LEVEL_1A ;
  9450.  
  9451.    package body LEVEL_1B is
  9452.    -- ===============================================================
  9453.    --  This package body implements the GKS Level 1B operations.
  9454.    -- ===============================================================
  9455.  
  9456.       procedure REQUEST_PICK
  9457.                 ( WS      : in WS_ID ;
  9458.                   DEVICE  : in DEVICE_NUMBER ;
  9459.                   STATUS  : out PICK_REQUEST_STATUS ;
  9460.                   SEGMENT : out SEGMENT_NAME ;
  9461.                   PICK    : out PICK_ID ) is
  9462.       -- ============================================================
  9463.       -- Request segment name, pick identifier and pick status from a
  9464.       -- pick device
  9465.       -- ANS GKS5.7, section 5.7, page 134
  9466.       -- Effect : Perform a request on the specified pick device.
  9467.       -- ============================================================
  9468.          PICK_RECORD : PICK_DATA_RECORD ;
  9469.       begin
  9470.          -- debug aid only
  9471.          if TRACE_PKG.REQUEST_TRACE then
  9472.            TRACE_PKG.TRACE( "GKS_PRIME.REQUEST_PICK" ) ;
  9473.          end if ;
  9474.  
  9475.          PICK_RECORD := TERM_ACC.REQUEST_PICK ( DEVICE ) ;
  9476.          STATUS  := PICK_RECORD.PICK_STATUS ;
  9477.          SEGMENT := PICK_RECORD.PICK_SEGMENT ;
  9478.          PICK    := PICK_RECORD.OBJECT_ID ;
  9479.  
  9480.       end REQUEST_PICK ;
  9481.  
  9482.  
  9483.       procedure SET_DETECTABILITY
  9484.                 ( SEGMENT       : in SEGMENT_NAME;
  9485.                   DETECTABILITY : in SEGMENT_DETECTABILITY ) is
  9486.       -- ============================================================
  9487.       -- Mark segment undetectable or detectable
  9488.       -- ANS GKS, section 5.6, page 117
  9489.       -- Effect : Set the detectability attributes of the specified segment
  9490.       --          to DETECTABLE or UNDETECTABLE.
  9491.       -- ============================================================
  9492.       begin
  9493.          -- debug aid only
  9494.          if TRACE_PKG.REQUEST_TRACE then
  9495.            TRACE_PKG.TRACE( "GKS_PRIME.SET_DETECTABILITY" ) ;
  9496.          end if ;
  9497.  
  9498.          TERM_ACC.SET_DETECTABILITY ( SEGMENT, DETECTABILITY ) ;
  9499.       end SET_DETECTABILITY ;
  9500.  
  9501.    end LEVEL_1B ;
  9502.  
  9503. begin
  9504.    null;
  9505.    exception
  9506.       when others =>
  9507.          raise ;
  9508. end GKS_PRIME ;
  9509. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9510. --graphic_driver_spec.ada
  9511. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9512. -- version 86-02-10 09:04 by RAM
  9513.  
  9514. with GRAPHICS_DATA     ; use GRAPHICS_DATA ;
  9515. with GKS_SPECIFICATION ; use GKS_SPECIFICATION ;
  9516.  
  9517. package GRAPHIC_DRIVER is
  9518. -- ================================================================
  9519. -- 
  9520. --  This package provides all the necessary screen and graphic
  9521. --  manipulation functions needed to perform editing of Graphic
  9522. --  Ada Notation.
  9523. --
  9524. --  Requirements:
  9525. --   1) draw graphical entities
  9526. --   2) erase graphical entities
  9527. --   3) move graphical entities
  9528. --   4) save and restore graphical entities
  9529. --   5) initialize the graphics device
  9530. --   6) restore the graphics device to VT-100 compatibility mode
  9531. --   7) provide a device and compiler independent interface
  9532. --
  9533. --  This package is designed to perform the low level graphics
  9534. --  functions associated with the Graphic Ada Designer, which
  9535. --  will use on a VT-100 compatible bit-mapped graphics device.
  9536. --  This package will be independent of the bit-mapped oriented
  9537. --  characteristics of the actual terminal.  This is accomplished
  9538. --  by using the VIRTUAL_DISPLAY_INTERFACE (similar to that used by 
  9539. --  the GKS graphics system).  Specific features of the VT-100 terminal
  9540. --  will be supported by this package.
  9541. --
  9542. --  The package needs to group symbols into hierarchies so that
  9543. --  related symbols can be moved together (e.g., the name (label)
  9544. --  of a package (box)).  If the display list capability is
  9545. --  utilized, it will be utilized to meet this requirement.
  9546. --
  9547. -- ==================================================================
  9548.  
  9549.    package GRAPHICS renames GRAPHICS_DATA ;
  9550.  
  9551.    procedure CLEAR_MENU 
  9552.              ( MENU       : in GRAPHICS.SEGMENT_LIST_TYPE ) ;
  9553.    -- ======================================================
  9554.    --  Clear the selected menu in the menu window.
  9555.    -- ======================================================
  9556.  
  9557.    procedure CLOSE_SEGMENT ;
  9558.    -- ===============================================================
  9559.    --  Close the currently active drawing segment.
  9560.    -- ==============================================================
  9561.  
  9562.    procedure DELETE_SEGMENT 
  9563.              ( SEGMENT : in GKS_SPECIFICATION.SEGMENT_NAME ) ;
  9564.    -- ===============================================================
  9565.    --  Delete a segment from the graphic output.
  9566.    -- ==============================================================
  9567.  
  9568.    procedure DISPLAY_MENU 
  9569.              ( MENU       : in GRAPHICS.SEGMENT_LIST_TYPE ) ;
  9570.    -- ======================================================
  9571.    --  Display the selected menu in the menu window.
  9572.    -- ======================================================
  9573.  
  9574.    procedure DRAW_ABORT_ICON ;
  9575.    -- ========================================================
  9576.    --  Procedure draws the abort icon in the upper left corner
  9577.    --  of the graphics window.
  9578.    -- ========================================================
  9579.  
  9580.    function DRAW_BOX
  9581.              ( COLOR       : in GRAPHICS.COLOR_TYPE ;
  9582.                FILL        : in GKS_SPECIFICATION.INTERIOR_STYLE ;
  9583.                LINE        : in GRAPHICS.LINE_TYPE ;
  9584.                UPPER_LEFT  : in GRAPHICS.POINT ;
  9585.                LOWER_RIGHT : in GRAPHICS.POINT )
  9586.    return GKS_SPECIFICATION.SEGMENT_NAME ;
  9587.    -- ========================================================
  9588.    --  Procedure draws a box of defined parameters, used for
  9589.    --  creating menus and icons only.
  9590.    -- ========================================================
  9591.  
  9592.    function DRAW_FIGURE 
  9593.             ( DRAWING_ENTITY : GRAPHICS.FIGURE_ENTITY ;
  9594.               BEGIN_POINT    : GRAPHICS.POINT ;
  9595.               END_POINT      : GRAPHICS.POINT )
  9596.    return GKS_SPECIFICATION.SEGMENT_NAME ;
  9597.    -- ======================================================
  9598.    --  Draw the specified graphic entity at the specified 
  9599.    --  position using the currently defined attributes for
  9600.    --  the graphic entity, and return its SEGMENT_ID.
  9601.    -- ======================================================
  9602.  
  9603.    function DRAW_LINE 
  9604.             ( DRAWING_ENTITY : GRAPHICS.LINE_ENTITY ;
  9605.               STARTING_POINT : GRAPHICS.POINT ;
  9606.               ENDING_POINT   : GRAPHICS.POINT  )
  9607.    return GKS_SPECIFICATION.SEGMENT_NAME ;
  9608.    -- ======================================================
  9609.    --  Draw a line at the specified position using the 
  9610.    --  currently defined attributes for the specified
  9611.    --  graphic entity, and return its SEGMENT_ID.
  9612.    -- ======================================================
  9613.  
  9614.    function GET_GRAPHICS_CURSOR_POSITION 
  9615.    return GRAPHICS.POINT ;
  9616.    -- =====================================================
  9617.    --  Return the position of the graphics cursor in world
  9618.    --  coordinates.
  9619.    -- =====================================================
  9620.  
  9621.    procedure GRAPHICS_SCREEN
  9622.              ( MODE : in MODE_TYPE ) ;
  9623.    -- =====================================================
  9624.    --  Activates or Deactivates the visibility of the 
  9625.    --  graphics screen.
  9626.    -- =====================================================
  9627.  
  9628.    procedure HILITE_SEGMENT 
  9629.              ( SEGMENT_ID : in GKS_SPECIFICATION.SEGMENT_NAME;
  9630.                MODE       : in GKS_SPECIFICATION.SEGMENT_HIGHLIGHTING ) ;
  9631.    -- ======================================================
  9632.    --  Turn the selected segment highlight on or off.
  9633.    -- ======================================================
  9634.  
  9635.    procedure INITIALIZE_GRAPHICS_MODE ;
  9636.    -- ========================================================
  9637.    --  Initialize device for graphics capability.
  9638.    -- ========================================================
  9639.  
  9640.    procedure INIT_SCREEN 
  9641.              ( NEW_COLOR : in  GRAPHICS.COLOR_TYPE ;
  9642.                MENU_AREA : out GRAPHICS.RECTANGLE ) ;
  9643.    -- ========================================================
  9644.    --  Set the screen parameters as needed.  This will include
  9645.    --  establishing a scroll region on the bottom two lines.
  9646.    -- ========================================================
  9647.  
  9648.    procedure LABEL 
  9649.              ( SEGMENT_ID_NUM   : out GKS_SPECIFICATION.SEGMENT_NAME ;
  9650.                SIZE             : out GRAPHICS.POINT ;
  9651.                LOCATION         : in  GRAPHICS.POINT ;
  9652.                NAME             : in  String ;
  9653.                CHARACTER_COLOR  : in  GRAPHICS.COLOR_TYPE ;
  9654.                BACKGROUND_COLOR : in  GRAPHICS.COLOR_TYPE := WHITE ) ;
  9655.    -- ======================================================
  9656.    --  Place the specified label on the graph and associate it with
  9657.    --  the specified object, returning the label SEGMENT_ID.
  9658.    -- ======================================================
  9659.  
  9660.    function LOCATION_IN_GRAPHIC_VIEWPORT
  9661.             ( COORDINATE : in GRAPHICS.POINT )
  9662.    return Boolean ;
  9663.    -- ======================================================
  9664.    -- Determins if the specified point is located in the
  9665.    -- current graphics viewport area.
  9666.    -- ======================================================
  9667.  
  9668.    procedure MOVE 
  9669.              ( SEGMENT_ID   : in GKS_SPECIFICATION.SEGMENT_NAME ;
  9670.                NEW_LOCATION : in GRAPHICS.POINT ) ;
  9671.    -- ======================================================
  9672.    --  Move the specified segment to its new location.
  9673.    -- ======================================================
  9674.  
  9675.    function OPEN_SEGMENT 
  9676.    return GKS_SPECIFICATION.SEGMENT_NAME ;
  9677.    -- ===============================================================
  9678.    --  Create and open a segment for graphic output.
  9679.    -- ==============================================================
  9680.  
  9681.    procedure PAN
  9682.              ( DIRECTION : in GRAPHICS.PAN_DIRECTION ) ;
  9683.    -- ======================================================
  9684.    --  Pan away from the current display.
  9685.    -- ======================================================
  9686.  
  9687.    procedure PAN_AND_ZOOM_DISPLAY
  9688.              ( MODE : in MODE_TYPE ) ;
  9689.    -- ======================================================
  9690.    --  Display the Pan and Zoom relation view.
  9691.    -- ======================================================
  9692.  
  9693.    function PARALLELOGRAM_POINTS (
  9694.                UPPER_LEFT_PT  : in GRAPHICS.POINT ;
  9695.                LOWER_RIGHT_PT : in GRAPHICS.POINT ;
  9696.                Y_VALUE        : in GRAPHICS.WC ) 
  9697.    return GRAPHICS.WC ;
  9698.    -- ===================================================================
  9699.    --  From the upper left and lower right points, and the stated Y
  9700.    --  location, determine the X location of a task entry point.
  9701.    -- ===================================================================
  9702.  
  9703.    function PICK_SEGMENT
  9704.    return GKS_SPECIFICATION.SEGMENT_NAME ;
  9705.    -- ======================================================
  9706.    --  Ask the operator to pick a graphical object and return
  9707.    --  its SEGMENT_ID.
  9708.    -- ======================================================
  9709.  
  9710.    procedure PLACE_CURSOR
  9711.              ( POSITION : in GRAPHICS.POINT ) ;
  9712.    -- ===========================================================
  9713.    -- This procedure places the graphics cursor at the specified
  9714.    -- location on the screen ;
  9715.    -- ===========================================================
  9716.  
  9717.    procedure PRINT_SCREEN ;
  9718.    -- ===========================================================
  9719.    --  This procedure prints the visible contents of the graphics
  9720.    --  viewport to the local terminal printer.
  9721.    -- ===========================================================
  9722.  
  9723.    procedure REFRESH_SCREEN ;
  9724.    -- ==========================================================
  9725.    --  This procedure rewrites the entire screen with
  9726.    --  the contents of the current  window on the graphics
  9727.    --  page.  This will be done using the display list
  9728.    --  capability.  If the window has not yet been defined it 
  9729.    --  will default to a window on (0,0) with scaling of 1.
  9730.    -- ===========================================================
  9731.  
  9732.    procedure SELECT_WINDOW 
  9733.              ( WINDOW : in GRAPHICS.WINDOW_TYPE ) ;
  9734.    -- =============================================================
  9735.    --  Set the currently active window.
  9736.    -- =============================================================
  9737.  
  9738.    procedure SET_ABORT_CAPABILITY(
  9739.              ABORT_REQUEST : GRAPHICS.MODE_TYPE ) ;
  9740.    -- ===================================================================
  9741.    --  Set the abort capability on or off.  If the abort capability is on
  9742.    --  all locator points returned from the terminal will be tested for
  9743.    --  an abort request.
  9744.    -- ===================================================================
  9745.  
  9746.    procedure SET_CHARACTER_SIZE_ATTRIBUTES
  9747.              ( HEIGHT  : in GRAPHICS.WC ;
  9748.                WIDTH   : in GRAPHICS.WC ;
  9749.                SPACING : in GRAPHICS.WC ;
  9750.                FONT    : in GKS_SPECIFICATION.TEXT_PRECISION
  9751.                          := GKS_SPECIFICATION.STROKE_PRECISION ) ;
  9752.    -- ===================================================================
  9753.    --  Set the character height, the character width, and the spacing
  9754.    --  between characters for subsequent graphic text output.
  9755.    -- ===================================================================
  9756.  
  9757.    procedure SET_DRAWING_PRIORITY 
  9758.              ( PRIORITY : in PRIORITY_TYPE ) ;
  9759.    -- ======================================================
  9760.    --  Set the visibile priority new segments.
  9761.    -- ======================================================
  9762.  
  9763.    procedure SET_SEGMENT_VISIBILITY 
  9764.              ( SEGMENT : in GKS_SPECIFICATION.SEGMENT_NAME ;
  9765.                MODE    : in GKS_SPECIFICATION.SEGMENT_VISIBILITY ) ;
  9766.    -- ======================================================
  9767.    --  Change the segment visibility.
  9768.    -- ======================================================
  9769.  
  9770.    procedure TERMINATE_GRAPHICS_MODE ;
  9771.    -- ========================================================
  9772.    --  Restore the device to VT100 mode.
  9773.    -- ========================================================
  9774.  
  9775.    procedure UPDATE_COLOR_ATTRIBUTE
  9776.              ( DRAWING_ENTITY : in  GRAPHICS.GRAPHIC_ENTITY ;
  9777.                NEW_COLOR      : in  GRAPHICS.COLOR_TYPE ) ;
  9778.    -- ======================================================
  9779.    --  Update the value of the currently defined color
  9780.    --  attribute for the specified graphic entity.
  9781.    -- ======================================================
  9782.  
  9783.    procedure UPDATE_LINE_ATTRIBUTE
  9784.              ( DRAWING_ENTITY : in  GRAPHICS.GRAPHIC_ENTITY ;
  9785.                NEW_LINE       : in  GRAPHICS.LINE_TYPE ) ;
  9786.    -- ======================================================
  9787.    --  Update the value of the currently defined line
  9788.    --  attribute for the specified graphic entity.
  9789.    -- ======================================================
  9790.  
  9791.    procedure UPDATE_SHAPE_ATTRIBUTE
  9792.              ( DRAWING_ENTITY : in  GRAPHICS.FIGURE_ENTITY ;
  9793.                NEW_SHAPE      : in  GRAPHICS.SHAPE_TYPE ) ;
  9794.    -- ======================================================
  9795.    --  Update the value of the currently defined shape
  9796.    --  attribute for the specified graphic entity.
  9797.    -- ======================================================
  9798.  
  9799.    procedure ZOOM
  9800.              ( DIRECTION : in GRAPHICS.ZOOM_DIRECTION ) ;
  9801.    -- ======================================================
  9802.    --  Zoom in or out from the current display.
  9803.    -- ======================================================
  9804.  
  9805.    ---------------------------------------------------------
  9806.    -- The following exceptions can be raised in this package:
  9807.    --
  9808.    --  INVALID_SEGMENT_ID 
  9809.    --     Raised if an illegal SEGMENT_ID is specified.
  9810.    -- INVALID_GRAPHICS_OPERATION 
  9811.    --     Raised if an invalid, illegal, or unimplementable graphics
  9812.    --     operation is requested.
  9813.    -- INVALID_LOCATION
  9814.    --     Raised if an invalid location is specified for the graphing
  9815.    --     of an object.  For example if a label is not placed on its
  9816.    --     associated object this exception will be raised.
  9817.    -- FIGURE_TOO_NARROW
  9818.    --     Raised if a figure requested to be drawn is too narrow in
  9819.    --     the x direction the minimum width is 
  9820.    --     2 * graphics_data.CHARACTER_WIDTH .
  9821.    -----------------------------------------------------------------
  9822.    INVALID_SEGMENT_ID         : exception ;
  9823.    INVALID_GRAPHICS_OPERATION : exception ;
  9824.    INVALID_LOCATION           : exception ;
  9825.    FIGURE_TOO_NARROW          : exception ;
  9826.  
  9827. end GRAPHIC_DRIVER ;
  9828. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9829. --graphic_driver_body.ada
  9830. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  9831. -- version 86-02-10 08:05 by RAM
  9832.  
  9833. with GKS_SPECIFICATION          ; use GKS_SPECIFICATION ;
  9834. with GKS_PRIME                  ; use GKS_PRIME ;
  9835. with GKS_NON_STANDARD           ; use GKS_NON_STANDARD ;
  9836. with VIRTUAL_TERMINAL_INTERFACE ; use VIRTUAL_TERMINAL_INTERFACE ; 
  9837. with TRACE_PKG                  ; use TRACE_PKG ;
  9838. with TEXT_IO                    ; use TEXT_IO ;
  9839.  
  9840. package body GRAPHIC_DRIVER is
  9841. -- ================================================================
  9842. -- 
  9843. --  This package provides all the necessary screen and graphic
  9844. --  manipulation functions needed to perform editing of Graphic
  9845. --  Ada Notation.
  9846. --
  9847. --  Requirements:
  9848. --   1) draw graphical entities
  9849. --   2) erase graphical entities
  9850. --   3) move graphical entities
  9851. --   4) save and restore graphical entities
  9852. --   5) initialize the graphics device
  9853. --   6) restore the graphics device to VT-100 compatibility mode
  9854. --   7) provide a device and compiler independent interface
  9855. --
  9856. --  This package is designed to perform the low level graphics
  9857. --  functions associated with the Graphic Ada Designer, which
  9858. --  will use a VT-100 compatible bit-mapped graphics device.
  9859. --  This package will be independent of the bit-mapped oriented
  9860. --  characteristics of the actual terminal.  This is accomplished
  9861. --  by using the VIRTUAL_DISPLAY_INTERFACE (similar to that used by 
  9862. --  the GKS graphics system).  Specific features of the VT-100 terminal
  9863. --  will be supported by this package.
  9864. --
  9865. --  The package needs to group symbols into hierarchies so that
  9866. --  related symbols can be moved together (e.g., the name (label)
  9867. --  of a package (box)).  If the display list capability is
  9868. --  utilized, it will be utilized to meet this requirement.
  9869. --
  9870. -- ==================================================================
  9871.  
  9872.    --------------------------------------
  9873.    -- GKS package level short hand names
  9874.    --------------------------------------
  9875.    package L_0A renames GKS_PRIME.LEVEL_0A ;
  9876.    package L_1A renames GKS_PRIME.LEVEL_1A ;
  9877.    package L_0B renames GKS_PRIME.LEVEL_0B ;
  9878.    package L_1B renames GKS_PRIME.LEVEL_1B ;
  9879.    package NON_STD renames GKS_NON_STANDARD.FROM_LEVEL_0A ;
  9880.  
  9881.    -------------------------------------------------------------------
  9882.    -- Initialize the arrays containing the color representations
  9883.    -- and index number for each of the supported colors.
  9884.    -------------------------------------------------------------------
  9885.    COLOR_REPRESENTATION : constant array( GRAPHICS.COLOR_TYPE ) of
  9886.                           GKS_SPECIFICATION.COLOUR_REPRESENTATION :=
  9887.       ( ORANGE      => ( RED   => 1.00,
  9888.                          GREEN => 0.60,
  9889.                          BLUE  => 0.00 ),
  9890.  
  9891.         GREEN       => ( RED   =>  0.00,
  9892.                          GREEN =>  0.74,
  9893.                          BLUE  =>  0.00 ),
  9894.  
  9895.         YELLOW      => ( RED   => 1.00,
  9896.                          GREEN => 1.00,
  9897.                          BLUE  => 0.00 ),
  9898.  
  9899.         VIOLET      => ( RED   =>  0.74,
  9900.                          GREEN =>  0.60,
  9901.                          BLUE  =>  0.87 ),
  9902.  
  9903.         RED         => ( RED   => 1.00,
  9904.                          GREEN => 0.00,
  9905.                          BLUE  => 0.00 ),
  9906.  
  9907.         BLUE        => ( RED   => 0.00,
  9908.                          GREEN => 0.00,
  9909.                          BLUE  => 1.00 ),
  9910.  
  9911.         BLACK       => ( RED   => 0.00,
  9912.                          GREEN => 0.00,
  9913.                          BLUE  => 0.00 ),
  9914.  
  9915.         WHITE       => ( RED   => 0.87,
  9916.                          GREEN => 0.87,
  9917.                          BLUE  => 0.87 ),
  9918.  
  9919.         BROWN       => ( RED   => 0.67,
  9920.                          GREEN => 0.34,
  9921.                          BLUE  => 0.00 ),
  9922.  
  9923.         DARK_RED    => ( RED   => 0.80,
  9924.                          GREEN => 0.00,
  9925.                          BLUE  => 0.00 ),
  9926.  
  9927.         CYAN        => ( RED   => 0.00,
  9928.                          GREEN => 1.00,
  9929.                          BLUE  => 1.00 ),
  9930.  
  9931.         PINK        => ( RED   => 1.00,
  9932.                          GREEN => 0.27,
  9933.                          BLUE  => 0.74 ),
  9934.  
  9935.         MAGENTA     => ( RED   => 1.00,
  9936.                          GREEN => 0.00,
  9937.                          BLUE  => 1.00 ),
  9938.  
  9939.         PEACH       => ( RED   => 0.94,
  9940.                          GREEN => 0.40,
  9941.                          BLUE  => 0.60 ),
  9942.  
  9943.         GRAY        => ( RED   => 0.67,
  9944.                          GREEN => 0.67,
  9945.                          BLUE  => 0.67 ),
  9946.  
  9947.         DARK_PURPLE => ( RED   => 0.47,
  9948.                          GREEN => 0.07,
  9949.                          BLUE  => 0.47 ));
  9950.  
  9951.    COLOR_TO_INDEX : constant array( GRAPHICS.COLOR_TYPE ) of
  9952.                     GKS_SPECIFICATION.COLOUR_INDEX :=
  9953.       ( RED         =>  1 ,
  9954.         GREEN       =>  2 ,
  9955.         BLUE        =>  3 ,
  9956.         ORANGE      =>  4 ,
  9957.         YELLOW      =>  5 ,
  9958.         VIOLET      =>  6 ,
  9959.         BLACK       =>  7 ,
  9960.         WHITE       =>  0 ,
  9961.         BROWN       =>  9 ,
  9962.         DARK_RED    => 10 ,
  9963.         CYAN        => 11 ,
  9964.         PINK        => 12 ,
  9965.         MAGENTA     => 13 ,
  9966.         PEACH       => 14 ,
  9967.         GRAY        => 15 ,
  9968.         DARK_PURPLE =>  8 ) ;
  9969.  
  9970.    --------------------------------------------------------------
  9971.    --  The current screen background color.
  9972.    --------------------------------------------------------------
  9973.    CURRENT_BACKGROUND_COLOR : GRAPHICS.COLOR_TYPE ;
  9974.  
  9975.    --------------------------------------------------------------
  9976.    --  The current text background color.
  9977.    --------------------------------------------------------------
  9978.    CURRENT_TEXT_BACKGROUND_COLOR : GRAPHICS.COLOR_TYPE := GRAPHICS.CYAN ;
  9979.  
  9980.    --------------------------------------------------------------
  9981.    --  The drawing segment priority.
  9982.    --------------------------------------------------------------
  9983.    CURRENT_PRIORITY : PRIORITY_TYPE := 1.0 ;
  9984.  
  9985.    --------------------------------------------------------------
  9986.    --  The scale factor currently in effect.  
  9987.    --------------------------------------------------------------
  9988.    SCALE_FACTOR : constant SCALE_FACTOR_TYPE := 8 ;
  9989.  
  9990.    ---------------------------------------------------------------
  9991.    -- Define the upper and lower bounds of the zoom and 
  9992.    -- pan operations.
  9993.    ---------------------------------------------------------------
  9994.    RANGE_LOWER  : constant INTEGER := 0;
  9995.    RANGE_UPPER  : constant INTEGER := 2 * SCALE_FACTOR;
  9996.  
  9997.    ---------------------------------------------------------------
  9998.    -- Define the initial window size and the current window size
  9999.    -- of the current graphics display screen.
  10000.    ---------------------------------------------------------------
  10001.    INITIAL_WINDOW_SIZE : constant Integer := 8 ; -- range available (1..16)
  10002.    WINDOW_SIZE         : Integer := INITIAL_WINDOW_SIZE;
  10003.  
  10004.    ---------------------------------------------------------------
  10005.    -- Define the translation factor from the window scale factor
  10006.    -- to the world coordinates.
  10007.    ---------------------------------------------------------------
  10008.    WINDOW_SCALE : constant GKS_SPECIFICATION.WC_TYPE :=
  10009.           GKS_SPECIFICATION.WC_TYPE( GRAPHICS.WC'LAST /
  10010.           ( GRAPHICS.WC( 2 * SCALE_FACTOR ) ) ) ;
  10011.  
  10012.    ---------------------------------------------------------------
  10013.    -- Define the window to index id array.
  10014.    ---------------------------------------------------------------
  10015.    WINDOW_TO_INDEX : constant array ( GRAPHICS.WINDOW_TYPE ) of
  10016.                      Natural :=
  10017.       ( GRAPH_VIEW_PORT => 1 ,
  10018.         MENU_VIEW_PORT  => 2 ,
  10019.         TEXT_VIEW_PORT  => 0 ) ;
  10020.  
  10021.    ---------------------------------------------------------------
  10022.    -- Define a subtype of the allowable terminal types and the
  10023.    -- variable containing the active terminal type.
  10024.    ---------------------------------------------------------------
  10025.    subtype TERMINAL_TYPE is GKS_SPECIFICATION.WS_ID ;
  10026.    ACTIVE_TERMINAL : TERMINAL_TYPE := 1 ;
  10027.  
  10028.    ---------------------------------------------------------------
  10029.    -- Define variables required for subprogram call on GKS locator
  10030.    -- and pick functions.  These variables are not required by
  10031.    -- the GRAPHIC_DRIVER program.
  10032.    ---------------------------------------------------------------
  10033.    WORK_STATION   : GKS_SPECIFICATION.WS_ID                 := 1 ;
  10034.    DEVICE         : GKS_SPECIFICATION.DEVICE_NUMBER         := 1 ;
  10035.    TRANSFORM      : GKS_SPECIFICATION.TRANSFORMATION_NUMBER := 1 ;
  10036.    CONNECTION     : GKS_SPECIFICATION.CONNECTION_ID         := "UNIT_1" ;
  10037.    STATION_TYPE   : GKS_SPECIFICATION.WS_TYPE               := 1 ;
  10038.    STATUS         : GKS_SPECIFICATION.INPUT_STATUS ;
  10039.    ECHO_AREA      : GKS_SPECIFICATION.DC.RECTANGLE_LIMITS ;
  10040.    LOCATOR_RECORD : GKS_SPECIFICATION.LOCATOR_DATA_RECORD ;
  10041.    PICK_RECORD    : GKS_SPECIFICATION.PICK_DATA_RECORD ;
  10042.  
  10043.    ---------------------------------------------------------------
  10044.    -- Define the terminal space screen and window rectangles for
  10045.    -- the graphics and menu displays.
  10046.    -- GRAPHICS_SCREEN_RECTANGLE {constant} - rectangle in terminal
  10047.    --    screen space for the created graphics.
  10048.    -- MENU_SCREEN_RECTANGLE {constant} - rectangle in terminal screen
  10049.    --    space for the menu items.
  10050.    -- GRAPHIC_WINDOW_RECTANGLE {variable} - rectangle in terminal
  10051.    --    memory space for the created graphics window.
  10052.    --    Data for rectangle will be modified by PAN and ZOOM operations.
  10053.    -- MENU_WINDOW_RECTANGLE {constant} - rectangle in terminal memory
  10054.    --    space for the menu items window.
  10055.    -- WORLD_WINDOW_RECTANGLE {constant} - rectangle in terminal memory
  10056.    --    space to display the complete world view for pan and zoom.
  10057.    ---------------------------------------------------------------
  10058.    GRAPHICS_SCREEN_RECTANGLE : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS :=
  10059.       ( X => ( MIN =>  6_144.0,
  10060.                MAX => 32_767.0 ),
  10061.         Y => ( MIN =>  4_096.0,
  10062.                MAX => 32_767.0 ) ) ;
  10063.  
  10064.    MENU_SCREEN_RECTANGLE     : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS :=
  10065.       ( X => ( MIN =>      0.0,
  10066.                MAX =>  6_144.0 ),
  10067.         Y => ( MIN =>  4_096.0,
  10068.                MAX => 32_767.0 ) ) ;
  10069.  
  10070.    -- Initial max X & Y boundries are a function of the initial
  10071.    -- min X & Y boundries, scale factor, and the initial window size.
  10072.    INIT_MIN_X : constant GKS_SPECIFICATION.WC_TYPE :=  2_048.0 ; 
  10073.    INIT_MIN_Y : constant GKS_SPECIFICATION.WC_TYPE := 14_336.0 ; 
  10074.  
  10075.    GRAPHIC_WINDOW_RECTANGLE : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS :=
  10076.       ( X => ( MIN => INIT_MIN_X ,
  10077.                MAX => INIT_MIN_X +
  10078.                GKS_SPECIFICATION.WC_TYPE( INITIAL_WINDOW_SIZE ) * 
  10079.                WINDOW_SCALE ) ,
  10080.         Y => ( MIN => INIT_MIN_Y ,
  10081.                MAX => INIT_MIN_Y +
  10082.                GKS_SPECIFICATION.WC_TYPE( INITIAL_WINDOW_SIZE ) * 
  10083.                WINDOW_SCALE ) ) ;
  10084.  
  10085.    MENU_WINDOW_RECTANGLE : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS :=
  10086.       ( X => ( MIN =>      0.0,
  10087.                MAX =>  3_072.0 ),
  10088.         Y => ( MIN =>      0.0,
  10089.                MAX => 10_752.0 )) ;
  10090.  
  10091.    WORLD_WINDOW_RECTANGLE : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS :=
  10092.       ( X => ( MIN =>      0.0,
  10093.                MAX => 32_767.0 ),
  10094.         Y => ( MIN =>      0.0,
  10095.                MAX => 32_767.0 )) ;
  10096.  
  10097.    ---------------------------------------------------------------
  10098.    -- Define x and y components of the reference point
  10099.    -- ( the upper left point of the display rectangle ) which 
  10100.    -- positions the current graphics display screen.
  10101.    ---------------------------------------------------------------
  10102.    X_REF : INTEGER := INTEGER(
  10103.                       GRAPHIC_WINDOW_RECTANGLE.X.MIN / WINDOW_SCALE ) ;
  10104.    Y_REF : INTEGER := INTEGER(
  10105.                       GRAPHIC_WINDOW_RECTANGLE.Y.MAX / WINDOW_SCALE ) ;
  10106.  
  10107.    --------------------------------------------------------------
  10108.    --  Define the rectangle encompassing the WC system.
  10109.    --------------------------------------------------------------
  10110.    WC_WINDOW : constant GRAPHICS.RECTANGLE :=
  10111.       ( X => ( MIN => GRAPHICS.WC'FIRST,
  10112.                MAX => GRAPHICS.WC'LAST ),
  10113.         Y => ( MIN => GRAPHICS.WC'FIRST,
  10114.                MAX => GRAPHICS.WC'LAST )) ;
  10115.  
  10116.    --------------------------------------------------------------
  10117.    --  Define the segment number currently in effect.
  10118.    --------------------------------------------------------------
  10119.    CURRENT_SEGMENT : GKS_SPECIFICATION.SEGMENT_NAME :=
  10120.                      GRAPHICS.NULL_SEGMENT + 1 ;
  10121.  
  10122.    --------------------------------------------------------------
  10123.    --  Define the array which maintains an indication of
  10124.    --  segments currently in use.
  10125.    --------------------------------------------------------------
  10126.    MAXIMUM_SEGMENT_NUMBER : constant GKS_SPECIFICATION.SEGMENT_NAME 
  10127.                           := 6000 ;
  10128.  
  10129.    SEGMENT_IS_USED : array( GKS_SPECIFICATION.SEGMENT_NAME 
  10130.       range GRAPHICS.NULL_SEGMENT .. MAXIMUM_SEGMENT_NUMBER ) of BOOLEAN :=
  10131.       ( TRUE, others => FALSE ) ;
  10132.  
  10133.    SEGMENT_SEARCH_INDEX : GKS_SPECIFICATION.SEGMENT_NAME := 
  10134.                           GRAPHICS.NULL_SEGMENT ;
  10135.  
  10136.    --------------------------------------------------------------
  10137.    --  Boolean to determine if test for abort should be performed.
  10138.    --------------------------------------------------------------
  10139.    ABORT_CAPABILITY_ACTIVE : boolean := FALSE ;
  10140.  
  10141.    --------------------------------------------------------------
  10142.    --  Define the segment number of the abort icon
  10143.    --------------------------------------------------------------
  10144.    ABORT_SEGMENT : GKS_SPECIFICATION.SEGMENT_NAME :=
  10145.                    GRAPHICS.NULL_SEGMENT ;
  10146.  
  10147.    --------------------------------------------------------------
  10148.    -- Define the array containing the upper left and lower right
  10149.    -- points of the abort rectangle
  10150.    --------------------------------------------------------------
  10151.    ABORT_POINTS  : GKS_SPECIFICATION.WC.POINT_ARRAY(1..2);
  10152.  
  10153.    --------------------------------------------------------------
  10154.    --  Define the pan and zoom view display segment.
  10155.    --------------------------------------------------------------
  10156.    PAN_ZOOM_BOX : GKS_SPECIFICATION.SEGMENT_NAME ;
  10157.  
  10158.    --------------------------------------------------------------
  10159.    --  Define the font type currently in use
  10160.    --------------------------------------------------------------
  10161.    CURRENT_FONT : GKS_SPECIFICATION.TEXT_PRECISION :=
  10162.                   GKS_SPECIFICATION.CHAR_PRECISION ;
  10163.  
  10164.    --------------------------------------------------------------
  10165.    --  Boolean indicating if segment is open or closed.
  10166.    --------------------------------------------------------------
  10167.    SEGMENT_IS_OPEN : BOOLEAN := false ;
  10168.  
  10169.    --------------------------------------------------------------
  10170.    --  Map the Graphics line types into the GKS line types.
  10171.    --------------------------------------------------------------
  10172.    LINE_TYPE_ARRAY : constant array( GRAPHICS.LINE_TYPE ) of
  10173.         GKS_SPECIFICATION.LINE_TYPE :=
  10174.         ( GRAPHICS.SOLID  => GKS_SPECIFICATION.LINE_TYPE'(1),
  10175.           GRAPHICS.DASHED => GKS_SPECIFICATION.LINE_TYPE'(2),
  10176.           GRAPHICS.DOTTED => GKS_SPECIFICATION.LINE_TYPE'(3) );
  10177.  
  10178.  
  10179.    procedure SET_LINE_TYPE_AND_COLOR
  10180.              ( REQ_LINE_TYPE  : in GRAPHICS.LINE_TYPE;
  10181.                REQ_LINE_COLOR : in GRAPHICS.COLOR_TYPE ) is
  10182.    -- ===================================================================
  10183.    --  Set the GKS line type and line color to the specified values.
  10184.    -- ===================================================================
  10185.  
  10186.    begin
  10187.       -- debug aid only
  10188.       if TRACE_PKG.REQUEST_TRACE then
  10189.          TRACE_PKG.TRACE ("GRAPHICS_DRIVER.SET_LINE_TYPE_AND_COLOR") ;
  10190.       end if ; 
  10191.  
  10192.       --  Set current GKS line type to the specified value.
  10193.       L_0A.SET_LINE_TYPE( LINE_TYPE_ARRAY( REQ_LINE_TYPE ));
  10194.  
  10195.       --  Set current GKS line color to the specified value.
  10196.       L_0A.SET_POLYLINE_COLOUR_INDEX( COLOR_TO_INDEX ( REQ_LINE_COLOR ));
  10197.    end SET_LINE_TYPE_AND_COLOR;
  10198.  
  10199.  
  10200.    function PARALLELOGRAM_POINTS 
  10201.                ( UPPER_LEFT_PT  : in GRAPHICS.POINT ;
  10202.                  LOWER_RIGHT_PT : in GRAPHICS.POINT ;
  10203.                  Y_VALUE        : in GRAPHICS.WC ) 
  10204.    return GRAPHICS.WC is
  10205.    -- ===================================================================
  10206.    --  From the upper left and lower right points, and the stated Y
  10207.    --  location, determine the X location of a task entry point.
  10208.    -- ===================================================================
  10209.       M                 : FLOAT ;
  10210.       B                 : FLOAT ;
  10211.       DELTA_Y           : FLOAT ;
  10212.       DELTA_X           : FLOAT ;
  10213.       X_VALUE           : GRAPHICS.WC ;
  10214.       LOWER_LEFT_PT     : GRAPHICS.POINT ;
  10215.       NEW_UPPER_LEFT_PT : GRAPHICS.POINT := UPPER_LEFT_PT ;
  10216.    begin
  10217.  
  10218.       -- Determine the "slant" of the parallelogram from the
  10219.       -- containing rectangle.
  10220.       LOWER_LEFT_PT.X := NEW_UPPER_LEFT_PT.X ;
  10221.       LOWER_LEFT_PT.Y := LOWER_RIGHT_PT.Y ;
  10222.       DELTA_Y := FLOAT( NEW_UPPER_LEFT_PT.Y - LOWER_RIGHT_PT.Y ) ;
  10223.       DELTA_X := DELTA_Y / 3.0 ;
  10224.       NEW_UPPER_LEFT_PT.X := NEW_UPPER_LEFT_PT.X + GRAPHICS.WC( DELTA_X ) ;
  10225.  
  10226.       -- Determine the line equation ( Y = mX + b )
  10227.       DELTA_X := FLOAT( NEW_UPPER_LEFT_PT.X - LOWER_LEFT_PT.X ) ;
  10228.       DELTA_Y := FLOAT( NEW_UPPER_LEFT_PT.Y - LOWER_LEFT_PT.Y ) ;
  10229.  
  10230.       -- If slope is infinite then return initial x value
  10231.       if GRAPHICS.WC( DELTA_X ) = 0 then
  10232.          X_VALUE := NEW_UPPER_LEFT_PT.X ;
  10233.       else
  10234.  
  10235.          -- Determine the line equation and the x value corresponding
  10236.          -- to the stated y value.
  10237.          M := DELTA_Y / DELTA_X ;
  10238.          B := FLOAT( NEW_UPPER_LEFT_PT.Y ) -
  10239.               ( M * FLOAT( NEW_UPPER_LEFT_PT.X ) ) ;
  10240.          X_VALUE := GRAPHICS.WC( ( FLOAT( Y_VALUE ) - B ) / M ) ;
  10241.       end if ;
  10242.       return X_VALUE ;
  10243.    end PARALLELOGRAM_POINTS ;
  10244.  
  10245.  
  10246.    procedure NEW_GRAPHICS_WINDOW is
  10247.    -- ===================================================================
  10248.    --  Define the new window onto the world coordinate space which will
  10249.    --  be displayed to the operator.  This procedure is called by the
  10250.    --  PAN and ZOOM procedures.
  10251.    -- ===================================================================
  10252.    begin
  10253.  
  10254.       GRAPHIC_WINDOW_RECTANGLE.X.MIN :=
  10255.          GKS_SPECIFICATION.WC_TYPE( X_REF ) * WINDOW_SCALE ;
  10256.  
  10257.       GRAPHIC_WINDOW_RECTANGLE.X.MAX := 
  10258.          GKS_SPECIFICATION.WC_TYPE( X_REF + WINDOW_SIZE ) * WINDOW_SCALE ;
  10259.  
  10260.       GRAPHIC_WINDOW_RECTANGLE.Y.MIN :=
  10261.          GKS_SPECIFICATION.WC_TYPE( Y_REF - WINDOW_SIZE ) * WINDOW_SCALE ;
  10262.  
  10263.       GRAPHIC_WINDOW_RECTANGLE.Y.MAX :=
  10264.          GKS_SPECIFICATION.WC_TYPE( Y_REF ) * WINDOW_SCALE ;
  10265.  
  10266.       -- Set current window to graphic area.
  10267.       SELECT_WINDOW ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  10268.  
  10269.       -- delete the old pan_and_zoom box
  10270.       HILITE_SEGMENT( PAN_ZOOM_BOX, NORMAL ) ;
  10271.       DELETE_SEGMENT( PAN_ZOOM_BOX ) ;
  10272.       -- Define the pan and zoom display box with the current view
  10273.       PAN_ZOOM_BOX := DRAW_BOX( BLACK, HOLLOW, SOLID, 
  10274.                       ( GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.X.MAX ),
  10275.                         GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.Y.MIN )),
  10276.                       ( GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.X.MIN ),
  10277.                         GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.Y.MAX )) ) ;
  10278.       -- set the hilite on
  10279.       HILITE_SEGMENT( PAN_ZOOM_BOX, HIGHLIGHTED ) ;
  10280.  
  10281.       -- Set current window to menu area.
  10282.       SELECT_WINDOW ( GRAPHICS.MENU_VIEW_PORT ) ;
  10283.  
  10284.    end NEW_GRAPHICS_WINDOW ;
  10285.  
  10286.  
  10287.    procedure DISPLAY_ERROR
  10288.               ( DISPLAY_STRING : in STRING ) is
  10289.    -- =========================================================
  10290.    --  This procedure displays the received string to the
  10291.    --  operator, waits for an operator acknowledgement, and
  10292.    --  clears the displayed line.
  10293.    -- =========================================================
  10294.       BLANK_LINE : constant STRING := "  " ;
  10295.       POSITION   : GRAPHICS.POINT ;
  10296.       CONTINUE   : constant STRING :=
  10297.                    " Press the cursor input device to continue ";
  10298.    begin
  10299.  
  10300.       -- display received string and continue message
  10301.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10302.               ( DISPLAY_STRING,
  10303.                 VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'( CENTER_A_LINE ),
  10304.                 VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE( 23 )) ;
  10305.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10306.               ( CONTINUE,
  10307.                 VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'( CENTER_A_LINE ),
  10308.                 VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE( 24 )) ;
  10309.  
  10310.       -- wait for operator acknowledgement 
  10311.      POSITION := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  10312.  
  10313.      -- clear the messages
  10314.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10315.              ( BLANK_LINE ,
  10316.                VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'( CLEAR_A_LINE ),
  10317.                VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE( 23 )) ;
  10318.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10319.              ( BLANK_LINE ,
  10320.                VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'( CLEAR_A_LINE ),
  10321.                VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE( 24 )) ;
  10322.    exception
  10323.       -- if the operator tried to abort, dont allow at this time
  10324.       when OPERATION_ABORTED_BY_OPERATOR =>
  10325.          null ;
  10326.       -- propogate any other error
  10327.       when others =>
  10328.          raise ;
  10329.    end DISPLAY_ERROR ;
  10330.  
  10331.  
  10332.    procedure CLEAR_MENU 
  10333.              ( MENU : in GRAPHICS.SEGMENT_LIST_TYPE ) is
  10334.    -- ===================================================================
  10335.    --  Clear the selected menu in the menu window.
  10336.    -- ===================================================================
  10337.    begin 
  10338.       -- debug aid only
  10339.       if TRACE_PKG.REQUEST_TRACE then
  10340.          TRACE_PKG.TRACE ("GRAPHICS_DRIVER.CLEAR_MENU") ;
  10341.       end if ; 
  10342.  
  10343.       for MENU_INDEX in MENU'range
  10344.       loop
  10345.  
  10346.          if  MENU( MENU_INDEX ) /= GRAPHICS.NULL_SEGMENT then
  10347.  
  10348.             -- Set the MENU_SEGMENT invisible by calling the GKS 
  10349.             --   SET_VISIBILITY procedure.
  10350.             L_1A.SET_VISIBILITY( MENU( MENU_INDEX ),
  10351.                  GKS_SPECIFICATION.INVISIBLE );
  10352.  
  10353.             -- Set the MENU_SEGMENT undetectable by calling the GKS
  10354.             --   SET_DETECTABILITY procedure.
  10355.             L_1B.SET_DETECTABILITY( MENU( MENU_INDEX ),
  10356.                  GKS_SPECIFICATION.UNDETECTABLE );
  10357.          end if ;
  10358.       end loop;
  10359.    end CLEAR_MENU ;
  10360.  
  10361.  
  10362.    procedure CLOSE_SEGMENT is
  10363.    -- ===============================================================
  10364.    --  Close the currently active drawing segment.
  10365.    -- ==============================================================
  10366.    begin 
  10367.       -- debug aid only
  10368.       if TRACE_PKG.REQUEST_TRACE then
  10369.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.CLOSE_SEGMENT") ;
  10370.       end if ; 
  10371.  
  10372.       -- Close the segment currently open in the GKS.
  10373.       L_1A.CLOSE_SEGMENT;
  10374.       SEGMENT_IS_OPEN := false;
  10375.  
  10376.    end CLOSE_SEGMENT ;
  10377.  
  10378.  
  10379.    procedure DELETE_SEGMENT 
  10380.              ( SEGMENT : in GKS_SPECIFICATION.SEGMENT_NAME ) is
  10381.    -- ===============================================================
  10382.    --  Delete a segment from the graphic output.
  10383.    -- ==============================================================
  10384.    begin 
  10385.       -- debug aid only
  10386.       if TRACE_PKG.REQUEST_TRACE then
  10387.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DELETE_SEGMENT") ;
  10388.       end if ; 
  10389.  
  10390.       -- Update the segment used array to show the segment is not in use.
  10391.       SEGMENT_IS_USED( SEGMENT ) := FALSE ;
  10392.  
  10393.       -- Delete the specified segment from the GKS.
  10394.       L_1A.DELETE_SEGMENT( SEGMENT );
  10395.       -- Redraw the graphics area to cover delete flaws
  10396.    end DELETE_SEGMENT ;
  10397.  
  10398.  
  10399.    procedure DISPLAY_MENU 
  10400.              ( MENU : in GRAPHICS.SEGMENT_LIST_TYPE ) is
  10401.    -- ===================================================================
  10402.    --  Display the selected menu in the menu window.
  10403.    -- ===================================================================
  10404.    begin 
  10405.       -- debug aid only
  10406.       if TRACE_PKG.REQUEST_TRACE then
  10407.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DISPLAY_MENU") ;
  10408.       end if ; 
  10409.  
  10410.       for MENU_INDEX in MENU'range
  10411.       loop
  10412.  
  10413.          if  MENU( MENU_INDEX ) /= GRAPHICS.NULL_SEGMENT then
  10414.  
  10415.             -- Set the MENU_SEGMENT visible by calling the GKS 
  10416.             -- SET_VISIBILITY procedure.
  10417.             L_1A.SET_VISIBILITY( MENU( MENU_INDEX ) ,
  10418.                                  GKS_SPECIFICATION.VISIBLE );
  10419.  
  10420.             -- Set the MENU_SEGMENT detectable by calling the GKS
  10421.             -- SET_DETECTABILITY procedure.
  10422.             L_1B.SET_DETECTABILITY( MENU( MENU_INDEX ) ,
  10423.                                     GKS_SPECIFICATION.DETECTABLE );
  10424.          end if;
  10425.  
  10426.       end loop;
  10427.    end DISPLAY_MENU ;
  10428.  
  10429.  
  10430.    procedure DRAW_ABORT_ICON is
  10431.    -- ========================================================
  10432.    --  Procedure draws the abort icon in the upper left corner
  10433.    --  of the graphics window.
  10434.    -- ========================================================
  10435.       COLOR         : constant GRAPHICS.COLOR_TYPE := GRAPHICS.RED ;
  10436.       FILL          : constant GKS_SPECIFICATION.INTERIOR_STYLE :=
  10437.                       GKS_SPECIFICATION.SOLID ;
  10438.       LINE          : constant GRAPHICS.LINE_TYPE := GRAPHICS.SOLID ;
  10439.       IDENTIFIER    : constant GKS_SPECIFICATION.GDP_ID := GDP_RECTANGLE ;
  10440.       ABORT_LABEL   : constant STRING := "ABORT";
  10441.       COLOR_RECORD  : GKS_SPECIFICATION.ESCAPE_RECORD
  10442.                       ( GKS_SPECIFICATION.ALPHA_BACKGROUND );
  10443.       TEXT_POINT    : GKS_SPECIFICATION.WC.POINT ;
  10444.       SCREEN_HEIGHT : constant GRAPHICS.WC := GRAPHICS.WC(
  10445.                       GRAPHIC_WINDOW_RECTANGLE.Y.MAX -
  10446.                       GRAPHIC_WINDOW_RECTANGLE.Y.MIN );
  10447.       CHAR_HEIGHT   : constant GRAPHICS.WC := GRAPHICS.WC(
  10448.                       FLOAT( SCREEN_HEIGHT ) * 0.015 ) ;
  10449.       CHAR_WIDTH    : constant GRAPHICS.WC := GRAPHICS.WC(
  10450.                       FLOAT( SCREEN_HEIGHT ) * 0.01 ) ;
  10451.       CHAR_SPACING  : constant GRAPHICS.WC := GRAPHICS.WC(
  10452.                       FLOAT( SCREEN_HEIGHT ) * 0.01 ) ;
  10453.       ICON_Y_SIZE   : GKS_SPECIFICATION.WC_TYPE :=
  10454.                       GKS_SPECIFICATION.WC_TYPE( CHAR_HEIGHT * 2 ) ;
  10455.       ICON_X_SIZE   : GKS_SPECIFICATION.WC_TYPE :=
  10456.                       GKS_SPECIFICATION.WC_TYPE(
  10457.                       CHAR_WIDTH * 7 + CHAR_SPACING * 4 ) ;
  10458.       STORED_FONT   : GKS_SPECIFICATION.TEXT_PRECISION ;
  10459.  
  10460.    begin -- DRAW_ABORT_ICON 
  10461.       -- debug aid only
  10462.       if TRACE_PKG.REQUEST_TRACE then
  10463.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DRAW_ABORT_ICON") ;
  10464.       end if ; 
  10465.  
  10466.       -- Delete the current abort icon
  10467.       if ABORT_SEGMENT /= GRAPHICS.NULL_SEGMENT then
  10468.          DELETE_SEGMENT( ABORT_SEGMENT ) ;
  10469.       end if ;
  10470.  
  10471.       -- Open a new segment for the abort icon.
  10472.       ABORT_SEGMENT := OPEN_SEGMENT ;
  10473.  
  10474.       -- Set drawing parameters and point list.
  10475.       SET_LINE_TYPE_AND_COLOR ( LINE , COLOR );
  10476.       L_0A.SET_FILL_AREA_COLOUR_INDEX( COLOR_TO_INDEX ( COLOR ));
  10477.       L_0A.SET_FILL_AREA_INTERIOR_STYLE ( FILL ) ;
  10478.  
  10479.       ABORT_POINTS( 1 ).X := GRAPHIC_WINDOW_RECTANGLE.X.MIN ;
  10480.       ABORT_POINTS( 1 ).Y := GRAPHIC_WINDOW_RECTANGLE.Y.MAX ;
  10481.       ABORT_POINTS( 2 ).X := GRAPHIC_WINDOW_RECTANGLE.X.MIN + ICON_X_SIZE ;
  10482.       ABORT_POINTS( 2 ).Y := GRAPHIC_WINDOW_RECTANGLE.Y.MAX - ICON_Y_SIZE ;
  10483.  
  10484.       -- draw the box
  10485.       NON_STD.GDP ( ABORT_POINTS, IDENTIFIER ) ;
  10486.  
  10487.       -- Set the text background to the abort fill color
  10488.       COLOR_RECORD.COLOUR := COLOR_TO_INDEX ( GRAPHICS.RED ) ;
  10489.       NON_STD.ESCAPE( GKS_SPECIFICATION.ALPHA_BACKGROUND ,
  10490.                       COLOR_RECORD ) ;
  10491.  
  10492.       --  Set current GKS text color to the specified value.
  10493.       L_0A.SET_TEXT_COLOUR_INDEX( COLOR_TO_INDEX( GRAPHICS.BLACK ) ) ;
  10494.  
  10495.       -- save the font in use
  10496.       STORED_FONT  := CURRENT_FONT ;
  10497.       -- set the stroke param as current
  10498.       CURRENT_FONT := GKS_SPECIFICATION.STROKE_PRECISION ;
  10499.  
  10500.       -- Adjust the current text size attributes for the current window
  10501.       SET_CHARACTER_SIZE_ATTRIBUTES( CHAR_HEIGHT, 
  10502.                                      CHAR_WIDTH, 
  10503.                                      CHAR_SPACING,
  10504.                                      CURRENT_FONT ) ;
  10505.  
  10506.       -- Generate the ABORT text string inside the rectangle
  10507.       TEXT_POINT.X := ABORT_POINTS( 1 ).X +
  10508.                       GKS_SPECIFICATION.WC_TYPE( CHAR_WIDTH );
  10509.       TEXT_POINT.Y := ABORT_POINTS( 1 ).Y -
  10510.                       ( ICON_Y_SIZE * 0.25 ) ;
  10511.       L_0A.TEXT( TEXT_POINT, ABORT_LABEL );
  10512.  
  10513.       -- Adjust the current text size attributes to the default attributes.
  10514.       SET_CHARACTER_SIZE_ATTRIBUTES( GRAPHICS.DEFAULT_CHARACTER_HEIGHT,
  10515.                                      GRAPHICS.DEFAULT_CHARACTER_WIDTH,
  10516.                                      GRAPHICS.DEFAULT_CHARACTER_WIDTH_SPACING,
  10517.                                      STORED_FONT ) ;
  10518.  
  10519.       -- set text background color
  10520.       COLOR_RECORD.COLOUR := COLOR_TO_INDEX ( CURRENT_TEXT_BACKGROUND_COLOR ) ;
  10521.       NON_STD.ESCAPE( GKS_SPECIFICATION.ALPHA_BACKGROUND ,
  10522.                       COLOR_RECORD ) ;
  10523.  
  10524.       -- Close the currently open segment and set the segment invisible.
  10525.       CLOSE_SEGMENT ;
  10526.  
  10527.       L_1A.SET_VISIBILITY( ABORT_SEGMENT, GKS_SPECIFICATION.INVISIBLE );
  10528.  
  10529.    end DRAW_ABORT_ICON ;
  10530.  
  10531.  
  10532.    function DRAW_BOX
  10533.              ( COLOR       : in GRAPHICS.COLOR_TYPE ;
  10534.                FILL        : in GKS_SPECIFICATION.INTERIOR_STYLE ;
  10535.                LINE        : in GRAPHICS.LINE_TYPE ;
  10536.                UPPER_LEFT  : in GRAPHICS.POINT ;
  10537.                LOWER_RIGHT : in GRAPHICS.POINT )
  10538.    return GKS_SPECIFICATION.SEGMENT_NAME is
  10539.    -- ========================================================
  10540.    --  Procedure draws a box of defined parameters, used for
  10541.    --  creating menus and icons only.
  10542.    -- ========================================================
  10543.       SEGMENT_ID : GKS_SPECIFICATION.SEGMENT_NAME ;
  10544.       POINTS     : GRAPHICS.POINT_LIST(1..2) ;
  10545.       GKS_POINTS : GKS_SPECIFICATION.WC.POINT_ARRAY(1..2);
  10546.       IDENTIFIER : constant GKS_SPECIFICATION.GDP_ID := GDP_RECTANGLE ;
  10547.  
  10548.    begin -- DRAW_BOX
  10549.       -- debug aid only
  10550.       if TRACE_PKG.REQUEST_TRACE then
  10551.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DRAW_BOX") ;
  10552.       end if ; 
  10553.  
  10554.       -- Open a new segment for the graphic entity.
  10555.       SEGMENT_ID := OPEN_SEGMENT ;
  10556.  
  10557.       -- Set drawing parameters and point list.
  10558.       SET_LINE_TYPE_AND_COLOR ( LINE , COLOR );
  10559.       L_0A.SET_FILL_AREA_COLOUR_INDEX( COLOR_TO_INDEX ( COLOR ));
  10560.       L_0A.SET_FILL_AREA_INTERIOR_STYLE ( FILL ) ;
  10561.  
  10562.       -- Checks if a point is beyond the boundry limits, if so set the 
  10563.       -- drawn point to the limit concerned.
  10564.       POINTS( 1 ) := UPPER_LEFT ;
  10565.       POINTS( 2 ) := LOWER_RIGHT ;
  10566.       -- verify limits of X boundries, correct if beyond.
  10567.       if UPPER_LEFT.X < WC_WINDOW.X.MIN then
  10568.          POINTS( 1 ).X := WC_WINDOW.X.MIN ;
  10569.       elsif UPPER_LEFT.X > WC_WINDOW.X.MAX then
  10570.          POINTS( 1 ).X := WC_WINDOW.X.MAX ;
  10571.       end if ;
  10572.       if LOWER_RIGHT.X < WC_WINDOW.X.MIN then
  10573.          POINTS( 2 ).X := WC_WINDOW.X.MIN ;
  10574.       elsif LOWER_RIGHT.X > WC_WINDOW.X.MAX then
  10575.          POINTS( 2 ).X := WC_WINDOW.X.MAX ;
  10576.       end if ;
  10577.       -- verify limits of Y boundries, correct if beyond.
  10578.       if UPPER_LEFT.Y < WC_WINDOW.Y.MIN then
  10579.          POINTS( 1 ).Y := WC_WINDOW.Y.MIN ;
  10580.       elsif UPPER_LEFT.Y > WC_WINDOW.Y.MAX then
  10581.          POINTS( 1 ).Y := WC_WINDOW.Y.MAX ;
  10582.       end if ;
  10583.       if LOWER_RIGHT.Y < WC_WINDOW.Y.MIN then
  10584.          POINTS( 2 ).Y := WC_WINDOW.Y.MIN ;
  10585.       elsif LOWER_RIGHT.Y > WC_WINDOW.Y.MAX then
  10586.          POINTS( 2 ).Y := WC_WINDOW.Y.MAX ;
  10587.       end if ;
  10588.  
  10589.       -- Convert the points to GKS required floating point types.
  10590.       for I in POINTS'range
  10591.       loop
  10592.          GKS_POINTS( I ).X := GKS_SPECIFICATION.WC_TYPE( POINTS( I ).X ) ;
  10593.          GKS_POINTS( I ).Y := GKS_SPECIFICATION.WC_TYPE( POINTS( I ).Y ) ;
  10594.       end loop ;
  10595.  
  10596.       -- draw the box
  10597.       NON_STD.GDP ( GKS_POINTS, IDENTIFIER ) ;
  10598.  
  10599.       -- Close the currently open segment.
  10600.       CLOSE_SEGMENT ;
  10601.       return SEGMENT_ID ;
  10602.    end DRAW_BOX ;
  10603.  
  10604.  
  10605.    function DRAW_FIGURE 
  10606.             ( DRAWING_ENTITY : GRAPHICS.FIGURE_ENTITY ;
  10607.               BEGIN_POINT    : GRAPHICS.POINT ;
  10608.               END_POINT      : GRAPHICS.POINT )
  10609.    return GKS_SPECIFICATION.SEGMENT_NAME is
  10610.    -- ======================================================
  10611.    --  Draw the specified graphic entity at the specified 
  10612.    --  position using the currently defined attributes for
  10613.    --  the graphic entity, and return its SEGMENT_ID.
  10614.    -- ======================================================
  10615.       SEGMENT_ID : GKS_SPECIFICATION.SEGMENT_NAME ;
  10616.  
  10617.       -- defines the minimum entity figure width to be drawn
  10618.       MINIMUM_FIGURE_WIDTH : constant GRAPHICS.WC := 
  10619.                              2 * GRAPHICS.CHARACTER_WIDTH_OFFSET ;
  10620.  
  10621.       -- Define variables containing the upper left and lower right
  10622.       -- x and y coordinates.
  10623.       UL_X ,
  10624.       UL_Y ,
  10625.       LR_X ,
  10626.       LR_Y : GRAPHICS.WC ;
  10627.  
  10628.       -- Variables used to calculate the point lists.
  10629.       INITIAL_DELTA_X ,
  10630.       DELTA_X , 
  10631.       DELTA_Y         : GRAPHICS.WC;
  10632.  
  10633.       -- Arrays containing the point list used to generate the figure.
  10634.       GENERAL_PTS : GRAPHICS.POINT_LIST( 1..5 ) ;
  10635.       STACKED_PTS : GRAPHICS.POINT_LIST( 1..8 ) ;
  10636.       OCTAGON_PTS : GKS_SPECIFICATION.WC.POINT_ARRAY( 1..9 ) ;
  10637.  
  10638.       -- Array containing the point list for the circle GDP.
  10639.       CIRCLE_PTS : GKS_SPECIFICATION.WC.POINT_ARRAY(1..2);
  10640.  
  10641.       -- Arrays containing the general and stacked point arrays
  10642.       -- following the GKS required type conversion
  10643.       GKS_GENERAL_PTS : GKS_SPECIFICATION.WC.POINT_ARRAY( 1..5 ) ;
  10644.       GKS_STACKED_PTS : GKS_SPECIFICATION.WC.POINT_ARRAY( 1..8 ) ;
  10645.  
  10646.       -- Line type and line color required for the figure.
  10647.       REQ_LINE_TYPE  : GRAPHICS.LINE_TYPE;
  10648.       REQ_LINE_COLOR : GRAPHICS.COLOR_TYPE;
  10649.  
  10650.       -- implementation of body as octagon
  10651.       CIRCLE_IMPLEMENTATION_AS_OCTAGON : constant Boolean := true ; 
  10652.  
  10653.    begin 
  10654.  
  10655.       -- debug aid only
  10656.       if TRACE_PKG.REQUEST_TRACE then
  10657.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DRAW_FIGURE") ;
  10658.       end if ; 
  10659.  
  10660.       -- get the ititial delta x
  10661.       INITIAL_DELTA_X := END_POINT.X - BEGIN_POINT.X ;
  10662.       -- check that the minimum figure width is met
  10663.       if INITIAL_DELTA_X < MINIMUM_FIGURE_WIDTH then
  10664.          raise FIGURE_TOO_NARROW ;
  10665.       end if ;
  10666.  
  10667.       -- Open a new segment for the graphic entity.
  10668.       SEGMENT_ID := OPEN_SEGMENT ;
  10669.  
  10670.       --  Set current GKS line type to the value specified in 
  10671.       --  GRAPHICS.ENTITY_LINE( DRAWING_ENTITY ).
  10672.       --  Set current GKS line color to the value specified in 
  10673.       --  GRAPHICS.ENTITY_COLOR( DRAWING_ENTITY )
  10674.       SET_LINE_TYPE_AND_COLOR ( GRAPHICS.ENTITY_LINE( DRAWING_ENTITY ),
  10675.                                 GRAPHICS.ENTITY_COLOR( DRAWING_ENTITY ) );
  10676.  
  10677.       --  Generate a GKS point list from 
  10678.       --  a) the specified STARTING_POINT and ENDING_POINT, and
  10679.       --  b) the figure specified in ENTITY_SHAPE( DRAWING_ENTITY )
  10680.  
  10681.       -- initialize variables containing the upper left and lower right
  10682.       -- x and y coordinates.
  10683.       UL_X := BEGIN_POINT.X ;
  10684.       LR_X := END_POINT.X ;
  10685.       UL_Y := BEGIN_POINT.Y ;
  10686.       LR_Y := END_POINT.Y ;
  10687.  
  10688.       -- Generate the point list for the basic rectangle.
  10689.       GENERAL_PTS( 1 ).X := UL_X;
  10690.       GENERAL_PTS( 1 ).Y := UL_Y;
  10691.       GENERAL_PTS( 2 ).X := LR_X;
  10692.       GENERAL_PTS( 2 ).Y := UL_Y;
  10693.       GENERAL_PTS( 3 ).X := LR_X;
  10694.       GENERAL_PTS( 3 ).Y := LR_Y;
  10695.       GENERAL_PTS( 4 ).X := UL_X;
  10696.       GENERAL_PTS( 4 ).Y := LR_Y;
  10697.       GENERAL_PTS( 5 ).X := UL_X;
  10698.       GENERAL_PTS( 5 ).Y := UL_Y;
  10699.  
  10700.       case GRAPHICS.ENTITY_SHAPE( DRAWING_ENTITY ) is
  10701.          when SINGLE_RECTANGLE => 
  10702.             null;
  10703.  
  10704.          when STACKED_RECTANGLE =>
  10705.             -- Move the general point list to the stacked rectangle
  10706.             -- point list.
  10707.             STACKED_PTS(1..5) := GENERAL_PTS(1..5);
  10708.             -- Add the lines for the embedded rectangle to the point list.
  10709.             STACKED_PTS( 6 ).X := UL_X;
  10710.             STACKED_PTS( 6 ).Y := UL_Y - GRAPHICS.STACKED_SIZE;
  10711.             STACKED_PTS( 7 ).X := LR_X;
  10712.             STACKED_PTS( 7 ).Y := STACKED_PTS( 6 ).Y;
  10713.             STACKED_PTS( 8 )   := STACKED_PTS( 2 );
  10714.  
  10715.          when PARALLELOGRAM => -- used for task rep
  10716.             -- Determine new point values to change the rectangle to a
  10717.             -- parallelogram and update the point list.
  10718.             --   calculate the offset to adjust the parallelogram
  10719.             --   in the x direction
  10720.             DELTA_X := PARALLELOGRAM_POINTS( GENERAL_PTS( 1 ), 
  10721.                                              GENERAL_PTS( 3 ),
  10722.                                              GENERAL_PTS( 1 ).Y ) - UL_X ;
  10723.             -- check that the minimum figure width is met
  10724.             if ( MINIMUM_FIGURE_WIDTH + DELTA_X ) > INITIAL_DELTA_X then
  10725.                -- Close the currently open segment.
  10726.                CLOSE_SEGMENT ;
  10727.                raise FIGURE_TOO_NARROW ;
  10728.             end if ;
  10729.             -- increase the upper left x by the delta offset
  10730.             UL_X := UL_X + DELTA_X ;
  10731.             -- decrease the lower right x by the delta offset
  10732.             LR_X := LR_X - DELTA_X ;
  10733.             -- update upper left point for first and last point of polyline
  10734.             GENERAL_PTS( 1 ).X := UL_X;
  10735.             GENERAL_PTS( 5 ).X := UL_X;
  10736.             GENERAL_PTS( 3 ).X := LR_X;
  10737.  
  10738.          when SQUARE | CIRCLE =>
  10739.             -- Update the rectangle point list into a list defining
  10740.             -- a square.
  10741.             if not CIRCLE_IMPLEMENTATION_AS_OCTAGON then
  10742.                DELTA_Y := UL_Y - LR_Y;
  10743.                DELTA_X := LR_X - UL_X;
  10744.                if DELTA_X < DELTA_Y then
  10745.                   LR_Y := UL_Y - DELTA_X;
  10746.                   GENERAL_PTS( 3 ).Y := LR_Y;
  10747.                   GENERAL_PTS( 4 ).Y := LR_Y;
  10748.                else
  10749.                   LR_X := UL_X + DELTA_Y;
  10750.                   GENERAL_PTS( 2 ).X := LR_X;
  10751.                   GENERAL_PTS( 3 ).X := LR_X;
  10752.                end if ;
  10753.             end if ;
  10754.       end case;
  10755.  
  10756.       --  Draw the line by calling the GKS POLYLINE procedure for
  10757.       --  the polygons, and the GKS GDP procedure for the circle.
  10758.       if GRAPHICS.ENTITY_SHAPE( DRAWING_ENTITY ) = CIRCLE then
  10759.          if CIRCLE_IMPLEMENTATION_AS_OCTAGON then
  10760.             declare
  10761.                X_REF  : constant GRAPHICS.WC := GENERAL_PTS( 1 ).X ;
  10762.                Y_REF  : constant GRAPHICS.WC := GENERAL_PTS( 1 ).Y ;
  10763.                X_8TH  : constant GRAPHICS.WC :=
  10764.                         ( GENERAL_PTS( 3 ).X - GENERAL_PTS( 1 ).X ) / 8 ;
  10765.                Y_8TH  : constant GRAPHICS.WC :=
  10766.                         ( GENERAL_PTS( 1 ).Y - GENERAL_PTS( 3 ).Y ) / 8 ;
  10767.             begin -- circle implementation as octagon
  10768.                OCTAGON_PTS( 1 ).X := 
  10769.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (4 * X_8TH)) ;
  10770.                OCTAGON_PTS( 1 ).Y :=
  10771.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (0 * Y_8TH)) ;
  10772.  
  10773.                OCTAGON_PTS( 2 ).X :=
  10774.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (7 * X_8TH)) ;
  10775.                OCTAGON_PTS( 2 ).Y :=
  10776.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (1 * Y_8TH)) ;
  10777.  
  10778.                OCTAGON_PTS( 3 ).X :=
  10779.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (8 * X_8TH)) ;
  10780.                OCTAGON_PTS( 3 ).Y :=
  10781.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (4 * Y_8TH)) ;
  10782.  
  10783.                OCTAGON_PTS( 4 ).X :=
  10784.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (7 * X_8TH)) ;
  10785.                OCTAGON_PTS( 4 ).Y :=
  10786.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (7 * Y_8TH)) ;
  10787.  
  10788.                OCTAGON_PTS( 5 ).X :=
  10789.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (4 * X_8TH)) ;
  10790.                OCTAGON_PTS( 5 ).Y :=
  10791.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (8 * Y_8TH)) ;
  10792.  
  10793.                OCTAGON_PTS( 6 ).X :=
  10794.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (1 * X_8TH)) ;
  10795.                OCTAGON_PTS( 6 ).Y :=
  10796.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (7 * Y_8TH)) ;
  10797.  
  10798.                OCTAGON_PTS( 7 ).X :=
  10799.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (0 * X_8TH)) ;
  10800.                OCTAGON_PTS( 7 ).Y :=
  10801.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (4 * Y_8TH)) ;
  10802.  
  10803.                OCTAGON_PTS( 8 ).X :=
  10804.                   GKS_SPECIFICATION.WC_TYPE( X_REF + (1 * X_8TH)) ;
  10805.                OCTAGON_PTS( 8 ).Y :=
  10806.                   GKS_SPECIFICATION.WC_TYPE( Y_REF - (1 * Y_8TH)) ;
  10807.  
  10808.                OCTAGON_PTS( 9 ) := OCTAGON_PTS( 1 ) ;
  10809.                L_0A.POLYLINE( OCTAGON_PTS ) ;
  10810.             end ; -- circle implementation as octagon
  10811.          else
  10812.             CIRCLE_PTS( 1 ).X :=
  10813.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( 1 ).X );
  10814.             CIRCLE_PTS( 1 ).Y :=
  10815.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( 1 ).Y );
  10816.             CIRCLE_PTS( 2 ).X :=
  10817.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( 3 ).X );
  10818.             CIRCLE_PTS( 2 ).Y :=
  10819.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( 3 ).Y );
  10820.             NON_STD.GDP( CIRCLE_PTS, GKS_SPECIFICATION.GDP_CIRCLE ) ;
  10821.          end if ;
  10822.  
  10823.       elsif GRAPHICS.ENTITY_SHAPE( DRAWING_ENTITY ) = STACKED_RECTANGLE then
  10824.             -- when a task is represented by a chopped rectangle only
  10825.             -- or GRAPHICS.ENTITY_SHAPE( DRAWING_ENTITY ) = PARALLELOGRAM then
  10826.          for I in STACKED_PTS'range
  10827.          loop
  10828.             GKS_STACKED_PTS( I ).X :=
  10829.                GKS_SPECIFICATION.WC_TYPE( STACKED_PTS( I ).X ) ;
  10830.             GKS_STACKED_PTS( I ).Y :=
  10831.                GKS_SPECIFICATION.WC_TYPE( STACKED_PTS( I ).Y ) ;
  10832.          end loop ;
  10833.          L_0A.POLYLINE( GKS_STACKED_PTS );
  10834.       else
  10835.          for I in GENERAL_PTS'range
  10836.          loop
  10837.             GKS_GENERAL_PTS( I ).X :=
  10838.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( I ).X ) ;
  10839.             GKS_GENERAL_PTS( I ).Y :=
  10840.                GKS_SPECIFICATION.WC_TYPE( GENERAL_PTS( I ).Y ) ;
  10841.          end loop ;
  10842.          L_0A.POLYLINE( GKS_GENERAL_PTS );
  10843.       end if;
  10844.  
  10845.       -- Close the currently open segment.
  10846.       CLOSE_SEGMENT ;
  10847.       return SEGMENT_ID ;
  10848.    end DRAW_FIGURE ;
  10849.  
  10850.  
  10851.    function DRAW_LINE 
  10852.             ( DRAWING_ENTITY : GRAPHICS.LINE_ENTITY ;
  10853.               STARTING_POINT : GRAPHICS.POINT ;
  10854.               ENDING_POINT   : GRAPHICS.POINT )
  10855.    return GKS_SPECIFICATION.SEGMENT_NAME is
  10856.    -- ======================================================
  10857.    --  Draw a line at the specified position using the 
  10858.    --  currently defined attributes for the specified
  10859.    --  graphic entity, and return its SEGMENT_ID.
  10860.    -- ======================================================
  10861.       SEGMENT_ID : GKS_SPECIFICATION.SEGMENT_NAME ;
  10862.  
  10863.       -- Array containing the point list used to generate the figure.
  10864.       PTS     : GRAPHICS.POINT_LIST (1..2);
  10865.       GKS_PTS : GKS_SPECIFICATION.WC.POINT_ARRAY (1..2);
  10866.  
  10867.    begin 
  10868.       -- debug aid only
  10869.       if TRACE_PKG.REQUEST_TRACE then
  10870.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.DRAW_LINE") ;
  10871.       end if ; 
  10872.  
  10873.       -- Open a new segment for the graphic entity.
  10874.       SEGMENT_ID := OPEN_SEGMENT ;
  10875.  
  10876.       --  Set current GKS line type to the value specified in 
  10877.       --  ENTITY_LINE( DRAWING_ENTITY ).
  10878.       --  Set current GKS line color to the value specified in 
  10879.       --  ENTITY_COLOR( DRAWING_ENTITY )
  10880.       SET_LINE_TYPE_AND_COLOR ( GRAPHICS.ENTITY_LINE( DRAWING_ENTITY ),
  10881.                                 GRAPHICS.ENTITY_COLOR( DRAWING_ENTITY ) );
  10882.  
  10883.       --  Generate a GKS point list from the specified STARTING_POINT
  10884.       --  and ENDING_POINT.
  10885.       PTS( 1 ).X := GRAPHICS.WC( STARTING_POINT.X );
  10886.       PTS( 1 ).Y := GRAPHICS.WC( STARTING_POINT.Y );
  10887.       PTS( 2 ).X := GRAPHICS.WC( ENDING_POINT.X );
  10888.       PTS( 2 ).Y := GRAPHICS.WC( ENDING_POINT.Y );
  10889.  
  10890.       -- Checks if a point is beyond the boundry limits, if so set the 
  10891.       -- drawn point to the limit concerned.
  10892.       -- verify limits of X boundries, correct if beyond.
  10893.       if PTS( 1 ).X < WC_WINDOW.X.MIN then
  10894.          PTS( 1 ).X := WC_WINDOW.X.MIN ;
  10895.       elsif PTS( 1 ).X > WC_WINDOW.X.MAX then
  10896.          PTS( 1 ).X := WC_WINDOW.X.MAX ;
  10897.       end if ;
  10898.       if PTS( 2 ).X < WC_WINDOW.X.MIN then
  10899.          PTS( 2 ).X := WC_WINDOW.X.MIN ;
  10900.       elsif PTS( 2 ).X > WC_WINDOW.X.MAX then
  10901.          PTS( 2 ).X := WC_WINDOW.X.MAX ;
  10902.       end if ;
  10903.       -- verify limits of Y boundries, correct if beyond.
  10904.       if PTS( 1 ).Y < WC_WINDOW.Y.MIN then
  10905.          PTS( 1 ).Y := WC_WINDOW.Y.MIN ;
  10906.       elsif PTS( 1 ).Y > WC_WINDOW.Y.MAX then
  10907.          PTS( 1 ).Y := WC_WINDOW.Y.MAX ;
  10908.       end if ;
  10909.       if PTS( 2 ).Y < WC_WINDOW.Y.MIN then
  10910.          PTS( 2 ).Y := WC_WINDOW.Y.MIN ;
  10911.       elsif PTS( 2 ).Y > WC_WINDOW.Y.MAX then
  10912.          PTS( 2 ).Y := WC_WINDOW.Y.MAX ;
  10913.       end if ;
  10914.  
  10915.       -- Perform GKS required type conversion on the point list.
  10916.       for I in PTS'range
  10917.       loop
  10918.          GKS_PTS( I ).X := GKS_SPECIFICATION.WC_TYPE( PTS( I ).X ) ;
  10919.          GKS_PTS( I ).Y := GKS_SPECIFICATION.WC_TYPE( PTS( I ).Y ) ;
  10920.       end loop ;
  10921.  
  10922.       --  Draw the line by calling the GKS POLYLINE procedure.
  10923.       L_0A.POLYLINE( GKS_PTS );
  10924.  
  10925.       -- Close the currently open segment.
  10926.       CLOSE_SEGMENT ;
  10927.       return SEGMENT_ID ;
  10928.    end DRAW_LINE ;
  10929.  
  10930.  
  10931.    function GET_GRAPHICS_CURSOR_POSITION 
  10932.    return GRAPHICS.POINT is
  10933.    -- ===================================================================
  10934.    --  Return the position of the graphics cursor in world
  10935.    --  coordinates.
  10936.    -- ===================================================================
  10937.       POSITION       : GRAPHICS.POINT ;
  10938.       GKS_POSITION   : GKS_SPECIFICATION.WC.POINT ;
  10939.       VALID_POSITION : Boolean := False ;
  10940.       ERROR_MESSAGE  : constant String :=
  10941.              " INPUT ERROR for cursor, Please RE-TRY " ;
  10942.    begin 
  10943.       -- debug aid only
  10944.       if TRACE_PKG.REQUEST_TRACE then
  10945.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.GET_GRAPHICS_CURSOR_POSITION") ;
  10946.       end if ; 
  10947.  
  10948.       -- try three times max to get a valid position
  10949.       for TRY in 1..3 loop
  10950.          GET_VALID_POSITION :
  10951.             declare -- GET_VALID_POSITION
  10952.             begin -- GET_VALID_POSITION
  10953.                -- Initialize the GKS locator device, and
  10954.                -- retrieve cursor location from the GKS locator device.
  10955.                L_0B.REQUEST_LOCATOR( WORK_STATION, DEVICE, STATUS,
  10956.                     TRANSFORM, GKS_POSITION );
  10957.                VALID_POSITION := True ;
  10958.             exception -- GET_VALID_POSITION
  10959.                -- don't panic for three tries
  10960.                when others =>
  10961.                   case TRY is
  10962.                      when 1 | 2 => -- clear crud from buffer and try again 
  10963.                         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10964.                            ( " " ,
  10965.                              VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'
  10966.                                 ( CLEAR_SCREEN ) ,
  10967.                              VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE ( 1 ) ) ;
  10968.                         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  10969.                            ( ERROR_MESSAGE ,
  10970.                              VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION'
  10971.                                 ( CENTER_A_LINE ),
  10972.                              VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE ( 23 ) ) ;
  10973.                      when 3 => -- ok we tried now pass it on
  10974.                         raise ;
  10975.                   end case ; -- TRY
  10976.             end GET_VALID_POSITION ;
  10977.          exit when VALID_POSITION ;
  10978.       end loop ; -- TRY
  10979.  
  10980.       -- If abort capability was requested and specified location is
  10981.       -- within abort rectangle then raise the abort exception.
  10982.       if ABORT_CAPABILITY_ACTIVE and
  10983.  
  10984.          GKS_POSITION.X >= ABORT_POINTS( 1 ).X and
  10985.          GKS_POSITION.X <= ABORT_POINTS( 2 ).X and
  10986.          GKS_POSITION.Y <= ABORT_POINTS( 1 ).Y and
  10987.          GKS_POSITION.Y >= ABORT_POINTS( 2 ).Y then
  10988.          raise OPERATION_ABORTED_BY_OPERATOR ;
  10989.       end if ;
  10990.  
  10991.       -- Convert GKS floating point position to graphics integer position.
  10992.       POSITION.X := GRAPHICS.WC( GKS_POSITION.X ) ;
  10993.       POSITION.Y := GRAPHICS.WC( GKS_POSITION.Y ) ;
  10994.  
  10995.       return POSITION ;
  10996.    end GET_GRAPHICS_CURSOR_POSITION ;
  10997.  
  10998.  
  10999.    procedure GRAPHICS_SCREEN
  11000.              ( MODE : in MODE_TYPE ) is
  11001.    -- =====================================================
  11002.    --  Activates or Deactivates the visibility of the 
  11003.    --  graphics screen.
  11004.    -- =====================================================
  11005.       ESC_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD
  11006.                    ( GKS_SPECIFICATION.GRAPHICS_VISIBILITY );
  11007.  
  11008.    begin 
  11009.       -- debug aid only
  11010.       if TRACE_PKG.REQUEST_TRACE then
  11011.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.GRAPHICS_SCREEN") ;
  11012.       end if ; 
  11013.  
  11014.       ESC_RECORD.GRAPHICS_ON := ( MODE = ON ) ;
  11015.       NON_STD.ESCAPE( GKS_SPECIFICATION.GRAPHICS_VISIBILITY , ESC_RECORD );
  11016.    end GRAPHICS_SCREEN ;
  11017.  
  11018.  
  11019.    procedure HILITE_SEGMENT 
  11020.              ( SEGMENT_ID : in GKS_SPECIFICATION.SEGMENT_NAME;
  11021.                MODE       : in GKS_SPECIFICATION.SEGMENT_HIGHLIGHTING ) is
  11022.    -- ======================================================
  11023.    --  Turn the selected segment highlight on or off.
  11024.    -- ======================================================
  11025.    begin 
  11026.       -- debug aid only
  11027.       if TRACE_PKG.REQUEST_TRACE then
  11028.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.HILITE_SEGMENT") ;
  11029.       end if ; 
  11030.  
  11031.       --  Set the specified segment to normal display or highlighted
  11032.       --  display by calling the GKS SET_HIGHLIGHTING procedure.
  11033.       L_1A.SET_HIGHLIGHTING
  11034.               ( GKS_SPECIFICATION.SEGMENT_NAME( SEGMENT_ID ), MODE );
  11035.    end HILITE_SEGMENT ;
  11036.  
  11037.  
  11038.    procedure INITIALIZE_GRAPHICS_MODE is
  11039.    -- ========================================================
  11040.    --  Initialize device for graphics capability.
  11041.    -- ========================================================
  11042.    begin 
  11043.       -- debug aid only
  11044.       if TRACE_PKG.REQUEST_TRACE then
  11045.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.INITIALIZE_GRAPHICS_MODE") ;
  11046.       end if ; 
  11047.  
  11048.       -- Open the GKS.
  11049.       L_0A.OPEN_GKS( GKS_SPECIFICATION.DEFAULT_ERROR_FILE ) ;
  11050.  
  11051.       -- Open the workstation.
  11052.       L_0A.OPEN_WORKSTATION(
  11053.            ACTIVE_TERMINAL, CONNECTION, STATION_TYPE ) ;
  11054.  
  11055.       -- Define the color representations for each of the supported colors.
  11056.       for COLOR in GRAPHICS.COLOR_TYPE
  11057.       loop
  11058.          L_0A.SET_COLOUR_REPRESENTATION
  11059.             ( ACTIVE_TERMINAL ,
  11060.               COLOR_TO_INDEX ( COLOR ) ,
  11061.               COLOR_REPRESENTATION ( COLOR ) ) ;
  11062.       end loop;
  11063.  
  11064.    end INITIALIZE_GRAPHICS_MODE ;
  11065.  
  11066.  
  11067.    procedure INIT_SCREEN 
  11068.              ( NEW_COLOR : in GRAPHICS.COLOR_TYPE ;
  11069.                MENU_AREA : out GRAPHICS.RECTANGLE ) is
  11070.    -- ===================================================================
  11071.    --  Set the screen parameters as needed.  This will include
  11072.    --  establishing a scroll region on the bottom two lines.
  11073.    -- ===================================================================
  11074.       WINDOW_VIEWPORT_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD
  11075.                                ( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT );
  11076.       COLOR_RECORD           : GKS_SPECIFICATION.ESCAPE_RECORD
  11077.                                ( GKS_SPECIFICATION.GRAPHIC_BACKGROUND );
  11078.  
  11079.    begin 
  11080.       -- debug aid only
  11081.       if TRACE_PKG.REQUEST_TRACE then
  11082.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.INIT_SCREEN") ;
  11083.       end if ; 
  11084.  
  11085.       -- Initialize the current background color to
  11086.       -- system default color from MMI
  11087.       CURRENT_BACKGROUND_COLOR := NEW_COLOR ;
  11088.  
  11089.       -- Initialize the screen color parameters
  11090.       -- set screen background color
  11091.       COLOR_RECORD.COLOUR := COLOR_TO_INDEX ( NEW_COLOR ) ;
  11092.       NON_STD.ESCAPE( GKS_SPECIFICATION.ALPHA_BACKGROUND ,
  11093.                       COLOR_RECORD ) ;
  11094.       NON_STD.ESCAPE( GKS_SPECIFICATION.GRAPHIC_BACKGROUND ,
  11095.                       COLOR_RECORD ) ;
  11096.       -- set text color
  11097.       COLOR_RECORD.COLOUR := COLOR_TO_INDEX ( COLOR_TYPE'( BLACK ) ) ;
  11098.       NON_STD.ESCAPE( GKS_SPECIFICATION.ALPHA_WRITING ,
  11099.                       COLOR_RECORD ) ;
  11100.  
  11101.       -- Initialize the terminal space window to view for the menu display.
  11102.       WINDOW_VIEWPORT_RECORD.VIEW_WINDOW_ID   :=
  11103.           WINDOW_TO_INDEX ( GRAPHICS.MENU_VIEW_PORT ) ;
  11104.       WINDOW_VIEWPORT_RECORD.VIEW_RECTANGLE   := MENU_SCREEN_RECTANGLE ;
  11105.       WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE := MENU_WINDOW_RECTANGLE ;
  11106.       NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11107.                       WINDOW_VIEWPORT_RECORD ) ;
  11108.  
  11109.       -- Initialize the terminal space window to view for the graphic display.
  11110.       L_0A.SET_WINDOW( GKS_SPECIFICATION.TRANSFORMATION_NUMBER( 1 ),
  11111.                        GRAPHIC_WINDOW_RECTANGLE ) ;
  11112.       WINDOW_VIEWPORT_RECORD.VIEW_WINDOW_ID   :=
  11113.           WINDOW_TO_INDEX ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  11114.       WINDOW_VIEWPORT_RECORD.VIEW_RECTANGLE   := GRAPHICS_SCREEN_RECTANGLE ;
  11115.       WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE := GRAPHIC_WINDOW_RECTANGLE ;
  11116.       NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11117.                       WINDOW_VIEWPORT_RECORD ) ;
  11118.  
  11119.       -- Clear bottom lines on screen.
  11120.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE( "  ",
  11121.          VIRTUAL_TERMINAL_INTERFACE.CLEAR_A_LINE,
  11122.          VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE'last - 1 ) ;
  11123.  
  11124.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE( "  ",
  11125.          VIRTUAL_TERMINAL_INTERFACE.CLEAR_A_LINE,
  11126.          VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE'last ) ;
  11127.  
  11128.       MENU_AREA.X.MIN := GRAPHICS.WC( MENU_WINDOW_RECTANGLE.X.MIN ) ;
  11129.       MENU_AREA.X.MAX := GRAPHICS.WC( MENU_WINDOW_RECTANGLE.X.MAX ) ;
  11130.       MENU_AREA.Y.MIN := GRAPHICS.WC( MENU_WINDOW_RECTANGLE.Y.MIN ) ;
  11131.       MENU_AREA.Y.MAX := GRAPHICS.WC( MENU_WINDOW_RECTANGLE.Y.MAX ) ;
  11132.  
  11133.       -- initialize the pan and zoom display box with the current view
  11134.       PAN_ZOOM_BOX := DRAW_BOX( BLACK, HOLLOW, SOLID, 
  11135.                       ( GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.X.MAX ),
  11136.                         GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.Y.MIN )),
  11137.                       ( GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.X.MIN ),
  11138.                         GRAPHICS.WC( GRAPHIC_WINDOW_RECTANGLE.Y.MAX )) ) ;
  11139.       -- set visibility off
  11140.       SET_SEGMENT_VISIBILITY( PAN_ZOOM_BOX,
  11141.                               GKS_SPECIFICATION.SEGMENT_VISIBILITY'
  11142.                                  ( INVISIBLE ) ) ;
  11143.       -- Generate a new abort rectangle
  11144.       DRAW_ABORT_ICON ;
  11145.  
  11146.       -- set text background color
  11147.       COLOR_RECORD.COLOUR := COLOR_TO_INDEX ( CURRENT_TEXT_BACKGROUND_COLOR ) ;
  11148.       NON_STD.ESCAPE( GKS_SPECIFICATION.ALPHA_BACKGROUND ,
  11149.                       COLOR_RECORD ) ;
  11150.    end INIT_SCREEN ;
  11151.  
  11152.  
  11153.    procedure LABEL 
  11154.              ( SEGMENT_ID_NUM   : out GKS_SPECIFICATION.SEGMENT_NAME ;
  11155.                SIZE             : out GRAPHICS.POINT ;
  11156.                LOCATION         : in  GRAPHICS.POINT ;
  11157.                NAME             : in  String ;
  11158.                CHARACTER_COLOR  : in  GRAPHICS.COLOR_TYPE ;
  11159.                BACKGROUND_COLOR : in  GRAPHICS.COLOR_TYPE := WHITE ) is
  11160.    -- ===================================================================
  11161.    --  Place the specified label on the graph and associate it with
  11162.    --  the specified object, returning the labels SEGMENT_ID.
  11163.    -- ===================================================================
  11164.       CHECKED_LOCATION,
  11165.       MAGNITUDE    : GRAPHICS.POINT ;
  11166.       GKS_LOCATION : GKS_SPECIFICATION.WC.POINT ;
  11167.       COLOR_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD
  11168.                         ( GKS_SPECIFICATION.GRAPHIC_BACKGROUND );
  11169.    begin 
  11170.       -- debug aid only
  11171.       if TRACE_PKG.REQUEST_TRACE then
  11172.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.LABEL") ;
  11173.       end if ; 
  11174.  
  11175.       -- Open a new segment for the graphic entity.
  11176.       SEGMENT_ID_NUM := OPEN_SEGMENT ;
  11177.  
  11178.       -- calc the size point of the label ( lower right corner )
  11179.       --  and store for constraint check
  11180.       MAGNITUDE.X := CHARACTER_WIDTH_OFFSET * NAME'length ;
  11181.       MAGNITUDE.Y := DEFAULT_CHARACTER_HEIGHT ;
  11182.  
  11183.       -- Checks if a point is beyond the boundry limits, if so set the 
  11184.       -- drawn point to the limit concerned.
  11185.       CHECKED_LOCATION := LOCATION ;
  11186.       -- verify limits of X boundries, correct if beyond.
  11187.       if LOCATION.X + MAGNITUDE.X < WC_WINDOW.X.MIN then
  11188.          SIZE.X := WC_WINDOW.X.MIN ;
  11189.       elsif LOCATION.X + MAGNITUDE.X > WC_WINDOW.X.MAX then
  11190.          SIZE.X := WC_WINDOW.X.MAX ;
  11191.       else
  11192.          SIZE.X := LOCATION.X + MAGNITUDE.X ;
  11193.       end if ;
  11194.       if CHECKED_LOCATION.X < WC_WINDOW.X.MIN then
  11195.          CHECKED_LOCATION.X := WC_WINDOW.X.MIN ;
  11196.       elsif CHECKED_LOCATION.X > WC_WINDOW.X.MAX then
  11197.          CHECKED_LOCATION.X := WC_WINDOW.X.MAX ;
  11198.       end if ;
  11199.       -- verify limits of Y boundries, correct if beyond.
  11200.       if LOCATION.Y - MAGNITUDE.Y < WC_WINDOW.Y.MIN then
  11201.          SIZE.Y := WC_WINDOW.Y.MIN ;
  11202.       elsif LOCATION.Y - MAGNITUDE.Y > WC_WINDOW.Y.MAX then
  11203.          SIZE.Y := WC_WINDOW.Y.MAX ;
  11204.       else
  11205.          SIZE.Y := LOCATION.Y - MAGNITUDE.Y ;
  11206.       end if ;
  11207.       if CHECKED_LOCATION.Y < WC_WINDOW.Y.MIN then
  11208.          CHECKED_LOCATION.Y := WC_WINDOW.Y.MIN ;
  11209.       elsif CHECKED_LOCATION.Y > WC_WINDOW.Y.MAX then
  11210.          CHECKED_LOCATION.Y := WC_WINDOW.Y.MAX ;
  11211.       end if ;
  11212.  
  11213.       --  Set current GKS text color to the specified value.
  11214.       L_0A.SET_TEXT_COLOUR_INDEX( COLOR_TO_INDEX( CHARACTER_COLOR ) ) ;
  11215.  
  11216.       --  Temporarily set current GKS background color to the specified value.
  11217.       if BACKGROUND_COLOR /= CURRENT_BACKGROUND_COLOR then
  11218.          COLOR_RECORD.COLOUR := COLOR_TO_INDEX( BACKGROUND_COLOR ) ;
  11219.          NON_STD.ESCAPE( GKS_SPECIFICATION.GRAPHIC_BACKGROUND ,
  11220.                          COLOR_RECORD ) ;
  11221.       end if ;
  11222.  
  11223.       --  Generate the specified NAME at the specified LOCATION by
  11224.       --  calling the GKS TEXT procedure.
  11225.       GKS_LOCATION.X := GKS_SPECIFICATION.WC_TYPE( CHECKED_LOCATION.X ) ;
  11226.       GKS_LOCATION.Y := GKS_SPECIFICATION.WC_TYPE( CHECKED_LOCATION.Y ) ;
  11227.       L_0A.TEXT( GKS_LOCATION, NAME );
  11228.  
  11229.       -- Close the currently open segment.
  11230.       CLOSE_SEGMENT ;
  11231.  
  11232.       --  Set current GKS background color back to its default value.
  11233.       if BACKGROUND_COLOR /= CURRENT_BACKGROUND_COLOR then
  11234.          COLOR_RECORD.COLOUR := COLOR_TO_INDEX( CURRENT_BACKGROUND_COLOR ) ;
  11235.          NON_STD.ESCAPE( GKS_SPECIFICATION.GRAPHIC_BACKGROUND ,
  11236.                          COLOR_RECORD ) ;
  11237.       end if ;
  11238.    end LABEL ;
  11239.  
  11240.  
  11241.    function LOCATION_IN_GRAPHIC_VIEWPORT
  11242.             ( COORDINATE : in GRAPHICS.POINT )
  11243.    return Boolean is
  11244.    -- ======================================================
  11245.    -- Determines if the specified point is located in the
  11246.    -- current graphics viewport area.
  11247.    -- ======================================================
  11248.    begin
  11249.       return ( ( GKS_SPECIFICATION.WC_TYPE( COORDINATE.X ) <=
  11250.                  GRAPHIC_WINDOW_RECTANGLE.X.MAX ) and 
  11251.                ( GKS_SPECIFICATION.WC_TYPE( COORDINATE.X ) >=
  11252.                  GRAPHIC_WINDOW_RECTANGLE.X.MIN ) and 
  11253.                ( GKS_SPECIFICATION.WC_TYPE( COORDINATE.Y ) <=
  11254.                  GRAPHIC_WINDOW_RECTANGLE.Y.MAX ) and 
  11255.                ( GKS_SPECIFICATION.WC_TYPE( COORDINATE.Y ) >=
  11256.                  GRAPHIC_WINDOW_RECTANGLE.Y.MIN ) ) ;
  11257.    end LOCATION_IN_GRAPHIC_VIEWPORT ;
  11258.  
  11259.  
  11260.    procedure MOVE 
  11261.              ( SEGMENT_ID   : in GKS_SPECIFICATION.SEGMENT_NAME ;
  11262.                NEW_LOCATION : in GRAPHICS.POINT ) is
  11263.    -- ======================================================
  11264.    --  Move the specified segment to its new location.
  11265.    -- ======================================================
  11266.       SPECIFIED_LOCATION : GRAPHICS.POINT := NEW_LOCATION ;
  11267.       ESC_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD(
  11268.                    GKS_SPECIFICATION.SEGMENT_MOVEMENT );
  11269.    begin 
  11270.       -- debug aid only
  11271.       if TRACE_PKG.REQUEST_TRACE then
  11272.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.MOVE") ;
  11273.       end if ; 
  11274.  
  11275.       -- Perform a segment move by calling the GKS ESCAPE procedure
  11276.       -- with an escape function identifer of segment move.
  11277.       ESC_RECORD.SEGMENT := SEGMENT_ID ;
  11278.  
  11279.       -- Checks if a point is beyond the boundry limits, if so set the 
  11280.       -- drawn point to the limit concerned.
  11281.       -- verify limits of X boundries, correct if beyond.
  11282.       if NEW_LOCATION.X < WC_WINDOW.X.MIN then
  11283.          SPECIFIED_LOCATION.X := WC_WINDOW.X.MIN ;
  11284.       elsif NEW_LOCATION.X > WC_WINDOW.X.MAX then
  11285.          SPECIFIED_LOCATION.X := WC_WINDOW.X.MAX ;
  11286.       end if ;
  11287.       -- verify limits of Y boundries, correct if beyond.
  11288.       if NEW_LOCATION.Y < WC_WINDOW.Y.MIN then
  11289.          SPECIFIED_LOCATION.Y := WC_WINDOW.Y.MIN ;
  11290.       elsif NEW_LOCATION.Y > WC_WINDOW.Y.MAX then
  11291.          SPECIFIED_LOCATION.Y := WC_WINDOW.Y.MAX ;
  11292.       end if ;
  11293.  
  11294.       ESC_RECORD.POSITION.X :=
  11295.           GKS_SPECIFICATION.WC_TYPE( SPECIFIED_LOCATION.X ) ;
  11296.       ESC_RECORD.POSITION.Y :=
  11297.           GKS_SPECIFICATION.WC_TYPE( SPECIFIED_LOCATION.Y ) ;
  11298.  
  11299.       NON_STD.ESCAPE( GKS_SPECIFICATION.SEGMENT_MOVEMENT,
  11300.                       ESC_RECORD );
  11301.  
  11302.       -- Redraw the graphics area to cover move flaws
  11303.       REFRESH_SCREEN ;
  11304.    end MOVE ;
  11305.  
  11306.  
  11307.    function OPEN_SEGMENT 
  11308.    return GKS_SPECIFICATION.SEGMENT_NAME is
  11309.    -- ===================================================================
  11310.    --  Create and open a segment for graphic output.
  11311.    -- ===================================================================
  11312.       type LOOP_ID_TYPE is ( LOOP_1, LOOP_2 ) ;
  11313.       LOOP_ID       : LOOP_ID_TYPE := LOOP_1 ;
  11314.       FOUND_SEGMENT : GKS_SPECIFICATION.SEGMENT_NAME
  11315.                     := GRAPHICS.NULL_SEGMENT ;
  11316.    begin 
  11317.       -- debug aid only
  11318.       if TRACE_PKG.REQUEST_TRACE then
  11319.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.OPEN_SEGMENT") ;
  11320.       end if ; 
  11321.  
  11322.       -- If a segment is currently open then close the segment.
  11323.       if SEGMENT_IS_OPEN then
  11324.          CLOSE_SEGMENT;
  11325.       end if;
  11326.  
  11327.       -- Loop until an available segment is found; if no segment is
  11328.       -- available then raise the segments exhaused exception.
  11329.       loop
  11330.          if SEGMENT_IS_USED( SEGMENT_SEARCH_INDEX ) = FALSE then
  11331.             FOUND_SEGMENT := SEGMENT_SEARCH_INDEX ;
  11332.             SEGMENT_IS_USED( SEGMENT_SEARCH_INDEX ) := TRUE ;
  11333.             exit ;
  11334.          else
  11335.             if SEGMENT_SEARCH_INDEX >= MAXIMUM_SEGMENT_NUMBER then
  11336.                if LOOP_ID = LOOP_1 then 
  11337.                   SEGMENT_SEARCH_INDEX := GRAPHICS.NULL_SEGMENT ;
  11338.                   LOOP_ID := LOOP_2 ;
  11339.                else
  11340.                   DISPLAY_ERROR ( " UNABLE TO CONTINUE - segment supply exhausted " ) ;
  11341.                   raise GRAPHICS.AVAILABLE_SEGMENTS_EXHAUSTED ;
  11342.                end if ;
  11343.             else
  11344.                SEGMENT_SEARCH_INDEX := SEGMENT_SEARCH_INDEX + 1 ;
  11345.             end if ;
  11346.          end if ;
  11347.       end loop ;
  11348.  
  11349.       CURRENT_SEGMENT := FOUND_SEGMENT ;
  11350.       if TRACE_PKG.REQUEST_TRACE then
  11351.          TRACE_PKG.TRACE("SEGMENT # = " &
  11352.             GKS_SPECIFICATION.SEGMENT_NAME'IMAGE(CURRENT_SEGMENT)) ;
  11353.          TRACE_PKG.TRACE(" ") ;
  11354.       end if ; 
  11355.  
  11356.       -- Open a segment in the GKS with a segment identifier equal to
  11357.       -- the CURRENT_SEGMENT.
  11358.       L_1A.CREATE_SEGMENT(
  11359.            GKS_SPECIFICATION.SEGMENT_NAME( CURRENT_SEGMENT )) ;
  11360.  
  11361.       if TRACE_PKG.REQUEST_TRACE then
  11362.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.OPEN_SEGMENT.END PROCEDURE") ;
  11363.       end if ; 
  11364.       
  11365.       return CURRENT_SEGMENT ;
  11366.    end OPEN_SEGMENT ;
  11367.  
  11368.  
  11369.    procedure PAN
  11370.              ( DIRECTION : in GRAPHICS.PAN_DIRECTION ) is
  11371.    -- ======================================================
  11372.    --  Pan away from the current display.
  11373.    -- ======================================================
  11374.  
  11375.       NEW_WINDOW : BOOLEAN := false;
  11376.    begin 
  11377.       -- debug aid only
  11378.       if TRACE_PKG.REQUEST_TRACE then
  11379.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.PAN") ;
  11380.       end if ; 
  11381.  
  11382.       -- Move the reference point associated with the current display
  11383.       -- as a function of the requested pan direction.  Prior to
  11384.       -- performing the reference point update verify that the pan
  11385.       -- movement can be performed.
  11386.       case DIRECTION is
  11387.  
  11388.          when PAN_LEFT =>
  11389.             -- If the current display can be moved then
  11390.             -- move the display by updating the x component of
  11391.             -- the reference point.
  11392.             if X_REF > RANGE_LOWER then
  11393.                X_REF := X_REF - 1;
  11394.                NEW_WINDOW := true;
  11395.             end if;
  11396.  
  11397.          when PAN_RIGHT =>
  11398.             -- If the current display can be moved then
  11399.             -- move the display by updating the x component of
  11400.             -- the reference point.
  11401.             if ( X_REF + WINDOW_SIZE ) < RANGE_UPPER then
  11402.                X_REF := X_REF + 1;
  11403.                NEW_WINDOW := true; 
  11404.             end if;
  11405.  
  11406.          when PAN_UP =>
  11407.             -- If the current display can be moved then
  11408.             -- move the display by updating the y component of
  11409.             -- the reference point.
  11410.             if Y_REF < RANGE_UPPER then
  11411.                Y_REF := Y_REF + 1;
  11412.                NEW_WINDOW := true; 
  11413.             end if;
  11414.  
  11415.          when PAN_DOWN =>
  11416.             -- If the current display can be moved then
  11417.             -- move the display by updating the y component of
  11418.             -- the reference point.
  11419.             if ( Y_REF - WINDOW_SIZE ) > RANGE_LOWER then
  11420.                Y_REF := Y_REF - 1;
  11421.                NEW_WINDOW := true;
  11422.             end if;
  11423.  
  11424.          when MAX_PAN_LEFT =>
  11425.             -- If the current display can be moved then
  11426.             -- move the display by updating the x component of
  11427.             -- the reference point.
  11428.             if X_REF > RANGE_LOWER then
  11429.                X_REF := RANGE_LOWER ;
  11430.                NEW_WINDOW := true;
  11431.             end if;
  11432.  
  11433.          when MAX_PAN_RIGHT =>
  11434.             -- If the current display can be moved then
  11435.             -- move the display by updating the x component of
  11436.             -- the reference point.
  11437.             if ( X_REF + WINDOW_SIZE ) < RANGE_UPPER then
  11438.                X_REF := RANGE_UPPER - WINDOW_SIZE ;
  11439.                NEW_WINDOW := true; 
  11440.             end if;
  11441.  
  11442.          when MAX_PAN_UP =>
  11443.             -- If the current display can be moved then
  11444.             -- move the display by updating the y component of
  11445.             -- the reference point.
  11446.             if Y_REF < RANGE_UPPER then
  11447.                Y_REF := RANGE_UPPER ;
  11448.                NEW_WINDOW := true; 
  11449.             end if;
  11450.  
  11451.          when MAX_PAN_DOWN =>
  11452.             -- If the current display can be moved then
  11453.             -- move the display by updating the y component of
  11454.             -- the reference point.
  11455.             if ( Y_REF - WINDOW_SIZE ) > RANGE_LOWER then
  11456.                Y_REF := WINDOW_SIZE + RANGE_LOWER ;
  11457.                NEW_WINDOW := true;
  11458.             end if;
  11459.  
  11460.       end case;
  11461.  
  11462.       --  If the pan movement can be performed then generate a
  11463.       --  point list defining the new display area from the x and
  11464.       --  y components of the reference point and the current
  11465.       --  window size.
  11466.       if NEW_WINDOW then
  11467.  
  11468.          -- Perform a pan move by calling the GKS ESCAPE procedure
  11469.          -- with an escape function identifer of SET_TERMINAL_WINDOW
  11470.          NEW_GRAPHICS_WINDOW ;
  11471.  
  11472.       -- If window cannot be drawn notify the operator
  11473.       else
  11474.          DISPLAY_ERROR( " current window is on display boundary " ) ;
  11475.       end if;
  11476.    end PAN;
  11477.  
  11478.  
  11479.    procedure PAN_AND_ZOOM_DISPLAY
  11480.              ( MODE : in MODE_TYPE ) is
  11481.    -- ======================================================
  11482.    --  Display the Pan and Zoom relation view.
  11483.    -- ======================================================
  11484.       WINDOW_VIEWPORT_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD
  11485.                                ( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT );
  11486.       WINDOW_SELECT_RECORD   : GKS_SPECIFICATION.ESCAPE_RECORD
  11487.                                ( GKS_SPECIFICATION.SELECT_WINDOW );
  11488.    begin
  11489.       -- debug aid only
  11490.       if TRACE_PKG.REQUEST_TRACE then
  11491.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.PAN_AND_ZOOM_DISPLAY") ;
  11492.       end if ; 
  11493.  
  11494.       -- Set current window to graphic area.
  11495.       SELECT_WINDOW ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  11496.  
  11497.       -- Initialize the terminal space window to view for the graphic display.
  11498.       WINDOW_VIEWPORT_RECORD.VIEW_WINDOW_ID   :=
  11499.           WINDOW_TO_INDEX ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  11500.       WINDOW_VIEWPORT_RECORD.VIEW_RECTANGLE   := 
  11501.          GRAPHICS_SCREEN_RECTANGLE ;
  11502.       case MODE is
  11503.          when ON  => -- Set up the pan and zoom display with the
  11504.                      -- full world coordinate system in view and
  11505.                      -- the current view bounded by a hilited box.
  11506.  
  11507.             -- set graphic viewport to full wc system
  11508.             WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE :=
  11509.                WORLD_WINDOW_RECTANGLE ;
  11510.             NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11511.                             WINDOW_VIEWPORT_RECORD ) ;
  11512.             -- display pan_and_zoom box in hilited color
  11513.                -- set visibility on
  11514.             SET_SEGMENT_VISIBILITY( PAN_ZOOM_BOX,
  11515.                                     GKS_SPECIFICATION.SEGMENT_VISIBILITY'
  11516.                                        ( VISIBLE ) ) ;
  11517.                -- set the hilite on
  11518.             HILITE_SEGMENT( PAN_ZOOM_BOX, HIGHLIGHTED ) ;
  11519.             
  11520.          when OFF => -- Set the graphic viewport to the current
  11521.                      -- pan zoom selection.
  11522.  
  11523.             -- set pan_and_zoom box invisible
  11524.                -- set the hilite off
  11525.             HILITE_SEGMENT( PAN_ZOOM_BOX, NORMAL ) ;
  11526.                -- set visibility off
  11527.             SET_SEGMENT_VISIBILITY( PAN_ZOOM_BOX,
  11528.                                     GKS_SPECIFICATION.INVISIBLE ) ;
  11529.             -- return graphics viewport to current view setting
  11530.             L_0A.SET_WINDOW(
  11531.                GKS_SPECIFICATION.TRANSFORMATION_NUMBER( 1 ),
  11532.                GRAPHIC_WINDOW_RECTANGLE ) ;
  11533.             WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE :=
  11534.                GRAPHIC_WINDOW_RECTANGLE ;
  11535.             NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11536.                             WINDOW_VIEWPORT_RECORD ) ;
  11537.             -- Generate a new abort rectangle
  11538.             DRAW_ABORT_ICON ;
  11539.  
  11540.       end case ; -- MODE
  11541.  
  11542.       -- Redraw the graphics area to cover flaws
  11543. ---      REFRESH_SCREEN ;
  11544.       -- Set current window to menu area.
  11545.       SELECT_WINDOW ( GRAPHICS.MENU_VIEW_PORT ) ;
  11546.  
  11547.    end PAN_AND_ZOOM_DISPLAY ;
  11548.  
  11549.  
  11550.    function PICK_SEGMENT 
  11551.    return GKS_SPECIFICATION.SEGMENT_NAME is
  11552.    -- ===================================================================
  11553.    --  Ask the operator to pick a graphical object and return its
  11554.    --  SEGMENT_ID.
  11555.    -- ===================================================================
  11556.       SEGMENT_ID : GKS_SPECIFICATION.SEGMENT_NAME ;
  11557.       PICK_STATUS : GKS_SPECIFICATION.PICK_REQUEST_STATUS ;
  11558.       PICKED_OBJECT : GKS_SPECIFICATION.PICK_ID ;
  11559.    begin 
  11560.       -- debug aid only
  11561.       if TRACE_PKG.REQUEST_TRACE then
  11562.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.PICK_SEGMENT") ;
  11563.       end if ; 
  11564.  
  11565.       -- Initialize the GKS pick device;
  11566.       -- retrieve the segment identifier from the GKS pick device.
  11567.       L_1B.REQUEST_PICK( WORK_STATION, DEVICE, PICK_STATUS,
  11568.                          SEGMENT_ID, PICKED_OBJECT ) ;
  11569.  
  11570.       return SEGMENT_ID ;
  11571.    end PICK_SEGMENT ;
  11572.  
  11573.  
  11574.    procedure PLACE_CURSOR
  11575.              ( POSITION : in GRAPHICS.POINT ) is
  11576.    -- ===========================================================
  11577.    -- This procedure places the graphics cursor at the specified
  11578.    -- location on the screen ;
  11579.    -- ===========================================================
  11580.       GKS_POSITION : GKS_SPECIFICATION.WC.POINT ;
  11581.    begin 
  11582.       -- debug aid only
  11583.       if TRACE_PKG.REQUEST_TRACE then
  11584.          TRACE_PKG.TRACE("GRAPHIC_DRIVER.PLACE_CURSOR") ;
  11585.       end if ; 
  11586.  
  11587.       GKS_POSITION.X := GKS_SPECIFICATION.WC_TYPE( POSITION.X ) ;
  11588.       GKS_POSITION.Y := GKS_SPECIFICATION.WC_TYPE( POSITION.Y ) ;
  11589.  
  11590.       L_0B.INITIALISE_LOCATOR( WORK_STATION, DEVICE, TRANSFORM,
  11591.                                GKS_POSITION, ECHO_AREA, LOCATOR_RECORD ) ;
  11592.    end PLACE_CURSOR ;
  11593.  
  11594.  
  11595.    procedure PRINT_SCREEN is
  11596.    -- ==========================================================
  11597.    --  This procedure prints the visible contents of the graphics
  11598.    --  viewport to the local terminal printer.
  11599.    -- ===========================================================
  11600.       PRINT_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD( PRINT_WINDOW ) ;
  11601.       WINDOW_VIEWPORT_RECORD : GKS_SPECIFICATION.ESCAPE_RECORD
  11602.                                ( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT );
  11603.       PRINT_SCREEN_RECTANGLE : GKS_SPECIFICATION.WC.RECTANGLE_LIMITS := 
  11604.          ( X => ( MIN =>  1_170.0,
  11605.                   MAX => 31_597.0 ),
  11606.            Y => ( MIN =>      1.0,
  11607.                   MAX => 32_767.0 ) ) ;
  11608.    begin 
  11609.       -- debug aid only
  11610.       if TRACE_PKG.REQUEST_TRACE then
  11611.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.PRINT_SCREEN") ;
  11612.       end if ; 
  11613.  
  11614.       -- set the window to print
  11615.       PRINT_RECORD.WINDOW := WINDOW_TO_INDEX( GRAPH_VIEW_PORT ) ;
  11616.       -- set the current viewport to graphics
  11617.       SELECT_WINDOW ( GRAPH_VIEW_PORT ) ;
  11618.       -- redefine graphics viewport to full size without altering 
  11619.       --   aspect ratio
  11620.       WINDOW_VIEWPORT_RECORD.VIEW_WINDOW_ID   :=
  11621.          WINDOW_TO_INDEX ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  11622.       WINDOW_VIEWPORT_RECORD.VIEW_RECTANGLE   := 
  11623.          PRINT_SCREEN_RECTANGLE ;
  11624.       WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE := 
  11625.          GRAPHIC_WINDOW_RECTANGLE ;
  11626.       NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11627.                       WINDOW_VIEWPORT_RECORD ) ;
  11628.       -- print the viewport contents
  11629.       NON_STD.ESCAPE( GKS_SPECIFICATION.PRINT_WINDOW, PRINT_RECORD ) ;
  11630.       -- redefine graphics viewport to predefined size
  11631.       WINDOW_VIEWPORT_RECORD.VIEW_WINDOW_ID   :=
  11632.          WINDOW_TO_INDEX ( GRAPHICS.GRAPH_VIEW_PORT ) ;
  11633.       WINDOW_VIEWPORT_RECORD.VIEW_RECTANGLE   := 
  11634.          GRAPHICS_SCREEN_RECTANGLE ;
  11635.       WINDOW_VIEWPORT_RECORD.WINDOW_RECTANGLE := 
  11636.          GRAPHIC_WINDOW_RECTANGLE ;
  11637.       NON_STD.ESCAPE( GKS_SPECIFICATION.MAP_WINDOW_TO_VIEWPORT ,
  11638.                       WINDOW_VIEWPORT_RECORD ) ;
  11639.       -- redraw the graphics viewport 
  11640.       REFRESH_SCREEN ;
  11641.       -- set the current viewport back to menu
  11642.       SELECT_WINDOW ( MENU_VIEW_PORT ) ;
  11643.       -- redraw the menu viewport 
  11644.       REFRESH_SCREEN ;
  11645.    end PRINT_SCREEN ;
  11646.  
  11647.  
  11648.    procedure REFRESH_SCREEN is
  11649.    -- ===================================================================
  11650.    --  This procedure rewrites the entire screen with
  11651.    --  the contents of the current  window on the graphics
  11652.    --  page.  
  11653.    -- ===================================================================
  11654.    begin 
  11655.       -- debug aid only
  11656.       if TRACE_PKG.REQUEST_TRACE then
  11657.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.REFRESH_SCREEN") ;
  11658.       end if ; 
  11659.  
  11660.       --  Redraw all visible segments by calling the GKS 
  11661.       --  REDRAW_ALL_SEGMENTS_ON_WORKSTATION procedure.
  11662.       L_1A.REDRAW_ALL_SEGMENTS_ON_WORKSTATION( ACTIVE_TERMINAL ) ;
  11663.    end REFRESH_SCREEN ;
  11664.  
  11665.    procedure SELECT_WINDOW 
  11666.              ( WINDOW : in GRAPHICS.WINDOW_TYPE ) is
  11667.    -- ===================================================================
  11668.    --  Set the currently active window.
  11669.    -- ===================================================================
  11670.       CENTER_VIEW : GRAPHICS.POINT ;
  11671.       ESC_RECORD  : GKS_SPECIFICATION.ESCAPE_RECORD
  11672.                     ( GKS_SPECIFICATION.SELECT_WINDOW );
  11673.    begin 
  11674.       -- debug aid only
  11675.       if TRACE_PKG.REQUEST_TRACE then
  11676.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.SELECT_WINDOW") ;
  11677.       end if ; 
  11678.  
  11679.       --  Select the display window ( graphic, menu, text ) to be used
  11680.       --  for subsequent graphics operation.
  11681.       ESC_RECORD.WINDOW := WINDOW_TO_INDEX ( WINDOW ) ;
  11682.  
  11683.       NON_STD.ESCAPE( GKS_SPECIFICATION.SELECT_WINDOW, ESC_RECORD );
  11684.  
  11685.       -- place graphics cursor in center of window for graphic window
  11686.       if WINDOW = GRAPH_VIEW_PORT then
  11687.          CENTER_VIEW.X := GRAPHICS.WC(
  11688.                           GRAPHIC_WINDOW_RECTANGLE.X.MIN + 
  11689.                         ( GRAPHIC_WINDOW_RECTANGLE.X.MAX -
  11690.                           GRAPHIC_WINDOW_RECTANGLE.X.MIN ) / 2.0 ) ;
  11691.          CENTER_VIEW.Y := GRAPHICS.WC(
  11692.                           GRAPHIC_WINDOW_RECTANGLE.Y.MIN + 
  11693.                         ( GRAPHIC_WINDOW_RECTANGLE.Y.MAX -
  11694.                           GRAPHIC_WINDOW_RECTANGLE.Y.MIN ) / 2.0 ) ;
  11695.          PLACE_CURSOR( CENTER_VIEW ) ; 
  11696.       end if ;
  11697.    end SELECT_WINDOW ;
  11698.  
  11699.    procedure SET_ABORT_CAPABILITY(
  11700.              ABORT_REQUEST : GRAPHICS.MODE_TYPE ) is
  11701.    -- ===================================================================
  11702.    --  Set the abort capability on or off.  If the abort capability is on
  11703.    --  all locator points returned from the terminal will be tested for
  11704.    --  an abort request.
  11705.    -- ===================================================================
  11706.    begin
  11707.  
  11708.       -- If abort capability was requested then set the abort rectangle
  11709.       -- visible and set boolean to show abort capability is active.
  11710.       if ABORT_REQUEST = GRAPHICS.ON then
  11711.          L_1A.SET_VISIBILITY( ABORT_SEGMENT, GKS_SPECIFICATION.VISIBLE );
  11712.          ABORT_CAPABILITY_ACTIVE := TRUE ;
  11713.  
  11714.       -- Else set abort rectangle invisible and set capability inactive.
  11715.       else
  11716.          L_1A.SET_VISIBILITY( ABORT_SEGMENT, GKS_SPECIFICATION.INVISIBLE );
  11717.          ABORT_CAPABILITY_ACTIVE := FALSE ;
  11718.       end if ;
  11719.  
  11720.    end SET_ABORT_CAPABILITY ;
  11721.  
  11722.  
  11723.  
  11724.    procedure SET_CHARACTER_SIZE_ATTRIBUTES
  11725.              ( HEIGHT  : in GRAPHICS.WC ;
  11726.                WIDTH   : in GRAPHICS.WC ;
  11727.                SPACING : in GRAPHICS.WC ;
  11728.                FONT    : in GKS_SPECIFICATION.TEXT_PRECISION
  11729.                          := GKS_SPECIFICATION.STROKE_PRECISION ) is
  11730.    -- ===================================================================
  11731.    --  Set the character height, the character width, and the spacing
  11732.    --  between characters for subsequent graphic text output.
  11733.    -- ===================================================================
  11734.       GKS_WIDTH     : constant GKS_SPECIFICATION.WC.MAGNITUDE := 0.01 ;
  11735.       SCREEN_HEIGHT : constant GKS_SPECIFICATION.WC.MAGNITUDE :=
  11736.                       GKS_SPECIFICATION.WC.MAGNITUDE(
  11737.                       GRAPHIC_WINDOW_RECTANGLE.Y.MAX -
  11738.                       GRAPHIC_WINDOW_RECTANGLE.Y.MIN ) ;
  11739.       GKS_HEIGHT    : constant GKS_SPECIFICATION.WC.MAGNITUDE :=
  11740.                       GKS_SPECIFICATION.WC.MAGNITUDE( HEIGHT ) /
  11741.                       SCREEN_HEIGHT ;
  11742.       GKS_EXPANSION : constant GKS_SPECIFICATION.CHAR_EXPANSION :=
  11743.                       GKS_SPECIFICATION.CHAR_EXPANSION( WIDTH ) /
  11744.                       GKS_SPECIFICATION.CHAR_EXPANSION(
  11745.                       SCREEN_HEIGHT * GKS_WIDTH ) ;
  11746.       GKS_SPACING   : constant GKS_SPECIFICATION.CHAR_SPACING :=
  11747.                       GKS_SPECIFICATION.CHAR_SPACING( SPACING ) /
  11748.                       GKS_SPECIFICATION.CHAR_SPACING( SCREEN_HEIGHT ) ;
  11749.    begin
  11750.  
  11751.       -- reset the font precision if necessary
  11752.       if FONT /= CURRENT_FONT then
  11753.          CURRENT_FONT := FONT ;
  11754.          -- set font type to current
  11755.          L_0A.SET_TEXT_FONT_AND_PRECISION( ( 1, CURRENT_FONT ) ) ;
  11756.       end if ;
  11757.  
  11758.       -- Call GKS to set the character height, width, and spacing.
  11759.       L_0A.SET_CHAR_HEIGHT( GKS_HEIGHT );
  11760.       L_0A.SET_CHAR_EXPANSION_FACTOR( GKS_EXPANSION );
  11761.       L_0A.SET_CHAR_SPACING( GKS_SPACING );
  11762.  
  11763.    end SET_CHARACTER_SIZE_ATTRIBUTES ;
  11764.  
  11765.  
  11766.    procedure SET_DRAWING_PRIORITY
  11767.              ( PRIORITY : in PRIORITY_TYPE ) is
  11768.    -- ===================================================================
  11769.    --  Set the visible priority of new segments.
  11770.    -- ===================================================================
  11771.    begin 
  11772.       -- debug aid only
  11773.       if TRACE_PKG.REQUEST_TRACE then
  11774.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.SET_DRAWING_PRIORITY") ;
  11775.       end if ; 
  11776.  
  11777.       CURRENT_PRIORITY := PRIORITY ;
  11778.    end SET_DRAWING_PRIORITY ;
  11779.  
  11780.  
  11781.    procedure SET_SEGMENT_VISIBILITY 
  11782.              ( SEGMENT : in GKS_SPECIFICATION.SEGMENT_NAME ;
  11783.                MODE    : in GKS_SPECIFICATION.SEGMENT_VISIBILITY ) is
  11784.    -- ===================================================================
  11785.    --  Change the segment visibility.
  11786.    -- ===================================================================
  11787.    begin 
  11788.       -- debug aid only
  11789.       if TRACE_PKG.REQUEST_TRACE then
  11790.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.SET_SEGMENT_VISIBILITY") ;
  11791.       end if ; 
  11792.  
  11793.       -- Set the specified segment visible or via a call to the GKS
  11794.       -- SET_VISIBILITY procedure.
  11795.       L_1A.SET_VISIBILITY( SEGMENT, MODE ) ;
  11796.  
  11797.    end SET_SEGMENT_VISIBILITY ;
  11798.  
  11799.  
  11800.    procedure TERMINATE_GRAPHICS_MODE is
  11801.    -- ========================================================
  11802.    --  Restore the device to VT100 mode.
  11803.    -- ========================================================
  11804.    begin 
  11805.       -- debug aid only
  11806.       if TRACE_PKG.REQUEST_TRACE then
  11807.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.TERMINATE_GRAPHICS_MODE") ;
  11808.       end if ; 
  11809.  
  11810.       -- Close the workstation.
  11811.       L_0A.CLOSE_WORKSTATION( ACTIVE_TERMINAL ) ;
  11812.  
  11813.       -- Close the GKS.
  11814.       L_0A.CLOSE_GKS ;
  11815.  
  11816.    end TERMINATE_GRAPHICS_MODE ;
  11817.  
  11818.    procedure UPDATE_COLOR_ATTRIBUTE
  11819.              ( DRAWING_ENTITY : in  GRAPHICS.GRAPHIC_ENTITY ;
  11820.                NEW_COLOR      : in  GRAPHICS.COLOR_TYPE ) is
  11821.    -- ======================================================
  11822.    --  Update the value of the currently defined color
  11823.    --  attribute for the specified graphic entity.
  11824.    -- ======================================================
  11825.    begin 
  11826.       -- debug aid only
  11827.       if TRACE_PKG.REQUEST_TRACE then
  11828.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.UPDATE_COLOR_ATTRIBUTE") ;
  11829.       end if ; 
  11830.  
  11831.       GRAPHICS.ENTITY_COLOR( DRAWING_ENTITY ) := NEW_COLOR ;
  11832.    end UPDATE_COLOR_ATTRIBUTE ;
  11833.  
  11834.    procedure UPDATE_LINE_ATTRIBUTE
  11835.              ( DRAWING_ENTITY : in  GRAPHICS.GRAPHIC_ENTITY ;
  11836.                NEW_LINE       : in  GRAPHICS.LINE_TYPE ) is
  11837.    -- ======================================================
  11838.    --  Update the value of the currently defined line
  11839.    --  attribute for the specified graphic entity.
  11840.    -- ======================================================
  11841.    begin 
  11842.       -- debug aid only
  11843.       if TRACE_PKG.REQUEST_TRACE then
  11844.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.UPDATE_LINE_ATTRIBUTE.") ;
  11845.       end if ; 
  11846.  
  11847.       GRAPHICS.ENTITY_LINE( DRAWING_ENTITY ) := NEW_LINE ;
  11848.    end UPDATE_LINE_ATTRIBUTE ;
  11849.  
  11850.    procedure UPDATE_SHAPE_ATTRIBUTE
  11851.              ( DRAWING_ENTITY : in  GRAPHICS.FIGURE_ENTITY ;
  11852.                NEW_SHAPE      : in  GRAPHICS.SHAPE_TYPE ) is
  11853.    -- ======================================================
  11854.    --  Update the value of the currently defined shape
  11855.    --  attribute for the specified graphic entity.
  11856.    -- ======================================================
  11857.    begin 
  11858.       -- debug aid only
  11859.       if TRACE_PKG.REQUEST_TRACE then
  11860.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.UPDATE_SHAPE_ATTRIBUTE") ;
  11861.       end if ; 
  11862.  
  11863.    GRAPHICS.ENTITY_SHAPE( DRAWING_ENTITY ) := NEW_SHAPE ;
  11864.    end UPDATE_SHAPE_ATTRIBUTE ;
  11865.  
  11866.    procedure ZOOM
  11867.              ( DIRECTION : in GRAPHICS.ZOOM_DIRECTION ) is
  11868.    -- ======================================================
  11869.    --  Zoom in or out from the current display.
  11870.    -- ======================================================
  11871.       NEW_WINDOW : BOOLEAN := false;
  11872.  
  11873.    begin
  11874.       -- debug aid only
  11875.       if TRACE_PKG.REQUEST_TRACE then
  11876.          TRACE_PKG.TRACE("GRAPHICS_DRIVER.ZOOM") ;
  11877.       end if ; 
  11878.  
  11879.       -- If zoom direction is zoom out and window size is not maximum
  11880.       -- window size then determine new window size and reference point.
  11881.       case DIRECTION is
  11882.          when ZOOM_OUT =>
  11883.             if WINDOW_SIZE /= ( RANGE_UPPER ) then
  11884.                WINDOW_SIZE := WINDOW_SIZE + 2;
  11885.                X_REF := X_REF - 1;
  11886.                Y_REF := Y_REF + 1;
  11887.  
  11888.                -- Verify that new screen does not exceed boundaries.
  11889.                if X_REF < RANGE_LOWER then
  11890.                   X_REF := RANGE_LOWER;
  11891.                end if;
  11892.                if ( X_REF + WINDOW_SIZE ) > RANGE_UPPER then
  11893.                   X_REF := RANGE_UPPER - WINDOW_SIZE;
  11894.                end if;
  11895.                if Y_REF > RANGE_UPPER then
  11896.                   Y_REF := RANGE_UPPER;
  11897.                end if;
  11898.                if ( Y_REF - WINDOW_SIZE ) < RANGE_LOWER then
  11899.                   Y_REF := WINDOW_SIZE;
  11900.                end if;
  11901.  
  11902.                NEW_WINDOW := true;
  11903.             end if;
  11904.  
  11905.          -- If zoom direction is zoom in and window size is not minimum
  11906.          -- window size then determine new window size and reference point.
  11907.          when ZOOM_IN =>
  11908.             if WINDOW_SIZE /= ( RANGE_LOWER + 2 ) then
  11909.                WINDOW_SIZE := WINDOW_SIZE - 2;
  11910.                X_REF := X_REF + 1;
  11911.                Y_REF := Y_REF - 1;
  11912.                NEW_WINDOW := true;
  11913.             end if;
  11914.  
  11915.          -- If zoom direction is max zoom out and window size is not maximum
  11916.          -- window size then set max window size and reference point.
  11917.          when MAX_ZOOM_OUT =>
  11918.             if WINDOW_SIZE /= RANGE_UPPER then
  11919.                WINDOW_SIZE := RANGE_UPPER ;
  11920.                X_REF := RANGE_UPPER - WINDOW_SIZE;
  11921.                Y_REF := WINDOW_SIZE;
  11922.  
  11923.                NEW_WINDOW := true;
  11924.             end if;
  11925.  
  11926.       -- If zoom direction is max zoom in and window size is not minimum
  11927.       -- window size then set min window size and reference point.
  11928.          when MAX_ZOOM_IN =>
  11929.             while WINDOW_SIZE /= RANGE_LOWER + 2 loop
  11930.                WINDOW_SIZE := WINDOW_SIZE - 2;
  11931.                X_REF := X_REF + 1;
  11932.                Y_REF := Y_REF - 1;
  11933.                NEW_WINDOW := true;
  11934.             end loop ;
  11935.       end case ; -- DIRECTION
  11936.  
  11937.       --  If the zoom on the current display can be performed
  11938.       --  then generate a point list defining the new display
  11939.       --  area from the x and y components of the reference point
  11940.       --  and the current window size.
  11941.       if NEW_WINDOW then
  11942.  
  11943.          -- Perform a zoom move by calling the GKS ESCAPE procedure
  11944.          -- with an escape function identifer of SET_TERMINAL_VIEWPORT
  11945.          NEW_GRAPHICS_WINDOW ;
  11946.  
  11947.       -- If window cannot be drawn notify the operator
  11948.       else
  11949.          DISPLAY_ERROR( " current window is on display boundary " ) ;
  11950.       end if;
  11951.    end ZOOM;
  11952.  
  11953.  
  11954. end GRAPHIC_DRIVER ;
  11955. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11956. --mmi_parameters_spec.ada
  11957. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  11958. -- version 86-01-07 09:30 by RAM
  11959.  
  11960. with SYSTEM ;
  11961. with VIRTUAL_TERMINAL_INTERFACE ;
  11962. with GKS_SPECIFICATION ;
  11963. with GRAPHICS_DATA ;
  11964. with GRAPHIC_DRIVER ;
  11965.  
  11966. package MMI_PARAMETERS is
  11967. -- ==============================================================
  11968. --
  11969. --  This package declares the parameters (types and objects)
  11970. --  used to implement the Man-Machine Interface.  The parameters
  11971. --  are a key part of the interaction between the MMI control
  11972. --  routines and the GRAPHICS_DRIVER.
  11973. --  
  11974. --
  11975. -- ===============================================================
  11976.  
  11977.  
  11978.    subtype FORMAT_FCT  is VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION ;
  11979.    subtype CURSOR_ADDR is VIRTUAL_TERMINAL_INTERFACE.CURSOR_ADDRESS ;
  11980.    subtype ROW_NO      is VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE ;
  11981.    subtype COL_NO      is VIRTUAL_TERMINAL_INTERFACE.COLUMN_TYPE ;
  11982.  
  11983.    -----------------------------------------------------
  11984.    -- possible operations to be performed on segments
  11985.    -- by the MMI
  11986.    -----------------------------------------------------
  11987.    type SEGMENT_OPS_TYPE is 
  11988.         ( HILITED ,      -- hilite the segment
  11989.           DELETED ,      -- delete the segment
  11990.           RESTORED ) ;   -- restore the segment after hiliting
  11991.  
  11992.    -----------------------------------------------------
  11993.    -- list of GRAPHICS_GENERATOR icons used in each menu
  11994.    --   *** order of icons is critical do not alter ***
  11995.    -----------------------------------------------------
  11996.    type COMMAND_TYPE is (
  11997.       -- commands common to menus
  11998.          MENU_LABEL ,
  11999.          HELP_CMD ,
  12000.          BACKUP_CMD ,
  12001.          PAN_ZOOM_CMD ,
  12002.          RESTART_CMD ,
  12003.  
  12004.       -- commands in MAIN_MENU         
  12005.          DESIGN_CMD ,
  12006.          ATTRIBUTES_CMD ,
  12007.          GEN_PDL_CMD ,
  12008.          READ_FILE_CMD ,
  12009.          WRITE_FILE_CMD ,
  12010.          PRINT_CMD ,
  12011.          QUIT_CMD ,
  12012.          FINISHED_CMD ,
  12013.  
  12014.       -- commands in DESIGN_MENU
  12015.          VIRT_PACKAGE_CMD ,
  12016.          PACKAGE_CMD ,
  12017.          PROCEDURE_CMD ,
  12018.          FUNCTION_CMD ,
  12019.          TASK_CMD ,
  12020.          ENTRY_PT_CMD ,
  12021.          BODY_CMD ,
  12022.          ANNOTATION_CMD ,
  12023.          CALL_CONNECT_CMD ,
  12024.          DATA_CONNECT_CMD ,
  12025.          EXPORT_CONNECT_CMD ,
  12026.          DELETE_CONNECT_CMD ,
  12027.          DELETE_CMD ,
  12028.          RESIZE_CMD ,
  12029.          MOVE_CMD ,
  12030.          MODIFY_CMD ,
  12031.  
  12032.       -- commands in PAN_ZOOM_MENU
  12033.          PAN_UP_CMD ,
  12034.          PAN_DOWN_CMD ,
  12035.          PAN_LEFT_CMD ,
  12036.          PAN_RIGHT_CMD ,
  12037.          ZOOM_IN_CMD ,
  12038.          ZOOM_OUT_CMD ,
  12039.          MAX_PAN_UP_CMD ,
  12040.          MAX_PAN_DOWN_CMD ,
  12041.          MAX_PAN_LEFT_CMD ,
  12042.          MAX_PAN_RIGHT_CMD ,
  12043.          MAX_ZOOM_IN_CMD ,
  12044.          MAX_ZOOM_OUT_CMD ,
  12045.  
  12046.       -- commands in ATTRIBUTES_MENU         
  12047.          A_VIRT_PACKAGE_CMD ,
  12048.          A_PACKAGE_CMD ,
  12049.          A_SUBPROGRAM_CMD ,
  12050.          A_TASK_CMD ,
  12051.  
  12052.          A_CALL_CONNECT_CMD ,
  12053.          A_DATA_CONNECT_CMD ,
  12054.          A_EXPORT_CONNECT_CMD ,
  12055.  
  12056.  
  12057.       -- commands in ANNOTATING_MENU         
  12058.          EXPORT_PROC_CMD ,
  12059.          EXPORT_FUNC_CMD ,
  12060.          EXPORT_TASK_ENTRY_CMD ,
  12061.          EXPORT_TYPE_CMD ,
  12062.          EXPORT_OBJ_CMD ,
  12063.          EXPORT_EXCEPT_CMD ,
  12064.          IMPORT_VP_CMD ,
  12065.          IMPORT_PKG_CMD ,
  12066.          IMPORT_PROC_CMD ,
  12067.          IMPORT_FUNC_CMD ,
  12068.          IE_CALL_CONNECT_CMD ,
  12069.          IE_DATA_CONNECT_CMD ,
  12070.          IE_EXPORT_CONNECT_CMD ,
  12071.  
  12072.       -- commands in DELETE_MENU         
  12073.          CANCEL_CMD ,
  12074.          CONFIRM_CMD ,
  12075.  
  12076.       -- commands in COLOR_LINE_MENU
  12077.          GREEN_CMD ,
  12078.          BLUE_CMD ,
  12079.          VIOLET_CMD ,
  12080.          RED_CMD ,
  12081.          ORANGE_CMD ,
  12082.          YELLOW_CMD ,
  12083.          BLACK_CMD ,
  12084.  
  12085.          SOLID_CMD ,
  12086.          DASHED_CMD ,
  12087.          DOTTED_CMD ,
  12088.  
  12089.       -- commands in GENERIC_MENU         
  12090.          NON_GENERIC_CMD ,
  12091.          GENERIC_DECL_CMD ,
  12092.          GENERIC_INST_CMD ,
  12093.  
  12094.       -- commands in PARAMETER_STATUS_MENU
  12095.          HAS_PARAMETERS_CMD ,
  12096.          NO_PARAMETERS_CMD ,
  12097.  
  12098.       -- commands in CALL_STATUS_MENU
  12099.          UNCONDITIONAL_CMD ,
  12100.          CONDITIONAL_CMD ,
  12101.          TIMED_CMD ,
  12102.  
  12103.       -- commands in ENTRY_POINT_STATUS_MENU
  12104.          UNGUARDED_CMD ,
  12105.          GUARDED_CMD ,
  12106.  
  12107.       -- commands in PDL_STATUS_MENU
  12108.          WITH_SUPPORT_CMD ,
  12109.          NO_SUPPORT_CMD ,
  12110.  
  12111.       -- commands in NULL_MENU         
  12112.          NULL_CMD ) ;
  12113.  
  12114.    subtype MAIN_MENU_CMD          is COMMAND_TYPE range 
  12115.                                   DESIGN_CMD..FINISHED_CMD ;
  12116.    subtype DESIGN_MENU_CMD        is COMMAND_TYPE range
  12117.                                   VIRT_PACKAGE_CMD..MODIFY_CMD ;
  12118.    subtype PAN_ZOOM_MENU_CMD      is COMMAND_TYPE range 
  12119.                                   PAN_UP_CMD..ZOOM_OUT_CMD ;
  12120.    subtype ATTRIBUTES_MENU_CMD    is COMMAND_TYPE range 
  12121.                                   A_VIRT_PACKAGE_CMD..A_EXPORT_CONNECT_CMD ;
  12122.    subtype ANNOTATING_MENU_CMD    is COMMAND_TYPE range 
  12123.                                   EXPORT_PROC_CMD..IE_EXPORT_CONNECT_CMD ;
  12124.    subtype DELETE_MENU_CMD        is COMMAND_TYPE range 
  12125.                                   CANCEL_CMD..CONFIRM_CMD ;
  12126.    subtype COLOR_LINE_MENU_CMD    is COMMAND_TYPE range
  12127.                                   GREEN_CMD..DOTTED_CMD ;
  12128.    subtype GENERIC_MENU_CMD       is COMMAND_TYPE range 
  12129.                                   NON_GENERIC_CMD..GENERIC_INST_CMD ;
  12130.    subtype PARAMETER_STATUS_MENU_CMD   is COMMAND_TYPE range
  12131.                                   HAS_PARAMETERS_CMD..NO_PARAMETERS_CMD ;
  12132.    subtype CALL_STATUS_MENU_CMD        is COMMAND_TYPE range
  12133.                                   UNCONDITIONAL_CMD..TIMED_CMD ;
  12134.    subtype ENTRY_POINT_STATUS_MENU_CMD is COMMAND_TYPE range
  12135.                                   UNGUARDED_CMD..GUARDED_CMD ;
  12136.    subtype PDL_STATUS_MENU_CMD is COMMAND_TYPE range
  12137.                                   WITH_SUPPORT_CMD..NO_SUPPORT_CMD ;
  12138.    subtype NULL_MENU_CMD          is COMMAND_TYPE range
  12139.                                   NULL_CMD..NULL_CMD ;
  12140.  
  12141.    type MENU_ID is ( MAIN_MENU ,
  12142.                      DESIGN_MENU ,
  12143.                      PAN_ZOOM_MENU ,
  12144.                      ATTRIBUTES_MENU ,
  12145.                      ANNOTATING_MENU ,
  12146.                      DELETE_MENU ,
  12147.                      COLOR_LINE_MENU ,
  12148.                      GENERIC_MENU ,
  12149.                      PARAMETER_STATUS_MENU ,
  12150.                      CALL_STATUS_MENU ,
  12151.                      ENTRY_POINT_STATUS_MENU ,
  12152.                      PDL_STATUS_MENU ,
  12153.                      NULL_MENU ) ;
  12154.  
  12155.    -----------------------------------------------------------------
  12156.    --  The identifiers for icon locations.
  12157.    -----------------------------------------------------------------
  12158.    subtype ICON_ID is POSITIVE range 1..20 ;
  12159.  
  12160.    -----------------------------------------------------------------
  12161.    --  This table allows the translation of icon ID's into commands.
  12162.    -----------------------------------------------------------------
  12163.    MAX_NAME_SIZE : constant POSITIVE := 13 ;
  12164.    NULL_ICON     : String( 1..MAX_NAME_SIZE ) := "* null cmd * "; 
  12165.  
  12166.    type MENU_TABLE_ENTRY is
  12167.       record
  12168.          COMMAND : COMMAND_TYPE  ;
  12169.          NAME    : String( 1..MAX_NAME_SIZE ) ;
  12170.       end record ;
  12171.  
  12172.    MENU_TABLE : constant array ( MENU_ID , ICON_ID ) of MENU_TABLE_ENTRY :=
  12173.    -- Initialize Menu Table Entries setting values for menu icon and command.
  12174.  
  12175.       ( MAIN_MENU =>
  12176.           (  1 => ( MENU_LABEL ,     "  MAIN MENU  " ) ,
  12177.              2 => ( HELP_CMD ,       "    HELP     " ) ,
  12178.              3 => ( NULL_CMD ,       NULL_ICON       ) ,
  12179.              4 => ( PAN_ZOOM_CMD ,   " PAN / ZOOM  " ) ,
  12180.              5 => ( NULL_CMD ,       NULL_ICON       ) ,
  12181.              6 => ( DESIGN_CMD ,     "   DESIGN    " ) ,
  12182.              7 => ( ATTRIBUTES_CMD , "DISPLAY ATTRB" ) ,
  12183.              8 => ( NULL_CMD ,       NULL_ICON       ) ,
  12184.              9 => ( GEN_PDL_CMD ,    "GENERATE PDL " ) ,
  12185.             10 => ( PRINT_CMD ,      "   PRINT     " ) ,
  12186.             11 => ( NULL_CMD ,       NULL_ICON       ) ,
  12187.             12 => ( READ_FILE_CMD ,  "  READ_FILE  " ) ,
  12188.             13 => ( WRITE_FILE_CMD , " WRITE_FILE  " ) ,
  12189.             14 => ( NULL_CMD ,       NULL_ICON       ) ,
  12190.             15 => ( QUIT_CMD ,       "QUIT, NO SAVE" ) ,
  12191.             16 => ( FINISHED_CMD ,   " EXIT & SAVE " ) ,
  12192.             17 => ( NULL_CMD ,       NULL_ICON       ) ,
  12193.             18 => ( NULL_CMD ,       NULL_ICON       ) ,
  12194.             19 => ( NULL_CMD ,       NULL_ICON       ) ,
  12195.             20 => ( NULL_CMD ,       NULL_ICON       ) ) ,
  12196.  
  12197.         DESIGN_MENU =>
  12198.           (  1 => ( MENU_LABEL,          " DESIGN MENU " ) ,
  12199.              2 => ( HELP_CMD ,           "    HELP     " ) ,
  12200.              3 => ( BACKUP_CMD ,         " MENU BACKUP " ) ,
  12201.              4 => ( PAN_ZOOM_CMD ,       " PAN / ZOOM  " ) ,
  12202.              5 => ( NULL_CMD ,           NULL_ICON       ) ,
  12203.              6 => ( VIRT_PACKAGE_CMD ,   " VIRTUAL PKG " ) ,
  12204.              7 => ( PACKAGE_CMD ,        "   PACKAGE   " ) ,
  12205.              8 => ( PROCEDURE_CMD ,      "  PROCEDURE  " ) ,
  12206.              9 => ( FUNCTION_CMD ,       "  FUNCTION   " ) ,
  12207.             10 => ( TASK_CMD ,           "    TASK     " ) ,
  12208.             11 => ( ENTRY_PT_CMD ,       " ENTRY POINT " ) ,
  12209.             12 => ( BODY_CMD ,           "XECUTING BODY" ) ,
  12210.             13 => ( ANNOTATION_CMD ,     "IMPORT/EXPORT" ) ,
  12211.             14 => ( CALL_CONNECT_CMD ,   "    CALL CONN" ) ,
  12212.             15 => ( DATA_CONNECT_CMD ,   " VISIBLE CONN" ) ,
  12213.             16 => ( EXPORT_CONNECT_CMD , " EXPORTS CONN" ) ,
  12214.             17 => ( DELETE_CONNECT_CMD , "  DELETE CONN" ) ,
  12215.             18 => ( DELETE_CMD ,         "DELETE ENTITY" ) ,
  12216.             19 => ( MOVE_CMD ,           "MOVE / RESIZE" ) ,
  12217.             20 => ( MODIFY_CMD ,         "MODIFY ENTITY" ) ) ,
  12218.  
  12219.         PAN_ZOOM_MENU =>
  12220.           (  1 => ( MENU_LABEL ,        "PAN/ZOOM MENU" ) ,
  12221.              2 => ( HELP_CMD ,          "    HELP     " ) ,
  12222.              3 => ( BACKUP_CMD ,        "BACKUP/RESUME" ) ,
  12223.              4 => ( NULL_CMD ,          NULL_ICON       ) ,
  12224.              5 => ( NULL_CMD ,          NULL_ICON       ) ,
  12225.              6 => ( PAN_UP_CMD ,        "   PAN UP    " ) ,
  12226.              7 => ( PAN_DOWN_CMD ,      "   PAN DOWN  " ) ,
  12227.              8 => ( PAN_LEFT_CMD ,      "   PAN LEFT  " ) ,
  12228.              9 => ( PAN_RIGHT_CMD ,     "   PAN RIGHT " ) ,
  12229.             10 => ( NULL_CMD ,          NULL_ICON       ) ,
  12230.             11 => ( ZOOM_IN_CMD ,       "  ZOOM IN    " ) ,
  12231.             12 => ( ZOOM_OUT_CMD ,      "  ZOOM OUT   " ) ,
  12232.             13 => ( NULL_CMD ,          NULL_ICON       ) ,
  12233.             14 => ( MAX_PAN_UP_CMD ,    "MAX PAN UP   " ) ,
  12234.             15 => ( MAX_PAN_DOWN_CMD ,  "MAX PAN DOWN " ) ,
  12235.             16 => ( MAX_PAN_LEFT_CMD ,  "MAX PAN LEFT " ) ,
  12236.             17 => ( MAX_PAN_RIGHT_CMD , "MAX PAN RIGHT" ) ,
  12237.             18 => ( NULL_CMD ,          NULL_ICON       ) ,
  12238.             19 => ( MAX_ZOOM_IN_CMD ,   "MAX ZOOM IN  " ) ,
  12239.             20 => ( MAX_ZOOM_OUT_CMD ,  "MAX ZOOM OUT " ) ) ,
  12240.  
  12241.       -- commands in ATTRIBUTES_MENU         
  12242.  
  12243.         ATTRIBUTES_MENU =>
  12244.           (  1 => ( MENU_LABEL ,         " ATTRIBUTES  " ) ,
  12245.              2 => ( HELP_CMD ,           "    HELP     " ) ,
  12246.              3 => ( BACKUP_CMD ,         " MENU BACKUP " ) ,
  12247.              4 => ( PAN_ZOOM_CMD ,       " PAN / ZOOM  " ) ,
  12248.              5 => ( NULL_CMD ,           NULL_ICON       ) ,
  12249.              6 => ( A_VIRT_PACKAGE_CMD , "VIRTUAL PKGS " ) ,
  12250.              7 => ( A_PACKAGE_CMD ,      "  PACKAGES   " ) ,
  12251.              8 => ( A_SUBPROGRAM_CMD ,   " SUBPROGRAMS " ) ,
  12252.              9 => ( A_TASK_CMD ,         "    TASKS    " ) ,
  12253.             10 => ( NULL_CMD ,           NULL_ICON       ) ,
  12254.             11 => ( A_CALL_CONNECT_CMD , "    CALL CONN" ) ,
  12255.             12 => ( A_DATA_CONNECT_CMD , " VISIBLE CONN" ) ,
  12256.             13 => ( A_EXPORT_CONNECT_CMD," EXPORTS CONN" ) ,
  12257.             14 => ( NULL_CMD ,           NULL_ICON       ) ,
  12258.             15 => ( NULL_CMD ,           NULL_ICON       ) ,
  12259.             16 => ( NULL_CMD ,           NULL_ICON       ) ,
  12260.             17 => ( NULL_CMD ,           NULL_ICON       ) ,
  12261.             18 => ( NULL_CMD ,           NULL_ICON       ) ,
  12262.             19 => ( NULL_CMD ,           NULL_ICON       ) ,
  12263.             20 => ( NULL_CMD ,           NULL_ICON       ) ) ,
  12264.  
  12265.       -- commands in ANNOTATING_MENU         
  12266.  
  12267.         ANNOTATING_MENU =>
  12268.           (  1 => ( MENU_LABEL ,           "IMPORT/EXPORT" ) ,
  12269.              2 => ( HELP_CMD ,             "    HELP     " ) ,
  12270.              3 => ( BACKUP_CMD ,           " MENU BACKUP " ) ,
  12271.              4 => ( PAN_ZOOM_CMD ,         " PAN / ZOOM  " ) ,
  12272.              5 => ( RESTART_CMD ,          "  MAIN MENU  " ) ,
  12273.              6 => ( NULL_CMD ,             NULL_ICON       ) ,
  12274.              7 => ( EXPORT_PROC_CMD ,      "EXPORT PROC  " ) ,
  12275.              8 => ( EXPORT_FUNC_CMD ,      "EXPORT FUNC  " ) ,
  12276.              9 => ( EXPORT_TYPE_CMD ,      "EXPORT TYPE  " ) ,
  12277.             10 => ( EXPORT_OBJ_CMD ,       "EXPORT OBJECT" ) ,
  12278.             11 => ( EXPORT_EXCEPT_CMD ,    "EXPORT EXCEPT" ) ,
  12279.             12 => ( EXPORT_TASK_ENTRY_CMD, "EXPORT ENTRY " ) ,
  12280.             13 => ( IMPORT_VP_CMD ,        "IMPORT VT PKG" ) ,
  12281.             14 => ( IMPORT_PKG_CMD ,       "IMPORT PKG   " ) ,
  12282.             15 => ( IMPORT_PROC_CMD ,      "IMPORT PROC  " ) ,
  12283.             16 => ( IMPORT_FUNC_CMD ,      "IMPORT FUNC  " ) ,
  12284.             17 => ( NULL_CMD ,             NULL_ICON       ) ,
  12285.             18 => ( IE_CALL_CONNECT_CMD ,  "    CALL CONN" ) ,
  12286.             19 => ( IE_DATA_CONNECT_CMD ,  " VISIBLE CONN" ) ,
  12287.             20 => ( IE_EXPORT_CONNECT_CMD ," EXPORTS CONN" ) ) ,
  12288.  
  12289.       -- commands in DELETE_MENU         
  12290.  
  12291.         DELETE_MENU =>
  12292.           (  1 => ( MENU_LABEL ,  " DELETE/QUIT " ) ,
  12293.              2 => ( HELP_CMD ,    "    HELP     " ) ,
  12294.              3 => ( BACKUP_CMD ,  " MENU BACKUP " ) ,
  12295.              4 => ( NULL_CMD ,    NULL_ICON       ) ,
  12296.              5 => ( NULL_CMD ,    NULL_ICON       ) ,
  12297.              6 => ( CANCEL_CMD ,  "   CANCEL    " ) ,
  12298.              7 => ( CONFIRM_CMD , "   CONFIRM   " ) ,
  12299.              8 => ( NULL_CMD ,    NULL_ICON       ) ,
  12300.              9 => ( NULL_CMD ,    NULL_ICON       ) ,
  12301.             10 => ( NULL_CMD ,    NULL_ICON       ) ,
  12302.             11 => ( NULL_CMD ,    NULL_ICON       ) ,
  12303.             12 => ( NULL_CMD ,    NULL_ICON       ) ,
  12304.             13 => ( NULL_CMD ,    NULL_ICON       ) ,
  12305.             14 => ( NULL_CMD ,    NULL_ICON       ) ,
  12306.             15 => ( NULL_CMD ,    NULL_ICON       ) ,
  12307.             16 => ( NULL_CMD ,    NULL_ICON       ) ,
  12308.             17 => ( NULL_CMD ,    NULL_ICON       ) ,
  12309.             18 => ( NULL_CMD ,    NULL_ICON       ) ,
  12310.             19 => ( NULL_CMD ,    NULL_ICON       ) ,
  12311.             20 => ( NULL_CMD ,    NULL_ICON       ) ) ,
  12312.  
  12313.       -- commands in COLOR_LINE_MENU         
  12314.  
  12315.         COLOR_LINE_MENU =>
  12316.           (  1 => ( MENU_LABEL , "  COLOR/LINE " ) ,
  12317.              2 => ( HELP_CMD ,   "    HELP     " ) ,
  12318.              3 => ( BACKUP_CMD , " MENU BACKUP " ) ,
  12319.              4 => ( NULL_CMD ,   NULL_ICON       ) ,
  12320.              5 => ( RESTART_CMD ,"  MAIN MENU  " ) ,
  12321.              6 => ( NULL_CMD ,   NULL_ICON       ) ,
  12322.              7 => ( GREEN_CMD ,  "GREEN        " ) ,
  12323.              8 => ( BLUE_CMD ,   "BLUE         " ) ,
  12324.              9 => ( VIOLET_CMD , "VIOLET       " ) ,
  12325.             10 => ( RED_CMD ,    "RED          " ) ,
  12326.             11 => ( ORANGE_CMD , "ORANGE       " ) ,
  12327.             12 => ( YELLOW_CMD , "YELLOW       " ) ,
  12328.             13 => ( BLACK_CMD ,  "BLACK        " ) ,
  12329.             14 => ( NULL_CMD ,   NULL_ICON       ) ,
  12330.             15 => ( SOLID_CMD ,  "SOLID  _____ " ) ,
  12331.             16 => ( DASHED_CMD , "DASHED _ _ _ " ) ,
  12332.             17 => ( DOTTED_CMD , "DOTTED ..... " ) ,
  12333.             18 => ( NULL_CMD ,   NULL_ICON       ) ,
  12334.             19 => ( NULL_CMD ,   NULL_ICON       ) ,
  12335.             20 => ( NULL_CMD ,   NULL_ICON       ) ) ,
  12336.  
  12337.       -- commands in GENERIC_MENU         
  12338.  
  12339.         GENERIC_MENU =>
  12340.           (  1 => ( MENU_LABEL ,       "GENERIC MENU " ) ,
  12341.              2 => ( HELP_CMD ,         "    HELP     " ) ,
  12342.              3 => ( BACKUP_CMD ,       " MENU BACKUP " ) ,
  12343.              4 => ( NULL_CMD ,         NULL_ICON       ) ,
  12344.              5 => ( NULL_CMD ,         NULL_ICON       ) ,
  12345.              6 => ( NON_GENERIC_CMD ,  " DECLARATION " ) ,
  12346.              7 => ( GENERIC_DECL_CMD , "GENERIC DECLA" ) ,
  12347.              8 => ( GENERIC_INST_CMD , "GENERIC INSTA" ) ,
  12348.              9 => ( NULL_CMD ,         NULL_ICON       ) ,
  12349.             10 => ( NULL_CMD ,         NULL_ICON       ) ,
  12350.             11 => ( NULL_CMD ,         NULL_ICON       ) ,
  12351.             12 => ( NULL_CMD ,         NULL_ICON       ) ,
  12352.             13 => ( NULL_CMD ,         NULL_ICON       ) ,
  12353.             14 => ( NULL_CMD ,         NULL_ICON       ) ,
  12354.             15 => ( NULL_CMD ,         NULL_ICON       ) ,
  12355.             16 => ( NULL_CMD ,         NULL_ICON       ) ,
  12356.             17 => ( NULL_CMD ,         NULL_ICON       ) ,
  12357.             18 => ( NULL_CMD ,         NULL_ICON       ) ,
  12358.             19 => ( NULL_CMD ,         NULL_ICON       ) ,
  12359.             20 => ( NULL_CMD ,         NULL_ICON       ) ) ,
  12360.  
  12361.       -- commands in PARAMETER_STATUS_MENU
  12362.  
  12363.         PARAMETER_STATUS_MENU =>
  12364.           (  1 => ( MENU_LABEL ,        "PARAM STATUS " ) ,
  12365.              2 => ( HELP_CMD ,          "    HELP     " ) ,
  12366.              3 => ( BACKUP_CMD ,        " MENU BACKUP " ) ,
  12367.              4 => ( NULL_CMD ,          NULL_ICON       ) ,
  12368.              5 => ( NULL_CMD ,          NULL_ICON       ) ,
  12369.              6 => ( HAS_PARAMETERS_CMD, " HAS PARAMS  " ) ,
  12370.              7 => ( NO_PARAMETERS_CMD , "  NO PARAMS  " ) ,
  12371.              8 => ( NULL_CMD ,          NULL_ICON       ) ,
  12372.              9 => ( NULL_CMD ,          NULL_ICON       ) ,
  12373.             10 => ( NULL_CMD ,          NULL_ICON       ) ,
  12374.             11 => ( NULL_CMD ,          NULL_ICON       ) ,
  12375.             12 => ( NULL_CMD ,          NULL_ICON       ) ,
  12376.             13 => ( NULL_CMD ,          NULL_ICON       ) ,
  12377.             14 => ( NULL_CMD ,          NULL_ICON       ) ,
  12378.             15 => ( NULL_CMD ,          NULL_ICON       ) ,
  12379.             16 => ( NULL_CMD ,          NULL_ICON       ) ,
  12380.             17 => ( NULL_CMD ,          NULL_ICON       ) ,
  12381.             18 => ( NULL_CMD ,          NULL_ICON       ) ,
  12382.             19 => ( NULL_CMD ,          NULL_ICON       ) ,
  12383.             20 => ( NULL_CMD ,          NULL_ICON       ) ) ,
  12384.  
  12385.       -- commands in CALL_STATUS_MENU
  12386.  
  12387.         CALL_STATUS_MENU =>
  12388.           (  1 => ( MENU_LABEL ,        " CALL STATUS " ) ,
  12389.              2 => ( HELP_CMD ,          "    HELP     " ) ,
  12390.              3 => ( BACKUP_CMD ,        " MENU BACKUP " ) ,
  12391.              4 => ( NULL_CMD ,          NULL_ICON       ) ,
  12392.              5 => ( NULL_CMD ,          NULL_ICON       ) ,
  12393.              6 => ( UNCONDITIONAL_CMD , "UNCONDITIONAL" ) ,
  12394.              7 => ( CONDITIONAL_CMD ,   " CONDITIONAL " ) ,
  12395.              8 => ( TIMED_CMD ,         "    TIMED    " ) ,
  12396.              9 => ( NULL_CMD ,          NULL_ICON       ) ,
  12397.             10 => ( NULL_CMD ,          NULL_ICON       ) ,
  12398.             11 => ( NULL_CMD ,          NULL_ICON       ) ,
  12399.             12 => ( NULL_CMD ,          NULL_ICON       ) ,
  12400.             13 => ( NULL_CMD ,          NULL_ICON       ) ,
  12401.             14 => ( NULL_CMD ,          NULL_ICON       ) ,
  12402.             15 => ( NULL_CMD ,          NULL_ICON       ) ,
  12403.             16 => ( NULL_CMD ,          NULL_ICON       ) ,
  12404.             17 => ( NULL_CMD ,          NULL_ICON       ) ,
  12405.             18 => ( NULL_CMD ,          NULL_ICON       ) ,
  12406.             19 => ( NULL_CMD ,          NULL_ICON       ) ,
  12407.             20 => ( NULL_CMD ,          NULL_ICON       ) ) ,
  12408.  
  12409.       -- commands in ENTRY_POINT_STATUS_MENU
  12410.  
  12411.         ENTRY_POINT_STATUS_MENU =>
  12412.           (  1 => ( MENU_LABEL ,    "ENTRY STATUS " ) ,
  12413.              2 => ( HELP_CMD ,      "    HELP     " ) ,
  12414.              3 => ( BACKUP_CMD ,    " MENU BACKUP " ) ,
  12415.              4 => ( NULL_CMD ,      NULL_ICON       ) ,
  12416.              5 => ( NULL_CMD ,      NULL_ICON       ) ,
  12417.              6 => ( UNGUARDED_CMD , "  UNGUARDED  " ) ,
  12418.              7 => ( GUARDED_CMD ,   "   GUARDED   " ) ,
  12419.              8 => ( NULL_CMD ,      NULL_ICON       ) ,
  12420.              9 => ( NULL_CMD ,      NULL_ICON       ) ,
  12421.             10 => ( NULL_CMD ,      NULL_ICON       ) ,
  12422.             11 => ( NULL_CMD ,      NULL_ICON       ) ,
  12423.             12 => ( NULL_CMD ,      NULL_ICON       ) ,
  12424.             13 => ( NULL_CMD ,      NULL_ICON       ) ,
  12425.             14 => ( NULL_CMD ,      NULL_ICON       ) ,
  12426.             15 => ( NULL_CMD ,      NULL_ICON       ) ,
  12427.             16 => ( NULL_CMD ,      NULL_ICON       ) ,
  12428.             17 => ( NULL_CMD ,      NULL_ICON       ) ,
  12429.             18 => ( NULL_CMD ,      NULL_ICON       ) ,
  12430.             19 => ( NULL_CMD ,      NULL_ICON       ) ,
  12431.             20 => ( NULL_CMD ,      NULL_ICON       ) ) ,
  12432.  
  12433.       -- commands in PDL_STATUS_MENU
  12434.  
  12435.         PDL_STATUS_MENU =>
  12436.           (  1 => ( MENU_LABEL ,    "  PDL STATUS " ) ,
  12437.              2 => ( HELP_CMD ,      "    HELP     " ) ,
  12438.              3 => ( BACKUP_CMD ,    " MENU BACKUP " ) ,
  12439.              4 => ( NULL_CMD ,      NULL_ICON       ) ,
  12440.              5 => ( NULL_CMD ,      NULL_ICON       ) ,
  12441.              6 => ( WITH_SUPPORT_CMD , "WITH SUPPORT " ) ,
  12442.              7 => ( NO_SUPPORT_CMD ,   " NO SUPPORT  " ) ,
  12443.              8 => ( NULL_CMD ,      NULL_ICON       ) ,
  12444.              9 => ( NULL_CMD ,      NULL_ICON       ) ,
  12445.             10 => ( NULL_CMD ,      NULL_ICON       ) ,
  12446.             11 => ( NULL_CMD ,      NULL_ICON       ) ,
  12447.             12 => ( NULL_CMD ,      NULL_ICON       ) ,
  12448.             13 => ( NULL_CMD ,      NULL_ICON       ) ,
  12449.             14 => ( NULL_CMD ,      NULL_ICON       ) ,
  12450.             15 => ( NULL_CMD ,      NULL_ICON       ) ,
  12451.             16 => ( NULL_CMD ,      NULL_ICON       ) ,
  12452.             17 => ( NULL_CMD ,      NULL_ICON       ) ,
  12453.             18 => ( NULL_CMD ,      NULL_ICON       ) ,
  12454.             19 => ( NULL_CMD ,      NULL_ICON       ) ,
  12455.             20 => ( NULL_CMD ,      NULL_ICON       ) ) ,
  12456.  
  12457.       -- initialize all others to null
  12458.  
  12459.         NULL_MENU =>
  12460.         ( others => ( NULL_CMD , NULL_ICON ) ) ) ;
  12461.  
  12462.  
  12463.    SESSION_NAME : STRING (1..40) := ( others => ' ' ) ; -- A FILENAME
  12464.  
  12465.    -----------------------------------------------------------------
  12466.    -- Define the array containing the segment numbers of the menu
  12467.    -- icons indexed by menu and icon.
  12468.    -----------------------------------------------------------------
  12469.    ICON_SEGMENTS : array ( MENU_ID ) of
  12470.       GRAPHICS_DATA.SEGMENT_LIST_TYPE( ICON_ID'first..ICON_ID'last ) :=
  12471.       ( MAIN_MENU..NULL_MENU => ( ICON_ID'first..ICON_ID'last =>
  12472.                                   GRAPHICS_DATA.NULL_SEGMENT ) ) ;
  12473.  
  12474.    -----------------------------------------------------------------
  12475.    -- Define the array containing the segment numbers of the color
  12476.    -- menu color square icons.
  12477.    -----------------------------------------------------------------
  12478.    ICON_COLOR_SEGMENTS : GRAPHICS_DATA.SEGMENT_LIST_TYPE
  12479.               ( COMMAND_TYPE'Pos( GREEN_CMD )..COMMAND_TYPE'Pos( BLACK_CMD ) ) ;
  12480.  
  12481.    ----------------------------------------------------------------
  12482.    --  icon location to id cross reference of lower BOUNDARY
  12483.    ----------------------------------------------------------------
  12484.    type BOUNDARY_VALUES is
  12485.       record
  12486.          UPPER : GRAPHICS_DATA.WC ;
  12487.          LOWER : GRAPHICS_DATA.WC ;
  12488.       end record ;
  12489.    ICON_BOUNDARY : array ( ICON_ID ) of BOUNDARY_VALUES ;
  12490.  
  12491.    ----------------------------------------------------------------
  12492.    -- Minimum and maximum X values for menu rectangle.
  12493.    ----------------------------------------------------------------
  12494.    MENU_X_MIN, MENU_X_MAX : GRAPHICS_DATA.WC ;
  12495.  
  12496.    ----------------------------------------------------------------
  12497.    --  Menu which is currently displayed to operator.
  12498.    ----------------------------------------------------------------
  12499.    CURRENT_MENU : MENU_ID := NULL_MENU ;
  12500.  
  12501.    ----------------------------------------------------------------
  12502.    --  Local exceptions indicating an invalid symbol was selected or
  12503.    --  the user attempted to improperly use a command.
  12504.    ----------------------------------------------------------------
  12505.    INVALID_COMMAND_SELECTED : exception ; 
  12506.    IMPROPER_COMMAND_USAGE   : exception ; 
  12507.  
  12508.    ----------------------------------------------------------------
  12509.    --  Exceptions to abort a create and return to higher menu
  12510.    --             to return to the main menu
  12511.    ----------------------------------------------------------------
  12512.    HANDLE_ABORT_BACKUP : exception ;
  12513.    HANDLE_RESTART : exception ;
  12514.  
  12515. end MMI_PARAMETERS;
  12516. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  12517. --utilities_spec.ada
  12518. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  12519. -- version 85-11-01 17:10 by JL
  12520.  
  12521. with SYSTEM             ;
  12522. with GKS_SPECIFICATION  ; use GKS_SPECIFICATION ;
  12523. with GRAPHICS_DATA      ; use GRAPHICS_DATA  ;
  12524. with MMI_PARAMETERS     ; use MMI_PARAMETERS ;
  12525.  
  12526. package UTILITIES is
  12527. -- ===========================================================
  12528. --
  12529. --  This package provides the common MMI functions, implemented
  12530. --  so as to use the formated screen and mouse selected command
  12531. --  features of the GRAPHICS_INTERFACE.
  12532. --
  12533. --  This package provides the help facility.  Help can be provided
  12534. --  on each command level.
  12535. --
  12536. --  The specification is null for compilation under compiler
  12537. --  version 1.5
  12538. --
  12539. -- package split into "UTIL_FOR_TREE" 27 Aug 1985 due to compiler
  12540. -- code generation restrictions
  12541. -- ==========================================================
  12542.  
  12543.    package GRAPHICS renames GRAPHICS_DATA ;
  12544.  
  12545.    procedure DIMENSION_CHECK
  12546.              ( SHAPE   : in GRAPHICS_DATA.SHAPE_TYPE ; 
  12547.                POINT_A : in GRAPHICS_DATA.POINT ;
  12548.                POINT_B : in out GRAPHICS_DATA.POINT ) ;
  12549.    -- =========================================================
  12550.    --  This procedure checks that point b has the minimum
  12551.    --  magnitudes from point a in the x & y directions based
  12552.    --  on the type of object being drawn. If any errors occur
  12553.    --  then the user is notified and the new point b position
  12554.    --  is drawn and confirmation is required.
  12555.    -- =========================================================
  12556.  
  12557.    procedure DISPLAY_ERROR
  12558.               ( DISPLAY_STRING : in STRING );
  12559.    -- =========================================================
  12560.    --  This procedure displays the received string to the
  12561.    --  operator, waits for an operator acknowledgement, and
  12562.    --  clears the displayed line.
  12563.    -- =========================================================
  12564.  
  12565.    procedure DISPLAY_CONTINUE ;
  12566.    -- =========================================================
  12567.    --  This procedure displays the message "PRESS CURSOR
  12568.    --  CONTROL DEVICE TO CONTINUE" to the operator, waits
  12569.    --  for an operator acknowledgement, and clears the
  12570.    --  displayed line.
  12571.    -- =========================================================
  12572.  
  12573.    procedure DISPLAY_TIMED_MESSAGE
  12574.               ( DISPLAY_STRING : in STRING );
  12575.    -- =========================================================
  12576.    --  This procedure displays the received string to the
  12577.    --  operator, waits for an appropriate delay, then continues
  12578.    -- =========================================================
  12579.  
  12580.    procedure DISPLAY_MENU
  12581.              ( MENU    : in MENU_ID ;
  12582.                COMMAND : in COMMAND_TYPE ) ;
  12583.    -- ==========================================================
  12584.    --  Display the appropriate menu and highlight the specified
  12585.    --  command.
  12586.    -- ==========================================================
  12587.  
  12588.    procedure DISPLAY_MENU_AND_GET_COMMAND
  12589.              ( MENU        : in MENU_ID ;
  12590.                NEW_COMMAND : in out COMMAND_TYPE ) ;
  12591.    -- ==========================================================
  12592.    --  Display the appropriate menu, preset the cursor and get
  12593.    --  the user selected command. New_command passed in is the
  12594.    --  desired icon location of the cursor.
  12595.    -- ==========================================================
  12596.  
  12597.    procedure HELP ( MENU : in MENU_ID ) ;
  12598.    -- ========================================================
  12599.    --  This procedure provides help for the current 
  12600.    --  Command Level and all levels beneath it.  The format of
  12601.    --  the help will be textual (i.e., it will be implemented
  12602.    --  on the Text plane of the terminal so as to not interfere
  12603.    --  with the graphics.
  12604.    -- =========================================================
  12605.  
  12606.    procedure PRESET_ICON_CURSOR
  12607.              ( MENU    : in MENU_ID ;
  12608.                COMMAND : in COMMAND_TYPE ) ;
  12609.    -- ==========================================================
  12610.    --  Place the cursor on the icon that corresponds to the 
  12611.    --  specified command of current menu.
  12612.    -- ==========================================================
  12613.  
  12614.    procedure REFERENCE_MARKER
  12615.              ( MODE     : in GKS_SPECIFICATION.SEGMENT_VISIBILITY ;
  12616.                LOCATION : in GRAPHICS_DATA.POINT ) ;
  12617.    -- ==========================================================
  12618.    --  Place the system marker segment at the specified location
  12619.    --  and set the segment visible or invisible.
  12620.    -- ==========================================================
  12621.  
  12622.    procedure SIGN_ON ;
  12623.    -- ==========================================================
  12624.    --  This routine provides initial system start up utilities
  12625.    --  such as clearing the terminal screen, displaying a
  12626.    --  copyright message, etc.
  12627.    -- ==========================================================
  12628.  
  12629.    function TRUNCATE_NAME
  12630.              ( USER_NAME     : in String ;
  12631.                SPACE_WIDTH   : in Natural ;
  12632.                PARAMS_SYMBOL : in Boolean := False )
  12633.    return STRING;
  12634.    -- ==========================================================
  12635.    --  Truncate the user name to a width which will fit into
  12636.    --  the user specified space width, and return the
  12637.    --  truncate name.
  12638.    -- ==========================================================
  12639.  
  12640.    function VALID_DRAWING_BOUNDARIES
  12641.             ( LOCATION : GRAPHICS_DATA.POINT )
  12642.    return Boolean ;
  12643.    -- ============================================================
  12644.    -- determin if a point can be drawn within the drawing boundry
  12645.    -- area that is defined with label buffer zone for move and 
  12646.    -- resize functions on entities.
  12647.    -- ============================================================
  12648.  
  12649.    ---------------------------------------------------------------
  12650.    --  This exception is raised if an utility subprogram is unable
  12651.    --  to properly complete the requested operation.
  12652.    ---------------------------------------------------------------
  12653.    UTILITY_FAILED : exception ; 
  12654.  
  12655.    PROTOTYPE_SIGN_ON : Boolean ;
  12656.  
  12657. end UTILITIES ;
  12658. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  12659. --utilities_body.ada
  12660. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  12661. -- version 86-01-15 1210 by JL
  12662.  
  12663. with GRAPHIC_DRIVER               ;  use GRAPHIC_DRIVER ;
  12664. with VIRTUAL_TERMINAL_INTERFACE   ;  use VIRTUAL_TERMINAL_INTERFACE ;
  12665. with TEXT_IO                      ;  use TEXT_IO;
  12666. with TRACE_PKG                    ;
  12667.  
  12668. package body UTILITIES is 
  12669. -- ============================================================
  12670. --
  12671. --  This package provides the common MMI functions, implemented
  12672. --  so as to use the formated screen and mouse selected command
  12673. --  features of the GRAPHICS_INTERFACE.
  12674. --
  12675. --  This package provides the help facility.  Help can be provided
  12676. --  on each command level.
  12677. --
  12678. -- =============================================================
  12679.  
  12680.    subtype FORMAT_FCT  is VIRTUAL_TERMINAL_INTERFACE.FORMAT_FUNCTION ;
  12681.    subtype CURSOR_ADDR is VIRTUAL_TERMINAL_INTERFACE.CURSOR_ADDRESS ;
  12682.    subtype ROW_NO      is VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE ;
  12683.    subtype COL_NO      is VIRTUAL_TERMINAL_INTERFACE.COLUMN_TYPE ;
  12684.  
  12685.    -- Icon identifier of command which has been picked by operator
  12686.    ICON                 : ICON_ID := ICON_ID'first ;
  12687.  
  12688.    -- Current menu icon segment which is highlighted
  12689.    SEGMENT_TO_HIGHLIGHT : GKS_SPECIFICATION.SEGMENT_NAME :=
  12690.                           GRAPHICS_DATA.NULL_SEGMENT ;
  12691.  
  12692.    -- Segments which contains drawing marker and their current location.
  12693.    PRIMARY_MARKER_SEGMENT   : GKS_SPECIFICATION.SEGMENT_NAME :=
  12694.                               GRAPHICS_DATA.NULL_SEGMENT ;
  12695.    SECONDARY_MARKER_SEGMENT : GKS_SPECIFICATION.SEGMENT_NAME :=
  12696.                               GRAPHICS_DATA.NULL_SEGMENT ;
  12697.    -- alailability flags for marker usage
  12698.    PRIMARY_AVAILABLE   : Boolean := True ;
  12699.    SECONDARY_AVAILABLE : Boolean := True ;
  12700.  
  12701.    --{{  Utilities to be placed here as they are recognized, one
  12702.    --{{  example is given below.
  12703.  
  12704.  
  12705.    procedure DIMENSION_CHECK
  12706.              ( SHAPE   : in GRAPHICS_DATA.SHAPE_TYPE ; 
  12707.                POINT_A : in GRAPHICS_DATA.POINT ;
  12708.                POINT_B : in out GRAPHICS_DATA.POINT ) is
  12709.    -- =========================================================
  12710.    --  This procedure checks that point b has the minimum
  12711.    --  magnatudes from point a in the x & y directions based
  12712.    --  on the type of object being drawn. If any errors occur
  12713.    --  then the user is notified and the new point b position
  12714.    --  is drawn and confirmation is required.
  12715.    -- =========================================================
  12716.       TEMP_X_MAG ,
  12717.       X_MAGNITUDE  : GRAPHICS_DATA.WC ;
  12718.       Y_MAGNITUDE  : GRAPHICS_DATA.WC ;
  12719.       MIN_CHAR_MAG : constant GRAPHICS_DATA.WC
  12720.                               := 150 ; -- minimum 12 character range
  12721.  
  12722.    begin
  12723.      -- get current MAGNITUDEs
  12724.      X_MAGNITUDE := abs ( POINT_B.X - POINT_A.X ) ;
  12725.      Y_MAGNITUDE := abs ( POINT_A.Y - POINT_B.Y ) ;
  12726.      -- set minimum x for all shapes
  12727.      if MIN_CHAR_MAG > X_MAGNITUDE then
  12728.         POINT_B.X := POINT_A.X + MIN_CHAR_MAG ;
  12729.         X_MAGNITUDE := MIN_CHAR_MAG ;
  12730.      end if ;
  12731.      -- set minimum shape size { aspect ratio }
  12732.      case SHAPE is
  12733.         when SQUARE | CIRCLE =>
  12734.            -- set all sides to the minimum side
  12735.            if X_MAGNITUDE < Y_MAGNITUDE then
  12736.               POINT_B.Y := POINT_A.Y - X_MAGNITUDE ;
  12737.            else
  12738.               POINT_B.X := POINT_B.X + Y_MAGNITUDE ;
  12739.            end if ;
  12740.         when PARALLELOGRAM =>
  12741.            -- calc the minimum x MAGNITUDE
  12742.            TEMP_X_MAG := GRAPHICS_DATA.WC
  12743.                          ( Y_MAGNITUDE / 3 ) + MIN_CHAR_MAG ;
  12744.            -- set minimum x MAGNITUDE
  12745.            if TEMP_X_MAG > X_MAGNITUDE then
  12746.               POINT_B.X := POINT_A.X + TEMP_X_MAG ;
  12747.               X_MAGNITUDE := TEMP_X_MAG ;
  12748.            end if ;
  12749.         when SINGLE_RECTANGLE | STACKED_RECTANGLE =>
  12750.            -- all check have allready been done
  12751.            null ;
  12752.         when others =>
  12753.            -- other shapes don't need any adjustments
  12754.            null ;
  12755.      end case ; -- SHAPE
  12756.      -- [ if any changes made then notify user and display points
  12757.      --   on screen then get confirmation of adjustments ]
  12758.    end DIMENSION_CHECK ;
  12759.  
  12760.  
  12761.    procedure DISPLAY_ERROR
  12762.               ( DISPLAY_STRING : in STRING ) is
  12763.    -- =========================================================
  12764.    --  This procedure displays the received string to the
  12765.    --  operator, waits for an operator acknowledgement, and
  12766.    --  clears the displayed line.
  12767.    -- =========================================================
  12768.       DUMMY_POINT : GRAPHICS_DATA.POINT ;
  12769.       BLANK_LINE  : constant STRING := "  " ;
  12770.       CONTINUE    : constant STRING :=
  12771.                    " Press cursor control device to continue " ;
  12772.       OPERATOR_RESPONSE : STRING(1..1) ;
  12773.       BELL_STRING : constant String(1..1) := ( others => ASCII.BEL ) ;
  12774.    begin
  12775.  
  12776.       if TRACE_PKG.REQUEST_TRACE then
  12777.          TRACE_PKG.TRACE( " ERROR MESSAGE DISPLAYED :") ;
  12778.          TRACE_PKG.TRACE( DISPLAY_STRING ) ;
  12779.       end if ;
  12780.  
  12781.       -- ring the bell to get users attention
  12782.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12783.               ( BELL_STRING,
  12784.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 24 )) ;
  12785.  
  12786.      -- clear the area surrounding the displayed error message
  12787.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12788.              ( BLANK_LINE ,
  12789.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 9 )) ;
  12790.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12791.              ( BLANK_LINE ,
  12792.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 10 )) ;
  12793.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12794.              ( BLANK_LINE ,
  12795.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 11 )) ;
  12796.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12797.              ( BLANK_LINE ,
  12798.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 12 )) ;
  12799.  
  12800.       -- display received string and continue message
  12801.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12802.               ( DISPLAY_STRING,
  12803.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 10 )) ;
  12804.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12805.               ( CONTINUE,
  12806.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 11 )) ;
  12807.  
  12808.      -- wait for operator acknowledgement 
  12809.        -- use a <CR> for ack
  12810. --     VIRTUAL_TERMINAL_INTERFACE.STRINGIO(
  12811. --        OPERATOR_RESPONSE,
  12812. --        VIRTUAL_TERMINAL_INTERFACE.READ_WITH_ADDRESS,
  12813. --        ROW_NO( 23 ),
  12814. --        COL_NO( 1 ) ) ;
  12815.        -- use locator for ack
  12816.      DUMMY_POINT := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  12817.  
  12818.      -- clear the messages
  12819.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12820.              ( BLANK_LINE ,
  12821.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 10 )) ;
  12822.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12823.              ( BLANK_LINE ,
  12824.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 11 )) ;
  12825.  
  12826.    exception
  12827.       -- dont let the operator abort during display error
  12828.       when OPERATION_ABORTED_BY_OPERATOR =>
  12829.          null ;
  12830.       -- propogate any unknown error
  12831.       when others =>
  12832.          raise ;
  12833.  
  12834.    end DISPLAY_ERROR ;
  12835.  
  12836.    procedure DISPLAY_CONTINUE is
  12837.    -- =========================================================
  12838.    --  This procedure displays the message "PRESS CURSOR
  12839.    --  CONTROL DEVICE TO CONTINUE" to the operator, waits
  12840.    --  for an operator acknowledgement, and clears the
  12841.    --  displayed line.
  12842.    -- =========================================================
  12843.       DUMMY_POINT : GRAPHICS_DATA.POINT ;
  12844.       BLANK_LINE  : constant STRING := "  " ;
  12845.       CONTINUE    : constant STRING :=
  12846.                    " Press cursor control device to continue " ;
  12847.       OPERATOR_RESPONSE : STRING(1..1) ;
  12848.       BELL_STRING : constant String(1..1) := ( others => ASCII.BEL ) ;
  12849.    begin
  12850.  
  12851.       if TRACE_PKG.REQUEST_TRACE then
  12852.          TRACE_PKG.TRACE( " PROCEDURE DISPLAY_CONTINUE") ;
  12853.       end if ;
  12854.  
  12855.       -- ring the bell to get users attention
  12856.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12857.               ( BELL_STRING,
  12858.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 24 )) ;
  12859.  
  12860.       -- display continue message
  12861.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12862.               ( CONTINUE,
  12863.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 24 )) ;
  12864.  
  12865.      -- wait for operator acknowledgement 
  12866.      DUMMY_POINT := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  12867.  
  12868.      -- clear the messages
  12869.      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12870.              ( BLANK_LINE ,
  12871.                FORMAT_FCT'( CLEAR_A_LINE ), ROW_NO( 24 )) ;
  12872.  
  12873.    end DISPLAY_CONTINUE ;
  12874.  
  12875.  
  12876.    procedure DISPLAY_TIMED_MESSAGE
  12877.               ( DISPLAY_STRING : in STRING ) is
  12878.    -- =========================================================
  12879.    --  This procedure displays the received string to the
  12880.    --  operator, (note that NEW_LINE is called so
  12881.    --  that the IO is completed) waits for an appropriate 
  12882.    --  delay, then continues
  12883.    -- =========================================================
  12884.    begin
  12885.       -- display received string
  12886.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  12887.               ( DISPLAY_STRING ,
  12888.                 FORMAT_FCT'( CENTER_A_LINE ), ROW_NO( 23 )) ;
  12889.       TEXT_IO.NEW_LINE ;
  12890.  
  12891.       -- delay in seconds
  12892.       delay 2.0 ;
  12893.  
  12894.       -- clear the message
  12895.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  12896.              ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  12897.  
  12898.    end DISPLAY_TIMED_MESSAGE ;
  12899.  
  12900.  
  12901.    procedure DISPLAY_MENU
  12902.              ( MENU    : in MENU_ID ;
  12903.                COMMAND : in COMMAND_TYPE ) is 
  12904.    -- ==========================================================
  12905.    --  Display the appropriate menu and highlight the specified
  12906.    --  command.
  12907.    -- ==========================================================
  12908.       FOUND : boolean := false ;
  12909.    begin
  12910.  
  12911.       -- If requested menu is different than current menu then display
  12912.       -- the requested menu.
  12913.       if CURRENT_MENU /= MENU then
  12914.  
  12915.          GRAPHIC_DRIVER.CLEAR_MENU( ICON_SEGMENTS( CURRENT_MENU )) ;
  12916.          GRAPHIC_DRIVER.DISPLAY_MENU( ICON_SEGMENTS( MENU )) ;
  12917.          CURRENT_MENU := MENU ;
  12918.       end if;
  12919.  
  12920.       -- Turn segment highlight off if highlight is active.
  12921.       if SEGMENT_TO_HIGHLIGHT /= GRAPHICS_DATA.NULL_SEGMENT then
  12922.          GRAPHIC_DRIVER.HILITE_SEGMENT(
  12923.               SEGMENT_TO_HIGHLIGHT,
  12924.               GKS_SPECIFICATION.NORMAL ) ;
  12925.          SEGMENT_TO_HIGHLIGHT := GRAPHICS_DATA.NULL_SEGMENT ;
  12926.       end if ;
  12927.  
  12928.       -- If specified command is not the null command then highlight
  12929.       -- the corresponding menu icon.
  12930.       if COMMAND /= NULL_CMD then
  12931.  
  12932.          -- Locate the icon correspond to the specified command.
  12933.          for ICON_INDEX in ICON_ID'first..ICON_ID'last
  12934.          loop
  12935.             if MENU_TABLE
  12936.                ( CURRENT_MENU, ICON_INDEX ).COMMAND = COMMAND then
  12937.                FOUND := true ;
  12938.                ICON := ICON_INDEX ;
  12939.                exit ;
  12940.             end if ;
  12941.          end loop ;
  12942.  
  12943.          if FOUND then
  12944.             SEGMENT_TO_HIGHLIGHT :=
  12945.                MMI_PARAMETERS.ICON_SEGMENTS( CURRENT_MENU )( ICON );
  12946.            GRAPHIC_DRIVER.HILITE_SEGMENT( SEGMENT_TO_HIGHLIGHT,
  12947.                    GKS_SPECIFICATION.HIGHLIGHTED ) ;
  12948.          end if;
  12949.       end if;
  12950.    end DISPLAY_MENU ;
  12951.  
  12952.  
  12953.    procedure DISPLAY_MENU_AND_GET_COMMAND
  12954.              ( MENU        : in MENU_ID ;
  12955.                NEW_COMMAND : in out COMMAND_TYPE ) is 
  12956.    -- ==========================================================
  12957.    --  Display the appropriate menu, preset the cursor and get
  12958.    --  the user selected command. New_command passed in is the
  12959.    --  desired icon location of the cursor.
  12960.    -- ==========================================================
  12961.       LINE_1         : constant STRING := 
  12962.                        " INVALID MENU ICON SELECTION - TRY AGAIN" ;
  12963.       LINE_2         : constant STRING :=
  12964.                        " SELECT A MENU ICON. " ;
  12965.       POSITION       : GRAPHICS_DATA.POINT ;
  12966.       VALID_COMMAND  : boolean := false ;  
  12967.       INVALID_ICON_SELECTION : exception ;
  12968.    begin 
  12969.       -- If requested menu is different than current menu then display
  12970.       -- the requested menu.
  12971.       if CURRENT_MENU /= MENU then
  12972.          if CURRENT_MENU = COLOR_LINE_MENU then
  12973.             GRAPHIC_DRIVER.CLEAR_MENU( ICON_COLOR_SEGMENTS ) ;
  12974.          end if ;
  12975.          GRAPHIC_DRIVER.CLEAR_MENU( ICON_SEGMENTS( CURRENT_MENU )) ;
  12976.          GRAPHIC_DRIVER.DISPLAY_MENU( ICON_SEGMENTS( MENU )) ;
  12977.          if MENU = COLOR_LINE_MENU then
  12978.             GRAPHIC_DRIVER.DISPLAY_MENU( ICON_COLOR_SEGMENTS ) ;
  12979.          end if ;
  12980.          CURRENT_MENU := MENU ;
  12981.       end if;
  12982.  
  12983.       -- preset the cursor on the desired command
  12984.       PRESET_ICON_CURSOR( MENU , NEW_COMMAND ) ;
  12985.       -- Turn segment highlight off if highlight is active.
  12986.       if SEGMENT_TO_HIGHLIGHT /= GRAPHICS_DATA.NULL_SEGMENT then
  12987.          GRAPHIC_DRIVER.HILITE_SEGMENT(
  12988.               SEGMENT_TO_HIGHLIGHT,
  12989.               GKS_SPECIFICATION.NORMAL ) ;
  12990.       end if ;
  12991.       -- Get the new icon selection.
  12992.       -- Request the position of the graphics cursor and translate the
  12993.       -- cursor position into a menu icon.
  12994.       while not VALID_COMMAND
  12995.       loop -- until valid menu icon is selected
  12996.          begin
  12997.             ICON := ICON_ID'first ;
  12998.  
  12999.             POSITION := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  13000.             loop
  13001.                if ( POSITION.Y >= ICON_BOUNDARY( ICON ).LOWER ) and
  13002.                   ( POSITION.Y <= ICON_BOUNDARY( ICON ).UPPER ) then
  13003.                   exit ;
  13004.                else
  13005.                   if ICON = ICON_ID'last then
  13006.                      raise INVALID_ICON_SELECTION ;
  13007.                   else
  13008.                      ICON := ICON + 1 ;
  13009.                   end if ;
  13010.                end if;
  13011.             end loop;
  13012.  
  13013.             -- Cross reference icon to get command.
  13014.             NEW_COMMAND := MENU_TABLE( MENU, ICON ).COMMAND ;
  13015.             if NEW_COMMAND = NULL_CMD or
  13016.                NEW_COMMAND = MENU_LABEL then
  13017.                raise INVALID_ICON_SELECTION ;
  13018.             else
  13019.                VALID_COMMAND := true ;
  13020.             end if ;
  13021.  
  13022.          exception
  13023.             when INVALID_ICON_SELECTION =>
  13024.                -- Display invalid selection error message.
  13025.                if NEW_COMMAND = NULL_CMD then
  13026.                   DISPLAY_ERROR( LINE_1 ) ;
  13027.                else
  13028.                   DISPLAY_ERROR( LINE_2 ) ;
  13029.                end if ;
  13030.          end ;
  13031.       end loop ;
  13032.  
  13033.       SEGMENT_TO_HIGHLIGHT :=
  13034.          MMI_PARAMETERS.ICON_SEGMENTS( CURRENT_MENU )( ICON );
  13035.       -- Highlight picked icon.
  13036.       GRAPHIC_DRIVER.HILITE_SEGMENT( SEGMENT_TO_HIGHLIGHT,
  13037.               GKS_SPECIFICATION.HIGHLIGHTED ) ;
  13038.    end DISPLAY_MENU_AND_GET_COMMAND ; 
  13039.  
  13040.  
  13041.    procedure HELP ( MENU : in MENU_ID ) is
  13042.    -- ==========================================================
  13043.    --  This procedure provides help for the current 
  13044.    --  Command Level and all levels beneath it.  The format of
  13045.    --  the help will be textual (i.e., it will be implemented
  13046.    --  on the Text plane of the terminal so as to not interfere
  13047.    --  with the graphics.
  13048.    -- ***
  13049.    -- Suggested modification to help file manipulation.
  13050.    --     have page directory at start of file which translates
  13051.    --     search string into a page number;
  13052.    --     then loop on page number to place file pointer at
  13053.    --     beginning of proper page
  13054.    -- ==========================================================
  13055.       HELP_LENGTH  : constant NATURAL := 70 ;
  13056.       subtype HELP_STRING is STRING(1..HELP_LENGTH);
  13057.       HELP_FILE    : TEXT_IO.FILE_TYPE;
  13058.       FILE_NAME    : constant STRING := "HELP_FILE" ;
  13059.       FILE_STRING  : HELP_STRING ;
  13060.       BLNK_STRING  : constant HELP_STRING :=
  13061.       "                                   " &
  13062.       "                                   ";
  13063. --     12345678901234567890123456789012345
  13064.       NO_OF_CHAR   : NATURAL;
  13065.       REQ_PAGE     : TEXT_IO.POSITIVE_COUNT ;
  13066.       COLUMN_COUNT : constant VIRTUAL_TERMINAL_INTERFACE.COLUMN_TYPE := 18 ;
  13067.       DEFAULT_CMD  : constant MMI_PARAMETERS.COMMAND_TYPE :=
  13068.                      MMI_PARAMETERS.HELP_CMD ;
  13069.       SELECTED_CMD : MMI_PARAMETERS.COMMAND_TYPE ;
  13070.       BELL_CHAR    : CHARACTER := ASCII.BEL ;
  13071.       NO_FILE      : constant STRING :=
  13072.                      " HELP FILE NOT AVAILABLE ";
  13073.       CANT_FIND_1  : constant STRING := " HELP FOR ";
  13074.       CANT_FIND_2  : constant STRING := " IS NOT AVAILABLE ";
  13075.  
  13076.       HEADER_LENGTH    : constant POSITIVE := 15 ;
  13077.       subtype HEADER_STRING is STRING( 1..HEADER_LENGTH );
  13078.  
  13079.       HELP_ICON_SEGMENT     : GKS_SPECIFICATION.SEGMENT_NAME :=
  13080.                               GRAPHICS_DATA.NULL_SEGMENT ;
  13081.       HELP_ICON_HIGHLIGHTED : BOOLEAN := false ;
  13082.  
  13083.       procedure DISPLAY_HELP( SEARCH_STRING : in STRING ) is
  13084.       -- ==========================================================
  13085.       --  This procedure searches the help file for the menu or
  13086.       --  command string contained in SEARCH_STRING, and displays
  13087.       --  the associated help text.
  13088.       -- ==========================================================
  13089.          BEGIN_STRING : constant NATURAL := SEARCH_STRING'first ;
  13090.          END_STRING   : constant NATURAL := SEARCH_STRING'last ;
  13091.          ROW_COUNT    : VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE := 1 ;
  13092.          LAST_ROW     : constant VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE := 19 ;
  13093.          COMMAND_ROW  : constant VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE := 20 ;
  13094.          EXIT_ROW     : constant VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE := 21 ;
  13095.          START_CHAR   : NATURAL ;
  13096.          TEXT_OFFSET  : constant NATURAL := 9;
  13097.          subtype INFO_STRING is STRING( 1..48 );
  13098.          OPERATOR_RESPONSE : STRING(1..1) ;
  13099.          COMMAND_HELP : INFO_STRING :=
  13100.                         " Select command for help on a specific command. ";
  13101.          EXIT_HELP    : INFO_STRING :=
  13102.                         " Select HELP to exit from HELP display.         ";
  13103.       begin
  13104.          -- Erase any text currently on the screen
  13105.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  13106.                ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  13107.  
  13108.          begin
  13109.             -- Reset the file so file elements are read from start of file.
  13110.             TEXT_IO.RESET( HELP_FILE ) ;
  13111.  
  13112.             -- Search for file page containing the help text.
  13113.             loop
  13114.                TEXT_IO.GET_LINE( HELP_FILE, FILE_STRING, NO_OF_CHAR );
  13115.                if SEARCH_STRING =
  13116.                   FILE_STRING( BEGIN_STRING..END_STRING ) then
  13117.                   exit;
  13118.                else
  13119.                   TEXT_IO.SKIP_PAGE( HELP_FILE );
  13120.                end if;
  13121.             end loop ;
  13122.  
  13123.             -- Display help text on screen.
  13124.             ROW_COUNT := 1;
  13125.             REQ_PAGE := TEXT_IO.PAGE( HELP_FILE ) ;
  13126.             while TEXT_IO.PAGE( HELP_FILE ) = REQ_PAGE
  13127.             loop
  13128.                -- Read a line of help text and fill the remainder of
  13129.                -- the line with blanks.
  13130.                TEXT_IO.GET_LINE( HELP_FILE, FILE_STRING, NO_OF_CHAR );
  13131.                START_CHAR := NO_OF_CHAR + 1 ;
  13132.                if START_CHAR < HELP_LENGTH then
  13133.                   FILE_STRING( START_CHAR..HELP_LENGTH ) := 
  13134.                   BLNK_STRING( START_CHAR..HELP_LENGTH ) ;
  13135.                end if;
  13136.  
  13137.                -- If size of help message exceeds available number of lines
  13138.                -- then ask for operator conformation before proceeding.
  13139.                if ROW_COUNT = LAST_ROW then
  13140.  
  13141.                   -- Request operator confirmation
  13142.                   DISPLAY_CONTINUE ;
  13143.  
  13144.                   VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  13145.                      ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  13146.                   ROW_COUNT := 1;
  13147.                end if ;
  13148.  
  13149.                VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  13150.                      ( FILE_STRING( TEXT_OFFSET..FILE_STRING'last ),
  13151.                        CURSOR_ADDR'( WRITE_WITH_ADDRESS ) , 
  13152.                        ROW_COUNT , COLUMN_COUNT ) ;
  13153.  
  13154.                ROW_COUNT := ROW_COUNT + 1;
  13155.             end loop;
  13156.          -- If file does not include help text for the requested menu
  13157.          -- or command then notify the operator.
  13158.          exception
  13159.             when END_ERROR => 
  13160.                DISPLAY_ERROR( CANT_FIND_1 & SEARCH_STRING & CANT_FIND_2 ) ;
  13161.          end ;
  13162.          -- Display information message concerning next required
  13163.          -- action to the operator.
  13164.          ROW_COUNT := ROW_COUNT + 1;
  13165.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  13166.                ( COMMAND_HELP, CURSOR_ADDR'( WRITE_WITH_ADDRESS ) , 
  13167.                  COMMAND_ROW, COLUMN_COUNT ) ;
  13168.  
  13169.          ROW_COUNT := ROW_COUNT + 1;
  13170.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  13171.                ( EXIT_HELP, CURSOR_ADDR'( WRITE_WITH_ADDRESS ) , 
  13172.                  EXIT_ROW, COLUMN_COUNT ) ;
  13173.       end DISPLAY_HELP ;
  13174.  
  13175.    begin
  13176.       -- Open text file containing help commands.
  13177.       TEXT_IO.OPEN( HELP_FILE,
  13178.                     TEXT_IO.IN_FILE,
  13179.                     FILE_NAME );
  13180.       -- Display the general help text associated with the current menu.
  13181.       DISPLAY_HELP( MMI_PARAMETERS.MENU_ID'image( MENU )) ;
  13182.  
  13183.       -- Save help icon segment for highlighting.
  13184.       HELP_ICON_SEGMENT := SEGMENT_TO_HIGHLIGHT ;
  13185.  
  13186.       -- Display the help text associated with the specified
  13187.       -- commands until the help icon is chosen.
  13188.       loop
  13189.          SELECTED_CMD := DEFAULT_CMD ;
  13190.          DISPLAY_MENU_AND_GET_COMMAND(
  13191.                  MMI_PARAMETERS.CURRENT_MENU, SELECTED_CMD );
  13192.  
  13193.          -- If help icon was selected then turn help icon segment
  13194.          -- off and exit help mode.
  13195.          if SELECTED_CMD = MMI_PARAMETERS.HELP_CMD then
  13196.             if HELP_ICON_HIGHLIGHTED then
  13197.                GRAPHIC_DRIVER.HILITE_SEGMENT( HELP_ICON_SEGMENT,
  13198.                     GKS_SPECIFICATION.NORMAL ) ;
  13199.             end if ;
  13200.             exit ;
  13201.          else
  13202.             -- If help icon segment is not highlighted then highlight
  13203.             -- the segment.
  13204.             if not HELP_ICON_HIGHLIGHTED then
  13205.                GRAPHIC_DRIVER.HILITE_SEGMENT(
  13206.                        HELP_ICON_SEGMENT,
  13207.                        GKS_SPECIFICATION.HIGHLIGHTED ) ;
  13208.                HELP_ICON_HIGHLIGHTED := true ;
  13209.             end if ;
  13210.             DISPLAY_HELP(
  13211.                     MMI_PARAMETERS.COMMAND_TYPE'image( SELECTED_CMD )) ;
  13212.          end if;
  13213.       end loop;
  13214.  
  13215.       -- Erase any text currently on the screen and close the
  13216.       -- help file.
  13217.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  13218.             ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  13219.       TEXT_IO.CLOSE( HELP_FILE );
  13220.  
  13221.    -- If help file is unavailable then notify the operator.
  13222.    exception
  13223.       when STATUS_ERROR | NAME_ERROR =>
  13224.          -- Display no help file available message.
  13225.          DISPLAY_ERROR( NO_FILE );
  13226.    end HELP ;
  13227.  
  13228.  
  13229.    procedure PRESET_ICON_CURSOR
  13230.              ( MENU    : in MENU_ID ;
  13231.                COMMAND : in COMMAND_TYPE ) is 
  13232.    -- ==========================================================
  13233.    --  Place the cursor on the icon that corresponds to the 
  13234.    --  specified command of current menu.
  13235.    -- ==========================================================
  13236.       ICON_POSITION : GRAPHICS_DATA.POINT ;
  13237.       CENTER_WIDTH  : constant GRAPHICS_DATA.WC :=
  13238.                                ( MENU_X_MAX - MENU_X_MIN ) / 2 ;
  13239.       CENTER_HEIGHT : constant GRAPHICS_DATA.WC :=
  13240.                                ( ICON_BOUNDARY( ICON_ID'first ).UPPER
  13241.                                  - ICON_BOUNDARY( ICON_ID'first ).LOWER ) / 2 ;
  13242.    begin 
  13243.       -- set default icon to help command
  13244.       ICON_POSITION.X := CENTER_WIDTH + 0 ;
  13245.       ICON_POSITION.Y := CENTER_HEIGHT + ICON_BOUNDARY( ICON_ID'first ).LOWER ;
  13246.       -- get the icon id that corresponds to selected command
  13247.       for I in ICON_ID'first..ICON_ID'last loop
  13248.          if COMMAND = MENU_TABLE( MENU, I ).COMMAND then
  13249.             ICON_POSITION.Y := CENTER_HEIGHT + ICON_BOUNDARY( I ).LOWER ;
  13250.             exit ;
  13251.          end if ;
  13252.       end loop ;
  13253.       -- place cursor at icon id
  13254.       GRAPHIC_DRIVER.PLACE_CURSOR( ICON_POSITION ) ;
  13255.    end PRESET_ICON_CURSOR ; 
  13256.  
  13257.  
  13258.    procedure REFERENCE_MARKER
  13259.              ( MODE     : in GKS_SPECIFICATION.SEGMENT_VISIBILITY ;
  13260.                LOCATION : in GRAPHICS_DATA.POINT ) is
  13261.    -- ==========================================================
  13262.    --  Place the system marker segment at the specified location
  13263.    --  and set the segment visible or invisible.
  13264.    -- ==========================================================
  13265.       LOCATION_CENTER ,
  13266.       LOCATION_SIZE  : GRAPHICS_DATA.POINT ;
  13267.       MARKER_SEGMENT : GKS_SPECIFICATION.SEGMENT_NAME :=
  13268.                               GRAPHICS_DATA.NULL_SEGMENT ;
  13269.       MARKER_ICON  : constant STRING(1..1):= "*";
  13270.       MARKER_COLOR : constant GRAPHICS_DATA.COLOR_TYPE :=
  13271.                               GRAPHICS_DATA.PINK ;
  13272.    begin
  13273.       -- check that were not tring to make invisible markers that
  13274.       -- arn't there.
  13275.       if not ( PRIMARY_AVAILABLE and MODE = GKS_SPECIFICATION.INVISIBLE ) then
  13276.  
  13277.          -- all operations occur to primary marker if it is available
  13278.          -- otherwise the action occures to the secondary marker.
  13279.      
  13280.          -- check primary marker status if ok use else use secondary marker
  13281.          if ( PRIMARY_AVAILABLE and MODE = GKS_SPECIFICATION.VISIBLE ) or
  13282.             ( SECONDARY_AVAILABLE and MODE = GKS_SPECIFICATION.INVISIBLE ) then
  13283.             MARKER_SEGMENT := PRIMARY_MARKER_SEGMENT ;
  13284.          else
  13285.             MARKER_SEGMENT := SECONDARY_MARKER_SEGMENT ;
  13286.          end if ;
  13287.  
  13288.          -- determin if segment is to be turned on or off 
  13289.          if MODE = GKS_SPECIFICATION.VISIBLE then
  13290.             -- If marker segment doesn't exist then create the segment
  13291.             --if MARKER_SEGMENT = GRAPHICS_DATA.NULL_SEGMENT then
  13292.                LOCATION_CENTER.X := LOCATION.X
  13293.                   - ( GRAPHICS_DATA.DEFAULT_CHARACTER_WIDTH / 2 ) ;
  13294.                LOCATION_CENTER.Y := LOCATION.Y
  13295.                   + ( GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT / 2 ) ;
  13296.                GRAPHIC_DRIVER.LABEL ( MARKER_SEGMENT ,
  13297.                                       LOCATION_SIZE ,
  13298.                                       LOCATION_CENTER ,
  13299.                                       MARKER_ICON ,
  13300.                                       MARKER_COLOR ) ;
  13301.                -- set the new marker segment number 
  13302.                if PRIMARY_AVAILABLE then
  13303.                   PRIMARY_MARKER_SEGMENT := MARKER_SEGMENT ;
  13304.                   PRIMARY_AVAILABLE := False ;
  13305.                else
  13306.                   SECONDARY_MARKER_SEGMENT := MARKER_SEGMENT ;
  13307.                   SECONDARY_AVAILABLE := False ;
  13308.                end if ;
  13309.  
  13310.             --end if ;
  13311.          else
  13312.             -- set marker visibile mode and move the marker segment
  13313.             --GRAPHIC_DRIVER.SEGMENT_VISIBILITY ( MARKER_SEGMENT , MODE ) ;
  13314.             --GRAPHIC_DRIVER.MOVE ( MARKER_SEGMENT , LOCATION ) ;
  13315.             -- temp fix it here
  13316.             GRAPHIC_DRIVER.DELETE_SEGMENT ( MARKER_SEGMENT ) ;
  13317.             MARKER_SEGMENT := GRAPHICS_DATA.NULL_SEGMENT ;
  13318.             -- end temp fix it
  13319.             if SECONDARY_AVAILABLE then
  13320.                -- primary was set invisible so set available
  13321.                PRIMARY_AVAILABLE := True ;
  13322.             end if ;
  13323.             -- set secondary marker available always
  13324.             SECONDARY_AVAILABLE := True ;
  13325.          end if ;
  13326.       end if ;
  13327.    end REFERENCE_MARKER ;
  13328.  
  13329.  
  13330.    procedure SIGN_ON is
  13331.    -- ==========================================================
  13332.    --  This routine provides initial system start up utilities
  13333.    --  such as clearing the terminal screen, displaying a
  13334.    --  copyright message, etc.
  13335.    -- ==========================================================
  13336.       LINE_1 , LINE_2 , LINE_3 , LINE_4 : STRING ( 1..53 ) ; 
  13337.       LINE_5 , LINE_6                   : STRING ( 1..55 ) ; 
  13338.    begin  
  13339.       --  set sign on text
  13340.       if PROTOTYPE_SIGN_ON then
  13341.          LINE_1 := " Welcome to SKETCHER - an Ada* oriented design tool. " ; 
  13342.          LINE_2 := "This copyrighted program is the exclusive property of" ;
  13343.          LINE_3 := "SYSCON Corp.  Contact John Reddan at (619) 296-0085  " ;
  13344.          LINE_4 := "          with questions or problems.                " ; 
  13345.       else
  13346.          LINE_1 := "                    Welcome to                       " ;
  13347.          LINE_2 := "      G R A P H I C   A d a *   D E S I G N E R      " ;
  13348.          LINE_3 := "            an Ada oriented design tool              " ; 
  13349.          LINE_4 := "                  By SYSCON Corp.                    " ; 
  13350.       end if ;
  13351.       LINE_5 :=    "* Ada is a registered trademark of the U.S. Government," ;
  13352.       LINE_6 :=    "                Ada Joint Program Office.              " ;
  13353.       --  Notify user of tool invocation and restricted rights
  13354.       --  erase the crt screen
  13355.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13356.          ( " " , FORMAT_FCT'( CLEAR_SCREEN ) , ROW_NO( 1 )) ;
  13357.       --  present program id and intro to user
  13358.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13359.          ( LINE_1 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 10 )) ;
  13360.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13361.          ( LINE_2 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 12 )) ;
  13362.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13363.          ( LINE_3 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 14 )) ;
  13364.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13365.          ( LINE_4 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 15 )) ;
  13366.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13367.          ( LINE_5 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 20 )) ;
  13368.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  13369.          ( LINE_6 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 21 )) ;
  13370.    end SIGN_ON ;
  13371.  
  13372.  
  13373.    function TRUNCATE_NAME
  13374.             ( USER_NAME     : in String ;
  13375.               SPACE_WIDTH   : in Natural ;
  13376.               PARAMS_SYMBOL : in Boolean := False )
  13377.    return STRING is
  13378.    -- ==========================================================
  13379.    --  Truncate the user name to a width which will fit into
  13380.    --  the user specified space width, and return the
  13381.    --  truncate name.
  13382.    -- ==========================================================
  13383.       GOOD_SIZE       : Natural := 0 ;
  13384.       CALC_FACTOR     : constant Natural := 10 ;
  13385.       FIRST_CHAR      : constant Natural := USER_NAME'first ;
  13386.       LAST_CHAR       : Integer := USER_NAME'last ;
  13387.       NAME_WIDTH ,
  13388.       ADJUSTED_SPACE ,
  13389.       SPACE_CHAR_SIZE : Natural ;
  13390.       ADJUSTED_OFFSET : constant Natural :=
  13391.            GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET / CALC_FACTOR ;
  13392.    begin
  13393.       -- find the last good character in the user name,
  13394.       -- exits when two contigous spaces are found.
  13395.       for I in USER_NAME'first .. USER_NAME'last-1 loop
  13396.          exit when USER_NAME ( I ) = ' ' and USER_NAME ( I+1 ) = ' ' ;
  13397.          GOOD_SIZE := I + 1 ;
  13398.       end loop ;
  13399.  
  13400.       NAME_WIDTH      := ( ( USER_NAME'last - USER_NAME'first ) + 1 ) *
  13401.                       ADJUSTED_OFFSET ;
  13402.       ADJUSTED_SPACE  := SPACE_WIDTH / CALC_FACTOR ;
  13403.       SPACE_CHAR_SIZE := ADJUSTED_SPACE / ADJUSTED_OFFSET ;
  13404.  
  13405.       if NAME_WIDTH > ADJUSTED_SPACE then
  13406.          if SPACE_CHAR_SIZE = 0 then
  13407.             SPACE_CHAR_SIZE := 1 ;
  13408.          end if ;
  13409.          LAST_CHAR := FIRST_CHAR + SPACE_CHAR_SIZE - 1 ;
  13410.       end if ;
  13411.  
  13412.       if PARAMS_SYMBOL then
  13413.          -- adjust last char shortened by params symbols size
  13414.          LAST_CHAR := LAST_CHAR - GRAPHICS_DATA.PARAMS_DECL'Length ;
  13415.          -- double check the size of last char
  13416.          if LAST_CHAR < FIRST_CHAR then
  13417.             LAST_CHAR := FIRST_CHAR ;
  13418.          end if ;
  13419.          -- check if calced width is longer than name width if so fix it
  13420.          if ( ( LAST_CHAR - FIRST_CHAR ) + 1 ) > GOOD_SIZE then
  13421.             LAST_CHAR := FIRST_CHAR + GOOD_SIZE - 1 ;
  13422.          end if ;
  13423.          -- return the adjusted user name
  13424.          return USER_NAME( FIRST_CHAR .. LAST_CHAR )
  13425.                            & GRAPHICS_DATA.PARAMS_DECL(1)
  13426.                            & GRAPHICS_DATA.PARAMS_DECL(2) ;
  13427.       else
  13428.          -- check if calced width is longer than name width if so fix it
  13429.          if ( ( LAST_CHAR - FIRST_CHAR ) + 1 ) > GOOD_SIZE then
  13430.             LAST_CHAR := FIRST_CHAR + GOOD_SIZE - 1 ;
  13431.          end if ;
  13432.          -- return the adjusted user name
  13433.          return USER_NAME( FIRST_CHAR .. LAST_CHAR ) ;
  13434.       end if ;
  13435.  
  13436.    exception
  13437.       -- on any error trunc to first character only and report to trace
  13438.       when others =>
  13439.          return USER_NAME( FIRST_CHAR .. FIRST_CHAR ) ;
  13440.          TRACE_PKG.TRACE ( " exception raised in UTILITIES.TRUNCATE_NAME" ) ;
  13441.    end TRUNCATE_NAME ;
  13442.  
  13443.  
  13444.    function VALID_DRAWING_BOUNDARIES
  13445.             ( LOCATION : GRAPHICS_DATA.POINT )
  13446.    return Boolean is
  13447.    -- ============================================================
  13448.    -- determin if a point can be drawn within the drawing boundry
  13449.    -- area that is defined with label buffer zone for move and 
  13450.    -- resize functions on entities.
  13451.    -- ============================================================
  13452.       BOUNDRY : constant GRAPHICS_DATA.RECTANGLE :=
  13453.                 ( X => ( MIN => GRAPHICS_DATA.MIN_WC
  13454.                                 + GRAPHICS_DATA.IMPORT_EXPORT_X_OFFSET
  13455.                                 + GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET ,
  13456.                          MAX => GRAPHICS_DATA.MAX_WC
  13457.                                 - GRAPHICS_DATA.LABEL_MAX_LENGTH ) ,
  13458.                   Y => ( MIN => GRAPHICS_DATA.MIN_WC ,
  13459.                          MAX => GRAPHICS_DATA.MAX_WC
  13460.                                 - GRAPHICS_DATA.CHARACTER_HEIGHT_OFFSET ) ) ;
  13461.    begin -- VALID_DRAWING_BOUNDRIES
  13462.       if LOCATION.X <= BOUNDRY.X.MAX and LOCATION.X >= BOUNDRY.X.MIN and
  13463.          LOCATION.Y <= BOUNDRY.Y.MAX and LOCATION.Y >= BOUNDRY.Y.MIN then
  13464.          return True ;
  13465.       else
  13466.          return False ;
  13467.       end if ;
  13468.    end VALID_DRAWING_BOUNDARIES ;
  13469.  
  13470.  
  13471. end UTILITIES ; 
  13472. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  13473. --pdl_gen_spec.ada
  13474. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  13475. -- version 22 November 1985 by JB
  13476.  
  13477. with TREE_IO ;
  13478.  
  13479. package PDL_GEN is
  13480. ------------------------------------------------------------------------
  13481. --
  13482. --  This package will create the Ada PDL corresponding to the
  13483. --  information stored in the current graph tree (as stored
  13484. --  in TREE_DATA).
  13485. ------------------------------------------------------------------------
  13486.  
  13487.    ---------------------------------------------------------------------
  13488.    --
  13489.    --  The following are the parameters controlling PDL generation.
  13490.    --
  13491.    ---------------------------------------------------------------------
  13492.  
  13493.    TRACE_GENERATION : BOOLEAN := False ; -- TRUE;
  13494.    --  Trace the PDL Generation process with an emphasis on
  13495.    --  tracking the nodes traversed.  
  13496.  
  13497.    INCLUDE_SUPPORT_PACKAGE : BOOLEAN := True ;
  13498.    --  Indicates if the design support package should be included
  13499.    --  in the PDL output file or not.
  13500.  
  13501.    WRITE_PDL_TO_SCREEN : BOOLEAN := True ;
  13502.    --  Indicates if the PDL should be written to the screen
  13503.    --  as the PDL output file is being generated.
  13504.  
  13505.    INDENTATION_INCREMENT : NATURAL range 1..8 := 3;
  13506.    --  The number of spaces indented for each nesting level.
  13507.  
  13508.    MAX_INDENTATION : NATURAL range 0..40 := INDENTATION_INCREMENT*10;
  13509.    --  The greatest amount of indentation allowed, should always be
  13510.    --  an multiple of the INDENTATION_INCREMENT
  13511.    --  NOTE : Currently not used, a Pretty Printer should be used instead.
  13512.  
  13513.    MAX_LINE_LENGTH : NATURAL range 50..256 := 80;
  13514.    --  The longest line output in PDL generation
  13515.    --  NOTE : Currently not used, a Pretty Printer should be used instead.
  13516.  
  13517.    UNTRANSLATABLE_CODE_COMMENT_SYMBOL : CHARACTER := '*';
  13518.    --  The character appended to a standard Ada comment symbol
  13519.    --  to denote an untranslatable code statement (for example,
  13520.    --  a virtual package declaration).
  13521.    --
  13522.  
  13523.    ---------------------------------------------------------------------
  13524.    --  The following procedure is invoked to cause the PDL generation
  13525.    --  to occur
  13526.    ---------------------------------------------------------------------
  13527.    
  13528.    procedure GENERATE_PDL ( PDL_FILE_NAME : in TREE_IO.FILENAME_TYPE ) ;
  13529.    --  
  13530.    --  This procedure walks the current Graph Tree and emits the
  13531.    --  corresponding Ada PDL in the file designated by the user.
  13532.    --  The procedure expects that PDL_FILE is an handle on
  13533.    --  an open file into which the PDL should be placed.  The
  13534.    --  file will be not be closed by GENERATE_PDL.
  13535.    --  
  13536.  
  13537. end PDL_GEN;
  13538. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  13539. --pdl_gen_body.ada
  13540. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  13541. -- version 24 January 1986 by JR   -> 'withs' for refered units only
  13542. -- version 17 January 1986 by JR
  13543. -- version 7 January 1986 by JR
  13544. -- version 10 December 1985 by JR
  13545.  
  13546. with TEXT_IO ;
  13547. with GRAPHICS_DATA ; use GRAPHICS_DATA ;
  13548. with TREE_DATA     ; use TREE_DATA ;
  13549. with TREE_OPS      ;  use TREE_OPS ;
  13550. with UTIL_FOR_TREE ;
  13551. with UTILITIES     ; use UTILITIES ;
  13552. with VIRTUAL_TERMINAL_INTERFACE ; use VIRTUAL_TERMINAL_INTERFACE ;
  13553.  
  13554. package body PDL_GEN is
  13555. ---------------------------------------------------------------------------
  13556. -- The package performing Ada PDL generation includes routines to
  13557. -- generate PDL by walking the tree which contains the information
  13558. -- describing the OODD currently being edited.  A two pass PDL
  13559. -- generation algorithm is implemented by using two subprograms, one
  13560. -- to generate the specifications for the PDL and the other to
  13561. -- generate the bodies for the PDL.  Both subprograms use a recursive
  13562. -- descent approach to generate the PDL, wherein each subprogram will
  13563. -- perform the code generation by writing the PDL appropriate for the
  13564. -- current node and using recursive invocations of itself to process
  13565. -- its child nodes. 
  13566. ---------------------------------------------------------------------------
  13567.  
  13568.    ------------------------------------------------------------------------
  13569.    --  declare the local variables
  13570.    ------------------------------------------------------------------------
  13571.    BLANK_LINE : constant STRING (1..256) := (others => ' ') ;
  13572.  
  13573.    -- indicator if a tree node has been declared yet
  13574.    DECLARED : array ( 1 .. MAX_TREE_NODES ) of BOOLEAN;
  13575.  
  13576.    -- pdl file name extention
  13577.    FILENAME_EXTENSION : constant TREE_IO.EXTENSION_TYPE := ".PDL" ;
  13578.  
  13579.    -- the current indentation level
  13580.    INDENTATION : NATURAL := 0;
  13581.  
  13582.    -- the output line buffer
  13583.    LINE : STRING (1..256);
  13584.  
  13585.    -- the line length of the current line
  13586.    LINE_LENGTH : NATURAL := 0;
  13587.  
  13588.    -- the screen output line buffer and column counter
  13589.    SCREEN_LINE  : STRING (1..256) := BLANK_LINE ;
  13590.    LAST_ROW     : constant VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE :=
  13591.                   VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE'last - 3 ;
  13592.    FIRST_COLUMN : constant VIRTUAL_TERMINAL_INTERFACE.COLUMN_TYPE := 1 ;
  13593.    STRING_END   : NATURAL := 0 ;
  13594.    NEW_END      : NATURAL := 0 ;
  13595.    MAXIMUM_COL  : constant NATURAL := 80 ;
  13596.    type DISPLAY_STRING is ( DISPLAY_LATER, DISPLAY_NOW ) ;
  13597.  
  13598.    -- the nesting levels of the specifications
  13599.    NESTING_LEVEL : NATURAL := 0 ;
  13600.  
  13601.    -- the output file for the PDL
  13602.    PDL_FILE : TEXT_IO.FILE_TYPE;
  13603.  
  13604.    -- a count of the number of times indentation was requested
  13605.    -- when already at the max indentation level
  13606.    TIMES_BEYOND_MAX_INDENT : NATURAL := 0;
  13607.  
  13608.    UNTRANS : STRING (1..1) := ( 1 => UNTRANSLATABLE_CODE_COMMENT_SYMBOL ) ;
  13609.  
  13610.    ------------------------------------------------------------------------
  13611.    --  procedures to write the PDL with
  13612.    ------------------------------------------------------------------------
  13613.  
  13614.    --  These procedures will provide the means of writing the
  13615.    --  generated PDL to the selected output file.  If parallel
  13616.    --  output is desired (i.e., to the screen also), extra 
  13617.    --  'PUT' statements would be added here.  These procedures
  13618.    --  also insure that MAX_LINE_LENGTH is not exceeded.
  13619.  
  13620.    procedure PUT_TO_SCREEN ( MESSAGE         : in STRING ;
  13621.                              WRITE_TO_SCREEN : in DISPLAY_STRING ) is
  13622.    -- Place the received string on the screen output message and
  13623.    -- write the string to the screen if boolean is set.
  13624.    begin
  13625.  
  13626.       -- Append received message to screen output string ;
  13627.       NEW_END := STRING_END + MESSAGE'length ;
  13628.       if NEW_END <= SCREEN_LINE'last then
  13629.          STRING_END := STRING_END + 1 ;
  13630.          SCREEN_LINE( STRING_END..NEW_END ) := MESSAGE ;
  13631.          STRING_END := NEW_END ;
  13632.       end if ;
  13633.  
  13634.       -- If requested then write string to screen and clear string
  13635.       -- and column counter.
  13636.       if WRITE_TO_SCREEN = DISPLAY_NOW then
  13637.          if STRING_END < MAXIMUM_COL then
  13638.             STRING_END := STRING_END + 1 ;
  13639.             SCREEN_LINE( STRING_END..MAXIMUM_COL ) :=
  13640.                BLANK_LINE( STRING_END..MAXIMUM_COL ) ;
  13641.          end if ;
  13642.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  13643.                ( SCREEN_LINE( SCREEN_LINE'first..MAXIMUM_COL ),
  13644.                  VIRTUAL_TERMINAL_INTERFACE.WRITE_WITH_ADDRESS , 
  13645.                  LAST_ROW , FIRST_COLUMN ) ;
  13646.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS(
  13647.                  VIRTUAL_TERMINAL_INTERFACE.SCROLL_UP ) ;
  13648.          SCREEN_LINE := BLANK_LINE ;
  13649.          STRING_END := 0 ;
  13650.       end if ;
  13651.    end PUT_TO_SCREEN ;
  13652.  
  13653.    procedure INITIALIZE_SCREEN_DISPLAY is
  13654.    -- Clear the screen of any text and set variables required
  13655.    -- for screen output.
  13656.    begin
  13657.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  13658.             ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  13659.       VIRTUAL_TERMINAL_INTERFACE.SCROLLING_REGION
  13660.             ( VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE( 1 ), LAST_ROW )  ;
  13661.       SCREEN_LINE := BLANK_LINE ;
  13662.       STRING_END := 0 ;
  13663.    end INITIALIZE_SCREEN_DISPLAY ;
  13664.  
  13665.    procedure TERMINATE_SCREEN_DISPLAY is
  13666.    -- Erase the screen after operator input is received.
  13667.    begin
  13668.       -- Reset the scrolling region to the entire screen.
  13669.       VIRTUAL_TERMINAL_INTERFACE.SCROLLING_REGION
  13670.             ( VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE'first,
  13671.               VIRTUAL_TERMINAL_INTERFACE.ROW_TYPE'last ) ;
  13672.  
  13673.       -- display continue message
  13674.       UTILITIES.DISPLAY_CONTINUE ;
  13675.  
  13676.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  13677.           ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_SCREEN )) ;
  13678.    end TERMINATE_SCREEN_DISPLAY ;
  13679.  
  13680.    procedure WRITE (MESSAGE: in STRING) is
  13681.    --  Write the MESSAGE to the PDL output file, and allow continuation
  13682.    --  on the same line.
  13683.    begin
  13684.       -- indent if not already done
  13685.       if LINE_LENGTH < INDENTATION then
  13686.          if LINE_LENGTH > 0 then
  13687.             LINE(LINE_LENGTH..INDENTATION) :=
  13688.                BLANK_LINE(LINE_LENGTH..INDENTATION);
  13689.          else
  13690.             TEXT_IO.PUT (PDL_FILE,BLANK_LINE(1..INDENTATION));
  13691.             if WRITE_PDL_TO_SCREEN then
  13692.                PUT_TO_SCREEN ( BLANK_LINE(1..INDENTATION), DISPLAY_LATER ) ;
  13693.             end if ;
  13694.          end if;
  13695.          LINE_LENGTH := INDENTATION;
  13696.       end if;
  13697.       -- write the message out
  13698.       if (LINE_LENGTH + MESSAGE'last) > MAX_LINE_LENGTH then
  13699.          -- break the line
  13700.          TEXT_IO.PUT (PDL_FILE,MESSAGE);
  13701.          if WRITE_PDL_TO_SCREEN then
  13702.             PUT_TO_SCREEN ( MESSAGE, DISPLAY_LATER ) ;
  13703.          end if ;
  13704.       else
  13705.          TEXT_IO.PUT (PDL_FILE,MESSAGE);
  13706.          LINE_LENGTH := LINE_LENGTH + MESSAGE'last;
  13707.          if WRITE_PDL_TO_SCREEN then
  13708.             PUT_TO_SCREEN ( MESSAGE, DISPLAY_LATER ) ;
  13709.          end if ;
  13710.       end if;         
  13711.    end WRITE;
  13712.  
  13713.    procedure WRITE_LINE (MESSAGE: in STRING) is
  13714.    --  Write the MESSAGE to the PDL output file, and then begin a new
  13715.    --  line
  13716.    begin
  13717.       -- indent if not already done
  13718.       if LINE_LENGTH < INDENTATION then
  13719.          if LINE_LENGTH > 0 then
  13720.             TEXT_IO.PUT (PDL_FILE,BLANK_LINE(LINE_LENGTH..INDENTATION));
  13721.             if WRITE_PDL_TO_SCREEN then
  13722.                PUT_TO_SCREEN (
  13723.                   BLANK_LINE(LINE_LENGTH..INDENTATION), DISPLAY_LATER ) ;
  13724.             end if ;
  13725.          else
  13726.             TEXT_IO.PUT (PDL_FILE,BLANK_LINE(1..INDENTATION));
  13727.             if WRITE_PDL_TO_SCREEN then
  13728.                PUT_TO_SCREEN ( BLANK_LINE(1..INDENTATION), DISPLAY_LATER ) ;
  13729.             end if ;
  13730.          end if;
  13731.          LINE_LENGTH := INDENTATION;
  13732.       end if;
  13733.  
  13734.       -- write the message out
  13735.       if (LINE_LENGTH + MESSAGE'last) > MAX_LINE_LENGTH then
  13736.          -- break the line
  13737.          TEXT_IO.PUT_LINE (PDL_FILE,MESSAGE);
  13738.          if WRITE_PDL_TO_SCREEN then
  13739.             PUT_TO_SCREEN ( MESSAGE, DISPLAY_NOW ) ;
  13740.          end if ;
  13741.       else
  13742.          TEXT_IO.PUT_LINE (PDL_FILE,MESSAGE);
  13743.          if WRITE_PDL_TO_SCREEN then
  13744.             PUT_TO_SCREEN ( MESSAGE, DISPLAY_NOW ) ;
  13745.          end if ;
  13746.       end if;
  13747.       -- reset the line length
  13748.       LINE_LENGTH := 0;
  13749.    end WRITE_LINE;
  13750.  
  13751.    procedure NEW_LINE is
  13752.    begin
  13753.       LINE_LENGTH := 0;
  13754.       TEXT_IO.NEW_LINE (PDL_FILE);
  13755.       if WRITE_PDL_TO_SCREEN then
  13756.          PUT_TO_SCREEN ( " ", DISPLAY_NOW ) ;
  13757.       end if ;
  13758.    end NEW_LINE;
  13759.  
  13760.    ------------------------------------------------------------------------
  13761.    --  procedures to provide execution Trace
  13762.    ------------------------------------------------------------------------
  13763.    procedure TRACE (MESSAGE: in STRING) is
  13764.    begin
  13765.       if TRACE_GENERATION then
  13766.          TEXT_IO.PUT_LINE (PDL_FILE,MESSAGE);
  13767.       end if;
  13768.    end TRACE;
  13769.  
  13770.    ------------------------------------------------------------------------
  13771.    --  procedures to control indentation
  13772.    ------------------------------------------------------------------------
  13773.    procedure INCREMENT_INDENTATION is
  13774.       --  This procedure increments the INDENTATION level up to
  13775.       --  the MAX_LINE_LENGTH
  13776.    begin
  13777.       -- check if already at maximum indentation
  13778.       if INDENTATION = MAX_INDENTATION then
  13779.          TIMES_BEYOND_MAX_INDENT := TIMES_BEYOND_MAX_INDENT + 1;
  13780.       else
  13781.          -- increment the indentation and limit it to the maximum
  13782.          INDENTATION := INDENTATION + INDENTATION_INCREMENT;
  13783.          if INDENTATION > MAX_INDENTATION then
  13784.             INDENTATION := MAX_INDENTATION;
  13785.             TIMES_BEYOND_MAX_INDENT := 1;
  13786.          end if;
  13787.       end if;
  13788.    end INCREMENT_INDENTATION;
  13789.  
  13790.    procedure DECREMENT_INDENTATION is
  13791.       --  This procedure decrements the INDENTATION level down
  13792.       --  to zero (but not beyond).
  13793.    begin
  13794.       -- check if decrementing will produce an illegal indentation level
  13795.       if INDENTATION < INDENTATION_INCREMENT then
  13796.          INDENTATION := 0;
  13797.       -- check if at maximum indendation more than one
  13798.       elsif INDENTATION = MAX_INDENTATION then
  13799.          TIMES_BEYOND_MAX_INDENT := TIMES_BEYOND_MAX_INDENT - 1;
  13800.          if TIMES_BEYOND_MAX_INDENT = 0 then
  13801.             INDENTATION := INDENTATION - INDENTATION_INCREMENT;
  13802.          end if;
  13803.       else
  13804.          -- no special conditions, just decrement the indentation level
  13805.          INDENTATION := INDENTATION - INDENTATION_INCREMENT;
  13806.       end if;
  13807.    end DECREMENT_INDENTATION;
  13808.  
  13809.  
  13810.    ------------------------------------------------------------------------
  13811.    --  The procedure to write the Support Package
  13812.    ------------------------------------------------------------------------
  13813.    procedure WRITE_SUPPORT_PACKAGE is
  13814.       --  This procedure writes the Support Package to the
  13815.       --  PDL output file if the option has been requested.
  13816.    begin
  13817.       NEW_LINE ;
  13818.       WRITE_LINE ("package SUPPORT_PACKAGE is ") ;
  13819.       WRITE_LINE ("   type TBD_TYPE is (TBD) ;") ;
  13820.       WRITE_LINE ("   TBD_OBJECT : TBD_TYPE ;") ;
  13821.       WRITE_LINE ("   TBD_PARAMETERS : TBD_TYPE ; ") ;
  13822.       WRITE_LINE ("   TBD_TIME : DURATION ; ") ;
  13823.       WRITE_LINE ("   TBD_CONDITION  : BOOLEAN ;") ;
  13824.       WRITE_LINE ("end SUPPORT_PACKAGE ;") ;
  13825.       NEW_LINE ;
  13826.    end WRITE_SUPPORT_PACKAGE ;
  13827.  
  13828.  
  13829.    ------------------------------------------------------------------------
  13830.    --  The procedures to transform Tree data to printable form
  13831.    ------------------------------------------------------------------------
  13832.    function EXTRACT (NAME: in STRING) return STRING is
  13833.       --  This procedure removes the unused characters from
  13834.       --  (i.e., blanks) from strings for printing
  13835.       ACTUAL_LENGTH : INTEGER := 0;
  13836.    begin
  13837.       for I in reverse NAME'range loop
  13838.          if NAME(I) /= ' ' then
  13839.             -- found end of used part of string
  13840.             ACTUAL_LENGTH := I;
  13841.             exit;
  13842.          end if;
  13843.       end loop;
  13844.       if ACTUAL_LENGTH > 0 then
  13845.          return NAME(1..ACTUAL_LENGTH);
  13846.       else
  13847.          return "";
  13848.       end if;
  13849.    end EXTRACT;
  13850.  
  13851.  
  13852.    function GET_FULL_NAME (NODE: in TREE_NODE_ACCESS_TYPE) return STRING is
  13853.       --  This function returns the full name of the specified node.
  13854.       --  It is primarily used in producing the code for subprogram
  13855.       --  and task entry point calls.
  13856.       IN_NODE : TREE_NODE_ACCESS_TYPE := NODE ;
  13857.       function GET_PARENT_NAMES (NODE: in TREE_NODE_ACCESS_TYPE) return STRING is
  13858.          -- Get the names of the parents and place a dot ('.') after
  13859.          -- each one.
  13860.       begin
  13861.          if NODE = NULL_POINTER or NODE = ROOT_NODE then
  13862.             return "" ;
  13863.          else
  13864.             return GET_PARENT_NAMES(TREE(NODE).PARENT) 
  13865.              & EXTRACT(TREE(NODE).NAME) & "." ;
  13866.          end if ;
  13867.       end GET_PARENT_NAMES ;
  13868.    begin
  13869.       -- if IN_NODE belongs to an exported entity, check if is connected
  13870.       -- to an inner level.
  13871.       begin
  13872.          if TREE( IN_NODE).NODE_TYPE in EXPORTED_PROCEDURE .. EXPORTED_ENTRY_POINT then
  13873.             while TREE( IN_NODE ).CONNECTEE /= NULL_POINTER loop
  13874.                IN_NODE := TREE( IN_NODE ).CONNECTEE ;
  13875.             end loop ;
  13876.          end if ;
  13877.       exception
  13878.          when others => null ;
  13879.       end ;
  13880.       -- Return the name of the current node appended to the name of
  13881.       -- all parents of the current node.  If the current node is
  13882.       -- an import, then ignore its parent (since it is a withed unit).
  13883.       if TREE(IN_NODE).NODE_TYPE in IMPORTED_PROCEDURE .. IMPORTED_FUNCTION then
  13884.          return EXTRACT( TREE(IN_NODE).NAME ) ;
  13885.       else
  13886.          return GET_PARENT_NAMES(TREE(IN_NODE).PARENT) 
  13887.           & EXTRACT(TREE(IN_NODE).NAME) ;
  13888.       end if ;
  13889.    end GET_FULL_NAME ;
  13890.  
  13891.    procedure WRITE_PROLOGUE (PRO_PTR : in PROLOGUE_NODE_ACCESS_TYPE) is
  13892.       -- This procedure writes the Prologue for a unit if
  13893.       -- it exists.
  13894.       LENGTH : NATURAL ;
  13895.       NULL_PROLOGUE_LINE : PROLOGUE_LINE := (others => ' ') ;
  13896.    begin
  13897.       if PRO_PTR /= NULL_POINTER then
  13898.          for I in 1 .. PROLOGUE_COUNT loop
  13899.             if PROLOGUE( PRO_PTR ).DATA( I ) = NULL_PROLOGUE_LINE then
  13900.                exit ;
  13901.             else
  13902.                -- only write the portion of the Prologue line
  13903.                -- actually used.
  13904.                LENGTH := TREE_DATA.PROLOGUE_LINE_SIZE ;
  13905.                for J in reverse 2 .. TREE_DATA.PROLOGUE_LINE_SIZE loop
  13906.                    if PROLOGUE(PRO_PTR).DATA(I)(J) = ' ' then
  13907.                       LENGTH := J - 1;
  13908.                    else
  13909.                       exit ;
  13910.                    end if ;
  13911.                end loop ;
  13912.                WRITE_LINE ("--" & UNTRANS & " " 
  13913.                 & PROLOGUE(PRO_PTR).DATA(I)(1 .. LENGTH) ) ;
  13914.             end if ;
  13915.          end loop ;
  13916.       end if ;
  13917.    end WRITE_PROLOGUE ;
  13918.  
  13919.    procedure WRITE_WITHS_OF_VISIBLE_UNITS (NODE: in TREE_NODE_ACCESS_TYPE) is
  13920.       --  This procedure writes the 'WITH' statements of the units which
  13921.       --  are visible by the basis of being 'within view' on the graph
  13922.       --  depicting the OODD.  This is effectively all top-level units
  13923.       --  except the one currently being written.
  13924.  
  13925.       PTR           : LIST_NODE_ACCESS_TYPE;
  13926.       SUBTREE_NODE  : TREE_NODE_ACCESS_TYPE ;
  13927.       TREE_PTR      : TREE_NODE_ACCESS_TYPE;
  13928.       WALK_STATE    : TREE_OPS.WALK_STATE_TYPE ;
  13929.  
  13930.       function CHECK_FOR_REFERENCE ( FROM: in TREE_NODE_ACCESS_TYPE ;
  13931.                                      TO: in TREE_NODE_ACCESS_TYPE )
  13932.                                      return BOOLEAN is
  13933.          --  This function checks if their are any references (call
  13934.          --  or visibility connections) from the FROM node to the TO
  13935.          --  node.
  13936.          CONNECTEE : TREE_NODE_ACCESS_TYPE ;
  13937.          LPTR      : LIST_NODE_ACCESS_TYPE ;
  13938.       begin
  13939.          --  get the list head of the connection type to be processed
  13940.          case TREE( FROM ).NODE_TYPE is
  13941.             when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE | TYPE_PROCEDURE |
  13942.              TYPE_FUNCTION | TYPE_TASK =>
  13943.                LPTR := TREE( FROM ).DATA_CONNECT_LIST ;
  13944.             when TYPE_BODY =>
  13945.                LPTR := TREE( FROM ).CALLEE_LIST ;
  13946.             when others =>
  13947.                LPTR := NULL_POINTER ;
  13948.          end case ;
  13949.          -- process any non-null connection lists
  13950.          while LPTR /= NULL_POINTER loop
  13951.             -- check for a reference to the TO node by seeing if the
  13952.             -- connectee is in the subtree the TO node defines
  13953.             CONNECTEE := TREE( LIST(LPTR).ITEM ).CONNECTEE ;
  13954.             if TO = UTIL_FOR_TREE.LOWEST_COMMON_PARENT ( TO, CONNECTEE ) then
  13955.                -- found a reference
  13956.                return True ;
  13957.             end if ;
  13958.             LPTR := LIST( LPTR ).NEXT ;
  13959.          end loop ;
  13960.          return False ;  -- no reference found
  13961.       exception
  13962.          when others =>
  13963.             return False ;  -- no correct reference(s) found
  13964.       end CHECK_FOR_REFERENCE ;
  13965.  
  13966.    begin
  13967.       -- handle only top-level units
  13968.       if TREE( NODE ).PARENT = ROOT_NODE then
  13969.          PTR := TREE( ROOT_NODE ).CONTAINED_ENTITY_LIST ;
  13970.          while PTR /= NULL_POINTER loop
  13971.             TREE_PTR := LIST( PTR ).ITEM ;
  13972.             if TREE_PTR /= NODE then
  13973.                -- The TREE_PTR is pointing to a different top level
  13974.                -- unit (node).  Check if their are any references to
  13975.                -- it in the subtree defined by the current NODE.
  13976.  
  13977.                -- walk the subtree checking for references
  13978.                TREE_OPS.START_TREE_WALK ( NODE, WALK_STATE ) ;
  13979.                loop
  13980.                   -- get the tree node to be processed
  13981.                   TREE_OPS.TREE_WALK ( WALK_STATE, SUBTREE_NODE ) ;
  13982.                   exit when SUBTREE_NODE = NULL_POINTER ;
  13983.                   -- if there is a reference then write the 'with'
  13984.                   -- statement and move on to the next top level unit
  13985.                   if CHECK_FOR_REFERENCE ( FROM => SUBTREE_NODE, 
  13986.                                            TO => TREE_PTR ) then
  13987.                      WRITE_LINE ("with " & EXTRACT(TREE(TREE_PTR).NAME) & " ;") ;
  13988.                      exit ;
  13989.                   end if ;
  13990.                end loop ;
  13991.             end if ;
  13992.             PTR := LIST( PTR ).NEXT ;
  13993.          end loop ;
  13994.       end if ;
  13995.    end WRITE_WITHS_OF_VISIBLE_UNITS ;
  13996.  
  13997.  
  13998.    ------------------------------------------------------------------------
  13999.    --  The procedure to emit the PDL for the specifications
  14000.    ------------------------------------------------------------------------
  14001.    procedure EMIT_SPECS (NODE: in TREE_NODE_ACCESS_TYPE) is
  14002.       --  This procedure emits the PDL for the spec of the current 
  14003.       --  Tree node, and recursively invokes itself for contained
  14004.       --  entities of the current node.
  14005.       PTR : LIST_NODE_ACCESS_TYPE;
  14006.       TREE_PTR : TREE_NODE_ACCESS_TYPE;
  14007.    begin
  14008.       TRACE (" starting EMIT_SPECS " & INTEGER'image(NODE) & " (tree) ");
  14009.       -- Check if the current NODE is valid.
  14010.       if NODE = NULL_POINTER then
  14011.          return;
  14012.       -- Skip this Tree NODE if it has already been declared.
  14013.       elsif not DECLARED(NODE) then
  14014.          NESTING_LEVEL := NESTING_LEVEL + 1 ;
  14015.          case TREE(NODE).NODE_TYPE is
  14016.             when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  14017.                NEW_LINE ;
  14018.                -- Scan the IMPORTED_LIST and write the 'with's.
  14019.                PTR := TREE(NODE).IMPORTED_LIST;
  14020.                while PTR /= NULL_POINTER loop
  14021.                   -- Write the with statement.
  14022.                   TREE_PTR := LIST(PTR).ITEM;
  14023.                   WRITE_LINE ("with " & EXTRACT(TREE(TREE_PTR).NAME) & " ;");
  14024.                   -- Mark the node as declared.
  14025.                   DECLARED(TREE_PTR) := TRUE;
  14026.                   -- Process the next imported item.
  14027.                   PTR := LIST(PTR).NEXT;
  14028.                end loop;
  14029.                -- Write the support package if not nested and the
  14030.                -- the user has requested it.
  14031.                if NESTING_LEVEL = 1 and INCLUDE_SUPPORT_PACKAGE then
  14032.                   WRITE_LINE ("with SUPPORT_PACKAGE ;") ;
  14033.                   WRITE_LINE ("use SUPPORT_PACKAGE ;") ;
  14034.                end if ;
  14035.  
  14036.                -- If this declaration is generic, write the generic statement.
  14037.                if TREE(NODE).GENERIC_STATUS = GENERIC_DECLARATION then
  14038.                   WRITE_LINE ("generic");
  14039.                end if;
  14040.  
  14041.                -- Write the 'start' of the (virtual) package.
  14042.                WRITE ("package " & EXTRACT(TREE(NODE).NAME) & " is" );
  14043.                if TREE(NODE).NODE_TYPE = TYPE_VIRTUAL_PACKAGE then
  14044.                   WRITE ("  --" & UNTRANS & " VIRTUAL PACKAGE");
  14045.                end if;
  14046.  
  14047.                -- If this is a generic instantiation then 
  14048.                if TREE(NODE).GENERIC_STATUS = GENERIC_INSTANTIATION then
  14049.                   -- complete the declaration.
  14050.                   WRITE_LINE (" new " & EXTRACT(TREE(NODE).CU_INSTANTIATED) &
  14051.                             " ;");
  14052.                   -- Write the prologue.
  14053.                   INCREMENT_INDENTATION;
  14054.                   WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14055.                   DECREMENT_INDENTATION;
  14056.  
  14057.                else
  14058.                   -- Write a non generic declaration.
  14059.                   NEW_LINE;
  14060.                   INCREMENT_INDENTATION;
  14061.    
  14062.                   -- Write the prologue.
  14063.                   WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14064.  
  14065.                   -- Scan the EXPORTED_LIST for visible types, objects,
  14066.                   -- and exceptions.
  14067.                   PTR := TREE(NODE).EXPORTED_LIST;
  14068.                   while PTR /= NULL_POINTER loop
  14069.                      if TREE( LIST(PTR).ITEM ).NODE_TYPE in
  14070.                       EXPORTED_TYPE .. EXPORTED_EXCEPTION then
  14071.                         EMIT_SPECS (LIST(PTR).ITEM);
  14072.                      end if ;
  14073.                      PTR := LIST(PTR).NEXT;
  14074.                   end loop;
  14075.                   -- Scan the EXPORTED_LIST for remaining items, that is
  14076.                   -- packages, subprograms, and tasks.
  14077.                   PTR := TREE(NODE).EXPORTED_LIST;
  14078.                   while PTR /= NULL_POINTER loop
  14079.                      -- Previously declared items are automatically skipped.
  14080.                      EMIT_SPECS (LIST(PTR).ITEM);
  14081.                      PTR := LIST(PTR).NEXT;
  14082.                   end loop;
  14083.  
  14084.                   -- Write the 'end' of the package specification.
  14085.                   DECREMENT_INDENTATION;
  14086.                   WRITE ("end " & EXTRACT(TREE(NODE).NAME) & " ;" );
  14087.                   if TREE(NODE).NODE_TYPE = TYPE_VIRTUAL_PACKAGE then
  14088.                      WRITE ("  --" & UNTRANS & " VIRTUAL PACKAGE");
  14089.                   end if;
  14090.                   NEW_LINE ;
  14091.                end if;
  14092.  
  14093.             when TYPE_PROCEDURE =>
  14094.                NEW_LINE ;
  14095.                -- Write the support package if not nested and the
  14096.                -- the user has requested it.
  14097.                if NESTING_LEVEL = 1 and INCLUDE_SUPPORT_PACKAGE then
  14098.                   WRITE_LINE ("with SUPPORT_PACKAGE ;") ;
  14099.                   WRITE_LINE ("use SUPPORT_PACKAGE ;") ;
  14100.                end if ;
  14101.  
  14102.                -- If this declaration is generic, write the generic statement.
  14103.                if TREE(NODE).GENERIC_STATUS = GENERIC_DECLARATION then
  14104.                   WRITE_LINE ("generic");
  14105.                end if;
  14106.  
  14107.                -- Write the subprogram declaration including the name.
  14108.                WRITE ("procedure " & EXTRACT(TREE(NODE).NAME));
  14109.                -- If this is a generic instantiation
  14110.                if TREE(NODE).GENERIC_STATUS = GENERIC_INSTANTIATION then
  14111.                   -- Complete the generic instantiation.
  14112.                   WRITE (" is new " & EXTRACT(TREE(NODE).CU_INSTANTIATED));
  14113.                   -- Generic actual parameters currently not handled.
  14114.                else 
  14115.                   -- If the subprogram has calling parameters then 
  14116.                   -- write them.
  14117.                   if TREE(NODE).HAS_PARAMETERS then
  14118.                      WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14119.                   end if;
  14120.                end if ;
  14121.                -- Write the end of the procedure declaration.
  14122.                WRITE_LINE (" ;");
  14123.    
  14124.                -- Write the prologue.
  14125.                INCREMENT_INDENTATION ;
  14126.                WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14127.                DECREMENT_INDENTATION ;
  14128.  
  14129.             when TYPE_FUNCTION =>
  14130.                NEW_LINE ;
  14131.                -- Write the support package if not nested and the
  14132.                -- the user has requested it.
  14133.                if NESTING_LEVEL = 1 and INCLUDE_SUPPORT_PACKAGE then
  14134.                   WRITE_LINE ("with SUPPORT_PACKAGE ;") ;
  14135.                   WRITE_LINE ("use SUPPORT_PACKAGE ;") ;
  14136.                end if ;
  14137.  
  14138.                -- If this declaration is generic, write the generic statement.
  14139.                if TREE(NODE).GENERIC_STATUS = GENERIC_DECLARATION then
  14140.                   -- Write the generic declaration
  14141.                   WRITE_LINE ("generic");
  14142.                end if;
  14143.                -- Write the function declaration including the name.
  14144.                WRITE ("function " & EXTRACT(TREE(NODE).NAME));
  14145.  
  14146.                -- If this is a generic instantiation
  14147.                if TREE(NODE).GENERIC_STATUS = GENERIC_INSTANTIATION then
  14148.                   -- then complete the instantiation.
  14149.                   WRITE (" is new " & EXTRACT(TREE(NODE).CU_INSTANTIATED));
  14150.                   -- Generic actual parameters currently not handled.
  14151.                else
  14152.                   -- If the function has calling parameters then write them.
  14153.                   if TREE(NODE).HAS_PARAMETERS then
  14154.                      WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14155.                   end if;
  14156.                   -- Write the return part (not needed for generic inst.).
  14157.                   WRITE (" return TBD_TYPE");
  14158.                end if ;
  14159.                -- Write the end of the function declaration.
  14160.                WRITE_LINE (" ;");
  14161.    
  14162.                -- Write the prologue.
  14163.                INCREMENT_INDENTATION ;
  14164.                WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14165.                DECREMENT_INDENTATION ;
  14166.  
  14167.             when TYPE_TASK =>
  14168.                NEW_LINE ;
  14169.                -- Write the task declarative statement.
  14170.                WRITE_LINE ("task " & EXTRACT(TREE(NODE).NAME) & " is");
  14171.                INCREMENT_INDENTATION;
  14172.    
  14173.                -- Write the prologue.
  14174.                WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14175.  
  14176.                -- Scan the ENTRY_LIST for the entry points.
  14177.                PTR := TREE(NODE).ENTRY_LIST;
  14178.                while PTR /= NULL_POINTER loop
  14179.                   -- Write an entry statement for each entry found.
  14180.                   TREE_PTR := LIST(PTR).ITEM;
  14181.                   WRITE ("entry " & EXTRACT(TREE(TREE_PTR).NAME));
  14182.                   -- Write calling parameters if they exist.
  14183.                   if TREE(TREE_PTR).WITH_PARAMETERS then
  14184.                      WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14185.                   end if;
  14186.                   WRITE_LINE (" ;");
  14187.                   -- Mark the node as declared.
  14188.                   DECLARED(TREE_PTR) := TRUE;
  14189.                   -- Process the next imported item.
  14190.                   PTR := LIST(PTR).NEXT;
  14191.                end loop;
  14192.  
  14193.                -- Write the 'end' of the task declaration.
  14194.                DECREMENT_INDENTATION;
  14195.                WRITE_LINE ("end " & EXTRACT(TREE(NODE).NAME) & " ;" );
  14196.  
  14197.             when TYPE_BODY =>
  14198.                -- No body code placed in the specs.
  14199.                null;
  14200.  
  14201.             when EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION =>
  14202.                -- If this Exported declaration is Connected to
  14203.                -- the an exported item of a contained package, then 
  14204.                -- all the exported items of that package
  14205.                -- must be made visible.
  14206.                TREE_PTR := TREE(NODE).CONNECTEE;
  14207.                if TREE_PTR /= NULL_POINTER then 
  14208.                   -- If connected to another export then declare the
  14209.                   -- Parent.
  14210.                   if (TREE(TREE_PTR).NODE_TYPE in 
  14211.                   EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION) or
  14212.                   TREE(TREE_PTR).NODE_TYPE = TYPE_ENTRY_POINT then
  14213.                      EMIT_SPECS (TREE(TREE_PTR).PARENT);
  14214.                   else
  14215.                      -- Write declaration using actual declaration.
  14216.                      EMIT_SPECS (TREE_PTR);
  14217.                   end if;
  14218.                else
  14219.                   -- Process all non-connected exports.
  14220.                   case TREE(NODE).NODE_TYPE is
  14221.                      when EXPORTED_PROCEDURE =>
  14222.                         NEW_LINE ;
  14223.                         -- Write the procedure declaration.
  14224.                         WRITE_LINE ("procedure " & EXTRACT(TREE(NODE).NAME) 
  14225.                          & " ;" );
  14226.                      when EXPORTED_FUNCTION =>
  14227.                         NEW_LINE ;
  14228.                         -- Write the function declaration.
  14229.                         WRITE_LINE ("function " & EXTRACT(TREE(NODE).NAME) 
  14230.                          & " return TBD_TYPE ;" );
  14231.                      when EXPORTED_TYPE =>
  14232.                         -- Write the type declaration.
  14233.                         WRITE_LINE ("type " & EXTRACT(TREE(NODE).NAME) 
  14234.                          & " is new TBD_TYPE ;");
  14235.                      when EXPORTED_OBJECT =>
  14236.                         -- Write the object declaration.
  14237.                         WRITE_LINE (EXTRACT(TREE(NODE).NAME) & " : TBD_TYPE ;");
  14238.                      when EXPORTED_EXCEPTION =>
  14239.                         -- Write the exception declaration.
  14240.                         WRITE_LINE (EXTRACT(TREE(NODE).NAME) & " : exception ;");
  14241.                      when others =>
  14242.                         null;
  14243.                   end case;
  14244.                   -- Mark valid CONNECTEEs as declared.
  14245.                   if TREE_PTR /= NULL_POINTER then
  14246.                      DECLARED(TREE_PTR) := TRUE;
  14247.                   end if;
  14248.                end if;
  14249.             when others =>
  14250.                -- Should not occur here!  Send an error message to the
  14251.                -- user an attempt to continue.
  14252.                NEW_LINE;
  14253.                WRITE_LINE ("*** Erroneous construct detected in Tree ***");
  14254.                NEW_LINE;
  14255.          end case;
  14256.          -- Mark the current NODE as declared.
  14257.          DECLARED(NODE) := TRUE;
  14258.          -- Reset the nesting level.
  14259.          NESTING_LEVEL := NESTING_LEVEL - 1 ;
  14260.       end if;
  14261.    end EMIT_SPECS;
  14262.  
  14263.    ------------------------------------------------------------------------
  14264.    --  The procedure to emit the PDL for the bodies
  14265.    ------------------------------------------------------------------------
  14266.    procedure EMIT_BODIES (NODE: in TREE_NODE_ACCESS_TYPE) is
  14267.    --  This procedure emits the PDL for the body of the current 
  14268.    --  Tree node, and recursively invokes itself for contained
  14269.    --  entities of the current node.
  14270.       CONN_PTR : TREE_NODE_ACCESS_TYPE;
  14271.       FIRST : BOOLEAN;
  14272.       PTR : LIST_NODE_ACCESS_TYPE;
  14273.       TREE_PTR : TREE_NODE_ACCESS_TYPE;
  14274.    begin
  14275.       TRACE (" starting EMIT_BODIES " & INTEGER'image(NODE) & " (tree) ");
  14276.       -- check if NODE is valid
  14277.       if NODE = NULL_POINTER then
  14278.          return;
  14279.       end if;
  14280.       -- Increment the nesting level to show inside a body.
  14281.       NESTING_LEVEL := NESTING_LEVEL + 1 ;
  14282.       case TREE(NODE).NODE_TYPE is
  14283.          when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  14284.             -- Skip this node if it is a Generic Instantiation.
  14285.             if TREE(NODE).GENERIC_STATUS /= GENERIC_INSTANTIATION then
  14286.                -- If the package is not already declared then declare it now.
  14287.                if not DECLARED(NODE) then
  14288.                   EMIT_SPECS (NODE);
  14289.                end if;
  14290.  
  14291.                NEW_LINE ;   
  14292.                -- Write the 'WITH' statements of visible units.
  14293.                WRITE_WITHS_OF_VISIBLE_UNITS ( NODE ) ;
  14294.                -- Write the 'start' of the package body.
  14295.                WRITE ("package body " & EXTRACT(TREE(NODE).NAME) & " is" );
  14296.                if TREE(NODE).NODE_TYPE = TYPE_VIRTUAL_PACKAGE then
  14297.                   WRITE ("  --" & UNTRANS & " VIRTUAL PACKAGE");
  14298.                end if;
  14299.                NEW_LINE;
  14300.                INCREMENT_INDENTATION;
  14301.  
  14302.                -- Write the prologue.
  14303.                WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14304.  
  14305.                -- Scan the DATA_CONNECT_LIST and write the 'use's.
  14306.                PTR := TREE(NODE).DATA_CONNECT_LIST ;
  14307.                while PTR /= NULL_POINTER loop
  14308.                   WRITE_LINE ("use " & 
  14309.                    EXTRACT(TREE(TREE(LIST(PTR).ITEM).CONNECTEE).NAME) & " ;") ;
  14310.                   PTR := LIST(PTR).NEXT ;
  14311.                end loop ;
  14312.  
  14313.                -- Scan the CONTAINED_ENTITY_LIST for undeclared components,
  14314.                -- processing generic declarations in the first pass, and 
  14315.                -- all others in the second pass.
  14316.                PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14317.                while PTR /= NULL_POINTER loop
  14318.                   begin
  14319.                      if TREE( LIST(PTR).ITEM ).NODE_TYPE in TYPE_PACKAGE ..TYPE_FUNCTION 
  14320.                       and then TREE( LIST(PTR).ITEM ).GENERIC_STATUS = GENERIC_DECLARATION 
  14321.                       and then ( not DECLARED (LIST(PTR).ITEM) ) then
  14322.                         EMIT_SPECS (LIST(PTR).ITEM);
  14323.                      end if;
  14324.                   exception
  14325.                      when others => null ;
  14326.                   end ;
  14327.                   PTR := LIST(PTR).NEXT;
  14328.                end loop;
  14329.                -- Loop and process the non-declared entities which are not 
  14330.                -- generic declarations.
  14331.                PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14332.                while PTR /= NULL_POINTER loop
  14333.                   if not DECLARED (LIST(PTR).ITEM) then
  14334.                      EMIT_SPECS (LIST(PTR).ITEM);
  14335.                   end if;
  14336.                   PTR := LIST(PTR).NEXT;
  14337.                end loop;
  14338.  
  14339.                -- Scan the EXPORTED_LIST for visible subprograms and
  14340.                -- packages which are not connected to other entities
  14341.                -- and hence should be declared as 'separate'
  14342.                PTR := TREE(NODE).EXPORTED_LIST ;
  14343.                while PTR /= NULL_POINTER loop
  14344.                   TREE_PTR := LIST(PTR).ITEM ;
  14345.                   if TREE(TREE_PTR).NODE_TYPE in EXPORTED_PROCEDURE ..
  14346.                    EXPORTED_FUNCTION and then 
  14347.                    TREE(TREE_PTR).CONNECTEE = NULL_POINTER then
  14348.                      if TREE(TREE_PTR).NODE_TYPE = EXPORTED_PROCEDURE then
  14349.                         -- The exported procedure declaration is not connected 
  14350.                         -- to an actual declaration, so no body will be 
  14351.                         -- generated.  Make the body a subunit (separate).
  14352.                         NEW_LINE ;
  14353.                         WRITE_LINE ("procedure " & EXTRACT(TREE(TREE_PTR).NAME) 
  14354.                          & " is separate ;" );
  14355.                      else    -- exported function
  14356.                         -- The exported function declaration is not connected 
  14357.                         -- to an actual declaration, so no body will be 
  14358.                         -- generated.  Make the body a subunit (separate).
  14359.                         NEW_LINE ;
  14360.                         WRITE_LINE ("function " & EXTRACT(TREE(TREE_PTR).NAME) 
  14361.                          & " return TBD_TYPE is separate ;" );
  14362.                      end if ;
  14363.                   end if ;
  14364.                   PTR := LIST(PTR).NEXT ;
  14365.                end loop ;
  14366.  
  14367.                -- Scan the CONTAINED_ENTITY_LIST and write the nested 
  14368.                -- components.
  14369.                PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14370.                while PTR /= NULL_POINTER loop
  14371.                   EMIT_BODIES (LIST(PTR).ITEM);
  14372.                   PTR := LIST(PTR).NEXT;
  14373.                end loop;
  14374.                -- If a body exists then process for possible call connections.
  14375.                DECREMENT_INDENTATION;
  14376.                if TREE(NODE).BODY_PTR /= NULL_POINTER then
  14377.                   EMIT_BODIES (TREE(NODE).BODY_PTR);
  14378.                end if;
  14379.                -- Write the 'end' of the package body.
  14380.                WRITE ("end " & EXTRACT(TREE(NODE).NAME) & " ;" );
  14381.                if TREE(NODE).NODE_TYPE = TYPE_VIRTUAL_PACKAGE then
  14382.                   WRITE ("  --" & UNTRANS & " VIRTUAL PACKAGE");
  14383.                end if;
  14384.                NEW_LINE ;
  14385.             end if;
  14386.          when TYPE_PROCEDURE =>
  14387.             -- Skip this node if it is a Generic Instantiation.
  14388.             if TREE(NODE).GENERIC_STATUS = GENERIC_INSTANTIATION then
  14389.                return;
  14390.             end if;
  14391.             -- Write the subprogram declaration.
  14392.             NEW_LINE ;
  14393.             WRITE_WITHS_OF_VISIBLE_UNITS ( NODE ) ;
  14394.             WRITE ("procedure " & EXTRACT(TREE(NODE).NAME));
  14395.             -- If the procedure has calling parameters then write them.
  14396.             if TREE(NODE).HAS_PARAMETERS then
  14397.                 WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14398.             end if;
  14399.             WRITE_LINE (" is " );
  14400.  
  14401.             -- Begin writing the declarative section.
  14402.             INCREMENT_INDENTATION ;
  14403.  
  14404.             -- Write the prologue.
  14405.             WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14406.  
  14407.             -- Scan the DATA_CONNECT_LIST and write the 'use's.
  14408.             PTR := TREE(NODE).DATA_CONNECT_LIST ;
  14409.             while PTR /= NULL_POINTER loop
  14410.                WRITE_LINE ("use " & 
  14411.                 EXTRACT(TREE(TREE(LIST(PTR).ITEM).CONNECTEE).NAME) & " ;") ;
  14412.                PTR := LIST(PTR).NEXT ;
  14413.             end loop ;
  14414.             -- Scan the CONTAINED_ENTITY_LIST and write the nested components.
  14415.             PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14416.             while PTR /= NULL_POINTER loop
  14417.                if TREE(LIST(PTR).ITEM).NODE_TYPE = TYPE_TASK or
  14418.                 TREE(LIST(PTR).ITEM).NODE_TYPE in 
  14419.                 TYPE_VIRTUAL_PACKAGE..TYPE_PACKAGE then 
  14420.                   EMIT_SPECS (LIST(PTR).ITEM) ;
  14421.                end if ;
  14422.                EMIT_BODIES (LIST(PTR).ITEM);
  14423.                PTR := LIST(PTR).NEXT;
  14424.             end loop;
  14425.             -- End the declarative section.
  14426.             DECREMENT_INDENTATION ;
  14427.  
  14428.             -- If a body exists then process for possible call connections.
  14429.             if TREE(NODE).BODY_PTR /= NULL_POINTER then
  14430.                EMIT_BODIES (TREE(NODE).BODY_PTR);
  14431.             else
  14432.                -- Write the 'begin' followed by a null statement to permit
  14433.                -- compilation.
  14434.                WRITE_LINE ("begin");
  14435.                INCREMENT_INDENTATION ;
  14436.                WRITE_LINE ("null ;") ;
  14437.                DECREMENT_INDENTATION ;
  14438.             end if;
  14439.             -- Write the 'end' statement.
  14440.             WRITE_LINE ("end " & EXTRACT(TREE(NODE).NAME) & " ;" );
  14441.          when TYPE_FUNCTION =>
  14442.             -- Skip if this node is a Generic Instantiation.
  14443.             if TREE(NODE).GENERIC_STATUS = GENERIC_INSTANTIATION then
  14444.                return;
  14445.             end if;
  14446.             -- Write the function declaration.
  14447.             NEW_LINE ;
  14448.             WRITE_WITHS_OF_VISIBLE_UNITS ( NODE ) ;
  14449.             WRITE ("function " & EXTRACT(TREE(NODE).NAME));
  14450.             -- If the procedure has calling parameters then write them.
  14451.             if TREE(NODE).HAS_PARAMETERS then
  14452.                 WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14453.             end if;
  14454.             -- Write the return portion of the declaration.
  14455.             WRITE_LINE (" return TBD_TYPE is ") ;
  14456.  
  14457.             -- Begin writing the declarative section.
  14458.             INCREMENT_INDENTATION ;
  14459.  
  14460.             -- Write the prologue.
  14461.             WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14462.  
  14463.             -- Scan the DATA_CONNECT_LIST and write the 'use's.
  14464.             PTR := TREE(NODE).DATA_CONNECT_LIST ;
  14465.             while PTR /= NULL_POINTER loop
  14466.                WRITE_LINE ("use " & 
  14467.                 EXTRACT(TREE(TREE(LIST(PTR).ITEM).CONNECTEE).NAME) & " ;") ;
  14468.                PTR := LIST(PTR).NEXT ;
  14469.             end loop ;
  14470.  
  14471.             -- Scan the CONTAINED_ENTITY_LIST and write any nested components.
  14472.             PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14473.             while PTR /= NULL_POINTER loop
  14474.                if TREE(LIST(PTR).ITEM).NODE_TYPE = TYPE_TASK or
  14475.                 TREE(LIST(PTR).ITEM).NODE_TYPE in 
  14476.                 TYPE_VIRTUAL_PACKAGE..TYPE_PACKAGE then 
  14477.                   EMIT_SPECS (LIST(PTR).ITEM) ;
  14478.                end if ;
  14479.                EMIT_BODIES (LIST(PTR).ITEM);
  14480.                PTR := LIST(PTR).NEXT;
  14481.             end loop;
  14482.             -- End the declarative section.
  14483.             DECREMENT_INDENTATION ;
  14484.  
  14485.             -- If a body exists then process for possible call connections.
  14486.             if TREE(NODE).BODY_PTR /= NULL_POINTER then
  14487.                EMIT_BODIES (TREE(NODE).BODY_PTR);
  14488.             else
  14489.                -- Write the 'begin' statement.
  14490.                WRITE_LINE ("begin");
  14491.             end if;
  14492.             -- Write the return statement to permit compilation.
  14493.             INCREMENT_INDENTATION ;
  14494.             WRITE_LINE ("return TBD_OBJECT ;") ;
  14495.             DECREMENT_INDENTATION ;
  14496.             -- Write the 'end' statement.
  14497.             WRITE_LINE ("end " & EXTRACT(TREE(NODE).NAME) & " ;" );
  14498.  
  14499.          when TYPE_TASK =>
  14500.             NEW_LINE ;
  14501.             -- Write the task declarative statement.
  14502.             WRITE_LINE ("task body " & EXTRACT(TREE(NODE).NAME) & " is");
  14503.  
  14504.             -- Begin writing the declarative section.
  14505.             INCREMENT_INDENTATION ;
  14506.  
  14507.             -- Write the prologue.
  14508.             WRITE_PROLOGUE ( TREE(NODE).PROLOGUE_PTR ) ;
  14509.  
  14510.             -- Scan the DATA_CONNECT_LIST and write the 'use's.
  14511.             PTR := TREE(NODE).DATA_CONNECT_LIST ;
  14512.             while PTR /= NULL_POINTER loop
  14513.                WRITE_LINE ("use " & 
  14514.                 EXTRACT(TREE(TREE(LIST(PTR).ITEM).CONNECTEE).NAME) & " ;") ;
  14515.                PTR := LIST(PTR).NEXT ;
  14516.             end loop ;
  14517.  
  14518.             -- Scan the CONTAINED_ENTITY_LIST and write any nested components.
  14519.             PTR := TREE(NODE).CONTAINED_ENTITY_LIST;
  14520.             while PTR /= NULL_POINTER loop
  14521.                EMIT_BODIES (LIST(PTR).ITEM);
  14522.                PTR := LIST(PTR).NEXT;
  14523.             end loop;
  14524.             DECREMENT_INDENTATION ;
  14525.  
  14526.             -- If a body exists then process for possible call connections.
  14527.             if TREE(NODE).BODY_PTR /= NULL_POINTER then
  14528.                EMIT_BODIES (TREE(NODE).BODY_PTR);
  14529.             else
  14530.                -- Write the 'begin' statement.
  14531.                WRITE_LINE ("begin");
  14532.             end if;
  14533.             -- Start writing the executable portion of the task body.
  14534.             INCREMENT_INDENTATION;
  14535.             -- Scan the ENTRY_LIST for the entry points and write
  14536.             -- the corresponding accept statements.
  14537.             FIRST := TRUE;
  14538.             PTR := TREE(NODE).ENTRY_LIST;
  14539.             if PTR /= NULL_POINTER then
  14540.                -- Write a select structure if one or more entry points exists.
  14541.                while PTR /= NULL_POINTER and then
  14542.                      LIST(PTR).ITEM /= NULL_POINTER loop
  14543.                   if FIRST then
  14544.                      FIRST := FALSE;
  14545.                      WRITE_LINE ("select");
  14546.                      INCREMENT_INDENTATION;
  14547.                   else
  14548.                      DECREMENT_INDENTATION;
  14549.                      WRITE_LINE ("or");
  14550.                      INCREMENT_INDENTATION;
  14551.                   end if;
  14552.                   TREE_PTR := LIST(PTR).ITEM;
  14553.                   -- Write a guard condition if the entry point is guarded.
  14554.                   if TREE(TREE_PTR).IS_GUARDED then
  14555.                      WRITE_LINE ("when TBD_CONDITION =>");
  14556.                   end if;
  14557.                   WRITE ("accept " & EXTRACT(TREE(TREE_PTR).NAME));
  14558.                   -- Write calling parameters if the entry point has them.
  14559.                   if TREE(TREE_PTR).WITH_PARAMETERS then
  14560.                      WRITE (" (HAS_PARAMETERS: TBD_TYPE)");
  14561.                   end if;
  14562.                   WRITE_LINE (" ;");
  14563.                   PTR := LIST(PTR).NEXT;
  14564.                end loop;
  14565.                DECREMENT_INDENTATION;
  14566.                WRITE_LINE ("end select ;");
  14567.             else
  14568.                -- Write a null statement to permit compilation.
  14569.                WRITE_LINE ("null ;") ;
  14570.             end if;
  14571.             -- Write the 'end' of the task declaration.
  14572.             DECREMENT_INDENTATION;
  14573.             WRITE_LINE ("end " & EXTRACT(TREE(NODE).NAME) & " ;");
  14574.          when TYPE_BODY =>
  14575.             -- Output the start of the body
  14576.             WRITE_LINE ("begin");            
  14577.             -- Write the code for calls by traversing CALLEE_LIST.
  14578.             INCREMENT_INDENTATION;
  14579.             PTR := TREE(NODE).CALLEE_LIST;
  14580.             if PTR = NULL_POINTER then
  14581.                -- If no calls exist, then write a null body.
  14582.                WRITE_LINE ("null ;") ;
  14583.             else
  14584.                while PTR /= NULL_POINTER loop
  14585.                   TREE_PTR := LIST(PTR).ITEM ;
  14586.                   -- If this call is for conditional or timed 
  14587.                   --  then write the first part of this call type.
  14588.                   if TREE(TREE_PTR).CALL_VARIETY = 
  14589.                         GRAPHICS_DATA.CALL_CONNECTION_TYPE'(CONDITIONAL) then
  14590.                      WRITE_LINE ("if TBD_CONDITION then") ;
  14591.                      INCREMENT_INDENTATION ;
  14592.                   elsif TREE(TREE_PTR).CALL_VARIETY = 
  14593.                         GRAPHICS_DATA.CALL_CONNECTION_TYPE'(TIMED) then
  14594.                      WRITE_LINE ("select") ;
  14595.                      INCREMENT_INDENTATION ;
  14596.                   end if ;
  14597.                   -- Callee List points to connections.
  14598.                   CONN_PTR := TREE(TREE_PTR).CONNECTEE;
  14599.  
  14600.                   -- If a connection is to an exported entity, check if it
  14601.                   -- is connected to an inner level.
  14602.                   begin
  14603.                      if TREE( CONN_PTR ).NODE_TYPE in 
  14604.                       EXPORTED_PROCEDURE .. EXPORTED_ENTRY_POINT then
  14605.                         while TREE( CONN_PTR ).CONNECTEE /= NULL_POINTER loop
  14606.                            CONN_PTR := TREE( CONN_PTR ).CONNECTEE ;
  14607.                         end loop ;
  14608.                      end if ;
  14609.                   exception
  14610.                      when others => null ;
  14611.                   end ;
  14612.  
  14613.                   -- For function calls write a variable for the return value.
  14614.                   if TREE(CONN_PTR).NODE_TYPE = TYPE_FUNCTION or
  14615.                    TREE(CONN_PTR).NODE_TYPE = EXPORTED_FUNCTION or
  14616.                    TREE(CONN_PTR).NODE_TYPE = IMPORTED_FUNCTION then
  14617.                      WRITE ("TBD_OBJECT := ") ;
  14618.                   end if ;
  14619.                   -- Write the name of the subprogram called.
  14620.                   WRITE (GET_FULL_NAME( CONN_PTR )) ;
  14621.                   if TREE(CONN_PTR).NODE_TYPE in TYPE_PROCEDURE .. 
  14622.                    TYPE_FUNCTION then 
  14623.                      if TREE(CONN_PTR).HAS_PARAMETERS then
  14624.                         WRITE (" (TBD_PARAMETERS)");
  14625.                      end if ;
  14626.                   elsif TREE(CONN_PTR).NODE_TYPE = TYPE_ENTRY_POINT then
  14627.                      if TREE(CONN_PTR).WITH_PARAMETERS then
  14628.                         WRITE (" (TBD_PARAMETERS)");
  14629.                      end if ;
  14630.                   end if ;
  14631.                   WRITE_LINE (" ;");
  14632.                   -- If this call is conditional or timed then
  14633.                   --  write the closing part.
  14634.                   if TREE(TREE_PTR).CALL_VARIETY = 
  14635.                         GRAPHICS_DATA.CALL_CONNECTION_TYPE'(CONDITIONAL) then
  14636.                      DECREMENT_INDENTATION ;
  14637.                      WRITE_LINE ("end if ;") ;
  14638.                   elsif TREE(TREE_PTR).CALL_VARIETY = 
  14639.                         GRAPHICS_DATA.CALL_CONNECTION_TYPE'(TIMED) then
  14640.                      DECREMENT_INDENTATION ;
  14641.                      WRITE_LINE ("or") ;
  14642.                      WRITE_LINE ("   delay TBD_TIME ;") ;
  14643.                      WRITE_LINE ("end select ;") ;
  14644.                   end if ;
  14645.                   -- Process next call in the list.
  14646.                   PTR := LIST(PTR).NEXT;
  14647.                end loop;
  14648.             end if ;
  14649.             DECREMENT_INDENTATION;
  14650.          when others =>
  14651.             -- Should not occur here!  Send an error message to the
  14652.             -- user an attempt to continue.
  14653.             NEW_LINE;
  14654.             WRITE_LINE ("*** Erroneous construct detected in Tree ***");
  14655.             NEW_LINE;
  14656.       end case;
  14657.       NESTING_LEVEL := NESTING_LEVEL - 1 ;
  14658.    end EMIT_BODIES;
  14659.  
  14660.    ------------------------------------------------------------------------
  14661.    --  The procedure to GENERATE_PDL
  14662.    ------------------------------------------------------------------------
  14663.    procedure GENERATE_PDL ( PDL_FILE_NAME : in TREE_IO.FILENAME_TYPE ) is
  14664.       --  
  14665.       --  This procedure walks the current Graph Tree and emits the
  14666.       --  corresponding Ada PDL in the file designated by the user.
  14667.       --  The procedure expects that PDL_FILE_NAME contains the name
  14668.       --  of the file to place the generated PDL in.
  14669.       --  
  14670.       PTR : LIST_NODE_ACCESS_TYPE;
  14671.       TMP_FILE : TEXT_IO.FILE_TYPE;
  14672.    begin
  14673.       -- create the PDL output file with TEXT_IO calls
  14674.       declare
  14675.          use TEXT_IO ;
  14676.       begin
  14677.          TEXT_IO.CREATE ( PDL_FILE ,
  14678.                           OUT_FILE ,
  14679.                           TREE_IO.COMPLETE_FILE_NAME ( PDL_FILE_NAME ,
  14680.                                                        FILENAME_EXTENSION ) ) ;
  14681.       end ;
  14682.  
  14683.       -- If write to screen was requested then initialize the screen.
  14684.       if WRITE_PDL_TO_SCREEN then
  14685.          INITIALIZE_SCREEN_DISPLAY ;
  14686.       end if ;
  14687.  
  14688.       -- initialize the DECLARED array to show nothing yet declared
  14689.       for I in 1 .. MAX_TREE_NODES loop
  14690.          DECLARED(I) := FALSE;
  14691.       end loop;
  14692.       -- initialize the Indentation level and line length to
  14693.       -- permit multiple invocations of GENERATE_PDL
  14694.       INDENTATION := 0;
  14695.       LINE_LENGTH := 0;
  14696.  
  14697.       -- write the Support Package if that option was requested
  14698.       if INCLUDE_SUPPORT_PACKAGE then
  14699.          WRITE_SUPPORT_PACKAGE ;
  14700.       end if ;
  14701.  
  14702.       -- starting from the ROOT_NODE, generate the PDL for the
  14703.       -- specs of each contained entity
  14704.       PTR := TREE(ROOT_NODE).CONTAINED_ENTITY_LIST;
  14705.       TRACE (" start spec " & INTEGER'image(PTR) & " (list node) ");
  14706.       while PTR /= NULL_POINTER loop
  14707.          EMIT_SPECS (LIST(PTR).ITEM);
  14708.          PTR := LIST(PTR).NEXT;
  14709.       end loop;
  14710.  
  14711.       -- output blank line between the SPEC and BODY
  14712.       NEW_LINE ;
  14713.  
  14714.       -- starting from the ROOT_NODE, generate the PDL for the
  14715.       -- bodies of each contained entity
  14716.       PTR := TREE(ROOT_NODE).CONTAINED_ENTITY_LIST;
  14717.       TRACE (" start body " & INTEGER'image(PTR) & " (list node) ");
  14718.       while PTR /= NULL_POINTER loop
  14719.          EMIT_BODIES (LIST(PTR).ITEM);
  14720.          PTR := LIST(PTR).NEXT;
  14721.       end loop;
  14722.  
  14723.       -- close the PDL file
  14724.       TEXT_IO.CLOSE (PDL_FILE);
  14725.  
  14726.       -- If write to screen was requested then terminate the display.
  14727.       if WRITE_PDL_TO_SCREEN then
  14728.          TERMINATE_SCREEN_DISPLAY ;
  14729.       end if ;
  14730.  
  14731.    exception
  14732.       when others =>
  14733.          if TEXT_IO.IS_OPEN (PDL_FILE) then
  14734.             -- write an error message indication unsuccessful completion
  14735.             WRITE_LINE (" PDL generation unsuccessfully completed ");
  14736.             -- close the PDL file
  14737.             TEXT_IO.CLOSE (PDL_FILE);
  14738.          else
  14739.             raise;
  14740.          end if;
  14741.  
  14742.    end GENERATE_PDL;
  14743.  
  14744. end PDL_GEN;
  14745. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  14746. --util_for_tree_spec.ada
  14747. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  14748. -- version 86-01-03 15:40 by JL
  14749.  
  14750. with SYSTEM             ;
  14751. with GKS_SPECIFICATION  ; use GKS_SPECIFICATION ;
  14752. with GRAPHICS_DATA      ; use GRAPHICS_DATA  ;
  14753. with MMI_PARAMETERS     ; use MMI_PARAMETERS ;
  14754. with TREE_DATA          ; use TREE_DATA ;
  14755. with TREE_IO            ; use TREE_IO ;
  14756.  
  14757. package UTIL_FOR_TREE is
  14758. -- ===========================================================
  14759. --
  14760. --  This package provides the common MMI functions that use
  14761. --  tree data and operations. It was seperated from package
  14762. --  "UTILITIES" on 27 Aug 1985.
  14763. --
  14764. -- ==========================================================
  14765.  
  14766.    package GRAPHICS renames GRAPHICS_DATA ;
  14767.  
  14768.    procedure ARCHIVE_THE_TREE ;
  14769.    -- =====================================================================
  14770.    --  This procedure saves the tree data to allow recovery
  14771.    -- =====================================================================
  14772.  
  14773.    procedure RECOVER_THE_TREE ;
  14774.    -- =====================================================================
  14775.    --  This procedure recover the tree data allowing for abort
  14776.    --  recovery/undo.  Deletes the current display, recovers
  14777.    --  the archived tree data, then redraws the tree.
  14778.    -- =====================================================================
  14779.  
  14780.    function CHECK_IF_GENERIC_INSTAN
  14781.             ( TREE_NODE : TREE_NODE_ACCESS_TYPE )
  14782.    return BOOLEAN ;
  14783.    -- =====================================================================
  14784.    --  This procedure returns true if the TREE_NODE passed to it is
  14785.    --  a generic instantiation.
  14786.    -- =====================================================================
  14787.  
  14788.    function COMPUTE_NESTING_LEVEL (TREE_POINTER : in TREE_NODE_ACCESS_TYPE)
  14789.    return INTEGER ;
  14790.    -- ===================================================
  14791.    --  This function computes the nesting level of the
  14792.    --  object whose Tree pointer is passed to it.
  14793.    -- ===================================================
  14794.  
  14795.    procedure DISPLAY_AND_IDENTIFY 
  14796.              ( ENTITY_ITEM : ENTITY_TYPE ;
  14797.                ENTITY_NAME : TREE_DATA.NAME_TYPE ;
  14798.                LABEL_POINT : GRAPHICS_DATA.POINT ; 
  14799.                SIZE_POINT : in out GRAPHICS_DATA.POINT ; 
  14800.                COLOR : GRAPHICS_DATA.COLOR_TYPE ;
  14801.                REFERENCE_SEG_ID : in out GKS_SPECIFICATION.SEGMENT_NAME ) ;
  14802.    -- =========================================================
  14803.    --  This procedure displays the entity and returns the 
  14804.    --  segment identifier.
  14805.    -- =========================================================
  14806.  
  14807.    procedure DRAW_GRAPH_TREE 
  14808.              ( PARENT         : in TREE_NODE_ACCESS_TYPE := ROOT_NODE ;
  14809.                SET_GRAPH_VIEW : in Boolean := false ) ;
  14810.    -- =========================================================
  14811.    --  This procedure draws the contents of the graph tree to 
  14812.    --  the graphics display.
  14813.    -- =========================================================
  14814.  
  14815.    function GET_FILE_HANDLE ( SUPRESS_CLEAR_SCREEN : in BOOLEAN := false ) 
  14816.    return TREE_IO.FILENAME_TYPE ;
  14817.    -- ===================================================
  14818.    --  This function prompts the user for a filename and
  14819.    --  opens the file returning the FILE_TYPE needed to
  14820.    --  access the file.
  14821.    -- ===================================================
  14822.  
  14823.    function GET_FIGURE_TYPE ( PARENT : ENTITY_TYPE ) return
  14824.         GRAPHICS_DATA.GRAPHIC_ENTITY ;
  14825.    -- =========================================================
  14826.    --  This procedure returns the figure_entity declaration
  14827.    --  for the corresponding entity_type declaration.
  14828.    -- =========================================================
  14829.  
  14830.    function GET_GENERIC_LABEL_STRING
  14831.             ( TREE_ELEMENT : TREE_DATA.TREE_NODE_ACCESS_TYPE ) 
  14832.             return String ;
  14833.    -- ===================================================
  14834.    -- This function returns the proper generic label.
  14835.    -- ===================================================
  14836.  
  14837.    function GET_GENERIC_OFFSET_LOCATION
  14838.             ( GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) 
  14839.             return GRAPHICS_DATA.POINT ;
  14840.    -- ===================================================
  14841.    -- This function returns the proper generic label location.
  14842.    -- ===================================================
  14843.  
  14844.    function GET_LABEL_STRING
  14845.             ( TREE_ELEMENT : TREE_DATA.TREE_NODE_ACCESS_TYPE ) 
  14846.             return String ;
  14847.    -- ===================================================
  14848.    -- This function returns the proper basic label.
  14849.    -- ===================================================
  14850.  
  14851.    function GET_LINE_TYPE ( PARENT : ENTITY_TYPE ) return
  14852.         GRAPHICS_DATA.LINE_ENTITY ;
  14853.    -- =========================================================
  14854.    --  This procedure returns the line_entity declaration
  14855.    --  for the corresponding entity_type declaration.
  14856.    -- =========================================================
  14857.  
  14858.    function GET_OFFSET_LOCATION
  14859.             ( GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) 
  14860.             return GRAPHICS_DATA.POINT ;
  14861.    -- ===================================================
  14862.    -- This function returns the proper label location.
  14863.    -- ===================================================
  14864.  
  14865.    procedure LABEL_CALL_MARKING
  14866.              ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) ;
  14867.    -- =========================================================
  14868.    --  This procedure draws the marker symbol for a call 
  14869.    --  connection that is timed or conditional.
  14870.    -- =========================================================
  14871.  
  14872.    function LOWEST_COMMON_PARENT (FIRST_TREE_NODE, SECOND_TREE_NODE :
  14873.                                        in TREE_NODE_ACCESS_TYPE)
  14874.         return TREE_NODE_ACCESS_TYPE ;
  14875.    -- ===================================================
  14876.    --  This function determines the lowest common parent
  14877.    --  of the two given tree nodes.
  14878.    -- ===================================================
  14879.  
  14880.    procedure PERFORM_GRAPH_TREE_OP 
  14881.              ( PARENT : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14882.                OPERATION : in SEGMENT_OPS_TYPE ) ;
  14883.    -- =========================================================
  14884.    --  This procedure performs the selected operation on the
  14885.    --  subtree defined by PARENT.
  14886.    -- =========================================================
  14887.  
  14888.    procedure PERFORM_LINE_OP 
  14889.              ( TREE_POINTER : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14890.                OPERATION : in SEGMENT_OPS_TYPE ) ;
  14891.    -- =========================================================
  14892.    --  This procedure performs the selected operation on the
  14893.    --  line defined by TREE_POINTER.
  14894.    -- =========================================================
  14895.  
  14896.    procedure PERFORM_SEGMENT_OP 
  14897.              ( SEGMENT: in GKS_SPECIFICATION.SEGMENT_NAME ;
  14898.                OPERATION : in SEGMENT_OPS_TYPE ) ;
  14899.    -- =========================================================
  14900.    --  This procedure performs the selected operation on the
  14901.    --  specified segment.
  14902.    -- =========================================================
  14903.  
  14904.    procedure PICK_GRAPH_ENTITY ( PROMPT : in STRING ;
  14905.         GRAPH_NODE : in out TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) ;
  14906.    -- =========================================================
  14907.    --  This procedure performs the prompt display and graph node
  14908.    --  lookup for a picked graphic entity.
  14909.    --  The routine exits with the window being 
  14910.    --  the GRAPH_VIEW_PORT.
  14911.    -- =========================================================
  14912.  
  14913.    procedure REQUEST_CONNECTION 
  14914.              (LINE_PARENT : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14915.               START_POINT : in GRAPHICS_DATA.POINT ;
  14916.               END_POINT   : in GRAPHICS_DATA.POINT ;
  14917.               CONNECTION  : in out TREE_DATA.LINE_TYPE ) ;
  14918.    -----------------------------------------------------------------
  14919.    --  This procedure performs the operations necessary to
  14920.    --  have the User enter the points which define a series
  14921.    --  of line segments which form a connection between the
  14922.    --  starting and ending points.
  14923.    -----------------------------------------------------------------
  14924.  
  14925.    procedure REQUEST_LABEL
  14926.              ( LABEL  : in out TREE_DATA.NAME_TYPE ;
  14927.                OK_IF_BLANK : in BOOLEAN := false ;
  14928.                OK_IF_OVERLOAD : in BOOLEAN := false ) ;
  14929.    -- ==========================================================
  14930.    --  Prompt the operator for the label of a graphical entity,
  14931.    --  and verify the validity of the label.
  14932.    -- ==========================================================
  14933.  
  14934.    procedure REQUEST_LABEL
  14935.              ( LABEL  : in out TREE_DATA.NAME_TYPE ;
  14936.                PROMPT : in STRING ;
  14937.                OK_IF_BLANK : in BOOLEAN := false ;
  14938.                OK_IF_OVERLOAD : in BOOLEAN := false ) ;
  14939.    -- ==========================================================
  14940.    --  Prompt the operator for the label of a graphical entity,
  14941.    --  and verify the validity of the label.
  14942.    -- ==========================================================
  14943.  
  14944.    procedure REQUEST_POINT
  14945.               ( DISPLAY_STRING   : in STRING ;
  14946.                 REFERENCE_POINT  : in out GRAPHICS_DATA.POINT ;
  14947.                 PARENT           : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14948.                 CURSOR_PLACEMENT : in Boolean := False ;
  14949.                 LABEL_CREATE     : in LABEL_CREATE_TYPE := NOT_LABEL ) ;
  14950.    -- =========================================================
  14951.    --  This procedure displays the received string to the
  14952.    --  operator, and returns an operator specified point and
  14953.    --  the associated parent entity.
  14954.    -- =========================================================
  14955.  
  14956.  
  14957.  
  14958.    procedure REQUEST_POINTS
  14959.               ( REFERENCE_POINT   : in out GRAPHICS_DATA.POINT ;
  14960.                 SIZE_POINT        : in out GRAPHICS_DATA.POINT ;
  14961.                 PARENT            : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14962.                 ENCLOSED_ENTITIES : in out TREE_DATA.ENCLOSED_ENTITIES_TYPE ;
  14963.                 ENCLOSURE_EXISTS  : in out BOOLEAN ) ;
  14964.    -- =========================================================
  14965.    --  This procedure request the operator to input the upper
  14966.    --  left and lower right points of the rectangle which 
  14967.    --  delineates the area enclosing the entity to be drawn.
  14968.    -- =========================================================
  14969.  
  14970.    procedure REQUEST_PROLOGUE
  14971.              ( PROLOGUE_NODE : in TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ) ;
  14972.    -- ==========================================================
  14973.    --  Prompt the operator for the PROLOGUE for a graphical entity.
  14974.    -- ==========================================================
  14975.  
  14976.    procedure DISPLAY_PROLOGUE
  14977.              ( PROLOGUE_NODE : in TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ) ;
  14978.    -- ==========================================================
  14979.    --  Display the PROLOGUE for a graphical entity.
  14980.    -- ==========================================================
  14981.  
  14982.    function SCOPE_CHECK
  14983.              ( NEW_ENTITY_POINT : in GRAPHICS_DATA.POINT ;
  14984.                PARENT           : in TREE_DATA.TREE_NODE_ACCESS_TYPE )
  14985.              return BOOLEAN ;
  14986.    -- ==========================================================
  14987.    --  If the specified new entity being drawn is within the
  14988.    --  boundary of the Parent's reference and size points then
  14989.    --  return true; else return false.
  14990.    -- ==========================================================
  14991.  
  14992.    function SCOPE_SEARCH
  14993.              ( REFERENCE_POINT : in GRAPHICS_DATA.POINT )
  14994.              return TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  14995.    -- ==========================================================
  14996.    --  Return a Tree Pointer to the Parent of the user
  14997.    --  specified reference point.  The Parent is the object 
  14998.    --  whose reference and size points contain the user 
  14999.    --  specified reference point.
  15000.    -- ==========================================================
  15001.  
  15002.    procedure VIEW_WINDOW_CHECK
  15003.              ( PARENT : in TREE_NODE_ACCESS_TYPE ) ;
  15004.    -- ========================================================
  15005.    -- Assure that the entire subtree defined by the specified 
  15006.    --  parent is visible on the view window.
  15007.    -- ========================================================
  15008.  
  15009.    ---------------------------------------------------------------
  15010.    --  This exception is raised if an utility subprogram is unable
  15011.    --  to properly complete the requested operation.
  15012.    ---------------------------------------------------------------
  15013.    UTILITY_FAILED : exception ; 
  15014.  
  15015. end UTIL_FOR_TREE ;
  15016. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  15017. --util_for_tree_body.ada
  15018. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  15019. -- version 86-02-06 11:05 BY JB
  15020.  
  15021. with GRAPHIC_DRIVER               ;  use GRAPHIC_DRIVER ;
  15022. with VIRTUAL_TERMINAL_INTERFACE   ;  use VIRTUAL_TERMINAL_INTERFACE ;
  15023. with TEXT_IO                      ;  use TEXT_IO;
  15024. with TREE_OPS                     ;
  15025. with TRACE_PKG                    ;
  15026. with UTILITIES                    ; use UTILITIES ;
  15027.  
  15028. package body UTIL_FOR_TREE is 
  15029. -- ===========================================================
  15030. --
  15031. --  This package provides the common MMI functions that use
  15032. --  tree data and operations. It was seperated from package
  15033. --  "UTILITIES" on 27 Aug 1985.
  15034. --
  15035. -- ==========================================================
  15036.  
  15037.    procedure ARCHIVE_THE_TREE is
  15038.       -- save the tree by assigning all nodes
  15039.       -- to archive locations
  15040.    begin
  15041.       ARCHIVE_TREE := TREE ;
  15042.       ARCHIVE_GRAPH := GRAPH ;
  15043.       ARCHIVE_LIST := LIST ;
  15044.       ARCHIVE_PROLOGUE := PROLOGUE ;
  15045.  
  15046.    end ARCHIVE_THE_TREE ;
  15047.  
  15048.    procedure RECOVER_THE_TREE is
  15049.       -- initialize the tree by assigning all nodes
  15050.       -- to startup state
  15051.    begin
  15052.       -- delete the current tree
  15053.       PERFORM_GRAPH_TREE_OP ( ROOT_NODE, DELETED ) ;
  15054.  
  15055.       -- recover the tree data
  15056.       TREE := ARCHIVE_TREE ;
  15057.       GRAPH := ARCHIVE_GRAPH ;
  15058.       LIST := ARCHIVE_LIST ;
  15059.       PROLOGUE := ARCHIVE_PROLOGUE ;
  15060.  
  15061.       -- display the old tree
  15062.       DRAW_GRAPH_TREE ;
  15063.  
  15064.    end RECOVER_THE_TREE ;
  15065.  
  15066.    function COMPUTE_NESTING_LEVEL (TREE_POINTER : in TREE_NODE_ACCESS_TYPE)
  15067.    return INTEGER is
  15068.    -- ===================================================
  15069.    --  This function computes the nesting level of the
  15070.    --  object whose Tree pointer is passed to it.
  15071.    -- ===================================================
  15072.       NESTING_LEVEL : INTEGER := 0;
  15073.       PARENT : TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  15074.    begin
  15075.       if TREE_POINTER = ROOT_NODE then
  15076.          -- the node is the root, which is not nested at all
  15077.          return 0 ;
  15078.       else
  15079.          PARENT := TREE(TREE_POINTER).PARENT ;
  15080.          NESTING_LEVEL := 1 ;
  15081.          while PARENT /= ROOT_NODE loop
  15082.             PARENT := TREE(PARENT).PARENT ;
  15083.             NESTING_LEVEL := NESTING_LEVEL + 1 ;
  15084.          end loop ;
  15085.          return NESTING_LEVEL ;
  15086.       end if ;
  15087.    exception
  15088.       when others =>
  15089.          DISPLAY_ERROR (" PROGRAM ERROR -- in nesting level computation ") ;
  15090.          TRACE_PKG.TRACE (" PROGRAM ERROR -- in nesting level computation ") ;
  15091.          return MAX_NESTING_LEVEL ;
  15092.    end COMPUTE_NESTING_LEVEL ;
  15093.    
  15094.       
  15095.    procedure DRAW_GRAPH_TREE 
  15096.              ( PARENT         : in TREE_NODE_ACCESS_TYPE := ROOT_NODE ;
  15097.                SET_GRAPH_VIEW : in Boolean := false ) is
  15098.    -- =========================================================
  15099.    -- This procedure draws the contents of the graph tree
  15100.    -- in the graphics window. Each segment is drawn with
  15101.    -- the stored parameters in the graph_tree, any parameter
  15102.    -- not in the graph_tree or Ada_tree will use the 
  15103.    -- system default parameter for that item.
  15104.    -- =========================================================
  15105.       VISITED_NODES     : array ( TREE_DATA.GRAPH'First..TREE_DATA.GRAPH'Last )
  15106.        of Boolean := ( TREE_DATA.GRAPH'First..TREE_DATA.GRAPH'Last => False ) ; 
  15107.       CURRENT_NODE      : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  15108.       END_POINT         : GRAPHICS_DATA.POINT ;
  15109.       GRAPH_ELEMENT     : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  15110.       GRAPH_ENTITY      : TREE_DATA.ENTITY_TYPE ;
  15111.       GRAPH_MASTER_NODE : TREE_DATA.TREE_NODE_ACCESS_TYPE ; 
  15112.       GPTR              : TREE_DATA.TREE_NODE_ACCESS_TYPE ; 
  15113.       SEGMENT           : GKS_SPECIFICATION.SEGMENT_NAME ;
  15114.       START_POINT       : GRAPHICS_DATA.POINT ;
  15115.       SIZE_LOCATION     : GRAPHICS_DATA.POINT ;
  15116.       LINE_NODES        : TREE_DATA.LINE_TYPE ;
  15117.       WALK_STATE        : TREE_OPS.WALK_STATE_TYPE ;
  15118.  
  15119.    begin -- DRAW_GRAPH_TREE
  15120.       if TRACE_PKG.REQUEST_TRACE then
  15121.          TRACE_PKG.TRACE ( "UTIL_FOR_TREE.DRAW_GRAPH_TREE  entered") ;
  15122.       end if ;
  15123.  
  15124.       -- set the window to graphics view port
  15125.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  15126.       -- check each element in the graph tree by walking the syntax tree
  15127.       TREE_OPS.START_TREE_WALK ( PARENT , WALK_STATE ) ;
  15128.       loop
  15129.          -- get the tree node to be processed 
  15130.          TREE_OPS.TREE_WALK ( WALK_STATE, GRAPH_MASTER_NODE ) ;
  15131.          exit when GRAPH_MASTER_NODE = NULL_POINTER  or
  15132.           GRAPH_MASTER_NODE = ROOT_NODE ;  -- no more nodes to walk
  15133.          -- determine the associated graph_node
  15134.          GRAPH_ELEMENT := TREE( GRAPH_MASTER_NODE ).GRAPH_DATA ;
  15135.          -- verify that graph_node is valid and has not been drawn yet 
  15136.          if GRAPH_ELEMENT = NULL_POINTER or else
  15137.           ( not VISITED_NODES( GRAPH_ELEMENT ) ) then
  15138.             -- determine the type of entity to draw
  15139.             GRAPH_ENTITY := TREE_DATA.TREE( GRAPH_MASTER_NODE ).NODE_TYPE ;
  15140.             -- now draw the proper graphical entity
  15141.  
  15142.             -- TRACE OF REDRAW
  15143.             if TRACE_PKG.REQUEST_TRACE then
  15144.               TRACE_PKG.TRACE("UTIL_FOR_TREE.DRAW_GRAPH_TREE entity to draw =" &
  15145.                                 TREE_DATA.ENTITY_TYPE'Image ( GRAPH_ENTITY ) ) ;
  15146.             end if ;
  15147.  
  15148.             -- first draw the symbol if required
  15149.             case GRAPH_ENTITY is
  15150.                when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE | TYPE_PROCEDURE |
  15151.                     TYPE_FUNCTION | TYPE_TASK | TYPE_BODY =>
  15152.                   -- load the body color if required
  15153.                   if GRAPH_ENTITY = TYPE_BODY then
  15154.                      GRAPHICS_DATA.ENTITY_COLOR( BODY_FIGURE ) :=
  15155.                        -- use the color of the parent
  15156.                        GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE
  15157.                           ( TREE(TREE(GRAPH_MASTER_NODE).PARENT).NODE_TYPE )) ;
  15158.                   end if ;
  15159.                   -- draw the figure
  15160.                   SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  15161.                      ( GET_FIGURE_TYPE ( GRAPH_ENTITY ) ,
  15162.                        TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION ,
  15163.                        TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE ) ;
  15164.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SEGMENT_ID := SEGMENT ;
  15165.                when others => -- no draw required
  15166.                   null ;
  15167.             end case ; -- GRAPH_ENTITY first draw
  15168.  
  15169.             -- second draw a line segments symbol if required
  15170.             case GRAPH_ENTITY is
  15171.                when EXPORTED_PROCEDURE .. CONNECTION_FOR_DATA => -- draw figure
  15172.                   LINE_NODES := TREE_DATA.TREE( GRAPH_MASTER_NODE ).LINE ;
  15173.                   if LINE_NODES(1) /= NULL_POINTER then
  15174.                      -- a line exists to be drawn
  15175.                      -- show that the first node has been visited
  15176.                      LABEL_CALL_MARKING( GRAPH_MASTER_NODE ) ;
  15177.                      VISITED_NODES ( LINE_NODES(1) ) := True ;
  15178.                      for I in 2 .. MAXIMUM_NO_LINE_SEGMENTS loop
  15179.                         if LINE_NODES(I) = NULL_POINTER then
  15180.                            -- line is completed
  15181.                            exit ;
  15182.                         else
  15183.                            -- draw the line segment
  15184.                            TREE_DATA.GRAPH( LINE_NODES(I-1) ).DATA.SEGMENT_ID
  15185.                               := 
  15186.                             GRAPHIC_DRIVER.DRAW_LINE 
  15187.                              ( GET_LINE_TYPE ( GRAPH_ENTITY ) ,
  15188.                                TREE_DATA.GRAPH( LINE_NODES(I-1) ).DATA.LOCATION,
  15189.                                TREE_DATA.GRAPH( LINE_NODES(I) ).DATA.LOCATION );
  15190.                            VISITED_NODES ( LINE_NODES(I) ) := True ;
  15191.                         end if ;
  15192.                      end loop ;
  15193.                   end if ;
  15194.                when others => -- no draw required
  15195.                   null ;
  15196.             end case ; -- GRAPH_ENTITY second draw
  15197.  
  15198.             -- third draw the label if required
  15199.             case GRAPH_ENTITY is
  15200.                when TYPE_BODY | CONNECTION_BY_CALL | CONNECTION_FOR_DATA =>
  15201.                   null ;  -- nothing to label
  15202.                when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE | TYPE_PROCEDURE |
  15203.                     TYPE_FUNCTION | TYPE_TASK => 
  15204.                   -- the label graph node may not be the first to be
  15205.                   -- encountered, so use the TREEs GRAPH_NODE value.
  15206.                   GPTR := TREE( GRAPH_MASTER_NODE ).GRAPH_DATA ;
  15207.                   GRAPHIC_DRIVER.LABEL
  15208.                      ( SEGMENT ,
  15209.                        SIZE_LOCATION ,
  15210.                        GET_OFFSET_LOCATION( GPTR ) ,
  15211.                        GET_LABEL_STRING( GRAPH_MASTER_NODE ) ,
  15212.                        GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE
  15213.                           ( GRAPH_ENTITY ) ) ,
  15214.                        GRAPHICS_DATA.WHITE ) ;
  15215.                   TREE_DATA.GRAPH( GPTR ).DATA.LABEL_SEG_ID := SEGMENT ;
  15216.                   VISITED_NODES( GPTR ) := True ;
  15217.                when others => -- import and export labels
  15218.                   -- the label graph node may not be the first to be
  15219.                   -- encountered, so use the TREEs GRAPH_NODE value.
  15220.                   GPTR := TREE( GRAPH_MASTER_NODE ).GRAPH_DATA ;
  15221.                   GRAPHIC_DRIVER.LABEL
  15222.                      ( SEGMENT ,
  15223.                        SIZE_LOCATION ,
  15224.                        GET_OFFSET_LOCATION( GPTR ) ,
  15225.                        GET_LABEL_STRING ( GRAPH_MASTER_NODE ) ,
  15226.                        -- use the color of the parent
  15227.                        GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE
  15228.                           ( TREE(TREE(GRAPH_MASTER_NODE).PARENT).NODE_TYPE ) ) ,
  15229.                        GRAPHICS_DATA.WHITE ) ;
  15230.                   TREE_DATA.GRAPH( GPTR ).DATA.LABEL_SEG_ID := SEGMENT ;
  15231.                   VISITED_NODES( GPTR ) := True ;
  15232.             end case ; -- GRAPH_ENTITY third draw
  15233.  
  15234.             -- forth draw the generic label if required
  15235.             case GRAPH_ENTITY is
  15236.                when TYPE_PACKAGE | TYPE_PROCEDURE | TYPE_FUNCTION =>
  15237.                   -- draw the generic status label if a generic
  15238.                   case TREE_DATA.TREE( GRAPH_MASTER_NODE ).GENERIC_STATUS is
  15239.                      when GENERIC_DECLARATION | GENERIC_INSTANTIATION =>
  15240.                         GRAPHIC_DRIVER.LABEL
  15241.                            ( SEGMENT ,
  15242.                              SIZE_LOCATION ,
  15243.                              GET_GENERIC_OFFSET_LOCATION( GRAPH_ELEMENT ) ,
  15244.                              GET_GENERIC_LABEL_STRING ( GRAPH_MASTER_NODE ) ,
  15245.                              GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE
  15246.                                 ( TREE(GRAPH_MASTER_NODE).NODE_TYPE ) ) ,
  15247.                              GRAPHICS_DATA.WHITE ) ;
  15248.                         -- load the generic label segment id
  15249.                         TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LABEL2_SEG_ID :=
  15250.                            SEGMENT ;
  15251.                      when others => -- NON_GENERIC
  15252.                         null ; 
  15253.                   end case ;
  15254.                when others =>
  15255.                   null ;  -- no draw required
  15256.             end case ; -- GRAPH_ENTITY forth draw
  15257.             -- set the current node as having been visited
  15258.             if GRAPH_ELEMENT /= NULL_POINTER then
  15259.                VISITED_NODES ( GRAPH_ELEMENT ) := True ;
  15260.             end if ;
  15261.  
  15262.          end if ;
  15263.       end loop ; -- GRAPH_ELEMENT
  15264.       -- return the window to menu view port
  15265.       if SET_GRAPH_VIEW then
  15266.          GRAPHIC_DRIVER.SELECT_WINDOW ( GRAPHICS_DATA.WINDOW_TYPE'
  15267.             ( GRAPH_VIEW_PORT ) ) ;
  15268.       else
  15269.          GRAPHIC_DRIVER.SELECT_WINDOW ( GRAPHICS_DATA.WINDOW_TYPE'
  15270.             ( MENU_VIEW_PORT ) ) ;
  15271.       end if ;
  15272.    end DRAW_GRAPH_TREE ;
  15273.  
  15274.  
  15275.       function GET_OFFSET_LOCATION
  15276.                ( GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) 
  15277.                return GRAPHICS_DATA.POINT is
  15278.          -- The function returns the proper label to print
  15279.          OFFSET_LOCATION : GRAPHICS_DATA.POINT ;
  15280.          GRAPH_ENTITY    : TREE_DATA.ENTITY_TYPE := 
  15281.                TREE( GRAPH( GRAPH_ELEMENT ).OWNING_TREE_NODE ).NODE_TYPE ;
  15282.       begin -- GET_OFFSET_LOCATION
  15283.          case GRAPH_ENTITY is
  15284.             when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  15285.                OFFSET_LOCATION.X :=
  15286.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ;
  15287.                OFFSET_LOCATION.Y :=
  15288.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y
  15289.                   + GRAPHICS_DATA.ENTITY_NAME_Y_OFFSET ;
  15290.             when TYPE_TASK =>
  15291.                OFFSET_LOCATION.X :=
  15292.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X 
  15293.                            -- add task offset
  15294.                      + ( ( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y 
  15295.                          - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.Y ) / 3 );
  15296.                OFFSET_LOCATION.Y :=
  15297.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y
  15298.                   + GRAPHICS_DATA.ENTITY_NAME_Y_OFFSET  ;
  15299.             when TYPE_PROCEDURE | TYPE_FUNCTION =>
  15300.                OFFSET_LOCATION.X :=
  15301.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ;
  15302.                OFFSET_LOCATION.Y :=
  15303.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y
  15304.                   - GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT_SPACING ;
  15305.             when others =>
  15306.                OFFSET_LOCATION :=
  15307.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION ;
  15308.          end case ; -- GRAPH_ENTITY
  15309.          return OFFSET_LOCATION ;
  15310.       end GET_OFFSET_LOCATION ;
  15311.  
  15312.  
  15313.       function GET_LABEL_STRING
  15314.                ( TREE_ELEMENT : TREE_DATA.TREE_NODE_ACCESS_TYPE ) 
  15315.                return String is
  15316.          -- The function returns the proper label to print.
  15317.          GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE :=
  15318.                          TREE( TREE_ELEMENT ).GRAPH_DATA ;
  15319.          GRAPH_ENTITY  : TREE_DATA.ENTITY_TYPE := 
  15320.                          TREE( TREE_ELEMENT ).NODE_TYPE ;
  15321.  
  15322.          function GET_GUARD_SYMBOL
  15323.                   ( GUARDED : in Boolean )
  15324.          return String is
  15325.          begin
  15326.            case GUARDED is
  15327.               when True  => return GRAPHICS_DATA.GUARDED_ENTRY_SYMBOL ;
  15328.               when False => return "" ;
  15329.            end case ; -- GUARDED
  15330.          end GET_GUARD_SYMBOL ;
  15331.  
  15332.       begin -- GET_LABEL_STRING
  15333.          case GRAPH_ENTITY is
  15334.             when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  15335.                return TRUNCATE_NAME
  15336.                          ( TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15337.                                   -- text length calculation
  15338.                            ( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X 
  15339.                            - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X) ) ;
  15340.             when TYPE_TASK =>
  15341.                return TRUNCATE_NAME
  15342.                          ( TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15343.                                   -- text length calculation
  15344.                            ( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X 
  15345.                            - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ) 
  15346.                              -- subtract task offset
  15347.                            -(( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y 
  15348.                            - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.Y )/3));
  15349.             when TYPE_PROCEDURE =>
  15350.                return TRUNCATE_NAME
  15351.                          ( " " & TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15352.                                   -- text length calculation
  15353.                            ( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X 
  15354.                            - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X) ,
  15355.                            TREE_DATA.TREE( TREE_ELEMENT ).HAS_PARAMETERS );
  15356.             when TYPE_FUNCTION =>
  15357.                return TRUNCATE_NAME
  15358.                          ( " " & GRAPHICS_DATA.FUNCTION_SYMBOL
  15359.                            & TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15360.                                   -- text length calculation
  15361.                            ( TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X 
  15362.                            - TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X) ,
  15363.                            TREE_DATA.TREE( TREE_ELEMENT ).HAS_PARAMETERS );
  15364.             when TYPE_ENTRY_POINT =>
  15365.                return TRUNCATE_NAME
  15366.                          ( GRAPHICS_DATA.TASK_ENTRY_DECL ( 1 ) &
  15367.                            GET_GUARD_SYMBOL
  15368.                               (TREE_DATA.TREE( TREE_ELEMENT ).IS_GUARDED) &
  15369.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15370.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15371.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET ,
  15372.                            TREE_DATA.TREE( TREE_ELEMENT ).WITH_PARAMETERS )
  15373.                       & GRAPHICS_DATA.TASK_ENTRY_DECL ( 2 ) ;
  15374.             when EXPORTED_ENTRY_POINT =>
  15375.                return TRUNCATE_NAME
  15376.                          ( GRAPHICS_DATA.TASK_ENTRY_DECL ( 1 ) &
  15377.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15378.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15379.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15380.                        & GRAPHICS_DATA.TASK_ENTRY_DECL ( 2 ) ;
  15381.             when IMPORTED_VIRTUAL_PACKAGE =>
  15382.                return TRUNCATE_NAME
  15383.                          ( GRAPHICS_DATA.VIRT_PKG_DECL ( 1 ) &
  15384.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15385.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15386.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15387.                       & GRAPHICS_DATA.VIRT_PKG_DECL ( 2 ) ;
  15388.             when IMPORTED_PACKAGE =>
  15389.                return TRUNCATE_NAME
  15390.                          ( GRAPHICS_DATA.PKG_DECL ( 1 ) &
  15391.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15392.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15393.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15394.                       & GRAPHICS_DATA.PKG_DECL ( 2 ) ;
  15395.             when IMPORTED_PROCEDURE | EXPORTED_PROCEDURE =>
  15396.                return TRUNCATE_NAME
  15397.                          ( GRAPHICS_DATA.SUBPROG_DECL ( 1 ) &
  15398.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15399.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15400.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15401.                       & GRAPHICS_DATA.SUBPROG_DECL ( 2 ) ;
  15402.             when IMPORTED_FUNCTION | EXPORTED_FUNCTION =>
  15403.                return TRUNCATE_NAME
  15404.                          ( GRAPHICS_DATA.SUBPROG_DECL ( 1 ) &
  15405.                            GRAPHICS_DATA.FUNCTION_SYMBOL &
  15406.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15407.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15408.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15409.                       & GRAPHICS_DATA.SUBPROG_DECL ( 2 ) ;
  15410.             when EXPORTED_TYPE =>
  15411.                return TRUNCATE_NAME
  15412.                          ( GRAPHICS_DATA.TYPE_DECL ( 1 ) &
  15413.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15414.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15415.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15416.                       & GRAPHICS_DATA.TYPE_DECL ( 2 ) ;
  15417.             when EXPORTED_OBJECT =>
  15418.                return TRUNCATE_NAME
  15419.                          ( GRAPHICS_DATA.OBJECT_DECL ( 1 ) &
  15420.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15421.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15422.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15423.                       & GRAPHICS_DATA.OBJECT_DECL ( 2 ) ;
  15424.             when EXPORTED_EXCEPTION =>
  15425.                return TRUNCATE_NAME
  15426.                          ( GRAPHICS_DATA.EXCEPTION_DECL ( 1 ) &
  15427.                            TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15428.                            GRAPHICS_DATA.LABEL_MAX_LENGTH +
  15429.                                 GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET )
  15430.                       & GRAPHICS_DATA.EXCEPTION_DECL ( 2 ) ;
  15431.             when others =>
  15432.                return TRUNCATE_NAME
  15433.                          ( TREE_DATA.TREE( TREE_ELEMENT ).NAME ,
  15434.                            GRAPHICS_DATA.LABEL_MAX_LENGTH ) ;
  15435.          end case ; -- GRAPH_ENTITY
  15436.       end GET_LABEL_STRING ;
  15437.  
  15438.  
  15439.       function GET_GENERIC_OFFSET_LOCATION
  15440.                ( GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) 
  15441.                return GRAPHICS_DATA.POINT is
  15442.          -- The function returns the generic label location.
  15443.  
  15444.          GRAPH_ENTITY    : TREE_DATA.ENTITY_TYPE := 
  15445.                TREE( GRAPH( GRAPH_ELEMENT ).OWNING_TREE_NODE ).NODE_TYPE ;
  15446.          OFFSET_LOCATION : GRAPHICS_DATA.POINT ;
  15447.  
  15448.       begin -- GET_GENERIC_OFFSET_LOCATION
  15449.          case GRAPH_ENTITY is
  15450.             when TYPE_PROCEDURE | TYPE_FUNCTION =>
  15451.                OFFSET_LOCATION.X :=
  15452.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ;
  15453.                OFFSET_LOCATION.Y :=
  15454.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y -
  15455.                   GRAPHICS_DATA.STACKED_SIZE -
  15456.                   GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT_SPACING ;
  15457.             when others => -- TYPE_PACKAGE 
  15458.                OFFSET_LOCATION.X :=
  15459.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ;
  15460.                OFFSET_LOCATION.Y :=
  15461.                   TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.Y -
  15462.                   GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT_SPACING ;
  15463.          end case ; -- GRAPH_ENTITY
  15464.          return OFFSET_LOCATION ;
  15465.       end GET_GENERIC_OFFSET_LOCATION ;
  15466.  
  15467.  
  15468.       function GET_GENERIC_LABEL_STRING
  15469.                ( TREE_ELEMENT : TREE_DATA.TREE_NODE_ACCESS_TYPE ) 
  15470.                return String is
  15471.          -- The function returns the proper generic label to print.
  15472.          GRAPH_ELEMENT : TREE_DATA.GRAPH_NODE_ACCESS_TYPE :=
  15473.                          TREE( TREE_ELEMENT ).GRAPH_DATA ;
  15474.       begin -- GET_GENERIC_LABEL_STRING
  15475.          case TREE_DATA.TREE( TREE_ELEMENT ).GENERIC_STATUS is
  15476.             when GENERIC_DECLARATION =>
  15477.                return TRUNCATE_NAME
  15478.                          ( " " & GRAPHICS_DATA.GENERIC_DECL_SYMBOL & " ",
  15479.                            TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X -
  15480.                            TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ) ;
  15481.             when others => -- GENERIC_INSTANTIATION 
  15482.                return TRUNCATE_NAME
  15483.                          ( " " & GRAPHICS_DATA.GENERIC_INST_SYMBOL & " " &
  15484.                            TREE_DATA.TREE( TREE_ELEMENT ).CU_INSTANTIATED ,
  15485.                            TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.SIZE.X -
  15486.                            TREE_DATA.GRAPH( GRAPH_ELEMENT ).DATA.LOCATION.X ) ;
  15487.          end case ;
  15488.       end GET_GENERIC_LABEL_STRING ;
  15489.  
  15490.  
  15491.    function GET_FILE_HANDLE ( SUPRESS_CLEAR_SCREEN : in BOOLEAN := false )
  15492.    return TREE_IO.FILENAME_TYPE is
  15493.    -- ====================================================
  15494.    --  This function prompts the user for a filename and
  15495.    --  opens the file returning the FILE_TYPE needed to
  15496.    --  access the file.
  15497.    -- ====================================================
  15498.       HANDLE        : TREE_IO.FILENAME_TYPE := TREE_IO.DATA_FILENAME ;
  15499.       NEW_FILE_NAME : TREE_IO.FILENAME_TYPE ;
  15500.       BLANK_FILE_NAME : TREE_IO.FILENAME_TYPE := (others => ' ') ;
  15501.       LINE_1       : constant STRING :=
  15502.                       " Enter the file name to be used (omit extension)" ;
  15503.       ERROR_NOTICE : constant STRING :=
  15504.                       " ILLEGAL File Name Entered " ;
  15505.       PROMPT       : constant STRING := "FILE NAME => " ;
  15506.       WORK_STRG    : STRING( 1..TREE_IO.FILENAME_TYPE'Length+PROMPT'Length ) ;
  15507.       VALIDITY_CHECK : TEXT_IO.FILE_TYPE ;
  15508.       VALID_NAME     : Boolean := False ;
  15509.  
  15510.    begin
  15511.       -- erase the crt screen
  15512.       if not SUPRESS_CLEAR_SCREEN then
  15513.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  15514.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  15515.       end if ;
  15516.       -- repeat until a valid file name is received and checked
  15517.       loop
  15518.          --  present command to user
  15519.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  15520.             ( LINE_1 , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 23 )) ;
  15521.          WORK_STRG( 1..PROMPT'length ) := PROMPT ;
  15522.          for CNTR in INTEGER( PROMPT'Length+1 ) .. WORK_STRG'Length loop
  15523.             WORK_STRG( CNTR ) := ASCII.NUL ;
  15524.          end loop ;
  15525.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  15526.             ( WORK_STRG , CURSOR_ADDR'( WRITE_WITH_ADDRESS ) , 
  15527.               ROW_NO( 24 ) , COL_NO( COLUMN_TYPE'first )) ;
  15528.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  15529.             ( NEW_FILE_NAME , CURSOR_ADDR'( READ_NO_ADDRESS ) , 
  15530.               ROW_NO( 24 ) , COL_NO( COLUMN_TYPE'first )) ;
  15531.  
  15532.          -- return null file name if nothing is entered
  15533.          if NEW_FILE_NAME = BLANK_FILE_NAME then
  15534.             --  erase the crt screen
  15535.             VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  15536.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  15537.             return TREE_IO.NULL_FILENAME ;
  15538.          end if ;
  15539.             
  15540.          CHECK_FOR_VALID_NAME :
  15541.             declare
  15542.                PERIOD : constant Character := '.' ;
  15543.             begin -- CHECK_FOR_VALID_NAME
  15544.                -- terminate name at a period
  15545.                for I in NEW_FILE_NAME'range loop
  15546.                   if NEW_FILE_NAME( I ) = PERIOD then
  15547.                      -- the rest of the name is garbage so fill with nulls
  15548.                      for J in I..NEW_FILE_NAME'last loop
  15549.                         NEW_FILE_NAME( J ) := ASCII.NUL ;
  15550.                      end loop ;
  15551.                      exit ;
  15552.                   end if ;
  15553.                end loop ;
  15554.                TEXT_IO.CREATE ( VALIDITY_CHECK ,
  15555.                                 TEXT_IO.OUT_FILE ,
  15556.                                 TREE_IO.COMPLETE_FILE_NAME
  15557.                                    ( NEW_FILE_NAME ,
  15558.                                      TREE_IO.TREE_EXTENSION ) ) ;
  15559.                -- destroy the file by deleting
  15560.                TEXT_IO.DELETE ( VALIDITY_CHECK ) ;
  15561.                -- set handle to file name
  15562.                HANDLE     := NEW_FILE_NAME ;
  15563.                VALID_NAME := True ;
  15564.             exception -- CHECK_FOR_VALID_NAME
  15565.                -- invalid file name was input
  15566.                when NAME_ERROR | USE_ERROR =>
  15567.                   --  erase the crt screen
  15568.                   VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  15569.                      ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  15570.                   DISPLAY_ERROR( ERROR_NOTICE ) ;
  15571.                when others =>
  15572.                   -- error is unknown so pass it along
  15573.                   raise ;
  15574.             end CHECK_FOR_VALID_NAME ;
  15575.          exit when VALID_NAME ;
  15576.       end loop ;
  15577.       --  erase the crt screen
  15578.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  15579.          ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  15580.  
  15581.       return HANDLE ;
  15582.    end GET_FILE_HANDLE ;
  15583.  
  15584.  
  15585.    procedure LABEL_CALL_MARKING
  15586.              ( TREE_NODE : in TREE_NODE_ACCESS_TYPE ) is 
  15587.    -- ===================================================
  15588.    --  This procedure draws a call connection symbol
  15589.    --  for a timed or conditional call or a data 
  15590.    --  connection symbol.
  15591.    -- ===================================================
  15592.       LINE_NODES    : TREE_DATA.LINE_TYPE :=
  15593.                       TREE_DATA.TREE( TREE_NODE ).LINE ;
  15594.       SIZE_LOCATION : GRAPHICS_DATA.POINT ;
  15595.       GRAPH_ENTITY  : TREE_DATA.ENTITY_TYPE := 
  15596.                       TREE_DATA.TREE( TREE_NODE ).NODE_TYPE ;
  15597.    begin
  15598.       case GRAPH_ENTITY is
  15599.          when CONNECTION_BY_CALL =>
  15600.             if TREE_DATA.TREE( TREE_NODE ).CALL_VARIETY = TIMED then
  15601.                GRAPHIC_DRIVER.LABEL
  15602.                   ( TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LABEL_SEG_ID ,
  15603.                     SIZE_LOCATION ,
  15604.                     TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LOCATION ,
  15605.                     GRAPHICS_DATA.TIMED_CALL_SYMBOL ,
  15606.                     GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE( GRAPH_ENTITY ) ) ,
  15607.                     GRAPHICS_DATA.WHITE ) ;
  15608.             elsif TREE_DATA.TREE( TREE_NODE ).CALL_VARIETY = CONDITIONAL then
  15609.                GRAPHIC_DRIVER.LABEL
  15610.                   ( TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LABEL_SEG_ID ,
  15611.                     SIZE_LOCATION ,
  15612.                     TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LOCATION ,
  15613.                     GRAPHICS_DATA.CONDITIONAL_CALL_SYMBOL ,
  15614.                     GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE( GRAPH_ENTITY ) ) ,
  15615.                     GRAPHICS_DATA.WHITE ) ;
  15616.             end if ;
  15617.  
  15618.          when CONNECTION_FOR_DATA =>
  15619.             GRAPHIC_DRIVER.LABEL
  15620.                ( TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LABEL_SEG_ID ,
  15621.                  SIZE_LOCATION ,
  15622.                  TREE_DATA.GRAPH( LINE_NODES(1) ).DATA.LOCATION ,
  15623.                  GRAPHICS_DATA.DATA_ORIGIN_SYMBOL ,
  15624.                  GRAPHICS_DATA.ENTITY_COLOR( GET_FIGURE_TYPE( GRAPH_ENTITY ) ) ,
  15625.                  GRAPHICS_DATA.WHITE ) ;
  15626.  
  15627.          when others =>
  15628.             null ;
  15629.  
  15630.       end case ;
  15631.  
  15632.    end LABEL_CALL_MARKING ;
  15633.  
  15634.  
  15635.    function LOWEST_COMMON_PARENT (FIRST_TREE_NODE, SECOND_TREE_NODE : 
  15636.                                       in TREE_NODE_ACCESS_TYPE) 
  15637.         return TREE_NODE_ACCESS_TYPE is
  15638.    -- ===================================================
  15639.    --  This function determines the lowest common parent of the
  15640.    --  two given tree nodes
  15641.    -- ===================================================
  15642.       FIRST_ANCESTOR_LIST : array (1 .. MAX_NESTING_LEVEL+2) 
  15643.                                  of TREE_NODE_ACCESS_TYPE ;
  15644.       PARENT : TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  15645.       COUNT : integer := 1 ;
  15646.    begin
  15647.       if (FIRST_TREE_NODE = ROOT_NODE) or
  15648.               (SECOND_TREE_NODE = ROOT_NODE) then
  15649.          -- the node is the root
  15650.          return ROOT_NODE ;
  15651.       else
  15652.          PARENT := FIRST_TREE_NODE ;
  15653.          FIRST_ANCESTOR_LIST(COUNT) := PARENT ;
  15654.          -- store the ancestor list of first node
  15655.          while PARENT /= ROOT_NODE loop
  15656.             PARENT := TREE(PARENT).PARENT ;
  15657.             COUNT := COUNT + 1 ;
  15658.             FIRST_ANCESTOR_LIST(COUNT) := PARENT ;
  15659.          end loop ;
  15660.  
  15661.          PARENT := SECOND_TREE_NODE ;
  15662.  
  15663.          SECOND_PARENTS_LOOP:
  15664.             loop
  15665.                for SCAN in 1 .. COUNT loop
  15666.                   exit SECOND_PARENTS_LOOP when 
  15667.                                  PARENT = FIRST_ANCESTOR_LIST(SCAN) ;
  15668.                end loop ;
  15669.                PARENT := TREE(PARENT).PARENT ;
  15670.             end loop SECOND_PARENTS_LOOP ;
  15671.  
  15672.          return PARENT ;
  15673.       end if ;
  15674.  
  15675.    exception
  15676.       when others =>
  15677.          DISPLAY_ERROR (" PROGRAM ERROR -- in lowest common parent") ;
  15678.          TRACE_PKG.TRACE (" PROGRAM ERROR -- in lowest common parent") ;
  15679.          return ROOT_NODE ;
  15680.  
  15681.    end LOWEST_COMMON_PARENT ;
  15682.  
  15683.  
  15684.    procedure REQUEST_CONNECTION 
  15685.              (LINE_PARENT : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  15686.               START_POINT : in GRAPHICS_DATA.POINT ;
  15687.               END_POINT   : in GRAPHICS_DATA.POINT ;
  15688.               CONNECTION  : in out TREE_DATA.LINE_TYPE ) is
  15689.    -----------------------------------------------------------------
  15690.    --  This procedure performs the operations necessary to
  15691.    --  have the User enter the points which define a series
  15692.    --  of line segments which form a connection between the
  15693.    --  starting and ending points.
  15694.    -----------------------------------------------------------------
  15695.       PLACE_CURSOR : constant Boolean := True ;
  15696.       GRAPH_NODE   : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  15697.       LAST_POINT   : INTEGER := 1 ;
  15698.       LINE_POINT   : GRAPHICS_DATA.POINT ;
  15699.       LOCAL_LINE   : array (1..MAXIMUM_NO_LINE_SEGMENTS) of
  15700.                      GRAPHICS_DATA.POINT ;
  15701.       LOCAL_SEGS   : array (1..MAXIMUM_NO_LINE_SEGMENTS) of
  15702.                      GKS_SPECIFICATION.SEGMENT_NAME ;
  15703.       PARENT       : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  15704.  
  15705.       function FORCE_SQUARE_LINES
  15706.                ( LAST_POINT ,
  15707.                  NEXT_POINT : GRAPHICS_DATA.POINT )
  15708.       return GRAPHICS_DATA.POINT is
  15709.       -----------------------------------------------------------
  15710.       -- Based on the tangent of the angle off of horizontal and
  15711.       -- vertical, the forced line end point will be returned.
  15712.       -----------------------------------------------------------
  15713.          -- tangent of minimum angle of divergence allowed from
  15714.          -- square. value entered is from angle in degrees.
  15715.          DIVERGENT_TANGENT : constant Float := 0.0875 ; -- 5 deg
  15716.          MAX_MAG ,
  15717.          MIN_MAG : GRAPHICS_DATA.WC ;
  15718.          X_MAG : constant GRAPHICS_DATA.WC := abs( LAST_POINT.X
  15719.                                                  - NEXT_POINT.X ) ;
  15720.          Y_MAG : constant GRAPHICS_DATA.WC := abs( LAST_POINT.Y
  15721.                                                  - NEXT_POINT.Y ) ;
  15722.       begin -- FORCE_SQUARE_LINES
  15723.          if X_MAG = 0 or Y_MAG = 0 then
  15724.             return NEXT_POINT ;   -- line is already square
  15725.          else
  15726.             if X_MAG > Y_MAG then -- find the largest change in x or y
  15727.                MAX_MAG := X_MAG ; 
  15728.                MIN_MAG := Y_MAG ; -- x had the big one
  15729.             else
  15730.                MIN_MAG := X_MAG ;
  15731.                MAX_MAG := Y_MAG ; -- y had the big one
  15732.             end if ;
  15733.             if ( Float( MIN_MAG ) / Float( MAX_MAG ) ) < DIVERGENT_TANGENT then
  15734.                if X_MAG < Y_MAG then
  15735.                   return ( LAST_POINT.X, NEXT_POINT.Y ) ; -- change y only
  15736.                else
  15737.                   return ( NEXT_POINT.X, LAST_POINT.Y ) ; -- change x only
  15738.                end if ;
  15739.             else
  15740.                return NEXT_POINT ; -- angle is beyond square force limit
  15741.             end if ;
  15742.          end if ;
  15743.       end FORCE_SQUARE_LINES ;
  15744.  
  15745.    begin
  15746.       -- initialize the connection line
  15747.       CONNECTION := TREE_DATA.NULL_LINE ;
  15748.       -- start the line at the Start Point
  15749.       LOCAL_LINE(1) := START_POINT ;
  15750.       -- preset line point to first point in line
  15751.       LINE_POINT    := START_POINT ;
  15752.       -- fill in the points until the point entered is close to
  15753.       -- the End Point
  15754.       for I in 2 .. (MAXIMUM_NO_LINE_SEGMENTS-1) loop
  15755.  
  15756.          -- turn on the abort operation ability
  15757.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  15758.          -- get the next point
  15759.          REQUEST_POINT(" enter connecting point number " & INTEGER'image(I-1) ,
  15760.                        LINE_POINT,
  15761.                        PARENT,
  15762.                        PLACE_CURSOR ) ;
  15763.          -- turn off the abort operation ability
  15764.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  15765.  
  15766.          -- check if this is the last point
  15767.          if (ABS(LINE_POINT.X - END_POINT.X) + 
  15768.              ABS(LINE_POINT.Y - END_POINT.Y)) 
  15769.             < GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET then
  15770.             exit ;
  15771.          end if;
  15772.  
  15773.          -- check for a forced square line
  15774.          LINE_POINT := FORCE_SQUARE_LINES( LOCAL_LINE( I-1 ), LINE_POINT ) ;
  15775.  
  15776.          -- draw the line segment defined by the current and previous point
  15777.          LOCAL_LINE (I) := LINE_POINT ;
  15778.          LOCAL_SEGS (I-1) := DRAW_LINE (GET_LINE_TYPE (
  15779.                                            TREE(LINE_PARENT).NODE_TYPE ) ,
  15780.                                         LOCAL_LINE(I-1),
  15781.                                         LOCAL_LINE(I) );
  15782.          LAST_POINT := I ;
  15783.       end loop ;
  15784.       -- add the ending point to the list
  15785.       LAST_POINT := LAST_POINT + 1 ;
  15786.       LOCAL_LINE (LAST_POINT) := END_POINT ;
  15787.       -- draw the last line segment of the connection
  15788.       LOCAL_SEGS (LAST_POINT-1) := DRAW_LINE (GET_LINE_TYPE (
  15789.                                                  TREE(LINE_PARENT).NODE_TYPE ) ,
  15790.                                               LOCAL_LINE(LAST_POINT-1),
  15791.                                               LOCAL_LINE(LAST_POINT) );
  15792.       LOCAL_SEGS (LAST_POINT) := NULL_SEGMENT ;
  15793.       -- fill in the Connection with the data obtained
  15794.       for I in 1 .. LAST_POINT loop
  15795.          GRAPH_NODE    := TREE_OPS.GET_NEW_GRAPH_NODE (LINE_PARENT) ;
  15796.          CONNECTION(I) := GRAPH_NODE ;
  15797.          GRAPH(GRAPH_NODE).DATA.LOCATION   := LOCAL_LINE(I) ;
  15798.          GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := LOCAL_SEGS(I) ;
  15799.       end loop ;
  15800.    exception
  15801.       when OPERATION_ABORTED_BY_OPERATOR =>
  15802.          -- delete any segments allocated
  15803.          for I in 1 .. LAST_POINT-1 loop
  15804.             GRAPHIC_DRIVER.DELETE_SEGMENT( LOCAL_SEGS( I ) ) ;
  15805.          end loop ;
  15806.          -- turn off the abort operation ability
  15807.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  15808.          -- pass exception to calling unit to finish handling
  15809.          raise ;
  15810.       when others =>
  15811.          -- delete any segments allocated
  15812.          for I in 1 .. LAST_POINT-1 loop
  15813.             GRAPHIC_DRIVER.DELETE_SEGMENT( LOCAL_SEGS( I ) ) ;
  15814.          end loop ;
  15815.          -- turn off the abort operation ability
  15816.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  15817.          DISPLAY_ERROR (" PROGRAM ERROR -- in connection drawing ") ;
  15818.    end REQUEST_CONNECTION ;                        
  15819.  
  15820.  
  15821.    procedure REQUEST_LABEL
  15822.              ( LABEL          : in out TREE_DATA.NAME_TYPE ;
  15823.                OK_IF_BLANK    : in BOOLEAN := false ;
  15824.                OK_IF_OVERLOAD : in BOOLEAN := false ) is
  15825.    -- ==========================================================
  15826.    --  Prompt the operator for the label of a graphical entity,
  15827.    --  and verify the validity of the label.
  15828.    -- ==========================================================
  15829.  
  15830.    begin
  15831.       if OK_IF_BLANK then
  15832.          REQUEST_LABEL ( LABEL,
  15833.                          "Enter entity name, blank=no chng; "
  15834.                            & "<RETURN>=done; <RubOut> or <DEL>"
  15835.                            & "=delete;",
  15836.                          OK_IF_BLANK, OK_IF_OVERLOAD ) ;
  15837.       else
  15838.          REQUEST_LABEL ( LABEL,
  15839.                          "Enter entity name, 80 char. max; "
  15840.                            & "<RETURN>=done; <RubOut> or <DEL>"
  15841.                            & "=delete;",
  15842.                          OK_IF_BLANK, OK_IF_OVERLOAD ) ;
  15843.  
  15844.       end if ;
  15845.    end REQUEST_LABEL ;
  15846.  
  15847.  
  15848.    procedure REQUEST_LABEL
  15849.              ( LABEL  : in out TREE_DATA.NAME_TYPE ;
  15850.                PROMPT : in STRING ;
  15851.                OK_IF_BLANK : in BOOLEAN := false ;
  15852.                OK_IF_OVERLOAD : in BOOLEAN := false ) is
  15853.    -- ==========================================================
  15854.    --  Prompt the operator for the label of a graphical entity,
  15855.    --  and verify the validity of the label.
  15856.    -- ==========================================================
  15857.       LABEL_END          : POSITIVE := 2 ;
  15858.       LETTER_OR_DIGIT    : boolean := false ;
  15859.       UNDERLINE          : boolean := false ;
  15860.       LAST_WAS_UNDERLINE : boolean := false ;
  15861.       VALID_LABEL        : boolean := false ;
  15862.       FOUND              : boolean ;
  15863.       END_OVERLOAD       : NATURAL ;
  15864.       INVALID_LABEL      : exception ;
  15865.       TEST_CHAR          : CHARACTER ;
  15866.       LABEL_ERROR        : constant STRING :=
  15867.                            " invalid string entered for Ada identifier " ;
  15868.       BLANK_LABEL        : STRING (1..LABEL'length) := (others => ' ') ;
  15869.       subtype OVERLOAD_STRING is STRING(1..5) ;
  15870.       OVERLOAD_OPERATORS : constant array( 1..25 ) of OVERLOAD_STRING :=
  15871.          ( 1  => """and""", 2  => """AND""",
  15872.            3  => """or"" ", 4  => """OR"" ",
  15873.            5  => """xor""", 6  => """XOR""",
  15874.            7  => """=""  ", 8  => """<""  ",
  15875.            9  => """<="" ", 10 => """>""  ",
  15876.            11 => """>="" ", 12 => """+""  ",
  15877.            13 => """-""  ", 14 => """&""  ",
  15878.            15 => """abs""", 16 => """ABS""",
  15879.            17 => """not""", 18 => """NOT""",
  15880.            19 => """*""  ", 20 => """/""  ",
  15881.            21 => """mod""", 22 => """MOD""",
  15882.            23 => """rem""", 24 => """REM""",
  15883.            25 => """**"" " ) ;
  15884.  
  15885.    begin
  15886.  
  15887.       -- Loop until a valid label has been entered.
  15888.       while not VALID_LABEL
  15889.       loop
  15890.          begin
  15891.  
  15892.             -- Prompt the operator for the label.
  15893.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  15894.                ( PROMPT ,
  15895.                  FORMAT_FCT'( CENTER_A_LINE ) ,
  15896.                  ROW_NO( 23 ) ) ;
  15897.  
  15898.             -- Retrieve the operator specified label and clear the
  15899.             -- prompt line.
  15900.             VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  15901.                ( LABEL,
  15902.                  CURSOR_ADDRESS'(READ_WITH_ADDRESS),
  15903.                  ROW_NO( 24 ),
  15904.                  COL_NO( 1 )) ;
  15905.  
  15906.             VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  15907.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  15908.  
  15909.             -- check for blank label
  15910.             if OK_IF_BLANK and then
  15911.                  LABEL = BLANK_LABEL then
  15912.                exit ;
  15913.             end if ;
  15914.  
  15915.             -- check for overloaded operator
  15916.             if OK_IF_OVERLOAD and LABEL(1) = '"' then
  15917.                END_OVERLOAD := 1 ;
  15918.                for I in 3..5
  15919.                loop
  15920.                   if LABEL(I) = '"' then
  15921.                      END_OVERLOAD := I ;
  15922.                      exit ;
  15923.                   end if ;
  15924.                end loop ;
  15925.  
  15926.                if END_OVERLOAD = 1 then
  15927.                   raise INVALID_LABEL ;
  15928.                end if ;
  15929.  
  15930.                FOUND := false ;
  15931.                for I in OVERLOAD_OPERATORS'first .. OVERLOAD_OPERATORS'last
  15932.                loop
  15933.                   if LABEL(1..END_OVERLOAD) =
  15934.                      OVERLOAD_OPERATORS( I )(1..END_OVERLOAD) then
  15935.                      FOUND := true ;
  15936.                      exit ;
  15937.                   end if ;
  15938.                end loop ;
  15939.                if not FOUND then
  15940.                   raise INVALID_LABEL ;
  15941.                end if ;
  15942.  
  15943.             else
  15944.                if ( LABEL(1) not in 'A'..'Z' ) and
  15945.                   ( LABEL(1) not in 'a'..'z' ) then
  15946.                   raise INVALID_LABEL ;
  15947.                end if;
  15948.  
  15949.                for CHAR_INDEX in 2 .. LABEL'last
  15950.                loop
  15951.  
  15952.                   TEST_CHAR := LABEL( CHAR_INDEX ) ;
  15953.                   LETTER_OR_DIGIT :=
  15954.                      ( TEST_CHAR in 'A'..'Z' ) or
  15955.                      ( TEST_CHAR in 'a'..'z' ) or
  15956.                      ( TEST_CHAR in '0'..'9' ) ;
  15957.  
  15958.                   UNDERLINE := ( TEST_CHAR = '_' ) ;
  15959.  
  15960.                   LABEL_END := CHAR_INDEX ;
  15961.  
  15962.                   if ( not LETTER_OR_DIGIT ) and
  15963.                      ( not UNDERLINE ) then
  15964.                      exit ;
  15965.                   end if ;
  15966.  
  15967.                   if UNDERLINE and LAST_WAS_UNDERLINE then
  15968.                      raise INVALID_LABEL ;
  15969.                   end if ;
  15970.  
  15971.                   LAST_WAS_UNDERLINE := UNDERLINE ;
  15972.                end loop ;
  15973.  
  15974.                if LAST_WAS_UNDERLINE then 
  15975.                   raise INVALID_LABEL ;
  15976.                end if ;
  15977.  
  15978.                for CHAR_INDEX in LABEL_END .. LABEL'last
  15979.                loop
  15980.                   if LABEL( CHAR_INDEX ) /= ' ' then
  15981.                      raise INVALID_LABEL ;
  15982.                   end if ;
  15983.                end loop ;
  15984.             end if ;
  15985.  
  15986.             VALID_LABEL := true ;
  15987.  
  15988.          -- If an invalid label was specified then display an error
  15989.          -- message to the operator.
  15990.          exception
  15991.             when INVALID_LABEL =>
  15992.                DISPLAY_ERROR( LABEL_ERROR ) ;
  15993.          end ;
  15994.       end loop ;
  15995.    end REQUEST_LABEL ;
  15996.  
  15997.  
  15998.    procedure REQUEST_POINT
  15999.               ( DISPLAY_STRING   : in STRING ;
  16000.                 REFERENCE_POINT  : in out GRAPHICS_DATA.POINT ;
  16001.                 PARENT           : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16002.                 CURSOR_PLACEMENT : in Boolean := False ;
  16003.                 LABEL_CREATE     : in LABEL_CREATE_TYPE := NOT_LABEL ) is
  16004.    -- =========================================================
  16005.    --  This procedure displays the received string to the
  16006.    --  operator, and returns an operator specified point and
  16007.    --  the associated parent entity.
  16008.    -- =========================================================
  16009.       UPPER_LEFT_CORNER   : GRAPHICS_DATA.POINT ;
  16010.       LOWER_LEFT_CORNER   : GRAPHICS_DATA.POINT ;
  16011.       UPPER_RIGHT_CORNER  : GRAPHICS_DATA.POINT ;
  16012.       LOWER_RIGHT_CORNER  : GRAPHICS_DATA.POINT ;
  16013.       PARENT_POINT_REF    : GRAPHICS_DATA.POINT ;
  16014.       BLANK_LINE          : constant String := " " ;
  16015.       PARENTS_PARENT      : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16016.       PROPER_SCOPE        : Boolean := False ;
  16017.       ROOT_INVALID_FOR_LABEL : exception ;
  16018.  
  16019.    begin
  16020.       while not PROPER_SCOPE loop
  16021.  
  16022.          -- set graphics window active.
  16023.          GRAPHIC_DRIVER.SELECT_WINDOW
  16024.               ( GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  16025.  
  16026.          -- Display the received string to the operator.
  16027.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16028.               ( DISPLAY_STRING ,
  16029.                 FORMAT_FCT'( CENTER_A_LINE ) ,
  16030.                 ROW_NO( 23 ) ) ;
  16031.          -- Place cursor at current reference point
  16032.          if CURSOR_PLACEMENT then
  16033.             GRAPHIC_DRIVER.PLACE_CURSOR( REFERENCE_POINT ) ;
  16034.          end if ;
  16035.          -- Retrieve the operator specified point.
  16036.          REFERENCE_POINT := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  16037.          -- Clear the display line.
  16038.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16039.                  ( BLANK_LINE ,
  16040.                    FORMAT_FCT'( CLEAR_A_LINE ) ,
  16041.                    ROW_NO( 23 ) ) ;
  16042.  
  16043.          -- Search tree for a scope reference.
  16044.          PARENT := SCOPE_SEARCH ( REFERENCE_POINT ) ;
  16045.  
  16046.          -- if it is not for a label, exit
  16047.          if LABEL_CREATE = NOT_LABEL then
  16048.             exit ;
  16049.          end if ;
  16050.  
  16051.          -- if it is for a label, check the overlap possiblity
  16052.          begin
  16053.             if PARENT = ROOT_NODE then
  16054.                raise ROOT_INVALID_FOR_LABEL ;
  16055.             end if ;
  16056.  
  16057.             if LABEL_CREATE = LABEL_IMPORT then
  16058.                PARENT_POINT_REF.X := 
  16059.                     GRAPH( TREE( PARENT ).GRAPH_DATA ).DATA.SIZE.X ;
  16060.                PARENT_POINT_REF.Y := REFERENCE_POINT.Y ;
  16061.             else  
  16062.                -- export
  16063.                PARENT_POINT_REF.X := 
  16064.                     GRAPH( TREE( PARENT ).GRAPH_DATA ).DATA.LOCATION.X ;
  16065.                PARENT_POINT_REF.Y := REFERENCE_POINT.Y ;
  16066.             end if ;
  16067.             PARENTS_PARENT := TREE( PARENT ).PARENT ;
  16068.  
  16069.             UPPER_LEFT_CORNER.X := PARENT_POINT_REF.X -
  16070.               GRAPHICS_DATA.IMPORT_EXPORT_X_OFFSET ;
  16071.             UPPER_LEFT_CORNER.Y := PARENT_POINT_REF.Y ;
  16072.             LOWER_LEFT_CORNER.X := UPPER_LEFT_CORNER.X ;
  16073.             LOWER_LEFT_CORNER.Y := PARENT_POINT_REF.Y -
  16074.                  GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT ;
  16075.  
  16076.             UPPER_RIGHT_CORNER.X := UPPER_LEFT_CORNER.X +
  16077.                  GRAPHICS_DATA.LABEL_MAX_LENGTH +
  16078.                  ( 2 * GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET ) ;
  16079.             UPPER_RIGHT_CORNER.Y := UPPER_LEFT_CORNER.Y ;
  16080.             LOWER_RIGHT_CORNER.X := UPPER_RIGHT_CORNER.X ;
  16081.             LOWER_RIGHT_CORNER.Y := LOWER_LEFT_CORNER.Y ;
  16082.  
  16083.  
  16084.             if LABEL_CREATE = LABEL_IMPORT then
  16085.                -- for imports, the proper scoping exists if:
  16086.                --   1) the reference points are within the Parent.
  16087.                --   2) the size points are within the Parent's Parent.
  16088.                PROPER_SCOPE :=
  16089.                     ( PARENT = SCOPE_SEARCH ( UPPER_LEFT_CORNER )) and 
  16090.                     ( PARENT = SCOPE_SEARCH ( LOWER_LEFT_CORNER )) and 
  16091.                     ( PARENTS_PARENT = SCOPE_SEARCH ( UPPER_RIGHT_CORNER )) and 
  16092.                     ( PARENTS_PARENT = SCOPE_SEARCH ( LOWER_RIGHT_CORNER )) ;
  16093.             else
  16094.                -- for exports, the proper scoping exists if:
  16095.                --   1) the reference points are within the Parent's Parent.
  16096.                --   2) the size points are within the Parent.
  16097.                PROPER_SCOPE :=
  16098.                     ( PARENTS_PARENT = SCOPE_SEARCH ( UPPER_LEFT_CORNER )) and 
  16099.                     ( PARENTS_PARENT = SCOPE_SEARCH ( LOWER_LEFT_CORNER )) and 
  16100.                     ( PARENT = SCOPE_SEARCH ( UPPER_RIGHT_CORNER )) and 
  16101.                     ( PARENT = SCOPE_SEARCH ( LOWER_RIGHT_CORNER )) ;
  16102.             end if ;
  16103.  
  16104.             if not PROPER_SCOPE then
  16105.                -- tell the operator that the reference and
  16106.                -- and size points did not have proper scope
  16107.                DISPLAY_ERROR( "annotation will show improper scope," 
  16108.                      & " overlaps or overextends, re-try ");
  16109.             end if ;
  16110.  
  16111.          exception
  16112.             -- if root is chosen for label placement
  16113.             when ROOT_INVALID_FOR_LABEL =>
  16114.                DISPLAY_ERROR (" invalid, an annotation cannot be placed at the outer scope") ;
  16115.             -- in case of constraint error for label position
  16116.             when others =>
  16117.                DISPLAY_ERROR (" invalid, the annotation is too close to page boundaries ") ;
  16118.          end ;
  16119.  
  16120.       end loop ;
  16121.  
  16122.    end REQUEST_POINT ;
  16123.  
  16124.  
  16125.    function ENCLOSED_ENTITIES_HAVE_VALID_SCOPE
  16126.               ( ENCLOSED_ENTITIES : in TREE_DATA.ENCLOSED_ENTITIES_TYPE )
  16127.  
  16128.    return BOOLEAN is
  16129.    -- =========================================================
  16130.    --  This function verifies the nesting level of the
  16131.    --  contained entities and the out of scope entity which
  16132.    --  will be created.
  16133.    -- =========================================================
  16134.       LIST_PTR         : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16135.       ENCLOSED_INDEX   : INTEGER := ENCLOSED_ENTITIES'first ;
  16136.       NESTING_LEVEL    : INTEGER := 0 ;
  16137.  
  16138.       procedure DETERMINE_ENCLOSED_NESTING_VALUE
  16139.                 ( LIST_NODE : in TREE_DATA.LIST_NODE_ACCESS_TYPE ) is
  16140.       -- =========================================================
  16141.       --  Locate the tree nodes with no contained entities,
  16142.       --  determine the nesting values of the located nodes,
  16143.       --  and find the node with the highest nesting value.
  16144.       -- =========================================================
  16145.          CONTAINED_LIST : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16146.          NESTING_NODE   : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16147.          NODE_LEVEL     : INTEGER ;
  16148.       begin
  16149.  
  16150.          NESTING_NODE := TREE_DATA.LIST( LIST_NODE ).ITEM ;
  16151.          CONTAINED_LIST :=
  16152.             TREE_DATA.TREE( NESTING_NODE ).CONTAINED_ENTITY_LIST ;
  16153.  
  16154.          -- If node has no contained entities then calculate the nesting level
  16155.          if CONTAINED_LIST = TREE_DATA.NULL_POINTER then
  16156.             NODE_LEVEL := COMPUTE_NESTING_LEVEL( NESTING_NODE ) ;
  16157.             if NODE_LEVEL > NESTING_LEVEL then
  16158.                NESTING_LEVEL := NODE_LEVEL ;
  16159.             end if ;
  16160.          -- If node has contained entities then find node with no
  16161.          -- contained entities.
  16162.          else
  16163.             while CONTAINED_LIST /= TREE_DATA.NULL_POINTER
  16164.             loop
  16165.                DETERMINE_ENCLOSED_NESTING_VALUE( CONTAINED_LIST ) ;
  16166.                CONTAINED_LIST := TREE_DATA.LIST( CONTAINED_LIST ).NEXT ;
  16167.             end loop ;
  16168.          end if ;
  16169.       end DETERMINE_ENCLOSED_NESTING_VALUE ;
  16170.  
  16171.    begin
  16172.  
  16173.       -- Verify the nesting level of each contained entity
  16174.       LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX ) ;
  16175.       while LIST_PTR /= TREE_DATA.NULL_POINTER
  16176.       loop
  16177.          -- Update the value of NESTING_LEVEL.
  16178.          DETERMINE_ENCLOSED_NESTING_VALUE( LIST_PTR ) ;
  16179.          ENCLOSED_INDEX := ENCLOSED_INDEX + 1 ;
  16180.          LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX ) ;
  16181.       end loop ;
  16182.       return NESTING_LEVEL < MAX_NESTING_LEVEL ;
  16183.    end ENCLOSED_ENTITIES_HAVE_VALID_SCOPE ;
  16184.          
  16185.  
  16186.    function VERIFY_ENCLOSED_ENTITIES
  16187.               ( ENCLOSED_ENTITIES : in TREE_DATA.ENCLOSED_ENTITIES_TYPE ;
  16188.                 REFERENCE_POINT   : in GRAPHICS_DATA.POINT ;
  16189.                 SIZE_POINT        : in GRAPHICS_DATA.POINT ;
  16190.                 PARENT            : in TREE_DATA.TREE_NODE_ACCESS_TYPE )
  16191.  
  16192.    return BOOLEAN is
  16193.    -- =========================================================
  16194.    --  This function access the received array of list nodes,
  16195.    --  and verifies the enclosure validity of the entities
  16196.    --  represented in the list.
  16197.    -- =========================================================
  16198.       LIST_PTR         : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16199.       SEARCH_LIST      : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16200.       SEARCH_NODE      : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16201.       CALLED_BY        : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16202.       CALLING_NODE     : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16203.       CALL_ITEM        : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16204.       ENCLOSED_INDEX_1 : INTEGER := ENCLOSED_ENTITIES'first ;
  16205.       TREE_NODE        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16206.       MEMBER_NODE      : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16207.       EXPORTED_PTR     : TREE_DATA.MEMBERSHIP_LIST_TYPE ;
  16208.       BODY_LOCATION    : GRAPHICS_DATA.POINT ;
  16209.       BODY_SIZE        : GRAPHICS_DATA.POINT ;
  16210.  
  16211.       -- Error messages displayed to the operator
  16212.       BASIC_MESSAGE            : constant STRING :=
  16213.                                  " invalid, creation would invalidate " ;
  16214.       EXPORT_CONNECT_ERROR     : constant STRING := "export connection " ;
  16215.       CALL_CONNECT_ERROR       : constant STRING := "call connection " ;
  16216.       VISIBILITY_CONNECT_ERROR : constant STRING := "visibility connection " ;
  16217.       ENTRY_CONNECT_ERROR      : constant STRING := "task entry connection " ;
  16218.  
  16219.       NESTING_ERROR            : constant STRING :=
  16220.             " invalid, entity placement would exceed maximum nesting level " ;
  16221.       CONTAINED_BODY_ERROR     : constant STRING :=
  16222.             " invalid, contained entity cannot be a body " ;
  16223.       INSTANTIATE_ERROR        : constant STRING :=
  16224.             " no entities can be placed inside an instantiated unit " ;
  16225.       IMPORT_ERROR             : constant STRING :=
  16226.             " invalid, contained entity may not have imports " ;
  16227.  
  16228.       INVALID_CONTAINMENT : exception ;
  16229.  
  16230.       function BODY_POINT_IN_ENTITY
  16231.               ( BODY_LOCATION : in GRAPHICS_DATA.POINT ;
  16232.                 BODY_SIZE     : in GRAPHICS_DATA.POINT )
  16233.       return BOOLEAN is
  16234.       -- =========================================================
  16235.       --  This function determines if the received points are
  16236.       --  within the rectangle defined by the reference and
  16237.       --  size points.  If the points are within the rectangle
  16238.       --  the body is ( partially ) contained in the new entity.
  16239.       -- =========================================================
  16240.       begin
  16241.          if BODY_LOCATION.Y > SIZE_POINT.Y and then 
  16242.             BODY_SIZE.Y < REFERENCE_POINT.Y and then
  16243.             BODY_LOCATION.X < SIZE_POINT.X and then
  16244.             BODY_SIZE.X > REFERENCE_POINT.X then
  16245.             return true ;
  16246.          else
  16247.             return false ;
  16248.          end if ;
  16249.       end BODY_POINT_IN_ENTITY ;
  16250.  
  16251.       function CALL_IN_SAME_SCOPE
  16252.               ( CALLING_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE )
  16253.       return BOOLEAN is
  16254.       -- =========================================================
  16255.       --  This function access the list of enclosed entities
  16256.       --  received by the VERIFY_ENCLOSED_ENTITIES function, and
  16257.       --  and determines if the input node is also an enclosed
  16258.       --  entity.
  16259.       -- =========================================================
  16260.          ALLOWED_CALL     : BOOLEAN := false ;
  16261.          ENCLOSED_INDEX_2 : INTEGER := ENCLOSED_ENTITIES'first ;
  16262.       begin
  16263.    
  16264.          CALL_ITEM := ENCLOSED_ENTITIES( ENCLOSED_INDEX_2 ) ;
  16265.  
  16266.          while CALL_ITEM /= TREE_DATA.NULL_POINTER
  16267.          loop
  16268.             if CALLING_NODE = TREE_DATA.LIST( CALL_ITEM ).ITEM then
  16269.                ALLOWED_CALL := true ;
  16270.                exit ;
  16271.             end if ;
  16272.             ENCLOSED_INDEX_2 := ENCLOSED_INDEX_2 + 1 ;
  16273.             CALL_ITEM := ENCLOSED_ENTITIES( ENCLOSED_INDEX_2 ) ;
  16274.          end loop ;
  16275.  
  16276.          return ALLOWED_CALL ;
  16277.       end CALL_IN_SAME_SCOPE ;
  16278.  
  16279.    begin
  16280.  
  16281.       -- Verify that entity creation would not exceed maximum
  16282.       -- nesting level;
  16283.       if not ENCLOSED_ENTITIES_HAVE_VALID_SCOPE( ENCLOSED_ENTITIES ) then
  16284.          DISPLAY_ERROR ( NESTING_ERROR ) ;
  16285.          raise INVALID_CONTAINMENT ;
  16286.       end if ;
  16287.  
  16288.       -- If the parent of the entity to be created has a body then
  16289.       -- verify that the created entity does not overlap the body
  16290.       if TREE_DATA.TREE( PARENT ).NODE_TYPE in
  16291.          TREE_DATA.TYPE_VIRTUAL_PACKAGE .. TREE_DATA.TYPE_TASK then
  16292.          SEARCH_NODE := TREE_DATA.TREE( PARENT ).BODY_PTR ;
  16293.          if SEARCH_NODE /= TREE_DATA.NULL_POINTER then
  16294.  
  16295.             BODY_LOCATION := TREE_DATA.GRAPH(
  16296.                TREE_DATA.TREE( SEARCH_NODE ).GRAPH_DATA ).DATA.LOCATION ;
  16297.             BODY_SIZE     := TREE_DATA.GRAPH(
  16298.                TREE_DATA.TREE( SEARCH_NODE ).GRAPH_DATA ).DATA.SIZE ;
  16299.  
  16300.             if BODY_POINT_IN_ENTITY( BODY_LOCATION, BODY_SIZE ) then
  16301.                DISPLAY_ERROR( CONTAINED_BODY_ERROR ) ;
  16302.                raise INVALID_CONTAINMENT ;
  16303.             end if ;
  16304.          end if ;
  16305.          if TREE_DATA.TREE( PARENT ).NODE_TYPE in
  16306.             TREE_DATA.TYPE_VIRTUAL_PACKAGE .. TREE_DATA.TYPE_FUNCTION and then
  16307.             TREE_DATA.TREE( PARENT ).GENERIC_STATUS =
  16308.             TREE_DATA.GENERIC_INSTANTIATION then
  16309.                DISPLAY_ERROR( INSTANTIATE_ERROR ) ;
  16310.                raise INVALID_CONTAINMENT ;
  16311.          end if ;
  16312.       end if ;
  16313.  
  16314.       -- Verify each entity in the received array of list nodes.
  16315.       LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX_1 ) ;
  16316.       while LIST_PTR /= TREE_DATA.NULL_POINTER
  16317.       loop
  16318.  
  16319.          -- If the contained entity has imports then display the error.
  16320.          TREE_NODE := TREE_DATA.LIST( LIST_PTR ).ITEM ;
  16321.          if TREE_DATA.TREE( TREE_NODE ).NODE_TYPE =
  16322.                TREE_DATA.TYPE_VIRTUAL_PACKAGE or
  16323.             TREE_DATA.TREE( TREE_NODE ).NODE_TYPE =
  16324.                TREE_DATA.TYPE_PACKAGE then
  16325.  
  16326.             if TREE_DATA.TREE( TREE_NODE ).IMPORTED_LIST /=
  16327.                   TREE_DATA.NULL_POINTER then
  16328.                DISPLAY_ERROR( IMPORT_ERROR ) ;
  16329.                raise INVALID_CONTAINMENT ;
  16330.             end if ;
  16331.  
  16332.  
  16333.             -- If connections to the enclosed entities exist then
  16334.             -- display the error.
  16335.             EXPORTED_PTR := TREE_DATA.TREE( TREE_NODE ).EXPORTED_LIST ;
  16336.             while EXPORTED_PTR /= TREE_DATA.NULL_POINTER
  16337.             loop
  16338.  
  16339.                -- Locate the membership list of the exported item
  16340.                SEARCH_NODE := TREE_DATA.LIST( EXPORTED_PTR ).ITEM ;
  16341.                SEARCH_LIST := TREE_DATA.TREE( SEARCH_NODE ).MEMBERSHIP ;
  16342.  
  16343.                -- Verify each call to the exported entity.
  16344.                while SEARCH_LIST /= TREE_DATA.NULL_POINTER
  16345.                loop
  16346.  
  16347.                   -- Retrieve the calling node.  If the calling node is not
  16348.                   -- the parent of the calling node then retrieve the parent
  16349.                   -- of the body from which the call originates.
  16350.                   MEMBER_NODE := TREE_DATA.LIST( SEARCH_LIST ).ITEM ;
  16351.                   if MEMBER_NODE /= TREE_DATA.TREE( SEARCH_NODE ).PARENT then
  16352.                      CALLED_BY := TREE_DATA.TREE( MEMBER_NODE ).MEMBERSHIP ;
  16353.                      CALLING_NODE := TREE_DATA.LIST( CALLED_BY ).ITEM ;
  16354.                      CALLING_NODE := TREE_DATA.TREE( CALLING_NODE ).PARENT ;
  16355.  
  16356.                      if not CALL_IN_SAME_SCOPE( CALLING_NODE ) then
  16357.                         DISPLAY_ERROR(
  16358.                            BASIC_MESSAGE & EXPORT_CONNECT_ERROR ) ;
  16359.                         raise INVALID_CONTAINMENT ;
  16360.                      end if ;
  16361.                   end if ;
  16362.                   SEARCH_LIST := TREE_DATA.LIST( SEARCH_LIST ).NEXT ;
  16363.                end loop ;
  16364.                EXPORTED_PTR := TREE_DATA.LIST( EXPORTED_PTR ).NEXT ;
  16365.             end loop ;
  16366.  
  16367.          end if ;
  16368.  
  16369.          -- If the contained entity has a body then verify the calls
  16370.          -- performed by the body
  16371.          if TREE_DATA.TREE( TREE_NODE ).NODE_TYPE in
  16372.             TREE_DATA.TYPE_VIRTUAL_PACKAGE .. TREE_DATA.TYPE_TASK then
  16373.  
  16374.             -- Determine if the contained entity has a body
  16375.             SEARCH_NODE := TREE_DATA.TREE( TREE_NODE ).BODY_PTR ;
  16376.             if SEARCH_NODE /= TREE_DATA.NULL_POINTER then
  16377.  
  16378.                -- Verify that the calls performed by the body are within
  16379.                -- the scope of the enclosing entity
  16380.                SEARCH_LIST := TREE_DATA.TREE( SEARCH_NODE ).CALLEE_LIST ;
  16381.                while SEARCH_LIST /= TREE_DATA.NULL_POINTER
  16382.                loop
  16383.                   CALLING_NODE := TREE_DATA.LIST( SEARCH_LIST ).ITEM ;
  16384.                   CALLING_NODE := TREE_DATA.TREE( CALLING_NODE ).CONNECTEE ;
  16385.  
  16386.                   if not  CALL_IN_SAME_SCOPE( CALLING_NODE ) then
  16387.                      DISPLAY_ERROR( BASIC_MESSAGE & CALL_CONNECT_ERROR ) ;
  16388.                      raise INVALID_CONTAINMENT ;
  16389.                   end if ;
  16390.                   SEARCH_LIST := TREE_DATA.LIST( SEARCH_LIST ).NEXT ;
  16391.                end loop ;
  16392.             end if ;
  16393.  
  16394.             -- Verify that the contained data connections are within
  16395.             -- the scope of the enclosing entity
  16396.             SEARCH_LIST := TREE_DATA.TREE( TREE_NODE ).DATA_CONNECT_LIST ;
  16397.             while SEARCH_LIST /= TREE_DATA.NULL_POINTER
  16398.             loop
  16399.                CALLING_NODE := TREE_DATA.LIST( SEARCH_LIST ).ITEM ;
  16400.                CALLING_NODE := TREE_DATA.TREE( CALLING_NODE ).CONNECTEE ;
  16401.  
  16402.                if not  CALL_IN_SAME_SCOPE( CALLING_NODE ) then
  16403.                   DISPLAY_ERROR( BASIC_MESSAGE & VISIBILITY_CONNECT_ERROR ) ;
  16404.                   raise INVALID_CONTAINMENT ;
  16405.                end if ;
  16406.                SEARCH_LIST := TREE_DATA.LIST( SEARCH_LIST ).NEXT ;
  16407.             end loop ;
  16408.  
  16409.             -- If the node is a task then verify that no export connections
  16410.             -- to the task entry points exist.
  16411.             if TREE_DATA.TREE(TREE_NODE).NODE_TYPE = TREE_DATA.TYPE_TASK then
  16412.                SEARCH_LIST := TREE_DATA.TREE( TREE_NODE ).ENTRY_LIST ;
  16413.                while SEARCH_LIST /= TREE_DATA.NULL_POINTER
  16414.                loop
  16415.                   SEARCH_NODE := TREE_DATA.LIST( SEARCH_LIST ).ITEM ;
  16416.                   CALLED_BY := TREE_DATA.TREE( SEARCH_NODE ).MEMBERSHIP ;
  16417.                   while CALLED_BY /= TREE_DATA.NULL_POINTER
  16418.                   loop
  16419.                      MEMBER_NODE := TREE_DATA.LIST( CALLED_BY ).ITEM ;
  16420.                      if MEMBER_NODE /= TREE_NODE then
  16421.                         DISPLAY_ERROR( BASIC_MESSAGE & ENTRY_CONNECT_ERROR ) ;
  16422.                         raise INVALID_CONTAINMENT ;
  16423.                      end if ;
  16424.                      CALLED_BY := TREE_DATA.LIST( CALLED_BY ).NEXT ;
  16425.                   end loop ;
  16426.                   SEARCH_LIST := TREE_DATA.LIST( SEARCH_LIST ).NEXT ;
  16427.                end loop ;
  16428.             end if ;
  16429.  
  16430.          end if ;
  16431.  
  16432.          -- Verify that the enclosed entity does not have export connections.
  16433.          SEARCH_LIST := TREE_DATA.TREE( TREE_NODE ).MEMBERSHIP ;
  16434.          while SEARCH_LIST /= TREE_DATA.NULL_POINTER
  16435.          loop
  16436.  
  16437.             MEMBER_NODE := TREE_DATA.LIST( SEARCH_LIST ).ITEM ;
  16438.             if TREE_DATA.TREE( MEMBER_NODE ).NODE_TYPE in
  16439.                TREE_DATA.EXPORTED_PROCEDURE .. TREE_DATA.EXPORTED_EXCEPTION
  16440.                then
  16441.                DISPLAY_ERROR( BASIC_MESSAGE & EXPORT_CONNECT_ERROR ) ;
  16442.                raise INVALID_CONTAINMENT ;
  16443.             elsif TREE_DATA.TREE( MEMBER_NODE ).NODE_TYPE in
  16444.                TREE_DATA.CONNECTION_BY_CALL .. TREE_DATA.CONNECTION_FOR_DATA
  16445.                then 
  16446.                CALLING_NODE := TREE_DATA.TREE( MEMBER_NODE).PARENT ;
  16447.  
  16448.                -- If connection-by-call then determine parent of body
  16449.                if TREE_DATA.TREE( MEMBER_NODE ).NODE_TYPE =
  16450.                   TREE_DATA.CONNECTION_BY_CALL then
  16451.                   CALLING_NODE := TREE_DATA.TREE( CALLING_NODE ).PARENT ;
  16452.                end if ;
  16453.  
  16454.                if not  CALL_IN_SAME_SCOPE( CALLING_NODE ) then
  16455.                   DISPLAY_ERROR( BASIC_MESSAGE & VISIBILITY_CONNECT_ERROR ) ;
  16456.                   raise INVALID_CONTAINMENT ;
  16457.                end if ;
  16458.             end if ;
  16459.             SEARCH_LIST := TREE_DATA.LIST( SEARCH_LIST ).NEXT ;
  16460.          end loop ;
  16461.  
  16462.          ENCLOSED_INDEX_1 := ENCLOSED_INDEX_1 + 1 ;
  16463.          LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX_1 ) ;
  16464.       end loop ;
  16465.  
  16466.       return true ;
  16467.    exception
  16468.       when INVALID_CONTAINMENT =>
  16469.          return false ;
  16470.    end VERIFY_ENCLOSED_ENTITIES ;
  16471.  
  16472.  
  16473.    procedure REQUEST_POINTS
  16474.               ( REFERENCE_POINT   : in out GRAPHICS_DATA.POINT ;
  16475.                 SIZE_POINT        : in out GRAPHICS_DATA.POINT ;
  16476.                 PARENT            : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  16477.                 ENCLOSED_ENTITIES : in out TREE_DATA.ENCLOSED_ENTITIES_TYPE ;
  16478.                 ENCLOSURE_EXISTS  : in out BOOLEAN ) is
  16479.    -- =========================================================
  16480.    --  This procedure request the operator to input the upper
  16481.    --  left and lower right points of the rectangle which 
  16482.    --  delineates the area enclosing the entity to be drawn.
  16483.    -- =========================================================
  16484.       BLANK_LINE          : constant String := " " ;
  16485.       PROPER_SCOPE        : Boolean := False ;
  16486.       UPPER_LEFT_PROMPT   : constant String := "Place cursor at upper left"
  16487.                             & " location of entity, "
  16488.                             & "then press input device button";
  16489.       LOWER_RIGHT_PROMPT  : constant String := "Place cursor at lower right"
  16490.                             & " location of entity, "
  16491.                             & "then press input device button";
  16492.       LIST_PTR            : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  16493.       UPPER_RIGHT_CORNER  : GRAPHICS_DATA.POINT ;
  16494.       LOWER_LEFT_CORNER   : GRAPHICS_DATA.POINT ;
  16495.       OBJECT_LOC          : GRAPHICS_DATA.POINT ;
  16496.       OBJECT_SIZE         : GRAPHICS_DATA.POINT ;
  16497.       ENCLOSED_INDEX      : INTEGER ;
  16498.       type OVERLAP_TYPE is (
  16499.            OVER_CONTAINED_ENTITY ,
  16500.            OVER_EXPORT ,
  16501.            OVER_IMPORT ,
  16502.            OVER_CONTAINED_EXPORT ,
  16503.            OVER_CONTAINED_IMPORT ) ;
  16504.  
  16505.  
  16506.       function OVERLAPS_CHECK
  16507.            ( OVERLAP_TEST : OVERLAP_TYPE ;
  16508.              LIST_HEAD_PTR : TREE_DATA.LIST_NODE_ACCESS_TYPE )
  16509.            return boolean is
  16510.    -- =========================================================
  16511.    --  This function return true if the selected placement
  16512.    --  points will overlap any item on the list specified
  16513.    --  by the input parameter, which must be the list head.
  16514.    -- =========================================================
  16515.          SUB_LIST_PTR : TREE_DATA.LIST_NODE_ACCESS_TYPE := LIST_HEAD_PTR ;
  16516.  
  16517.          function TOTALLY_CONTAINED return boolean is
  16518.          -- =========================================================
  16519.          --  This function return true if current placement points
  16520.          --  determine that the entity in question is totally
  16521.          --  enclosed; else return false
  16522.          -- =========================================================
  16523.          begin
  16524.             if OBJECT_LOC.Y < REFERENCE_POINT.Y and then
  16525.                OBJECT_SIZE.Y > SIZE_POINT.Y and then 
  16526.                OBJECT_LOC.X > REFERENCE_POINT.X and then
  16527.                OBJECT_SIZE.X < SIZE_POINT.X then
  16528.                return TRUE ;
  16529.             else
  16530.                return FALSE ;
  16531.             end if ;
  16532.          end TOTALLY_CONTAINED ;
  16533.  
  16534.       begin
  16535.          if OVERLAP_TEST = OVER_CONTAINED_ENTITY then
  16536.             -- check the body before checking the list
  16537.             if TREE( PARENT ).NODE_TYPE in 
  16538.                  TYPE_VIRTUAL_PACKAGE .. TYPE_TASK and then
  16539.                  TREE( PARENT ).BODY_PTR /= NULL_POINTER then
  16540.                OBJECT_LOC := GRAPH( TREE( TREE( PARENT ).BODY_PTR ).GRAPH_DATA ).DATA.LOCATION ;
  16541.                OBJECT_SIZE := GRAPH( TREE( TREE( PARENT ).BODY_PTR ).GRAPH_DATA ).DATA.SIZE ;
  16542.                if OBJECT_LOC.Y > SIZE_POINT.Y and then 
  16543.                   OBJECT_SIZE.Y < REFERENCE_POINT.Y and then
  16544.                   OBJECT_LOC.X < SIZE_POINT.X and then
  16545.                   OBJECT_SIZE.X > REFERENCE_POINT.X then
  16546.                   -- an overlap has been found
  16547.                   return TRUE ;
  16548.                end if ;
  16549.             end if ;
  16550.          end if ;
  16551.  
  16552.          while SUB_LIST_PTR /= NULL_POINTER loop
  16553.             OBJECT_LOC := GRAPH( TREE( LIST(SUB_LIST_PTR).ITEM ).GRAPH_DATA ).DATA.LOCATION ;
  16554.             OBJECT_SIZE := GRAPH( TREE( LIST(SUB_LIST_PTR).ITEM ).GRAPH_DATA ).DATA.SIZE ;
  16555.  
  16556.             case OVERLAP_TEST is
  16557.                when OVER_CONTAINED_ENTITY =>
  16558.  
  16559.                   if OBJECT_LOC.Y > SIZE_POINT.Y and then 
  16560.                      OBJECT_SIZE.Y < REFERENCE_POINT.Y and then
  16561.                      OBJECT_LOC.X < SIZE_POINT.X and then
  16562.                      OBJECT_SIZE.X > REFERENCE_POINT.X then
  16563.                      -- at least on overlap has been found, 
  16564.                      -- check if completely enclosed
  16565.                      if TOTALLY_CONTAINED then
  16566.                         -- a completely enclosed entity has been found, this knowledge
  16567.                         -- is used to permit the creation of entities which contain
  16568.                         -- existing entities
  16569.                         ENCLOSED_ENTITIES ( ENCLOSED_INDEX ) := SUB_LIST_PTR ;
  16570.                         ENCLOSED_INDEX := ENCLOSED_INDEX + 1 ;
  16571.                         ENCLOSURE_EXISTS := TRUE ;
  16572.  
  16573.                      else
  16574.                         return TRUE ;
  16575.                      end if ;
  16576.                   end if ;
  16577.  
  16578.                   if TREE( LIST( SUB_LIST_PTR ).ITEM ).NODE_TYPE in
  16579.                        TYPE_VIRTUAL_PACKAGE .. TYPE_PACKAGE then
  16580.                      -- check the contained export and import lists for overlap
  16581.                      if OVERLAPS_CHECK( OVER_CONTAINED_EXPORT, 
  16582.                              TREE_OPS.GET_LIST_HEAD (LIST( SUB_LIST_PTR ).ITEM ,
  16583.                                                      EXPORTED_LIST) ) or else
  16584.                         OVERLAPS_CHECK( OVER_CONTAINED_IMPORT,
  16585.                              TREE_OPS.GET_LIST_HEAD (LIST( SUB_LIST_PTR ).ITEM ,
  16586.                                                      IMPORTED_LIST) ) then
  16587.                         return TRUE ;
  16588.                      end if ;
  16589.                   elsif TREE( LIST( SUB_LIST_PTR ).ITEM ).NODE_TYPE =
  16590.                        TYPE_TASK then
  16591.                      -- check the entry list for overlap
  16592.                      if OVERLAPS_CHECK( OVER_CONTAINED_EXPORT, 
  16593.                              TREE_OPS.GET_LIST_HEAD (LIST( SUB_LIST_PTR ).ITEM ,
  16594.                                                      ENTRY_LIST) ) then
  16595.                         return TRUE ;
  16596.                      end if ;
  16597.                   end if ;
  16598.  
  16599.                when OVER_EXPORT | OVER_CONTAINED_IMPORT =>
  16600.                   if OBJECT_LOC.Y < REFERENCE_POINT.Y and then 
  16601.                      OBJECT_SIZE.Y > SIZE_POINT.Y and then
  16602.                      OBJECT_LOC.X < SIZE_POINT.X and then
  16603.                      OBJECT_SIZE.X > REFERENCE_POINT.X then
  16604.                      -- an overlap has been found
  16605.                      if not TOTALLY_CONTAINED then
  16606.                         return TRUE ;
  16607.                      end if ;
  16608.                   end if ;
  16609.  
  16610.                when OVER_IMPORT | OVER_CONTAINED_EXPORT =>
  16611.                   if OBJECT_LOC.Y < REFERENCE_POINT.Y and then 
  16612.                      OBJECT_SIZE.Y > SIZE_POINT.Y and then
  16613.                      OBJECT_SIZE.X > REFERENCE_POINT.X and then
  16614.                      OBJECT_LOC.X < SIZE_POINT.X then
  16615.                      -- an overlap has been found
  16616.                      if not TOTALLY_CONTAINED then
  16617.                         return TRUE ;
  16618.                      end if ;
  16619.                   end if ;
  16620.  
  16621.             end case ;
  16622.  
  16623.             SUB_LIST_PTR := LIST(SUB_LIST_PTR).NEXT ;
  16624.          end loop ;
  16625.  
  16626.          -- no overlap was found or a completely enclosed entity was found
  16627.          return FALSE  ;
  16628.  
  16629.       end OVERLAPS_CHECK ;
  16630.  
  16631.    begin 
  16632.  
  16633.       -- set graphics window active.
  16634.       GRAPHIC_DRIVER.SELECT_WINDOW
  16635.               ( GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  16636.  
  16637.       -- get box points in proper scope
  16638.       while not PROPER_SCOPE loop 
  16639.  
  16640.          -- initialize list of enclosed entities for out-of-scope create
  16641.          ENCLOSED_ENTITIES := ( others => TREE_DATA.NULL_POINTER ) ;
  16642.          ENCLOSED_INDEX := ENCLOSED_ENTITIES'first ;
  16643.  
  16644.          -- set boolean to show no enclosed entities
  16645.          ENCLOSURE_EXISTS := false ;
  16646.  
  16647.          -- prompt operator to select upper left point. 
  16648.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16649.                  ( UPPER_LEFT_PROMPT ,
  16650.                    FORMAT_FCT'( CENTER_A_LINE ) ,
  16651.                    ROW_NO( 23 ) ) ;
  16652.          -- get the upper left box point.
  16653.          REFERENCE_POINT :=
  16654.                    GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  16655.          -- clear the user prompt.
  16656.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16657.                  ( BLANK_LINE ,
  16658.                    FORMAT_FCT'( CLEAR_A_LINE ) ,
  16659.                    ROW_NO( 23 ) ) ;
  16660.          -- turn on point marker at upper left corner
  16661.          UTILITIES.REFERENCE_MARKER
  16662.                    ( GKS_SPECIFICATION.VISIBLE , REFERENCE_POINT ) ;
  16663.  
  16664.          -- search tree for a scope reference and size point pair
  16665.          PARENT := SCOPE_SEARCH ( REFERENCE_POINT ) ;
  16666.  
  16667.          -- prompt operator to select lower right point
  16668.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16669.                  ( LOWER_RIGHT_PROMPT ,
  16670.                    FORMAT_FCT'( CENTER_A_LINE ) ,
  16671.                    ROW_NO( 23 ) ) ;
  16672.  
  16673.          -- get the lower right box point.
  16674.          SIZE_POINT := GRAPHIC_DRIVER.GET_GRAPHICS_CURSOR_POSITION ;
  16675.          -- clear the user prompt. 
  16676.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16677.                  ( BLANK_LINE ,
  16678.                    FORMAT_FCT'( CLEAR_A_LINE ) ,
  16679.                    ROW_NO( 23 ) ) ;
  16680.          -- turn off point marker at upper left corner
  16681.          UTILITIES.REFERENCE_MARKER
  16682.                    ( GKS_SPECIFICATION.INVISIBLE , REFERENCE_POINT ) ;
  16683.  
  16684.          -- the proper scoping exists if:
  16685.          --   1) the reference and size points are in valid
  16686.          --      relative locations.
  16687.          --   2) the reference and size points have the same Parent.
  16688.          --   3) the other corners also have the same Parent.
  16689.          UPPER_RIGHT_CORNER.X := SIZE_POINT.X ;
  16690.          UPPER_RIGHT_CORNER.Y := REFERENCE_POINT.Y ;
  16691.          LOWER_LEFT_CORNER.X := REFERENCE_POINT.X ;
  16692.          LOWER_LEFT_CORNER.Y := SIZE_POINT.Y ;
  16693.          PROPER_SCOPE :=
  16694.                 ( REFERENCE_POINT.X < SIZE_POINT.X ) and
  16695.                 ( REFERENCE_POINT.Y > SIZE_POINT.Y ) and
  16696.                 ( PARENT = SCOPE_SEARCH ( SIZE_POINT )) and 
  16697.                 ( PARENT = SCOPE_SEARCH ( UPPER_RIGHT_CORNER )) and 
  16698.                 ( PARENT = SCOPE_SEARCH ( LOWER_LEFT_CORNER )) ;
  16699.  
  16700.          if not PROPER_SCOPE then
  16701.             -- tell the operator that the reference and
  16702.             -- and size points did not have proper scope
  16703.             DISPLAY_ERROR( "invalid, entity points and corners " 
  16704.                            & "must be within the same scope" );
  16705.          elsif COMPUTE_NESTING_LEVEL (PARENT) >= MAX_NESTING_LEVEL then
  16706.             -- check if the box would exceed the maximum nesting level
  16707.             DISPLAY_ERROR ( "invalid, entity placement would exceed maximum nesting level" ) ;
  16708.             PROPER_SCOPE := false ;
  16709.          elsif TREE( PARENT ).NODE_TYPE in ROOT .. TYPE_TASK then
  16710.             -- check that no entities would be graphically contained or
  16711.             -- partially overlapped within the box defined by the 
  16712.             -- REFERENCE_POINT and SIZE_POINT.
  16713.             LIST_PTR := TREE_OPS.GET_LIST_HEAD (PARENT, CONTAINED_LIST) ;
  16714.             if OVERLAPS_CHECK( OVER_CONTAINED_ENTITY, LIST_PTR ) then
  16715.                PROPER_SCOPE := FALSE ;
  16716.                DISPLAY_ERROR (" invalid, entities may not overlap previously created entities " ) ;
  16717.             elsif TREE( PARENT ).NODE_TYPE in 
  16718.                  TYPE_VIRTUAL_PACKAGE .. TYPE_PACKAGE then
  16719.                if OVERLAPS_CHECK( OVER_EXPORT, 
  16720.                              TREE_OPS.GET_LIST_HEAD (PARENT ,
  16721.                                                      EXPORTED_LIST) ) or else
  16722.                     OVERLAPS_CHECK( OVER_IMPORT,
  16723.                              TREE_OPS.GET_LIST_HEAD (PARENT ,
  16724.                                                      IMPORTED_LIST) ) then
  16725.                   PROPER_SCOPE := FALSE ;
  16726.                   DISPLAY_ERROR (" invalid, entities may not overlap previously created annotations " ) ;
  16727.  
  16728.                end if;
  16729.             elsif TREE( PARENT ).NODE_TYPE = TYPE_TASK then
  16730.                -- check the entry list for overlap
  16731.                if OVERLAPS_CHECK( OVER_CONTAINED_EXPORT, 
  16732.                        TREE_OPS.GET_LIST_HEAD (PARENT ,
  16733.                                                ENTRY_LIST) ) then
  16734.                   PROPER_SCOPE := FALSE ;
  16735.                   DISPLAY_ERROR (" invalid, entities may not overlap previously created annotations " ) ;
  16736.                end if ;
  16737.             end if;
  16738.  
  16739.             -- If enclosed entities exist then verify the enclosed entities.
  16740.             if PROPER_SCOPE and then ENCLOSURE_EXISTS then
  16741.                PROPER_SCOPE := VERIFY_ENCLOSED_ENTITIES (
  16742.                      ENCLOSED_ENTITIES, REFERENCE_POINT, SIZE_POINT, PARENT ) ;
  16743.             end if ;
  16744.  
  16745.          end if;
  16746.       end loop ;
  16747.  
  16748.    end REQUEST_POINTS ;
  16749.  
  16750.  
  16751.    procedure REQUEST_PROLOGUE
  16752.               ( PROLOGUE_NODE : in TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ) is
  16753.    -- =========================================================
  16754.    --  This procedure request the operator to input the PROLOGUE
  16755.    -- =========================================================
  16756.    BLANK_PROLOGUE_LINE : PROLOGUE_LINE := (others => ' ') ;
  16757.    DATA_LINE : PROLOGUE_LINE ;
  16758.    LAST_LINE : NATURAL := 22 ;
  16759.  
  16760.    begin
  16761.       -- clear the screen
  16762.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  16763.            ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  16764.  
  16765.       for I in 1 .. PROLOGUE_COUNT loop
  16766.          -- display the previously entered lines, preceded by
  16767.          -- a blank line
  16768.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16769.             ( BLANK_PROLOGUE_LINE ,
  16770.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16771.               ROW_NO( LAST_LINE - I ),
  16772.               COL_NO( 1 ) ) ;
  16773.          for J in 1 .. I-1 loop
  16774.             VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16775.                ( PROLOGUE(PROLOGUE_NODE).DATA(J) ,
  16776.                  CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16777.                  ROW_NO( (LAST_LINE - I) + J ),
  16778.                  COL_NO( 1 ) ) ;
  16779.          end loop ;
  16780.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16781.             ( BLANK_PROLOGUE_LINE ,
  16782.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16783.               ROW_NO( LAST_LINE ),
  16784.               COL_NO( 1 ) ) ;
  16785.  
  16786.          -- Prompt the operator for the line.
  16787.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  16788.             ( "Enter PROLOGUE text line " & INTEGER'image(I) &
  16789.               ", blank or (cr) = exit prologue ",
  16790.               FORMAT_FCT'( CENTER_A_LINE ) ,
  16791.               ROW_NO( 23 ) ) ;
  16792.  
  16793.          -- Retrieve the operator specified line
  16794.          DATA_LINE := BLANK_PROLOGUE_LINE ;
  16795.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16796.             ( DATA_LINE , 
  16797.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16798.               ROW_NO( 24 ) ,
  16799.               COL_NO( 1 ) ) ;
  16800.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16801.             ( DATA_LINE , 
  16802.               CURSOR_ADDRESS'(READ_WITH_ADDRESS),
  16803.               ROW_NO( 24 ) ,
  16804.               COL_NO( 1 ) ) ;
  16805.  
  16806.          PROLOGUE(PROLOGUE_NODE).DATA(I) := DATA_LINE ;
  16807.  
  16808.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  16809.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  16810.  
  16811.          exit when DATA_LINE = BLANK_PROLOGUE_LINE ;
  16812.  
  16813.       end loop ;
  16814.  
  16815.    exception
  16816.       when others =>
  16817.          -- continue with the old parent
  16818.          DISPLAY_ERROR("PROGRAM ERROR -- in request PROLOGUE") ;
  16819.          raise ;
  16820.  
  16821.    end REQUEST_PROLOGUE ;
  16822.  
  16823.  
  16824.    procedure DISPLAY_PROLOGUE
  16825.               ( PROLOGUE_NODE : in TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ) is
  16826.    -- =========================================================
  16827.    --  This procedure displays the PROLOGUE
  16828.    -- =========================================================
  16829.    BLANK_PROLOGUE_LINE : PROLOGUE_LINE := (others => ' ') ;
  16830.    PROMPT_LINE : PROLOGUE_LINE := BLANK_PROLOGUE_LINE ;
  16831.  
  16832.    begin
  16833.       PROMPT_LINE(19..33) := "Entity Prologue" ;
  16834.       VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16835.          ( PROMPT_LINE ,
  16836.            CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16837.            ROW_NO( 24-PROLOGUE_COUNT ),
  16838.            COL_NO( 1 ) ) ;
  16839.       for I in 1 .. PROLOGUE_COUNT loop
  16840.          -- display the previously entered lines
  16841.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  16842.             ( PROLOGUE(PROLOGUE_NODE).DATA(I) ,
  16843.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  16844.               ROW_NO( 24-(PROLOGUE_COUNT-I) ),
  16845.               COL_NO( 1 ) ) ;
  16846.       end loop ;
  16847.  
  16848.    end DISPLAY_PROLOGUE ;
  16849.  
  16850.    function SCOPE_SEARCH
  16851.              ( REFERENCE_POINT : in GRAPHICS_DATA.POINT )
  16852.              return TREE_DATA.TREE_NODE_ACCESS_TYPE is
  16853.    -- ==========================================================
  16854.    --  Return a Tree Pointer to the Parent of the user
  16855.    --  specified reference point.  The Parent is the object 
  16856.    --  whose reference and size points contain the user 
  16857.    --  specified reference point.
  16858.    -- ==========================================================
  16859.       use TREE_OPS ;
  16860.       PARENT : TREE_NODE_ACCESS_TYPE := ROOT_NODE ;
  16861.       NEW_PARENT : TREE_NODE_ACCESS_TYPE ;
  16862.       LIST_IN_PROGRESS : LIST_TYPE := CONTAINED_LIST ;
  16863.       LIST_PTR : LIST_NODE_ACCESS_TYPE ;
  16864.  
  16865.       function CHECK_LIST_FOR_ENCLOSURE ( LIST_HEAD : LIST_NODE_ACCESS_TYPE )
  16866.                return TREE_NODE_ACCESS_TYPE is
  16867.          -- Check if any entities in the specified list enclose
  16868.          -- the reference point.  Return the pointer to the enclosing
  16869.          -- tree node, and if none found, return the NULL_POINTER.
  16870.          LIST_PTR : LIST_NODE_ACCESS_TYPE := LIST_HEAD ;
  16871.       begin
  16872.          while LIST_PTR /= NULL_POINTER loop
  16873.             if SCOPE_CHECK (REFERENCE_POINT, LIST(LIST_PTR).ITEM) then
  16874.                -- found a closer containing object, which is now
  16875.                -- the best estimate of the Parent
  16876.                return LIST( LIST_PTR ).ITEM ;
  16877.             else
  16878.                -- check the next element in the list
  16879.                LIST_PTR := LIST( LIST_PTR ).NEXT ;
  16880.             end if ;
  16881.          end loop ;
  16882.          -- no enclosing entity found in the list
  16883.          return NULL_POINTER ;
  16884.       end CHECK_LIST_FOR_ENCLOSURE ;
  16885.  
  16886.    begin
  16887.       -- Check all the objects in the lists of the current 
  16888.       -- parent to see if any of the children contain the point.
  16889.       -- Start from the CONTAINED_LIST of the ROOT.
  16890.       while LIST_IN_PROGRESS /= NULL_LIST loop
  16891.          LIST_PTR := GET_LIST_HEAD ( PARENT, LIST_IN_PROGRESS ) ;
  16892.          -- check if this list contain an entity containing
  16893.          -- the reference point
  16894.          NEW_PARENT := CHECK_LIST_FOR_ENCLOSURE( LIST_PTR ) ;
  16895.          if NEW_PARENT /= NULL_POINTER then
  16896.             -- a new enclosing entity has been found,
  16897.             -- search all its lists
  16898.             PARENT := NEW_PARENT ;
  16899.             LIST_IN_PROGRESS := START ;
  16900.          end if ;         
  16901.          LIST_IN_PROGRESS := NEXT_LIST_TO_SCAN ( PARENT, LIST_IN_PROGRESS ) ;
  16902.       end loop ;
  16903.  
  16904.       -- check if the point is inside the body of the current parent
  16905.       begin
  16906.          if TREE(PARENT).NODE_TYPE in TYPE_VIRTUAL_PACKAGE .. TYPE_TASK then
  16907.             if SCOPE_CHECK (REFERENCE_POINT, TREE(PARENT).BODY_PTR) then
  16908.                PARENT := TREE(PARENT).BODY_PTR ;
  16909.             end if ;
  16910.          end if ;
  16911.       exception
  16912.          when others =>
  16913.             -- continue with the old parent
  16914.             null ;
  16915.       end ;
  16916.  
  16917.       -- For PARENTS with contained entities 
  16918.       -- check if the reference point is in the Exports , Imports,
  16919.       -- or Entry Points contained immediately within the current scope.
  16920.       begin
  16921.          if TREE( PARENT ).NODE_TYPE in ROOT .. TYPE_TASK then
  16922.             -- check all the contained entities
  16923.             LIST_PTR := GET_LIST_HEAD ( PARENT, CONTAINED_LIST ) ;
  16924.             while LIST_PTR /= NULL_POINTER loop
  16925.                -- check the Exports and Imports of Package (incl virtual)
  16926.                case TREE( LIST( LIST_PTR ).ITEM ).NODE_TYPE is
  16927.                   when TYPE_VIRTUAL_PACKAGE .. TYPE_PACKAGE => 
  16928.                      -- check the Exports List 
  16929.                      NEW_PARENT := CHECK_LIST_FOR_ENCLOSURE 
  16930.                       ( GET_LIST_HEAD( LIST( LIST_PTR ).ITEM, EXPORTED_LIST ) ) ;
  16931.                      if NEW_PARENT /= NULL_POINTER then
  16932.                         PARENT := NEW_PARENT ;
  16933.                         exit ;
  16934.                      end if ;
  16935.                      -- check the Imports List
  16936.                      NEW_PARENT := CHECK_LIST_FOR_ENCLOSURE 
  16937.                       ( GET_LIST_HEAD( LIST( LIST_PTR ).ITEM, IMPORTED_LIST ) ) ;
  16938.                      if NEW_PARENT /= NULL_POINTER then
  16939.                         PARENT := NEW_PARENT ;
  16940.                         exit ;
  16941.                      end if ;
  16942.                   when TYPE_TASK =>
  16943.                      -- check the Entry Points List
  16944.                      NEW_PARENT := CHECK_LIST_FOR_ENCLOSURE 
  16945.                       ( GET_LIST_HEAD( LIST( LIST_PTR ).ITEM, ENTRY_LIST ) ) ;
  16946.                      if NEW_PARENT /= NULL_POINTER then
  16947.                         PARENT := NEW_PARENT ;
  16948.                         exit ;
  16949.                      end if ;
  16950.                   when others =>
  16951.                      null ;
  16952.                end case ;
  16953.                -- check the next list element
  16954.                LIST_PTR := LIST( LIST_PTR ).NEXT ;
  16955.             end loop ;
  16956.          end if ;
  16957.       exception
  16958.          when others =>
  16959.             -- continue with the old parent
  16960.             null ;
  16961.       end ;
  16962.  
  16963.       -- found the parent
  16964.       return PARENT ;
  16965.  
  16966.    end SCOPE_SEARCH ;
  16967.  
  16968.  
  16969.    function SCOPE_CHECK
  16970.              ( NEW_ENTITY_POINT : in GRAPHICS_DATA.POINT ;
  16971.                PARENT           : in TREE_DATA.TREE_NODE_ACCESS_TYPE )
  16972.              return BOOLEAN is
  16973.    -- ==========================================================
  16974.    --  If the specified new entity being drawn is within the
  16975.    --  boundary of the Parent's reference and size points then
  16976.    --  return true; else return false.
  16977.    -- ==========================================================
  16978.       GRAPH_DATA : GRAPHICS_DATA.GRAPHICS_DATA_TYPE ;
  16979.       LOCATION   : GRAPHICS_DATA.POINT ;
  16980.       SIZE       : GRAPHICS_DATA.POINT ;
  16981.    begin
  16982.       -- check for a valid Parent pointer
  16983.       if PARENT = NULL_POINTER then
  16984.          -- checking non-existent scope
  16985.          return false ;
  16986.       elsif PARENT < NULL_POINTER or PARENT > MAX_TREE_NODES then
  16987.          TRACE_PKG.TRACE (" bad Parent pointer in SCOPE_CHECK " &
  16988.                           INTEGER'image (PARENT) ) ;
  16989.          return false ;
  16990.       end if ;
  16991.       GRAPH_DATA := GRAPH(TREE(PARENT).GRAPH_DATA).DATA ;
  16992.       LOCATION := GRAPH_DATA.LOCATION ;
  16993.       SIZE := GRAPH_DATA.SIZE ;
  16994.       -- if the SIZE point is not defined then set it so that 
  16995.       -- nothing will be selected
  16996.       if SIZE = NULL_POINT then
  16997.          SIZE := LOCATION ;
  16998.       end if ;
  16999.       -- check if the new entity point is bounded by the location
  17000.       -- and size points of the parent.
  17001.       if NEW_ENTITY_POINT.X > LOCATION.X and then 
  17002.        NEW_ENTITY_POINT.Y < LOCATION.Y and then
  17003.        NEW_ENTITY_POINT.X < SIZE.X and then
  17004.        NEW_ENTITY_POINT.Y > SIZE.Y then
  17005.          return true ;
  17006.       else
  17007.          return false ;
  17008.       end if ;
  17009.    exception
  17010.       when others =>
  17011.          TRACE_PKG.TRACE (" exception raised in SCOPE_CHECK ") ;
  17012.          return false ;
  17013.    end SCOPE_CHECK ;
  17014.  
  17015.  
  17016.    function CHECK_IF_GENERIC_INSTAN
  17017.             ( TREE_NODE : TREE_NODE_ACCESS_TYPE )
  17018.    return BOOLEAN is
  17019.    -- =====================================================================
  17020.    --  This procedure returns true if the TREE_NODE passed to it is
  17021.    --  a generic instantiation.
  17022.    -- =====================================================================
  17023.    begin
  17024.       if TREE(TREE_NODE).GENERIC_STATUS = 
  17025.        TREE_DATA.GENERIC_STATUS_TYPE'(GENERIC_INSTANTIATION) then
  17026.          return TRUE ;
  17027.       else
  17028.          return FALSE ;
  17029.       end if ;
  17030.    exception
  17031.       when others =>
  17032.          -- handle TREE_NODEs for which GENERIC_STATUS is not defined
  17033.          return FALSE ;
  17034.    end CHECK_IF_GENERIC_INSTAN ;
  17035.  
  17036.  
  17037.    function GET_FIGURE_TYPE ( PARENT : ENTITY_TYPE ) return
  17038.         GRAPHICS_DATA.GRAPHIC_ENTITY is
  17039.    -- =========================================================
  17040.    --  This procedure returns the figure_entity declaration
  17041.    --  for the corresponding entity_type declaration.
  17042.    -- =========================================================
  17043.    begin
  17044.       case PARENT is
  17045.  
  17046.          when TYPE_VIRTUAL_PACKAGE =>
  17047.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( VIRTUAL_PKG_FIGURE ) ;
  17048.          when TYPE_PACKAGE => 
  17049.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( PACKAGE_FIGURE ) ;
  17050.          when TYPE_PROCEDURE => 
  17051.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( SUBPROGRAM_FIGURE ) ;
  17052.          when TYPE_FUNCTION => 
  17053.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( SUBPROGRAM_FIGURE ) ;
  17054.          when TYPE_TASK => 
  17055.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( TASK_FIGURE ) ;
  17056.          when TYPE_BODY => 
  17057.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( BODY_FIGURE ) ;
  17058.          when CONNECTION_BY_CALL => 
  17059.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( CALL_CONNECT_LINE ) ;
  17060.          when CONNECTION_FOR_DATA => 
  17061.             return GRAPHICS_DATA.GRAPHIC_ENTITY' ( DATA_CONNECT_LINE ) ;
  17062.          when others =>
  17063.             raise UTILITY_FAILED ;
  17064.       end case ;
  17065.    end GET_FIGURE_TYPE ;
  17066.  
  17067.  
  17068.    function GET_LINE_TYPE ( PARENT : ENTITY_TYPE ) return
  17069.         GRAPHICS_DATA.LINE_ENTITY is
  17070.    -- =========================================================
  17071.    --  This procedure returns the graphic_entity declaration
  17072.    --  for the corresponding entity_type declaration.
  17073.    -- =========================================================
  17074.    begin
  17075.       case PARENT is
  17076.          when CONNECTION_BY_CALL => 
  17077.             return GRAPHICS_DATA.LINE_ENTITY' ( CALL_CONNECT_LINE ) ;
  17078.          when CONNECTION_FOR_DATA =>  
  17079.             return GRAPHICS_DATA.LINE_ENTITY' ( DATA_CONNECT_LINE ) ;
  17080.          when others =>  -- EXPORTS
  17081.             return GRAPHICS_DATA.LINE_ENTITY' ( EXPORT_CONNECT_LINE ) ;
  17082.       end case ;
  17083.    end GET_LINE_TYPE ;
  17084.  
  17085.  
  17086.    procedure PICK_GRAPH_ENTITY ( PROMPT : in STRING ;
  17087.         GRAPH_NODE : in out TREE_DATA.GRAPH_NODE_ACCESS_TYPE ) is
  17088.    -- =========================================================
  17089.    --  This procedure performs the prompt display and graph node
  17090.    --  lookup for a picked graphic entity.
  17091.    --  The routine exits with the window being 
  17092.    --  the GRAPH_VIEW_PORT.
  17093.    -- =========================================================
  17094.  
  17095.       BLANK_LINE     : constant string := " " ;
  17096.       DONE           : BOOLEAN := FALSE ;
  17097.       FOUND          : BOOLEAN := FALSE ;
  17098.  
  17099.       REFERENCE_SEG_ID    : GKS_SPECIFICATION.SEGMENT_NAME ;
  17100.  
  17101.    begin
  17102.       while not DONE loop
  17103.          begin
  17104.             -- set graphics window active
  17105.             GRAPHIC_DRIVER.SELECT_WINDOW
  17106.                ( GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  17107.             -- request the user identify the annotation
  17108.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  17109.                ( PROMPT ,
  17110.                  FORMAT_FCT'( CENTER_A_LINE ) ,
  17111.                  ROW_NO( 23 ) ) ;
  17112.             -- obtain closest segment id to the point
  17113.             REFERENCE_SEG_ID := GRAPHIC_DRIVER.PICK_SEGMENT ;
  17114.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  17115.                ( BLANK_LINE ,
  17116.                  FORMAT_FCT'( CLEAR_SCREEN ) ,
  17117.                  ROW_NO( 23 ) ) ;
  17118.  
  17119.             -- find the graph node pointer of the corresponding
  17120.             -- segment id 
  17121.             FOUND := FALSE ;
  17122.             for GPTR in GRAPH'first .. GRAPH'last loop
  17123.                GRAPH_NODE := GPTR ;
  17124.                if ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID = REFERENCE_SEG_ID ) or
  17125.                   ( GRAPH(GRAPH_NODE).DATA.SEGMENT_ID = REFERENCE_SEG_ID ) then
  17126.                   FOUND := TRUE ;
  17127.                   exit ;
  17128.                end if ;
  17129.             end loop ;
  17130.             if not FOUND then
  17131.                GRAPH_NODE := NULL_POINTER ;
  17132.                DISPLAY_ERROR ( "PROGRAM ERROR -- entity is not in the graph tree" ) ;
  17133.             else
  17134.                DONE := TRUE ;
  17135.             end if ;
  17136.          end ;
  17137.       end loop ; -- not DONE
  17138.  
  17139.    end PICK_GRAPH_ENTITY ;
  17140.  
  17141.  
  17142.    procedure DISPLAY_AND_IDENTIFY 
  17143.              ( ENTITY_ITEM : ENTITY_TYPE ;
  17144.                ENTITY_NAME : TREE_DATA.NAME_TYPE ;
  17145.                LABEL_POINT : GRAPHICS_DATA.POINT ; 
  17146.                SIZE_POINT : in out GRAPHICS_DATA.POINT ; 
  17147.                COLOR : GRAPHICS_DATA.COLOR_TYPE ;
  17148.                REFERENCE_SEG_ID : in out GKS_SPECIFICATION.SEGMENT_NAME ) is
  17149.    -- =========================================================
  17150.    --  This procedure displays the entity and returns the 
  17151.    --  segment identifier.
  17152.    -- =========================================================
  17153.  
  17154.    begin
  17155.       case ENTITY_ITEM is
  17156.          when EXPORTED_TYPE =>
  17157.             GRAPHIC_DRIVER.LABEL
  17158.                      ( REFERENCE_SEG_ID ,
  17159.                        SIZE_POINT ,
  17160.                        LABEL_POINT,
  17161.                        TRUNCATE_NAME
  17162.                           ( GRAPHICS_DATA.TYPE_DECL ( 1 ) & ENTITY_NAME ,
  17163.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17164.                        & GRAPHICS_DATA.TYPE_DECL ( 2 ) ,
  17165.                        COLOR ) ;
  17166.          when EXPORTED_OBJECT =>
  17167.             GRAPHIC_DRIVER.LABEL
  17168.                      ( REFERENCE_SEG_ID ,
  17169.                        SIZE_POINT ,
  17170.                        LABEL_POINT,
  17171.                        TRUNCATE_NAME
  17172.                           ( GRAPHICS_DATA.OBJECT_DECL ( 1 ) & ENTITY_NAME ,
  17173.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17174.                        & GRAPHICS_DATA.OBJECT_DECL ( 2 ) ,
  17175.                        COLOR ) ;
  17176.          when EXPORTED_EXCEPTION =>
  17177.             GRAPHIC_DRIVER.LABEL
  17178.                      ( REFERENCE_SEG_ID ,
  17179.                        SIZE_POINT ,
  17180.                        LABEL_POINT,
  17181.                        TRUNCATE_NAME
  17182.                           ( GRAPHICS_DATA.EXCEPTION_DECL ( 1 ) & ENTITY_NAME ,
  17183.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17184.                        & GRAPHICS_DATA.EXCEPTION_DECL ( 2 ) ,
  17185.                        COLOR ) ;
  17186.          when IMPORTED_VIRTUAL_PACKAGE =>
  17187.             GRAPHIC_DRIVER.LABEL
  17188.                      ( REFERENCE_SEG_ID ,
  17189.                        SIZE_POINT ,
  17190.                        LABEL_POINT,
  17191.                        TRUNCATE_NAME
  17192.                           ( GRAPHICS_DATA.VIRT_PKG_DECL ( 1 ) & ENTITY_NAME ,
  17193.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17194.                        & GRAPHICS_DATA.VIRT_PKG_DECL ( 2 ) ,
  17195.                        COLOR ) ;
  17196.          when IMPORTED_PACKAGE =>
  17197.             GRAPHIC_DRIVER.LABEL
  17198.                      ( REFERENCE_SEG_ID ,
  17199.                        SIZE_POINT ,
  17200.                        LABEL_POINT,
  17201.                        TRUNCATE_NAME
  17202.                           ( GRAPHICS_DATA.PKG_DECL ( 1 ) & ENTITY_NAME ,
  17203.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17204.                        & GRAPHICS_DATA.PKG_DECL ( 2 ) ,
  17205.                        COLOR ) ;
  17206.          when IMPORTED_PROCEDURE | EXPORTED_PROCEDURE =>
  17207.             GRAPHIC_DRIVER.LABEL
  17208.                      ( REFERENCE_SEG_ID ,
  17209.                        SIZE_POINT ,
  17210.                        LABEL_POINT,
  17211.                        TRUNCATE_NAME
  17212.                           ( GRAPHICS_DATA.SUBPROG_DECL ( 1 ) & ENTITY_NAME ,
  17213.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17214.                        & GRAPHICS_DATA.SUBPROG_DECL ( 2 ) ,
  17215.                        COLOR ) ;
  17216.          when IMPORTED_FUNCTION | EXPORTED_FUNCTION =>
  17217.             GRAPHIC_DRIVER.LABEL
  17218.                      ( REFERENCE_SEG_ID ,
  17219.                        SIZE_POINT ,
  17220.                        LABEL_POINT,
  17221.                        TRUNCATE_NAME
  17222.                           ( GRAPHICS_DATA.SUBPROG_DECL ( 1 )
  17223.                             & GRAPHICS_DATA.FUNCTION_SYMBOL & ENTITY_NAME ,
  17224.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17225.                        & GRAPHICS_DATA.SUBPROG_DECL ( 2 ) ,
  17226.                        COLOR ) ;
  17227.          when TYPE_ENTRY_POINT | EXPORTED_ENTRY_POINT =>
  17228.             GRAPHIC_DRIVER.LABEL
  17229.                      ( REFERENCE_SEG_ID ,
  17230.                        SIZE_POINT ,
  17231.                        LABEL_POINT,
  17232.                        TRUNCATE_NAME
  17233.                           ( GRAPHICS_DATA.TASK_ENTRY_DECL ( 1 ) & ENTITY_NAME ,
  17234.                             GRAPHICS_DATA.LABEL_MAX_LENGTH )
  17235.                        & GRAPHICS_DATA.TASK_ENTRY_DECL ( 2 ) ,
  17236.                        COLOR ) ;
  17237.          when others =>
  17238.             REFERENCE_SEG_ID := NULL_SEGMENT ;
  17239.             raise UTILITY_FAILED ;
  17240.       end case ; -- ENTITY_ITEM
  17241.  
  17242.    end DISPLAY_AND_IDENTIFY ;
  17243.  
  17244.  
  17245.    procedure PERFORM_SEGMENT_OP 
  17246.              ( SEGMENT: in GKS_SPECIFICATION.SEGMENT_NAME ;
  17247.                OPERATION : in SEGMENT_OPS_TYPE ) is
  17248.    -- =========================================================
  17249.    --  This procedure performs the selected operation on the
  17250.    --  specified segment.
  17251.    -- =========================================================
  17252.    begin
  17253.       if SEGMENT /= NULL_SEGMENT then
  17254.          case OPERATION is
  17255.             when HILITED =>
  17256.                GRAPHIC_DRIVER.HILITE_SEGMENT 
  17257.                 ( SEGMENT ,
  17258.                   GKS_SPECIFICATION.HIGHLIGHTED );
  17259.             when DELETED =>
  17260.                GRAPHIC_DRIVER.DELETE_SEGMENT (SEGMENT) ;
  17261.             when RESTORED =>
  17262.                GRAPHIC_DRIVER.HILITE_SEGMENT 
  17263.                 ( SEGMENT ,
  17264.                   GKS_SPECIFICATION.NORMAL );
  17265.          end case ;
  17266.       end if ;
  17267.    end PERFORM_SEGMENT_OP ;
  17268.  
  17269.  
  17270.    procedure PERFORM_LINE_OP 
  17271.              ( TREE_POINTER : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17272.                OPERATION : in SEGMENT_OPS_TYPE ) is
  17273.    -- =========================================================
  17274.    --  This procedure performs the selected operation on the
  17275.    --  line defined by TREE_POINTER.
  17276.    -- =========================================================
  17277.       SEGMENT         : GKS_SPECIFICATION.SEGMENT_NAME ;
  17278.  
  17279.    begin
  17280.       -- operate on the line marker
  17281.       if TREE( TREE_POINTER ).NODE_TYPE = CONNECTION_BY_CALL or else
  17282.            TREE( TREE_POINTER ).NODE_TYPE = CONNECTION_FOR_DATA then
  17283.          if TREE( TREE_POINTER ).LINE( 1 ) /= NULL_POINTER then
  17284.             SEGMENT := GRAPH( TREE( TREE_POINTER ).LINE( 1 ) ).
  17285.               DATA.LABEL_SEG_ID ;
  17286.             PERFORM_SEGMENT_OP( SEGMENT, OPERATION );
  17287.           end if ; -- null_pointer
  17288.       end if ; -- connection_by_call
  17289.  
  17290.       for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  17291.          if TREE(TREE_POINTER).LINE(I) /= NULL_POINTER then
  17292.             SEGMENT := GRAPH(TREE(TREE_POINTER).LINE(I)).DATA.SEGMENT_ID ;
  17293.             PERFORM_SEGMENT_OP 
  17294.                ( SEGMENT, OPERATION );
  17295.          else
  17296.             -- null segment marks last point in line
  17297.             exit ;
  17298.          end if ;
  17299.       end loop ;
  17300.  
  17301.    end PERFORM_LINE_OP ;
  17302.  
  17303.  
  17304.    procedure PERFORM_GRAPH_TREE_OP 
  17305.              ( PARENT : in TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17306.                OPERATION : in SEGMENT_OPS_TYPE ) is
  17307.    -- =========================================================
  17308.    --  This procedure performs the selected operation on the
  17309.    --  subtree defined by PARENT.
  17310.    -- =========================================================
  17311.       GPTR            : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  17312.       LINE_TREE_NODE  : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17313.       MEMBER_PTR      : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  17314.       SEGMENT         : GKS_SPECIFICATION.SEGMENT_NAME ;
  17315.       TREE_POINTER    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17316.       WALK_STATE      : TREE_OPS.WALK_STATE_TYPE ;
  17317.    begin
  17318.       -- set the window to graphics view port
  17319.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  17320.  
  17321.       -- highlight what is to be deleted
  17322.       TREE_OPS.START_TREE_WALK ( PARENT, WALK_STATE ) ;
  17323.       loop
  17324.          -- get the next node to be processed
  17325.          TREE_OPS.TREE_WALK ( WALK_STATE, TREE_POINTER ) ;
  17326.          exit when TREE_POINTER = NULL_POINTER ;
  17327.          -- get the graph node and perform the operations
  17328.          -- on each of the segments
  17329.          GPTR := TREE(TREE_POINTER).GRAPH_DATA ;
  17330.             if GPTR /= NULL_POINTER then
  17331.                PERFORM_SEGMENT_OP( GRAPH(GPTR).DATA.SEGMENT_ID,
  17332.                                    OPERATION );
  17333.                PERFORM_SEGMENT_OP( GRAPH(GPTR).DATA.LABEL_SEG_ID,
  17334.                                    OPERATION );
  17335.                PERFORM_SEGMENT_OP( GRAPH(GPTR).DATA.LABEL2_SEG_ID,
  17336.                                    OPERATION );
  17337.             end if ;
  17338.             -- check if node contains a line
  17339.             if TREE(TREE_POINTER).NODE_TYPE in EXPORTED_PROCEDURE ..
  17340.                  CONNECTION_FOR_DATA then
  17341.                PERFORM_LINE_OP( TREE_POINTER, OPERATION ) ;
  17342.             end if ;
  17343.             -- check if node is referenced by a line
  17344.             MEMBER_PTR := TREE(TREE_POINTER).MEMBERSHIP ;
  17345.             while MEMBER_PTR /= NULL_POINTER loop
  17346.                if LIST(MEMBER_PTR).ITEM /= TREE(TREE_POINTER).PARENT then
  17347.                   LINE_TREE_NODE := LIST( MEMBER_PTR ).ITEM ;
  17348.                   if TREE(LINE_TREE_NODE).CONNECTEE = TREE_POINTER then
  17349.                      -- operate on exported entry points in there entirety
  17350.                      if TREE(LINE_TREE_NODE).NODE_TYPE =
  17351.                         EXPORTED_ENTRY_POINT then
  17352.                         PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, OPERATION ) ;
  17353.                      else
  17354.                         -- operate on the segments forming the connecting line
  17355.                         PERFORM_LINE_OP( LINE_TREE_NODE, OPERATION ); 
  17356.                      end if ;
  17357.                   end if ; -- connectee = tree=pointer
  17358.                end if ;
  17359.                -- get next membership list node
  17360.                MEMBER_PTR := LIST( MEMBER_PTR ).NEXT ;
  17361.             end loop ; -- MEMBER_PTR /= NULL_POINTER
  17362.          end loop ;
  17363.    end PERFORM_GRAPH_TREE_OP ;
  17364.  
  17365.  
  17366.    procedure VIEW_WINDOW_CHECK
  17367.              ( PARENT : in TREE_NODE_ACCESS_TYPE ) is 
  17368.       -- ========================================================
  17369.       -- Assure that the entire subtree defined by the specified 
  17370.       --  parent is visible on the view window.
  17371.       -- ========================================================
  17372.       GRAPH_NODE : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  17373.       TREE_NODE  : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17374.       LINE_TREE_NODE  : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17375.       UPPER_LEFT_PT   : GRAPHICS_DATA.POINT ;
  17376.       LOWER_RIGHT_PT  : GRAPHICS_DATA.POINT ;
  17377.       LINE_PT         : GRAPHICS_DATA.POINT ;
  17378.       WALK_STATE : TREE_OPS.WALK_STATE_TYPE ;
  17379.       MEMBER_PTR : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  17380.  
  17381.    begin
  17382.       TREE_OPS.START_TREE_WALK ( PARENT, WALK_STATE ) ;
  17383.  
  17384.       VIEW_CHECK:
  17385.       loop
  17386.          -- walk the tree until all nodes have been processed
  17387.          TREE_OPS.TREE_WALK ( WALK_STATE, TREE_NODE ) ;
  17388.          exit VIEW_CHECK when TREE_NODE = NULL_POINTER ;
  17389.  
  17390.          if TREE( TREE_NODE ).GRAPH_DATA /= NULL_POINTER then
  17391.  
  17392.             -- the basic points of the associate graph node
  17393.             GRAPH_NODE := TREE( TREE_NODE ).GRAPH_DATA ;
  17394.             LOWER_RIGHT_PT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  17395.  
  17396.             if LOWER_RIGHT_PT /= NULL_POINT and then
  17397.                not LOCATION_IN_GRAPHIC_VIEWPORT( LOWER_RIGHT_PT ) then 
  17398.                -- zoom out
  17399.                GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17400.                GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17401.                GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17402.                exit VIEW_CHECK ;
  17403.             end if;
  17404.             UPPER_LEFT_PT := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  17405.             if not LOCATION_IN_GRAPHIC_VIEWPORT( UPPER_LEFT_PT ) then
  17406.                -- zoom out
  17407.                GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17408.                GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17409.                GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17410.                exit VIEW_CHECK ;
  17411.             end if;
  17412.          end if ;
  17413.  
  17414.          -- if a connection exists, then check the connection points
  17415.          if TREE( TREE_NODE ).NODE_TYPE in EXPORTED_PROCEDURE ..
  17416.             CONNECTION_FOR_DATA then
  17417.             for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  17418.                GRAPH_NODE := TREE( TREE_NODE ).LINE(I) ;
  17419.                if GRAPH_NODE = NULL_POINTER then
  17420.                   exit ;  
  17421.                else
  17422.                   LINE_PT := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  17423.                   if not LOCATION_IN_GRAPHIC_VIEWPORT( LINE_PT ) then
  17424.                      -- zoom out
  17425.                      GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17426.                      GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17427.                      GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17428.                      exit VIEW_CHECK ;
  17429.                   end if;
  17430.                end if ;
  17431.             end loop ;
  17432.          end if ;
  17433.  
  17434.          -- check if node is referenced by a line
  17435.          MEMBER_PTR := TREE(TREE_NODE).MEMBERSHIP ;
  17436.          while MEMBER_PTR /= NULL_POINTER loop
  17437.             if LIST(MEMBER_PTR).ITEM /= TREE(TREE_NODE).PARENT then
  17438.                LINE_TREE_NODE := LIST( MEMBER_PTR ).ITEM ;
  17439.                if TREE(LINE_TREE_NODE).CONNECTEE = TREE_NODE then
  17440.                   -- operate on the segments forming the connecting line
  17441.                   -- operate on the size point of connecting export
  17442.                   if TREE( LINE_TREE_NODE ).NODE_TYPE in
  17443.                      EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION then
  17444.                      LINE_PT := GRAPH( TREE( LINE_TREE_NODE ).
  17445.                                        GRAPH_DATA ).DATA.SIZE ;
  17446.                      if not LOCATION_IN_GRAPHIC_VIEWPORT( LINE_PT ) then
  17447.                         -- zoom out
  17448.                         GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17449.                         GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17450.                         GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17451.                         exit VIEW_CHECK ;
  17452.                      end if;
  17453.                   end if ; -- EXPORT
  17454.  
  17455.                   for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  17456.                      if TREE(LINE_TREE_NODE).LINE(I) /= NULL_POINTER then
  17457.                         LINE_PT := GRAPH(TREE(LINE_TREE_NODE).
  17458.                                         LINE(I)).DATA.LOCATION ;
  17459.                         if not LOCATION_IN_GRAPHIC_VIEWPORT( LINE_PT ) then
  17460.                            -- zoom out
  17461.                            GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17462.                            GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17463.                            GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17464.                            exit VIEW_CHECK ;
  17465.                         end if;
  17466.                      else
  17467.                         -- null segment marks last point in line
  17468.                         exit ;
  17469.                      end if ;
  17470.                   end loop ;
  17471.                end if ; -- connectee = tree_node
  17472.             end if ;
  17473.             -- get next membership list node
  17474.             MEMBER_PTR := LIST( MEMBER_PTR ).NEXT ;
  17475.          end loop ; -- MEMBER_PTR /= NULL_POINTER
  17476.  
  17477.       end loop VIEW_CHECK ;
  17478.    end VIEW_WINDOW_CHECK ;
  17479.  
  17480.  
  17481. end UTIL_FOR_TREE ; 
  17482. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  17483. --mmi_control_menus_spec.ada
  17484. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  17485. -- version 86-02-06 1005 BY JL
  17486.  
  17487. with MMI_PARAMETERS ;  use MMI_PARAMETERS ;
  17488.  
  17489. package MMI_CONTROL_MENUS is 
  17490. -- =============================================================
  17491. --
  17492. --  This package contains the menu control subprograms
  17493. --  used by the Design functions of the Man-Machine
  17494. --  Interface.  
  17495. --
  17496. -- =============================================================
  17497.  
  17498.    function CONTROL_PAN_ZOOM_MENU return COMMAND_TYPE ;
  17499.    -- =========================================================
  17500.    --  This function performs operations required to implement
  17501.    --  the pan/zoom menu commands, always returns BACKUP_CMD.
  17502.    -- =========================================================
  17503.  
  17504.    function CONTROL_GENERIC_MENU return COMMAND_TYPE ;
  17505.    -- =========================================================
  17506.    --  This function performs operations required to input
  17507.    --  the generic menu commands.
  17508.    -- =========================================================
  17509.  
  17510.    function CONTROL_PARAMETER_STATUS_MENU return COMMAND_TYPE ;
  17511.    -- =========================================================
  17512.    --  This function performs operations required to input
  17513.    --  the parameter status menu commands.
  17514.    -- =========================================================
  17515.  
  17516.    function CONTROL_CALL_STATUS_MENU return COMMAND_TYPE ;
  17517.    -- =========================================================
  17518.    --  This function performs operations required to input
  17519.    --  the call status menu commands.
  17520.    -- =========================================================
  17521.  
  17522.    function CONTROL_ENTRY_POINT_STATUS_MENU return COMMAND_TYPE ;
  17523.    -- =========================================================
  17524.    --  This function performs operations required to input
  17525.    --  the entry point status menu commands.
  17526.    -- =========================================================
  17527.  
  17528.    function CONTROL_PDL_STATUS_MENU return COMMAND_TYPE ;
  17529.    -- =========================================================
  17530.    --  This function performs operations required to input
  17531.    --  the PDL status menu commands.
  17532.    -- =========================================================
  17533.  
  17534.    function CONTROL_DELETE_MENU return COMMAND_TYPE ;
  17535.    -- ==========================================================
  17536.    --  This function returns a CONFIRM_CMD or a CANCEL_CMD.
  17537.    -- ==========================================================
  17538.  
  17539.    procedure DELETE_CONNECTION ;
  17540.    -- =========================================================
  17541.    --  This procedure performs operations required to implement
  17542.    --  the delete operations.
  17543.    -- =========================================================
  17544.  
  17545.    procedure DELETE ;
  17546.    -- =========================================================
  17547.    --  This procedure performs operations required to implement
  17548.    --  the delete operations.
  17549.    -- =========================================================
  17550.  
  17551.    function CHECK_IF_ANNOTATED_TREE_VALID return BOOLEAN ;
  17552.    -- =========================================================
  17553.    -- This function will check the tree representation of the
  17554.    -- graph.  If any inconsistencies (overlaps) exist, the 
  17555.    -- function will display an error message and then
  17556.    -- return false.
  17557.    -- =========================================================
  17558.  
  17559.    procedure MOVE_AND_RESIZE ;
  17560.    -- =========================================================
  17561.    -- This procedure prompts the user for information
  17562.    -- which will allow portions of the OODDs to be
  17563.    -- moved or resized within their current scope.
  17564.    -- =========================================================
  17565.  
  17566. end MMI_CONTROL_MENUS ;
  17567. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  17568. --mmi_control_menus_body.ada
  17569. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  17570. -- version 86-02-10 16:10 by JL
  17571.  
  17572. with GKS_SPECIFICATION           ;  use GKS_SPECIFICATION ;
  17573. with GRAPHICS_DATA               ;  use GRAPHICS_DATA ;
  17574. with GRAPHIC_DRIVER              ;  use GRAPHIC_DRIVER ;
  17575. with TEXT_IO                     ;
  17576. with TRACE_PKG                   ;
  17577. with TREE_DATA                   ;  use TREE_DATA ;
  17578. with TREE_OPS                    ;  use TREE_OPS ;
  17579. with UTILITIES                   ;  use UTILITIES ;
  17580. with UTIL_FOR_TREE               ;  use UTIL_FOR_TREE ;
  17581. with VIRTUAL_TERMINAL_INTERFACE  ;  
  17582.  
  17583. package body MMI_CONTROL_MENUS is
  17584.  
  17585.    function CONTROL_PAN_ZOOM_MENU 
  17586.    return COMMAND_TYPE is
  17587.    -- =========================================================
  17588.    --  This procedure performs operations required to implement
  17589.    --  the pan/zoom menu commands.
  17590.    -- =========================================================
  17591.  
  17592.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( PAN_UP_CMD ) ; 
  17593.       DONE           : BOOLEAN := FALSE ;
  17594.  
  17595.    begin 
  17596.       -- place graphic viewport in pan and zoom display
  17597.       GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  17598.       while not DONE loop 
  17599.          begin
  17600.             -- display the current menu and get command 
  17601.             DISPLAY_MENU_AND_GET_COMMAND( MENU_ID'( PAN_ZOOM_MENU ) , COMMAND ) ;
  17602.             case COMMAND is
  17603.                -- implement the menu commands 
  17604.                when HELP_CMD =>
  17605.                   -- display help for current menu
  17606.                   HELP ( MENU_ID'( PAN_ZOOM_MENU ) ) ;
  17607.                when BACKUP_CMD =>
  17608.                   -- return to the next higher menu
  17609.                   DONE := true ;  -- exit the loop 
  17610.                when PAN_UP_CMD =>
  17611.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.PAN_UP ) ;
  17612.                when PAN_DOWN_CMD =>
  17613.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.PAN_DOWN ) ;
  17614.                when PAN_LEFT_CMD =>
  17615.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.PAN_LEFT ) ;
  17616.                when PAN_RIGHT_CMD =>
  17617.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.PAN_RIGHT ) ;
  17618.                when ZOOM_IN_CMD =>
  17619.                   GRAPHIC_DRIVER.ZOOM ( GRAPHICS_DATA.ZOOM_IN ) ;
  17620.                when ZOOM_OUT_CMD =>
  17621.                   GRAPHIC_DRIVER.ZOOM ( GRAPHICS_DATA.ZOOM_OUT ) ;
  17622.                when MAX_PAN_UP_CMD =>
  17623.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.MAX_PAN_UP ) ;
  17624.                when MAX_PAN_DOWN_CMD =>
  17625.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.MAX_PAN_DOWN ) ;
  17626.                when MAX_PAN_LEFT_CMD =>
  17627.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.MAX_PAN_LEFT ) ;
  17628.                when MAX_PAN_RIGHT_CMD =>
  17629.                   GRAPHIC_DRIVER.PAN ( GRAPHICS_DATA.MAX_PAN_RIGHT ) ;
  17630.                when MAX_ZOOM_IN_CMD =>
  17631.                   GRAPHIC_DRIVER.ZOOM ( GRAPHICS_DATA.MAX_ZOOM_IN ) ;
  17632.                when MAX_ZOOM_OUT_CMD =>
  17633.                   GRAPHIC_DRIVER.ZOOM ( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  17634.                when others =>
  17635.                   -- this should not occur
  17636.                   null ;
  17637.             end case ; -- COMMAND
  17638.          exception
  17639.             when others =>
  17640.                -- handle error conditions that might occur
  17641.                -- report the error and continue
  17642.                DISPLAY_ERROR (" PROGRAM ERROR -- in PAN_ZOOM_MENU ") ;
  17643.                -- set menu window active.
  17644.                GRAPHIC_DRIVER.SELECT_WINDOW
  17645.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17646.          end ;
  17647.       end loop ; 
  17648.  
  17649.       -- place graphic viewport in graphic display
  17650.       GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  17651.       -- return the BACKUP command
  17652.       return COMMAND ;
  17653.    end CONTROL_PAN_ZOOM_MENU ;
  17654.  
  17655.  
  17656.    function CONTROL_GENERIC_MENU 
  17657.    return COMMAND_TYPE is
  17658.    -- =========================================================
  17659.    --  This procedure performs operations required to input
  17660.    --  the generic menu commands.
  17661.    -- =========================================================
  17662.  
  17663.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17664.       DONE           : BOOLEAN := FALSE ;
  17665.  
  17666.    begin 
  17667.       while not DONE loop 
  17668.          begin
  17669.             -- pre place icon cursor on non_generic_cmd
  17670.             COMMAND := NON_GENERIC_CMD ;
  17671.             -- display the current menu and get command from GRAPHICS_DRIVER
  17672.             DISPLAY_MENU_AND_GET_COMMAND( MENU_ID'( GENERIC_MENU ) , COMMAND ) ;
  17673.             case COMMAND is
  17674.                -- process the menu commands 
  17675.                when HELP_CMD =>
  17676.                   -- display help for current menu
  17677.                   HELP ( MENU_ID'( GENERIC_MENU ) ) ;
  17678.                when BACKUP_CMD =>
  17679.                   -- return to the next higher menu
  17680.                   raise HANDLE_ABORT_BACKUP ;
  17681.                when GENERIC_MENU_CMD =>
  17682.                   -- return the selected generic status 
  17683.                   DONE := true ;  -- exit the loop 
  17684.                when others =>
  17685.                   -- this should not occur
  17686.                   null ;
  17687.             end case ; -- COMMAND
  17688.          exception
  17689.             when HANDLE_ABORT_BACKUP =>
  17690.                -- propagate to return 
  17691.                raise ;
  17692.  
  17693.             when others =>
  17694.                -- handle error conditions that might occur
  17695.                -- report the error and continue
  17696.                DISPLAY_ERROR (" PROGRAM ERROR -- in GENERIC_MENU ") ;
  17697.                -- set menu window active.
  17698.                GRAPHIC_DRIVER.SELECT_WINDOW
  17699.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17700.          end ;
  17701.       end loop ; 
  17702.  
  17703.       -- return the command processed
  17704.       return COMMAND ;
  17705.    end CONTROL_GENERIC_MENU ;
  17706.  
  17707.  
  17708.    function CONTROL_PARAMETER_STATUS_MENU 
  17709.    return COMMAND_TYPE is
  17710.    -- =========================================================
  17711.    --  This procedure performs operations required to input
  17712.    --  the parameter status menu commands.
  17713.    -- =========================================================
  17714.  
  17715.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17716.       DONE           : BOOLEAN := FALSE ;
  17717.  
  17718.    begin 
  17719.       while not DONE loop 
  17720.          begin
  17721.             -- pre place icon cursor on has_parameters
  17722.             COMMAND := HAS_PARAMETERS_CMD ;
  17723.             -- display the current menu and get command from GRAPHICS_DRIVER
  17724.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( PARAMETER_STATUS_MENU ) , 
  17725.                                            COMMAND ) ;
  17726.             case COMMAND is
  17727.                -- input the menu commands 
  17728.                when HELP_CMD =>
  17729.                   -- display help for current menu
  17730.                   HELP ( MENU_ID'( PARAMETER_STATUS_MENU ) ) ;
  17731.                when BACKUP_CMD =>
  17732.                   -- return to the next higher menu
  17733.                   raise HANDLE_ABORT_BACKUP ;
  17734.                when PARAMETER_STATUS_MENU_CMD =>
  17735.                   -- return the selected parameter status 
  17736.                   DONE := true ;  -- exit the loop 
  17737.                when others =>
  17738.                   -- this should not occur
  17739.                   null ;
  17740.             end case ; -- COMMAND
  17741.          exception
  17742.             when HANDLE_ABORT_BACKUP =>
  17743.                -- propagate to return 
  17744.                raise ;
  17745.  
  17746.             when others =>
  17747.                -- handle error conditions that might occur
  17748.                -- report the error and continue
  17749.                DISPLAY_ERROR (" PROGRAM ERROR -- in PARAMETER_STATUS_MENU ") ;
  17750.                -- set menu window active.
  17751.                GRAPHIC_DRIVER.SELECT_WINDOW
  17752.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17753.          end ;
  17754.       end loop ; 
  17755.  
  17756.       -- return the command processed
  17757.       return COMMAND ;
  17758.    end CONTROL_PARAMETER_STATUS_MENU ;
  17759.  
  17760.  
  17761.    function CONTROL_CALL_STATUS_MENU 
  17762.    return COMMAND_TYPE is
  17763.    -- =========================================================
  17764.    --  This procedure performs operations required to input
  17765.    --  the call status menu commands.
  17766.    -- =========================================================
  17767.  
  17768.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17769.       DONE           : BOOLEAN := FALSE ;
  17770.  
  17771.    begin 
  17772.       while not DONE loop 
  17773.          begin
  17774.             -- pre place icon cursor on unconditional 
  17775.             COMMAND := UNCONDITIONAL_CMD ;
  17776.             -- display the current menu and get command from GRAPHICS_DRIVER
  17777.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( CALL_STATUS_MENU ) , 
  17778.                                            COMMAND ) ;
  17779.             case COMMAND is
  17780.                -- input the menu commands 
  17781.                when HELP_CMD =>
  17782.                   -- display help for current menu
  17783.                   HELP ( MENU_ID'( CALL_STATUS_MENU ) ) ;
  17784.                when BACKUP_CMD =>
  17785.                   -- return to the next higher menu
  17786.                   raise HANDLE_ABORT_BACKUP ;
  17787.                when CALL_STATUS_MENU_CMD =>
  17788.                   -- return the selected call status 
  17789.                   DONE := true ;  -- exit the loop 
  17790.                when others =>
  17791.                   -- this should not occur
  17792.                   null ;
  17793.             end case ; -- COMMAND
  17794.          exception
  17795.             when HANDLE_ABORT_BACKUP =>
  17796.                -- propagate to return 
  17797.                raise ;
  17798.  
  17799.             when others =>
  17800.                -- handle error conditions that might occur
  17801.                -- report the error and continue
  17802.                DISPLAY_ERROR (" PROGRAM ERROR -- in CALL_STATUS_MENU ") ;
  17803.                -- set menu window active.
  17804.                GRAPHIC_DRIVER.SELECT_WINDOW
  17805.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17806.          end ;
  17807.       end loop ; 
  17808.  
  17809.       -- return the command processed
  17810.       return COMMAND ;
  17811.    end CONTROL_CALL_STATUS_MENU ;
  17812.  
  17813.  
  17814.    function CONTROL_ENTRY_POINT_STATUS_MENU 
  17815.    return COMMAND_TYPE is
  17816.    -- =========================================================
  17817.    --  This procedure performs operations required to input
  17818.    --  the entry point status menu commands.
  17819.    -- =========================================================
  17820.  
  17821.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17822.       DONE           : BOOLEAN := FALSE ;
  17823.  
  17824.    begin 
  17825.       while not DONE loop 
  17826.          begin
  17827.             -- pre place icon cursor on unguarded
  17828.             COMMAND := UNGUARDED_CMD ;
  17829.             -- display the current menu and get command from GRAPHICS_DRIVER
  17830.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( ENTRY_POINT_STATUS_MENU ), 
  17831.                                            COMMAND ) ;
  17832.             case COMMAND is
  17833.                -- implement the menu commands 
  17834.                when HELP_CMD =>
  17835.                   -- display help for current menu
  17836.                   HELP ( MENU_ID'( ENTRY_POINT_STATUS_MENU ) ) ;
  17837.                when BACKUP_CMD =>
  17838.                   -- return to the next higher menu
  17839.                   raise HANDLE_ABORT_BACKUP ;
  17840.                when ENTRY_POINT_STATUS_MENU_CMD =>
  17841.                   -- return the selected entry point status 
  17842.                   DONE := true ;  -- exit the loop 
  17843.                when others =>
  17844.                   -- this should not occur
  17845.                   null ;
  17846.             end case ; -- COMMAND
  17847.          exception
  17848.             when HANDLE_ABORT_BACKUP =>
  17849.                -- propagate to return 
  17850.                raise ;
  17851.  
  17852.             when others =>
  17853.                -- handle error conditions that might occur
  17854.                -- report the error and continue
  17855.                DISPLAY_ERROR (" PROGRAM ERROR -- in ENTRY_POINT_STATUS_MENU ") ;
  17856.                -- set menu window active.
  17857.                GRAPHIC_DRIVER.SELECT_WINDOW
  17858.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17859.          end ;
  17860.       end loop ; 
  17861.  
  17862.       -- return the command processed
  17863.       return COMMAND ;
  17864.    end CONTROL_ENTRY_POINT_STATUS_MENU ;
  17865.  
  17866.  
  17867.    function CONTROL_PDL_STATUS_MENU 
  17868.    return COMMAND_TYPE is
  17869.    -- =========================================================
  17870.    --  This procedure performs operations required to input
  17871.    --  the PLD status menu commands.
  17872.    -- =========================================================
  17873.  
  17874.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17875.       DONE           : BOOLEAN := FALSE ;
  17876.  
  17877.    begin 
  17878.       while not DONE loop 
  17879.          begin
  17880.             -- pre place icon cursor on unguarded
  17881.             COMMAND := WITH_SUPPORT_CMD ;
  17882.             -- display the current menu and get command from GRAPHICS_DRIVER
  17883.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( PDL_STATUS_MENU ), 
  17884.                                            COMMAND ) ;
  17885.             case COMMAND is
  17886.                -- implement the menu commands 
  17887.                when HELP_CMD =>
  17888.                   -- display help for current menu
  17889.                   HELP ( MENU_ID'( PDL_STATUS_MENU ) ) ;
  17890.                when BACKUP_CMD =>
  17891.                   -- return to the next higher menu
  17892.                   raise HANDLE_ABORT_BACKUP ;
  17893.                when PDL_STATUS_MENU_CMD =>
  17894.                   -- return the selected entry point status 
  17895.                   DONE := true ;  -- exit the loop 
  17896.                when others =>
  17897.                   -- this should not occur
  17898.                   null ;
  17899.             end case ; -- COMMAND
  17900.          exception
  17901.             when HANDLE_ABORT_BACKUP =>
  17902.                -- propagate to return 
  17903.                raise ;
  17904.  
  17905.             when others =>
  17906.                -- handle error conditions that might occur
  17907.                -- report the error and continue
  17908.                DISPLAY_ERROR (" PROGRAM ERROR -- in PDL_STATUS_MENU ") ;
  17909.                -- set menu window active.
  17910.                GRAPHIC_DRIVER.SELECT_WINDOW
  17911.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17912.          end ;
  17913.       end loop ; 
  17914.  
  17915.       -- return the command processed
  17916.       return COMMAND ;
  17917.    end CONTROL_PDL_STATUS_MENU ;
  17918.  
  17919.  
  17920.    function CONTROL_DELETE_MENU 
  17921.    return COMMAND_TYPE is
  17922.    -- ==========================================================
  17923.    --  This function returns a CONFIRM_CMD or a CANCEL_CMD.
  17924.    -- ==========================================================
  17925.  
  17926.       COMMAND        : COMMAND_TYPE := CANCEL_CMD ;
  17927.       DONE           : BOOLEAN := FALSE ;
  17928.  
  17929.    begin
  17930.       while not DONE loop
  17931.          begin
  17932.             -- pre place icon cursor on cancel_cmd
  17933.             COMMAND := CANCEL_CMD ;
  17934.             -- confirm item to be deleted 
  17935.             DISPLAY_MENU_AND_GET_COMMAND( MENU_ID'( DELETE_MENU ) , COMMAND ) ;
  17936.             case COMMAND is
  17937.                -- implement the menu commands 
  17938.                when HELP_CMD =>
  17939.                   -- display help for current menu
  17940.                   HELP ( MENU_ID'( DELETE_MENU ) ) ;
  17941.                when BACKUP_CMD =>
  17942.                   -- abort the current command
  17943.                   DONE := true ;
  17944.                when DELETE_MENU_CMD =>
  17945.                   -- the operation is confirmed or canceled
  17946.                   DONE := true ;
  17947.                when others =>
  17948.                   -- invalid selection - try again
  17949.                   null ;
  17950.             end case ; -- COMMAND
  17951.          exception
  17952.             when others =>
  17953.                -- handle the error condition
  17954.                DISPLAY_ERROR (" PROGRAM ERROR -- in DELETE_MENU ") ;
  17955.                -- set menu window active.
  17956.                GRAPHIC_DRIVER.SELECT_WINDOW
  17957.                   ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  17958.          end ;
  17959.       end loop ; 
  17960.  
  17961.       -- return the selection confirm or cancel
  17962.       return COMMAND ;
  17963.    end CONTROL_DELETE_MENU ;
  17964.  
  17965.  
  17966.    procedure DELETE is
  17967.    -- =========================================================
  17968.    --  This procedure performs operations required to implement
  17969.    --  the delete operation.
  17970.    -- =========================================================
  17971.  
  17972.       DONE              : BOOLEAN := false ;
  17973.       GPTR              : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  17974.       PARENT            : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  17975.       REFERENCE_POINT   : GRAPHICS_DATA.POINT ;
  17976.       STATUS            : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  17977.       ERROR_DELETE_ROOT : EXCEPTION ;
  17978.  
  17979.    begin 
  17980.             -- set graphics window active
  17981.             GRAPHIC_DRIVER.SELECT_WINDOW
  17982.              (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  17983.  
  17984.             -- turn on abort capability
  17985.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  17986.             -- request the user identify the scope to be deleted
  17987.             REQUEST_POINT (" enter point identifying scope to be deleted",
  17988.                            REFERENCE_POINT,
  17989.                            PARENT ) ;
  17990.             -- turn off abort capability
  17991.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  17992.  
  17993.             -- check for a valid parent
  17994.             if PARENT = ROOT_NODE then
  17995.                raise ERROR_DELETE_ROOT ;
  17996.             elsif PARENT /= NULL_POINTER then
  17997.                -- verify that graph entities are in full view
  17998.                VIEW_WINDOW_CHECK( PARENT ) ;
  17999.  
  18000.                -- highlight what is to be deleted
  18001.                PERFORM_GRAPH_TREE_OP ( PARENT, HILITED ) ;
  18002.                -- display prologue if available
  18003.                if TREE(PARENT).NODE_TYPE in 
  18004.                      TYPE_VIRTUAL_PACKAGE..TYPE_TASK then
  18005.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18006.                        ( TREE( PARENT ).NAME ,
  18007.                          VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18008.                          ROW_NO( 23 ) ) ;
  18009.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18010.                        ( " is the scope of influence for the delete " ,
  18011.                          VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18012.                          ROW_NO( 24 ) ) ;
  18013.                end if ;
  18014.                -- set menu window active
  18015.                GRAPHIC_DRIVER.SELECT_WINDOW
  18016.                 (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18017.                -- request user confirm of deletion
  18018.                STATUS := CONTROL_DELETE_MENU ;
  18019.                -- set graphics window active
  18020.                GRAPHIC_DRIVER.SELECT_WINDOW
  18021.                 (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  18022.                -- clear the alpha screen
  18023.                VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  18024.                     ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  18025.                -- process the results of the confirmation
  18026.                if STATUS = CONFIRM_CMD then
  18027.                   -- delete what was highlighted
  18028.                   PERFORM_GRAPH_TREE_OP ( PARENT, DELETED ) ;
  18029.                   TREE_OPS.RELEASE_TREE_NODE (PARENT) ;
  18030.                   -- refresh screen to eliminate any broken lines
  18031.                   GRAPHIC_DRIVER.REFRESH_SCREEN ;
  18032.                else
  18033.                   -- restore the diagram
  18034.                   PERFORM_GRAPH_TREE_OP ( PARENT, RESTORED ) ;
  18035.                end if ;
  18036.             end if ;  -- process with valid parent
  18037.  
  18038.             -- set menu window active
  18039.             GRAPHIC_DRIVER.SELECT_WINDOW
  18040.              (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18041.    exception
  18042.       when ERROR_DELETE_ROOT =>
  18043.          DISPLAY_ERROR ("illegal to delete the outer scope") ;
  18044.          -- set menu window active
  18045.          GRAPHIC_DRIVER.SELECT_WINDOW
  18046.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18047.       when OPERATION_ABORTED_BY_OPERATOR =>
  18048.          -- turn off abort capability
  18049.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  18050.          -- clear the alpha screen
  18051.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  18052.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  18053.          -- set menu window active
  18054.          GRAPHIC_DRIVER.SELECT_WINDOW
  18055.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18056.       when others =>
  18057.          -- handle error conditions that might occur
  18058.          -- report the error and continue
  18059.          DISPLAY_ERROR (" PROGRAM ERROR -- in attempted delete, nothing deleted ") ;
  18060.          -- set menu window active
  18061.          GRAPHIC_DRIVER.SELECT_WINDOW
  18062.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18063.    end DELETE ;
  18064.  
  18065.  
  18066.    procedure DELETE_CONNECTION is
  18067.    -- =========================================================
  18068.    --  This procedure performs operations required to implement
  18069.    --  the delete connection operation.
  18070.    -- =========================================================
  18071.  
  18072.       DONE              : BOOLEAN := false ;
  18073.       GPTR              : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18074.       LIST_PTR          : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  18075.       TREE_NODE         : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18076.       PARENT            : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18077.       REFERENCE_POINT   : GRAPHICS_DATA.POINT ;
  18078.       START_PARENT      : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18079.       START_POINT       : GRAPHICS_DATA.POINT ;
  18080.       END_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18081.       END_POINT         : GRAPHICS_DATA.POINT ;
  18082.       STATUS            : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  18083.       ERROR_DELETE_CONNECT : EXCEPTION ;
  18084.       ERROR_DELETE_ENTRY_PT_CONNECT : EXCEPTION ;
  18085.  
  18086.    begin 
  18087.             -- set graphics window active
  18088.             GRAPHIC_DRIVER.SELECT_WINDOW
  18089.              (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  18090.  
  18091.             -- turn on abort capability
  18092.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  18093.             -- request the user identify the line starting scope to be deleted
  18094.             REQUEST_POINT ("enter within caller(starting) scope for connection to be deleted",
  18095.                            START_POINT ,
  18096.                            START_PARENT ) ;
  18097.             -- turn off abort capability
  18098.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  18099.  
  18100.             -- check for a valid parent
  18101.             if START_PARENT = ROOT_NODE or
  18102.                  START_PARENT = NULL_POINTER then
  18103.                raise ERROR_DELETE_CONNECT ;
  18104.             else
  18105.                case TREE(START_PARENT).NODE_TYPE is
  18106.                   -- only one line possible
  18107.                   when EXPORTED_PROCEDURE..EXPORTED_EXCEPTION =>
  18108.                      if TREE(START_PARENT).NODE_TYPE = EXPORTED_ENTRY_POINT then
  18109.                         -- error, don't allow delete connection
  18110.                         raise ERROR_DELETE_ENTRY_PT_CONNECT ;
  18111.                      elsif TREE(START_PARENT).LINE = NULL_LINE then
  18112.                         -- error, no line exist
  18113.                         raise ERROR_DELETE_CONNECT ;
  18114.                      end if ;
  18115.                      -- highlight line is to be deleted
  18116.                      PERFORM_LINE_OP( START_PARENT, HILITED ) ;
  18117.                      -- set menu window active
  18118.                      GRAPHIC_DRIVER.SELECT_WINDOW
  18119.                       (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18120.                      -- request user confirm of deletion
  18121.                      STATUS := CONTROL_DELETE_MENU ;
  18122.                      -- set graphics window active
  18123.                      GRAPHIC_DRIVER.SELECT_WINDOW
  18124.                       (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  18125.                      -- process the results of the confirmation
  18126.                      if STATUS = CONFIRM_CMD then
  18127.                         -- delete what was highlighted
  18128.                         PERFORM_LINE_OP( START_PARENT, DELETED ) ;
  18129.                         -- delete the tree data
  18130.                         -- release the line graph nodes
  18131.                         for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  18132.                            if TREE( START_PARENT ).LINE(I) /= NULL_POINTER then
  18133.                               RELEASE_GRAPH_NODE(TREE( START_PARENT ).LINE(I));
  18134.                            else
  18135.                               exit ;
  18136.                            end if ;
  18137.                         end loop ;
  18138.                         TREE_OPS.BREAK_REFERENCE (START_PARENT ,
  18139.                                                TREE(START_PARENT).CONNECTEE ) ;
  18140.                         TREE(START_PARENT).CONNECTEE := NULL_POINTER ;
  18141.                         TREE(START_PARENT).LINE := NULL_LINE ;
  18142.                         -- refresh screen to eliminate any broken lines
  18143.                         GRAPHIC_DRIVER.REFRESH_SCREEN ;
  18144.                      else
  18145.                         -- restore the diagram
  18146.                         PERFORM_LINE_OP( START_PARENT, RESTORED ) ;
  18147.                      end if ;
  18148.  
  18149.                   when others =>
  18150.                      begin
  18151.                         -- more than one line is possible
  18152.                         case TREE(START_PARENT).NODE_TYPE is
  18153.                            when TYPE_BODY =>
  18154.                                LIST_PTR := GET_LIST_HEAD(START_PARENT , 
  18155.                                                          CALLEE_LIST ) ;
  18156.                            when others =>
  18157.                                LIST_PTR := GET_LIST_HEAD(START_PARENT , 
  18158.                                                          DATA_CONNECT_LIST ) ;
  18159.                         end case ;
  18160.  
  18161.                      exception
  18162.                         when others =>
  18163.                            -- start parent doesn't have data connect list
  18164.                            -- propogate to display error
  18165.                            raise ERROR_DELETE_CONNECT ;
  18166.                      end ;
  18167.  
  18168.                      if LIST_PTR = NULL_POINTER then
  18169.                         -- error, no line exist
  18170.                         raise ERROR_DELETE_CONNECT ;
  18171.                      end if ;
  18172.                      if LIST(LIST_PTR).NEXT /= NULL_POINTER then 
  18173.  
  18174.                         -- turn on abort capability
  18175.                         GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON );
  18176.                         -- more than one line, get ending point
  18177.                         REQUEST_POINT ("enter within callee(ending) scope for connection to be deleted",
  18178.                                        END_POINT ,
  18179.                                        END_PARENT ) ;
  18180.                         -- turn off abort capability
  18181.                         GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF);
  18182.  
  18183.                         -- scan callee list to match end parent
  18184.                         loop
  18185.                            TREE_NODE := LIST(LIST_PTR).ITEM ;
  18186.                            exit when TREE(TREE_NODE).CONNECTEE = END_PARENT ;
  18187.  
  18188.                            LIST_PTR := LIST(LIST_PTR).NEXT ;
  18189.                            if LIST_PTR = NULL_POINTER then
  18190.                               -- error, no matching line exists 
  18191.                               raise ERROR_DELETE_CONNECT ;
  18192.                            end if ;
  18193.                         end loop ;
  18194.                      end if ;
  18195.                      PARENT := LIST(LIST_PTR).ITEM ;
  18196.                      -- highlight what is to be deleted
  18197.                      PERFORM_GRAPH_TREE_OP ( PARENT, HILITED ) ;
  18198.                      -- set menu window active
  18199.                      GRAPHIC_DRIVER.SELECT_WINDOW
  18200.                       (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18201.                      -- request user confirm of deletion
  18202.                      STATUS := CONTROL_DELETE_MENU ;
  18203.                      -- set graphics window active
  18204.                      GRAPHIC_DRIVER.SELECT_WINDOW
  18205.                       (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  18206.                      -- process the results of the confirmation
  18207.                      if STATUS = CONFIRM_CMD then
  18208.                         -- delete what was highlighted
  18209.                         PERFORM_GRAPH_TREE_OP ( PARENT, DELETED ) ;
  18210.                         TREE_OPS.RELEASE_TREE_NODE (PARENT) ;
  18211.                      else
  18212.                         -- restore the diagram
  18213.                         PERFORM_GRAPH_TREE_OP ( PARENT, RESTORED ) ;
  18214.                      end if ;
  18215.  
  18216.                end case ;
  18217.             end if ;
  18218.  
  18219.             -- set menu window active
  18220.             GRAPHIC_DRIVER.SELECT_WINDOW
  18221.              (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18222.    exception
  18223.       when ERROR_DELETE_CONNECT =>
  18224.          DISPLAY_ERROR ("invalid, no corresponding connection exists") ;
  18225.          -- set menu window active
  18226.          GRAPHIC_DRIVER.SELECT_WINDOW
  18227.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18228.       when ERROR_DELETE_ENTRY_PT_CONNECT =>
  18229.          DISPLAY_ERROR ("invalid, cannot delete connection, must delete exported entry point") ;
  18230.          -- set menu window active
  18231.          GRAPHIC_DRIVER.SELECT_WINDOW
  18232.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18233.       when OPERATION_ABORTED_BY_OPERATOR =>
  18234.          -- turn off abort capability
  18235.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  18236.          -- clear the alpha screen
  18237.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  18238.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  18239.          -- set menu window active
  18240.          GRAPHIC_DRIVER.SELECT_WINDOW
  18241.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18242.       when others =>
  18243.          -- handle error conditions that might occur
  18244.          -- report the error and continue
  18245.          DISPLAY_ERROR (" PROGRAM ERROR -- in attempted delete, nothing deleted ") ;
  18246.          -- set menu window active
  18247.          GRAPHIC_DRIVER.SELECT_WINDOW
  18248.             (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  18249.    end DELETE_CONNECTION ;
  18250.  
  18251.       function CHECK_IF_ANNOTATED_TREE_VALID return BOOLEAN is
  18252.          -- Return true if the tree is valid as currently defined.
  18253.          -- The validity check will determine if the locations
  18254.          -- of the graph entities are consistent with the semantic
  18255.          -- information of the tree.
  18256.          GRAPH_NODE      : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18257.          TREE_PARENT     : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18258.          TREE_PARENTS_PARENT     : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18259.          TREE_PTR        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18260.          WALK_STATE      : TREE_OPS.WALK_STATE_TYPE ;
  18261.          UPPER_LEFT_POINT,
  18262.          LOWER_LEFT_POINT,
  18263.          UPPER_RIGHT_POINT,
  18264.          LOWER_RIGHT_POINT : GRAPHICS_DATA.POINT ;
  18265.  
  18266.       begin
  18267.          START_TREE_WALK ( ROOT_NODE, WALK_STATE ) ;
  18268.          loop
  18269.             TREE_WALK ( WALK_STATE, TREE_PTR ) ;
  18270.             exit when TREE_PTR = NULL_POINTER ;
  18271.             case TREE( TREE_PTR ).NODE_TYPE is
  18272.  
  18273.             when TYPE_VIRTUAL_PACKAGE .. TYPE_TASK | TYPE_BODY =>
  18274.                GRAPH_NODE := TREE( TREE_PTR ).GRAPH_DATA ;
  18275.                TREE_PARENT := TREE( TREE_PTR ).PARENT ;
  18276.  
  18277.                UPPER_LEFT_POINT  := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  18278.                UPPER_LEFT_POINT.Y := UPPER_LEFT_POINT.Y + 1 ;
  18279.                LOWER_RIGHT_POINT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  18280.                LOWER_RIGHT_POINT.Y := LOWER_RIGHT_POINT.Y - 1 ;
  18281.                LOWER_LEFT_POINT  := (X => UPPER_LEFT_POINT.X ,
  18282.                                      Y => LOWER_RIGHT_POINT.Y ) ;
  18283.                UPPER_RIGHT_POINT := (X => LOWER_RIGHT_POINT.X ,
  18284.                                      Y => UPPER_LEFT_POINT.Y ) ;
  18285.  
  18286.                if SCOPE_SEARCH( UPPER_LEFT_POINT ) /= TREE_PARENT or else 
  18287.                     SCOPE_SEARCH ( LOWER_RIGHT_POINT ) /= TREE_PARENT or else 
  18288.                     SCOPE_SEARCH ( LOWER_LEFT_POINT ) /= TREE_PARENT or else 
  18289.                     SCOPE_SEARCH ( UPPER_RIGHT_POINT ) /= TREE_PARENT then
  18290.                   -- the entity location and tree information
  18291.                   -- are inconsistent
  18292.                   -- since the body nodes don't have names
  18293.                   if TREE( TREE_PTR ).NODE_TYPE = TYPE_BODY then
  18294.                      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18295.                           ( " the body of " &
  18296.                             TREE( TREE (TREE_PTR ).PARENT ).NAME(1..15) &
  18297.                             " will overlap another entity(improper scoping) " ,
  18298.                             VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18299.                             ROW_NO( 23 ) ) ;
  18300.                   else
  18301.                      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18302.                           ( TREE( TREE_PTR ).NAME(1..15) &
  18303.                             " will overlap another entity(improper scoping) " ,
  18304.                             VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18305.                             ROW_NO( 23 ) ) ;
  18306.                   end if ;
  18307.                   return false ;
  18308.                end if ;
  18309.  
  18310.             when IMPORTED_VIRTUAL_PACKAGE .. IMPORTED_FUNCTION =>
  18311.                GRAPH_NODE := TREE( TREE_PTR ).GRAPH_DATA ;
  18312.                TREE_PARENT := TREE( TREE_PTR ).PARENT ;
  18313.                TREE_PARENTS_PARENT := TREE( TREE_PARENT ).PARENT ;
  18314.  
  18315.                UPPER_LEFT_POINT  := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  18316.                UPPER_LEFT_POINT.Y := UPPER_LEFT_POINT.Y + 1 ;
  18317.                LOWER_RIGHT_POINT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  18318.                LOWER_RIGHT_POINT.Y := LOWER_RIGHT_POINT.Y - 1 ;
  18319.                LOWER_LEFT_POINT  := (X => UPPER_LEFT_POINT.X ,
  18320.                                      Y => LOWER_RIGHT_POINT.Y ) ;
  18321.                UPPER_RIGHT_POINT := (X => LOWER_RIGHT_POINT.X ,
  18322.                                      Y => UPPER_LEFT_POINT.Y ) ;
  18323.  
  18324.                if SCOPE_SEARCH( UPPER_LEFT_POINT ) /= TREE_PARENT or else 
  18325.                     SCOPE_SEARCH ( LOWER_RIGHT_POINT ) /= TREE_PARENTS_PARENT or else 
  18326.                     SCOPE_SEARCH ( LOWER_LEFT_POINT ) /= TREE_PARENT or else 
  18327.                     SCOPE_SEARCH ( UPPER_RIGHT_POINT ) /= TREE_PARENTS_PARENT then
  18328.                   -- the entity location and tree information
  18329.                   -- are inconsistent
  18330.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18331.                        ( " the import " &
  18332.                          TREE( TREE_PTR ).NAME(1..15) &
  18333.                          " will overlap another entity(improper scoping) " ,
  18334.                          VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18335.                          ROW_NO( 23 ) ) ;
  18336.                   return false ;
  18337.                end if ;
  18338.  
  18339.             when EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION =>
  18340.                GRAPH_NODE := TREE( TREE_PTR ).GRAPH_DATA ;
  18341.                TREE_PARENT := TREE( TREE_PTR ).PARENT ;
  18342.                TREE_PARENTS_PARENT := TREE( TREE_PARENT ).PARENT ;
  18343.  
  18344.                UPPER_LEFT_POINT  := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  18345.                UPPER_LEFT_POINT.Y := UPPER_LEFT_POINT.Y + 1 ;
  18346.                LOWER_RIGHT_POINT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  18347.                LOWER_RIGHT_POINT.Y := LOWER_RIGHT_POINT.Y - 1 ;
  18348.                LOWER_LEFT_POINT  := (X => UPPER_LEFT_POINT.X ,
  18349.                                      Y => LOWER_RIGHT_POINT.Y ) ;
  18350.                UPPER_RIGHT_POINT := (X => LOWER_RIGHT_POINT.X ,
  18351.                                      Y => UPPER_LEFT_POINT.Y ) ;
  18352.  
  18353.                if SCOPE_SEARCH( UPPER_LEFT_POINT ) /= TREE_PARENTS_PARENT or else 
  18354.                     SCOPE_SEARCH ( LOWER_RIGHT_POINT ) /= TREE_PARENT or else 
  18355.                     SCOPE_SEARCH ( LOWER_LEFT_POINT ) /= TREE_PARENTS_PARENT or else 
  18356.                     SCOPE_SEARCH ( UPPER_RIGHT_POINT ) /= TREE_PARENT then
  18357.                   -- the entity location and tree information
  18358.                   -- are inconsistent
  18359.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18360.                        ( " the export " &
  18361.                          TREE( TREE_PTR ).NAME(1..15) &
  18362.                          " will overlap another entity(improper scoping) " ,
  18363.                          VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18364.                          ROW_NO( 23 ) ) ;
  18365.                   return false ;
  18366.                end if ;
  18367.  
  18368.             when TYPE_ENTRY_POINT =>
  18369.                GRAPH_NODE := TREE( TREE_PTR ).GRAPH_DATA ;
  18370.                TREE_PARENT := TREE( TREE_PTR ).PARENT ;
  18371.  
  18372.                UPPER_LEFT_POINT  := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  18373.                UPPER_LEFT_POINT.Y := UPPER_LEFT_POINT.Y + 1 ;
  18374.                LOWER_RIGHT_POINT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  18375.                LOWER_RIGHT_POINT.Y := LOWER_RIGHT_POINT.Y - 1 ;
  18376.                UPPER_RIGHT_POINT := (X => LOWER_RIGHT_POINT.X ,
  18377.                                      Y => UPPER_LEFT_POINT.Y ) ;
  18378.  
  18379.                -- for entries just check the right side points
  18380.                if SCOPE_SEARCH( LOWER_RIGHT_POINT ) /= TREE_PARENT or else 
  18381.                     SCOPE_SEARCH ( UPPER_RIGHT_POINT ) /= TREE_PARENT then
  18382.                   -- the entity location and tree information
  18383.                   -- are inconsistent
  18384.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  18385.                        ( " the entry point " &
  18386.                          TREE( TREE_PTR ).NAME(1..15) &
  18387.                          " will overlap another entity(improper scoping) " ,
  18388.                          VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  18389.                          ROW_NO( 23 ) ) ;
  18390.                   return false ;
  18391.                end if ;
  18392.  
  18393.             when others =>
  18394.                -- call and visibility connects
  18395.                null ;
  18396.  
  18397.             end case ;
  18398.  
  18399.          end loop ;
  18400.  
  18401.          -- the tree is consistent, return true
  18402.          return true ;
  18403.  
  18404.       exception
  18405.          when others =>
  18406.             DISPLAY_ERROR (" PROGRAM ERROR -- in checking tree validity ") ;
  18407.             return false ;
  18408.       end CHECK_IF_ANNOTATED_TREE_VALID ;
  18409.  
  18410.  
  18411.    procedure MOVE_AND_RESIZE is
  18412.       -- This procedure prompts the user for information
  18413.       -- which will allow portions of the OODDs to be
  18414.       -- moved nad resized within their current scope.
  18415.  
  18416.       BASE_POINT        : GRAPHICS_DATA.POINT ;
  18417.       CHECK_POINT       : GRAPHICS_DATA.POINT ;
  18418.       GPTR              : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18419.       PARENT_TASK_GPTR  : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18420.       PARENT            : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18421.       OOS_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18422.       TEMP_LIST_PTR     : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  18423.       TEMP_LIST_HEAD_PTR : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  18424.       OLD_SCOPE_PARENT  : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18425.       OOS_MOVE          : BOOLEAN := false ;
  18426.       MOVE_OK           : BOOLEAN ;
  18427.       LABEL_ONLY        : BOOLEAN := false ;
  18428.       IMPORT_LABEL      : BOOLEAN := false ;
  18429.       NEW_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18430.       OLD_SIZE_POINT    : GRAPHICS_DATA.POINT ;
  18431.       TEMPORARY_POINT   : GRAPHICS_DATA.POINT ;
  18432.       REFERENCE_POINT   : GRAPHICS_DATA.POINT ;
  18433.       MOVE_REFERENCE_POINT     : GRAPHICS_DATA.POINT ;
  18434.       RESIZE_REFERENCE_POINT   : GRAPHICS_DATA.POINT ;
  18435.       MOVE_X_TRANSLATION       : FLOAT ;
  18436.       MOVE_Y_TRANSLATION       : FLOAT ;
  18437.       RESIZE_X_TRANSLATION     : FLOAT ;
  18438.       RESIZE_Y_TRANSLATION     : FLOAT ;
  18439.  
  18440.       -- establish lists for storing connection information
  18441.       -- within the move and resize
  18442.       subtype TEMP_LIST_NODE_ACCESS_TYPE is INTEGER ;
  18443.       type TEMP_LIST_NODE is 
  18444.          record
  18445.             ITEM : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  18446.             START_IN : BOOLEAN := false ;
  18447.          end record ;
  18448.       type TEMP_LIST is array (TEMP_LIST_NODE_ACCESS_TYPE range <>)
  18449.            of TEMP_LIST_NODE ;
  18450.       -- 30  is an maximum estimate for the number of possible
  18451.       -- non_local connections and entry_point connections
  18452.       NON_LOCAL_LIST    : TEMP_LIST (1..30) ;
  18453.       LOCAL_ENTRY_LIST  : TEMP_LIST (1..30) ;
  18454.  
  18455.       type TRANSLATION_TYPE is (MOVE, RESIZE) ;
  18456.  
  18457.       ERROR_STARTING_TREE_INVALID ,
  18458.       ERROR_TRANSLATE_NULL ,
  18459.       ERROR_TRANSLATE_ROOT ,
  18460.       HANDLE_BEFORE_HILIGHTING_ABORT ,
  18461.       HANDLE_BEFORE_TRANSLATING_ABORT ,
  18462.       HANDLE_RECOVERY ,
  18463.       MOVE_TRANSLATION_ERROR ,
  18464.       RESIZE_TRANSLATION_ERROR        : EXCEPTION ;
  18465.  
  18466.       function INVERSE 
  18467.                ( TRANSLATE_OPERATION : in TRANSLATION_TYPE ;
  18468.                  TRANSLATION_FACTOR : in FLOAT ) 
  18469.       return FLOAT is
  18470.          --  This function inverts the translation factor in
  18471.          --  the appropriate fashion depending on if this
  18472.          --  is being done for a Move or Resize.
  18473.       begin
  18474.          if TRANSLATE_OPERATION = RESIZE then
  18475.             return 1.0 / TRANSLATION_FACTOR ;
  18476.          else
  18477.             return - TRANSLATION_FACTOR ;
  18478.          end if ;
  18479.       end INVERSE ;
  18480.  
  18481.  
  18482.       procedure TRANSLATE_GRAPH_NODE 
  18483.                 ( TRANSLATE_OPERATION : in TRANSLATION_TYPE ;
  18484.                   GRAPH_PTR : in TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18485.                   X_TRANSLATION : in FLOAT ;
  18486.                   Y_TRANSLATION : in FLOAT ;
  18487.                   A_LINE_POINT : in BOOLEAN := false ) is
  18488.          -- This procedure translates the GKS point values found in
  18489.          -- the specified graph node.
  18490.          DELTA_X : INTEGER ;
  18491.          DELTA_Y : INTEGER ;
  18492.          ENTRY_DELTA_X : INTEGER ;
  18493.          ENTRY_DELTA_Y : INTEGER ;
  18494.          NODE_TYPE : TREE_DATA.ENTITY_TYPE ;
  18495.          ENTRY_PT_ENTITY : TREE_DATA.ENTRY_LIST_TYPE ;
  18496.          ENTRY_PT_NODE   : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18497.          ENTRY_PT_GPTR   : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18498.       begin
  18499.          if GRAPH_PTR /= NULL_POINTER then
  18500.             if TRANSLATE_OPERATION = RESIZE then
  18501.                -- save the old location point to use in computing the
  18502.                -- amount it has been moved (DELTA).
  18503.                DELTA_X := GRAPH( GRAPH_PTR ).DATA.LOCATION.X ;
  18504.                DELTA_Y := GRAPH( GRAPH_PTR ).DATA.LOCATION.Y ;
  18505.  
  18506.                -- if the point is a label then resize .location.x with 
  18507.                -- respect to the parent right side line by using offset
  18508.                -- constants, and then just move the .size
  18509.                -- point without resizing it
  18510.                NODE_TYPE := TREE( 
  18511.                             GRAPH( GRAPH_PTR ).OWNING_TREE_NODE ).NODE_TYPE ;
  18512.                -- an entry point is handled by the task which contains it
  18513.                if NODE_TYPE = TYPE_ENTRY_POINT then
  18514.                   null ;
  18515.                elsif (not A_LINE_POINT) and then 
  18516.                     ( NODE_TYPE in 
  18517.                       IMPORTED_VIRTUAL_PACKAGE .. EXPORTED_EXCEPTION ) then
  18518.                   -- translate the location point
  18519.                   GRAPH( GRAPH_PTR ).DATA.LOCATION.X := 
  18520.                        INTEGER ( FLOAT ( ( GRAPH( GRAPH_PTR ).DATA.LOCATION.X 
  18521.                             + IMPORT_EXPORT_X_OFFSET ) - BASE_POINT.X ) 
  18522.                                  * X_TRANSLATION ) + BASE_POINT.X -
  18523.                                       IMPORT_EXPORT_X_OFFSET ;
  18524.                   GRAPH( GRAPH_PTR ).DATA.LOCATION.Y := 
  18525.                        INTEGER ( FLOAT ( GRAPH( GRAPH_PTR ).DATA.LOCATION.Y 
  18526.                             - BASE_POINT.Y ) * Y_TRANSLATION ) + BASE_POINT.Y ;
  18527.  
  18528.                   -- compute the amount the location point was moved
  18529.                   DELTA_X := GRAPH( GRAPH_PTR ).DATA.LOCATION.X - DELTA_X ;
  18530.                   DELTA_Y := GRAPH( GRAPH_PTR ).DATA.LOCATION.Y - DELTA_Y ;
  18531.                   GRAPH( GRAPH_PTR ).DATA.SIZE.X := GRAPH( GRAPH_PTR ).DATA.SIZE.X 
  18532.                                                     + DELTA_X ;
  18533.                   GRAPH( GRAPH_PTR ).DATA.SIZE.Y := GRAPH( GRAPH_PTR ).DATA.SIZE.Y 
  18534.                                                     + DELTA_Y ;
  18535.                else
  18536.                   -- resizing something other than a label
  18537.                   -- translate the location point
  18538.                   GRAPH( GRAPH_PTR ).DATA.LOCATION.X := 
  18539.                        INTEGER ( FLOAT ( GRAPH( GRAPH_PTR ).DATA.LOCATION.X 
  18540.                             - BASE_POINT.X ) * X_TRANSLATION ) + BASE_POINT.X ;
  18541.                   GRAPH( GRAPH_PTR ).DATA.LOCATION.Y := 
  18542.                        INTEGER ( FLOAT ( GRAPH( GRAPH_PTR ).DATA.LOCATION.Y 
  18543.                             - BASE_POINT.Y ) * Y_TRANSLATION ) + BASE_POINT.Y ;
  18544.                   -- translate the size point if it is in use
  18545.                   if GRAPH( GRAPH_PTR ).DATA.SIZE /= NULL_POINT then
  18546.                      GRAPH( GRAPH_PTR ).DATA.SIZE.X := 
  18547.                           INTEGER ( FLOAT ( GRAPH( GRAPH_PTR ).DATA.SIZE.X - 
  18548.                               BASE_POINT.X ) * X_TRANSLATION ) + BASE_POINT.X ;
  18549.                      GRAPH( GRAPH_PTR ).DATA.SIZE.Y := 
  18550.                           INTEGER ( FLOAT ( GRAPH( GRAPH_PTR ).DATA.SIZE.Y - 
  18551.                               BASE_POINT.Y ) * Y_TRANSLATION ) + BASE_POINT.Y ;
  18552.                   end if ;
  18553.  
  18554.                   -- If current node is a task node then resize
  18555.                   -- the task entry points associated with the task
  18556.                   if NODE_TYPE = TYPE_TASK then
  18557.                      ENTRY_PT_ENTITY := TREE( GRAPH( 
  18558.                         GRAPH_PTR ).OWNING_TREE_NODE ).ENTRY_LIST ;
  18559.                      while ENTRY_PT_ENTITY /= TREE_DATA.NULL_POINTER
  18560.                      loop
  18561.  
  18562.                         ENTRY_PT_NODE := LIST( ENTRY_PT_ENTITY ).ITEM ;
  18563.                         ENTRY_PT_GPTR := TREE( ENTRY_PT_NODE ).GRAPH_DATA ;
  18564.  
  18565.                         ENTRY_DELTA_Y := GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.Y ;
  18566.                         -- set the location y
  18567.                         GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.Y := 
  18568.                              INTEGER ( 
  18569.                                  FLOAT ( 
  18570.                                       GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.Y 
  18571.                                       - BASE_POINT.Y ) 
  18572.                                       * Y_TRANSLATION ) 
  18573.                                       + BASE_POINT.Y ;
  18574.  
  18575.                         -- compute the amount the location point was moved
  18576.                         ENTRY_DELTA_Y := GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.Y - 
  18577.                                         ENTRY_DELTA_Y ;
  18578.                         -- set the size y
  18579.                         GRAPH( ENTRY_PT_GPTR ).DATA.SIZE.Y := 
  18580.                              GRAPH( ENTRY_PT_GPTR ).DATA.SIZE.Y + ENTRY_DELTA_Y ;
  18581.  
  18582.                         -- get the old location x
  18583.                         ENTRY_DELTA_X := GRAPH(ENTRY_PT_GPTR).DATA.LOCATION.X ;
  18584.  
  18585.                         -- set the new location x
  18586.                         GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.X :=
  18587.  
  18588.                               GRAPHIC_DRIVER.PARALLELOGRAM_POINTS (
  18589.                                    GRAPH( GRAPH_PTR ).DATA.LOCATION ,
  18590.                                    GRAPH( GRAPH_PTR ).DATA.SIZE ,
  18591.                                    GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.Y ) -
  18592.                                    IMPORT_EXPORT_X_OFFSET ;
  18593.  
  18594.                         -- compute the amount the location point was moved
  18595.                         ENTRY_DELTA_X := GRAPH( ENTRY_PT_GPTR ).DATA.LOCATION.X - 
  18596.                                         ENTRY_DELTA_X ;
  18597.                         -- set the size X
  18598.                         GRAPH( ENTRY_PT_GPTR ).DATA.SIZE.X := 
  18599.                              GRAPH( ENTRY_PT_GPTR ).DATA.SIZE.X + ENTRY_DELTA_X ;
  18600.  
  18601.                         ENTRY_PT_ENTITY := LIST( ENTRY_PT_ENTITY ).NEXT ;
  18602.                      end loop ;
  18603.                   end if ;
  18604.  
  18605.                end if ;
  18606.  
  18607.             else -- MOVE
  18608.                -- if the the point is a line and the translation
  18609.                --  results in a beyond limit move, CONSTRAINT_ERROR
  18610.                --  will be raised.  TRANSLATE_TREE will then set
  18611.                --  the point to the wc limit. This is temporary 
  18612.                --  since the line should be redrawn by the user anyway.
  18613.  
  18614.                -- translate the location point
  18615.                GRAPH( GRAPH_PTR ).DATA.LOCATION.X := 
  18616.                     GRAPH( GRAPH_PTR ).DATA.LOCATION.X - INTEGER( X_TRANSLATION ) ;
  18617.                GRAPH( GRAPH_PTR ).DATA.LOCATION.Y := 
  18618.                     GRAPH( GRAPH_PTR ).DATA.LOCATION.Y - INTEGER( Y_TRANSLATION ) ;
  18619.                -- translate the size point if it is in use
  18620.                if GRAPH( GRAPH_PTR ).DATA.SIZE /= NULL_POINT then
  18621.                   GRAPH( GRAPH_PTR ).DATA.SIZE.X := 
  18622.                        GRAPH( GRAPH_PTR ).DATA.SIZE.X - INTEGER( X_TRANSLATION ) ;
  18623.                   GRAPH( GRAPH_PTR ).DATA.SIZE.Y := 
  18624.                        GRAPH( GRAPH_PTR ).DATA.SIZE.Y - INTEGER( Y_TRANSLATION ) ;
  18625.                end if ;
  18626.  
  18627.             end if ; --TRANSLATION_TYPE
  18628.          end if ;
  18629.       end TRANSLATE_GRAPH_NODE ;
  18630.  
  18631.  
  18632.       procedure TRANSLATE_TREE 
  18633.                 ( TRANSLATE_OPERATION : in TRANSLATION_TYPE ;
  18634.                   PARENT        : in TREE_NODE_ACCESS_TYPE ;
  18635.                   X_TRANSLATION : in FLOAT ;
  18636.                   Y_TRANSLATION : in FLOAT ) is
  18637.          -- Translate the subtree defined by the specified parent
  18638.          -- using the X and Y translation values given.
  18639.          GRAPH_NODE : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  18640.          TRANSLATION_NODE  : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18641.          WALK_STATE : TREE_OPS.WALK_STATE_TYPE ;
  18642.          SAVED_POINT : GRAPHICS_DATA.POINT ;
  18643.                            
  18644.       begin
  18645.          START_TREE_WALK ( PARENT, WALK_STATE ) ;
  18646.          loop
  18647.             -- walk the tree until all nodes have been processed
  18648.             TREE_OPS.TREE_WALK ( WALK_STATE, TRANSLATION_NODE ) ;
  18649.             exit when TRANSLATION_NODE = NULL_POINTER ;
  18650.  
  18651.             -- translate the basic points of the associate graph node
  18652.             TRANSLATE_GRAPH_NODE ( TRANSLATE_OPERATION ,
  18653.                                    TREE( TRANSLATION_NODE ).GRAPH_DATA ,
  18654.                                    X_TRANSLATION ,
  18655.                                    Y_TRANSLATION ) ;
  18656.  
  18657.             -- if a connection exists, then translate the connection points
  18658.             if TREE( TRANSLATION_NODE ).NODE_TYPE in 
  18659.                    EXPORTED_PROCEDURE .. CONNECTION_FOR_DATA then
  18660.                for I in 1 .. MAXIMUM_NO_LINE_SEGMENTS loop
  18661.                   begin
  18662.                      GRAPH_NODE := TREE( TRANSLATION_NODE ).LINE(I) ;
  18663.                      if GRAPH_NODE = NULL_POINTER then
  18664.                         exit ;  
  18665.                      else
  18666.                         --[what if doing inverse, and point is null]
  18667.  
  18668.                         SAVED_POINT := GRAPH( GRAPH_NODE ).DATA.LOCATION ;
  18669.                         TRANSLATE_GRAPH_NODE ( TRANSLATE_OPERATION ,
  18670.                                                GRAPH_NODE ,
  18671.                                                X_TRANSLATION ,
  18672.                                                Y_TRANSLATION ,
  18673.                                                true ) ;
  18674.                      end if ;
  18675.  
  18676.                   exception
  18677.                      -- handle possible moved points outside world coordinates 
  18678.                      -- since the line must be redrawn by the user, recover
  18679.                      -- by storing the saved LOCATION into the SIZE point
  18680.                      -- and flagging the LOCATION with the null point
  18681.                      when CONSTRAINT_ERROR =>
  18682.                         GRAPH( GRAPH_NODE ).DATA.SIZE := SAVED_POINT ;
  18683.                         GRAPH( GRAPH_NODE ).DATA.LOCATION := NULL_POINT ;
  18684.                      when others =>
  18685.                         -- propogate unknown error
  18686.                         raise ;
  18687.                   end ;
  18688.                end loop ;
  18689.  
  18690.                -- when resizing export labels with lines, just reset the
  18691.                --  first line point to the size point of the export
  18692.                if TRANSLATE_OPERATION = RESIZE and then 
  18693.                     TREE( TRANSLATION_NODE ).NODE_TYPE in 
  18694.                          EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION and then
  18695.                            TREE( TRANSLATION_NODE ).LINE(1) /= NULL_POINTER then
  18696.                   GRAPH( TREE( TRANSLATION_NODE ).LINE(1) ).DATA.LOCATION :=
  18697.                        GRAPH( TREE( TRANSLATION_NODE ).GRAPH_DATA ).DATA.SIZE ;
  18698.                end if ;
  18699.             end if ;
  18700.          end loop ;
  18701.       end TRANSLATE_TREE ;
  18702.  
  18703.  
  18704.       function IN_THIS_SUBTREE 
  18705.                ( SUBTREE, 
  18706.                  NODE_IN_QUESTION : TREE_DATA.TREE_NODE_ACCESS_TYPE ) 
  18707.       return BOOLEAN is
  18708.          -- This function returns true if the NODE_IN_QUESTION is in the
  18709.          -- subtree defined by the parent node SUBTREE.
  18710.          PTR : TREE_DATA.TREE_NODE_ACCESS_TYPE := NODE_IN_QUESTION ;
  18711.  
  18712.       begin
  18713.          while PTR /= NULL_POINTER loop
  18714.             if PTR = SUBTREE then
  18715.                return true ;
  18716.             else
  18717.                PTR := TREE( PTR ).PARENT ;
  18718.             end if ;
  18719.          end loop ;
  18720.          return false ;
  18721.       end IN_THIS_SUBTREE ;
  18722.  
  18723.       procedure RESTORE_ERASED_CONNECTIONS_TO 
  18724.                 ( NODE_PTR : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  18725.          -- This procedure will restore any connections to
  18726.          -- the current node which were erased by the call
  18727.          -- to PERFORM_GRAPH_TREE_OP.
  18728.          PTR         : TREE_DATA.TREE_NODE_ACCESS_TYPE := NODE_PTR ;
  18729.          REFERING_NODE : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18730.          MEMBER_PTR  : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  18731.          NODE_TYPE   : TREE_DATA.ENTITY_TYPE := UNUSED ;
  18732.  
  18733.       begin
  18734.          -- check for a valid NODE_PTR and get the node type
  18735.          if PTR /= NULL_POINTER then
  18736.             NODE_TYPE := TREE( PTR ).NODE_TYPE ;
  18737.          end if ;
  18738.          -- process each node with a possible erase connection
  18739.          if NODE_TYPE in EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION then
  18740.             -- check the membership list for connections to the node
  18741.             MEMBER_PTR := TREE( PTR ).MEMBERSHIP ;
  18742.             while MEMBER_PTR /= NULL_POINTER loop
  18743.                -- ignore the parent back pointer - anything else
  18744.                -- is an erased connection
  18745.                REFERING_NODE := LIST( MEMBER_PTR ).ITEM ;
  18746.                if REFERING_NODE /= TREE( PTR ).PARENT then
  18747.                   case NODE_TYPE is
  18748.                      when EXPORTED_ENTRY_POINT =>
  18749.                         -- check for continuing back references
  18750.                         RESTORE_ERASED_CONNECTIONS_TO 
  18751.                              ( REFERING_NODE ) ;
  18752.                      when others =>
  18753.                         null ;
  18754.                   end case ;
  18755.                   -- restore the erased connection by redrawing it
  18756.                   DRAW_GRAPH_TREE ( REFERING_NODE, TRUE ) ;
  18757.                end if ;
  18758.                MEMBER_PTR := LIST( MEMBER_PTR ).NEXT ;
  18759.             end loop ;
  18760.          end if ;
  18761.       exception
  18762.          when others =>
  18763.             -- handle error conditions that might occur
  18764.             -- recover tree if possible
  18765.             DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE restore lines operations ") ;
  18766.             raise HANDLE_RECOVERY ;
  18767.  
  18768.       end RESTORE_ERASED_CONNECTIONS_TO ;
  18769.  
  18770.  
  18771.       procedure FIND_NON_LOCAL_CONNECTIONS 
  18772.                 ( TRANSLATION_OPERATION : in TRANSLATION_TYPE ;
  18773.                   SUBTREE_PARENT : in TREE_NODE_ACCESS_TYPE ) is
  18774.          -- Initial determination of non-local connections.  
  18775.          -- Non-local connections are those connections which span
  18776.          -- the boundary between the subtree and the remainder of
  18777.          -- the tree.
  18778.  
  18779.          END_IN_SUBTREE    : BOOLEAN ;
  18780.          START_IN_SUBTREE  : BOOLEAN ;
  18781.          TREE_PTR          : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18782.          CONNECTEE_NODE    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18783.          WALK_STATE        : TREE_OPS.WALK_STATE_TYPE ;
  18784.  
  18785.          ENTRY_COUNT       : TEMP_LIST_NODE_ACCESS_TYPE := 0;
  18786.          NON_LOCAL_COUNT   : TEMP_LIST_NODE_ACCESS_TYPE := 0;
  18787.  
  18788.       begin
  18789.  
  18790.          -- Process all the connections in the tree by walking the
  18791.          -- entire tree.
  18792.          START_TREE_WALK ( ROOT_NODE, WALK_STATE ) ;
  18793.          loop
  18794.             TREE_WALK ( WALK_STATE, TREE_PTR ) ;
  18795.             exit when TREE_PTR = NULL_POINTER ;
  18796.             -- Check if the current node type contains a connection
  18797.             -- which is in use.
  18798.             if TREE( TREE_PTR ).NODE_TYPE in EXPORTED_PROCEDURE ..
  18799.                   CONNECTION_FOR_DATA and then
  18800.                   TREE( TREE_PTR ).CONNECTEE /= NULL_POINTER then
  18801.                CONNECTEE_NODE := TREE( TREE_PTR ).CONNECTEE ;
  18802.                -- Determine if the connection starts and/or ends within
  18803.                -- the specified subtree.
  18804.                START_IN_SUBTREE := 
  18805.                 IN_THIS_SUBTREE ( SUBTREE_PARENT, TREE_PTR ) ;
  18806.                END_IN_SUBTREE := 
  18807.                 IN_THIS_SUBTREE ( SUBTREE_PARENT, CONNECTEE_NODE ) ;
  18808.  
  18809.                if START_IN_SUBTREE xor END_IN_SUBTREE then
  18810.                   -- set up temporary list of tree nodes
  18811.                   NON_LOCAL_COUNT := NON_LOCAL_COUNT + 1 ;
  18812.                   NON_LOCAL_LIST(NON_LOCAL_COUNT).ITEM := TREE_PTR ;
  18813.                   NON_LOCAL_LIST(NON_LOCAL_COUNT).START_IN := START_IN_SUBTREE ;
  18814.                else -- not a non local connection, handle task entry special
  18815.                   if TREE( CONNECTEE_NODE ).NODE_TYPE =
  18816.                         TYPE_ENTRY_POINT then
  18817.                      -- add to list for special last line point position
  18818.                      -- due to the parallelogram shape of the task
  18819.                      -- set up temporary list of tree nodes
  18820.                      ENTRY_COUNT := ENTRY_COUNT + 1 ;
  18821.                      LOCAL_ENTRY_LIST(ENTRY_COUNT).ITEM := TREE_PTR ;
  18822.                   end if ; 
  18823.                end if ; 
  18824.             end if ;
  18825.          end loop ;
  18826.       exception
  18827.          when others =>
  18828.             -- handle error conditions that might occur
  18829.             -- recover tree if possible
  18830.             DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE find lines operations ") ;
  18831.             raise HANDLE_RECOVERY ;
  18832.  
  18833.       end FIND_NON_LOCAL_CONNECTIONS ;
  18834.  
  18835.       procedure TRANSLATE_NON_LOCAL_CONNECTIONS 
  18836.                 ( TRANSLATION_OPERATION : in TRANSLATION_TYPE ;
  18837.                   SUBTREE_PARENT : in TREE_NODE_ACCESS_TYPE ) is
  18838.          -- Intermediate processing of non-local connections.  The
  18839.          -- connections are not redrawn, the appropriate points are
  18840.          -- just translated.
  18841.          -- Non-local connections are those connections which span
  18842.          -- the boundary between the subtree and the remainder of
  18843.          -- the tree.
  18844.  
  18845.          END_IN_SUBTREE    : BOOLEAN ;
  18846.          START_IN_SUBTREE  : BOOLEAN ;
  18847.          LAST              : INTEGER ;
  18848.          TREE_PTR          : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18849.          CONNECTEE_NODE    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18850.          WALK_STATE        : TREE_OPS.WALK_STATE_TYPE ;
  18851.          X_TRANSLATION     : FLOAT ;
  18852.          Y_TRANSLATION     : FLOAT ;
  18853.  
  18854.       begin
  18855.          if TRANSLATION_OPERATION = MOVE then
  18856.             X_TRANSLATION := MOVE_X_TRANSLATION ;
  18857.             Y_TRANSLATION := MOVE_Y_TRANSLATION ;
  18858.          else -- RESIZE
  18859.             X_TRANSLATION := RESIZE_X_TRANSLATION ;
  18860.             Y_TRANSLATION := RESIZE_Y_TRANSLATION ;
  18861.          end if ;
  18862.  
  18863.          -- Process all the non local connections using the predetermined lists
  18864.          for J in NON_LOCAL_LIST'range loop
  18865.             TREE_PTR := NON_LOCAL_LIST(J).ITEM ;
  18866.             exit when TREE_PTR = NULL_POINTER ;
  18867.  
  18868.             CONNECTEE_NODE := TREE( TREE_PTR ).CONNECTEE ;
  18869.  
  18870.             -- Find the last point in the connection.
  18871.             for I in 2 .. MAXIMUM_NO_LINE_SEGMENTS loop
  18872.                if TREE( TREE_PTR ).LINE(I) = NULL_POINTER then
  18873.                   exit ;
  18874.                else
  18875.                   LAST := I ;
  18876.                end if ;
  18877.             end loop ;
  18878.  
  18879.             -- If the connection ends in the moved subtree, then
  18880.             -- translate the end point to the correct new location.
  18881.             -- If connecting to a task entry, just set to .loc.
  18882.             if not NON_LOCAL_LIST(J).START_IN then
  18883.                if TREE( CONNECTEE_NODE ).NODE_TYPE =
  18884.                      TYPE_ENTRY_POINT then
  18885.                   GRAPH( TREE( TREE_PTR ).LINE(LAST) ).DATA.LOCATION :=
  18886.                        GRAPH(TREE(CONNECTEE_NODE).GRAPH_DATA).DATA.LOCATION ;
  18887.                else
  18888.                   TRANSLATE_GRAPH_NODE ( TRANSLATION_OPERATION ,
  18889.                                          TREE( TREE_PTR ).LINE(LAST) ,
  18890.                                          X_TRANSLATION ,
  18891.                                          Y_TRANSLATION ,
  18892.                                          true ) ;
  18893.                end if ;
  18894.             else
  18895.                for I in 2 .. LAST loop
  18896.                   -- The connection starts in the subtree, and
  18897.                   -- the points have been translated.  Thus it
  18898.                   -- requires un-translation.
  18899.                   if GRAPH( TREE( TREE_PTR ).LINE(I) ).DATA.LOCATION
  18900.                        = NULL_POINT then
  18901.                      -- occurs if the original translation would have
  18902.                      -- forced the point outside world coordinates
  18903.                      -- recover by assigning the previous location 
  18904.                      -- from the size point
  18905.                      GRAPH( TREE( TREE_PTR ).LINE(I) ).DATA.LOCATION := 
  18906.                           GRAPH( TREE( TREE_PTR ).LINE(I) ).DATA.SIZE ;
  18907.                   else
  18908.                      TRANSLATE_GRAPH_NODE( 
  18909.                           TRANSLATION_OPERATION ,
  18910.                           TREE(TREE_PTR).LINE(I) ,
  18911.                           INVERSE(TRANSLATION_OPERATION, X_TRANSLATION ) ,
  18912.                           INVERSE(TRANSLATION_OPERATION, Y_TRANSLATION ) ,
  18913.                           true ) ;
  18914.                   end if ;
  18915.                end loop ;
  18916.             end if ;
  18917.          end loop ;
  18918.  
  18919.          -- Process all the entry connections using the predetermined lists
  18920.          for J in LOCAL_ENTRY_LIST'range loop
  18921.             TREE_PTR := LOCAL_ENTRY_LIST(J).ITEM ;
  18922.             exit when TREE_PTR = NULL_POINTER ;
  18923.  
  18924.             CONNECTEE_NODE := TREE( TREE_PTR ).CONNECTEE ;
  18925.  
  18926.             -- not a non local connection, handle task entry special
  18927.             -- Find the last point in the connection.
  18928.             for I in 2 .. MAXIMUM_NO_LINE_SEGMENTS loop
  18929.                if TREE( TREE_PTR ).LINE(I) = NULL_POINTER then
  18930.                   exit ;
  18931.                else
  18932.                   LAST := I ;
  18933.                end if ;
  18934.             end loop ;
  18935.             GRAPH( TREE( TREE_PTR ).LINE(LAST) ).DATA.LOCATION :=
  18936.                  GRAPH(TREE(CONNECTEE_NODE).GRAPH_DATA).DATA.LOCATION ;
  18937.          end loop ;
  18938.       exception
  18939.          when others =>
  18940.             -- handle error conditions that might occur
  18941.             -- recover tree if possible
  18942.             DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE translate lines operations ") ;
  18943.             raise HANDLE_RECOVERY ;
  18944.  
  18945.       end TRANSLATE_NON_LOCAL_CONNECTIONS ;
  18946.  
  18947.  
  18948.       procedure VERIFY_NON_LOCAL_CONNECTIONS 
  18949.                 ( SUBTREE_PARENT : in TREE_NODE_ACCESS_TYPE ) is
  18950.          -- ONLY CALLED AFTER AN OUT-OF-SCOPE MOVE
  18951.          -- Validation of non-local connections.  The connections
  18952.          -- are not redrawn, just checked for valid scoping
  18953.          -- Non-local connections are those connections which span
  18954.          -- the boundary between the subtree and the remainder of
  18955.          -- the tree.
  18956.  
  18957.          TREE_PTR          : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18958.          CONNECTEE_NODE    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18959.          CONNECTEE_NODE_PARENT    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  18960.          WALK_STATE        : TREE_OPS.WALK_STATE_TYPE ;
  18961.  
  18962.          TRACE_PARENT      : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  18963.          L_C_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  18964.  
  18965.       begin
  18966.          -- Process all the non local connections using the predetermined lists
  18967.          for J in NON_LOCAL_LIST'range loop
  18968.             TREE_PTR := NON_LOCAL_LIST(J).ITEM ;
  18969.             exit when TREE_PTR = NULL_POINTER ;
  18970.  
  18971.             CONNECTEE_NODE := TREE( TREE_PTR ).CONNECTEE ;
  18972.  
  18973.             case TREE( TREE_PTR ).NODE_TYPE is
  18974.                -- if an export, then must be invalid on oos move
  18975.                when EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION =>
  18976.                   DISPLAY_ERROR (" the move will invalidate the exports connection ") ;
  18977.                   raise HANDLE_RECOVERY ;
  18978.  
  18979.                when CONNECTION_BY_CALL =>
  18980.                   L_C_PARENT := LOWEST_COMMON_PARENT (TREE_PTR, 
  18981.                                                       CONNECTEE_NODE ) ;
  18982.                   CONNECTEE_NODE_PARENT := TREE(CONNECTEE_NODE).PARENT ;
  18983.                   case TREE( CONNECTEE_NODE ).NODE_TYPE is
  18984.                      when TYPE_PROCEDURE | TYPE_FUNCTION =>
  18985.                         -- l_c_parent is up one scope
  18986.                         if (L_C_PARENT /= CONNECTEE_NODE_PARENT) then
  18987.                            DISPLAY_ERROR (" the move will invalidate the subprogram call connection ") ;
  18988.                            raise HANDLE_RECOVERY ;
  18989.                         end if ;
  18990.  
  18991.                      when TYPE_ENTRY_POINT | EXPORTED_ENTRY_POINT |
  18992.                           EXPORTED_PROCEDURE | EXPORTED_FUNCTION =>
  18993.                         -- l_c_parent is up two scopes
  18994.                         if (L_C_PARENT /= TREE(CONNECTEE_NODE_PARENT).PARENT) then
  18995.                                  
  18996.                            DISPLAY_ERROR (" the move will " & 
  18997.                                 "invalidate the entry point or export call connection ") ;
  18998.                            raise HANDLE_RECOVERY ;
  18999.                         end if ;
  19000.  
  19001.                      when IMPORTED_PROCEDURE | IMPORTED_FUNCTION =>
  19002.                         -- must be package with the import
  19003.                         if (L_C_PARENT /= CONNECTEE_NODE_PARENT) then
  19004.                            DISPLAY_ERROR (" the move will invalidate the import call connection ") ;
  19005.                            raise HANDLE_RECOVERY ;
  19006.                         end if ;
  19007.  
  19008.                      when others =>
  19009.                         -- invalid parent for call
  19010.                         DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE verify lines operations " ) ;
  19011.                         raise HANDLE_RECOVERY ;
  19012.  
  19013.                   end case ; -- callee type
  19014.  
  19015.                when CONNECTION_FOR_DATA =>
  19016.                   L_C_PARENT := LOWEST_COMMON_PARENT (TREE_PTR, 
  19017.                                                       CONNECTEE_NODE ) ;
  19018.                   case TREE( CONNECTEE_NODE ).NODE_TYPE is
  19019.                      when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  19020.                         TRACE_PARENT := TREE_PTR ;
  19021.                         while TRACE_PARENT /= ROOT_NODE and 
  19022.                              TRACE_PARENT /= NULL_POINTER loop
  19023.                            if TRACE_PARENT = CONNECTEE_NODE then
  19024.                               DISPLAY_ERROR (" the move will " & 
  19025.                                    "invalidate the visibility connection (not needed) ") ;
  19026.                               raise HANDLE_RECOVERY ;
  19027.                            end if ;
  19028.                            TRACE_PARENT := TREE(TRACE_PARENT).PARENT ;
  19029.                         end loop ;
  19030.                         TRACE_PARENT := TREE(CONNECTEE_NODE).PARENT ;
  19031.                         while TRACE_PARENT /= ROOT_NODE and 
  19032.                              TRACE_PARENT /= NULL_POINTER loop
  19033.                            if TRACE_PARENT = TREE(TREE_PTR).PARENT then
  19034.                               DISPLAY_ERROR (" the move will " & 
  19035.                                    "invalidate the visibility connection (not needed) ") ;
  19036.                               raise HANDLE_RECOVERY ;
  19037.                            end if ;
  19038.                            TRACE_PARENT := TREE(TRACE_PARENT).PARENT ;
  19039.                         end loop ;
  19040.                         if L_C_PARENT /= TREE( CONNECTEE_NODE ).PARENT then
  19041.                            DISPLAY_ERROR (" the move will " & 
  19042.                                    "invalidate the visibility connection ") ;
  19043.                            raise HANDLE_RECOVERY ;
  19044.                         end if ;
  19045.  
  19046.                      when IMPORTED_VIRTUAL_PACKAGE | IMPORTED_PACKAGE =>
  19047.                         if L_C_PARENT /= TREE( CONNECTEE_NODE ).PARENT then
  19048.                            DISPLAY_ERROR (" the move will invalidate the visibility connection ") ;
  19049.                            raise HANDLE_RECOVERY ;
  19050.                         end if ;
  19051.  
  19052.                      when others =>
  19053.                         -- invalid parent for visibility connect
  19054.                         DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE verify lines operations " ) ;
  19055.                         raise HANDLE_RECOVERY ;
  19056.  
  19057.                   end case ; -- visibility connectee type
  19058.  
  19059.                when others =>
  19060.                   -- invalid parent for visibility connect
  19061.                   DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE verify lines operations " ) ;
  19062.                   raise HANDLE_RECOVERY ;
  19063.  
  19064.             end case ; -- origin of connection type
  19065.          end loop ;
  19066.  
  19067.       end VERIFY_NON_LOCAL_CONNECTIONS ;
  19068.  
  19069.       procedure REDRAW_NON_LOCAL_CONNECTIONS 
  19070.                 ( SUBTREE_PARENT : in TREE_NODE_ACCESS_TYPE ) is
  19071.          -- Prompt the user to redraw all connections which span
  19072.          -- the boundary between the subtree and the remainder of
  19073.          -- the tree.
  19074.  
  19075.          END_POINT         : GRAPHICS_DATA.POINT ;    
  19076.          START_POINT       : GRAPHICS_DATA.POINT ;    
  19077.          LAST              : INTEGER ;
  19078.          NEW_CONNECTION    : TREE_DATA.LINE_TYPE ;
  19079.          TREE_PTR          : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  19080.          WALK_STATE        : TREE_OPS.WALK_STATE_TYPE ;
  19081.          STATUS            : COMMAND_TYPE ;
  19082.  
  19083.       begin
  19084.          -- Process all the non local connections using the predetermined lists
  19085.          for J in NON_LOCAL_LIST'range loop
  19086.             TREE_PTR := NON_LOCAL_LIST(J).ITEM ;
  19087.             exit when TREE_PTR = NULL_POINTER ;
  19088.  
  19089.             START_POINT := GRAPH( TREE( TREE_PTR ).LINE(1) ).DATA.LOCATION ;
  19090.             -- Find the last point in the connection.
  19091.             for I in 2 .. MAXIMUM_NO_LINE_SEGMENTS loop
  19092.                if TREE( TREE_PTR ).LINE(I) = NULL_POINTER then
  19093.                   exit ;
  19094.                else
  19095.                   LAST := I ;
  19096.                end if ;
  19097.             end loop ;
  19098.             END_POINT := GRAPH( TREE( TREE_PTR ).LINE(LAST) ).DATA.LOCATION ;
  19099.  
  19100.             -- for end in subtree case,
  19101.             -- since just the line was deleted after moving and resizing,
  19102.             -- if it was a line off of a label delete the label, then for
  19103.             -- all lines redraw the line for user to keep or cancel
  19104.             if not NON_LOCAL_LIST(J).START_IN then
  19105.                if TREE( TREE_PTR ).NODE_TYPE in EXPORTED_PROCEDURE ..
  19106.                      EXPORTED_EXCEPTION then
  19107.                   if TREE(TREE_PTR).NODE_TYPE /= EXPORTED_ENTRY_POINT then
  19108.                      PERFORM_SEGMENT_OP( 
  19109.                           GRAPH (TREE (TREE_PTR).GRAPH_DATA ).
  19110.                                DATA.LABEL_SEG_ID ,
  19111.                           DELETED ) ;
  19112.                   else -- an exported_entry_point
  19113.                      -- restore any chained exported entry points
  19114.                      RESTORE_ERASED_CONNECTIONS_TO (TREE_PTR) ;
  19115.                   end if ;   
  19116.                end if ;   
  19117.                DRAW_GRAPH_TREE( TREE_PTR, true ) ;
  19118.             end if ;
  19119.  
  19120.             -- highlight the new connection 
  19121.             PERFORM_LINE_OP ( TREE_PTR, HILITED ) ;
  19122.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  19123.                  ( " CANCEL to delete and redesign line, CONFIRM to maintain hilighted line " ,
  19124.                    VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  19125.                    ROW_NO( 23 ) ) ;
  19126.             -- set menu window active
  19127.             GRAPHIC_DRIVER.SELECT_WINDOW
  19128.                  (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19129.             -- request user confirm of deletion
  19130.             STATUS := CONTROL_DELETE_MENU ;
  19131.             -- clear the alpha screen
  19132.             VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19133.                  ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19134.             -- set graphics window active
  19135.             GRAPHIC_DRIVER.SELECT_WINDOW
  19136.                  (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  19137.             -- process the results of the confirmation
  19138.             if STATUS = CANCEL_CMD then
  19139.                -- Erase the old connection and redraw the label.
  19140.                PERFORM_GRAPH_TREE_OP ( TREE_PTR, RESTORED ) ;
  19141.                PERFORM_LINE_OP ( TREE_PTR, DELETED ) ;
  19142.                for I in 1 .. LAST loop
  19143.                   -- release each graph node and remove reference to it.
  19144.                   TREE_OPS.RELEASE_GRAPH_NODE ( TREE( TREE_PTR ).LINE(I) ) ;
  19145.                   TREE( TREE_PTR ).LINE(I) := NULL_POINTER ;
  19146.                end loop ;
  19147.  
  19148.                -- Create the connection start and end point markers
  19149.                REFERENCE_MARKER ( GKS_SPECIFICATION.VISIBLE ,
  19150.                                   START_POINT ) ;
  19151.                REFERENCE_MARKER ( GKS_SPECIFICATION.VISIBLE ,
  19152.                                   END_POINT ) ;
  19153.  
  19154.                -- Obtain the new connection.
  19155.                NEW_CONNECTION := NULL_LINE ;
  19156.                REQUEST_CONNECTION ( TREE_PTR ,
  19157.                                     START_POINT ,
  19158.                                     END_POINT ,
  19159.                                     NEW_CONNECTION ) ;
  19160.  
  19161.                -- Delete the connection start and end point markers.
  19162.                REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19163.                                   START_POINT ) ;
  19164.                REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19165.                                   END_POINT ) ;
  19166.  
  19167.                -- Replace the old connection, and update the tree
  19168.                -- with the new connection.
  19169.                TREE( TREE_PTR ).LINE := NEW_CONNECTION ;
  19170.                -- place the line marking symbol if necessary
  19171.                LABEL_CALL_MARKING (TREE_PTR) ;
  19172.             else -- they want to keep the translated line
  19173.                -- unhilight
  19174.                PERFORM_LINE_OP ( TREE_PTR, RESTORED ) ;
  19175.                -- clear the alpha screen
  19176.                VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19177.                     ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19178.             end if ;
  19179.          end loop ;
  19180.       exception
  19181.          when OPERATION_ABORTED_BY_OPERATOR =>
  19182.             -- abort during connection, delete the connection start 
  19183.             -- and end point markers
  19184.             REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19185.                                START_POINT ) ;
  19186.             REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19187.                                END_POINT ) ;
  19188.             raise HANDLE_RECOVERY ;
  19189.  
  19190.          when others =>
  19191.             -- handle error conditions that might occur
  19192.             -- recover tree if possible
  19193.             DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE redraw lines operations ") ;
  19194.             raise HANDLE_RECOVERY ;
  19195.  
  19196.       end REDRAW_NON_LOCAL_CONNECTIONS ;
  19197.  
  19198.    -- MOVE_AND_RESIZE
  19199.    begin
  19200.       if not CHECK_IF_ANNOTATED_TREE_VALID then
  19201.          DISPLAY_ERROR (" overlapping of entities prevents this scope from being translated") ;
  19202.          raise ERROR_STARTING_TREE_INVALID ;
  19203.       end if;
  19204.  
  19205.       -- save the tree
  19206.       UTIL_FOR_TREE.ARCHIVE_THE_TREE ;
  19207.  
  19208.       -- set graphics window active
  19209.       GRAPHIC_DRIVER.SELECT_WINDOW
  19210.            (GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  19211.  
  19212.       SCOPE_SELECTION_LOOP:
  19213.       loop
  19214.          begin
  19215.  
  19216.             -- set up for aborting
  19217.             SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  19218.  
  19219.             -- request the user identify the scope to be translated
  19220.             REQUEST_POINT (" select point identifying scope to be translated",
  19221.                            REFERENCE_POINT ,
  19222.                            PARENT ) ;
  19223.             -- set up for aborting
  19224.             SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19225.  
  19226.             if TREE( PARENT ).NODE_TYPE = TYPE_ENTRY_POINT or else 
  19227.                  TREE( PARENT ).NODE_TYPE in 
  19228.                  IMPORTED_VIRTUAL_PACKAGE .. EXPORTED_EXCEPTION then
  19229.                LABEL_ONLY := true ;
  19230.                if TREE( PARENT ).NODE_TYPE in 
  19231.                  IMPORTED_VIRTUAL_PACKAGE .. IMPORTED_FUNCTION then
  19232.                  IMPORT_LABEL := true ;
  19233.                end if ;
  19234.             end if ;
  19235.             -- get the graph pointer
  19236.             GPTR := TREE( PARENT ).GRAPH_DATA ;
  19237.  
  19238.             -- check for a valid parent
  19239.             if PARENT = ROOT_NODE then
  19240.                DISPLAY_ERROR (" invalid, the outer scope cannot be moved ") ;
  19241.                raise ERROR_TRANSLATE_ROOT ;
  19242.  
  19243.             elsif PARENT = NULL_POINTER then
  19244.                DISPLAY_ERROR (" PROGRAM ERROR -- request point returned null parent ") ;
  19245.                raise ERROR_TRANSLATE_NULL ;
  19246.  
  19247.             else 
  19248.  
  19249.                -- predetermine the non local connections and entry connections
  19250.                FIND_NON_LOCAL_CONNECTIONS( MOVE, PARENT ) ;
  19251.                
  19252.                exit SCOPE_SELECTION_LOOP ;
  19253.             end if ;
  19254.  
  19255.          exception
  19256.             when ERROR_TRANSLATE_ROOT =>
  19257.                -- User already notified of the error.
  19258.                null ;
  19259.  
  19260.             when OPERATION_ABORTED_BY_OPERATOR | ERROR_TRANSLATE_NULL =>
  19261.                -- the operator wants to abort
  19262.                raise HANDLE_BEFORE_HILIGHTING_ABORT ;
  19263.  
  19264.             when others =>
  19265.                -- handle error conditions that might occur
  19266.                -- recover tree if possible
  19267.                DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE scoping operations ") ;
  19268.                raise HANDLE_RECOVERY ;
  19269.          end ;
  19270.       end loop SCOPE_SELECTION_LOOP ;
  19271.  
  19272.       -- assure that the entire subtree is within the view window
  19273.       VIEW_WINDOW_CHECK( PARENT ) ;
  19274.       -- set graphics window active
  19275.       GRAPHIC_DRIVER.SELECT_WINDOW
  19276.            ( GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  19277.       -- highlight what is to be moved
  19278.       PERFORM_GRAPH_TREE_OP ( PARENT, HILITED ) ;
  19279.  
  19280.       MOVE_LOOP:
  19281.       loop
  19282.          begin
  19283.             -- MOVE
  19284.             -- request new location point for parent 
  19285.             -- set up for aborting
  19286.             SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  19287.             if LABEL_ONLY then
  19288.                -- place cursor at .location for imports,
  19289.                -- location.x, .size.y for exports
  19290.                if IMPORT_LABEL then
  19291.                   MOVE_REFERENCE_POINT := GRAPH( GPTR ).DATA.LOCATION ;
  19292.                else
  19293.                   MOVE_REFERENCE_POINT := (X => GRAPH( GPTR ).DATA.SIZE.X ,
  19294.                                            Y => GRAPH( GPTR ).DATA.LOCATION.Y );
  19295.                end if ;
  19296.                REQUEST_POINT (" select new location for annotation, within scope",
  19297.                               MOVE_REFERENCE_POINT ,
  19298.                               NEW_PARENT ,
  19299.                               true ) ;
  19300.  
  19301.             else
  19302.                -- place cursor at .location
  19303.                MOVE_REFERENCE_POINT := GRAPH( GPTR ).DATA.LOCATION ;
  19304.                REQUEST_POINT (" select new location ( upper left ) point ",
  19305.                               MOVE_REFERENCE_POINT ,
  19306.                               NEW_PARENT ,
  19307.                               true ) ;
  19308.  
  19309.             end if ;
  19310.             -- set up for aborting
  19311.             SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19312.  
  19313.             -- Determine if new location is valid.  Do this by checking
  19314.             -- to see if NEW_PARENT is the parent of the subtree to
  19315.             -- be moved, or if it is within the subtree to be moved.
  19316.             if not ( TREE( PARENT ).PARENT = NEW_PARENT or else
  19317.                PARENT = NEW_PARENT ) then
  19318.                if (NEW_PARENT = ROOT_NODE) or else
  19319.                     not ( SCOPE_CHECK( GRAPH( TREE( NEW_PARENT ).GRAPH_DATA ).
  19320.                           DATA.LOCATION , PARENT ) ) then
  19321.                   -- don't allow oos move into an instantiated unit
  19322.                   if TREE( NEW_PARENT ).NODE_TYPE in
  19323.                        TYPE_VIRTUAL_PACKAGE .. TYPE_FUNCTION and then
  19324.                        TREE( NEW_PARENT ).GENERIC_STATUS = GENERIC_INSTANTIATION then
  19325.                      DISPLAY_ERROR (" no entities can be placed inside an instantiated unit ") ;
  19326.                      raise MOVE_TRANSLATION_ERROR ;
  19327.                   end if ;
  19328.                   -- don't allow oos move into an annotation
  19329.                   if TREE( NEW_PARENT ).NODE_TYPE in
  19330.                             TYPE_ENTRY_POINT .. EXPORTED_EXCEPTION then
  19331.                      DISPLAY_ERROR (" no entities can be placed inside an annotation ") ;
  19332.                      raise MOVE_TRANSLATION_ERROR ;
  19333.                   end if ;
  19334.                   -- don't allow oos move of task to the root
  19335.                   if NEW_PARENT = ROOT_NODE and then
  19336.                        TREE( PARENT ).NODE_TYPE = TYPE_TASK then
  19337.                      DISPLAY_ERROR (" invalid, stand alone tasks are not allowed ") ;
  19338.                      raise MOVE_TRANSLATION_ERROR ;
  19339.                   end if ;
  19340.                   -- don't allow oos move of import annotated pkg out of root
  19341.                   if NEW_PARENT /= ROOT_NODE and then
  19342.                        TREE( PARENT ).NODE_TYPE in
  19343.                             TYPE_VIRTUAL_PACKAGE .. TYPE_PACKAGE and then
  19344.                             TREE( PARENT ).IMPORTED_LIST /= NULL_POINTER then
  19345.                      DISPLAY_ERROR (" invalid, only outer most scope is valid for import declartion ") ;
  19346.                      raise MOVE_TRANSLATION_ERROR ;
  19347.                   end if ;
  19348.                   -- oos - set oos_move to true
  19349.                   OOS_MOVE := true ;
  19350.                   OOS_PARENT := NEW_PARENT ;
  19351.                end if ;
  19352.             end if ;
  19353.  
  19354.             -- oos - do not allow annotations to be moved out of scope
  19355.             if OOS_MOVE and then
  19356.                  (LABEL_ONLY or else TREE( PARENT ).NODE_TYPE = TYPE_BODY) then
  19357.                DISPLAY_ERROR (" an out-of-scope translation of annotations is not permitted ") ;
  19358.                raise MOVE_TRANSLATION_ERROR ;
  19359.             end if ;
  19360.  
  19361.             if not VALID_DRAWING_BOUNDARIES (MOVE_REFERENCE_POINT) then
  19362.                DISPLAY_ERROR (" translation is too close to page boundaries ") ;
  19363.                raise MOVE_TRANSLATION_ERROR ;
  19364.             end if ;
  19365.  
  19366.             MOVE_X_TRANSLATION := FLOAT ( GRAPH( GPTR ).DATA.LOCATION.X - 
  19367.                  MOVE_REFERENCE_POINT.X ) ;
  19368.             MOVE_Y_TRANSLATION := FLOAT ( GRAPH( GPTR ).DATA.LOCATION.Y - 
  19369.                  MOVE_REFERENCE_POINT.Y ) ;
  19370.             begin 
  19371.                CHECK_POINT.X := GRAPH( GPTR ).DATA.SIZE.X -
  19372.                     INTEGER( MOVE_X_TRANSLATION ) ;
  19373.                CHECK_POINT.Y := GRAPH( GPTR ).DATA.SIZE.Y -
  19374.                     INTEGER( MOVE_Y_TRANSLATION ) ;
  19375.  
  19376.             exception
  19377.                when CONSTRAINT_ERROR =>
  19378.                   -- although move and resize could be within world
  19379.                   -- coordinates, the first move isn't, easiest to cancel
  19380.                   DISPLAY_ERROR (" translation is too close to page boundaries ") ;
  19381.                   raise MOVE_TRANSLATION_ERROR ;
  19382.                when others =>
  19383.                   raise ;
  19384.             end ;
  19385.  
  19386.  
  19387.             if LABEL_ONLY then
  19388.                -- only translate on the y-axis
  19389.                MOVE_X_TRANSLATION := 0.0 ;
  19390.                -- if moving only a task entry point, recompute x move
  19391.                if TREE( PARENT ).NODE_TYPE = TYPE_ENTRY_POINT then
  19392.                   PARENT_TASK_GPTR := TREE( TREE( PARENT ).PARENT ).GRAPH_DATA ;
  19393.                   -- translate the location point
  19394.                   MOVE_REFERENCE_POINT.X := 
  19395.                         GRAPHIC_DRIVER.PARALLELOGRAM_POINTS (
  19396.                            GRAPH( PARENT_TASK_GPTR ).DATA.LOCATION ,
  19397.                            GRAPH( PARENT_TASK_GPTR ).DATA.SIZE ,
  19398.                            MOVE_REFERENCE_POINT.Y ) -
  19399.                            IMPORT_EXPORT_X_OFFSET ;
  19400.  
  19401.                   MOVE_X_TRANSLATION := FLOAT ( GRAPH( GPTR ).DATA.LOCATION.X - 
  19402.                        MOVE_REFERENCE_POINT.X ) ;
  19403.                end if ;
  19404.             end if ;
  19405.  
  19406.             TRANSLATE_TREE ( MOVE, PARENT, MOVE_X_TRANSLATION, MOVE_Y_TRANSLATION ) ;
  19407.  
  19408.             TRANSLATE_NON_LOCAL_CONNECTIONS( MOVE, PARENT ) ;
  19409.  
  19410.             exit MOVE_LOOP ;
  19411.  
  19412.          exception
  19413.             when MOVE_TRANSLATION_ERROR =>
  19414.                -- User already notified of the error.
  19415.                -- oos - reset oos_move to false
  19416.                OOS_MOVE := false ;
  19417.                OOS_PARENT := NULL_POINTER ;
  19418.  
  19419.             when OPERATION_ABORTED_BY_OPERATOR =>
  19420.                -- the operator wants to abort
  19421.                raise HANDLE_BEFORE_TRANSLATING_ABORT ;
  19422.  
  19423.             when others =>
  19424.                -- handle error conditions that might occur
  19425.                -- recover tree if possible
  19426.                DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE move operation ") ;
  19427.                raise HANDLE_RECOVERY ;
  19428.          end ;
  19429.       end loop MOVE_LOOP ;
  19430.             
  19431.       if not LABEL_ONLY then
  19432.          -- RESIZE
  19433.          -- check if size point is off screen, if so then zoom out
  19434.          if not LOCATION_IN_GRAPHIC_VIEWPORT( 
  19435.                      GRAPH( GPTR ).DATA.SIZE ) then
  19436.             -- zoom out
  19437.             GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( ON ) ;
  19438.             GRAPHIC_DRIVER.ZOOM( GRAPHICS_DATA.MAX_ZOOM_OUT ) ;
  19439.             GRAPHIC_DRIVER.PAN_AND_ZOOM_DISPLAY( OFF ) ;
  19440.             -- set graphics window active
  19441.             GRAPHIC_DRIVER.SELECT_WINDOW
  19442.                 ( GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ) ;
  19443.          end if;
  19444.          -- mark the new .location point
  19445.          REFERENCE_MARKER ( GKS_SPECIFICATION.VISIBLE ,
  19446.                                  MOVE_REFERENCE_POINT ) ;
  19447.  
  19448.          RESIZE_LOOP:
  19449.          loop
  19450.             begin
  19451.                -- set up for aborting
  19452.                SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  19453.                -- set cursor to .size point
  19454.                RESIZE_REFERENCE_POINT := GRAPH( GPTR ).DATA.SIZE ;
  19455.  
  19456.                -- request new size point for parent 
  19457.                REQUEST_POINT (" select new size ( lower right ) point ",
  19458.                               RESIZE_REFERENCE_POINT,
  19459.                               NEW_PARENT ,
  19460.                               true ) ;
  19461.                -- set up for aborting
  19462.                SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19463.  
  19464.  
  19465.  
  19466. -- oos this test is not invalid, the final tree check will catch any errors
  19467. --               -- Determine if new location is valid.  Do this by checking
  19468. --               -- to see if NEW_PARENT is the parent of the subtree to
  19469. --               -- be moved, or if it is within the subtree to be moved.
  19470. --               if not ( TREE( PARENT ).PARENT = NEW_PARENT or else
  19471. --                  PARENT = NEW_PARENT ) then
  19472. --                  if (NEW_PARENT = ROOT_NODE) or else
  19473. --                      not ( SCOPE_CHECK( GRAPH( TREE( NEW_PARENT ).GRAPH_DATA ).
  19474. --                             DATA.LOCATION , PARENT ) ) then
  19475. --                     DISPLAY_ERROR (" an out-of-scope translation is not permitted ") ;
  19476. --                    raise RESIZE_TRANSLATION_ERROR ;
  19477. --                  end if ;
  19478. --               end if ;
  19479.  
  19480.                if not VALID_DRAWING_BOUNDARIES (RESIZE_REFERENCE_POINT) then
  19481.                   DISPLAY_ERROR (" translation is to close to page boundaries, retry ") ;
  19482.                   raise RESIZE_TRANSLATION_ERROR ;
  19483.                end if ;
  19484.  
  19485.                -- translate the subtree 
  19486.                BASE_POINT := GRAPH( GPTR ).DATA.LOCATION ;
  19487.                OLD_SIZE_POINT := GRAPH( GPTR ).DATA.SIZE ;
  19488.                if not ( RESIZE_REFERENCE_POINT.X > BASE_POINT.X and
  19489.                         RESIZE_REFERENCE_POINT.Y < BASE_POINT.Y ) then
  19490.                   DISPLAY_ERROR (" invalid sizing point selected, retry ") ;
  19491.                   raise RESIZE_TRANSLATION_ERROR ;
  19492.                end if ;
  19493.  
  19494.                RESIZE_X_TRANSLATION := 
  19495.                     FLOAT ( RESIZE_REFERENCE_POINT.X - BASE_POINT.X ) /
  19496.                          FLOAT ( OLD_SIZE_POINT.X - BASE_POINT.X ) ;
  19497.                RESIZE_Y_TRANSLATION := 
  19498.                     FLOAT ( RESIZE_REFERENCE_POINT.Y - BASE_POINT.Y ) /
  19499.                          FLOAT ( OLD_SIZE_POINT.Y - BASE_POINT.Y ) ;
  19500.    
  19501.                TRANSLATE_TREE ( RESIZE, PARENT, RESIZE_X_TRANSLATION, 
  19502.                                      RESIZE_Y_TRANSLATION ) ;
  19503.  
  19504.                TRANSLATE_NON_LOCAL_CONNECTIONS( RESIZE, PARENT ) ;
  19505.  
  19506.                -- turn off reference mark 
  19507.                REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19508.                                  MOVE_REFERENCE_POINT ) ;
  19509.                exit RESIZE_LOOP ;
  19510.  
  19511.             exception
  19512.                when RESIZE_TRANSLATION_ERROR =>
  19513.                   -- User already notified of the error.
  19514.                   null ;
  19515.  
  19516.                when OPERATION_ABORTED_BY_OPERATOR =>
  19517.                   -- the operator wants to abort
  19518.                   -- turn off reference mark 
  19519.                   REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19520.                                  MOVE_REFERENCE_POINT ) ;
  19521.                   raise HANDLE_RECOVERY ;
  19522.  
  19523.                when others =>
  19524.                   -- handle error conditions that might occur
  19525.                   -- recover tree if possible
  19526.                   -- turn off reference mark 
  19527.                   REFERENCE_MARKER ( GKS_SPECIFICATION.INVISIBLE ,
  19528.                                  MOVE_REFERENCE_POINT ) ;
  19529.                   DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE resize operation ") ;
  19530.                   raise HANDLE_RECOVERY ;
  19531.             end ;
  19532.          end loop RESIZE_LOOP ;
  19533.  
  19534.          -- oos relationship altering
  19535.          if OOS_MOVE then
  19536.  
  19537.             -- modify old parent
  19538.             OLD_SCOPE_PARENT := TREE( PARENT ).PARENT ;
  19539.             TEMP_LIST_HEAD_PTR := GET_LIST_HEAD ( OLD_SCOPE_PARENT, 
  19540.                                                   CONTAINED_LIST ) ;
  19541.             TEMP_LIST_PTR := FIND_NODE_REFERENCE( TEMP_LIST_HEAD_PTR,
  19542.                                                   PARENT ) ;
  19543.             -- remove contained list reference, and membership reference
  19544.             REMOVE_NODE_FROM_LIST( OLD_SCOPE_PARENT,
  19545.                                    CONTAINED_LIST,
  19546.                                    TEMP_LIST_PTR ) ;
  19547.  
  19548.             -- modify oos parent contained list, and current node membership
  19549.             SET_PARENT( PARENT,
  19550.                         OOS_PARENT,
  19551.                         CONTAINED_LIST ) ;
  19552.             -- verify connects
  19553.             VERIFY_NON_LOCAL_CONNECTIONS ( PARENT ) ;            
  19554.  
  19555.          end if ; -- oos_move
  19556.       end if ; -- label_only
  19557.  
  19558.       -- determine if the translated tree is valid
  19559.       MOVE_OK := CHECK_IF_ANNOTATED_TREE_VALID ;
  19560.  
  19561.       if MOVE_OK then
  19562.          -- delete the old tree and redraw it as translated
  19563.          PERFORM_GRAPH_TREE_OP ( PARENT, DELETED ) ;
  19564.          DRAW_GRAPH_TREE ( PARENT , TRUE ) ;
  19565.          REDRAW_NON_LOCAL_CONNECTIONS ( PARENT ) ;
  19566.       else
  19567.          -- the move would result in an incorrect tree
  19568.          DISPLAY_ERROR(" Move canceled, an invalid graph would have resulted ");
  19569.          raise HANDLE_RECOVERY ;
  19570.  
  19571.       end if ;
  19572.       -- set menu window active
  19573.       GRAPHIC_DRIVER.SELECT_WINDOW
  19574.        (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19575.  
  19576.    exception
  19577.       when HANDLE_RECOVERY =>
  19578.          -- turn off abort capability
  19579.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19580.          -- clear the alpha screen
  19581.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19582.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19583.          -- display recovery message
  19584.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  19585.               ( " restoring the graph to it's status prior to this attempted move operation " ,
  19586.                 VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  19587.                 ROW_NO( 23 ) ) ;
  19588.          -- recover the tree
  19589.          UTIL_FOR_TREE.RECOVER_THE_TREE ;
  19590.          -- clear the alpha screen
  19591.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19592.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19593.          -- set the menu as current window
  19594.          GRAPHIC_DRIVER.SELECT_WINDOW
  19595.           (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19596.  
  19597.       when FIGURE_TOO_NARROW =>
  19598.          -- turn off abort capability
  19599.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19600.          -- the move would result in an incorrect tree
  19601.          DISPLAY_ERROR(" Move canceled, an invalid graph (figure to narrow) would have resulted ");
  19602.          -- clear the alpha screen
  19603.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19604.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19605.          -- display recovery message
  19606.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  19607.               ( " restoring the graph to it's status prior to this attempted move operation " ,
  19608.                 VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  19609.                 ROW_NO( 23 ) ) ;
  19610.          -- recover the tree
  19611.          UTIL_FOR_TREE.RECOVER_THE_TREE ;
  19612.          -- clear the alpha screen
  19613.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19614.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19615.          -- set the menu as current window
  19616.          GRAPHIC_DRIVER.SELECT_WINDOW
  19617.             ( GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19618.  
  19619.       when ERROR_STARTING_TREE_INVALID | HANDLE_BEFORE_HILIGHTING_ABORT =>
  19620.          -- turn off abort capability
  19621.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19622.          -- clear the alpha screen
  19623.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19624.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19625.          -- set the menu as current window
  19626.          GRAPHIC_DRIVER.SELECT_WINDOW
  19627.           (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19628.  
  19629.       when HANDLE_BEFORE_TRANSLATING_ABORT =>
  19630.          -- User already notified of the error.
  19631.          -- set menu window active
  19632.          PERFORM_GRAPH_TREE_OP ( PARENT, RESTORED ) ;
  19633.          -- turn off abort capability
  19634.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19635.          -- clear the alpha screen
  19636.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19637.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19638.          -- set the menu as current window
  19639.          GRAPHIC_DRIVER.SELECT_WINDOW
  19640.           (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19641.  
  19642.       when others =>
  19643.          -- handle error conditions that might occur
  19644.          -- report the error and continue
  19645.          DISPLAY_ERROR (" PROGRAM ERROR -- in MOVE_AND_RESIZE operation ") ;
  19646.          -- turn off abort capability
  19647.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  19648.          -- clear the alpha screen
  19649.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19650.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19651.          -- display recovery message
  19652.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE 
  19653.               ( " restoring the graph to it's status prior to this attempted move operation " ,
  19654.                 VIRTUAL_TERMINAL_INTERFACE.CENTER_A_LINE , 
  19655.                 ROW_NO( 23 ) ) ;
  19656.          -- recover the tree
  19657.          UTIL_FOR_TREE.RECOVER_THE_TREE ;
  19658.          -- clear the alpha screen
  19659.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  19660.               ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  19661.          -- set menu window active
  19662.          GRAPHIC_DRIVER.SELECT_WINDOW
  19663.           (GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ) ;
  19664.  
  19665.    end MOVE_AND_RESIZE ;
  19666.  
  19667. end MMI_CONTROL_MENUS ;
  19668. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  19669. --mmi_attributes_spec.ada
  19670. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  19671. -- version 85-11-14 1610 by JL
  19672.  
  19673. with MMI_PARAMETERS ; use MMI_PARAMETERS ;
  19674.  
  19675. package MMI_ATTRIBUTES is
  19676. -- =============================================================
  19677. --
  19678. --  This package implements the attribute control capability of 
  19679. --  the Man-Machine Interface.  It controls the ATTRIBUTES_MENU
  19680. --  and all subordinate menus, both in terms of displaying
  19681. --  the menus and implementing their implied functionality.
  19682. --
  19683. -- =============================================================
  19684.  
  19685.    procedure CONTROL_ATTRIBUTES_MENU ;
  19686.    -- =========================================================
  19687.    --  This procedure performs operations required to implement
  19688.    --  the attributes menu commands.
  19689.    -- =========================================================
  19690.  
  19691.    procedure CREATE_CONNECTION( COMMAND : in COMMAND_TYPE ) ;
  19692.    -- =========================================================
  19693.    --  This procedure performs operations required to implement
  19694.    --  the creation of a connection based on the command type.
  19695.    -- =========================================================
  19696.  
  19697.    function CONTROL_ANNOTATING_MENU return COMMAND_TYPE ;
  19698.    -- =========================================================
  19699.    --  This function performs operations required to implement
  19700.    --  the annotating menu commands.
  19701.    -- =========================================================
  19702.  
  19703. end MMI_ATTRIBUTES ;
  19704. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  19705. --mmi_attributes_body.ada
  19706. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  19707. -- version 23 January 1986 15:18 by JR
  19708. -- version 86-01-20 1505 by JL
  19709.  
  19710. with GKS_SPECIFICATION           ;  
  19711. with GRAPHICS_DATA               ;  use GRAPHICS_DATA ;
  19712. with GRAPHIC_DRIVER              ;  use GRAPHIC_DRIVER ;
  19713. with TRACE_PKG                   ;
  19714. with TREE_DATA                   ;  
  19715. with TREE_OPS                    ;  use TREE_OPS ;
  19716. with MMI_PARAMETERS              ;  use MMI_PARAMETERS ;
  19717. with MMI_CONTROL_MENUS           ;  use MMI_CONTROL_MENUS ;
  19718. with UTILITIES                   ;  use UTILITIES ;
  19719. with UTIL_FOR_TREE               ;  use UTIL_FOR_TREE ;
  19720. with VIRTUAL_TERMINAL_INTERFACE  ;  use VIRTUAL_TERMINAL_INTERFACE ;
  19721.  
  19722. package body MMI_ATTRIBUTES is
  19723.  
  19724.    BLANK_STRING : STRING (1 .. MAXCOL) := ( others => ' ' ) ;
  19725.  
  19726.    ERROR_ON_LINE_TYPE_INPUT : exception ;
  19727.    ERROR_ON_CHANGE_TYPE : exception ;
  19728.     
  19729.    function CONTROL_COLOR_LINE_MENU ( CHANGE_ENTITY :  in GRAPHIC_ENTITY ) 
  19730.        return COMMAND_TYPE is
  19731.    -- =========================================================
  19732.    --  This procedure performs operations required to implement
  19733.    --  the color/line menu commands.  The returned command
  19734.    --  should always be BACKUP_CMD.
  19735.    -- =========================================================
  19736.  
  19737.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  19738.       DONE           : BOOLEAN := FALSE ;
  19739.       CURRENT_COLOR_TYPE : COLOR_TYPE ;
  19740.       CURRENT_LINE_TYPE  : LINE_TYPE ;
  19741.  
  19742.       subtype COLOR_TYPE_CMD is COMMAND_TYPE range GREEN_CMD..BLACK_CMD ;
  19743.       subtype LINE_TYPE_CMD is COMMAND_TYPE range SOLID_CMD..DOTTED_CMD ;
  19744.  
  19745.       COMMAND_TO_COLOR_TYPE : constant array ( COLOR_TYPE_CMD ) 
  19746.                               of COLOR_TYPE := ( GREEN_CMD  => GREEN ,
  19747.                                                  BLUE_CMD   => BLUE ,
  19748.                                                  VIOLET_CMD => VIOLET ,
  19749.                                                  RED_CMD    => RED ,
  19750.                                                  ORANGE_CMD => ORANGE ,
  19751.                                                  YELLOW_CMD => YELLOW ,
  19752.                                                  BLACK_CMD => BLACK ) ;
  19753.  
  19754.       COMMAND_TO_LINE_TYPE : constant array ( LINE_TYPE_CMD )
  19755.                              of LINE_TYPE := ( SOLID_CMD  => SOLID ,
  19756.                                                DASHED_CMD => DASHED ,
  19757.                                                DOTTED_CMD => DOTTED ) ;
  19758.  
  19759.    begin 
  19760.       -- pre place icon cursor on green_cmd
  19761.       COMMAND := GREEN_CMD ;
  19762.  
  19763.       while not DONE loop 
  19764.          begin
  19765.             -- determine current color
  19766.             -- so as to display
  19767.             CURRENT_COLOR_TYPE := ENTITY_COLOR ( CHANGE_ENTITY ) ;
  19768.             CURRENT_LINE_TYPE := ENTITY_LINE ( CHANGE_ENTITY ) ;
  19769.             -- display current color type
  19770.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  19771.                ( "Current attribute is a " & 
  19772.                  LINE_TYPE'image( CURRENT_LINE_TYPE ) & " line of color " &
  19773.                  COLOR_TYPE'image( CURRENT_COLOR_TYPE ) ,
  19774.                  FORMAT_FCT'( CENTER_A_LINE ) ,
  19775.                  ROW_NO( 23 ) ) ;
  19776.  
  19777.             -- display the current menu and get command from GRAPHICS_DRIVER
  19778.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( COLOR_LINE_MENU ) , COMMAND ) ;
  19779.             case COMMAND is
  19780.                -- implement the color menu commands 
  19781.                when HELP_CMD =>
  19782.                   -- display help for current menu
  19783.                   HELP ( MENU_ID'( COLOR_LINE_MENU ) ) ;
  19784.                when BACKUP_CMD =>
  19785.                   -- return to the next higher menu
  19786.                   DONE := true ;  -- exit the loop 
  19787.                when RESTART_CMD =>
  19788.                   -- return to the main menu
  19789.                   raise HANDLE_RESTART ;
  19790.                when COLOR_TYPE_CMD =>
  19791.                   -- set the color for the proper entity
  19792.                   ENTITY_COLOR ( CHANGE_ENTITY ) := 
  19793.                        COMMAND_TO_COLOR_TYPE ( COMMAND ) ;
  19794.                when LINE_TYPE_CMD =>
  19795.                   -- set the line type for the entity
  19796.                   ENTITY_LINE ( CHANGE_ENTITY ) := 
  19797.                        COMMAND_TO_LINE_TYPE ( COMMAND ) ;
  19798.  
  19799.                when others =>
  19800.                   -- this should not occur
  19801.                   null ;
  19802.             end case ; -- COMMAND
  19803.  
  19804.             -- erase the prompt
  19805.             LOW_LEVEL_OPERATIONS
  19806.                  ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_CURSOR_SCREEN ) ) ;
  19807.  
  19808.          exception
  19809.             when HANDLE_RESTART =>
  19810.                -- propogate exception to handle return to main menu 
  19811.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  19812.                raise ;
  19813.             when others =>
  19814.               -- handle error conditions that might occur
  19815.               -- report the error and continue
  19816.               UTILITIES.DISPLAY_ERROR ( " PROGRAM ERROR -- in control color/line ") ;
  19817.          end ;
  19818.       end loop ; 
  19819.  
  19820.       -- return the command processed
  19821.       return COMMAND ;
  19822.  
  19823.    end CONTROL_COLOR_LINE_MENU ;
  19824.  
  19825.  
  19826. --   procedure CONTROL_SYMBOL ( COMMAND : in COMMAND_TYPE ) is
  19827. --   -- =========================================================
  19828. --   --  This procedure performs operations required to implement
  19829. --   --  the changing of symbols.
  19830. --   -- =========================================================
  19831. --
  19832. --      SYM_SIZE       : NATURAL ;
  19833. --      NEW_SYM        : INDICATOR_LENGTH_4 ;
  19834. --      CURRENT_SYM    : INDICATOR_LENGTH_4 ;
  19835. --      DONE           : BOOLEAN := FALSE ;
  19836. --
  19837. --      SYMBOL_SIZE : constant array
  19838. --            ( COND_CALL_CMD .. GUARD_ENTRY_CMD )
  19839. --                  of NATURAL :=
  19840. --            ( COND_CALL_CMD => CONDITIONAL_CALL_SYMBOL'length ,
  19841. --              TIMED_CALL_CMD => TIMED_CALL_SYMBOL'length ,
  19842. --              NORM_REF_CALL_CMD => NORMAL_REFERENCE_SYMBOL'length ,
  19843. --              VIRT_REF_CALL_CMD => VIRTUAL_REFERENCE_SYMBOL'length ,
  19844. --              GUARD_ENTRY_CMD => GUARDED_ENTRY_SYMBOL'length ) ;
  19845. --
  19846. --   begin
  19847. --      SYM_SIZE := SYMBOL_SIZE( COMMAND ) ;
  19848. --      while not DONE loop
  19849. --         begin
  19850. --            case COMMAND is
  19851. --               when COND_CALL_CMD => 
  19852. --                  CURRENT_SYM(1 .. SYM_SIZE) := CONDITIONAL_CALL_SYMBOL ;
  19853. --               when TIMED_CALL_CMD =>  
  19854. --                  CURRENT_SYM(1 .. SYM_SIZE) := TIMED_CALL_SYMBOL ;
  19855. --               when NORM_REF_CALL_CMD =>
  19856. --                  CURRENT_SYM(1 .. SYM_SIZE) := NORMAL_REFERENCE_SYMBOL ;
  19857. --               when VIRT_REF_CALL_CMD =>
  19858. --                  CURRENT_SYM(1 .. SYM_SIZE) := VIRTUAL_REFERENCE_SYMBOL ;
  19859. --               when GUARD_ENTRY_CMD =>
  19860. --                  CURRENT_SYM(1 .. SYM_SIZE) := GUARDED_ENTRY_SYMBOL ;
  19861. --               when others =>
  19862. --                  -- should never occur
  19863. --                  raise ERROR_ON_CHANGE_TYPE ;
  19864. --            end case ;
  19865. --
  19866. --            -- get new symbol, same length as old
  19867. --            VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  19868. --               ( "Symbol is '" & CURRENT_SYM(1 .. SYM_SIZE) &
  19869. --                      "', enter new symbol (blank=>no change) of length " &
  19870. --                      INTEGER'image(SYM_SIZE) ,
  19871. --                 FORMAT_FCT'( CENTER_A_LINE ) ,
  19872. --                 ROW_NO( 23 ) ) ;
  19873. --            NEW_SYM(1 .. SYM_SIZE) := BLANK_STRING(1 .. SYM_SIZE) ;
  19874. --            VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  19875. --               ( NEW_SYM(1 .. SYM_SIZE) ,
  19876. --                 CURSOR_ADDRESS'( READ_WITH_ADDRESS ) ,
  19877. --                 ROW_NO( 24 ) ,
  19878. --                 COL_NO( 1 ) ) ;
  19879. --
  19880. --            -- check for blank entry
  19881. --            if NEW_SYM(1 .. SYM_SIZE) /= BLANK_STRING(1 .. SYM_SIZE) then
  19882. --               case COMMAND is
  19883. --                  when COND_CALL_CMD => 
  19884. --                     CONDITIONAL_CALL_SYMBOL := NEW_SYM(1 .. SYM_SIZE) ;
  19885. --                  when TIMED_CALL_CMD =>  
  19886. --                     TIMED_CALL_SYMBOL := NEW_SYM(1 .. SYM_SIZE) ;
  19887. --                  when NORM_REF_CALL_CMD =>
  19888. --                     NORMAL_REFERENCE_SYMBOL := NEW_SYM(1 .. SYM_SIZE) ;
  19889. --                  when VIRT_REF_CALL_CMD =>
  19890. --                     VIRTUAL_REFERENCE_SYMBOL := NEW_SYM(1 .. SYM_SIZE) ;
  19891. --                  when GUARD_ENTRY_CMD =>
  19892. --                     GUARDED_ENTRY_SYMBOL := NEW_SYM(1 .. SYM_SIZE) ;
  19893. --                  when others =>
  19894. --                     -- should never occur
  19895. --                     null ;
  19896. --               end case ; -- COMMAND
  19897. --
  19898. --            end if; -- non-blank
  19899. --
  19900. --            -- a good exit
  19901. --            DONE := TRUE ;
  19902. --
  19903. --         exception
  19904. --            when others =>
  19905. --               -- handle error conditions
  19906. --               -- report the error and continue
  19907. --               UTILITIES.DISPLAY_ERROR( ERROR_MSG_STRING ) ;
  19908. --         end ;
  19909. --
  19910. --      end loop ; -- while not DONE
  19911. --
  19912. --      -- erase the prompt and response
  19913. --      LOW_LEVEL_OPERATIONS
  19914. --           ( LOW_LEVEL_CRT_FUNCTIONS'( ERASE_CURSOR_SCREEN ) ) ;
  19915. --
  19916. --   end CONTROL_SYMBOL ;
  19917.  
  19918.  
  19919.    procedure CONTROL_ATTRIBUTES_MENU is
  19920.    -- =========================================================
  19921.    --  This procedure performs operations required to implement
  19922.    --  the attributes menu commands.
  19923.    -- =========================================================
  19924.  
  19925.       COMMAND, DUMMY : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  19926.       CHANGE_ENTITY  : GRAPHIC_ENTITY ;
  19927.       DONE           : BOOLEAN := FALSE ;
  19928.  
  19929.       COMMAND_TO_GRAPHIC_ENTITY : constant array
  19930.                                   ( A_VIRT_PACKAGE_CMD .. A_EXPORT_CONNECT_CMD )
  19931.                                   of GRAPHIC_ENTITY :=
  19932.             ( A_VIRT_PACKAGE_CMD => VIRTUAL_PKG_FIGURE ,
  19933.               A_PACKAGE_CMD      => PACKAGE_FIGURE ,
  19934.               A_SUBPROGRAM_CMD   => SUBPROGRAM_FIGURE ,
  19935.               A_TASK_CMD         => TASK_FIGURE ,
  19936.               A_CALL_CONNECT_CMD => CALL_CONNECT_LINE ,
  19937.               A_DATA_CONNECT_CMD => DATA_CONNECT_LINE ,
  19938.               A_EXPORT_CONNECT_CMD => EXPORT_CONNECT_LINE ) ;
  19939.  
  19940.    begin 
  19941.       while not DONE loop 
  19942.          begin
  19943.             -- pre place icon cursor on virtual package
  19944.             COMMAND := A_VIRT_PACKAGE_CMD ;
  19945.             -- display the current menu and get command from GRAPHICS_DRIVER
  19946.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( ATTRIBUTES_MENU ) , 
  19947.                                            COMMAND ) ;
  19948.             case COMMAND is
  19949.                -- implement the attributes menu commands 
  19950.                when HELP_CMD =>
  19951.                   -- display help for current menu
  19952.                   HELP ( MENU_ID'( ATTRIBUTES_MENU ) ) ;
  19953.                when BACKUP_CMD =>
  19954.                   -- return to the next higher menu
  19955.                   DONE := true ;  -- exit the loop 
  19956.                when PAN_ZOOM_CMD =>
  19957.                   -- go to pan/zoom menu, return to here
  19958.                   DUMMY := CONTROL_PAN_ZOOM_MENU ;
  19959.                when ATTRIBUTES_MENU_CMD =>
  19960.                   -- something is to be changed
  19961.                   CHANGE_ENTITY := COMMAND_TO_GRAPHIC_ENTITY( COMMAND ) ;
  19962.                   DUMMY := CONTROL_COLOR_LINE_MENU( CHANGE_ENTITY ) ;
  19963.  
  19964.                when others =>
  19965.                   -- this should not occur
  19966.                   raise ERROR_ON_CHANGE_TYPE ;
  19967.             end case ; -- COMMAND
  19968.  
  19969.          exception
  19970.             when HANDLE_RESTART =>
  19971.                -- propogate exception to handle return to main menu 
  19972.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  19973.                raise ;
  19974.             when others =>
  19975.               -- handle error conditions that might occur
  19976.               -- report the error and continue
  19977.               UTILITIES.DISPLAY_ERROR ( " PROGRAM ERROR -- in control attributes ") ;
  19978.          end ;
  19979.  
  19980.       end loop ; -- while not DONE
  19981.  
  19982.    end CONTROL_ATTRIBUTES_MENU ;
  19983.  
  19984.  
  19985.    procedure CREATE_CONNECTION ( COMMAND : in COMMAND_TYPE ) is
  19986.    -- =========================================================
  19987.    --  This procedure performs operations required to implement
  19988.    --  the create connection.
  19989.    -- =========================================================
  19990.       use TREE_DATA ;
  19991.  
  19992.       BLANK_LINE          : constant String := " " ;
  19993.       CALL_STATUS         : COMMAND_TYPE := COMMAND_TYPE'(UNCONDITIONAL_CMD) ;
  19994.       CALL_TYPE           : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  19995.       DATA_TYPE           : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  19996.       EXPORTS_TYPE        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  19997.       DUMMY               : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  19998.       CONNECTION          : TREE_DATA.LINE_TYPE ;
  19999.       CONNECT_TYPE        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  20000.       DONE                : Boolean := False ;
  20001.       END_PARENT          : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20002.       END_PARENT_PARENT   : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20003.       END_POINT           : GRAPHICS_DATA.POINT ;
  20004.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  20005.       PARENT              : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20006.       START_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20007.       START_POINT         : GRAPHICS_DATA.POINT ;
  20008.       L_C_PARENT          : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20009.       TREE_NODE           : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20010.  
  20011.       CREATION_ERROR      : exception ;
  20012.       CONNECT_ERROR_AFTER_START : exception ;
  20013.  
  20014.    begin 
  20015.  
  20016.       case COMMAND is
  20017.  
  20018.          when CALL_CONNECT_CMD | IE_CALL_CONNECT_CMD =>
  20019.             -- draw a call connection
  20020.             CALL_STATUS := CONTROL_CALL_STATUS_MENU ;
  20021.  
  20022.             -- restore the menu
  20023.             if COMMAND = CALL_CONNECT_CMD then
  20024.                DISPLAY_MENU( MENU_ID'(DESIGN_MENU), COMMAND ) ;
  20025.             else
  20026.                DISPLAY_MENU( MENU_ID'(ANNOTATING_MENU), COMMAND ) ;
  20027.             end if ;
  20028.             -- set graphics window active.
  20029.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20030.  
  20031.             -- turn on the abort icon
  20032.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20033.             -- get the point where the connection starts
  20034.             REQUEST_POINT ("select starting point within the body of the caller",
  20035.                            START_POINT,
  20036.                            START_PARENT) ;
  20037.             -- turn off the abort icon
  20038.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20039.  
  20040.             -- check for valid start parent for the connection
  20041.             -- for call connections should be of type_body
  20042.             if START_PARENT = NULL_POINTER or else
  20043.                  TREE(START_PARENT).NODE_TYPE /= TYPE_BODY then
  20044.                DISPLAY_ERROR (" invalid scope due to wrong parent type ") ;
  20045.                raise CREATION_ERROR ;
  20046.             end if ;
  20047.             REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20048.                               START_POINT) ;
  20049.  
  20050.             -- turn on the abort icon
  20051.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20052.             -- get the point where the connection ends
  20053.             REQUEST_POINT ("select ending point within the scope of the callee",
  20054.                             END_POINT ,
  20055.                             END_PARENT ) ;
  20056.             -- turn off the abort icon
  20057.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20058.  
  20059.             GRAPH_NODE := TREE( END_PARENT ).GRAPH_DATA ;
  20060.  
  20061.             -- Check the validity of the connection end
  20062.             -- based on the type of the node selected.
  20063.             L_C_PARENT := LOWEST_COMMON_PARENT (START_PARENT, END_PARENT) ;
  20064.             END_PARENT_PARENT := TREE(END_PARENT).PARENT ;
  20065.             case TREE( END_PARENT ).NODE_TYPE is
  20066.                when TYPE_PROCEDURE | TYPE_FUNCTION =>
  20067.                   if TREE( END_PARENT ).GENERIC_STATUS = GENERIC_DECLARATION then
  20068.                      DISPLAY_ERROR ( "invalid, calls cannot be made to a generic declaration" ) ;
  20069.                      raise CONNECT_ERROR_AFTER_START ;
  20070.                   end if ;
  20071.                   if CALL_STATUS = TIMED_CMD then
  20072.                      DISPLAY_ERROR ( "invalid, call status cannot be timed" ) ;
  20073.                      raise CONNECT_ERROR_AFTER_START ;
  20074.                   end if ;
  20075.                   -- call must be recursive or l_c_parent is up one scope
  20076.                   if (L_C_PARENT /= END_PARENT) and
  20077.                        (L_C_PARENT /= END_PARENT_PARENT) then
  20078.                      DISPLAY_ERROR ( "invalid, improper visibility for call" ) ;
  20079.                      raise CONNECT_ERROR_AFTER_START ;
  20080.                   end if ;
  20081.  
  20082.                when TYPE_ENTRY_POINT =>
  20083.                   -- must be outside the task 
  20084.                   if (L_C_PARENT /= TREE(END_PARENT_PARENT).PARENT) then
  20085.                      DISPLAY_ERROR ( "invalid, calls cannot be made from within the enclosing task " ) ;
  20086.                      raise CONNECT_ERROR_AFTER_START ;
  20087.                   end if ;
  20088.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20089.                when EXPORTED_ENTRY_POINT =>
  20090.                   if TREE( END_PARENT_PARENT ).GENERIC_STATUS = GENERIC_DECLARATION then
  20091.                      DISPLAY_ERROR ( "invalid, calls cannot be made to a generic declaration" ) ;
  20092.                      raise CONNECT_ERROR_AFTER_START ;
  20093.                   end if ;
  20094.                   -- must be outside package with the export
  20095.                   if (L_C_PARENT /= TREE(END_PARENT_PARENT).PARENT) then
  20096.                      DISPLAY_ERROR ( "invalid, improper visibility for call" ) ;
  20097.                      raise CONNECT_ERROR_AFTER_START ;
  20098.                   end if ;
  20099.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20100.                when IMPORTED_PROCEDURE | IMPORTED_FUNCTION =>
  20101.                   if CALL_STATUS = TIMED_CMD then
  20102.                      DISPLAY_ERROR ( "invalid, call status cannot be timed" ) ;
  20103.                      raise CONNECT_ERROR_AFTER_START ;
  20104.                   end if ;
  20105.                   -- must be package with the import
  20106.                   if (L_C_PARENT /= END_PARENT_PARENT) then
  20107.                      DISPLAY_ERROR ( "invalid, improper visibility for call" ) ;
  20108.                      raise CONNECT_ERROR_AFTER_START ;
  20109.                   end if ;
  20110.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20111.                when EXPORTED_PROCEDURE | EXPORTED_FUNCTION =>
  20112.                   if TREE( END_PARENT_PARENT ).GENERIC_STATUS = GENERIC_DECLARATION then
  20113.                      DISPLAY_ERROR ( "invalid, calls cannot be made to a generic declaration" ) ;
  20114.                      raise CONNECT_ERROR_AFTER_START ;
  20115.                   end if ;
  20116.                   if CALL_STATUS = TIMED_CMD then
  20117.                      DISPLAY_ERROR ( "invalid, call status cannot be timed" ) ;
  20118.                      raise CONNECT_ERROR_AFTER_START ;
  20119.                   end if ;
  20120.                   -- must be outside package with the export
  20121.                   if (L_C_PARENT /= TREE(END_PARENT_PARENT).PARENT) then
  20122.                      DISPLAY_ERROR ( "invalid, improper visibility for call" ) ;
  20123.                      raise CONNECT_ERROR_AFTER_START ;
  20124.                   end if ;
  20125.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20126.                when others =>
  20127.                   -- invalid parent to call
  20128.                   DISPLAY_ERROR ( "invalid, this type of entity cannot be called " ) ;
  20129.                   raise CONNECT_ERROR_AFTER_START ;
  20130.             end case ;
  20131.  
  20132.             REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20133.                               END_POINT) ;
  20134.  
  20135.             -- Create the tree node, request the connection,
  20136.             -- and then update the TREE node.
  20137.             TREE_NODE := GET_NEW_TREE_NODE (CONNECTION_BY_CALL) ;
  20138.             begin
  20139.                SET_PARENT (TREE_NODE, START_PARENT, CALLEE_LIST) ;
  20140.                if CALL_STATUS = UNCONDITIONAL_CMD then
  20141.                   TREE(TREE_NODE).CALL_VARIETY := NORMAL ;
  20142.                elsif CALL_STATUS = TIMED_CMD then
  20143.                   TREE(TREE_NODE).CALL_VARIETY := TIMED ;
  20144.                else
  20145.                   TREE(TREE_NODE).CALL_VARIETY := CONDITIONAL ;
  20146.                end if ;
  20147.                TREE(TREE_NODE).CONNECTEE := END_PARENT ;
  20148.                -- get the connection
  20149.                REQUEST_CONNECTION (TREE_NODE,
  20150.                                    START_POINT,
  20151.                                    END_POINT,
  20152.                                    CONNECTION) ;
  20153.                TREE(TREE_NODE).LINE := CONNECTION ;
  20154.                MAKE_REFERENCE ( TREE_NODE, END_PARENT ) ;
  20155.             exception
  20156.                when OPERATION_ABORTED_BY_OPERATOR =>
  20157.                   -- turn off the abort icon
  20158.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20159.                   -- release the allocated node on error
  20160.                   TREE_OPS.RELEASE_TREE_NODE ( TREE_NODE ) ;
  20161.                   raise ; -- reference markers turned off later
  20162.                when others =>
  20163.                   -- release the allocated node on error
  20164.                   TREE_OPS.RELEASE_TREE_NODE ( TREE_NODE ) ;
  20165.                   -- turn off the markers
  20166.                   REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20167.                                     START_POINT) ;
  20168.                   REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20169.                                     END_POINT) ;
  20170.                   -- turn off the abort icon
  20171.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20172.                   raise ;
  20173.             end ;                        
  20174.  
  20175.             -- turn off the markers
  20176.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20177.                               START_POINT) ;
  20178.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20179.                               END_POINT) ;
  20180.             -- draw the call marker if required
  20181.             UTIL_FOR_TREE.LABEL_CALL_MARKING( TREE_NODE ) ;
  20182.  
  20183.             -- set menu window active.
  20184.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20185.  
  20186.          when DATA_CONNECT_CMD | IE_DATA_CONNECT_CMD =>
  20187.             -- set graphics window active.
  20188.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20189.  
  20190.             -- turn on the abort icon
  20191.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20192.             -- get the point where the connection starts
  20193.             REQUEST_POINT (" select starting point within scope of entity needing package visibility ",
  20194.                            START_POINT,
  20195.                            START_PARENT) ;
  20196.             -- turn off the abort icon
  20197.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20198.  
  20199.             -- check for valid start parent for the connection
  20200.             -- for data connections should be of
  20201.             -- type_virtual_package .. type_task
  20202.             if START_PARENT = NULL_POINTER or else
  20203.                  TREE(START_PARENT).NODE_TYPE not in
  20204.                  TYPE_VIRTUAL_PACKAGE .. TYPE_TASK then
  20205.                DISPLAY_ERROR (" invalid scope due to wrong parent type ") ;
  20206.                raise CREATION_ERROR ;
  20207.             end if ;
  20208.             REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20209.                               START_POINT) ;
  20210.  
  20211.             -- turn on the abort icon
  20212.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20213.             -- get the point where the connection ends
  20214.             REQUEST_POINT ("select ending point within the (virtual) package scope being reference",
  20215.                             END_POINT,
  20216.                             END_PARENT) ;
  20217.             -- turn off the abort icon
  20218.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20219.  
  20220.             GRAPH_NODE := TREE( END_PARENT ).GRAPH_DATA ;
  20221.  
  20222.             -- Check the validity of the connection end
  20223.             -- based on the type of the node selected.
  20224.             L_C_PARENT := LOWEST_COMMON_PARENT (START_PARENT, END_PARENT) ;
  20225.             case TREE( END_PARENT ).NODE_TYPE is
  20226.                when TYPE_VIRTUAL_PACKAGE | TYPE_PACKAGE =>
  20227.                   PARENT := START_PARENT ;
  20228.                   while PARENT /= ROOT_NODE and 
  20229.                        PARENT /= NULL_POINTER loop
  20230.                      if PARENT = END_PARENT then
  20231.                         DISPLAY_ERROR 
  20232.                           ( "invalid, entities are within the same scope" ) ;
  20233.                         raise CONNECT_ERROR_AFTER_START ;
  20234.                      end if ;
  20235.                      PARENT := TREE(PARENT).PARENT ;
  20236.                   end loop ;
  20237.                   PARENT := TREE(END_PARENT).PARENT ;
  20238.                   while PARENT /= ROOT_NODE and
  20239.                        PARENT /= NULL_POINTER loop
  20240.                      if PARENT = START_PARENT then
  20241.                         DISPLAY_ERROR 
  20242.                           ( "invalid, entities are within the same scope" ) ;
  20243.                         raise CONNECT_ERROR_AFTER_START ;
  20244.                      end if ;
  20245.                      PARENT := TREE(PARENT).PARENT ;
  20246.                   end loop ;
  20247.                   if L_C_PARENT /= TREE( END_PARENT ).PARENT then
  20248.                      DISPLAY_ERROR 
  20249.                        ( "invalid, improper scoping for connection" ) ;
  20250.                      raise CONNECT_ERROR_AFTER_START ;
  20251.                   end if ;
  20252.  
  20253.                when IMPORTED_VIRTUAL_PACKAGE | IMPORTED_PACKAGE =>
  20254.                   if L_C_PARENT /= TREE( END_PARENT ).PARENT then
  20255.                      DISPLAY_ERROR 
  20256.                        ( "invalid, improper scoping for connection" ) ;
  20257.                      raise CONNECT_ERROR_AFTER_START ;
  20258.                   end if ;
  20259.                   -- set the end point to the edge of the
  20260.                   -- import label
  20261.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20262.  
  20263.                when others =>
  20264.                   DISPLAY_ERROR 
  20265.                    ( " invalid, only (virtual) packages or import packages can be referenced " ) ;
  20266.                   raise CONNECT_ERROR_AFTER_START ;
  20267.             end case ; -- node type
  20268.  
  20269.             REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20270.                               END_POINT) ;
  20271.  
  20272.             -- Create and the Tree node, get the connection,
  20273.             -- and then update the TREE node.
  20274.             TREE_NODE := GET_NEW_TREE_NODE (CONNECTION_FOR_DATA) ;
  20275.             begin
  20276.                SET_PARENT (TREE_NODE, START_PARENT, DATA_CONNECT_LIST);
  20277.                TREE(TREE_NODE).CONNECTEE := END_PARENT ;
  20278.                -- get the connection
  20279.                REQUEST_CONNECTION (TREE_NODE,
  20280.                                    START_POINT,
  20281.                                    END_POINT,
  20282.                                    CONNECTION) ;
  20283.                TREE(TREE_NODE).LINE := CONNECTION ;
  20284.                MAKE_REFERENCE(TREE_NODE, END_PARENT) ;
  20285.  
  20286.             exception
  20287.                when OPERATION_ABORTED_BY_OPERATOR =>
  20288.                   -- release the allocated node on error
  20289.                   TREE_OPS.RELEASE_TREE_NODE ( TREE_NODE ) ;
  20290.                   raise ; -- reference markers turned off later
  20291.                when others =>
  20292.                   -- release the allocated node on error
  20293.                   TREE_OPS.RELEASE_TREE_NODE ( TREE_NODE ) ;
  20294.                   raise ;
  20295.             end ;                           
  20296.   
  20297.             -- turn off the markers
  20298.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20299.                               START_POINT) ;
  20300.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20301.                               END_POINT) ;
  20302.             -- draw the line marker if required
  20303.             UTIL_FOR_TREE.LABEL_CALL_MARKING( TREE_NODE ) ;
  20304.             -- set menu window active.
  20305.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20306.  
  20307.          when EXPORT_CONNECT_CMD | IE_EXPORT_CONNECT_CMD =>
  20308.             -- draw a exports connection
  20309.             -- set graphics window active.
  20310.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20311.  
  20312.             -- turn on the abort icon
  20313.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20314.             -- get the point where the connection starts
  20315.             REQUEST_POINT (
  20316.                "select starting export annotation for relationship" ,
  20317.                START_POINT ,
  20318.                START_PARENT ) ;
  20319.             -- turn off the abort icon
  20320.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20321.  
  20322.             GRAPH_NODE := TREE(START_PARENT).GRAPH_DATA ;
  20323.             -- check for valid start parent for the connection
  20324.             -- for exports connections should be of
  20325.             -- exported_procedure .. exported_exception
  20326.             if START_PARENT = NULL_POINTER or else
  20327.                  TREE(START_PARENT).NODE_TYPE not in
  20328.                    EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION then
  20329.                DISPLAY_ERROR ("invalid scope due to wrong parent type ") ;
  20330.                raise CREATION_ERROR ;
  20331.             end if ;
  20332.             if TREE(START_PARENT).CONNECTEE /= NULL_POINTER then
  20333.                DISPLAY_ERROR ("invalid, export is already connected to an entity ") ;
  20334.                raise CREATION_ERROR ;
  20335.             end if ;
  20336.             -- start point at right side of annotation
  20337.             START_POINT := GRAPH( GRAPH_NODE ).DATA.SIZE ;
  20338.             REFERENCE_MARKER( GKS_SPECIFICATION.VISIBLE,
  20339.                               START_POINT ) ;
  20340.  
  20341.             -- turn on the abort icon
  20342.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20343.             -- get the point where the connection ends
  20344.             REQUEST_POINT ("select ending point for relationship",
  20345.                             END_POINT,
  20346.                             END_PARENT) ;
  20347.             -- turn off the abort icon
  20348.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20349.  
  20350.             case TREE(END_PARENT).NODE_TYPE is
  20351.                when TYPE_PROCEDURE =>
  20352.                   if TREE(START_PARENT).NODE_TYPE /=
  20353.                              EXPORTED_PROCEDURE then
  20354.                      DISPLAY_ERROR 
  20355.                         ( "invalid, the export annotation does not match to a procedure" ) ;
  20356.                      raise CONNECT_ERROR_AFTER_START ;
  20357.                   end if ;
  20358.                   if TREE( START_PARENT ).PARENT /= 
  20359.                        TREE( END_PARENT ).PARENT then
  20360.                      DISPLAY_ERROR 
  20361.                        ( "invalid, improper scoping for connection" ) ;
  20362.                      raise CONNECT_ERROR_AFTER_START ;
  20363.                   end if ;
  20364.                when TYPE_FUNCTION =>
  20365.                   if TREE(START_PARENT).NODE_TYPE /=
  20366.                              EXPORTED_FUNCTION then
  20367.                      DISPLAY_ERROR 
  20368.                         ( "invalid, the export annotation does not match to a function") ;
  20369.                      raise CONNECT_ERROR_AFTER_START ;
  20370.                   end if ;
  20371.                   if TREE( START_PARENT ).PARENT /= 
  20372.                        TREE( END_PARENT ).PARENT then
  20373.                      DISPLAY_ERROR 
  20374.                        ( "invalid, improper scoping for connection" ) ;
  20375.                      raise CONNECT_ERROR_AFTER_START ;
  20376.                   end if ;
  20377.                when EXPORTED_PROCEDURE .. EXPORTED_EXCEPTION =>
  20378.                   GRAPH_NODE := TREE(END_PARENT).GRAPH_DATA ;
  20379.                   END_POINT := GRAPH(GRAPH_NODE).DATA.LOCATION ;
  20380.                   if TREE(START_PARENT).NODE_TYPE /=
  20381.                        TREE(END_PARENT).NODE_TYPE then
  20382.                      DISPLAY_ERROR 
  20383.                         ( "invalid, the export annotation types do not match" ) ;
  20384.                      raise CONNECT_ERROR_AFTER_START ;
  20385.                   end if ;
  20386.                   if TREE( START_PARENT ).PARENT /= 
  20387.                        TREE( TREE( END_PARENT ).PARENT ).PARENT then
  20388.                      DISPLAY_ERROR 
  20389.                        ( "invalid, improper scoping for connection" ) ;
  20390.                      raise CONNECT_ERROR_AFTER_START ;
  20391.                   end if ;
  20392.                when others =>
  20393.                   DISPLAY_ERROR 
  20394.                      ( "invalid, improper ending entity for exports connection" ) ;
  20395.                   raise CONNECT_ERROR_AFTER_START ;
  20396.  
  20397.             end case ; -- EXPORTS_TYPE
  20398.  
  20399.             REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20400.                               END_POINT) ;
  20401.             -- 
  20402.             -- update the TREE nodes
  20403.             --
  20404.             TREE(START_PARENT).CONNECTEE := END_PARENT ;
  20405.  
  20406.             -- check for matching names, if not then issue warning
  20407.             if TREE( START_PARENT ).NAME /= 
  20408.                  TREE( END_PARENT ).NAME then
  20409.                VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  20410.                   ( TREE( START_PARENT ).NAME ,
  20411.                     FORMAT_FCT'( CENTER_A_LINE ) ,
  20412.                     ROW_NO( 23 ) ) ;
  20413.                VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  20414.                   ( TREE( END_PARENT ).NAME ,
  20415.                     FORMAT_FCT'( CENTER_A_LINE ) ,
  20416.                     ROW_NO( 24 ) ) ;
  20417.                DISPLAY_ERROR
  20418.                   ( "WARNING the entity names do not match " ) ;
  20419.             end if ;
  20420.             begin
  20421.                -- get the connection
  20422.                REQUEST_CONNECTION (START_PARENT,
  20423.                                    START_POINT,
  20424.                                    END_POINT,
  20425.                                    CONNECTION) ;
  20426.             exception
  20427.                when OPERATION_ABORTED_BY_OPERATOR =>
  20428.                   -- restore the tree
  20429.                   TREE(START_PARENT).CONNECTEE := NULL_POINTER ;
  20430.                   raise ; -- reference markers turned off later
  20431.                when others =>
  20432.                   raise ;
  20433.             end ;
  20434.             TREE(START_PARENT).LINE := CONNECTION ;
  20435.             MAKE_REFERENCE(START_PARENT, END_PARENT) ;
  20436.  
  20437.             -- turn off the markers
  20438.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20439.                               START_POINT) ;
  20440.             REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20441.                               END_POINT) ;
  20442.             -- set menu window active.
  20443.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20444.  
  20445.          when others =>
  20446.             -- this should not occur
  20447.             null ;
  20448.       end case ; -- COMMAND
  20449.  
  20450.    exception
  20451.       when HANDLE_RESTART =>
  20452.          --  exception used to return to the main menu
  20453.          raise ;
  20454.       when HANDLE_ABORT_BACKUP =>
  20455.          --  execption used to return to create menu
  20456.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20457.       when CONNECT_ERROR_AFTER_START =>
  20458.          -- turn off the marker
  20459.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20460.                            START_POINT) ;
  20461.          -- turn off the abort icon
  20462.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20463.          -- set menu window active.
  20464.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20465.       when CREATION_ERROR =>
  20466.          -- user already notified of error,
  20467.          -- turn off the abort icon
  20468.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20469.          -- set menu window active.
  20470.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20471.       when OPERATION_ABORTED_BY_OPERATOR =>
  20472.          -- turn off the marker
  20473.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20474.                            START_POINT) ;
  20475.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20476.                            END_POINT) ;
  20477.          raise ;
  20478.  
  20479.       when others =>
  20480.          -- handle error conditions that might occur
  20481.          -- turn off the marker
  20482.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20483.                            START_POINT) ;
  20484.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20485.                            END_POINT) ;
  20486.          -- turn off the abort icon
  20487.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20488.          -- report the error and continue
  20489.          DISPLAY_ERROR (" PROGRAM ERROR in CREATE_CONNECTION ") ;
  20490.          TRACE_PKG.TRACE (" PROGRAM ERROR in CREATE_CONNECTION !!!!! ") ;
  20491.          -- set menu window active.
  20492.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20493.  
  20494.    end CREATE_CONNECTION ;
  20495.  
  20496.    function CONTROL_ANNOTATING_MENU return COMMAND_TYPE is
  20497.    -- =========================================================
  20498.    --  This procedure performs operations required to implement
  20499.    --  the add menu commands.
  20500.    -- =========================================================
  20501.       use TREE_DATA ;
  20502.  
  20503.       ANNOTATING_ERROR : EXCEPTION ;
  20504.       COMMAND, DUMMY   : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  20505.       DONE             : BOOLEAN := FALSE ;
  20506.       ENTITY_NAME      : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  20507.       ENTRY_POINT_STAT : COMMAND_TYPE := COMMAND_TYPE'(UNGUARDED_CMD) ;
  20508.       GRAPH_NODE       : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  20509.       END_GRAPH_NODE   : TREE_DATA.GRAPH_NODE_ACCESS_TYPE ;
  20510.       SIZE_POINT ,
  20511.       LABEL_POINT      : GRAPHICS_DATA.POINT ;
  20512.       LABEL_SEGMENT    : GKS_SPECIFICATION.SEGMENT_NAME ;
  20513.       LOCATION         : GRAPHICS_DATA.POINT ;
  20514.       PARAM_STATUS     : COMMAND_TYPE := COMMAND_TYPE'(NO_PARAMETERS_CMD) ;
  20515.       PARENT           : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  20516.       PARENT_ENTITY    : GRAPHICS_DATA.GRAPHIC_ENTITY := PACKAGE_FIGURE ;
  20517.       TREE_NODE        : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  20518.       END_TREE_NODE    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  20519.       START_POINT      : GRAPHICS_DATA.POINT ;
  20520.       END_POINT        : GRAPHICS_DATA.POINT ;
  20521.       CONNECTION       : TREE_DATA.LINE_TYPE ;
  20522.       COLOR            : GRAPHICS_DATA.COLOR_TYPE ;
  20523.  
  20524.       subtype IE_CONNECTION_TYPE_CMD is COMMAND_TYPE
  20525.            range IE_CALL_CONNECT_CMD .. IE_EXPORT_CONNECT_CMD ;
  20526.  
  20527.    begin 
  20528.       -- pre place icon cursor on export_proc_cmd
  20529.       COMMAND := EXPORT_PROC_CMD ;
  20530.       while not DONE loop 
  20531.          begin
  20532.             -- display the current menu and get command from GRAPHICS_DRIVER
  20533.             DISPLAY_MENU_AND_GET_COMMAND( MENU_ID'( ANNOTATING_MENU )
  20534.                                           , COMMAND ) ;
  20535.             case COMMAND is
  20536.                -- implement the menu commands 
  20537.                when HELP_CMD =>
  20538.                   -- display help for current menu
  20539.                   HELP ( MENU_ID'( ANNOTATING_MENU ) ) ;
  20540.                when BACKUP_CMD =>
  20541.                   -- return to the next higher menu
  20542.                   DONE := true ;  -- exit the loop 
  20543.                when RESTART_CMD =>
  20544.                   -- return to the main menu
  20545.                   raise HANDLE_RESTART ;
  20546.                when PAN_ZOOM_CMD =>
  20547.                   -- go execute pan zoom operations, return to here
  20548.                   DUMMY := CONTROL_PAN_ZOOM_MENU ;
  20549.                when EXPORT_TASK_ENTRY_CMD =>
  20550.                   -- add an exported entry point declaration
  20551.                   -- set graphics window active
  20552.                   GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20553.  
  20554.                   -- turn on abort icon
  20555.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20556.                   -- request the user identify the scope for entry
  20557.                   REQUEST_POINT ("enter point identifying scope and vertical position of export entry point ",
  20558.                                  LOCATION, 
  20559.                                  PARENT,
  20560.                                  LABEL_CREATE => LABEL_EXPORT ) ;
  20561.                   -- turn off abort icon
  20562.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20563.                   -- check for a valid parent
  20564.                   if PARENT = NULL_POINTER or else
  20565.                        TREE(PARENT).NODE_TYPE not in TYPE_VIRTUAL_PACKAGE ..
  20566.                          TYPE_PACKAGE then
  20567.                      DISPLAY_ERROR (" invalid scope for exported entry point ") ;
  20568.                      raise ANNOTATING_ERROR ;
  20569.                   end if ;
  20570.                   -- determine color for display
  20571.                   PARENT_ENTITY := UTIL_FOR_TREE.GET_FIGURE_TYPE
  20572.                                              ( TREE(PARENT).NODE_TYPE ) ;
  20573.                   COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  20574.  
  20575.                   -- prompt user for export name
  20576.                   REQUEST_LABEL ( ENTITY_NAME ) ;
  20577.                   -- output the label for the export symbol
  20578.                   -- get the TREE and GRAPH nodes
  20579.                   --
  20580.                   begin
  20581.                      TREE_NODE  := GET_NEW_TREE_NODE (EXPORTED_ENTRY_POINT) ;
  20582.                      TREE(TREE_NODE).NAME := ENTITY_NAME ;
  20583.                      SET_PARENT (TREE_NODE, PARENT, EXPORTED_LIST) ;
  20584.                      GRAPH_NODE := GET_NEW_GRAPH_NODE (TREE_NODE) ;
  20585.                      TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  20586.                      LOCATION.X := GRAPH(TREE(PARENT).GRAPH_DATA).
  20587.                                         DATA.LOCATION.X -
  20588.                                         IMPORT_EXPORT_X_OFFSET ;
  20589.                      GRAPH(GRAPH_NODE).DATA.LOCATION := LOCATION ;
  20590.                      LABEL( LABEL_SEGMENT ,
  20591.                             SIZE_POINT , 
  20592.                             GET_OFFSET_LOCATION ( GRAPH_NODE ) ,
  20593.                             GET_LABEL_STRING ( TREE_NODE ) ,
  20594.                             COLOR ) ;
  20595.  
  20596.                      GRAPH(GRAPH_NODE).DATA.SIZE         := SIZE_POINT ;
  20597.                      GRAPH(GRAPH_NODE).DATA.SEGMENT_ID   := NULL_SEGMENT ;
  20598.                      GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  20599.  
  20600.                      -- immediately get the connection from an exported task 
  20601.                      -- entry start point at right side of annotation
  20602.                      START_POINT := SIZE_POINT ;
  20603.                      REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20604.                                        START_POINT) ;
  20605.  
  20606.                      -- allow retry for line connection
  20607.                      CONNECT_TO_ENTRY_POINT_LOOP :
  20608.                      loop
  20609.                         begin
  20610.                            -- turn on abort icon
  20611.                            GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20612.                            REQUEST_POINT (
  20613.                                 "pick entry point as end point for required connection" ,
  20614.                                 END_POINT ,
  20615.                                 END_TREE_NODE ) ;
  20616.                            -- turn off abort icon
  20617.                            GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20618.  
  20619.                            -- check for valid end parent for the connection
  20620.                            if ( TREE(END_TREE_NODE).NODE_TYPE /=
  20621.                                 TYPE_ENTRY_POINT ) and
  20622.                               ( TREE(END_TREE_NODE).NODE_TYPE /=
  20623.                                 EXPORTED_ENTRY_POINT ) then
  20624.                               DISPLAY_ERROR 
  20625.                                  ( "invalid, must connect to entry point" ) ;
  20626.                               raise ANNOTATING_ERROR ;
  20627.                            end if ;
  20628.  
  20629.                            END_GRAPH_NODE := TREE(END_TREE_NODE).GRAPH_DATA ;
  20630.                            END_POINT := GRAPH(END_GRAPH_NODE).DATA.LOCATION ;
  20631.                            -- scope check the export to entry point connection
  20632.                            begin
  20633.                               if TREE( TREE_NODE ).PARENT /= 
  20634.                                   TREE( TREE(END_TREE_NODE).PARENT ).PARENT then
  20635.                                  raise ANNOTATING_ERROR ;
  20636.                               end if ;
  20637.                            exception
  20638.                               when others =>
  20639.                                  -- handler if .parent) .parent) produces error
  20640.                                  DISPLAY_ERROR 
  20641.                                     ( "invalid, improper scoping for connection" ) ;
  20642.                                  raise ANNOTATING_ERROR ;
  20643.                            end ;
  20644.  
  20645.                            exit CONNECT_TO_ENTRY_POINT_LOOP ;
  20646.  
  20647.                         exception
  20648.                            when ANNOTATING_ERROR =>
  20649.                               -- error already displayed, stay in loop
  20650.                               null ;
  20651.                            when others =>
  20652.                               -- an ABORT or some unknown error
  20653.                               raise ;
  20654.                         end ;
  20655.                      end loop CONNECT_TO_ENTRY_POINT_LOOP ;
  20656.  
  20657.                      REFERENCE_MARKER (GKS_SPECIFICATION.VISIBLE,
  20658.                                        END_POINT) ;
  20659.                      -- 
  20660.                      -- update the TREE nodes
  20661.                      TREE(TREE_NODE).CONNECTEE := END_TREE_NODE ;
  20662.                      -- check for matching names, if not then issue warning
  20663.                      if TREE( TREE_NODE ).NAME /= 
  20664.                           TREE( END_TREE_NODE ).NAME then
  20665.                         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  20666.                            ( TREE( TREE_NODE ).NAME ,
  20667.                              FORMAT_FCT'( CENTER_A_LINE ) ,
  20668.                              ROW_NO( 23 ) ) ;
  20669.                         VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  20670.                            ( TREE( END_TREE_NODE ).NAME ,
  20671.                              FORMAT_FCT'( CENTER_A_LINE ) ,
  20672.                              ROW_NO( 24 ) ) ;
  20673.                         DISPLAY_ERROR
  20674.                            ( "WARNING the entity names do not match " ) ;
  20675.                         -- clear the alpha screen
  20676.                         VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  20677.                              ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  20678.                      end if ;
  20679.                      -- get the connection
  20680.                      REQUEST_CONNECTION (TREE_NODE,
  20681.                                          START_POINT,
  20682.                                          END_POINT,
  20683.                                          CONNECTION) ;
  20684.                      TREE(TREE_NODE).LINE := CONNECTION ;
  20685.                      MAKE_REFERENCE(TREE_NODE, END_TREE_NODE) ;
  20686.  
  20687.                      -- turn off the markers
  20688.                      REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20689.                                        START_POINT) ;
  20690.                      REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  20691.                                        END_POINT) ;
  20692.  
  20693.                   exception
  20694.                      -- release the allocated node on error
  20695.                      when OPERATION_ABORTED_BY_OPERATOR =>
  20696.                         TREE_OPS.RELEASE_TREE_NODE( TREE_NODE ) ;
  20697.                         GRAPHIC_DRIVER.DELETE_SEGMENT( LABEL_SEGMENT ) ;
  20698.                         -- turn off the markers
  20699.                         REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20700.                                           START_POINT ) ;
  20701.                         REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20702.                                           END_POINT ) ;
  20703.                         raise ;
  20704.                      when others =>
  20705.                         TREE_OPS.RELEASE_TREE_NODE( TREE_NODE ) ;
  20706.                         GRAPHIC_DRIVER.DELETE_SEGMENT ( LABEL_SEGMENT ) ;
  20707.                         -- turn off the markers
  20708.                         REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20709.                                           START_POINT ) ;
  20710.                         REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20711.                                           END_POINT ) ;
  20712.                         -- turn off abort icon
  20713.                         GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF);
  20714.                         -- set menu window active.
  20715.                         GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20716.                         raise ;
  20717.                   end ;
  20718.                   -- set menu window active.
  20719.                   GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20720.  
  20721.                when EXPORT_TYPE_CMD | EXPORT_OBJ_CMD | EXPORT_EXCEPT_CMD | 
  20722.                     EXPORT_PROC_CMD | EXPORT_FUNC_CMD =>
  20723.                   -- add an exported type, object, exception, procedure,
  20724.                   --  or function declaration
  20725.                   -- set graphics window active
  20726.                   GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20727.  
  20728.                   -- turn on abort icon
  20729.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20730.                   -- request the user identify the scope to be deleted
  20731.                   REQUEST_POINT (" enter point identifying scope and vertical position of export",
  20732.                                  LOCATION, 
  20733.                                  PARENT,
  20734.                                  LABEL_CREATE => LABEL_EXPORT ) ;
  20735.                   -- turn off abort icon
  20736.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20737.  
  20738.                   -- check for a valid parent
  20739.                   if PARENT = NULL_POINTER or else
  20740.                      ( TREE(PARENT).NODE_TYPE /= TYPE_PACKAGE and 
  20741.                        TREE(PARENT).NODE_TYPE /= TYPE_VIRTUAL_PACKAGE ) then
  20742.                        DISPLAY_ERROR (" invalid scope for export declaration ") ;
  20743.                      raise ANNOTATING_ERROR ;
  20744.                   end if ;
  20745.                   -- determine color for display
  20746.                   PARENT_ENTITY := UTIL_FOR_TREE.GET_FIGURE_TYPE
  20747.                                              ( TREE(PARENT).NODE_TYPE ) ;
  20748.                   COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  20749.  
  20750.                   -- prompt user for export name
  20751.                   if COMMAND = EXPORT_FUNC_CMD then
  20752.                      REQUEST_LABEL ( ENTITY_NAME, FALSE, TRUE ) ;
  20753.                   else
  20754.                      REQUEST_LABEL ( ENTITY_NAME ) ;
  20755.                   end if ;
  20756.                   -- output the label for the export symbol
  20757.                   -- get the TREE and GRAPH nodes
  20758.                   begin
  20759.                      if COMMAND = EXPORT_TYPE_CMD then
  20760.                         TREE_NODE := GET_NEW_TREE_NODE (EXPORTED_TYPE) ;
  20761.                      elsif COMMAND = EXPORT_OBJ_CMD then
  20762.                         TREE_NODE := GET_NEW_TREE_NODE (EXPORTED_OBJECT) ;
  20763.                      elsif COMMAND = EXPORT_EXCEPT_CMD then
  20764.                         TREE_NODE := GET_NEW_TREE_NODE (EXPORTED_EXCEPTION) ;
  20765.                      elsif COMMAND = EXPORT_PROC_CMD then
  20766.                         TREE_NODE := GET_NEW_TREE_NODE (EXPORTED_PROCEDURE) ;
  20767.                      else
  20768.                         TREE_NODE := GET_NEW_TREE_NODE (EXPORTED_FUNCTION) ;
  20769.                      end if ;
  20770.                      --
  20771.                      -- update the TREE and GRAPH nodes
  20772.                      --
  20773.                      TREE(TREE_NODE).NAME := ENTITY_NAME ;
  20774.                      SET_PARENT (TREE_NODE, PARENT, EXPORTED_LIST) ;
  20775.                      GRAPH_NODE := GET_NEW_GRAPH_NODE (TREE_NODE) ;
  20776.                      TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  20777.                      LOCATION.X := GRAPH(TREE(PARENT).GRAPH_DATA).
  20778.                                         DATA.LOCATION.X -
  20779.                                    IMPORT_EXPORT_X_OFFSET ;
  20780.                      GRAPH(GRAPH_NODE).DATA.LOCATION := LOCATION ;
  20781.                      -- display the label and get the size pt and segment id
  20782.                      LABEL( LABEL_SEGMENT ,
  20783.                             SIZE_POINT , 
  20784.                             GET_OFFSET_LOCATION ( GRAPH_NODE ) ,
  20785.                             GET_LABEL_STRING ( TREE_NODE ) ,
  20786.                             COLOR ) ;
  20787.                      -- place the graph information in the graph node
  20788.                      GRAPH(GRAPH_NODE).DATA.SIZE := SIZE_POINT ;
  20789.                      GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := NULL_SEGMENT ;
  20790.                      GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  20791.  
  20792.                   exception
  20793.                      -- release the allocated node on error
  20794.                      when others =>
  20795.                         TREE_OPS.RELEASE_TREE_NODE( TREE_NODE ) ;
  20796.                      raise ;
  20797.                   end ;
  20798.                   -- set menu window active.
  20799.                   GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20800.  
  20801.                when IMPORT_VP_CMD | IMPORT_PKG_CMD | IMPORT_PROC_CMD |
  20802.                     IMPORT_FUNC_CMD =>
  20803.                   -- add an imported virtual package, package, procedure
  20804.                   -- or function
  20805.                   -- set graphics window active
  20806.                   GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  20807.  
  20808.                   -- turn on abort icon
  20809.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  20810.                   -- request the user identify the scope to be deleted
  20811.                   REQUEST_POINT (" enter point identifying scope and vertical position of import ",
  20812.                                  LOCATION, 
  20813.                                  PARENT,
  20814.                                  LABEL_CREATE => LABEL_IMPORT ) ;
  20815.                   -- turn off abort icon
  20816.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  20817.  
  20818.                   -- check for a valid parent
  20819.                   if PARENT = NULL_POINTER or else
  20820.                    ( TREE(PARENT).NODE_TYPE /= TYPE_PACKAGE and 
  20821.                      TREE(PARENT).NODE_TYPE /= TYPE_VIRTUAL_PACKAGE ) then
  20822.                      DISPLAY_ERROR (" invalid scope for import declaration ") ;
  20823.                      raise ANNOTATING_ERROR ;
  20824.                   end if ;
  20825.                   if TREE(PARENT).PARENT /= ROOT_NODE then
  20826.                      DISPLAY_ERROR (" invalid, only outer most scope is valid for import declaration ") ;
  20827.                      raise ANNOTATING_ERROR ;
  20828.                   end if ;
  20829.                   -- determine color for display
  20830.                   PARENT_ENTITY := UTIL_FOR_TREE.GET_FIGURE_TYPE
  20831.                                              ( TREE(PARENT).NODE_TYPE ) ;
  20832.                   COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  20833.  
  20834.                   -- prompt user for import name
  20835.                   if COMMAND = IMPORT_FUNC_CMD then
  20836.                      REQUEST_LABEL ( ENTITY_NAME, FALSE, TRUE ) ;
  20837.                   else
  20838.                      REQUEST_LABEL ( ENTITY_NAME ) ;
  20839.                   end if ;
  20840.                   -- get the TREE and GRAPH node
  20841.                   begin
  20842.                      if COMMAND = IMPORT_VP_CMD then
  20843.                         TREE_NODE := GET_NEW_TREE_NODE (IMPORTED_VIRTUAL_PACKAGE) ;
  20844.                      elsif COMMAND = IMPORT_PKG_CMD then
  20845.                         TREE_NODE := GET_NEW_TREE_NODE (IMPORTED_PACKAGE) ;
  20846.                      elsif COMMAND = IMPORT_PROC_CMD then
  20847.                         TREE_NODE := GET_NEW_TREE_NODE (IMPORTED_PROCEDURE) ;
  20848.                      else
  20849.                         TREE_NODE := GET_NEW_TREE_NODE (IMPORTED_FUNCTION) ;
  20850.                      end if ;
  20851.                      --
  20852.                      -- update the TREE and GRAPH nodes
  20853.                      --
  20854.                      TREE(TREE_NODE).NAME := ENTITY_NAME ;
  20855.                      SET_PARENT (TREE_NODE, PARENT, IMPORTED_LIST) ;
  20856.                      GRAPH_NODE := GET_NEW_GRAPH_NODE (TREE_NODE) ;
  20857.                      TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  20858.                      LOCATION.X := GRAPH(TREE(PARENT).GRAPH_DATA).
  20859.                                         DATA.SIZE.X -
  20860.                                    IMPORT_EXPORT_X_OFFSET ;
  20861.                      GRAPH(GRAPH_NODE).DATA.LOCATION := LOCATION ;
  20862.                      -- display the label and get the size pt and segment id
  20863.                      LABEL( LABEL_SEGMENT ,
  20864.                             SIZE_POINT , 
  20865.                             GET_OFFSET_LOCATION ( GRAPH_NODE ) ,
  20866.                             GET_LABEL_STRING ( TREE_NODE ) ,
  20867.                             COLOR ) ;
  20868.                      -- place the graph information in the graph node
  20869.                      GRAPH(GRAPH_NODE).DATA.SIZE := SIZE_POINT ;
  20870.                      GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := NULL_SEGMENT ;
  20871.                      GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  20872.  
  20873.                   exception
  20874.                      -- release the allocated node on error
  20875.                      when others =>
  20876.                         TREE_OPS.RELEASE_TREE_NODE( TREE_NODE ) ;
  20877.                      raise ;
  20878.                   end ;
  20879.                   -- set menu window active.
  20880.                   GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20881.  
  20882.                when IE_CONNECTION_TYPE_CMD =>
  20883.                   CREATE_CONNECTION( COMMAND ) ;
  20884.  
  20885.                when others =>
  20886.                   -- this should not occur
  20887.                   null ;
  20888.             end case ; -- COMMAND
  20889.          exception
  20890.             when HANDLE_RESTART =>
  20891.                -- propogate exception to handle return to main menu 
  20892.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20893.                raise ;
  20894.             when ANNOTATING_ERROR =>
  20895.                -- error previously called to user's attention   
  20896.                -- set menu window active
  20897.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20898.             when OPERATION_ABORTED_BY_OPERATOR =>
  20899.                -- turn off abort icon
  20900.                GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF);
  20901.                -- clear the alpha screen
  20902.                VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  20903.                      ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  20904.                -- set menu window active.
  20905.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20906.             when others =>
  20907.                -- handle error conditions that might occur
  20908.                -- turn off the markers
  20909.                REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20910.                                  LOCATION ) ;
  20911.                REFERENCE_MARKER( GKS_SPECIFICATION.INVISIBLE,
  20912.                                  LOCATION ) ;
  20913.                -- report the error and continue
  20914.                DISPLAY_ERROR (" PROGRAM ERROR -- in ANNOTATING Menu ") ;
  20915.                -- set menu window active
  20916.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  20917.          end ;
  20918.       end loop ; 
  20919.  
  20920.       -- return the command processed
  20921.       return COMMAND ;
  20922.  
  20923.    end CONTROL_ANNOTATING_MENU ;
  20924.  
  20925.  
  20926. end MMI_ATTRIBUTES ;
  20927. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  20928. --mmi_design_spec.ada
  20929. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  20930. -- version 85-09-05  1535 by RAM
  20931.  
  20932. package MMI_DESIGN is 
  20933. -- =============================================================
  20934. --
  20935. --  This package implements the design capability of the
  20936. --  Man-Machine Interface.  It controls the DESIGN_MENU
  20937. --  and all subordinate menus, both in terms of displaying
  20938. --  the menus and implementing their implied functionality.
  20939. --
  20940. -- =============================================================
  20941.  
  20942.    procedure CONTROL_DESIGN_MENU ;
  20943.    -- =========================================================
  20944.    --  This procedure performs operations required to implement
  20945.    --  the design menu commands.
  20946.    -- =========================================================
  20947.  
  20948. end MMI_DESIGN ;
  20949. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  20950. --mmi_design_body.ada
  20951. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  20952. -- version 86-02-12 14:00 by JB
  20953.  
  20954. with GKS_SPECIFICATION           ;  use GKS_SPECIFICATION ;
  20955. with GRAPHICS_DATA               ;  use GRAPHICS_DATA ;
  20956. with GRAPHIC_DRIVER              ;  use GRAPHIC_DRIVER ;
  20957. with MMI_CONTROL_MENUS           ;  use MMI_CONTROL_MENUS ;
  20958. with MMI_PARAMETERS              ;  use MMI_PARAMETERS ;
  20959. with MMI_ATTRIBUTES              ;  use MMI_ATTRIBUTES ;
  20960. with TRACE_PKG                   ;
  20961. with TREE_DATA                   ;  use TREE_DATA ;
  20962. with TREE_OPS                    ;  use TREE_OPS ;
  20963. with UTILITIES                   ;  use UTILITIES ;
  20964. with UTIL_FOR_TREE               ;  use UTIL_FOR_TREE ;
  20965. with VIRTUAL_TERMINAL_INTERFACE  ;  use VIRTUAL_TERMINAL_INTERFACE ;
  20966.  
  20967. package body MMI_DESIGN is
  20968.  
  20969.    procedure UPDATE_TREE_FOR_CONTAINED_ENTITIES (
  20970.               PARENT            : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  20971.               TREE_NODE         : in out TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  20972.               ENCLOSED_ENTITIES : in out TREE_DATA.ENCLOSED_ENTITIES_TYPE ) is
  20973.    -- =========================================================
  20974.    --  This procedure updates the tree for the entities
  20975.    --  in the received list.
  20976.    -- =========================================================
  20977.       ENCLOSED_INDEX : INTEGER := ENCLOSED_ENTITIES'first ;
  20978.       LIST_PTR     : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  20979.       SEARCH_PTR   : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  20980.       MEMBER_PTR   : TREE_DATA.MEMBERSHIP_LIST_TYPE ;
  20981.       NEW_LIST_PTR : TREE_DATA.LIST_NODE_ACCESS_TYPE :=
  20982.                      TREE_DATA.NULL_POINTER ;
  20983.    begin
  20984.  
  20985.       -- Process each entity contained in the received list of
  20986.       -- contained entities.
  20987.       LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX ) ;
  20988.       while LIST_PTR /= TREE_DATA.NULL_POINTER
  20989.       loop
  20990.  
  20991.          -- Remove the contained entities from the contained entity
  20992.          -- list of the parent.
  20993.          -- If the first item of the contained list is the item to be
  20994.          -- deleted then remove the item from the list.
  20995.          if LIST_PTR = TREE_DATA.TREE( PARENT ).CONTAINED_ENTITY_LIST then
  20996.             TREE_DATA.TREE( PARENT ).CONTAINED_ENTITY_LIST :=
  20997.                TREE_DATA.LIST( LIST_PTR ).NEXT ;
  20998.             TREE_DATA.LIST(
  20999.                TREE_DATA.TREE( PARENT ).CONTAINED_ENTITY_LIST ).PRIOR :=
  21000.                TREE_DATA.NULL_POINTER ;
  21001.          else
  21002.  
  21003.             -- Search for the list item to be delete from the contained
  21004.             -- entity list; when found, delete the item from the list.
  21005.             SEARCH_PTR := TREE_DATA.TREE( PARENT ).CONTAINED_ENTITY_LIST ;
  21006.             while SEARCH_PTR /= TREE_DATA.NULL_POINTER
  21007.             loop
  21008.                if SEARCH_PTR = LIST_PTR then
  21009.                   TREE_DATA.LIST(
  21010.                      TREE_DATA.LIST( SEARCH_PTR ).PRIOR ).NEXT :=
  21011.                      TREE_DATA.LIST( SEARCH_PTR ).NEXT ;
  21012.                   if TREE_DATA.LIST( SEARCH_PTR ).NEXT /=
  21013.                      TREE_DATA.NULL_POINTER then
  21014.                      TREE_DATA.LIST(
  21015.                         TREE_DATA.LIST( SEARCH_PTR ).NEXT ).PRIOR :=
  21016.                         TREE_DATA.LIST( SEARCH_PTR ).PRIOR ;
  21017.                   end if ;
  21018.                   exit ;
  21019.                else
  21020.                   SEARCH_PTR := TREE_DATA.LIST( SEARCH_PTR ).NEXT ;
  21021.                end if ;
  21022.             end loop ;
  21023.          end if ;
  21024.  
  21025.          -- Attach the list node being processed to the contained
  21026.          -- entity list of the new parent.
  21027.          if NEW_LIST_PTR = TREE_DATA.NULL_POINTER then
  21028.             TREE_DATA.TREE( TREE_NODE ).CONTAINED_ENTITY_LIST := LIST_PTR ;
  21029.             TREE_DATA.LIST( LIST_PTR ).PRIOR := TREE_DATA.NULL_POINTER ;
  21030.          else
  21031.             TREE_DATA.LIST( LIST_PTR ).PRIOR := NEW_LIST_PTR ;
  21032.             TREE_DATA.LIST( NEW_LIST_PTR ).NEXT := LIST_PTR ;
  21033.          end if ;
  21034.  
  21035.          -- Update the parent in the membership list of the current
  21036.          -- list node ( the current contained entity ).
  21037.          MEMBER_PTR := TREE_DATA.TREE(
  21038.             TREE_DATA.LIST( LIST_PTR ).ITEM ).MEMBERSHIP ;
  21039.          while MEMBER_PTR /= TREE_DATA.NULL_POINTER
  21040.          loop
  21041.  
  21042.             if TREE_DATA.LIST( MEMBER_PTR ).ITEM =
  21043.                TREE_DATA.TREE( TREE_DATA.LIST( LIST_PTR ).ITEM ).PARENT then
  21044.                TREE_DATA.LIST( MEMBER_PTR ).ITEM := TREE_NODE ;
  21045.                exit ;
  21046.             else
  21047.                MEMBER_PTR := TREE_DATA.LIST( MEMBER_PTR ).NEXT ;
  21048.             end if ;
  21049.          end loop ;
  21050.  
  21051.          -- Update fields NEXT & ITEM for the current list node, and set
  21052.          -- the parent of the tree node associated with the list node
  21053.          NEW_LIST_PTR := LIST_PTR ;
  21054.          TREE_DATA.LIST( LIST_PTR ).NEXT := TREE_DATA.NULL_POINTER ;
  21055.  
  21056.  
  21057.          -- Set the parent to the input tree node.
  21058.          --TREE_DATA.LIST( LIST_PTR ).ITEM := TREE_NODE ;
  21059.          TREE_DATA.TREE( TREE_DATA.LIST( LIST_PTR ).ITEM ).PARENT :=
  21060.             TREE_NODE ;
  21061.  
  21062.          -- Determine the next list node to process.
  21063.          ENCLOSED_INDEX := ENCLOSED_INDEX + 1 ;
  21064.          LIST_PTR := ENCLOSED_ENTITIES( ENCLOSED_INDEX ) ;
  21065.       end loop ;
  21066.    end UPDATE_TREE_FOR_CONTAINED_ENTITIES ;
  21067.  
  21068.  
  21069.    procedure CREATE( COMMAND : in COMMAND_TYPE ) is
  21070.    -- =========================================================
  21071.    --  This procedure performs operations required to implement
  21072.    --  the create menu commands.
  21073.    -- =========================================================
  21074.       BLANK_LINE          : constant String := " " ;
  21075.       BOX_REFERENCE_POINT : GRAPHICS_DATA.POINT ;
  21076.       BOX_SIZE_POINT      : GRAPHICS_DATA.POINT ;
  21077.       CALL_STATUS         : COMMAND_TYPE := COMMAND_TYPE'(UNCONDITIONAL_CMD) ;
  21078.       CALL_TYPE           : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  21079.       DATA_TYPE           : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  21080.       EXPORTS_TYPE        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  21081.       DUMMY               : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ;
  21082.       CONNECTION          : TREE_DATA.LINE_TYPE ;
  21083.       CONNECT_TYPE        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  21084.       DONE                : Boolean := False ;
  21085.       END_PARENT          : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21086.       END_PARENT_PARENT   : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21087.       END_POINT           : GRAPHICS_DATA.POINT ;
  21088.       ENTITY_NAME         : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  21089.       ENTITY_SEGMENT      : GKS_SPECIFICATION.SEGMENT_NAME ;
  21090.       GENERIC_TYPE        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  21091.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  21092.       SIZE_POINT ,
  21093.       LABEL_POINT         : GRAPHICS_DATA.POINT ;
  21094.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  21095.       LINE_POINT          : GRAPHICS_DATA.POINT ;
  21096.       PARAM_STATUS        : COMMAND_TYPE := COMMAND_TYPE'(NO_PARAMETERS_CMD) ;
  21097.       ENTRY_POINT_STAT    : COMMAND_TYPE := COMMAND_TYPE'(UNGUARDED_CMD) ;
  21098.       PARENT              : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21099.       PROPER_SCOPE        : Boolean := False ;
  21100.       SCOPE_SIZE_POINT    : GRAPHICS_DATA.POINT ;
  21101.       START_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21102.       L_C_PARENT          : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21103.       START_POINT         : GRAPHICS_DATA.POINT ;
  21104.       TREE_NODE           : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  21105.       PROLOGUE_NODE       : TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE := NULL_POINTER;
  21106.  
  21107.       ENCLOSED_ENTITIES   : TREE_DATA.ENCLOSED_ENTITIES_TYPE ;
  21108.       ENCLOSURE_EXISTS    : BOOLEAN ;
  21109.  
  21110.       CREATION_ERROR      : exception ;
  21111.  
  21112.    begin 
  21113.  
  21114.       case COMMAND is
  21115.  
  21116.          when VIRT_PACKAGE_CMD =>
  21117.             -- create a virtual package
  21118.             -- set graphics window active.
  21119.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21120.  
  21121.             -- continue prompting for points until a good entity is drawn
  21122.             loop
  21123.                begin
  21124.                   -- turn on the abort icon
  21125.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21126.                   -- get box points in proper scope
  21127.                   REQUEST_POINTS (BOX_REFERENCE_POINT,
  21128.                                   BOX_SIZE_POINT,
  21129.                                   PARENT,
  21130.                                   ENCLOSED_ENTITIES, ENCLOSURE_EXISTS ) ;
  21131.                   -- turn off the abort icon
  21132.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21133.  
  21134.                   -- check if valid Parent specified
  21135.                   if PARENT = NULL_POINTER then
  21136.                      DISPLAY_ERROR( " PROGRAM ERROR -- null pointer parent "
  21137.                                    & "in creating virtual package ") ;
  21138.                      raise CREATION_ERROR ;
  21139.                   elsif TREE( PARENT ).NODE_TYPE not in ROOT .. TYPE_TASK then
  21140.                      DISPLAY_ERROR(" invalid scope due to wrong parent type ") ;
  21141.                      raise CREATION_ERROR ;
  21142.                   elsif CHECK_IF_GENERIC_INSTAN (PARENT) then
  21143.                      DISPLAY_ERROR( " no objects can be placed inside" &
  21144.                                     " an instantiated unit ") ;
  21145.                      raise CREATION_ERROR ;
  21146.                   end if ;
  21147.                   -- draw the box and set the visibility
  21148.                   ENTITY_SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  21149.                                        ( GRAPHICS_DATA.VIRTUAL_PKG_FIGURE,
  21150.                                          BOX_REFERENCE_POINT,
  21151.                                          BOX_SIZE_POINT ) ;
  21152.                   exit ;
  21153.                exception
  21154.                   when FIGURE_TOO_NARROW =>
  21155.                      DISPLAY_ERROR("  Figure as defined will be too narrow"
  21156.                                   & " to draw.  " ) ; 
  21157.                   when others =>
  21158.                      raise ;
  21159.                end ;
  21160.             end loop ;
  21161.  
  21162.             GRAPHIC_DRIVER.SET_SEGMENT_VISIBILITY( ENTITY_SEGMENT,
  21163.                            GKS_SPECIFICATION.VISIBLE ) ;
  21164.  
  21165.             -- If enclosed entities exist then archive the tree
  21166.             if ENCLOSURE_EXISTS then
  21167.                ARCHIVE_THE_TREE ;
  21168.             end if ;
  21169.  
  21170.             --
  21171.             -- create and update the TREE and GRAPH nodes
  21172.             --
  21173.             TREE_NODE := GET_NEW_TREE_NODE (TYPE_VIRTUAL_PACKAGE) ;
  21174.             SET_PARENT (TREE_NODE, PARENT, CONTAINED_LIST) ;
  21175.  
  21176.             GRAPH_NODE := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21177.             TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  21178.             -- place the graph information in the graph node
  21179.             GRAPH(GRAPH_NODE).DATA.LOCATION := BOX_REFERENCE_POINT ;
  21180.             GRAPH(GRAPH_NODE).DATA.SIZE := BOX_SIZE_POINT ;
  21181.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := ENTITY_SEGMENT ;
  21182.  
  21183.             -- If the created entity encloses previously created
  21184.             -- entities then update and verify the tree.
  21185.             if ENCLOSURE_EXISTS then
  21186.                UPDATE_TREE_FOR_CONTAINED_ENTITIES (
  21187.                   PARENT, TREE_NODE, ENCLOSED_ENTITIES ) ;
  21188.                if not CHECK_IF_ANNOTATED_TREE_VALID then
  21189.                   RECOVER_THE_TREE ;
  21190.                   raise CREATION_ERROR ;
  21191.                end if ;
  21192.             end if ;
  21193.  
  21194.             -- prompt user for package name.
  21195.             REQUEST_LABEL( ENTITY_NAME ) ;
  21196.             TREE(TREE_NODE).NAME := ENTITY_NAME ;
  21197.  
  21198.             -- label the virtual package
  21199.             LABEL( LABEL_SEGMENT ,
  21200.                    SIZE_POINT ,
  21201.                    GET_OFFSET_LOCATION( GRAPH_NODE ) ,
  21202.                    GET_LABEL_STRING( TREE_NODE ) ,
  21203.                    ENTITY_COLOR (GRAPHICS_DATA.VIRTUAL_PKG_FIGURE) ) ;
  21204.             GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  21205.  
  21206.             PROLOGUE_NODE := GET_NEW_PROLOGUE_NODE (TREE_NODE) ;
  21207.             -- prompt user for PROLOGUE.
  21208.             REQUEST_PROLOGUE(PROLOGUE_NODE) ;
  21209.             TREE(TREE_NODE).PROLOGUE_PTR := PROLOGUE_NODE ;
  21210.             -- set menu window active.
  21211.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21212.  
  21213.          when PACKAGE_CMD =>
  21214.             -- check if the package should be generic
  21215.             GENERIC_TYPE := CONTROL_GENERIC_MENU ;
  21216.             -- restore the design menu
  21217.             DISPLAY_MENU( MENU_ID'(DESIGN_MENU), COMMAND ) ;
  21218.             -- set graphics window active.
  21219.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21220.  
  21221.             -- continue prompting for points until a good entity is drawn
  21222.             loop
  21223.                begin
  21224.                   -- turn on the abort icon
  21225.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21226.                   -- get box points in proper scope
  21227.                   REQUEST_POINTS (BOX_REFERENCE_POINT,
  21228.                                   BOX_SIZE_POINT,
  21229.                                   PARENT,
  21230.                                   ENCLOSED_ENTITIES, ENCLOSURE_EXISTS ) ;
  21231.                   -- turn off the abort icon
  21232.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21233.  
  21234.                   -- test if the parent is valid
  21235.                   if PARENT = NULL_POINTER then
  21236.                      DISPLAY_ERROR( " PROGRAM ERROR -- null pointer parent in "
  21237.                                     & "creating package ") ;
  21238.                      raise CREATION_ERROR ;
  21239.                   elsif TREE( PARENT ).NODE_TYPE not in ROOT .. TYPE_TASK then
  21240.                      DISPLAY_ERROR(" invalid scope due to wrong parent type ") ;
  21241.                      raise CREATION_ERROR ;
  21242.                   elsif CHECK_IF_GENERIC_INSTAN (PARENT) 
  21243.                      or
  21244.                      (  GENERIC_TYPE = GENERIC_INST_CMD and
  21245.                         ENCLOSURE_EXISTS ) then
  21246.                      DISPLAY_ERROR (" no objects can be placed inside" &
  21247.                                     " an instantiated unit ") ;
  21248.                      raise CREATION_ERROR ;
  21249.                   end if ;
  21250.                   -- draw the box and set the visibility
  21251.                   ENTITY_SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  21252.                                        ( GRAPHICS_DATA.PACKAGE_FIGURE,
  21253.                                          BOX_REFERENCE_POINT,
  21254.                                          BOX_SIZE_POINT ) ;
  21255.                   -- points selected were good so continue
  21256.                   exit ;
  21257.                exception
  21258.                   when FIGURE_TOO_NARROW =>
  21259.                      DISPLAY_ERROR("  Figure as defined will be too narrow"
  21260.                                   & " to draw.  " ) ; 
  21261.                   when others =>
  21262.                      raise ;
  21263.                end ;
  21264.             end loop ;
  21265.  
  21266.             GRAPHIC_DRIVER.SET_SEGMENT_VISIBILITY( ENTITY_SEGMENT,
  21267.                            GKS_SPECIFICATION.VISIBLE ) ;
  21268.  
  21269.             -- If enclosed entities exist then archive the tree
  21270.             if ENCLOSURE_EXISTS then
  21271.                ARCHIVE_THE_TREE ;
  21272.             end if ;
  21273.  
  21274.             -- create and update the TREE and GRAPH nodes
  21275.             TREE_NODE := GET_NEW_TREE_NODE (TYPE_PACKAGE) ;
  21276.             SET_PARENT (TREE_NODE, PARENT, CONTAINED_LIST) ;
  21277.  
  21278.             GRAPH_NODE := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21279.             TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  21280.  
  21281.             -- place the graph information in the graph node 
  21282.             GRAPH(GRAPH_NODE).DATA.LOCATION := BOX_REFERENCE_POINT ;
  21283.             GRAPH(GRAPH_NODE).DATA.SIZE := BOX_SIZE_POINT ;
  21284.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := ENTITY_SEGMENT ;
  21285.  
  21286.             -- If the created entity encloses previously created
  21287.             -- entities then update and verify the tree.
  21288.             if ENCLOSURE_EXISTS then
  21289.                UPDATE_TREE_FOR_CONTAINED_ENTITIES (
  21290.                   PARENT, TREE_NODE, ENCLOSED_ENTITIES ) ;
  21291.                if not CHECK_IF_ANNOTATED_TREE_VALID then
  21292.                   RECOVER_THE_TREE ;
  21293.                   raise CREATION_ERROR ;
  21294.                end if ;
  21295.             end if ;
  21296.  
  21297.             -- prompt user for package name.
  21298.             REQUEST_LABEL( ENTITY_NAME ) ;
  21299.             TREE(TREE_NODE).NAME := ENTITY_NAME ;
  21300.  
  21301.             -- label the package
  21302.             LABEL( LABEL_SEGMENT ,
  21303.                    SIZE_POINT ,
  21304.                    GET_OFFSET_LOCATION( GRAPH_NODE ) ,
  21305.                    GET_LABEL_STRING( TREE_NODE ) ,
  21306.                    ENTITY_COLOR (GRAPHICS_DATA.PACKAGE_FIGURE) ) ;
  21307.             GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  21308.  
  21309.             -- set the packages generic status
  21310.             case GENERIC_TYPE is
  21311.                when GENERIC_DECL_CMD =>
  21312.                   TREE(TREE_NODE).GENERIC_STATUS := GENERIC_DECLARATION ;
  21313.                   LABEL( LABEL_SEGMENT ,
  21314.                          SIZE_POINT ,
  21315.                          GET_GENERIC_OFFSET_LOCATION( GRAPH_NODE ) ,
  21316.                          GET_GENERIC_LABEL_STRING( TREE_NODE ) ,
  21317.                          ENTITY_COLOR (GRAPHICS_DATA.PACKAGE_FIGURE) ) ;
  21318.                   GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID := LABEL_SEGMENT ;
  21319.                when GENERIC_INST_CMD =>
  21320.                   TREE(TREE_NODE).GENERIC_STATUS :=
  21321.                      GENERIC_INSTANTIATION ;
  21322.                   -- set the CU instantiated
  21323.                   REQUEST_LABEL (TREE(TREE_NODE).CU_INSTANTIATED,
  21324.                                  " enter the name of the compilation" &
  21325.                                  " unit to be instantiated ") ;
  21326.                   LABEL( LABEL_SEGMENT ,
  21327.                          SIZE_POINT ,
  21328.                          GET_GENERIC_OFFSET_LOCATION( GRAPH_NODE ) ,
  21329.                          GET_GENERIC_LABEL_STRING( TREE_NODE ) ,
  21330.                          ENTITY_COLOR (GRAPHICS_DATA.PACKAGE_FIGURE) ) ;
  21331.                   GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID := LABEL_SEGMENT ;
  21332.                when others =>
  21333.                   TREE(TREE_NODE).GENERIC_STATUS := NOT_GENERIC ;
  21334.             end case ;
  21335.  
  21336.             PROLOGUE_NODE := GET_NEW_PROLOGUE_NODE (TREE_NODE) ;
  21337.             -- prompt user for PROLOGUE.
  21338.             REQUEST_PROLOGUE(PROLOGUE_NODE) ;
  21339.             TREE(TREE_NODE).PROLOGUE_PTR := PROLOGUE_NODE ;
  21340.  
  21341.             -- set menu window active.
  21342.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21343.  
  21344.          when TASK_CMD =>
  21345.             -- create a task
  21346.             -- set graphics window active.
  21347.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21348.  
  21349.             -- continue prompting for points until a good entity is drawn
  21350.             loop
  21351.                begin
  21352.                   -- turn on the abort icon
  21353.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21354.                   -- get box points in proper scope
  21355.                   REQUEST_POINTS (BOX_REFERENCE_POINT,
  21356.                                   BOX_SIZE_POINT,
  21357.                                   PARENT,
  21358.                                   ENCLOSED_ENTITIES, ENCLOSURE_EXISTS ) ;
  21359.                   -- turn off the abort icon
  21360.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21361.  
  21362.                   -- check for valid parent for a task 
  21363.                   if PARENT = ROOT_NODE then
  21364.                      DISPLAY_ERROR( " invalid, tasks must be placed within "
  21365.                                     & "packages or subprograms ") ;
  21366.                      raise CREATION_ERROR ;
  21367.                   elsif TREE( PARENT ).NODE_TYPE not in 
  21368.                         TYPE_VIRTUAL_PACKAGE .. TYPE_TASK then
  21369.                      DISPLAY_ERROR(" invalid scope due to wrong parent type ");
  21370.                      raise CREATION_ERROR ;
  21371.                   elsif CHECK_IF_GENERIC_INSTAN (PARENT) then
  21372.                      DISPLAY_ERROR (" no objects can be placed inside" &
  21373.                                     " an instantiated unit ") ;
  21374.                      raise CREATION_ERROR ;
  21375.                   end if ;
  21376.                   -- draw the task and set the visibility
  21377.                   ENTITY_SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  21378.                                        ( GRAPHICS_DATA.TASK_FIGURE,
  21379.                                          BOX_REFERENCE_POINT,
  21380.                                          BOX_SIZE_POINT ) ;
  21381.                   -- points selected were good so continue
  21382.                   exit ;
  21383.                exception
  21384.                   when FIGURE_TOO_NARROW =>
  21385.                      DISPLAY_ERROR("  Figure as defined will be too narrow"
  21386.                                   & " to draw.  " ) ; 
  21387.                   when others =>
  21388.                      raise ;
  21389.                end ;
  21390.             end loop ;
  21391.  
  21392.             GRAPHIC_DRIVER.SET_SEGMENT_VISIBILITY( ENTITY_SEGMENT,
  21393.                            GKS_SPECIFICATION.VISIBLE ) ;
  21394.  
  21395.             -- If enclosed entities exist then archive the tree
  21396.             if ENCLOSURE_EXISTS then
  21397.                ARCHIVE_THE_TREE ;
  21398.             end if ;
  21399.  
  21400.             -- create and update the TREE and GRAPH nodes
  21401.             TREE_NODE     := GET_NEW_TREE_NODE (TYPE_TASK) ;
  21402.  
  21403.             SET_PARENT (TREE_NODE, PARENT, CONTAINED_LIST) ;
  21404.             GRAPH_NODE                   := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21405.             TREE(TREE_NODE).GRAPH_DATA   := GRAPH_NODE ;
  21406.             -- place the graph information in the graph node 
  21407.             GRAPH(GRAPH_NODE).DATA.LOCATION   := BOX_REFERENCE_POINT ;
  21408.             GRAPH(GRAPH_NODE).DATA.SIZE       := BOX_SIZE_POINT ;
  21409.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := ENTITY_SEGMENT ;
  21410.  
  21411.             -- If the created entity encloses previously created
  21412.             -- entities then update and verify the tree.
  21413.             if ENCLOSURE_EXISTS then
  21414.                UPDATE_TREE_FOR_CONTAINED_ENTITIES (
  21415.                   PARENT, TREE_NODE, ENCLOSED_ENTITIES ) ;
  21416.                if not CHECK_IF_ANNOTATED_TREE_VALID then
  21417.                   RECOVER_THE_TREE ;
  21418.                   raise CREATION_ERROR ;
  21419.                end if ;
  21420.             end if ;
  21421.  
  21422.             -- prompt user for package name.
  21423.             REQUEST_LABEL( ENTITY_NAME ) ;
  21424.             TREE(TREE_NODE).NAME := ENTITY_NAME ;
  21425.  
  21426.             -- label the drawn task
  21427.             LABEL( LABEL_SEGMENT ,
  21428.                    SIZE_POINT ,
  21429.                    GET_OFFSET_LOCATION( GRAPH_NODE ) ,
  21430.                    GET_LABEL_STRING( TREE_NODE ) ,
  21431.                    ENTITY_COLOR (GRAPHICS_DATA.TASK_FIGURE) ) ;
  21432.             GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  21433.  
  21434.             PROLOGUE_NODE := GET_NEW_PROLOGUE_NODE (TREE_NODE) ;
  21435.             -- prompt user for PROLOGUE.
  21436.             REQUEST_PROLOGUE(PROLOGUE_NODE) ;
  21437.             TREE(TREE_NODE).PROLOGUE_PTR := PROLOGUE_NODE ;
  21438.             -- set menu window active.
  21439.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21440.  
  21441.          when ENTRY_PT_CMD =>
  21442.             -- add an entry point declaration
  21443.             -- get entry point status for a real task entry point
  21444.  
  21445.             ENTRY_POINT_STAT := CONTROL_ENTRY_POINT_STATUS_MENU ;
  21446.             PARAM_STATUS := CONTROL_PARAMETER_STATUS_MENU ;
  21447.  
  21448.             -- set graphics window active
  21449.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21450.  
  21451.             -- turn on the abort icon
  21452.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21453.             -- request the user identify the scope for entry
  21454.             REQUEST_POINT ("enter point identifying scope and vertical position of entry point",
  21455.                      LABEL_POINT, 
  21456.                      PARENT,
  21457.                      LABEL_CREATE => LABEL_EXPORT ) ;
  21458.             -- turn off the abort icon
  21459.             GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21460.  
  21461.             -- check for a valid parent
  21462.             if PARENT = NULL_POINTER or else
  21463.                  TREE(PARENT).NODE_TYPE /= TYPE_TASK then 
  21464.                DISPLAY_ERROR (" invalid, entry point must be placed within a task ") ;
  21465.                raise CREATION_ERROR ;
  21466.             end if ;
  21467.  
  21468.             -- prompt user for export name.
  21469.             REQUEST_LABEL( ENTITY_NAME ) ;
  21470.  
  21471.             --
  21472.             -- create and update the TREE and GRAPH nodes
  21473.             --
  21474.             TREE_NODE := GET_NEW_TREE_NODE (TYPE_ENTRY_POINT) ;
  21475.             SET_PARENT (TREE_NODE, PARENT, ENTRY_LIST) ;
  21476.             if ENTRY_POINT_STAT = GUARDED_CMD then
  21477.                TREE(TREE_NODE).IS_GUARDED := TRUE ;
  21478.             end if ;
  21479.             if PARAM_STATUS = HAS_PARAMETERS_CMD then
  21480.                TREE(TREE_NODE).WITH_PARAMETERS := TRUE ;
  21481.             end if ;
  21482.  
  21483.             TREE(TREE_NODE).NAME := ENTITY_NAME ;
  21484.             GRAPH_NODE := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21485.             TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  21486.  
  21487.             -- place the graph information in the graph node
  21488.             LABEL_POINT.X := GRAPHIC_DRIVER.PARALLELOGRAM_POINTS (
  21489.                              GRAPH(TREE(PARENT).GRAPH_DATA).DATA.LOCATION ,
  21490.                              GRAPH(TREE(PARENT).GRAPH_DATA).DATA.SIZE ,
  21491.                              LABEL_POINT.Y ) -
  21492.                              IMPORT_EXPORT_X_OFFSET ;
  21493.  
  21494.             GRAPH(GRAPH_NODE).DATA.LOCATION := LABEL_POINT ;
  21495.             LABEL( LABEL_SEGMENT ,
  21496.                    SIZE_POINT , 
  21497.                    GET_OFFSET_LOCATION ( GRAPH_NODE ) ,
  21498.                    GET_LABEL_STRING ( TREE_NODE ) ,
  21499.                    ENTITY_COLOR ( GET_FIGURE_TYPE
  21500.                               ( TREE(PARENT).NODE_TYPE ) ) ) ;
  21501.             --
  21502.             -- place the graph information in the graph node
  21503.             GRAPH(GRAPH_NODE).DATA.SIZE := SIZE_POINT ;
  21504.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := NULL_SEGMENT ;
  21505.             GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  21506.  
  21507.             -- set menu window active.
  21508.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21509.  
  21510.          when PROCEDURE_CMD | FUNCTION_CMD =>
  21511.             -- create a procedure or function
  21512.             -- check if the package should be generic
  21513.             GENERIC_TYPE := CONTROL_GENERIC_MENU ;
  21514.             -- check the parameter status
  21515.             PARAM_STATUS := CONTROL_PARAMETER_STATUS_MENU ;
  21516.             -- restore the design menu
  21517.             DISPLAY_MENU( MENU_ID'(DESIGN_MENU), COMMAND ) ;
  21518.             -- set graphics window active.
  21519.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21520.  
  21521.             -- continue prompting for points until a good entity is drawn
  21522.             loop
  21523.                begin
  21524.                   -- turn on the abort icon
  21525.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21526.                   -- get box points in proper scope
  21527.                   REQUEST_POINTS (BOX_REFERENCE_POINT,
  21528.                                   BOX_SIZE_POINT,
  21529.                                   PARENT,
  21530.                                   ENCLOSED_ENTITIES, ENCLOSURE_EXISTS ) ;
  21531.                   -- turn off the abort icon
  21532.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21533.  
  21534.                   -- check for valid parent for subprogram
  21535.                   if PARENT = NULL_POINTER or else
  21536.                      TREE(PARENT).NODE_TYPE not in ROOT .. TYPE_TASK then
  21537.                      DISPLAY_ERROR(" invalid scope due to wrong parent type ") ;
  21538.                      raise CREATION_ERROR ;
  21539.                   elsif CHECK_IF_GENERIC_INSTAN (PARENT)
  21540.                      or
  21541.                      (  GENERIC_TYPE = GENERIC_INST_CMD and
  21542.                         ENCLOSURE_EXISTS ) then
  21543.                      DISPLAY_ERROR (" no objects can be placed inside" &
  21544.                                     " an instantiated unit ") ;
  21545.                      raise CREATION_ERROR ;
  21546.                   end if ;
  21547.  
  21548.                   -- draw the subprogram and set the visibility
  21549.                   ENTITY_SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  21550.                                        ( GRAPHICS_DATA.SUBPROGRAM_FIGURE,
  21551.                                          BOX_REFERENCE_POINT,
  21552.                                          BOX_SIZE_POINT ) ;
  21553.                   -- points selected were good so continue
  21554.                   exit ;
  21555.                exception
  21556.                   when FIGURE_TOO_NARROW =>
  21557.                      DISPLAY_ERROR("  Figure as defined will be too narrow"
  21558.                                   & " to draw.  " ) ; 
  21559.                   when others =>
  21560.                      raise ;
  21561.                end ;
  21562.             end loop ;
  21563.  
  21564.             GRAPHIC_DRIVER.SET_SEGMENT_VISIBILITY( ENTITY_SEGMENT,
  21565.                            GKS_SPECIFICATION.VISIBLE ) ;
  21566.  
  21567.             -- If enclosed entities exist then archive the tree
  21568.             if ENCLOSURE_EXISTS then
  21569.                ARCHIVE_THE_TREE ;
  21570.             end if ;
  21571.  
  21572.             -- create and update the TREE and GRAPH nodes
  21573.             if COMMAND = PROCEDURE_CMD then
  21574.                TREE_NODE := GET_NEW_TREE_NODE (TYPE_PROCEDURE) ;
  21575.             else
  21576.                TREE_NODE := GET_NEW_TREE_NODE (TYPE_FUNCTION) ;
  21577.             end if ;
  21578.  
  21579.             SET_PARENT (TREE_NODE, PARENT, CONTAINED_LIST) ;
  21580.             GRAPH_NODE                        := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21581.             TREE(TREE_NODE).GRAPH_DATA        := GRAPH_NODE ;
  21582.             if PARAM_STATUS = HAS_PARAMETERS_CMD then
  21583.                TREE(TREE_NODE).HAS_PARAMETERS := TRUE ;
  21584.             end if ;
  21585.  
  21586.             -- place the graph information in the graph node 
  21587.             GRAPH(GRAPH_NODE).DATA.LOCATION   := BOX_REFERENCE_POINT ;
  21588.             GRAPH(GRAPH_NODE).DATA.SIZE       := BOX_SIZE_POINT ;
  21589.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := ENTITY_SEGMENT ;
  21590.  
  21591.             -- If the created entity encloses previously created
  21592.             -- entities then update and verify the tree.
  21593.             if ENCLOSURE_EXISTS then
  21594.                UPDATE_TREE_FOR_CONTAINED_ENTITIES (
  21595.                   PARENT, TREE_NODE, ENCLOSED_ENTITIES ) ;
  21596.                if not CHECK_IF_ANNOTATED_TREE_VALID then
  21597.                   RECOVER_THE_TREE ;
  21598.                   raise CREATION_ERROR ;
  21599.                end if ;
  21600.             end if ;
  21601.  
  21602.             -- prompt user for subprogram name.
  21603.             if COMMAND = PROCEDURE_CMD then
  21604.                REQUEST_LABEL( ENTITY_NAME ) ;
  21605.             else -- functions allow overloading
  21606.                REQUEST_LABEL( ENTITY_NAME, FALSE, TRUE ) ;
  21607.             end if ;
  21608.  
  21609.             TREE(TREE_NODE).NAME := ENTITY_NAME ;
  21610.  
  21611.             -- label the drawn subprogram
  21612.             LABEL( LABEL_SEGMENT ,
  21613.                    SIZE_POINT ,
  21614.                    GET_OFFSET_LOCATION( GRAPH_NODE ) ,
  21615.                    GET_LABEL_STRING( TREE_NODE ) ,
  21616.                    ENTITY_COLOR (GRAPHICS_DATA.SUBPROGRAM_FIGURE) ) ;
  21617.             GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  21618.  
  21619.             -- set the packages generic status
  21620.             case GENERIC_TYPE is
  21621.                when GENERIC_DECL_CMD =>
  21622.                   TREE(TREE_NODE).GENERIC_STATUS := GENERIC_DECLARATION ;
  21623.                   LABEL( LABEL_SEGMENT ,
  21624.                          SIZE_POINT ,
  21625.                          GET_GENERIC_OFFSET_LOCATION( GRAPH_NODE ) ,
  21626.                          GET_GENERIC_LABEL_STRING( TREE_NODE ) ,
  21627.                          ENTITY_COLOR (GRAPHICS_DATA.SUBPROGRAM_FIGURE)) ;
  21628.                   GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID := LABEL_SEGMENT ;
  21629.                when GENERIC_INST_CMD =>
  21630.                   TREE(TREE_NODE).GENERIC_STATUS := GENERIC_INSTANTIATION ;
  21631.                   -- set the CU instantiated
  21632.                   if COMMAND = PROCEDURE_CMD then
  21633.                      REQUEST_LABEL (TREE(TREE_NODE).CU_INSTANTIATED,
  21634.                                     " enter the name of the compilation" &
  21635.                                     " unit to be instantiated ") ;
  21636.                   else -- function can be overloaded
  21637.                      REQUEST_LABEL (TREE(TREE_NODE).CU_INSTANTIATED,
  21638.                                  " enter the name of the compilation" &
  21639.                                  " unit to be instantiated ",
  21640.                                  FALSE, TRUE ) ;
  21641.                   end if ;
  21642.  
  21643.                   LABEL( LABEL_SEGMENT ,
  21644.                          SIZE_POINT ,
  21645.                          GET_GENERIC_OFFSET_LOCATION( GRAPH_NODE ) ,
  21646.                          GET_GENERIC_LABEL_STRING( TREE_NODE ) ,
  21647.                          ENTITY_COLOR( GRAPHICS_DATA.SUBPROGRAM_FIGURE)) ;
  21648.                   GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID := LABEL_SEGMENT ;
  21649.                when others =>
  21650.                   TREE(TREE_NODE).GENERIC_STATUS := NOT_GENERIC ;
  21651.             end case ;
  21652.  
  21653.             PROLOGUE_NODE := GET_NEW_PROLOGUE_NODE (TREE_NODE) ;
  21654.             -- prompt user for PROLOGUE.
  21655.             REQUEST_PROLOGUE(PROLOGUE_NODE) ;
  21656.             TREE(TREE_NODE).PROLOGUE_PTR      := PROLOGUE_NODE ;
  21657.  
  21658.             -- set menu window active.
  21659.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21660.  
  21661.          when ANNOTATION_CMD =>
  21662.             DUMMY := CONTROL_ANNOTATING_MENU ;
  21663.  
  21664.          when BODY_CMD =>
  21665.             -- create a body
  21666.             -- set graphics window active.
  21667.             GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21668.  
  21669.             -- continue prompting for points until a good entity is drawn
  21670.             loop
  21671.                begin
  21672.                   -- turn on the abort icon
  21673.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21674.                   -- get box points in proper scope
  21675.                   REQUEST_POINTS (BOX_REFERENCE_POINT,
  21676.                                   BOX_SIZE_POINT,
  21677.                                   PARENT,
  21678.                                   ENCLOSED_ENTITIES, ENCLOSURE_EXISTS ) ;
  21679.                   -- turn off the abort icon
  21680.                   GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21681.  
  21682.                   -- check for valid parent for a body
  21683.                   if PARENT = NULL_POINTER or else 
  21684.                      TREE(PARENT).NODE_TYPE not in TYPE_VIRTUAL_PACKAGE ..
  21685.                      TYPE_TASK then 
  21686.                      DISPLAY_ERROR(" invalid scope due to wrong parent type ") ;
  21687.                      raise CREATION_ERROR ;
  21688.                   elsif CHECK_IF_GENERIC_INSTAN (PARENT) then
  21689.                      DISPLAY_ERROR (" no objects can be placed inside" &
  21690.                                     " an instantiated unit ") ;
  21691.                      raise CREATION_ERROR ;
  21692.                   elsif TREE(PARENT).BODY_PTR /= NULL_POINTER then
  21693.                      DISPLAY_ERROR( " invalid, parent already has an "
  21694.                                    & "executing body ");
  21695.                      raise CREATION_ERROR ;
  21696.                   end if ;
  21697.                   -- load the proper body color
  21698.                   case TREE(PARENT).NODE_TYPE is
  21699.                      when TYPE_VIRTUAL_PACKAGE =>
  21700.                         ENTITY_COLOR(BODY_FIGURE) := 
  21701.                            ENTITY_COLOR (VIRTUAL_PKG_FIGURE) ;
  21702.                      when TYPE_PACKAGE =>
  21703.                         ENTITY_COLOR(BODY_FIGURE) := 
  21704.                            ENTITY_COLOR (PACKAGE_FIGURE) ;
  21705.                      when TYPE_PROCEDURE | TYPE_FUNCTION =>
  21706.                         ENTITY_COLOR(BODY_FIGURE) := 
  21707.                            ENTITY_COLOR (SUBPROGRAM_FIGURE) ;
  21708.                      when TYPE_TASK =>
  21709.                         ENTITY_COLOR(BODY_FIGURE) := 
  21710.                            ENTITY_COLOR (TASK_FIGURE) ;
  21711.                      when others =>
  21712.                         null ;
  21713.                   end case ;
  21714.                   -- draw the body and set the visibility
  21715.                   ENTITY_SEGMENT := GRAPHIC_DRIVER.DRAW_FIGURE
  21716.                                        ( GRAPHICS_DATA.BODY_FIGURE,
  21717.                                          BOX_REFERENCE_POINT,
  21718.                                          BOX_SIZE_POINT ) ;
  21719.                   -- points selected were good so continue
  21720.                   exit ;
  21721.                exception
  21722.                   when FIGURE_TOO_NARROW =>
  21723.                      DISPLAY_ERROR("  Figure as defined will be too narrow"
  21724.                                   & " to draw.  " ) ; 
  21725.                   when others =>
  21726.                      raise ;
  21727.                end ;
  21728.             end loop ;
  21729.  
  21730.             GRAPHIC_DRIVER.SET_SEGMENT_VISIBILITY( ENTITY_SEGMENT,
  21731.                            GKS_SPECIFICATION.VISIBLE ) ;
  21732.             -- set menu window active.
  21733.             GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21734.             --
  21735.             -- create and update the TREE and GRAPH nodes
  21736.             --
  21737.             TREE_NODE              := GET_NEW_TREE_NODE (TYPE_BODY) ;
  21738.             TREE(TREE_NODE).NAME   := TREE_DATA.NULL_NAME ;
  21739.             TREE(PARENT).BODY_PTR  := TREE_NODE ;
  21740.             TREE(TREE_NODE).PARENT := PARENT ;
  21741.             MAKE_REFERENCE( PARENT, TREE_NODE ) ;
  21742.  
  21743.             GRAPH_NODE                 := GET_NEW_GRAPH_NODE(TREE_NODE) ;
  21744.             TREE(TREE_NODE).GRAPH_DATA := GRAPH_NODE ;
  21745.             -- place the graph information in the graph node 
  21746.             GRAPH(GRAPH_NODE).DATA.LOCATION   := BOX_REFERENCE_POINT ;
  21747.             GRAPH(GRAPH_NODE).DATA.SIZE       := BOX_SIZE_POINT ;
  21748.             GRAPH(GRAPH_NODE).DATA.SEGMENT_ID := ENTITY_SEGMENT ;
  21749.  
  21750.          when others =>
  21751.             -- this should not occur
  21752.             null ;
  21753.       end case ; -- COMMAND
  21754.  
  21755.    exception
  21756.       when HANDLE_RESTART =>
  21757.          --  exception used to return to the main menu
  21758.          raise ;
  21759.       when HANDLE_ABORT_BACKUP =>
  21760.          --  execption used to return to create menu
  21761.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21762.       when CREATION_ERROR =>
  21763.          -- user already notified of error,
  21764.          -- turn off the abort icon
  21765.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21766.          -- set menu window active.
  21767.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21768.       when OPERATION_ABORTED_BY_OPERATOR =>
  21769.          -- turn off any possible markers
  21770.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  21771.                            START_POINT) ;
  21772.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  21773.                            END_POINT) ;
  21774.          -- turn off the abort icon
  21775.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21776.          -- clear the alpha screen
  21777.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  21778.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  21779.          -- set menu window active.
  21780.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21781.       when others =>
  21782.          -- handle error conditions that might occur
  21783.          -- turn off the marker
  21784.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  21785.                            START_POINT) ;
  21786.          REFERENCE_MARKER (GKS_SPECIFICATION.INVISIBLE,
  21787.                            END_POINT) ;
  21788.          -- turn off the abort icon
  21789.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21790.          -- report the error and continue
  21791.          DISPLAY_ERROR (" PROGRAM ERROR -- in CREATING requested object ") ;
  21792.          TRACE_PKG.TRACE (" PROGRAM ERROR in MMI_DESIGN.CREATE !!!!! ") ;
  21793.          -- set menu window active.
  21794.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21795.  
  21796.    end CREATE ;
  21797.  
  21798.  
  21799.    procedure MODIFY_PROLOGUE
  21800.               ( TREE_NODE : in TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ) is
  21801.    -- =========================================================
  21802.    --  This procedure allows the modification of the PROLOGUE
  21803.    -- =========================================================
  21804.    BLANK_PROLOGUE_LINE : PROLOGUE_LINE := (others => ' ') ;
  21805.    DATA_LINE : PROLOGUE_LINE ;
  21806.    INDICATOR : STRING (1..3) := "   " ;
  21807.    PROMPT    : STRING (1..DATA_LINE'length+INDICATOR'length) ;
  21808.    PROLOGUE_NODE : TREE_DATA.PROLOGUE_NODE_ACCESS_TYPE ;
  21809.    -- start PROLOGUE display(blank line before and after)
  21810.    START_LINE : NATURAL := 23 - (2 + PROLOGUE_COUNT) ;
  21811.  
  21812.    begin
  21813.       PROLOGUE_NODE := TREE(TREE_NODE).PROLOGUE_PTR ;
  21814.  
  21815.       for I in 1 .. PROLOGUE_COUNT loop
  21816.          -- display the current PROLOGUE lines
  21817.          INDICATOR := "   " ;
  21818.          PROMPT := INDICATOR & BLANK_PROLOGUE_LINE ;
  21819.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  21820.             ( PROMPT ,
  21821.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  21822.               ROW_NO( START_LINE ),
  21823.               COL_NO( 1 ) ) ;
  21824.          for J in 1 .. PROLOGUE_COUNT loop
  21825.             if J = I then
  21826.                INDICATOR := "=> " ;
  21827.             else
  21828.                INDICATOR := "   " ;
  21829.             end if ;
  21830.             PROMPT := INDICATOR & PROLOGUE(PROLOGUE_NODE).DATA(J) ;
  21831.             VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  21832.                ( PROMPT ,
  21833.                  CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  21834.                  ROW_NO( START_LINE+J ),
  21835.                  COL_NO( 1 ) ) ;
  21836.          end loop ;
  21837.          INDICATOR := "   " ;
  21838.          PROMPT := INDICATOR & BLANK_PROLOGUE_LINE ;
  21839.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  21840.             ( PROMPT ,
  21841.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  21842.               ROW_NO( START_LINE+PROLOGUE_COUNT+1 ),
  21843.               COL_NO( 1 ) ) ;
  21844.  
  21845.          -- Prompt the operator for the line.
  21846.          VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  21847.             ( "Replace PROLOGUE text line" & INTEGER'image(I) &
  21848.               ", blank or (cr) = no change " ,
  21849.               FORMAT_FCT'( CENTER_A_LINE ) ,
  21850.               ROW_NO( 23 ) ) ;
  21851.  
  21852.          -- Retrieve the operator specified line
  21853.          DATA_LINE := BLANK_PROLOGUE_LINE ;
  21854.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  21855.             ( DATA_LINE , 
  21856.               CURSOR_ADDRESS'(WRITE_WITH_ADDRESS),
  21857.               ROW_NO( 24 ) ,
  21858.               COL_NO( 1 ) ) ;
  21859.          VIRTUAL_TERMINAL_INTERFACE.STRINGIO
  21860.             ( DATA_LINE , 
  21861.               CURSOR_ADDRESS'(READ_WITH_ADDRESS),
  21862.               ROW_NO( 24 ) ,
  21863.               COL_NO( 1 ) ) ;
  21864.  
  21865.          if DATA_LINE /= BLANK_PROLOGUE_LINE then
  21866.             PROLOGUE(PROLOGUE_NODE).DATA(I) := DATA_LINE ;
  21867.          end if ;
  21868.  
  21869.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  21870.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  21871.  
  21872.       end loop ;
  21873.  
  21874.    exception
  21875.       when others =>
  21876.          -- continue with the old parent
  21877.          DISPLAY_ERROR(" PROGRAM ERROR -- in MODIFY_PROLOGUE") ;
  21878.          raise ;
  21879.  
  21880.    end MODIFY_PROLOGUE ;
  21881.  
  21882.  
  21883.    procedure MODIFY_CALL_STAT
  21884.                   ( START_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  21885.    -- =========================================================
  21886.    --  This procedure performs operations required to implement
  21887.    --  a modify param status
  21888.    -- =========================================================
  21889.  
  21890.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  21891.       LINE_NODE_ONE       : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  21892.       CALL_STATUS         : COMMAND_TYPE ;
  21893.       OLD_CALL_STATUS,
  21894.       NEW_CALL_STATUS     : CALL_CONNECTION_TYPE ;
  21895.  
  21896.       LIST_PTR          : TREE_DATA.LIST_NODE_ACCESS_TYPE ;
  21897.       LINE_TREE_NODE    : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  21898.       END_NODE          : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  21899.       END_POINT         : GRAPHICS_DATA.POINT ;
  21900.       ERROR_CALL_STATUS : EXCEPTION ;
  21901.  
  21902.    begin 
  21903.       -- set graph window active.
  21904.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21905.  
  21906.       -- determine the line ending scope
  21907.       LIST_PTR := GET_LIST_HEAD(START_NODE, CALLEE_LIST ) ;
  21908.  
  21909.       if LIST_PTR = NULL_POINTER then
  21910.          -- error, no line exist
  21911.          DISPLAY_ERROR ( "invalid, no line exists" ) ;
  21912.          raise ERROR_CALL_STATUS ;
  21913.       end if ;
  21914.       if LIST(LIST_PTR).NEXT /= NULL_POINTER then 
  21915.          -- more than one line, get ending point
  21916.  
  21917.          -- turn on the abort icon
  21918.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  21919.          REQUEST_POINT ("enter within callee scope for status to be modified",
  21920.                               END_POINT ,
  21921.                               END_NODE ) ;
  21922.          -- turn off the abort icon
  21923.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  21924.  
  21925.          -- scan callee list to match end parent
  21926.          loop
  21927.             LINE_TREE_NODE := LIST(LIST_PTR).ITEM ;
  21928.             exit when TREE(LINE_TREE_NODE).CONNECTEE = END_NODE ;
  21929.  
  21930.             LIST_PTR := LIST(LIST_PTR).NEXT ;
  21931.             if LIST_PTR = NULL_POINTER then
  21932.                -- error, no matching line exists 
  21933.                DISPLAY_ERROR ( "invalid, no line exists for call status modification " ) ;
  21934.                raise ERROR_CALL_STATUS ;
  21935.             end if ;
  21936.          end loop ;
  21937.       else
  21938.          END_NODE := TREE(LIST(LIST_PTR).ITEM).CONNECTEE ;
  21939.       end if ;
  21940.       LINE_TREE_NODE := LIST(LIST_PTR).ITEM ;
  21941.  
  21942.       -- highlite the line just for clarity
  21943.       PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, HILITED ) ;
  21944.  
  21945.       -- Prompt the operator for the status.
  21946.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  21947.          ( "Select desired call status, BACKUP=no chng" ,
  21948.            FORMAT_FCT'( CENTER_A_LINE ) ,
  21949.            ROW_NO( 23 ) ) ;
  21950.  
  21951.       -- set menu window active
  21952.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  21953.  
  21954.       -- perform a modify operation on call status
  21955.       CALL_STATUS := CONTROL_CALL_STATUS_MENU ;
  21956.  
  21957.       -- set graph window active.
  21958.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  21959.  
  21960.       OLD_CALL_STATUS := TREE( LINE_TREE_NODE ).CALL_VARIETY ;
  21961.       NEW_CALL_STATUS := OLD_CALL_STATUS ;
  21962.       if CALL_STATUS = UNCONDITIONAL_CMD then
  21963.          NEW_CALL_STATUS := NORMAL ;
  21964.       elsif CALL_STATUS = TIMED_CMD then
  21965.          NEW_CALL_STATUS := TIMED ;
  21966.       elsif CALL_STATUS = CONDITIONAL_CMD then
  21967.          NEW_CALL_STATUS := CONDITIONAL ;
  21968.       end if ;
  21969.  
  21970.       if NEW_CALL_STATUS /= OLD_CALL_STATUS then
  21971.          -- if timed call, then check for validity
  21972.          if CALL_STATUS = TIMED_CMD then
  21973.             case TREE(END_NODE).NODE_TYPE is
  21974.                when TYPE_PROCEDURE | TYPE_FUNCTION | 
  21975.                     IMPORTED_PROCEDURE | IMPORTED_FUNCTION |
  21976.                     EXPORTED_PROCEDURE | EXPORTED_FUNCTION =>
  21977.                   DISPLAY_ERROR ( "invalid, subprogram call status cannot be timed" ) ;
  21978.                   -- restore to not highlited
  21979.                   PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, 
  21980.                                           RESTORED ) ;
  21981.                   raise ERROR_CALL_STATUS ;
  21982.  
  21983.                when others =>
  21984.                   null ;
  21985.             end case ;
  21986.          end if ;
  21987.  
  21988.          -- restore to not highlited
  21989.          PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, 
  21990.                                  RESTORED ) ;
  21991.  
  21992.          -- locate the label marking
  21993.          LINE_NODE_ONE := TREE( LINE_TREE_NODE ).LINE(1) ;
  21994.          -- now delete the old marking
  21995.          if OLD_CALL_STATUS /= NORMAL then
  21996.             GRAPHIC_DRIVER.DELETE_SEGMENT
  21997.                         ( GRAPH(LINE_NODE_ONE).DATA.LABEL_SEG_ID ) ;
  21998.             GRAPH(LINE_NODE_ONE).DATA.LABEL_SEG_ID := NULL_SEGMENT ;
  21999.          end if ;
  22000.          -- assign the new call status
  22001.          TREE(LINE_TREE_NODE).CALL_VARIETY := NEW_CALL_STATUS ;
  22002.  
  22003.          -- display call marking and assign the new segment id into the tree
  22004.          LABEL_CALL_MARKING( LINE_TREE_NODE ) ;
  22005.  
  22006.       else -- no change in marking
  22007.          -- restore to not highlited
  22008.          PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, 
  22009.                                  RESTORED ) ;
  22010.       end if ;
  22011.  
  22012.       -- clear the alpha screen
  22013.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22014.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22015.       -- set menu window active
  22016.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22017.  
  22018.    exception
  22019.       when HANDLE_ABORT_BACKUP =>
  22020.          -- set graph window active.
  22021.          GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22022.          -- clear the alpha screen
  22023.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22024.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22025.          --  execption used to return to backup
  22026.          PERFORM_GRAPH_TREE_OP ( LINE_TREE_NODE, RESTORED ) ;
  22027.          -- turn off the abort icon
  22028.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22029.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22030.       when ERROR_CALL_STATUS =>
  22031.          -- turn off the abort icon
  22032.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22033.          -- set menu window active
  22034.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22035.       when OPERATION_ABORTED_BY_OPERATOR =>
  22036.          -- turn off the abort icon
  22037.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22038.          -- clear the alpha screen
  22039.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22040.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22041.          -- set menu window active.
  22042.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22043.       when others =>
  22044.          -- handle error conditions that might occur
  22045.          -- report the error and continue
  22046.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_CALL_STAT") ;
  22047.          -- turn off the abort icon
  22048.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22049.          -- set menu window active
  22050.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22051.  
  22052.    end MODIFY_CALL_STAT ;
  22053.  
  22054.  
  22055.    procedure MODIFY_SUBPROGRAM_PARAM_STAT
  22056.                   ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  22057.    -- =========================================================
  22058.    --  This procedure performs operations required to implement
  22059.    --  a modify param status
  22060.    -- =========================================================
  22061.  
  22062.       PARENT_ENTITY       : GRAPHICS_DATA.GRAPHIC_ENTITY := PACKAGE_FIGURE ;
  22063.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  22064.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  22065.       SIZE_POINT          : GRAPHICS_DATA.POINT ;
  22066.       LABEL_POINT         : GRAPHICS_DATA.POINT ;
  22067.       PARAM_STATUS        : COMMAND_TYPE ;
  22068.       OLD_NODE_STATUS     : BOOLEAN ;
  22069.       REFERENCE_POINT     : GRAPHICS_DATA.POINT ;
  22070.       COLOR               : GRAPHICS_DATA.COLOR_TYPE ;
  22071.  
  22072.    begin 
  22073.  
  22074.       -- Prompt the operator for the status.
  22075.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  22076.          ( "Select desired parameter status, BACKUP=no chng" ,
  22077.            FORMAT_FCT'( CENTER_A_LINE ) ,
  22078.            ROW_NO( 23 ) ) ;
  22079.  
  22080.       -- set menu window active
  22081.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22082.  
  22083.       -- perform a modify operation on parameter status
  22084.       -- set graphic window active
  22085.       PARAM_STATUS := CONTROL_PARAMETER_STATUS_MENU ;
  22086.  
  22087.       -- set graph window active
  22088.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22089.  
  22090.       OLD_NODE_STATUS := TREE( TREE_NODE ).HAS_PARAMETERS ;
  22091.       if PARAM_STATUS = HAS_PARAMETERS_CMD then
  22092.          TREE( TREE_NODE ).HAS_PARAMETERS := TRUE ;
  22093.       elsif PARAM_STATUS = NO_PARAMETERS_CMD then
  22094.          TREE( TREE_NODE ).HAS_PARAMETERS := FALSE ;
  22095.       end if ;
  22096.  
  22097.       -- if the status has changed, then redisplay the name
  22098.       if TREE( TREE_NODE ).HAS_PARAMETERS xor OLD_NODE_STATUS then 
  22099.          -- determine color for display 
  22100.          PARENT_ENTITY := GET_FIGURE_TYPE ( TREE(TREE_NODE).NODE_TYPE ) ;
  22101.          COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  22102.  
  22103.          GRAPH_NODE := TREE( TREE_NODE ).GRAPH_DATA ;
  22104.          -- now delete the old label
  22105.          GRAPHIC_DRIVER.DELETE_SEGMENT
  22106.                         ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID ) ;
  22107.          -- display the new name and get the new segment id 
  22108.          LABEL ( LABEL_SEGMENT ,
  22109.                  SIZE_POINT ,
  22110.                  GET_OFFSET_LOCATION (GRAPH_NODE) ,
  22111.                  GET_LABEL_STRING (TREE_NODE) ,
  22112.                  COLOR ) ;
  22113.  
  22114.          -- assign the new segment id into the tree
  22115.          GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  22116.  
  22117.       end if ;
  22118.  
  22119.       -- clear the alpha screen
  22120.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22121.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22122.       -- set menu window active
  22123.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22124.  
  22125.    exception
  22126.  
  22127.       when HANDLE_ABORT_BACKUP =>
  22128.          -- clear the alpha screen
  22129.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22130.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22131.          --  execption used to return to backup
  22132.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22133.  
  22134.       when others =>
  22135.          -- handle error conditions that might occur
  22136.          -- report the error and continue
  22137.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_SUBPROGRAM_PARAM_STAT") ;
  22138.  
  22139.    end MODIFY_SUBPROGRAM_PARAM_STAT ;
  22140.  
  22141.  
  22142.    procedure MODIFY_ENTRY_PARAM_STAT
  22143.                   ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  22144.    -- =========================================================
  22145.    --  This procedure performs operations required to implement
  22146.    --  a modify param status
  22147.    -- =========================================================
  22148.  
  22149.       PARENT_ENTITY       : GRAPHICS_DATA.GRAPHIC_ENTITY := PACKAGE_FIGURE ;
  22150.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  22151.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  22152.       SIZE_POINT          : GRAPHICS_DATA.POINT ;
  22153.       LABEL_POINT         : GRAPHICS_DATA.POINT ;
  22154.       PARAM_STATUS        : COMMAND_TYPE ;
  22155.       OLD_NODE_STATUS     : BOOLEAN ;
  22156.       REFERENCE_POINT     : GRAPHICS_DATA.POINT ;
  22157.       COLOR               : GRAPHICS_DATA.COLOR_TYPE :=
  22158.                                ENTITY_COLOR (TASK_FIGURE) ;
  22159.  
  22160.    begin 
  22161.  
  22162.       -- Prompt the operator for the status.
  22163.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  22164.          ( "Select desired parameter status, BACKUP=no chng" ,
  22165.            FORMAT_FCT'( CENTER_A_LINE ) ,
  22166.            ROW_NO( 23 ) ) ;
  22167.  
  22168.       -- set menu window active
  22169.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22170.  
  22171.       -- perform a modify operation on parameter status
  22172.       -- set graphic window active
  22173.       PARAM_STATUS := CONTROL_PARAMETER_STATUS_MENU ;
  22174.  
  22175.       -- set graph window active
  22176.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22177.  
  22178.       OLD_NODE_STATUS := TREE( TREE_NODE ).WITH_PARAMETERS ;
  22179.       if PARAM_STATUS = HAS_PARAMETERS_CMD then
  22180.          TREE( TREE_NODE ).WITH_PARAMETERS := TRUE ;
  22181.       elsif PARAM_STATUS = NO_PARAMETERS_CMD then
  22182.          TREE( TREE_NODE ).WITH_PARAMETERS := FALSE ;
  22183.       end if ;
  22184.  
  22185.       -- if the status has changed, then redisplay the name
  22186.       if TREE( TREE_NODE ).WITH_PARAMETERS xor OLD_NODE_STATUS then 
  22187.  
  22188.          GRAPH_NODE := TREE( TREE_NODE ).GRAPH_DATA ;
  22189.          -- now delete the old label
  22190.          GRAPHIC_DRIVER.DELETE_SEGMENT
  22191.                         ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID ) ;
  22192.          -- display the new name and get the new segment id 
  22193.          LABEL ( LABEL_SEGMENT ,
  22194.                  SIZE_POINT ,
  22195.                  GET_OFFSET_LOCATION (GRAPH_NODE) ,
  22196.                  GET_LABEL_STRING (TREE_NODE) ,
  22197.                  COLOR ) ;
  22198.  
  22199.          -- assign the new segment id into the tree
  22200.          GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  22201.  
  22202.       end if ;
  22203.  
  22204.       -- clear the alpha screen
  22205.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22206.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22207.       -- set menu window active
  22208.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22209.  
  22210.    exception
  22211.  
  22212.       when HANDLE_ABORT_BACKUP =>
  22213.          -- clear the alpha screen
  22214.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22215.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22216.          --  execption used to return to backup
  22217.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22218.  
  22219.       when others =>
  22220.          -- handle error conditions that might occur
  22221.          -- report the error and continue
  22222.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_ENTRY_PARAM_STAT") ;
  22223.  
  22224.    end MODIFY_ENTRY_PARAM_STAT ;
  22225.  
  22226.  
  22227.    procedure MODIFY_ENTRY_STAT
  22228.                   ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  22229.    -- =========================================================
  22230.    --  This procedure performs operations required to implement
  22231.    --  a modify entry status
  22232.    -- =========================================================
  22233.  
  22234.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  22235.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  22236.       SIZE_POINT          : GRAPHICS_DATA.POINT ;
  22237.       LABEL_POINT         : GRAPHICS_DATA.POINT ;
  22238.       ENTRY_POINT_STAT    : COMMAND_TYPE ;
  22239.       OLD_NODE_STATUS     : BOOLEAN ;
  22240.       COLOR               : GRAPHICS_DATA.COLOR_TYPE :=
  22241.                                ENTITY_COLOR (TASK_FIGURE) ;
  22242.  
  22243.    begin 
  22244.  
  22245.       -- Prompt the operator for the status.
  22246.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  22247.          ( "Select desired entry point status, BACKUP=no chng" ,
  22248.            FORMAT_FCT'( CENTER_A_LINE ) ,
  22249.            ROW_NO( 23 ) ) ;
  22250.  
  22251.       -- set menu window active
  22252.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22253.  
  22254.       -- perform a modify operation on entry point status
  22255.       ENTRY_POINT_STAT := CONTROL_ENTRY_POINT_STATUS_MENU ;
  22256.  
  22257.       -- set menu window active
  22258.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22259.  
  22260.       OLD_NODE_STATUS := TREE( TREE_NODE ).IS_GUARDED ;
  22261.       if ENTRY_POINT_STAT = GUARDED_CMD then
  22262.          TREE( TREE_NODE ).IS_GUARDED := TRUE ;
  22263.       elsif ENTRY_POINT_STAT = UNGUARDED_CMD then
  22264.          TREE( TREE_NODE ).IS_GUARDED := FALSE ;
  22265.       end if ;
  22266.  
  22267.       -- if the status has changed, then redisplay the name
  22268.       if TREE( TREE_NODE ).IS_GUARDED xor OLD_NODE_STATUS then 
  22269.  
  22270.          GRAPH_NODE := TREE( TREE_NODE ).GRAPH_DATA ;
  22271.          -- now delete the old label
  22272.          GRAPHIC_DRIVER.DELETE_SEGMENT
  22273.                         ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID ) ;
  22274.          -- display the new name and get the new segment id 
  22275.          LABEL ( LABEL_SEGMENT ,
  22276.                  SIZE_POINT ,
  22277.                  GET_OFFSET_LOCATION (GRAPH_NODE) ,
  22278.                  GET_LABEL_STRING (TREE_NODE) ,
  22279.                  COLOR ) ;
  22280.  
  22281.          -- assign the new segment id into the tree
  22282.          GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  22283.          GRAPH(GRAPH_NODE).DATA.SIZE := SIZE_POINT ;
  22284.  
  22285.       end if ;
  22286.  
  22287.       -- clear the alpha screen
  22288.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22289.             ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22290.       -- set menu window active
  22291.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22292.  
  22293.    exception
  22294.  
  22295.       when HANDLE_ABORT_BACKUP =>
  22296.          -- clear the alpha screen
  22297.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22298.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22299.          --  execption used to return to backup
  22300.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22301.  
  22302.       when others =>
  22303.          -- handle error conditions that might occur
  22304.          -- report the error and continue
  22305.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_ENTRY_STAT") ;
  22306.  
  22307.    end MODIFY_ENTRY_STAT ;
  22308.  
  22309.  
  22310.    procedure MODIFY_GENERIC_NAME
  22311.                   ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  22312.    -- =========================================================
  22313.    --  This procedure performs operations required to implement
  22314.    --  a modify generic name
  22315.    -- =========================================================
  22316.  
  22317.       ENTITY_NAME    : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  22318.       BLANK_NAME     : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  22319.  
  22320.       PARENT_ENTITY       : GRAPHICS_DATA.GRAPHIC_ENTITY := PACKAGE_FIGURE ;
  22321.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  22322.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  22323.       SIZE_POINT          : GRAPHICS_DATA.POINT ;
  22324.       COLOR               : GRAPHICS_DATA.COLOR_TYPE ;
  22325.  
  22326.    begin 
  22327.  
  22328.       -- set menu window active
  22329.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22330.  
  22331.       if TREE( TREE_NODE ).GENERIC_STATUS = GENERIC_INSTANTIATION then
  22332.       -- perform a modify operation
  22333.          GRAPH_NODE := TREE(TREE_NODE).GRAPH_DATA ;
  22334.  
  22335.          -- highlight the generic name
  22336.          GRAPHIC_DRIVER.HILITE_SEGMENT 
  22337.                         ( GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID,
  22338.                           GKS_SPECIFICATION.HIGHLIGHTED );
  22339.          -- modify the name 
  22340.          -- prompt user for name, a blank name is an abort
  22341.          -- functions can be overloaded
  22342.          if TREE( TREE_NODE ).NODE_TYPE = TYPE_FUNCTION then
  22343.             REQUEST_LABEL ( ENTITY_NAME, TRUE, TRUE ) ;
  22344.          else
  22345.             REQUEST_LABEL ( ENTITY_NAME, TRUE ) ;
  22346.          end if ;
  22347.  
  22348.          if ENTITY_NAME /= BLANK_NAME then 
  22349.             -- determine color for display 
  22350.             PARENT_ENTITY := GET_FIGURE_TYPE ( TREE(TREE_NODE).NODE_TYPE ) ;
  22351.             COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  22352.  
  22353.             -- now delete the old label
  22354.             GRAPHIC_DRIVER.DELETE_SEGMENT
  22355.                            ( GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID ) ;
  22356.  
  22357.             -- store the new name
  22358.             TREE(TREE_NODE).CU_INSTANTIATED := ENTITY_NAME ;
  22359.             -- display the new name and get the new segment id and size point
  22360.             LABEL ( LABEL_SEGMENT ,
  22361.                     SIZE_POINT ,
  22362.                     GET_GENERIC_OFFSET_LOCATION (GRAPH_NODE) ,
  22363.                     GET_GENERIC_LABEL_STRING (TREE_NODE) ,
  22364.                     COLOR ) ;
  22365.  
  22366.             -- place the graph information in the graph node
  22367.             GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID := LABEL_SEGMENT ;
  22368.  
  22369.          else
  22370.             -- the modify was abort since new label is blank
  22371.             -- restore to not highlited
  22372.             GRAPHIC_DRIVER.HILITE_SEGMENT 
  22373.                         ( GRAPH(GRAPH_NODE).DATA.LABEL2_SEG_ID,
  22374.                           GKS_SPECIFICATION.NORMAL );
  22375.          end if ;
  22376.       end if ; -- is a generic_instantiation
  22377.  
  22378.       -- set menu window active
  22379.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22380.  
  22381.  
  22382.    exception
  22383.  
  22384.       when others =>
  22385.          -- handle error conditions that might occur
  22386.          -- report the error and continue
  22387.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_GENERIC_NAME ") ;
  22388.          -- set menu window active
  22389.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22390.  
  22391.  
  22392.    end MODIFY_GENERIC_NAME ;
  22393.  
  22394.  
  22395.    procedure MODIFY_NAME ( TREE_NODE : in TREE_DATA.TREE_NODE_ACCESS_TYPE ) is
  22396.    -- =========================================================
  22397.    --  This procedure performs operations required to implement
  22398.    --  a modify name
  22399.    -- =========================================================
  22400.  
  22401.       BLANK_LINE     : constant string := " " ;
  22402.       ENTITY_NAME    : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  22403.       BLANK_NAME     : TREE_DATA.NAME_TYPE := TREE_DATA.NULL_NAME ;
  22404.  
  22405.       SEGMENT             : GKS_SPECIFICATION.SEGMENT_NAME ;
  22406.  
  22407.       PARENT_ENTITY       : GRAPHICS_DATA.GRAPHIC_ENTITY := PACKAGE_FIGURE ;
  22408.       GRAPH_NODE          : TREE_DATA.GRAPH_NODE_ACCESS_TYPE := NULL_POINTER ;
  22409.       LINE_NODE           : TREE_DATA.POINTS := NULL_POINTER ;
  22410.       LABEL_SEGMENT       : GKS_SPECIFICATION.SEGMENT_NAME ;
  22411.       REFERENCE_SEG_ID    : GKS_SPECIFICATION.SEGMENT_NAME ;
  22412.       SIZE_POINT          : GRAPHICS_DATA.POINT ;
  22413.       LABEL_POINT         : GRAPHICS_DATA.POINT ;
  22414.       REFERENCE_POINT     : GRAPHICS_DATA.POINT ;
  22415.       COLOR               : GRAPHICS_DATA.COLOR_TYPE ;
  22416.  
  22417.       ERROR_ON_MODIFY_CHOICE : exception ;
  22418.  
  22419.    begin 
  22420.  
  22421.       -- set menu window active
  22422.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22423.  
  22424.       -- perform a modify operation
  22425.       -- set graphic window active
  22426.       GRAPH_NODE := TREE(TREE_NODE).GRAPH_DATA ;
  22427.  
  22428.       -- highlight the annotation
  22429.       GRAPHIC_DRIVER.HILITE_SEGMENT 
  22430.                      ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID,
  22431.                        GKS_SPECIFICATION.HIGHLIGHTED );
  22432.       -- modify the name 
  22433.       -- prompt user for name, a blank name is an abort
  22434.       -- functions can be overloaded
  22435.       if TREE( TREE_NODE ).NODE_TYPE = TYPE_FUNCTION or else
  22436.            TREE( TREE_NODE ).NODE_TYPE = EXPORTED_FUNCTION or else
  22437.            TREE( TREE_NODE ).NODE_TYPE = IMPORTED_FUNCTION then
  22438.          REQUEST_LABEL ( ENTITY_NAME, TRUE, TRUE ) ;
  22439.       else
  22440.          REQUEST_LABEL ( ENTITY_NAME, TRUE ) ;
  22441.       end if ;
  22442.  
  22443.  
  22444.       if ENTITY_NAME /= BLANK_NAME then 
  22445.          -- determine color for display 
  22446.          case TREE(TREE_NODE).NODE_TYPE is
  22447.             when TYPE_ENTRY_POINT | 
  22448.                  IMPORTED_VIRTUAL_PACKAGE .. EXPORTED_EXCEPTION =>
  22449.                PARENT_ENTITY := GET_FIGURE_TYPE (
  22450.                              TREE(TREE(TREE_NODE).PARENT).NODE_TYPE ) ;
  22451.             when others =>
  22452.                PARENT_ENTITY := GET_FIGURE_TYPE (
  22453.                              TREE(TREE_NODE).NODE_TYPE ) ;
  22454.          end case ;
  22455.  
  22456.          COLOR := ENTITY_COLOR (PARENT_ENTITY) ;
  22457.  
  22458.          -- now delete the old label
  22459.          GRAPHIC_DRIVER.DELETE_SEGMENT
  22460.                         ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID ) ;
  22461.  
  22462.          -- store the new name
  22463.          TREE(TREE_NODE).NAME := ENTITY_NAME ;
  22464.          -- display the new name and get the new segment id and size point
  22465.          LABEL ( LABEL_SEGMENT ,
  22466.                  SIZE_POINT ,
  22467.                  GET_OFFSET_LOCATION (GRAPH_NODE) ,
  22468.                  GET_LABEL_STRING (TREE_NODE) ,
  22469.                  COLOR ) ;
  22470.  
  22471.          -- check if the size point and line connect needs to be moved
  22472.          case TREE(TREE_NODE).NODE_TYPE is
  22473.             when EXPORTED_PROCEDURE | EXPORTED_FUNCTION |
  22474.                  EXPORTED_ENTRY_POINT | EXPORTED_TYPE |
  22475.                  EXPORTED_OBJECT | EXPORTED_EXCEPTION =>
  22476.                if SIZE_POINT /= GRAPH(GRAPH_NODE).DATA.SIZE then
  22477.                   GRAPH(GRAPH_NODE).DATA.SIZE := SIZE_POINT ;
  22478.                   LINE_NODE := TREE(TREE_NODE).LINE(1) ;
  22479.                   -- check for outgoing line
  22480.                   if LINE_NODE /= NULL_POINTER then
  22481.                      -- now delete the old line segement
  22482.                      GRAPHIC_DRIVER.DELETE_SEGMENT
  22483.                         ( GRAPH(LINE_NODE).DATA.SEGMENT_ID ) ;
  22484.                      GRAPH(LINE_NODE).DATA.LOCATION := SIZE_POINT ;
  22485.    
  22486.                      GRAPH(LINE_NODE).DATA.SEGMENT_ID :=
  22487.                         DRAW_LINE (EXPORT_CONNECT_LINE , 
  22488.                                    GRAPH(LINE_NODE).DATA.LOCATION,
  22489.                                    GRAPH(TREE(TREE_NODE).LINE(2)).DATA.LOCATION ) ;
  22490.                   end if ;
  22491.                end if ;
  22492.    
  22493.             when others =>
  22494.                null ;
  22495.          end case ;
  22496.  
  22497.          -- place the graph information in the graph node
  22498.          GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID := LABEL_SEGMENT ;
  22499.  
  22500.       else
  22501.          -- the modify was abort since new label is blank
  22502.          -- restore to not highlited
  22503.          GRAPHIC_DRIVER.HILITE_SEGMENT 
  22504.                      ( GRAPH(GRAPH_NODE).DATA.LABEL_SEG_ID,
  22505.                        GKS_SPECIFICATION.NORMAL );
  22506.       end if ;
  22507.  
  22508.       -- set menu window active
  22509.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22510.  
  22511.    exception
  22512.  
  22513.       when others =>
  22514.          -- handle error conditions that might occur
  22515.          -- report the error and continue
  22516.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY_NAME ") ;
  22517.          -- set menu window active
  22518.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22519.  
  22520.    end MODIFY_NAME ;
  22521.  
  22522.  
  22523.    function LONGEST_LABEL_OK ( TREE_NODE : TREE_DATA.TREE_NODE_ACCESS_TYPE ;
  22524.                                LABEL_CREATE : LABEL_CREATE_TYPE )
  22525.         return Boolean is
  22526.    -- =========================================================
  22527.    --  This procedure performs operations required to implement
  22528.    --  an overlap check if the modified name is extended.
  22529.    --  Returns true if extending is ok.
  22530.    -- =========================================================
  22531.  
  22532.       PARENT, 
  22533.       PARENTS_PARENT        : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  22534.       UPPER_RIGHT_POINT,
  22535.       LOWER_RIGHT_POINT     : GRAPHICS_DATA.POINT ;
  22536.       PROPER_SCOPE          : Boolean ;
  22537.  
  22538.    begin 
  22539.       -- check right side points, since only they could become invalid
  22540.       UPPER_RIGHT_POINT.X := 
  22541.            GRAPH( TREE( TREE_NODE ).GRAPH_DATA ).DATA.LOCATION.X +
  22542.                 GRAPHICS_DATA.LABEL_MAX_LENGTH + 
  22543.                 ( 2 * GRAPHICS_DATA.CHARACTER_WIDTH_OFFSET ) ;
  22544.       UPPER_RIGHT_POINT.Y := 
  22545.            GRAPH( TREE( TREE_NODE ).GRAPH_DATA ).DATA.LOCATION.Y ;
  22546.       LOWER_RIGHT_POINT.X := UPPER_RIGHT_POINT.X ;
  22547.       LOWER_RIGHT_POINT.Y := 
  22548.            GRAPH( TREE( TREE_NODE ).GRAPH_DATA ).DATA.SIZE.Y ;
  22549.  
  22550.       -- get the parent entity for comparision
  22551.       PARENT := TREE( TREE_NODE ).PARENT ;
  22552.       PARENTS_PARENT := TREE( PARENT ).PARENT ;
  22553.  
  22554.       if LABEL_CREATE = LABEL_IMPORT then
  22555.          -- for imports, the size points are within the parent's parent.
  22556.          PROPER_SCOPE :=
  22557.               ( PARENTS_PARENT = SCOPE_SEARCH ( UPPER_RIGHT_POINT )) and
  22558.               ( PARENTS_PARENT = SCOPE_SEARCH ( LOWER_RIGHT_POINT )) ;
  22559.       else
  22560.          -- for exports, the size points are within the parent.
  22561.          PROPER_SCOPE :=
  22562.               ( PARENT = SCOPE_SEARCH ( UPPER_RIGHT_POINT )) and
  22563.               ( PARENT = SCOPE_SEARCH ( LOWER_RIGHT_POINT )) ;
  22564.       end if ;
  22565.  
  22566.       if not PROPER_SCOPE then
  22567.          DISPLAY_ERROR ("if modified the annotation may show improper scope" &
  22568.                         " (overlap or overextend)" ) ;
  22569.          return false ;
  22570.       else
  22571.          return true ;
  22572.       end if ;
  22573.  
  22574.    end LONGEST_LABEL_OK ;
  22575.  
  22576.    procedure MODIFY is
  22577.    -- =========================================================
  22578.    --  This procedure performs operations required to implement
  22579.    --  a modify
  22580.    -- =========================================================
  22581.  
  22582.       TREE_NODE           : TREE_DATA.TREE_NODE_ACCESS_TYPE := NULL_POINTER ;
  22583.       REFERENCE_POINT     : GRAPHICS_DATA.POINT ;
  22584.  
  22585.       ERROR_ON_MODIFY_CHOICE : exception ;
  22586.  
  22587.    begin 
  22588.       -- perform a modify operation
  22589.       -- set graphic window active
  22590.       GRAPHIC_DRIVER.SELECT_WINDOW( GRAPH_VIEW_PORT ) ;
  22591.  
  22592.       -- turn on the abort icon
  22593.       GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.ON ) ;
  22594.       -- determine the tree node needing modification
  22595.       REQUEST_POINT (
  22596.          "select scope of entity needing modification " ,
  22597.          REFERENCE_POINT ,
  22598.          TREE_NODE ) ;
  22599.       -- turn off the abort icon
  22600.       GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22601.  
  22602.       case TREE(TREE_NODE).NODE_TYPE is
  22603.  
  22604.          when ROOT =>
  22605.             raise ERROR_ON_MODIFY_CHOICE ;
  22606.  
  22607.          when TYPE_VIRTUAL_PACKAGE | TYPE_TASK =>
  22608.             -- Assure that the entire subtree is visible on the view window.
  22609.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22610.             -- perform modify
  22611.             MODIFY_NAME( TREE_NODE ) ;
  22612.             MODIFY_PROLOGUE( TREE_NODE ) ;
  22613.  
  22614.          when TYPE_PACKAGE =>
  22615.             -- Assure that the entire subtree is visible on the view window.
  22616.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22617.             -- perform modify
  22618.             MODIFY_NAME( TREE_NODE ) ;
  22619.             MODIFY_GENERIC_NAME( TREE_NODE ) ;
  22620.             MODIFY_PROLOGUE( TREE_NODE ) ;
  22621.  
  22622.          when TYPE_PROCEDURE | TYPE_FUNCTION =>
  22623.             -- Assure that the entire subtree is visible on the view window.
  22624.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22625.             -- perform modify
  22626.             MODIFY_NAME( TREE_NODE ) ;
  22627.             MODIFY_SUBPROGRAM_PARAM_STAT( TREE_NODE ) ;
  22628.             MODIFY_GENERIC_NAME( TREE_NODE ) ;
  22629.             MODIFY_PROLOGUE( TREE_NODE ) ;
  22630.  
  22631.          when TYPE_ENTRY_POINT =>
  22632.             -- Assure that the entire subtree is visible on the view window.
  22633.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22634.             -- Assure that extending the label is ok
  22635.             if LONGEST_LABEL_OK ( TREE_NODE, LABEL_EXPORT ) then
  22636.                -- perform modify
  22637.                MODIFY_NAME( TREE_NODE ) ;
  22638.                MODIFY_ENTRY_STAT( TREE_NODE ) ;
  22639.                MODIFY_ENTRY_PARAM_STAT( TREE_NODE ) ;
  22640.             end if ;
  22641.  
  22642.          when TYPE_BODY =>
  22643.             -- Assure that the entire subtree is visible on the view window.
  22644.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22645.             -- perform modify
  22646.             MODIFY_CALL_STAT( TREE_NODE ) ;
  22647.  
  22648.          when IMPORTED_VIRTUAL_PACKAGE..IMPORTED_FUNCTION =>
  22649.             -- Assure that the entire subtree is visible on the view window.
  22650.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22651.             -- Assure that extending the label is ok
  22652.             if LONGEST_LABEL_OK ( TREE_NODE, LABEL_IMPORT ) then
  22653.                -- perform modify
  22654.                MODIFY_NAME( TREE_NODE ) ;
  22655.             end if ;
  22656.  
  22657.          when EXPORTED_PROCEDURE..EXPORTED_EXCEPTION =>
  22658.             -- Assure that the entire subtree is visible on the view window.
  22659.             VIEW_WINDOW_CHECK( TREE_NODE ) ;
  22660.             -- Assure that extending the label is ok
  22661.             if LONGEST_LABEL_OK ( TREE_NODE, LABEL_EXPORT ) then
  22662.                -- perform modify
  22663.                MODIFY_NAME( TREE_NODE ) ;
  22664.             end if ;
  22665.  
  22666.          when others =>
  22667.             raise ERROR_ON_MODIFY_CHOICE ;
  22668.  
  22669.       end case ;
  22670.  
  22671.       -- set menu window active
  22672.       GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22673.    exception
  22674.  
  22675.       when ERROR_ON_MODIFY_CHOICE =>
  22676.          DISPLAY_ERROR( "entity selected can not be modified" ) ;
  22677.          -- set menu window active
  22678.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22679.          
  22680.       when OPERATION_ABORTED_BY_OPERATOR =>
  22681.          -- turn off the abort icon
  22682.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22683.          -- clear the alpha screen
  22684.          VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22685.                ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22686.          -- set menu window active.
  22687.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22688.  
  22689.       when others =>
  22690.          -- handle error conditions that might occur
  22691.          -- report the error and continue
  22692.          DISPLAY_ERROR (" PROGRAM ERROR -- in MODIFY ") ;
  22693.          -- turn off the abort icon
  22694.          GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF ) ;
  22695.          -- set menu window active
  22696.          GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22697.  
  22698.    end MODIFY ;
  22699.  
  22700.  
  22701.    procedure CONTROL_DESIGN_MENU is
  22702.    -- =========================================================
  22703.    --  This procedure performs operations required to implement
  22704.    --  the design menu commands.
  22705.    -- =========================================================
  22706.  
  22707.       COMMAND        : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  22708.       DONE           : BOOLEAN := FALSE ;
  22709.       DUMMY          : COMMAND_TYPE ;
  22710.  
  22711.       subtype CREATE_CMD is COMMAND_TYPE range 
  22712.            VIRT_PACKAGE_CMD .. ANNOTATION_CMD ;
  22713.       subtype CREATE_CONNECTION_CMD is COMMAND_TYPE range 
  22714.            CALL_CONNECT_CMD .. EXPORT_CONNECT_CMD ;
  22715.  
  22716.    begin 
  22717.       -- pre place icon cursor on virtual package
  22718.       COMMAND := VIRT_PACKAGE_CMD ;
  22719.       while not DONE loop 
  22720.          begin
  22721.             -- display the current menu and get command from GRAPHICS_DRIVER
  22722.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( DESIGN_MENU ) , COMMAND ) ;
  22723.             case COMMAND is
  22724.                -- implement the main menu commands 
  22725.                when HELP_CMD =>
  22726.                   -- display help for current menu
  22727.                   HELP ( MENU_ID'( DESIGN_MENU ) ) ;
  22728.                when BACKUP_CMD =>
  22729.                   -- return to the MAIN_MENU
  22730.                   DONE := true ;  -- exit the loop 
  22731.                when PAN_ZOOM_CMD =>
  22732.                   -- go process pan zoom operation, return to here
  22733.                   DUMMY := CONTROL_PAN_ZOOM_MENU ;
  22734.                when CREATE_CMD =>
  22735.                   -- perform a create
  22736.                   CREATE( COMMAND ) ;
  22737.                when CREATE_CONNECTION_CMD =>
  22738.                   -- perform a create connection
  22739.                   CREATE_CONNECTION( COMMAND ) ;
  22740.                when DELETE_CONNECT_CMD =>
  22741.                   -- perform a delete connection
  22742.                   DELETE_CONNECTION ;
  22743.                when DELETE_CMD =>
  22744.                   -- perform a delete
  22745.                   DELETE ;
  22746.                when RESIZE_CMD =>
  22747.                   -- perform the resize
  22748.                   MOVE_AND_RESIZE ;
  22749.                when MOVE_CMD =>
  22750.                   -- perform a move of an object
  22751.                   MOVE_AND_RESIZE ;
  22752.                when MODIFY_CMD =>
  22753.                   -- perform an edit
  22754.                   MODIFY ;
  22755.                when others =>
  22756.                   -- this should not occur
  22757.                   null ;
  22758.             end case ; -- COMMAND
  22759.          exception
  22760.             when HANDLE_RESTART =>
  22761.                -- exception used to return to the main menu
  22762.                raise ;
  22763.             when OPERATION_ABORTED_BY_OPERATOR =>
  22764.                -- turn off abort icon
  22765.                GRAPHIC_DRIVER.SET_ABORT_CAPABILITY( GRAPHICS_DATA.OFF);
  22766.                -- clear the alpha screen
  22767.                VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  22768.                      ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  22769.                -- set menu window active.
  22770.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22771.             when others =>
  22772.                -- handle error conditions that might occur
  22773.                -- report the error and continue
  22774.                DISPLAY_ERROR (" PROGRAM ERROR -- in DESIGN Menu control ") ;
  22775.                -- set menu window active.
  22776.                GRAPHIC_DRIVER.SELECT_WINDOW( MENU_VIEW_PORT ) ;
  22777.          end ;
  22778.       end loop ; 
  22779.  
  22780.    end CONTROL_DESIGN_MENU ;
  22781.  
  22782.  
  22783. end MMI_DESIGN ;
  22784. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  22785. --mmi_spec.ada
  22786. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  22787. -- version 85-08-28 12:47 by RAM
  22788.  
  22789. with SYSTEM ;
  22790.  
  22791. package MMI is 
  22792. -- ==============================================================
  22793. --
  22794. --  This package provides the Man-Machine Interface and
  22795. --  implements the requested graphics operations for
  22796. --  the SKETCHER program.  It inputs the commands from
  22797. --  the user via the GRAPHICS_DRIVER to isolate it from
  22798. --  device dependencies.  The decoded commands are then
  22799. --  passed to the appropriate routine(s) of the MMI_OPERATIONS
  22800. --  package body.
  22801. --  
  22802. --  Requirements:
  22803. --   1) decode commands entered by the user.
  22804. --   2) implement the commands required in the SKETCHER
  22805. --      User Manual.
  22806. --
  22807. -- ===============================================================
  22808.  
  22809.    procedure INITIALIZE ; 
  22810.    -- ========================================================
  22811.    --  This procedure will initialize the command derefencing
  22812.    --  table and download all terminal dependent command
  22813.    --  data.
  22814.    -- ========================================================
  22815.  
  22816.    procedure PROCESS_COMMAND ; 
  22817.    -- ======================================================
  22818.    --
  22819.    --  This procedure will input commands from the user
  22820.    --  via the GRAPHICS_DRIVER.  The selected commands are
  22821.    --  then passed to the MMI_OPERATIONS package.  
  22822.    -- =======================================================
  22823.  
  22824.    procedure PANIC_EXIT ; 
  22825.    -- ========================================================
  22826.    --  This procedure orchestrates an abnormal termination
  22827.    --  condition detected by the program unit.
  22828.    -- ========================================================
  22829.  
  22830. end MMI ; 
  22831. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  22832. --mmi_body.ada
  22833. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  22834. -- version 86-02-10 09:30 BY RAM
  22835.  
  22836. with MMI_PARAMETERS             ; use MMI_PARAMETERS ;
  22837. with MMI_CONTROL_MENUS          ; 
  22838. with MMI_DESIGN                 ;
  22839. with MMI_ATTRIBUTES             ;
  22840. with VIRTUAL_TERMINAL_INTERFACE ; use VIRTUAL_TERMINAL_INTERFACE ;
  22841. with GKS_SPECIFICATION          ; use GKS_SPECIFICATION ;
  22842. with GRAPHICS_DATA              ; use GRAPHICS_DATA ;
  22843. with GRAPHIC_DRIVER             ; use GRAPHIC_DRIVER ;
  22844. with PDL_GEN                    ; 
  22845. with TRACE_PKG                  ; use TRACE_PKG ;
  22846. with TREE_DATA                  ; use TREE_DATA ;
  22847. with TREE_OPS                   ; use TREE_OPS ;
  22848. with TREE_IO                    ; use TREE_IO ;
  22849. with TEXT_IO                    ;
  22850. with UTILITIES                  ; use UTILITIES ;
  22851. with UTIL_FOR_TREE              ; use UTIL_FOR_TREE ;
  22852.  
  22853. package body MMI is 
  22854. -- ===========================================================
  22855. --
  22856. --  This package provides the Man-Machine Interface for
  22857. --  the SKETCHER program.  It inputs the commands from
  22858. --  the user via the GRAPHICS_DRIVER to isolate it from
  22859. --  device dependencies.  The decoded commands are then
  22860. --  passed to the appropriate routine(s).
  22861. --  
  22862. --  Requirements:
  22863. --   1) decode commands entered by the user.
  22864. --   2) implement the commands required in the SKETCHER
  22865. --      User Manual.
  22866. --
  22867. -- ===========================================================
  22868.  
  22869.    package GRAPHICS renames GRAPHICS_DATA ;
  22870.  
  22871.  
  22872.    procedure INITIALIZE is
  22873.    -- =========================================================
  22874.    --  This procedure will initialize the command derefencing
  22875.    --  table and download all terminal dependent command
  22876.    --  data.
  22877.    --  The terminal will involve downloading
  22878.    --  a segment for each menu item, and setting up the 
  22879.    --  COMMAND_SEGMENT_OBJECT_CROSS_REFERENCE_TABLE to translate
  22880.    --  a segment into a command.
  22881.    -- ===========================================================
  22882.       DEFAULT_SCREEN_COLOR   : constant COLOR_TYPE := WHITE ;
  22883.  
  22884.       MENU_WINDOW    : constant GRAPHICS_DATA.WINDOW_TYPE :=
  22885.                        GRAPHICS_DATA.WINDOW_TYPE'( MENU_VIEW_PORT ) ;
  22886.       GRAPHIC_WINDOW : constant GRAPHICS_DATA.WINDOW_TYPE :=
  22887.                        GRAPHICS_DATA.WINDOW_TYPE'( GRAPH_VIEW_PORT ) ;
  22888.       INITIAL_MSG    : constant STRING := " PROGRAM INITIALIZATION " ;
  22889.  
  22890.       SIZE_DUMMY ,
  22891.       ICON_LOCATION ,
  22892.       FRAME_UPPER_LEFT ,
  22893.       FRAME_LOWER_RIGHT : GRAPHICS_DATA.POINT ;
  22894.  
  22895.       BORDER_WIDTH      : constant GRAPHICS_DATA.WC := 100 ;
  22896.       ICON_X_OFFSET     : constant GRAPHICS_DATA.WC := 100 ;
  22897.       ICON_Y_OFFSET     : constant GRAPHICS_DATA.WC := 200 ;
  22898.       FRAME_OFFSET      : constant GRAPHICS_DATA.WC := 30 ;
  22899.       ICON_WIDTH ,
  22900.       ICON_HEIGHT ,
  22901.       ICON_Y_FRAME_SIZE : GRAPHICS_DATA.WC ;
  22902.  
  22903.       MENU_AREA    : GRAPHICS_DATA.RECTANGLE ;
  22904.       FRAME_COLOR  : constant GRAPHICS_DATA.COLOR_TYPE := BLACK ;
  22905.       ICON_COLOR   : GRAPHICS_DATA.COLOR_TYPE := BLACK ;
  22906.       LABEL_COLOR  : constant GRAPHICS_DATA.COLOR_TYPE := GREEN ;
  22907.       BACK_COLOR   : GRAPHICS_DATA.COLOR_TYPE := YELLOW ;
  22908.       FRAME_LINE   : constant GRAPHICS_DATA.LINE_TYPE := SOLID ;
  22909.       FRAME_FILL   : GKS_SPECIFICATION.INTERIOR_STYLE
  22910.                      := GKS_SPECIFICATION.HOLLOW ;
  22911.       SEGMENT_ID   : GKS_SPECIFICATION.SEGMENT_NAME ;
  22912.       ICON_NUMBER  : ICON_ID ;
  22913.       COLOR_CMD    : COMMAND_TYPE ;
  22914.  
  22915.    begin 
  22916.       if TRACE_PKG.REQUEST_TRACE then
  22917.          TRACE_PKG.TRACE ( "MMI.INIT" ) ;
  22918.       end if ;
  22919.  
  22920.       -- Initialize terminal for VT100 operation 
  22921.       VIRTUAL_TERMINAL_INTERFACE.VTI_INIT ;
  22922.       UTILITIES.SIGN_ON ;
  22923.  
  22924.       -- Initialize Terminal for Graphics
  22925.       GRAPHIC_DRIVER.INITIALIZE_GRAPHICS_MODE ;
  22926.       GRAPHIC_DRIVER.INIT_SCREEN ( DEFAULT_SCREEN_COLOR , MENU_AREA ) ;
  22927.  
  22928.       -- Save menu minimum and maximum x values.
  22929.       MENU_X_MIN := MENU_AREA.X.MIN ;
  22930.       MENU_X_MAX := MENU_AREA.X.MAX ;
  22931.  
  22932.       -- Display program initialization message
  22933.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS (
  22934.          LOW_LEVEL_CRT_FUNCTIONS'( BLINK_CHARS )) ;
  22935.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS (
  22936.          LOW_LEVEL_CRT_FUNCTIONS'( NEGATIVE_CHARS )) ;
  22937.  
  22938.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  22939.          ( INITIAL_MSG , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 23 ));
  22940.  
  22941.       VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS (
  22942.          LOW_LEVEL_CRT_FUNCTIONS'( CLEAR_ATTRIBUTES )) ;
  22943.  
  22944.       -- build and initialize menus 
  22945.       --  select menu window
  22946.       GRAPHIC_DRIVER.SELECT_WINDOW ( MENU_WINDOW ) ;
  22947.       -- define locations for icon frames
  22948.       ICON_Y_FRAME_SIZE := ( MENU_AREA.Y.MAX
  22949.                            - MENU_AREA.Y.MIN )
  22950.                            / ( ICON_BOUNDARY'last
  22951.                            - ICON_BOUNDARY'first + 1 ) ;
  22952.       for ICON_NUMBER in ICON_BOUNDARY'range(1) loop
  22953.          ICON_BOUNDARY( ICON_NUMBER ).LOWER :=
  22954.             MENU_AREA.Y.MAX - ( ICON_NUMBER * ICON_Y_FRAME_SIZE ) ;
  22955.          ICON_BOUNDARY( ICON_NUMBER ).UPPER :=
  22956.             ICON_BOUNDARY( ICON_NUMBER ).LOWER + ICON_Y_FRAME_SIZE ;
  22957.       end loop ; 
  22958.       -- define locations for icon backlites
  22959.       ICON_HEIGHT  := ICON_Y_FRAME_SIZE - ( 2 * BORDER_WIDTH ) ;
  22960.       ICON_WIDTH   := ( MENU_AREA.X.MAX 
  22961.                       - MENU_AREA.X.MIN ) 
  22962.                       - ( 2 * BORDER_WIDTH ) ;
  22963.       -- draw in decreasing priority
  22964.       GRAPHIC_DRIVER.SET_DRAWING_PRIORITY( 1.0 ) ;
  22965.  
  22966.       --  draw frames
  22967.       FRAME_UPPER_LEFT.X  := MENU_AREA.X.MIN ;
  22968.       FRAME_LOWER_RIGHT.X := MENU_AREA.X.MAX - FRAME_OFFSET ;
  22969.       for ICON_NUMBER in ICON_BOUNDARY'range(1) loop
  22970.          FRAME_LOWER_RIGHT.Y := ICON_BOUNDARY ( ICON_NUMBER ).LOWER ;
  22971.          FRAME_UPPER_LEFT.Y  := FRAME_LOWER_RIGHT.Y + ICON_Y_FRAME_SIZE ;
  22972.          if ICON_NUMBER /= ICON_BOUNDARY'first(1) then
  22973.             SEGMENT_ID := GRAPHIC_DRIVER.DRAW_BOX ( FRAME_COLOR ,
  22974.                                                     FRAME_FILL ,
  22975.                                                     FRAME_LINE ,
  22976.                                                     FRAME_UPPER_LEFT ,
  22977.                                                     FRAME_LOWER_RIGHT ) ;
  22978.          end if ;
  22979.       end loop ; 
  22980.  
  22981.       --  draw color icon squares
  22982.       FRAME_FILL := GKS_SPECIFICATION.SOLID ;
  22983.       FRAME_UPPER_LEFT.X  := MENU_AREA.X.MIN + FRAME_OFFSET + 
  22984.                              3 *( ( MENU_AREA.X.MAX - MENU_AREA.X.MIN ) / 4 ) ;
  22985.       FRAME_LOWER_RIGHT.X := MENU_AREA.X.MAX - 2 * FRAME_OFFSET ;
  22986.       for ICON_NUMBER in ICON_ID'First..ICON_ID'Last loop
  22987.          FRAME_LOWER_RIGHT.Y := ICON_BOUNDARY ( ICON_NUMBER ).LOWER
  22988.                                 + FRAME_OFFSET ;
  22989.          FRAME_UPPER_LEFT.Y  := FRAME_LOWER_RIGHT.Y + ICON_Y_FRAME_SIZE
  22990.                                 - 2 * FRAME_OFFSET ;
  22991.          COLOR_CMD := MENU_TABLE( COLOR_LINE_MENU, ICON_NUMBER ).COMMAND ;
  22992.          case COLOR_CMD is
  22993.             when GREEN_CMD  =>
  22994.                ICON_COLOR := GREEN ;
  22995.             when BLUE_CMD   =>
  22996.                ICON_COLOR := BLUE ;
  22997.             when VIOLET_CMD =>
  22998.                ICON_COLOR := VIOLET ;
  22999.             when RED_CMD    =>
  23000.                ICON_COLOR := RED ;
  23001.             when ORANGE_CMD =>
  23002.                ICON_COLOR := ORANGE ;
  23003.             when YELLOW_CMD =>
  23004.                ICON_COLOR := YELLOW ;
  23005.             when BLACK_CMD  =>
  23006.                ICON_COLOR := BLACK ;
  23007.             when others =>
  23008.                null ;
  23009.          end case ; -- COLOR_CMD
  23010.          if COLOR_CMD in GREEN_CMD..BLACK_CMD then
  23011.             ICON_COLOR_SEGMENTS( COMMAND_TYPE'Pos( COLOR_CMD ) ) :=
  23012.                                         GRAPHIC_DRIVER.DRAW_BOX 
  23013.                                                     ( ICON_COLOR ,
  23014.                                                       FRAME_FILL ,
  23015.                                                       FRAME_LINE ,
  23016.                                                       FRAME_UPPER_LEFT ,
  23017.                                                       FRAME_LOWER_RIGHT ) ;
  23018.          end if ;
  23019.       end loop ; 
  23020.       -- clear color icons from menu window
  23021.       GRAPHIC_DRIVER.CLEAR_MENU( ICON_COLOR_SEGMENTS ) ;
  23022.       FRAME_FILL := GKS_SPECIFICATION.HOLLOW ;
  23023.  
  23024.       -- set up character parameters 
  23025.       SET_CHARACTER_SIZE_ATTRIBUTES
  23026.          ( GRAPHICS_DATA.DEFAULT_CHARACTER_HEIGHT,
  23027.            GRAPHICS_DATA.DEFAULT_CHARACTER_WIDTH,
  23028.            GRAPHICS_DATA.DEFAULT_CHARACTER_WIDTH_SPACING,
  23029.            GKS_SPECIFICATION.CHAR_PRECISION ) ;
  23030.      
  23031.       --  draw icons
  23032.       ICON_LOCATION.X := MENU_AREA.X.MIN + ICON_X_OFFSET ;
  23033.       for MENU in MENU_TABLE'range(1) loop
  23034.          for ICON in MENU_TABLE'range(2) loop
  23035.             if MENU_TABLE ( MENU , ICON ).COMMAND /= NULL_CMD then 
  23036.                if MENU_TABLE ( MENU , ICON ).COMMAND = MENU_LABEL then
  23037.                   ICON_COLOR := LABEL_COLOR ;
  23038.                   BACK_COLOR := WHITE ;
  23039.                else
  23040.                   ICON_COLOR := BLACK ;
  23041.                   BACK_COLOR := YELLOW ;
  23042.                end if ;
  23043.                ICON_LOCATION.Y := ICON_BOUNDARY ( ICON ).LOWER
  23044.                                   + ICON_Y_OFFSET ;
  23045.                GRAPHIC_DRIVER.LABEL( ICON_SEGMENTS( MENU )( ICON ) ,
  23046.                                      SIZE_DUMMY ,
  23047.                                      ICON_LOCATION ,
  23048.                                      MENU_TABLE ( MENU , ICON ).NAME ,
  23049.                                      ICON_COLOR,
  23050.                                      BACK_COLOR ) ;
  23051.             end if ;
  23052.          end loop ; -- inner loop
  23053.          -- clear menu from menu window
  23054.          GRAPHIC_DRIVER.CLEAR_MENU ( ICON_SEGMENTS ( MENU ) ) ;
  23055.       end loop ; -- outer loop
  23056.  
  23057.       GRAPHIC_DRIVER.SET_DRAWING_PRIORITY( 0.95 ) ;
  23058.  
  23059.       GRAPHIC_DRIVER.GRAPHICS_SCREEN ( GRAPHICS_DATA.MODE_TYPE'( ON ) ) ;
  23060.  
  23061.       if TRACE_PKG.REQUEST_TRACE then
  23062.          TRACE_PKG.TRACE ( "MMI.INIT end procedure" ) ;
  23063.       end if ;
  23064.  
  23065.    end INITIALIZE ; 
  23066.  
  23067.    procedure PROCESS_COMMAND is 
  23068.    -- =========================================================
  23069.    --  This procedure will input commands from the user
  23070.    --  and implement the MAIN_MENU.  The implementation
  23071.    --  of lower level menu commands are handled by lower
  23072.    --  level procedures.
  23073.    -- ==========================================================
  23074.  
  23075.       COMMAND           : COMMAND_TYPE := COMMAND_TYPE'( FINISHED_CMD ) ; 
  23076.       SUB_COMMAND       : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  23077.       CONFIRM_STATUS    : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  23078.       DUMMY             : COMMAND_TYPE := COMMAND_TYPE'( BACKUP_CMD ) ; 
  23079.       DONE              : BOOLEAN := FALSE ;
  23080.       PDL_FILENAME      : TREE_IO.FILENAME_TYPE := TREE_IO.NULL_FILENAME ;
  23081.       SESSION_FILE      : TEXT_IO.FILE_TYPE ;
  23082.       SESSION_FILE_NAME : TREE_IO.FILENAME_TYPE ;
  23083.    begin 
  23084.       if TRACE_PKG.REQUEST_TRACE then
  23085.          TRACE_PKG.TRACE ( "MMI.PROCESS_COMMAND" ) ;
  23086.       end if ;
  23087.  
  23088.       while not DONE loop 
  23089.          begin
  23090.             -- pre place the icon cursor on the design_cmd
  23091.             COMMAND := DESIGN_CMD ;
  23092.             -- display the current menu and get command from GRAPHICS_DRIVER
  23093.             DISPLAY_MENU_AND_GET_COMMAND ( MENU_ID'( MAIN_MENU ) , COMMAND ) ;
  23094.             case COMMAND is
  23095.                -- implement the main menu commands 
  23096.                when HELP_CMD =>
  23097.                   -- display help for current menu
  23098.                   HELP ( MENU_ID'( MAIN_MENU ) ) ;
  23099.                when PAN_ZOOM_CMD =>
  23100.                   -- go preform pan / zoom operations, return to here
  23101.                   DUMMY := MMI_CONTROL_MENUS.CONTROL_PAN_ZOOM_MENU ;
  23102.                when DESIGN_CMD =>
  23103.                   -- display the design menu and process design commands
  23104.                   MMI_DESIGN.CONTROL_DESIGN_MENU ;
  23105.                when ATTRIBUTES_CMD =>
  23106.                   -- display the attributes menu and process attribute commands
  23107.                   MMI_ATTRIBUTES.CONTROL_ATTRIBUTES_MENU ;
  23108.                when GEN_PDL_CMD =>
  23109.                   begin
  23110.                      -- set default PDL file name
  23111.                      PDL_FILENAME := TREE_IO.DATA_FILENAME ;
  23112.                      -- generate pdl from current file name, use package 
  23113.                      --   utilities. 
  23114.                      -- [ get the filename for output ]
  23115.                      SUB_COMMAND := MMI_CONTROL_MENUS.CONTROL_PDL_STATUS_MENU ;
  23116.                      if SUB_COMMAND = NO_SUPPORT_CMD then
  23117.                         PDL_GEN.INCLUDE_SUPPORT_PACKAGE := false ;
  23118.                      else
  23119.                         PDL_GEN.INCLUDE_SUPPORT_PACKAGE := true ;
  23120.                      end if ;
  23121.                      PDL_GEN.GENERATE_PDL( PDL_FILENAME) ;
  23122.                   exception
  23123.                      when HANDLE_ABORT_BACKUP =>
  23124.                         null ;
  23125.                      when others =>
  23126.                         -- this should not occur
  23127.                         raise ;
  23128.                   end ;
  23129.                when READ_FILE_CMD =>
  23130.                   -- check that deletion of current graph is ok
  23131.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE (
  23132.                       "The current graph will be erased, CONFIRM erase to continue " ,
  23133.                       FORMAT_FCT'( CENTER_A_LINE ) ,
  23134.                       ROW_NO( 23 ) ) ;
  23135.                   GRAPHIC_DRIVER.SELECT_WINDOW  (MENU_VIEW_PORT) ;
  23136.                   -- get response
  23137.                   SUB_COMMAND := MMI_CONTROL_MENUS.CONTROL_DELETE_MENU ;
  23138.                   if SUB_COMMAND = CONFIRM_CMD then
  23139.                      --  delete the current contents of the tree
  23140.                      GRAPHIC_DRIVER.SELECT_WINDOW  (GRAPH_VIEW_PORT) ;
  23141.                      for GPTR in 1 .. TREE_DATA.MAX_GRAPH_NODES loop
  23142.                         if GRAPH(GPTR).OWNING_TREE_NODE /= NULL_POINTER then
  23143.                            if GRAPH(GPTR).DATA.SEGMENT_ID /= NULL_SEGMENT then
  23144.                               GRAPHIC_DRIVER.DELETE_SEGMENT
  23145.                                ( GRAPH(GPTR).DATA.SEGMENT_ID ) ;
  23146.                            end if ;
  23147.                            if GRAPH(GPTR).DATA.LABEL_SEG_ID /= NULL_SEGMENT then
  23148.                               GRAPHIC_DRIVER.DELETE_SEGMENT
  23149.                                ( GRAPH(GPTR).DATA.LABEL_SEG_ID ) ;
  23150.                            end if ;
  23151.                            if GRAPH(GPTR).DATA.LABEL2_SEG_ID /= NULL_SEGMENT then
  23152.                               GRAPHIC_DRIVER.DELETE_SEGMENT
  23153.                                ( GRAPH(GPTR).DATA.LABEL2_SEG_ID ) ;
  23154.                            end if ;
  23155.                         end if ;
  23156.                      end loop ;
  23157.                      GRAPHIC_DRIVER.SELECT_WINDOW  (MENU_VIEW_PORT) ;
  23158.  
  23159.                      begin 
  23160.                         --  get new_filename
  23161.                         SESSION_FILE_NAME := UTIL_FOR_TREE.GET_FILE_HANDLE ; 
  23162.                         -- check the filename, and if valid read in the file
  23163.                         -- and draw the corresponding graph
  23164.  
  23165.                         if SESSION_FILE_NAME /= TREE_IO.NULL_FILENAME then
  23166.                            -- see if file currently exists, 
  23167.                            -- raises NAME_ERROR if it doesn't
  23168.                            TEXT_IO.OPEN( SESSION_FILE ,
  23169.                                          TEXT_IO.IN_FILE ,
  23170.                                          TREE_IO.COMPLETE_FILE_NAME
  23171.                                             ( SESSION_FILE_NAME ,
  23172.                                               TREE_IO.TREE_EXTENSION ) ) ;
  23173.                            -- close file for tree_io.read
  23174.                            TEXT_IO.CLOSE ( SESSION_FILE ) ;
  23175.                            VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE (
  23176.                               "Reading from " & SESSION_FILE_NAME ,
  23177.                               FORMAT_FCT'( CENTER_A_LINE ) ,
  23178.                               ROW_NO( 23 ) ) ;
  23179.                            -- filename used so read in to initialize the 
  23180.                            -- tree structure, writes over old
  23181.                            TREE_IO.READ( TREE_IO.COMPLETE_FILE_NAME
  23182.                                             ( SESSION_FILE_NAME ,
  23183.                                               TREE_IO.TREE_EXTENSION ) ) ;
  23184.                            --  now draw the tree
  23185.                            UTIL_FOR_TREE.DRAW_GRAPH_TREE ;
  23186.                            --  set up tree file name
  23187.                            TREE_IO.DATA_FILENAME := SESSION_FILE_NAME ;
  23188.                         else
  23189.                            DISPLAY_TIMED_MESSAGE(
  23190.                               "New file " & TREE_IO.DEFAULT_FILENAME ) ;
  23191.                            -- initialize the tree to startup condition
  23192.                            TREE_OPS.INITIALIZE_TREE ;
  23193.                            TREE_IO.DATA_FILENAME := TREE_IO.DEFAULT_FILENAME ;
  23194.                         end if ;
  23195.  
  23196.                      exception
  23197.                         when TEXT_IO.NAME_ERROR =>
  23198.                            -- a new file is desired, just continue
  23199.                            DISPLAY_TIMED_MESSAGE(
  23200.                               "New file " & SESSION_FILE_NAME ) ;
  23201.                            -- initialize the tree to startup condition
  23202.                            TREE_OPS.INITIALIZE_TREE ;
  23203.                            TREE_IO.DATA_FILENAME := SESSION_FILE_NAME ;
  23204.                         when others =>
  23205.                            DISPLAY_ERROR (" file not available for input ") ;
  23206.                            GRAPHIC_DRIVER.SELECT_WINDOW  (MENU_VIEW_PORT) ;
  23207.                      end ;
  23208.                   end if ;
  23209.                   VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  23210.                      ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  23211.  
  23212.                when WRITE_FILE_CMD =>
  23213.                   begin 
  23214.                      VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE (
  23215.                          "If blank, the graph will be written to " & 
  23216.                                TREE_IO.DATA_FILENAME ,
  23217.                          FORMAT_FCT'( CENTER_A_LINE ) ,
  23218.                          ROW_NO( 22 ) ) ;
  23219.                      --  get new_filename
  23220.                      SESSION_FILE_NAME := UTIL_FOR_TREE.GET_FILE_HANDLE
  23221.                                              ( SUPRESS_CLEAR_SCREEN => true ) ; 
  23222.                      -- write the current graph file out to a
  23223.                      -- file with the specified name, default to current
  23224.                      if SESSION_FILE_NAME = TREE_IO.NULL_FILENAME then
  23225.                         SESSION_FILE_NAME := TREE_IO.DATA_FILENAME ;
  23226.                      end if ;
  23227.  
  23228.                      DISPLAY_TIMED_MESSAGE(
  23229.                         "Writing file " & SESSION_FILE_NAME ) ;
  23230.  
  23231.                      --  attempt to write the curent GRAPH_TREE to the file
  23232.                      TREE_IO.WRITE( TREE_IO.COMPLETE_FILE_NAME
  23233.                                        ( SESSION_FILE_NAME ,
  23234.                                          TREE_IO.TREE_EXTENSION ) ) ;
  23235.                   exception 
  23236.                      when TREE_IO.INVALID_FILE_SPECIFIER =>
  23237.                         DISPLAY_ERROR
  23238.                          (" unable to create a file with the specified name ") ;
  23239.                      when others =>
  23240.                         DISPLAY_ERROR (" PROGRAM ERROR -- unable to complete file output ") ;
  23241.                   end ;
  23242.  
  23243.                   VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS
  23244.                      ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  23245.  
  23246.               when PRINT_CMD =>
  23247.                   -- print current graphic screen to printer.
  23248.                   GRAPHIC_DRIVER.PRINT_SCREEN ;
  23249.                when QUIT_CMD =>
  23250.                   -- request confirmation of quit
  23251.                   CONFIRM_STATUS := MMI_CONTROL_MENUS.CONTROL_DELETE_MENU ;
  23252.                   -- process the results of the confirmation
  23253.                   if CONFIRM_STATUS = CONFIRM_CMD then
  23254.                      -- exit program without saving any files.
  23255.                      -- set terminal to standard operating mode
  23256.                      GRAPHIC_DRIVER.TERMINATE_GRAPHICS_MODE ;
  23257.                      DONE := true ;  -- exit the loop 
  23258.                   end if ;
  23259.                when FINISHED_CMD =>
  23260.                   VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE (
  23261.                      "Writing file " & TREE_IO.DATA_FILENAME ,
  23262.                      FORMAT_FCT'( CENTER_A_LINE ) ,
  23263.                      ROW_NO( 23 ) ) ;
  23264.                   -- Save files under current file name and then exit program.
  23265.                   TREE_IO.WRITE ( TREE_IO.COMPLETE_FILE_NAME
  23266.                                      ( TREE_IO.DATA_FILENAME ,
  23267.                                        TREE_IO.TREE_EXTENSION ) ) ;
  23268.                   -- set terminal to standard operating mode
  23269.                   GRAPHIC_DRIVER.TERMINATE_GRAPHICS_MODE ;
  23270.                   DONE := true ;  -- exit the loop 
  23271.                when others =>
  23272.                   -- this should not occur
  23273.                   null ;
  23274.             end case ; -- COMMAND
  23275.          exception
  23276.             when HANDLE_RESTART =>
  23277.                -- exception used to return to the main menu
  23278.                null ;
  23279.             when GRAPHICS_DATA.AVAILABLE_SEGMENTS_EXHAUSTED =>
  23280.                -- This exception is raised when the segments in
  23281.                -- the GRAPHICS_DRIVER have been exhausted.  Recovery
  23282.                -- is performed by restarting the drawing with
  23283.                -- the first segment available above those used
  23284.                -- for the menus.
  23285.  
  23286.                DISPLAY_ERROR (" Segment Identifier Recovery To Begin ") ;
  23287.  
  23288.                --  delete the current contents of the tree
  23289.                GRAPHIC_DRIVER.SELECT_WINDOW  (GRAPH_VIEW_PORT) ;
  23290.                for GPTR in 1 .. TREE_DATA.MAX_GRAPH_NODES loop
  23291.                   if GRAPH(GPTR).OWNING_TREE_NODE /= NULL_POINTER then
  23292.                      if GRAPH(GPTR).DATA.SEGMENT_ID /= NULL_SEGMENT then
  23293.                         GRAPHIC_DRIVER.DELETE_SEGMENT
  23294.                          ( GRAPH(GPTR).DATA.SEGMENT_ID ) ;
  23295.                      end if ;
  23296.                      if GRAPH(GPTR).DATA.LABEL_SEG_ID /= NULL_SEGMENT then
  23297.                         GRAPHIC_DRIVER.DELETE_SEGMENT
  23298.                          ( GRAPH(GPTR).DATA.LABEL_SEG_ID ) ;
  23299.                      end if ;
  23300.                      if GRAPH(GPTR).DATA.LABEL2_SEG_ID /= NULL_SEGMENT then
  23301.                         GRAPHIC_DRIVER.DELETE_SEGMENT
  23302.                          ( GRAPH(GPTR).DATA.LABEL2_SEG_ID ) ;
  23303.                      end if ;
  23304.                   end if ;
  23305.                end loop ;
  23306.                GRAPHIC_DRIVER.SELECT_WINDOW  (MENU_VIEW_PORT) ;
  23307.  
  23308.                -- now draw the tree
  23309.                UTIL_FOR_TREE.DRAW_GRAPH_TREE ;
  23310.  
  23311.             when others =>
  23312.               -- handle error conditions that might occur
  23313.               -- report the error and continue
  23314.               DISPLAY_ERROR (" PROGRAM ERROR -- in process command ") ;
  23315.          end ;
  23316.       end loop ; 
  23317.  
  23318.       if TRACE_PKG.REQUEST_TRACE then
  23319.          TRACE_PKG.TRACE ( "MMI.PROCESS_COMMAND end procedure" ) ;
  23320.       end if ;
  23321.  
  23322.    end PROCESS_COMMAND ; 
  23323.  
  23324.  
  23325.    procedure PANIC_EXIT is 
  23326.    -- =======================================================
  23327.    --  This procedure orchestrates an abnormal termination
  23328.    --  condition detected by the program unit.
  23329.    -- ========================================================
  23330.       WARNING_LINE : constant STRING :=
  23331.        "PROGRAM ERROR -- unhandled exception propagated by the MMI " ;
  23332.    begin 
  23333.       if TRACE_PKG.REQUEST_TRACE then
  23334.          TRACE_PKG.TRACE ( "MMI.PANIC_EXIT" ) ;
  23335.       end if ;
  23336.  
  23337.       -- set terminal to standard operating mode
  23338.       GRAPHIC_DRIVER.TERMINATE_GRAPHICS_MODE ;
  23339.       -- send message to user via alpha screen that the program has
  23340.       --  failed and we will try to save work in a temp file.
  23341.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  23342.          ( " " , FORMAT_FCT'( CLEAR_SCREEN ) , ROW_NO( 1 )) ;
  23343.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  23344.          ( WARNING_LINE , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 23 ));
  23345.       VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE
  23346.          ( ">>>> " & TREE_IO.COMPLETE_FILE_NAME( TREE_IO.DEFAULT_FILENAME ,
  23347.                                                  TREE_IO.TREE_EXTENSION ) &
  23348.            " <<<<" , FORMAT_FCT'( CENTER_A_LINE ) , ROW_NO( 24 ));
  23349.       TREE_IO.WRITE( TREE_IO.COMPLETE_FILE_NAME( TREE_IO.DEFAULT_FILENAME ,
  23350.                                                  TREE_IO.TREE_EXTENSION ) ) ;
  23351.  
  23352.       if TRACE_PKG.REQUEST_TRACE then
  23353.          TRACE_PKG.TRACE ( "MMI.PANIC_EXIT end procedure" ) ;
  23354.       end if ;
  23355.  
  23356.    end PANIC_EXIT ;
  23357.  
  23358. begin
  23359.  
  23360.    null;
  23361.  
  23362. end MMI ; 
  23363. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  23364. --gad.ada
  23365. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  23366. -- version 86-01-20 16:15 by JL
  23367.  
  23368. with SYSTEM ;
  23369. with MMI ;           use MMI ;
  23370. with UTILITIES ;     use UTILITIES ;
  23371. with VIRTUAL_TERMINAL_INTERFACE ; use VIRTUAL_TERMINAL_INTERFACE ;
  23372. with UTIL_FOR_TREE ; use UTIL_FOR_TREE ;
  23373. with TREE_IO ;       use TREE_IO ;
  23374. with TEXT_IO ;       use TEXT_IO ;
  23375.  
  23376. procedure GAD is
  23377. -- ==================================================================
  23378. --
  23379. --  This is the main procedure of GAD and it will
  23380. --  control and execute the procedures and packages needed
  23381. --  to operate GAD. It will control the creation and
  23382. --  initialization of the graphics data file, the 
  23383. --  execution of the Man-Machine Interface, and top level
  23384. --  error handling.
  23385. --  
  23386. --  Requirements:
  23387. --   1) create working file 
  23388. --   2) open existing file and copy into working file,
  23389. --      close when completed.
  23390. --   3) invoke MMI_OPERATIONS command processor
  23391. --   4) handle error conditions (exceptions)
  23392. --
  23393. -- ==================================================================
  23394.    SESSION_FILE      : TEXT_IO.FILE_TYPE ;
  23395.    SESSION_FILE_NAME : TREE_IO.FILENAME_TYPE ;
  23396.    
  23397. begin
  23398.    -- set sign on display to prototype
  23399.    UTILITIES.PROTOTYPE_SIGN_ON := False ;
  23400.    --  initialize global and package specific data
  23401.    MMI.INITIALIZE ;
  23402.    --  get new_filename
  23403.    SESSION_FILE_NAME := UTIL_FOR_TREE.GET_FILE_HANDLE ; 
  23404.    CHECK_FOR_OLD_SESSION_NAME :
  23405.       begin -- CHECK_FOR_OLD_SESSION_NAME
  23406.          if SESSION_FILE_NAME /= TREE_IO.NULL_FILENAME then
  23407.             -- see if file currently exists
  23408.             -- raises NAME_ERROR if it doesn't
  23409.             TEXT_IO.OPEN ( SESSION_FILE ,
  23410.                            TEXT_IO.IN_FILE ,
  23411.                            TREE_IO.COMPLETE_FILE_NAME( SESSION_FILE_NAME ,
  23412.                                                        TREE_IO.TREE_EXTENSION));
  23413.             -- close file for tree_io.read
  23414.             TEXT_IO.CLOSE ( SESSION_FILE ) ;
  23415.             VIRTUAL_TERMINAL_INTERFACE.FORMAT_LINE (
  23416.                "Reading from " & SESSION_FILE_NAME ,
  23417.                FORMAT_FUNCTION'( CENTER_A_LINE ) ,
  23418.                ROW_TYPE'( 23 ) ) ;
  23419.  
  23420.             --  filename is used so read it in to initialize the GRAPH_TREE
  23421.             TREE_IO.READ( TREE_IO.COMPLETE_FILE_NAME( SESSION_FILE_NAME ,
  23422.                                                       TREE_IO.TREE_EXTENSION ));
  23423.             --  now draw the tree
  23424.             UTIL_FOR_TREE.DRAW_GRAPH_TREE ;
  23425.             -- set up tree file name
  23426.             TREE_IO.DATA_FILENAME := SESSION_FILE_NAME ;
  23427.          else
  23428.             -- set up tree file name to default name
  23429.             DISPLAY_TIMED_MESSAGE (
  23430.                "New file " & TREE_IO.DEFAULT_FILENAME ) ;
  23431.  
  23432.             TREE_IO.DATA_FILENAME := TREE_IO.DEFAULT_FILENAME ;
  23433.          end if ;
  23434.       exception -- CHECK_FOR_OLD_SESSION_NAME
  23435.          when NAME_ERROR =>
  23436.             -- its a new session name so continue
  23437.             DISPLAY_TIMED_MESSAGE (
  23438.                "New file " & SESSION_FILE_NAME ) ;
  23439.             TREE_IO.DATA_FILENAME := SESSION_FILE_NAME ;
  23440.          when others =>
  23441.             -- unknown error so pass it on
  23442.             raise ;
  23443.       end CHECK_FOR_OLD_SESSION_NAME ;
  23444.  
  23445.    VIRTUAL_TERMINAL_INTERFACE.LOW_LEVEL_OPERATIONS 
  23446.         ( VIRTUAL_TERMINAL_INTERFACE.ERASE_SCREEN ) ;
  23447.  
  23448.    MMI.PROCESS_COMMAND ;  --  invoke GAD command processor
  23449.  
  23450. exception
  23451.    --  catch any unhandled exceptions and notify the user.
  23452.    when OTHERS =>
  23453.       -- abort and reset the Man-Machine Interface
  23454.       MMI.PANIC_EXIT ;
  23455.       -- notify the User of this abnormal termination
  23456.       TEXT_IO.PUT_LINE(" PANIC EXIT PROCESS COMPLETED ");
  23457.       -- propagate the exception so that the error can
  23458.       -- be examined in greater detail
  23459.       raise;
  23460.  
  23461. end GAD ;
  23462. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  23463. --tree_util.ada
  23464. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  23465. -- version 17 January 1986 by JR (improved integer range)
  23466. -- version 1 November 1985 by JR
  23467.  
  23468. with GKS_SPECIFICATION ;
  23469. with GRAPHICS_DATA;       use GRAPHICS_DATA ;
  23470. with TEXT_IO;             use TEXT_IO;
  23471. with TREE_DATA;           use TREE_DATA;
  23472. with TREE_OPS;            use TREE_OPS;
  23473. with TREE_IO;             use TREE_IO;
  23474. with PDL_GEN;             use PDL_GEN;
  23475.  
  23476. procedure TREE_UTIL is
  23477. ----------------------------------------------------------------------------
  23478. --  This utility program can be used to test and maintain trees
  23479. --  built using the TREE facilities of the Graphic Ada Designer.
  23480. ----------------------------------------------------------------------------
  23481.  
  23482.    type NODE_TYPE is (TREE_NODES,
  23483.                       LIST_NODES,
  23484.                       GRAPH_NODES);
  23485.  
  23486.    FILENAME : FILENAME_TYPE := NULL_FILENAME;
  23487.    LENGTH : INTEGER;
  23488.    LIST_HEAD : LIST_NODE_ACCESS_TYPE;
  23489.    NODE_POINTER : TREE_NODE_ACCESS_TYPE := 1;
  23490.    NODE_POINTER2 : TREE_NODE_ACCESS_TYPE := 1;
  23491.    NODE_TYPE_IN_USE : NODE_TYPE := TREE_NODES;
  23492.    NODE_TYPE_TO_CREATE : ENTITY_TYPE := TYPE_PACKAGE;
  23493.    REQUESTED_LIST : LIST_TYPE := START;
  23494.    RESPONSE : STRING (1..80);
  23495.    TIME_TO_EXIT : BOOLEAN := FALSE;
  23496.  
  23497.    -------------------------------------------------------------------------
  23498.    --  A function to print an image of a SEGMENT
  23499.    -------------------------------------------------------------------------
  23500.    function SEGMENT_IMAGE (SEGMENT_ID: in GKS_SPECIFICATION.SEGMENT_NAME) 
  23501.     return STRING is
  23502.       --
  23503.       -- This function returns a string which is a printable
  23504.       -- image of the SEGMENT passed to it.
  23505.       --
  23506.       INT_SEGMENT_ID : INTEGER := INTEGER( SEGMENT_ID ) ;
  23507.    begin
  23508.       return INTEGER'image (INT_SEGMENT_ID) ;
  23509.    end SEGMENT_IMAGE ;
  23510.  
  23511.    -------------------------------------------------------------------------
  23512.    --  A function to print an image of a LIST
  23513.    -------------------------------------------------------------------------
  23514.    function LIST_IMAGE (LIST_HEAD: in INTEGER) return STRING is
  23515.       -- 
  23516.       -- This function returns a string which is a printable
  23517.       -- image of the List pointed to by LIST_HEAD
  23518.       --
  23519.       function NEXT_IMAGE (PTR: in INTEGER) return STRING is
  23520.          -- a local function to process the elements after the
  23521.          -- list head (if any exist);
  23522.          LPTR : INTEGER;
  23523.       begin
  23524.          if PTR <= 0 then
  23525.             return INTEGER'image(PTR);
  23526.          else
  23527.             return INTEGER'image(PTR) & ", " & NEXT_IMAGE(LIST(PTR).NEXT);
  23528.          end if;
  23529.       end NEXT_IMAGE;
  23530.    begin
  23531.       if LIST_HEAD <= 0 then
  23532.          return INTEGER'image(LIST_HEAD);
  23533.       else
  23534.          return INTEGER'image(LIST_HEAD) & "   [ " & 
  23535.                 NEXT_IMAGE(LIST(LIST_HEAD).NEXT) & " ]";
  23536.       end if;
  23537.    end LIST_IMAGE;
  23538.  
  23539.    -------------------------------------------------------------------------
  23540.    -- a procedure to view (display) a node of the selected type
  23541.    -------------------------------------------------------------------------
  23542.    procedure VIEW_NODE (NODE_KIND: in NODE_TYPE;
  23543.                         NUM: in INTEGER) is
  23544.       -- display the array element specified by num from the array
  23545.       -- type selected by NODE_KIND (TREE, LIST, or GRAPH).
  23546.    begin
  23547.       NEW_LINE;
  23548.       PUT_LINE (" NODE NUMBER:  " & INTEGER'image(NUM));
  23549.       case NODE_KIND is
  23550.          when TREE_NODES =>
  23551.             PUT_LINE (" NODE_TYPE:    "&ENTITY_TYPE'image(TREE(NUM).NODE_TYPE));
  23552.             PUT_LINE (" NAME:         "&TREE(NUM).NAME(1..25));
  23553.             PUT_LINE (" PARENT:       "&INTEGER'image(TREE(NUM).PARENT));
  23554.             PUT_LINE (" GRAPH_NODE:   "&INTEGER'image(TREE(NUM).GRAPH_DATA));
  23555.             PUT_LINE (" MEMBERSHIP:   " & LIST_IMAGE(TREE(NUM).MEMBERSHIP));
  23556.             case TREE(NUM).NODE_TYPE is
  23557.             when ROOT .. TYPE_TASK =>
  23558.                PUT_LINE (" CONTAINED:    " & LIST_IMAGE(TREE(NUM).CONTAINED_ENTITY_LIST));
  23559.                case TREE(NUM).NODE_TYPE is
  23560.                when TYPE_VIRTUAL_PACKAGE .. TYPE_FUNCTION =>
  23561.                   PUT_LINE (" GENERIC_STAT: "&TREE_DATA.GENERIC_STATUS_TYPE'image
  23562.                    (TREE(NUM).GENERIC_STATUS));
  23563.                   PUT_LINE (" CU_INSTAN:    "&TREE(NUM).CU_INSTANTIATED(1..25));
  23564.                   PUT_LINE (" PROLOG_PTR:   " & INTEGER'image(TREE(NUM).PROLOGUE_PTR));
  23565.                   PUT_LINE (" BODY_PTR:     " & INTEGER'image(TREE(NUM).BODY_PTR));
  23566.                   PUT_LINE (" DATA_LIST:    " & LIST_IMAGE(TREE(NUM).DATA_CONNECT_LIST));
  23567.                   if TREE(NUM).NODE_TYPE = TYPE_VIRTUAL_PACKAGE or
  23568.                      TREE(NUM).NODE_TYPE = TYPE_PACKAGE then
  23569.                      PUT_LINE (" EXPORTED:     " & LIST_IMAGE(TREE(NUM).EXPORTED_LIST));
  23570.                      PUT_LINE (" IMPORTED:     " & LIST_IMAGE(TREE(NUM).IMPORTED_LIST));
  23571.                   elsif TREE(NUM).NODE_TYPE = TYPE_FUNCTION or
  23572.                         TREE(NUM).NODE_TYPE = TYPE_PROCEDURE then
  23573.                      PUT_LINE (" HAS_PARAMS:   " & BOOLEAN'image(TREE(NUM).HAS_PARAMETERS));
  23574.                   end if;
  23575.                when TYPE_TASK =>
  23576.                   PUT_LINE (" PROLOG_PTR:   " & INTEGER'image(TREE(NUM).PROLOGUE_PTR));
  23577.                   PUT_LINE (" BODY_PTR:     " & INTEGER'image(TREE(NUM).BODY_PTR));
  23578.                   PUT_LINE (" DATA_LIST:    " & LIST_IMAGE(TREE(NUM).DATA_CONNECT_LIST));
  23579.                   PUT_LINE (" TASK_STATUS:  " & TASK_STATUS_TYPE'image(TREE(NUM).TASK_STATUS));
  23580.                   PUT_LINE (" ENTRY_LIST:   " & LIST_IMAGE(TREE(NUM).ENTRY_LIST));
  23581.                when others =>
  23582.                   null;
  23583.                end case;
  23584.             when TYPE_ENTRY_POINT =>
  23585.                PUT_LINE (" IS_GUARDED:   " & BOOLEAN'image(TREE(NUM).IS_GUARDED));
  23586.                PUT_LINE (" WITH_PARAMS:  " & BOOLEAN'image(TREE(NUM).WITH_PARAMETERS));
  23587.             when TYPE_BODY =>
  23588.                PUT_LINE (" CALLEE_LIST:  " & LIST_IMAGE(TREE(NUM).CALLEE_LIST));
  23589.             when EXPORTED_PROCEDURE .. CONNECTION_FOR_DATA =>
  23590.                PUT_LINE (" CALL_VARIETY: "&CALL_CONNECTION_TYPE'image
  23591.                 (TREE(NUM).CALL_VARIETY));
  23592.                PUT_LINE (" CONNECTEE:    "&INTEGER'image
  23593.                 (TREE(NUM).CONNECTEE));
  23594.                PUT (" LINE_POINTS: ") ;
  23595.                for I in 1..TREE_DATA.MAXIMUM_NO_LINE_SEGMENTS loop
  23596.                   PUT (" " & INTEGER'image(TREE(NUM).LINE(I)) & ",") ;
  23597.                end loop ;
  23598.                NEW_LINE ;
  23599.             when others =>
  23600.                null;
  23601.             end case;
  23602.          when LIST_NODES =>
  23603.             PUT_LINE (" ITEM:         "&INTEGER'image(LIST(NUM).ITEM));
  23604.             PUT_LINE (" PRIOR:        "&INTEGER'image(LIST(NUM).PRIOR));
  23605.             PUT_LINE (" NEXT:         "&INTEGER'image(LIST(NUM).NEXT));
  23606.             PUT_LINE (" REF_COUNT:    "&INTEGER'image(LIST(NUM).REF_COUNT));
  23607.          when GRAPH_NODES =>
  23608.             PUT_LINE (" OWNING_TREE:  "&INTEGER'image(GRAPH(NUM).OWNING_TREE_NODE));
  23609.             PUT_LINE (" DATA.SEGMENT: "&SEGMENT_IMAGE(GRAPH(NUM).DATA.SEGMENT_ID));
  23610.             PUT_LINE (" DATA.LAB_SEG: "&SEGMENT_IMAGE(GRAPH(NUM).DATA.LABEL_SEG_ID));
  23611.             PUT_LINE (" DATA.LAB_SG2: "&SEGMENT_IMAGE(GRAPH(NUM).DATA.LABEL2_SEG_ID));
  23612.             PUT_LINE (" DATA.LOC.X:   "&INTEGER'image(GRAPH(NUM).DATA.LOCATION.X));
  23613.             PUT_LINE (" DATA.LOC.Y:   "&INTEGER'image(GRAPH(NUM).DATA.LOCATION.Y));
  23614.             PUT_LINE (" DATA.SIZE.X:  "&INTEGER'image(GRAPH(NUM).DATA.SIZE.X));
  23615.             PUT_LINE (" DATA.SIZE.Y:  "&INTEGER'image(GRAPH(NUM).DATA.SIZE.Y));
  23616.       end case;
  23617.    end VIEW_NODE;
  23618.  
  23619.    -------------------------------------------------------------------------
  23620.    function INTEGER_VALUE (TEXT: in STRING) return INTEGER is
  23621.       -- substitutes for the missing INTEGER'VALUE function
  23622.       NEGATIVE : BOOLEAN := FALSE;
  23623.       NUM : INTEGER := 0;
  23624.    begin
  23625.       for I in TEXT'range loop
  23626.          case TEXT(I) is
  23627.             when '-' => 
  23628.                if I /= TEXT'first then
  23629.                   raise NUMERIC_ERROR;
  23630.                else
  23631.                   NEGATIVE := TRUE;
  23632.                end if;
  23633.             when '0' => NUM := NUM*10;
  23634.             when '1' => NUM := NUM*10 + 1;
  23635.             when '2' => NUM := NUM*10 + 2;
  23636.             when '3' => NUM := NUM*10 + 3;
  23637.             when '4' => NUM := NUM*10 + 4;
  23638.             when '5' => NUM := NUM*10 + 5;
  23639.             when '6' => NUM := NUM*10 + 6;
  23640.             when '7' => NUM := NUM*10 + 7;
  23641.             when '8' => NUM := NUM*10 + 8;
  23642.             when '9' => NUM := NUM*10 + 9;
  23643.             when others => raise NUMERIC_ERROR;
  23644.          end case;
  23645.       end loop;
  23646.       if NEGATIVE then
  23647.          return -NUM;
  23648.       else
  23649.          return NUM;
  23650.       end if;
  23651.    end INTEGER_VALUE;
  23652.  
  23653.  
  23654.    -------------------------------------------------------------------------
  23655.    --  procedures to edit Nodes values
  23656.    -------------------------------------------------------------------------
  23657.    procedure EDIT (PROMPT: in STRING;
  23658.                    VALUE: in out INTEGER) is
  23659.       -- allows user to edit the value or keep old value
  23660.       BAD_VALUE_ENTERED : exception;
  23661.       DONE : BOOLEAN := FALSE;
  23662.       LENGTH : INTEGER;
  23663.       LINE : STRING (1..80);
  23664.       NEW_VALUE : INTEGER := -999;
  23665.    begin
  23666.       while not DONE loop
  23667.          begin
  23668.             PUT (PROMPT & " (" & INTEGER'image(VALUE) & ")  >");
  23669.             GET_LINE (LINE, LENGTH);
  23670.             -- skip unless a new value was entered
  23671.             if LENGTH > 0 then
  23672.                NEW_VALUE := INTEGER_VALUE (LINE(1..LENGTH));
  23673.                if NEW_VALUE < -1 or NEW_VALUE > 32768 then
  23674.                   raise BAD_VALUE_ENTERED;
  23675.                end if;
  23676.                VALUE := NEW_VALUE;
  23677.             end if;
  23678.             DONE := TRUE;  -- exit the loop
  23679.          exception
  23680.             when BAD_VALUE_ENTERED =>
  23681.                PUT_LINE (" BAD VALUE ENTERED (out of range) - Try Again ");
  23682.             when others =>
  23683.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23684.          end;
  23685.       end loop;
  23686.    end EDIT;
  23687.  
  23688.    procedure EDIT (PROMPT: in STRING;
  23689.                    VALUE: in out GKS_SPECIFICATION.SEGMENT_NAME) is
  23690.       -- allows user to edit the value or keep old value
  23691.       INT_VALUE : INTEGER := INTEGER( VALUE ) ;
  23692.    begin
  23693.       EDIT ( PROMPT, INT_VALUE ) ;
  23694.       VALUE := GKS_SPECIFICATION.SEGMENT_NAME( INT_VALUE ) ;
  23695.    end EDIT ;
  23696.  
  23697.    procedure EDIT (PROMPT: in STRING;
  23698.                    VALUE: in out BOOLEAN) is
  23699.       -- allows user to edit the value or keep old value
  23700.       DONE : BOOLEAN := FALSE;
  23701.       LENGTH : INTEGER;
  23702.       LINE : STRING (1..80);
  23703.    begin
  23704.       while not DONE loop
  23705.          begin
  23706.             PUT (PROMPT & " (" & BOOLEAN'image(VALUE) & ")  >");
  23707.             GET_LINE (LINE, LENGTH);
  23708.             -- skip unless a new value was entered
  23709.             if LENGTH > 0 then
  23710.                VALUE := BOOLEAN'value (LINE(1..LENGTH));
  23711.             end if;
  23712.             DONE := TRUE;  -- exit the loop
  23713.          exception
  23714.             when others =>
  23715.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23716.          end;
  23717.       end loop;
  23718.    end EDIT;
  23719.  
  23720.    procedure EDIT (PROMPT: in STRING;
  23721.                    VALUE: in out STRING) is
  23722.       -- allows user to edit the value or keep old value
  23723.       BAD_VALUE_ENTERED : exception;
  23724.       DONE : BOOLEAN := FALSE;
  23725.       LENGTH : INTEGER;
  23726.       LINE : STRING (1..80) := "                                        "&
  23727.                                "                                        ";
  23728.        -- fill line to insure a replacement string is trailed by blanks
  23729.    begin
  23730.       while not DONE loop
  23731.          begin
  23732.             if VALUE'last < 25 then
  23733.                PUT (PROMPT & " (" & VALUE & ")  >");
  23734.             else
  23735.                PUT (PROMPT & " (" & VALUE(1..25) & ")  >");
  23736.             end if;
  23737.             GET_LINE (LINE, LENGTH);
  23738.             -- skip unless a new value was entered
  23739.             if LENGTH > 0 then
  23740.                VALUE := LINE (1..VALUE'last);
  23741.             end if;
  23742.             DONE := TRUE;  -- exit the loop
  23743.          exception
  23744.             when others =>
  23745.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23746.          end;
  23747.       end loop;
  23748.    end EDIT;
  23749.  
  23750.    procedure EDIT (PROMPT: in STRING;
  23751.                    VALUE: in out ENTITY_TYPE) is
  23752.       -- allows user to edit the value or keep old value
  23753.       BAD_VALUE_ENTERED : exception;
  23754.       DONE : BOOLEAN := FALSE;
  23755.       LENGTH : INTEGER;
  23756.       LINE : STRING (1..80) ;
  23757.    begin
  23758.       while not DONE loop
  23759.          begin
  23760.             PUT (PROMPT & " (" & ENTITY_TYPE'image(VALUE) & ")  >");
  23761.             GET_LINE (LINE, LENGTH);
  23762.             -- skip unless a new value was entered
  23763.             if LENGTH > 0 then
  23764.                VALUE := ENTITY_TYPE'value( LINE(1..LENGTH) );
  23765.             end if;
  23766.             DONE := TRUE;  -- exit the loop
  23767.          exception
  23768.             when others =>
  23769.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23770.          end;
  23771.       end loop;
  23772.    end EDIT;
  23773.  
  23774.    procedure EDIT (PROMPT: in STRING;
  23775.                    VALUE: in out LIST_TYPE) is
  23776.       -- allows user to edit the value or keep old value
  23777.       BAD_VALUE_ENTERED : exception;
  23778.       DONE : BOOLEAN := FALSE;
  23779.       LENGTH : INTEGER;
  23780.       LINE : STRING (1..80) ;
  23781.    begin
  23782.       while not DONE loop
  23783.          begin
  23784.             PUT (PROMPT & " (" & LIST_TYPE'image(VALUE) & ")  >");
  23785.             GET_LINE (LINE, LENGTH);
  23786.             -- skip unless a new value was entered
  23787.             if LENGTH > 0 then
  23788.                VALUE := LIST_TYPE'value( LINE(1..LENGTH) );
  23789.             end if;
  23790.             DONE := TRUE;  -- exit the loop
  23791.          exception
  23792.             when others =>
  23793.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23794.          end;
  23795.       end loop;
  23796.    end EDIT;
  23797.  
  23798.    procedure EDIT (PROMPT: in STRING;
  23799.                    VALUE: in out CALL_CONNECTION_TYPE) is
  23800.       -- allows user to edit the value or keep old value
  23801.       BAD_VALUE_ENTERED : exception;
  23802.       DONE : BOOLEAN := FALSE;
  23803.       LENGTH : INTEGER;
  23804.       LINE : STRING (1..80) ;
  23805.    begin
  23806.       while not DONE loop
  23807.          begin
  23808.             PUT (PROMPT & " (" & CALL_CONNECTION_TYPE'image(VALUE) & ")  >");
  23809.             GET_LINE (LINE, LENGTH);
  23810.             -- skip unless a new value was entered
  23811.             if LENGTH > 0 then
  23812.                VALUE := CALL_CONNECTION_TYPE'value( LINE(1..LENGTH) );
  23813.             end if;
  23814.             DONE := TRUE;  -- exit the loop
  23815.          exception
  23816.             when others =>
  23817.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23818.          end;
  23819.       end loop;
  23820.    end EDIT;
  23821.  
  23822.    procedure EDIT (PROMPT: in STRING;
  23823.                    VALUE: in out TREE_DATA.GENERIC_STATUS_TYPE) is
  23824.       -- allows user to edit the value or keep old value
  23825.       BAD_VALUE_ENTERED : exception;
  23826.       DONE : BOOLEAN := FALSE;
  23827.       LENGTH : INTEGER;
  23828.       LINE : STRING (1..80);
  23829.    begin
  23830.       while not DONE loop
  23831.          begin
  23832.             PUT (PROMPT & " (" & TREE_DATA.GENERIC_STATUS_TYPE'image(VALUE) & ")  >");
  23833.             GET_LINE (LINE, LENGTH);
  23834.             -- skip unless a new value was entered
  23835.             if LENGTH > 0 then
  23836.                VALUE := TREE_DATA.GENERIC_STATUS_TYPE'value( LINE(1..LENGTH) );
  23837.             end if;
  23838.             DONE := TRUE;  -- exit the loop
  23839.          exception
  23840.             when others =>
  23841.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23842.          end;
  23843.       end loop;
  23844.    end EDIT;
  23845.  
  23846.    procedure EDIT (PROMPT: in STRING;
  23847.                    VALUE: in out TASK_STATUS_TYPE) is
  23848.       -- allows user to edit the value or keep old value
  23849.       BAD_VALUE_ENTERED : exception;
  23850.       DONE : BOOLEAN := FALSE;
  23851.       LENGTH : INTEGER;
  23852.       LINE : STRING (1..80);
  23853.    begin
  23854.       while not DONE loop
  23855.          begin
  23856.             PUT (PROMPT & " (" & TASK_STATUS_TYPE'image(VALUE) & ")  >");
  23857.             GET_LINE (LINE, LENGTH);
  23858.             -- skip unless a new value was entered
  23859.             if LENGTH > 0 then
  23860.                VALUE := TASK_STATUS_TYPE'value( LINE(1..LENGTH) );
  23861.             end if;
  23862.             DONE := TRUE;  -- exit the loop
  23863.          exception
  23864.             when others =>
  23865.                PUT_LINE (" VALUE NOT ENTERED CORRECTLY - Try Again ");
  23866.          end;
  23867.       end loop;
  23868.    end EDIT;
  23869.  
  23870.    -------------------------------------------------------------------------
  23871.    -- The procedure to edit the contents of a node
  23872.    -------------------------------------------------------------------------
  23873.    procedure EDIT_NODE (NODE_KIND: in NODE_TYPE;
  23874.                         NUM: in INTEGER) is
  23875.       -- allows the user to edit the selected node, keeping old
  23876.       -- values if that is desired.
  23877.       LGRAPH : GRAPH_NODE_TYPE;
  23878.       LLIST : LIST_NODE_TYPE;
  23879.       LTREE : TREE_NODE_TYPE;
  23880.    begin
  23881.       case NODE_KIND is
  23882.          when TREE_NODES =>
  23883.             LTREE := TREE(NUM);
  23884.             NEW_LINE;
  23885.             PUT_LINE (" NODE_TYPE:    " & ENTITY_TYPE'image(LTREE.NODE_TYPE));
  23886.             EDIT (" NAME:         ", LTREE.NAME);
  23887.             EDIT (" PARENT:       ", LTREE.PARENT);
  23888.             EDIT (" GRAPH_NODE:   ", LTREE.GRAPH_DATA);
  23889.             EDIT (" MEMBERSHIP:   ", LTREE.MEMBERSHIP);
  23890.             case TREE(NUM).NODE_TYPE is
  23891.             when ROOT .. TYPE_TASK =>
  23892.                EDIT (" CONTAINED:    ", LTREE.CONTAINED_ENTITY_LIST);
  23893.                case LTREE.NODE_TYPE is
  23894.                when TYPE_VIRTUAL_PACKAGE .. TYPE_FUNCTION =>
  23895.                   EDIT (" GENERIC_STAT: ", LTREE.GENERIC_STATUS);
  23896.                   EDIT (" CU_INSTAN:    ", LTREE.CU_INSTANTIATED);
  23897.                   EDIT (" PROLOG_PTR:   ", LTREE.PROLOGUE_PTR);
  23898.                   EDIT (" BODY_PTR:     ", LTREE.BODY_PTR);
  23899.                   EDIT (" DATA_LIST:    ", LTREE.DATA_CONNECT_LIST);
  23900.                   if LTREE.NODE_TYPE = TYPE_VIRTUAL_PACKAGE or
  23901.                      LTREE.NODE_TYPE = TYPE_PACKAGE then
  23902.                      EDIT (" EXPORTED:     ", LTREE.EXPORTED_LIST);
  23903.                      EDIT (" IMPORTED:     ", LTREE.IMPORTED_LIST);
  23904.                   elsif TREE(NUM).NODE_TYPE = TYPE_FUNCTION or
  23905.                         TREE(NUM).NODE_TYPE = TYPE_PROCEDURE then
  23906.                      EDIT (" HAS_PARAMS:   ", LTREE.HAS_PARAMETERS);
  23907.                   end if;
  23908.                when TYPE_TASK =>
  23909.                   EDIT (" PROLOG_PTR:   ", LTREE.PROLOGUE_PTR);
  23910.                   EDIT (" BODY_PTR:     ", LTREE.BODY_PTR);
  23911.                   EDIT (" DATA_LIST:    ", LTREE.DATA_CONNECT_LIST);
  23912.                   EDIT (" TASK_STATUS:  ", LTREE.TASK_STATUS);
  23913.                   EDIT (" ENTRY_LIST:   ", LTREE.ENTRY_LIST);
  23914.                when others =>
  23915.                   null;
  23916.                end case;
  23917.             when TYPE_ENTRY_POINT =>
  23918.                EDIT (" IS_GUARDED:   ", LTREE.IS_GUARDED);
  23919.                EDIT (" WITH_PARAMS:  ", LTREE.WITH_PARAMETERS);
  23920.             when TYPE_BODY =>
  23921.                EDIT (" CALLEE_LIST:  ", LTREE.CALLEE_LIST);
  23922.             when EXPORTED_PROCEDURE .. CONNECTION_FOR_DATA =>
  23923.                EDIT (" CALL_VARIETY: ", LTREE.CALL_VARIETY);
  23924.                EDIT ("  CONNECTEE:   ", LTREE.CONNECTEE);
  23925.             when others =>
  23926.                null;
  23927.             end case;
  23928.             --  place the new values in the array
  23929.             TREE(NUM) := LTREE;
  23930.          when LIST_NODES =>
  23931.             LLIST := LIST(NUM);
  23932.             NEW_LINE;
  23933.             EDIT (" ITEM:         ", LLIST.ITEM);
  23934.             EDIT (" PRIOR:        ", LLIST.PRIOR);
  23935.             EDIT (" NEXT:         ", LLIST.NEXT);
  23936.             --  place the new values in the array
  23937.             LIST(NUM) := LLIST;
  23938.          when GRAPH_NODES =>
  23939.             LGRAPH := GRAPH(NUM);
  23940.             NEW_LINE;
  23941.             EDIT (" OWNING_TREE:  ", LGRAPH.OWNING_TREE_NODE);
  23942.             EDIT (" DATA.SEGMENT: ", LGRAPH.DATA.SEGMENT_ID);
  23943.             EDIT (" DATA.LAB_SEG: ", LGRAPH.DATA.LABEL_SEG_ID);
  23944.             EDIT (" DATA.LAB_SG2: ", LGRAPH.DATA.LABEL2_SEG_ID);
  23945.             EDIT (" DATA.LOC.X:   ", LGRAPH.DATA.LOCATION.X);
  23946.             EDIT (" DATA.LOC.Y:   ", LGRAPH.DATA.LOCATION.Y);
  23947.             EDIT (" DATA.SIZE.X:  ", LGRAPH.DATA.SIZE.X);
  23948.             EDIT (" DATA.SIZE.Y:  ", LGRAPH.DATA.SIZE.Y);
  23949.             GRAPH(NUM) := LGRAPH;
  23950.       end case;
  23951.    exception
  23952.       when others =>
  23953.          PUT_LINE (" error in data entry - input ignored ");
  23954.    end EDIT_NODE;
  23955.  
  23956. begin
  23957.    NEW_LINE;
  23958.    PUT_LINE (" TREE EDITOR ready ");
  23959.    while not TIME_TO_EXIT loop
  23960.       begin
  23961.          NEW_LINE;
  23962.          RESPONSE (1..10) := "          ";
  23963.          NEW_LINE;
  23964.          PUT (">");
  23965.          GET_LINE (RESPONSE, LENGTH);
  23966.          if LENGTH = 0 then
  23967.             -- view the next node 
  23968.             NODE_POINTER := NODE_POINTER + 1;
  23969.             VIEW_NODE (NODE_TYPE_IN_USE, NODE_POINTER);
  23970.          else
  23971.             -- process the requested command
  23972.             case RESPONSE(1) is
  23973.             when 'C'|'c' =>
  23974.                -- create the new nodes
  23975.                case NODE_TYPE_IN_USE is
  23976.                   when TREE_NODES =>
  23977.                      EDIT (" Node Type to be Created  ", NODE_TYPE_TO_CREATE);
  23978.                      NODE_POINTER := GET_NEW_TREE_NODE (NODE_TYPE_TO_CREATE);
  23979.                   when LIST_NODES =>
  23980.                      -- initially point to the root tree node (1)
  23981.                      NODE_POINTER := GET_NEW_LIST_NODE (1);
  23982.                   when GRAPH_NODES =>
  23983.                      -- initially attach the node to the root tree node (1)
  23984.                      NODE_POINTER := GET_NEW_GRAPH_NODE (1);
  23985.                end case;
  23986.                PUT_LINE (" Node Created is > " & INTEGER'image(NODE_POINTER) );
  23987.                EDIT_NODE (NODE_TYPE_IN_USE, NODE_POINTER);
  23988.             when 'D'|'d' =>
  23989.                NEW_LINE;
  23990.                EDIT (" ENTER NODE TO DELETE ", NODE_POINTER);
  23991.                case NODE_TYPE_IN_USE is
  23992.                   when TREE_NODES =>
  23993.                      RELEASE_TREE_NODE (NODE_POINTER);
  23994.                   when LIST_NODES =>
  23995.                      NODE_POINTER2 := NULL_POINTER;
  23996.                      RELEASE_LIST_NODE (NODE_POINTER);
  23997.                   when GRAPH_NODES =>
  23998.                      RELEASE_GRAPH_NODE (NODE_POINTER);
  23999.                end case;
  24000.             when 'E'|'e' =>
  24001.                TIME_TO_EXIT := TRUE;  -- exit the command processing loop
  24002.             when 'G'|'g' =>
  24003.                NODE_TYPE_IN_USE := GRAPH_NODES;
  24004.                PUT_LINE (" GRAPH NODES now in use ");
  24005.             when 'H'|'h'|'?' =>
  24006.                NEW_LINE;
  24007.                PUT_LINE (" CREATE a new node ");
  24008.                PUT_LINE (" DELETE a node ");
  24009.                PUT_LINE (" EXIT ");
  24010.                PUT_LINE (" GRAPH nodes to be displayed and modified ");
  24011.                PUT_LINE (" HELP ");
  24012.                PUT_LINE (" INSERT a list node into a list ");
  24013.                PUT_LINE (" LIST nodes to be displayed and modified ");
  24014.                PUT_LINE (" MODIFY a node ");
  24015.                PUT_LINE (" PDL generation ");
  24016.                PUT_LINE (" READ a tree file ");
  24017.                PUT_LINE (" TREE nodes to be displayed and modified ");
  24018.                PUT_LINE (" VIEW a node ");
  24019.                PUT_LINE (" WRITE a tree file ");
  24020.                PUT_LINE (" <num> to view a node of that number ");
  24021.             when 'I'|'i' =>
  24022.                EDIT (" ENTER TREE NODE WITH LIST ", NODE_POINTER);
  24023.                EDIT (" ENTER LIST TO BE PLACED ON >", REQUESTED_LIST);
  24024.                EDIT (" ENTER LIST NODE TO INSERT ", NODE_POINTER2);
  24025.                ADD_NODE_TO_LIST (NODE_POINTER, REQUESTED_LIST, NODE_POINTER2);
  24026.             when 'L'|'l' =>
  24027.                NODE_TYPE_IN_USE := LIST_NODES;
  24028.                PUT_LINE (" LIST NODES now in use ");
  24029.             when 'M'|'m' =>
  24030.                NEW_LINE;
  24031.                EDIT (" ENTER NODE TO MODIFY ", NODE_POINTER);
  24032.                EDIT_NODE (NODE_TYPE_IN_USE, NODE_POINTER);
  24033.             when 'P'|'p' =>
  24034.                -- perform PDL Generation on current tree
  24035.                declare
  24036.                   FILEHANDLE : FILE_TYPE;
  24037.                begin
  24038.                   PUT (" DO YOU WANT TRACING (NO) ? ");
  24039.                   GET_LINE (RESPONSE,LENGTH);
  24040.                   if LENGTH > 0 and then 
  24041.                    ( RESPONSE(1)='Y' or RESPONSE(1)='y' ) then
  24042.                      TRACE_GENERATION := TRUE;
  24043.                   else
  24044.                      TRACE_GENERATION := FALSE;
  24045.                   end if;
  24046.                   if FILENAME = NULL_FILENAME then
  24047.                      GENERATE_PDL (TREE_IO.DEFAULT_FILENAME) ;
  24048.                   else
  24049.                      GENERATE_PDL (FILENAME) ;
  24050.                   end if ;
  24051.                end;
  24052.             when 'R'|'r' =>
  24053.                FILENAME := NULL_FILENAME;
  24054.                NEW_LINE;
  24055.                PUT (" ENTER NAME OF FILE TO READ FROM > ");
  24056.                GET_LINE (FILENAME,LENGTH);
  24057.                if LENGTH > 0 then
  24058.                   READ ( COMPLETE_FILE_NAME ( FILENAME, TREE_EXTENSION ) );
  24059.                end if;
  24060.             when 'T'|'t' =>
  24061.                NODE_TYPE_IN_USE := TREE_NODES;
  24062.                PUT_LINE (" TREE NODES now in use ");
  24063.             when 'V'|'v' =>
  24064.                NEW_LINE;
  24065.                EDIT (" ENTER NODE TO VIEW ", NODE_POINTER);
  24066.                VIEW_NODE (NODE_TYPE_IN_USE, NODE_POINTER);
  24067.             when 'W'|'w' =>
  24068.                FILENAME := NULL_FILENAME;
  24069.                NEW_LINE;
  24070.                PUT (" ENTER NAME OF FILE TO WRITE TO > ");
  24071.                GET_LINE (FILENAME,LENGTH);
  24072.                if LENGTH > 0 then
  24073.                   WRITE ( COMPLETE_FILE_NAME ( FILENAME, TREE_EXTENSION ) );
  24074.                end if;
  24075.             when '0'..'9' =>
  24076.                NODE_POINTER := INTEGER_VALUE (RESPONSE(1..LENGTH));
  24077.                VIEW_NODE (NODE_TYPE_IN_USE, NODE_POINTER);
  24078.             when others =>
  24079.                NEW_LINE;
  24080.                PUT_LINE (" Invalid Command - Please Try Again ");
  24081.                NEW_LINE;
  24082.             end case;
  24083.          end if;
  24084.       exception
  24085.          when others =>
  24086.             PUT_LINE (" Error Trapped by Exception Handler - Continuing ");
  24087.       end;
  24088.    end loop;
  24089.  
  24090. end TREE_UTIL;
  24091.  
  24092. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  24093. --support_package_spec.ada
  24094. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  24095. package SUPPORT_PACKAGE is
  24096.  
  24097.    type TBD_TYPE is (TBD) ;       -- used as function return value
  24098.  
  24099.    TBD_OBJECT     : TBD_TYPE ;    -- the function return value
  24100.  
  24101.    TBD_PARAMETERS : TBD_TYPE ;    -- the subprogram calling parameters
  24102.  
  24103.    TBD_TIME       : DURATION ;    -- used in delay statements
  24104.  
  24105.    TBD_CONDITION  : BOOLEAN ;     -- used in conditional statements
  24106.  
  24107. end SUPPORT_PACKAGE ;
  24108.