#ifndef KEXIUSERACTION_H
#define KEXIUSERACTION_H

#include <tdeaction.h>

#include "kexiuseractionmethod.h"

namespace KexiDB
{
	class Cursor;
}
class KexiMainWindow;
typedef TQValueVector<TQVariant> Arguments;

/*! action that can be defined by a user for a special scope e.g. main, form ...
    the actions can have some predefined \ref Methods which are described in \ref KexiUserActionMethod
    e.g. OpenObject, ExecuteScript ... those methods take different arguments also described in \ref KexiUserActionMethod
*/ 
class KEXICORE_EXPORT KexiUserAction : public TDEAction
{
	TQ_OBJECT
  

	public:
		/*! bytecode of available methods */
		enum Methods
		{
			MethodNone = 0,
			OpenObject = 1,
			CloseObject = 2,
			DeleteObject = 3,
			ExecuteScript = 4,
			ExitKexi = 5,

			LastMethod = 6 //use the last integer here... so we can stop iteration
		};

		/*! argument types */
		enum ArgTypes
		{
			String = 0,
			Integer = 1,
			Bool = 2,
			KexiPart = 3,
			KexiItem = 4
		};

		/*! constructs an action
		    \note methods are associated using setMethod() 
		    */
		KexiUserAction(KexiMainWindow *context, TDEActionCollection *parent, const TQString &name, const TQString &text, const TQString &pixmap);
		~KexiUserAction();

		/*! sets execution information associated with this action this will mostly look like
		    \code
		    KexiUserAction *action = new KexiUserAction(...);
		    Arguments arg;
		    arg.append(TQVariant("kexi/form"));
		    arg.append(TQVariant("main"));
		    action->setMethod(KexiUserAction::OpenAction, arg);
		    \endcode
		    */
		void setMethod(int method, Arguments args);

		/*! creates a KexiUserAction from current record in \a c
		    mostly needed for creation from kexi__useractions table */
		static KexiUserAction *fromCurrentRecord(KexiMainWindow *context, TDEActionCollection *parent, KexiDB::Cursor *c);

	protected slots:
		/*! actually executes the associated method
		    \note KexiUserAction automatically connects TDEAction::activated() to KexiUserAction::execute()
		    */
		void execute();

	private:
		KexiMainWindow *m_win;
		int m_method;
		Arguments m_args;
};

#endif

