/*
 * AbstractEditAction.java - Base class for EditAction
 * :tabSize=4:indentSize=4:noTabs=false:
 * :folding=explicit:collapseFolds=1:
 *
  * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package org.gjt.sp.jedit;

/**
 * An action that can be bound to a menu item, tool bar button or keystroke.
 *
 * @see jEdit#getAction(String)
 * @see jEdit#getActionNames()
 * @see ActionSet
 *
 * @author S. Pestov, M. Casanova, K. Satoda
 * @version $Id: EditAction.java 11177 2007-12-01 09:50:50Z k_satoda $
 * @since 4.3pre13
 */
public abstract class JEditAbstractEditAction<E>
{
	//{{{ Private members
	protected String name;

	protected Object[] args;

	//}}}

	//{{{ EditAction constructors
	/**
	 * Creates a new edit action with the specified name.
	 * @param name The action name
	 */
	protected JEditAbstractEditAction(String name)
	{
		this.name = name;
	}

	protected JEditAbstractEditAction(String name, Object[] newArgs)
	{
		this.name = name;
		this.args = newArgs;
	} //}}}

	//{{{ getName() method
	/**
	 * Returns the internal name of this action.
	 * @return the action name
	 */
	public String getName()
	{
		return name;
	} //}}}

	// {{{ setName() method
	/**
	 * Changes the name of an action
	 * @param newName the new name of the action
	 * @since jEdit 4.3pre4
	 */
	public void setName(String newName)
	{
		name = newName;
	}// }}}

	//{{{ invoke() method
	/**
	 * Invokes the action. This is an implementation of the Command pattern,
	 * and concrete actions should override this.
	 *
	 * @param arg the argument
	 */
	public abstract void invoke(E arg);

	/**
	 * @param arg the arguments of the action
	 * @param newArgs new argument list
	 */
	public final void invoke(E arg, Object[] newArgs)
	{
		args = newArgs;
		invoke(arg);
	} //}}}

	//{{{ toString() method
	@Override
	public String toString()
	{
		return name;
	} //}}}
}
