indexing
	description: "Figure that is a line segment between 2 points."
	status: "See notice at end of class"
	keywords: "figure, line, segment, arrow"
	date: "$Date$"
	revision: "$Revision$"

class interface
	EV_FIGURE_LINE

create 

	default_create
			-- Create with default attributes.
			-- (from EV_ATOMIC_FIGURE)

	make_with_points (a_point_a, a_point_b: EV_RELATIVE_POINT)
			-- Create on a_point_a and a_point_b.
			-- (from EV_DOUBLE_POINTED_FIGURE)
		require -- from EV_DOUBLE_POINTED_FIGURE
			a_point_a_not_void: a_point_a /= void
			a_point_b_not_void: a_point_b /= void

	make_with_positions (x1, y1, x2, y2: INTEGER)
			-- Create on (x1, y1) - (x2, y2).
		ensure
			point_a_x_assigned: point_a.x = x1
			point_a_y_assigned: point_a.y = y1
			point_b_x_assigned: point_b.x = x2
			point_b_y_assigned: point_b.y = y2

feature -- Initialization

	default_create
			-- Create with default attributes.
			-- (from EV_ATOMIC_FIGURE)
	
feature -- Access

	Arrow_size: INTEGER is 10
			-- (from EV_ARROWED_FIGURE)

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

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

	group: EV_FIGURE_GROUP
			-- Parent of Current.
			-- (from EV_FIGURE)

	frozen id_object (an_id: INTEGER): 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

	is_end_arrow: BOOLEAN
			-- Does point_b have an arrow?
			-- (from EV_ARROWED_FIGURE)

	is_start_arrow: BOOLEAN
			-- Does point_a have an arrow?
			-- (from EV_ARROWED_FIGURE)

	line_width: INTEGER
			-- Thickness of lines.
			-- (from EV_ATOMIC_FIGURE)

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

	orientation: DOUBLE
			-- Angle of first point of Current.
			-- (from EV_FIGURE)

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

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

	point_a: EV_RELATIVE_POINT
			-- First point of Current.
			-- (from EV_SINGLE_POINTED_FIGURE)

	point_array: ARRAY [EV_COORDINATE]
			-- points as absolute coordinates.
			-- (from EV_FIGURE)
		ensure -- from EV_FIGURE
			same_length: Result.count = points.count

	point_b: EV_RELATIVE_POINT
			-- Second point of Current.
			-- (from EV_DOUBLE_POINTED_FIGURE)

	point_count: INTEGER
			-- Current has two points.
			-- (from EV_DOUBLE_POINTED_FIGURE)

	pointer_style: EV_CURSOR
			-- Cursor displayed when pointer is over this figure.
			-- (from EV_FIGURE)

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

	world: EV_FIGURE_WORLD
			-- Top-level parent of Current.
			-- (from EV_FIGURE)
	
feature -- Status report

	has_capture: BOOLEAN
			-- Are all events sent to Current?
			-- (from EV_FIGURE)

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

	is_show_requested: BOOLEAN
			-- Will Current be displayed when its parent is?
			-- (from EV_FIGURE)
	
feature -- Status setting

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

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

	disable_end_arrow
			-- Set is_end_arrow False.
			-- (from EV_ARROWED_FIGURE)

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

	disable_start_arrow
			-- Set is_start_arrow False.
			-- (from EV_ARROWED_FIGURE)

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

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

	enable_end_arrow
			-- Set is_end_arrow True.
			-- (from EV_ARROWED_FIGURE)

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

	enable_start_arrow
			-- Set is_start_arrow True.
			-- (from EV_ARROWED_FIGURE)

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

	intersects (r: EV_RECTANGLE): BOOLEAN
			-- Does r intersect Currents bounding_box?
			-- (from EV_FIGURE)

	set_foreground_color (a_color: EV_COLOR)
			-- Assign a_color to foreground_color.
			-- (from EV_ATOMIC_FIGURE)
		require -- from EV_ATOMIC_FIGURE
			a_color_not_void: a_color /= void
		ensure -- from EV_ATOMIC_FIGURE
			foreground_color_assigned: foreground_color = a_color

	set_point_a (a_point: EV_RELATIVE_POINT)
			-- Assign a_point to point.
			-- (from EV_SINGLE_POINTED_FIGURE)
		require -- from EV_SINGLE_POINTED_FIGURE
			a_point_not_void: a_point /= void
		ensure -- from EV_SINGLE_POINTED_FIGURE
			point_assigned: point_a = a_point

	set_point_b (a_point: EV_RELATIVE_POINT)
			-- Assign a_point to point_b.
			-- (from EV_DOUBLE_POINTED_FIGURE)
		require -- from EV_DOUBLE_POINTED_FIGURE
			a_point_not_void: a_point /= void
		ensure -- from EV_DOUBLE_POINTED_FIGURE
			point_b_assigned: point_b = a_point

	set_target_name (a_name: STRING)
			-- 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)

	show
			-- Request that Current be displayed when its group is.
			-- True by default.
			-- (from EV_FIGURE)
		ensure -- from EV_FIGURE
			is_show_requested: is_show_requested
	
feature -- Element change

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

	set_accept_cursor (a_cursor: EV_CURSOR)
			-- Set a_cursor to be displayed when the screen pointer is over a
			-- target that accepts pebble during pick and drop.
			-- (from EV_FIGURE)
		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
			accept_cursor_assigned: accept_cursor.is_equal (a_cursor)

	set_deny_cursor (a_cursor: EV_CURSOR)
			-- Set a_cursor to be displayed when the screen pointer is not
			-- over a valid target.
			-- (from EV_FIGURE)
		ensure -- from EV_ABSTRACT_PICK_AND_DROPABLE
			deny_cursor_assigned: deny_cursor.is_equal (a_cursor)

	set_line_width (width: INTEGER)
			-- Set line-width to width.
		require -- from EV_ATOMIC_FIGURE
			a_width_non_negative: a_width >= 0
		ensure -- from EV_ATOMIC_FIGURE
			line_width_assigned: line_width = a_width

	set_origin (an_origin: EV_RELATIVE_POINT)
			-- Change origin of all points to o without moving.
			-- (from EV_FIGURE)

	set_pebble (a_pebble: like pebble)
			-- Assign a_pebble to pebble.
			-- (from EV_FIGURE)
		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_FIGURE)
		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_pointer_style (a_cursor: like pointer_style)
			-- Assign a_cursor to pointer_style.
			-- (from EV_FIGURE)
		require -- from EV_FIGURE
			a_cursor_not_void: a_cursor /= void
		ensure -- from EV_FIGURE
			pointer_style_assigned: pointer_style = a_cursor
	
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_FIGURE)

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

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

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

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

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

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

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

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

	proximity_in_actions: EV_PROXIMITY_ACTION_SEQUENCE
			-- Actions to be performed when pointing device comes into range.
			-- (from EV_FIGURE)

	proximity_out_actions: EV_PROXIMITY_ACTION_SEQUENCE
			-- Actions to be performed when pointing device goes out of range.
			-- (from EV_FIGURE)
	
feature -- Events

	position_on_figure (x, y: INTEGER): BOOLEAN
			-- Is (x, y) on this figure?
	
invariant

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)
		-- from EV_ATOMIC_FIGURE
	foreground_color_exists: foreground_color /= void
	line_width_non_negative: line_width >= 0
		-- from EV_FIGURE
	points_not_void: points /= void
	points_correct_size: points.count = point_count
	points_items_not_void: all_points_exist (points)

end -- class EV_FIGURE_LINE