note
	description: "[
		Root class for commands, allowing undo and redo, and to 
		facilitate history functions.
		]"
	author:		"Jimmy J. Johnson"
	copyright:	"Copyright 2012, Jimmy J. Johnson"
	license:	"Eiffel Forum License v2 (see forum.txt)"
	URL: 		"$URL: file:///F:/eiffel_repositories/jj_vision/trunk/interface/commands/jj_command.e $"
	date:		"$Date: 2014-06-15 09:17:19 -0400 (Sun, 15 Jun 2014) $"
	revision:	"$Revision: 18 $"

class
	JJ_COMMAND

inherit

	ANY
		redefine
			default_create
		end

create
	default_create

feature {NONE} -- Initialization

	default_create
			-- Set up the command
		do
			create explanation.make
			create affected_objects_imp.make
		end

feature -- Access

	text: STRING
			-- Texual representation of what the command does.
		do
			Result := "do nothing"
		end

	explanation: LINKED_LIST [STRING]
			-- List of reasons why a command was not executed or undone
			-- Can be queried after a call to `is_executable' or `is_undoable'

feature -- Basic operations

	execute
			-- Execute the action represented by the command.
		require
			executable: is_executable
		do
			was_executed := True
		end

	undo
			-- Reverse the action performed in `execute'.
		require
			undoable: is_undoable
		do
			was_executed := False
		end

	affected_objects: LINKED_SET [ANY]
			-- List of object whose views must be updated
		do
			Result := affected_objects_imp
		end

feature -- Status report

	is_executable: BOOLEAN
			-- Can the command be executed?
		do
			explanation.wipe_out
			Result := not was_executed
			if not Result then
				explanation.extend ("Command already executed")
			end
		end

	is_undoable: BOOLEAN
			-- Can the command be undone?
		do
			explanation.wipe_out
			Result := was_executed
			if not Result then
				explanation.extend ("Command not yet executed")
			end
		end

	was_executed: BOOLEAN
			-- Has the command been executed?

feature {NONE} -- Implementation

	affected_objects_imp: like affected_objects
			-- List of objects affected by Current

end

