    indexing
    	description: "[
    		rotated elliptic is defined by 4 points:

    			p0-----------p1
    			|             |
    			|             |
    			|    center   |
    			|             |
    			|             |
    			p3-----------p2

    			p0.x = point_a.x and p0.y = point_a.y
    			p2.x = point_b.x and p2.y = point_b.y

    		radius1 is half of the distance between p0 and p1
    		radius2 is half of the distance between p0 and p3
    		center is in the middle of the line from p0 to p2

    	]"
    	legal: "See notice at end of class."
    	status: "See notice at end of class."
    	date: "$Date: 2006-01-22 18:25:44 -0800 (Sun, 22 Jan 2006) $"
    	revision: "$Revision: 56675 $"

    deferred class interface
    	EV_MODEL_ROTATED_ELLIPTIC

    feature -- Access

    	angle: REAL_64
    			-- Rotation angle of `Current'.

    	dashed_line_style: BOOLEAN
    			-- Are lines drawn dashed?
    			-- (from EV_MODEL_ATOMIC)

    	foreground_color: EV_COLOR
    			-- Color of text, lines, etc.
    			-- (from EV_MODEL_ATOMIC)

    	generating_type: STRING_8
    			-- Name of current object's generating type
    			-- (type of which it is a direct instance)
    			-- (from ANY)

    	generator: STRING_8
    			-- Name of current object's generating class
    			-- (base class of the type of which it is a direct instance)
    			-- (from ANY)

    	group: EV_MODEL_GROUP
    			-- The group `Current' is part of. Void if `Current' is
    			-- not part of a group.
    			-- (from EV_MODEL)

    	id: INTEGER_32
    			-- Unique id.
    			-- (from EV_MODEL)
    		ensure -- from HASHABLE
    			good_hash_value: Result >= 0

    	frozen id_object (an_id: INTEGER_32): IDENTIFIED
    			-- Object associated with `an_id' (void if no such object)
    			-- (from IDENTIFIED)
    		ensure -- from IDENTIFIED
    			consistent: Result = Void or else Result.object_id = an_id

    	line_width: INTEGER_32
    			-- Thickness of lines.
    			-- (from EV_MODEL_ATOMIC)

    	frozen object_id: INTEGER_32
    			-- Unique for current object in any given session
    			-- (from IDENTIFIED)
    		ensure -- from IDENTIFIED
    			valid_id: id_object (Result) = Current

    	pebble: ANY
    			-- Data to be transported by pick and drop mechanism.
    			-- (from EV_MODEL)

    	pebble_function: FUNCTION [ANY, TUPLE, ANY]
    			-- Returns data to be transported by pick and drop mechanism.
    			-- When not `Void', pebble is ignored.
    			-- (from EV_MODEL)

    	point_a: EV_COORDINATE
    			-- First point of `Current'.
    			-- (from EV_MODEL_SINGLE_POINTED)
    		ensure -- from EV_MODEL_SINGLE_POINTED
    			result_exists: Result /= Void
    			result_x_equal_point_x: Result.x = point_a_x
    			result_y_eqyal_point_y: Result.y = point_a_y

    	point_a_x: INTEGER_32
    			-- x position of point_a.

    	point_a_y: INTEGER_32
    			-- y position of point_a

    	point_b: EV_COORDINATE
    			-- Second point of `Current'.
    			-- (from EV_MODEL_DOUBLE_POINTED)
    		ensure -- from EV_MODEL_DOUBLE_POINTED
    			result_exists: Result /= Void
    			result_x_equal_point_b_x: Result.x = point_b_x
    			result_y_equal_point_b_y: Result.y = point_b_y

    	point_b_relative: EV_COORDINATE
    			-- point_b relative to group.`point'.
    			-- (from EV_MODEL_DOUBLE_POINTED)
    		ensure -- from EV_MODEL_DOUBLE_POINTED
    			result_exists: Result /= Void
    			result_x_equal_point_b_x_relative: Result.x = point_b_x_relative
    			result_y_eqyal_point_b_y_relative: Result.y = point_b_y_relative

    	point_b_x: INTEGER_32
    			-- x position of `pint_b'.

    	point_b_x_relative: INTEGER_32
    			-- horizontal distance between point_b_x and group.`point_x'.
    			-- (from EV_MODEL_DOUBLE_POINTED)

    	point_b_y: INTEGER_32
    			-- y position of point_b.

    	point_b_y_relative: INTEGER_32
    			-- vertical distance between point_b_y and group.`point_y'.
    			-- (from EV_MODEL_DOUBLE_POINTED)

    	point_count: INTEGER_32
    			-- `Current' has two points.
    			-- (from EV_MODEL_DOUBLE_POINTED)
    		require -- from  EV_MODEL_SINGLE_POINTED
    			True
    		require -- from  EV_MODEL
    			True
    		ensure -- from EV_MODEL
    			correct: Result = point_array.count

    	point_relative: EV_COORDINATE
    			-- `point' relative to group.`point'.
    			-- (from EV_MODEL_SINGLE_POINTED)
    		ensure -- from EV_MODEL_SINGLE_POINTED
    			result_exists: Result /= Void
    			result_x_equal_point_x_relative: Result.x = point_a_x_relative
    			result_y_eqyal_point_y_relative: Result.y = point_a_y_relative

    	point_a_x_relative: INTEGER_32
    			-- horizontal distance between `point_x' and group.`point_x'.
    			-- (from EV_MODEL_SINGLE_POINTED)

    	point_a_y_relative: INTEGER_32
    			-- vertical distance between `point_y' and group.`point_y'.
    			-- (from EV_MODEL_SINGLE_POINTED)

    	pointer_style: EV_POINTER_STYLE
    			-- Cursor displayed when pointer is over this figure.
    			-- (from EV_MODEL)

    	radius1: INTEGER_32
    			-- Major radius.

    	radius2: INTEGER_32
    			-- Minor radius.

    	target_name: STRING_GENERAL
    			-- Optional textual name describing `Current' pick and drop hole.
    			-- (from EV_ABSTRACT_PICK_AND_DROPABLE)

    	world: EV_MODEL_WORLD
    			-- The world `Current' is part of. Void if `Current' is
    			-- not part of a world
    			-- (from EV_MODEL)

    	x: INTEGER_32
    			-- x position of the center on the screen.
    			-- (from EV_MODEL)

    	y: INTEGER_32
    			-- y position of the center on the screen .
    			-- (from EV_MODEL)

    feature {ANY} -- Access

    	pi: REAL_64 is 3.14159265358979323846
    			-- (from MATH_CONST)

    feature -- Comparison

    	frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void
    			-- or attached to isomorphic object structures?
    			-- (from ANY)
    		ensure -- from ANY
    			shallow_implies_deep: standard_equal (some, other) implies Result
    			both_or_none_void: (some = Void) implies (Result = (other = Void))
    			same_type: (Result and (some /= Void)) implies some.same_type (other)
    			symmetric: Result implies deep_equal (other, some)

    	frozen equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached
    			-- to objects considered equal?
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))

    	is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object considered
    			-- equal to current object?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			symmetric: Result implies other.is_equal (Current)
    			consistent: standard_is_equal (other) implies Result

    	frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN
    			-- Are `some' and `other' either both void or attached to
    			-- field-by-field identical objects of the same type?
    			-- Always uses default object comparison criterion.
    			-- (from ANY)
    		ensure -- from ANY
    			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))

    	frozen standard_is_equal (other: like Current): BOOLEAN
    			-- Is `other' attached to an object of the same type
    			-- as current object, and field-by-field identical to it?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			same_type: Result implies same_type (other)
    			symmetric: Result implies other.standard_is_equal (Current)

    feature -- Status report

    	conforms_to (other: ANY): BOOLEAN
    			-- Does type of current object conform to type
    			-- of `other' (as per Eiffel: The Language, chapter 13)?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void

    	is_hashable: BOOLEAN
    			-- May current object be hashed?
    			-- (True if it is not its type's default.)
    			-- (from HASHABLE)
    		ensure -- from HASHABLE
    			ok_if_not_default: Result implies (Current /= default)

    	same_type (other: ANY): BOOLEAN
    			-- Is type of current object identical to type of `other'?
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			definition: Result = (conforms_to (other) and other.conforms_to (Current))

    feature -- Status setting

    	disable_dashed_line_style
    			-- Draw lines solid.
    			-- (from EV_MODEL_ATOMIC)
    		ensure -- from EV_MODEL_ATOMIC
    			dashed_line_style_disabled: not dashed_line_style

    	enable_dashed_line_style
    			-- Draw lines dashed.
    			-- (from EV_MODEL_ATOMIC)
    		ensure -- from EV_MODEL_ATOMIC
    			dashed_line_style_enabled: dashed_line_style

    	set_foreground_color (a_color: EV_COLOR)
    			-- Assign `a_color' to foreground_color.
    			-- (from EV_MODEL_ATOMIC)
    		require -- from EV_MODEL_ATOMIC
    			a_color_not_void: a_color /= Void
    		ensure -- from EV_MODEL_ATOMIC
    			foreground_color_assigned: foreground_color = a_color

    	set_line_width (a_width: INTEGER_32)
    			-- Assign `a_width' to line_width.
    			-- (from EV_MODEL_ATOMIC)
    		require -- from EV_MODEL_ATOMIC
    			a_width_non_negative: a_width >= 0
    		ensure -- from EV_MODEL_ATOMIC
    			line_width_assigned: line_width = a_width

    	set_point_b_position_relative (ax, ay: INTEGER_32)
    			-- Set position of point_b_relative to (`ax', `ay').
    			-- (from EV_MODEL_DOUBLE_POINTED)

    	set_point_a_position_relative (ax, ay: INTEGER_32)
    			-- Set position of point_relative to (`ax', `ay').
    			-- (from EV_MODEL_SINGLE_POINTED)

    	set_target_name (a_name: STRING_GENERAL)
    			-- Assign `a_name' to target_name.
    			-- (from EV_ABSTRACT_PICK_AND_DROPABLE)
    		require -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			a_name_not_void: a_name /= Void
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			target_name_assigned: a_name /= target_name and a_name.is_equal (target_name)

    feature -- Element change

    	remove_pebble
    			-- Make pebble `Void' and pebble_function `Void,
    			-- Removing transport.
    			-- (from EV_MODEL)
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			pebble_removed: pebble = Void and pebble_function = Void

    	rotate (an_angle: REAL_64)
    			-- Rotate around the center for `an_angle'.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_rotatable: is_rotatable
    		ensure -- from EV_MODEL
    			center_valid: is_center_valid

    	rotate_around (an_angle: REAL_64; ax, ay: INTEGER_32)
    			-- Rotate around (`ax', `ay') for `an_angle'.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_rotatable: is_rotatable
    		ensure -- from EV_MODEL
    			center_valid: is_center_valid

    	scale (a_scale: REAL_64)
    			-- Scale to x and y direction for `a_scale'.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_bigger_zero: a_scale > 0.0

    	scale_abs (a_scale: REAL_64)
    			-- Scale to x and y direction for `a_scale'.
    			-- Do not rotate around angle first.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_bigger_zero: a_scale > 0.0

    	scale_x (a_scale_x: REAL_64)
    			-- Scale to x direction for `a_scale_x'.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_x_bigger_zero: a_scale_x > 0.0

    	scale_x_abs (a_scale_x: REAL_64)
    			-- Scale absolute to x direction for `a_scale_x'.
    			-- Do not rotate around angle first.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_x_bigger_zero: a_scale_x > 0.0

    	scale_y (a_scale_y: REAL_64)
    			-- Scale to y direction for `a_scale_y'.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_y_bigger_zero: a_scale_y > 0.0

    	scale_y_abs (a_scale_y: REAL_64)
    			-- Scale to y direction for `a_scale_y'.
    			-- Do not rotate around angle first.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			is_scalable: is_scalable
    			a_scale_y_bigger_zero: a_scale_y > 0.0

    	set_accept_cursor (a_cursor: EV_POINTER_STYLE)
    			-- Set `a_cursor' to be displayed when the screen pointer is over a
    			-- target that accepts pebble during pick and drop.
    			-- (from EV_MODEL)
    		require -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			a_cursor_not_void: a_cursor /= Void
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			accept_cursor_assigned: accept_cursor.is_equal (a_cursor)

    	set_deny_cursor (a_cursor: EV_POINTER_STYLE)
    			-- Set `a_cursor' to be displayed when the screen pointer is not
    			-- over a valid target.
    			-- (from EV_MODEL)
    		require -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			a_cursor_not_void: a_cursor /= Void
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			deny_cursor_assigned: deny_cursor.is_equal (a_cursor)

    	set_pebble (a_pebble: like pebble)
    			-- Assign `a_pebble' to pebble.
    			-- (from EV_MODEL)
    		require -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			a_pebble_not_void: a_pebble /= Void
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			pebble_assigned: pebble = a_pebble

    	set_pebble_function (a_function: FUNCTION [ANY, TUPLE, ANY])
    			-- Set `a_function' to compute pebble.
    			-- (from EV_MODEL)
    		require -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			a_function_not_void: a_function /= Void
    			a_function_takes_two_integer_open_operands: a_function.valid_operands ([1, 1])
    		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
    			pebble_function_assigned: pebble_function = a_function

    	set_point_a_position (ax, ay: INTEGER_32)
    			-- Set position of point_a to (`ax', `ay').
    			-- (See EV_FIGURE_PARALLELOGRAM) for more informations.)

    	set_point_b_position (ax, ay: INTEGER_32)
    			-- Set position of point_b to position of (`ax', `ay').
    			-- (See EV_FIGURE_PARALLELOGRAM for more informations)

    	set_pointer_style (a_cursor: like pointer_style)
    			-- Assign `a_cursor' to pointer_style.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			a_cursor_not_void: a_cursor /= Void
    		ensure -- from EV_MODEL
    			pointer_style_assigned: pointer_style = a_cursor

    	set_radius1 (radius: INTEGER_32)
    			-- Set radius1 to `radius'.
    			-- (See EV_FIGURE_PARALLELOGRAM for information about implementation)
    		require
    			radius_positive: radius >= 0
    		ensure
    			set: (distance (point_array.item (0).x_precise, point_array.item (0).y_precise, point_array.item (1).x_precise, point_array.item (1).y_precise) / 2).rounded = radius

    	set_radius2 (radius: INTEGER_32)
    			-- Set radius2 to `radius'
    		require
    			radius_positive: radius >= 0
    		ensure
    			set: (distance (point_array.item (0).x_precise, point_array.item (0).y_precise, point_array.item (3).x_precise, point_array.item (3).y_precise) / 2).rounded = radius

    	set_x (a_x: INTEGER_32)
    			-- Set x to `an_x'.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			x_set: a_x = x
    			center_valid: is_center_valid

    	set_x_y (a_x, a_y: INTEGER_32)
    			-- Set x to `a_x' and y to `a_y'.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			set: a_x = x and a_y = y
    			center_valid: is_center_valid

    	set_y (a_y: INTEGER_32)
    			-- Set y to `an_y'.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			y_set: a_y = y
    			center_valid: is_center_valid

    	transform (a_transformation: EV_MODEL_TRANSFORMATION)
    			-- Transform all points in point_array using `a_transformation'.
    			-- You can do any transformation you want. You can
    			-- for example rotate `Current' around an other point
    			-- than the center.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			a_transformation_not_void: a_transformation /= Void
    			is_transformable: is_transformable

    feature -- Duplication

    	copy (other: like Current)
    			-- Update current object using fields of object attached
    			-- to `other', so as to yield equal objects.
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_equal: is_equal (other)

    	frozen deep_copy (other: like Current)
    			-- Effect equivalent to that of:
    			--		copy (`other' . deep_twin)
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, other)

    	frozen deep_twin: like Current
    			-- New object structure recursively duplicated from Current.
    			-- (from ANY)
    		ensure -- from ANY
    			deep_equal: deep_equal (Current, Result)

    	frozen standard_copy (other: like Current)
    			-- Copy every field of `other' onto corresponding field
    			-- of current object.
    			-- (from ANY)
    		require -- from ANY
    			other_not_void: other /= Void
    			type_identity: same_type (other)
    		ensure -- from ANY
    			is_standard_equal: standard_is_equal (other)

    	frozen standard_twin: like Current
    			-- New object field-by-field identical to `other'.
    			-- Always uses default copying semantics.
    			-- (from ANY)
    		ensure -- from ANY
    			standard_twin_not_void: Result /= Void
    			equal: standard_equal (Result, Current)

    	frozen twin: like Current
    			-- New object equal to `Current'
    			-- twin calls copy; to change copying/twining semantics, redefine copy.
    			-- (from ANY)
    		ensure -- from ANY
    			twin_not_void: Result /= Void
    			is_equal: Result.is_equal (Current)

    feature -- Basic operations

    	frozen default: like Current
    			-- Default value of object's type
    			-- (from ANY)

    	frozen default_pointer: POINTER
    			-- Default value of type `POINTER'
    			-- (Avoid the need to write `p'.default for
    			-- some `p' of type `POINTER'.)
    			-- (from ANY)

    	default_rescue
    			-- Process exception for routines with no Rescue clause.
    			-- (Default: do nothing.)
    			-- (from ANY)

    	frozen do_nothing
    			-- Execute a null action.
    			-- (from ANY)

    feature -- Action sequences

    	conforming_pick_actions: EV_NOTIFY_ACTION_SEQUENCE
    			-- Actions to be performed when a pebble that fits this hole is
    			-- picked up from another source.
    			-- (when drop_actions.accepts_pebble (pebble))
    			-- (from EV_MODEL)

    	drop_actions: EV_PND_ACTION_SEQUENCE
    			-- Actions to take when pick and drop transport drops on `Current'.
    			-- (from EV_MODEL)

    	pick_actions: EV_PND_START_ACTION_SEQUENCE
    			-- Actions to be performed when pebble is picked up.
    			-- (from EV_MODEL)

    	pointer_button_press_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer button is pressed.
    			-- (from EV_MODEL)

    	pointer_button_release_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer button is released.
    			-- (from EV_MODEL)

    	pointer_double_press_actions: EV_POINTER_BUTTON_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer is double clicked.
    			-- (from EV_MODEL)

    	pointer_enter_actions: EV_NOTIFY_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer enters widget.
    			-- (from EV_MODEL)

    	pointer_leave_actions: EV_NOTIFY_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer leaves widget.
    			-- (from EV_MODEL)

    	pointer_motion_actions: EV_POINTER_MOTION_ACTION_SEQUENCE
    			-- Actions to be performed when screen pointer moves.
    			-- (from EV_MODEL)

    feature -- Events

    	bounding_box: EV_RECTANGLE
    			-- Smallest orthogonal rectangular area `Current' fits in.
    			-- (from EV_MODEL_ATOMIC)
    		ensure -- from EV_MODEL
    			result_not_void: Result /= Void
    			internal_is_twin: internal_bounding_box /= Result

    	position_on_figure (a_x, a_y: INTEGER_32): BOOLEAN
    			-- Is the point on (`a_x', `a_y') on this figure?
    			-- (from EV_MODEL)

    feature -- Output

    	io: STD_FILES
    			-- Handle to standard file setup
    			-- (from ANY)

    	out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of tagged_out.
    			-- (from ANY)

    	print (some: ANY)
    			-- Write terse external representation of `some'
    			-- on standard output.
    			-- (from ANY)

    	frozen tagged_out: STRING_8
    			-- New string containing terse printable representation
    			-- of current object
    			-- Was declared in ANY as synonym of out.
    			-- (from ANY)

    feature -- Platform

    	operating_environment: OPERATING_ENVIRONMENT
    			-- Objects available from the operating system
    			-- (from ANY)

    feature -- Status Report

    	accept_cursor: EV_POINTER_STYLE
    			-- Accept cursor set by user.
    			-- To be displayed when the screen pointer is over a target that accepts
    			-- pebble during pick and drop.
    			-- (from EV_MODEL)

    	are_events_sended_to_group: BOOLEAN
    			-- Are events for pointer_motion_actions, pointer_button_press_actions,
    			-- pointer_double_press_actions,  pointer_button_release_actions
    			-- pointer_enter_actions and pointer_leave_actions send to `Current's
    			-- group (if any) even if `Current' catch the event. (Default True).
    			-- (from EV_MODEL)

    	deny_cursor: EV_POINTER_STYLE
    			-- Deny cursor set by user.
    			-- To be displayed when the screen pointer is not over a valid target.
    			-- (from EV_MODEL)

    	has_capture: BOOLEAN
    			-- Are all events sent to `Current'?
    			-- (from EV_MODEL)

    	is_center_valid: BOOLEAN
    			-- Is the position of the center valid?
    			-- (from EV_MODEL)

    	is_in_group: BOOLEAN
    			-- Is `Current' part of a group?
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			group_defines_is_in_group: Result = (group /= Void)

    	is_in_world: BOOLEAN
    			-- Is `Current' part of a world?
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			world_defines_is_in_world: Result = (world /= Void)

    	is_rotatable: BOOLEAN is True
    			-- Is rotatable? (Yes)

    	is_scalable: BOOLEAN is False
    			-- Is scalable? (Yes)

    	is_sensitive: BOOLEAN
    			-- Is object sensitive to user input?
    			-- (from EV_MODEL)

    	is_show_requested: BOOLEAN
    			-- Will `Current' be displayed when its parent is?
    			-- (from EV_MODEL)

    	is_transformable: BOOLEAN is False
    			-- Is transformable? (No)

    feature -- Status settings

    	disable_capture
    			-- Disable grab of all events on world.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			in_world: world /= Void
    			has_capture: has_capture
    		ensure -- from EV_MODEL
    			capture_released: not has_capture

    	disable_events_sended_to_group
    			-- Set are_events_sended_to_group to False.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			events_blocked: not are_events_sended_to_group

    	disable_sensitive
    			-- Make object non-sensitive to user input.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			insensitive_requested: not internal_is_sensitive

    	enable_capture
    			-- Grab all mouse events for world.
    			-- (from EV_MODEL)
    		require -- from EV_MODEL
    			in_world: world /= Void
    		ensure -- from EV_MODEL
    			capture_set: has_capture

    	enable_events_sended_to_group
    			-- Set are_events_sended_to_group to True.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			events_sended_to_group: are_events_sended_to_group

    	enable_sensitive
    			-- Make object sensitive to user input.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			sensitive_requested: internal_is_sensitive

    	hide
    			-- Request that `Current' not be displayed even when its group is.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			not_is_show_requested: not is_show_requested

    	show
    			-- Request that `Current' be displayed when its group is.
    			-- `True' by default.
    			-- (from EV_MODEL)
    		ensure -- from EV_MODEL
    			is_show_requested: is_show_requested

    feature --EV_FIGURE -- Status settings

    	center_invalidate
    			-- The position of the center may have changed.
    			-- (from EV_MODEL)

    invariant
    		-- from EV_MODEL_ATOMIC
    	foreground_color_exists: foreground_color /= Void
    	line_width_non_negative: line_width >= 0

    		-- from EV_MODEL
    	point_array_exists: point_array /= Void
    	center_exists: center /= Void
    	x_is_center_x: x = center.x
    	y_is_center_y: y = center.y
    	all_points_exist: all_points_exist (point_array)
    	projection_matrix_not_void: projection_matrix /= Void
    	is_transfomable_implies_rotatable_and_scalable: is_transformable implies (is_rotatable and is_scalable)

    		-- from ANY
    	reflexive_equality: standard_is_equal (Current)
    	reflexive_conformance: conforms_to (Current)

    indexing
    	copyright: "Copyright (c) 1984-2006, Eiffel Software and others"
    	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
    	source: "[
    		Eiffel Software
    		356 Storke Road, Goleta, CA 93117 USA
    		Telephone 805-685-1006, Fax 805-685-6869
    		Website http://www.eiffel.com
    		Customer support http://support.eiffel.com
    	]"

    end -- class EV_MODEL_ROTATED_ELLIPTIC