indexing
	description: "Defines the coordinates of the upper-left and lower-right corners of a rectangle."
	status: "See notice at end of class."
	date: "$Date$"
	revision: "$Revision$"

class interface
	WEL_RECT

create 

	make (a_left, a_top, a_right, a_bottom: INTEGER)
			-- Make a rectangle and set left, top,
			-- right, bottom with a_left, a_top,
			-- a_right, a_bottom
		ensure
			left_set: left = a_left
			top_set: top = a_top
			right_set: right = a_right
			bottom_set: bottom = a_bottom

	make_by_pointer (a_pointer: POINTER)
			-- Set item with a_pointer.
			-- Since item is shared, it does not need
			-- to be freed.
			-- Caution: a_pointer must be a pointer
			-- coming from Windows.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			item_set: item = a_pointer
			shared: shared

	make_client (window: WEL_WINDOW)
			-- Make a client rectangle with window
		require
			window_not_void: window /= void
			window_exists: window.exists
		ensure
			left_equal_zero: left = 0
			top_equal_zero: top = 0
			client_rect_set: is_equal (window.client_rect)

	make_window (window: WEL_WINDOW)
			-- Make a window rectangle with window
			-- (absolute position)
		require
			window_not_void: window /= void
			window_exists: window.exists
		ensure
			window_rect_set: is_equal (window.window_rect)

feature -- Access

	bottom: INTEGER
			-- Position of the bottom border

	height: INTEGER
			-- Height of current rect

	item: POINTER
			-- Generic Windows handle or structure pointer.
			-- Can be a HWND, HICON, RECT *, WNDCLASS *, etc...
			-- (from WEL_ANY)

	left: INTEGER
			-- Position of the left border
			-- Was declared in WEL_RECT as synonym of x.

	right: INTEGER
			-- Position of the right border

	top: INTEGER
			-- Position of the top border
			-- Was declared in WEL_RECT as synonym of y.

	width: INTEGER
			-- Width of current rect

	x: INTEGER
			-- Position of the left border
			-- Was declared in WEL_RECT as synonym of left.

	y: INTEGER
			-- Position of the top border
			-- Was declared in WEL_RECT as synonym of top.
	
feature -- Measurement

	structure_size: INTEGER
			-- Size to allocate (in bytes)
		ensure -- from WEL_STRUCTURE
			positive_result: Result > 0
	
feature -- Comparison

	is_equal (other: like Current): BOOLEAN
			-- Is Current equal to other?
		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
	
feature -- Status report

	empty: BOOLEAN
			-- Is it empty?
			-- A rectangle is empty if the coordinate of the right
			-- side is less than or equal to the coordinate
			-- of the left side, or the coordinate of the bottom
			-- side is less than or equal to the coordinate of
			-- the top side.

	exists: BOOLEAN
			-- Does the item exist?
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = (item /= default_pointer)

	point_in (point: WEL_POINT): BOOLEAN
			-- Is point in the rectangle?
		require
			point_not_void: point /= void

	shared: BOOLEAN
			-- Is item shared by another object?
			-- If False (by default), item will
			-- be destroyed by destroy_item.
			-- If True, item will not be destroyed.
			-- (from WEL_ANY)
	
feature -- Status setting

	set_shared
			-- Set shared to True.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			shared: shared

	set_unshared
			-- Set shared to False.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			unshared: not shared
	
feature -- Element change

	set_bottom (a_bottom: INTEGER)
			-- Set bottom with a_bottom
		ensure
			bottom_set: bottom = a_bottom

	set_item (an_item: POINTER)
			-- Set item with an_item
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			item_set: item = an_item

	set_left (a_left: INTEGER)
			-- Set left with a_left
		ensure
			left_set: left = a_left

	set_rect (a_left, a_top, a_right, a_bottom: INTEGER)
			-- Quick set of left, top, right, bottom
			-- with a_left, a_top, a_right, a_bottom
			-- respectively.
		ensure
			left_set: left = a_left
			top_set: top = a_top
			right_set: right = a_right
			bottom_set: bottom = a_bottom

	set_right (a_right: INTEGER)
			-- Set right with a_right
		ensure
			right_set: right = a_right

	set_top (a_top: INTEGER)
			-- Set top with a_top
		ensure
			top_set: top = a_top
	
feature -- Removal

	dispose
			-- Destroy the inner structure of Current.
			--
			-- This function should be called by the GC when the
			-- object is collected or by the user if Current is
			-- no more usefull.
			-- (from WEL_ANY)
	
feature -- Conversion

	to_integer: INTEGER
			-- Converts item to an integer.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = cwel_pointer_to_integer (item)
	
feature -- Basic operations

	inflate (a_x, a_y: INTEGER)
			-- Inflate the rectangle by a_x and a_y.
			-- Positive values increase the width and height,
			-- and negative values decrease them.
		ensure
			left_set: left = old left - a_x
			top_set: top = old top - a_x
			right_set: right = old right + a_y
			bottom_set: bottom = old bottom + a_y

	initialize
			-- Fill Current with zeros.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			exists: exists

	initialize_with_character (a_character: CHARACTER)
			-- Fill current with a_character.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			exists: exists

	intersect (rect1, rect2: WEL_RECT)
			-- Calculates the intersection of rect1
			-- and rect2. If rect1 and rect2 do not
			-- intersect then empty becomes True.
		require
			rect1_not_void: rect1 /= void
			rect2_not_void: rect2 /= void

	memory_copy (source_pointer: POINTER; length: INTEGER)
			-- Copy length bytes from source_pointer to item.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			length_small_enough: length <= structure_size
			length_large_enough: length > 0
			exists: exists

	offset (a_x, a_y: INTEGER)
			-- Moves the rectangle by the specified
			-- offsets a_x and a_y.
		ensure
			x_set: x = old x + a_x
			y_set: y = old y + a_y
			right_set: right = old right + a_x
			bottom_set: bottom = old bottom + a_y

	subtract (rect1, rect2: WEL_RECT)
			-- Set the current rectangle by subtracting
			-- rect2 from rect1.
		require
			rect1_not_void: rect1 /= void
			rect2_not_void: rect2 /= void

	union (rect1, rect2: WEL_RECT)
			-- Set the current rectangle by the smallest
			-- rectangle that contains both source
			-- rectangles rect1 and rect2.
		require
			rect1_not_void: rect1 /= void
			rect2_not_void: rect2 /= void
	
invariant

	positive_width: width >= 0
	positive_height: height >= 0
		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class WEL_RECT