<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Package-level Javadoc</title>
<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css"
	type="text/css">
</head>
<body style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0)">
Application programming interfaces for commands and handlers. 
<h2>Package Specification</h2>
<p>
This package provides API and implementation classes to define abstract
pieces of functionality.  These pieces of functionality are intended to
provide a common way for plug-ins and the user interface to communicate
potential behaviour.
</p>
<p>
This package is designed so that its elements can be public and dynamic.  That
is, elements in this package can appear and disappear over the life of the
application.
</p>
<h3>Command</h3>
<p>
A command is an abstract representation for some semantic behaviour.  For
example, there might be a "copy" command.  How this command actually
behaves might be dependent on what state your application is in.  It is not
the actual implementation of that behaviour, and it is not the visual
representation of that behaviour.
</p>
<p>
Commands are managed by an instance of <code>CommandManager</code>.  In fact, a
command cannot be constructed directly.  Commands are constructed using the
method <code>CommandManager.getCommand(String)</code>.  This ensures that there
is only ever one command with a given identifier ever associated with a command.  
manager.
</p>
<p>
When a command is first constructed, it is undefined.  An undefined command is
one that is carrying no information except for an id.  Attempts to interact
with a command that is undefined will result in a 
<code>NotDefinedException</code>.  Through this mechanism, it is possible for
clients to hold references to commands, and still have those commands
"disappear" (i.e., become undefined).  This is particularly useful in a system
built around dynamic components (e.g., plug-ins).
<p>
Commands can be grouped into categories.  These categories are arbitrary
groupings, and have no defined behaviour.  These categories might be used in a
user interface for breaking up a large list of commands into semantically
similar commands -- making the list easier to navigate.
</p>
<p>
It is also possible to attach listeners to both commands and command managers.
A listener on a command manager will be notified if the list of defined
commands or categories changes.
</p>
<h4>Examples</h4>
<blockquote><pre><code>
	CommandManager manager = new CommandManager();
	Category category = manager.getCategory("categoryId");
	category.define("name", "description");
	Command command = manager.getCommand("commandId");
	command.define("name", "description", category);
</code></pre></blockquote>
<p>This example shows how to create a command from scratch -- with no existing
manager or categories.</p>
<blockquote><pre><code>
	command.undefine();
	command = null;
	category.undefine();
	category = null;
</code></pre></blockquote>
<p>If you wish to get rid of the command, then you simply undefine it.  This
will send notification to the appropriate listeners, and future attempts to
access it will fail.  If you are the only one holding on to the command, then
it will be garbage collected.  However, if other people still have a reference
to the command, then the stub will remain until they respond to the change.</p>
<blockquote><pre><code>
	String name;
	try {
		name = command.getName();
	} catch (NotDefinedException e) {
		// Clean-up my reference to the command.
		command = null;
		return;
	}
</code></pre></blockquote>
<p>This shows one way of dealing with commands.  Instead of listening for
changes to the command, you can simply listen for the exceptions to be thrown.
When a <code>NotDefinedException</code> is thrown, you can clean up your own
code.  How you clean up is application dependent.  In this case, the reference
is cleared and we return from the method.</p>
<blockquote><pre><code>
	try {
		String name = command.getName();
		
		// Do all your work in the block.
		
	} catch (NotDefinedException e) {
		// Ignore, or possibly throw an error
	}
	
	...
	
	public commandChanged(CommandEvent e) {
		if (e.hasDefinedChanged()) {
			command.removeListener(this);
			command = null;
		}
	}
</code></pre></blockquote>
<p>Another way is to attach a listener, and then simply ignore the exceptions.
When the command becomes undefined, you will be notified.  This gives your the
opportunity to unhook your listener and release your reference.</p>

<h3>Handler</h3>
<p>
A handler is the behaviour of a command at a particular point in time.  This is
the piece that will actually interact with your application model.  For every
command, there can be zero or more possible handlers.  However, at any one
time, there is either one handler (i.e., handled) or no handler (i.e.,
unhandled).
</p>
<p>
Handlers must implement <code>IHandler</code>.  However, there is a convenient
abstract class, <code>AbstractHandler</code> which provides default behaviour
for some of the methods in the interface.  It is recommended that developers
subclass <code>AbstractHandler</code>.
</p>
<p>
Beside functional behaviour, a handler carries with it a map of attribute
values.  This is a completely optionaly way of carrying extra data.  In the
case of the <code>AbstractHandler</code>, this map is empty.  Some attributes
have well defined meanings.  These attributes are defined in
<code>IHandlerAttributes</code>.
</p>
<p>
Like commands, handlers can have listeners attached to them.  Listeners will be
notified when the attributes of the handler change.
</p>
<p>
When a handler executes, it is passed an event object
(<code>ExecutionEvent</code>) that carries with it some pieces of information.
First of all, it contains the parameters for execution.  Parameters are simple
key-value pairs that are intended to modify the execution in some way.  The
event also carries with it a collection of contexts that were active at the
time of execution.  The event also carries two untyped objects: the triggering
event and the current application state.  In the case of a graphical tool, the
triggering event is likely to be the underlying widget toolkit event.  The 
application state might contain information like widget focus information.  In
your own application, feel free to use whichever of these event attributes that
fit your application.
</p>
<h4>Examples</h4>
<blockquote><pre><code>
	IHandler myHandler = createHandler();
	command.setHandler(myHandler);
	
	ExecutionEvent e = new ExecutionEvent(parameters,contexts,trigger,state);
	try {
		command.execute(e);
	} catch (ExecutionException ex) {
		// Notify the user, log the problem, etc.
	}
</code></pre></blockquote>
</body>
</html>
