    class
    	EV_MODEL_GROUP

    General
    	cluster: interface
    	description:
    		"A EV_FIGURE_GROUP is an ARRAYED_LIST of EV_FIGURE.
    		Since EV_FIGURE_GROUP is also an EV_FIGURE (composite pattern) you
    		can rotate, scale and change the position of an EV_FIGURE_GROUP.
    		All elements in the group are rotated around the center
    		of the EV_FIGURE_GROUP. A EV_FIGURE can only be grouped
    		in one group at the same time.
    		"
    	create: make_filled, make_with_point, make_with_position, default_create

    Ancestors
    	ARRAYED_LIST [G]
    	EV_MODEL*
    	EV_MODEL_SINGLE_POINTED*

    Action sequences
    	conforming_pick_actions: EV_NOTIFY_ACTION_SEQUENCE
    	drop_actions: EV_PND_ACTION_SEQUENCE
    	pick_actions: EV_PND_START_ACTION_SEQUENCE
    	pointer_button_press_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    	pointer_button_release_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    	pointer_double_press_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    	pointer_enter_actions: EV_NOTIFY_ACTION_SEQUENCE
    	pointer_leave_actions: EV_NOTIFY_ACTION_SEQUENCE
    	pointer_motion_actions: EV_POINTER_MOTION_ACTION_SEQUENCE

    Queries
    	accept_cursor: EV_POINTER_STYLE
    	after: BOOLEAN
    	angle: REAL_64
    	are_events_sended_to_group: BOOLEAN
    	before: BOOLEAN
    	bounding_box: EV_RECTANGLE
    	capacity: INTEGER_32
    	changeable_comparison_criterion: BOOLEAN
    	count: INTEGER_32
    	cursor: ARRAYED_LIST_CURSOR
    	deep_elements: LIST [EV_MODEL]
    	deny_cursor: EV_POINTER_STYLE
    	duplicate (n: INTEGER_32): [like Current] EV_MODEL_GROUP
    	exhausted: BOOLEAN
    	Extendible: BOOLEAN
    	first: [like item] EV_MODEL
    	for_all (test: FUNCTION [ANY, TUPLE [EV_MODEL], BOOLEAN]): BOOLEAN
    	full: BOOLEAN
    	group: EV_MODEL_GROUP
    	has (v: [like item] EV_MODEL): BOOLEAN
    	has_capture: BOOLEAN
    	has_deep (figure: EV_MODEL): BOOLEAN
    	i_th alias "[]" (i: INTEGER_32): [like item] EV_MODEL
    	id: INTEGER_32
    	id_object (an_id: INTEGER_32): IDENTIFIED
    	index: INTEGER_32
    	index_of (v: [like item] EV_MODEL; i: INTEGER_32): INTEGER_32
    	index_set: INTEGER_INTERVAL
    	infix "@" (i: INTEGER_32): [like item] EV_MODEL
    	invalid_rectangle: EV_RECTANGLE
    	is_center_valid: BOOLEAN
    	is_empty: BOOLEAN
    	is_grouped: BOOLEAN
    	is_hashable: BOOLEAN
    	is_in_group: BOOLEAN
    	is_in_world: BOOLEAN
    	is_inserted (v: EV_MODEL): BOOLEAN
    	is_rotatable: BOOLEAN
    	is_scalable: BOOLEAN
    	is_sensitive: BOOLEAN
    	is_show_requested: BOOLEAN
    	is_transformable: BOOLEAN
    	isfirst: BOOLEAN
    	islast: BOOLEAN
    	item: EV_MODEL
    	last: [like first] EV_MODEL
    	linear_representation: LINEAR [EV_MODEL]
    	object_comparison: BOOLEAN
    	object_id: INTEGER_32
    	occurrences (v: [like item] EV_MODEL): INTEGER_32
    	off: BOOLEAN
    	pebble: ANY
    	pebble_function: FUNCTION [ANY, TUPLE, ANY]
    	point: EV_COORDINATE
    	point_count: INTEGER_32
    	point_relative: EV_COORDINATE
    	point_x: INTEGER_32
    	point_x_relative: INTEGER_32
    	point_y: INTEGER_32
    	point_y_relative: INTEGER_32
    	pointer_style: EV_POINTER_STYLE
    	position_on_figure (a_x, a_y: INTEGER_32): BOOLEAN
    	prunable: BOOLEAN
    	readable: BOOLEAN
    	sequential_occurrences (v: [like item] EV_MODEL): INTEGER_32
    	target_name: STRING_GENERAL
    	there_exists (test: FUNCTION [ANY, TUPLE [EV_MODEL], BOOLEAN]): BOOLEAN
    	update_rectangle: EV_RECTANGLE
    	valid_cursor (p: CURSOR): BOOLEAN
    	valid_cursor_index (i: INTEGER_32): BOOLEAN
    	valid_index (i: INTEGER_32): BOOLEAN
    	world: EV_MODEL_WORLD
    	writable: BOOLEAN
    	x: INTEGER_32
    	y: INTEGER_32

    Commands
    	append (s: SEQUENCE [EV_MODEL])
    	back
    	bring_forward (a_figure: EV_MODEL)
    	bring_to_front (a_figure: EV_MODEL)
    	center_invalidate
    	compare_objects
    	compare_references
    	disable_capture
    	disable_events_sended_to_group
    	disable_sensitive
    	do_all (action: PROCEDURE [ANY, TUPLE [EV_MODEL]])
    	do_if (action: PROCEDURE [ANY, TUPLE [EV_MODEL]]; test: FUNCTION [ANY, TUPLE [EV_MODEL], BOOLEAN])
    	enable_capture
    	enable_events_sended_to_group
    	enable_sensitive
    	extend (v: [like item] EV_MODEL)
    	fill (other: CONTAINER [EV_MODEL])
    	finish
    	force (v: [like item] EV_MODEL)
    	force_i_th (fig: [like item] EV_MODEL; i: INTEGER_32)
    	forth
    	go_i_th (i: INTEGER_32)
    	go_to (p: CURSOR)
    	hide
    	insert (fig: [like item] EV_MODEL; i: INTEGER_32)
    	invalidate
    	list_make (n: INTEGER_32)
    	make_filled (n: INTEGER_32)
    	make_from_array (a: ARRAY [EV_MODEL])
    	merge_left (other: [like Current] EV_MODEL_GROUP)
    	merge_right (other: [like Current] EV_MODEL_GROUP)
    	move (i: INTEGER_32)
    	prune (v: [like item] EV_MODEL)
    	prune_all (fig: [like item] EV_MODEL)
    	put (v: [like item] EV_MODEL)
    	put_front (v: [like item] EV_MODEL)
    	put_left (v: [like item] EV_MODEL)
    	put_right (v: [like item] EV_MODEL)
    	regroup
    	remove
    	remove_left
    	remove_pebble
    	remove_right
    	replace (fig: [like item] EV_MODEL)
    	resize (new_capacity: INTEGER_32)
    	rotate (an_angle: REAL_64)
    	rotate_around (an_angle: REAL_64; ax, ay: INTEGER_32)
    	scale (a_scale: REAL_64)
    	scale_abs (a_scale: REAL_64)
    	scale_x (a_scale_x: REAL_64)
    	scale_x_abs (a_scale_x: REAL_64)
    	scale_y (a_scale_y: REAL_64)
    	scale_y_abs (a_scale_y: REAL_64)
    	search (v: [like item] EV_MODEL)
    	send_backward (a_figure: EV_MODEL)
    	send_to_back (a_figure: EV_MODEL)
    	set_accept_cursor (a_cursor: EV_POINTER_STYLE)
    	set_deny_cursor (a_cursor: EV_POINTER_STYLE)
    	set_pebble (a_pebble: [like pebble] ANY)
    	set_pebble_function (a_function: FUNCTION [ANY, TUPLE, ANY])
    	set_point_position (a_x, a_y: INTEGER_32)
    	set_point_position_relative (ax, ay: INTEGER_32)
    	set_pointer_style (a_cursor: [like pointer_style] EV_POINTER_STYLE)
    	set_target_name (a_name: STRING_GENERAL)
    	set_x (a_x: INTEGER_32)
    	set_x_y (a_x, a_y: INTEGER_32)
    	set_y (a_y: INTEGER_32)
    	show
    	start
    	swap (i: INTEGER_32)
    	transform (a_transformation: EV_MODEL_TRANSFORMATION)
    	ungroup
    	validate
    	wipe_out

    Constraints
    	is grouped implies all grouped
    	angle equal current angle
    	not is grouped implies angel equals zero