//
// C++ Interface: cActionBase
//
// Description: action base
//
/*
Copyright 2005-2011 Tomas Mecir <kmuddy@kmuddy.com>

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 (at your option) 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, see <http://www.gnu.org/licenses/>.
*/

#ifndef CACTIONBASE_H
#define CACTIONBASE_H

#include <qstring.h>

#include <kmuddy_export.h>

struct cActionBasePrivate;

class cProfileSettings;
class cTextChunk;
enum ParamType { PT_INT, PT_STRING, PT_NOTHING, PT_TEXTCHUNK, PT_POINTER };

/**
Base class for every object that wants to use cActionManager.

@author Tomas Mecir
*/

class KMUDDY_EXPORT cActionBase {
public:
  /** Constructor. Registers itself with cActionManager, if session >= 0 */
  cActionBase (const QString &name, int session = -1);
  /** destructor */
  virtual ~cActionBase ();

  /** object's name */
  QString objName () { return _name; };
  /** session number */
  int sess ();

  int attrib (const QString &name);
  void setAttrib (const QString &name, int value);
  QString strAttrib (const QString &name);
  void setStrAttrib (const QString &name, const QString &value);
protected:
  void addEventHandler (QString name, int priority, ParamType pt);
  void removeEventHandler (QString name);
  void addGlobalEventHandler (QString name, int priority, ParamType pt);
  void removeGlobalEventHandler (QString name);

  /** Returns the settings of the session. Provided for convenience. */
  cProfileSettings *settings ();

  cActionBase *object (const QString &name, int session = -1);

// the following 10 methods exist so that we don't have to #include cActionManager everywhere
  /** call an object's action - PT_INT parameter */
  QString callAction (QString objectName, QString action, int session, int par1, int par2=0);
  /** call an object's action - PT_STRING parameter */
  QString callAction (QString objectName, QString action, int session,
      QString &par1, const QString &par2=QString());
  /** as above, but with const string */
  QString callAction (QString objectName, QString action, int session,
      const QString &par1, const QString &par2=QString());
  /** call an object's action - PT_NOTHING parameter */
  QString callAction (QString objectName, QString action, int session);
  /** call an object's action - PT_TEXTCHUNK parameter */
  QString callAction (QString objectName, QString action, int session, cTextChunk *par);
  /** call an object's action - PT_POINTER parameter */
  QString callAction (QString objectName, QString action, int session, void *par);
  /** invoke an event - PT_INT parameter */
  void invokeEvent (QString event, int session, int par1, int par2 = 0);
  /** invoke an event - PT_STRING parameter */
  void invokeEvent (QString event, int session, QString &par1,
      const QString &par2 = QString());
  /** as above, but const param - so that passing constant strings works */
  void invokeEvent (QString event, int session, const QString &par1,
      const QString &par2 = QString());
  /** invoke an event - PT_NOTHING parameter */
  void invokeEvent (QString event, int session);
  /** invoke an event - PT_TEXTCHUNK parameter */
  void invokeEvent (QString event, int session, cTextChunk *par);
  /** invoke an event - PT_POINTER parameter */
  void invokeEvent (QString event, int session, void *par);

    
  virtual QString actionIntHandler (QString /*action*/, int /*session*/, int /*par1*/, int /*par2*/)
      { return QString(); };
  virtual QString actionStringHandler (QString /*action*/, int /*session*/,
      QString &/*par1*/, const QString &/*par2*/)
      { return QString(); };
  virtual QString actionNothingHandler (QString /*action*/, int /*session*/)
      { return QString(); };
  virtual QString actionChunkHandler (QString /*action*/, int /*session*/, cTextChunk * /*par*/)
      { return QString(); };
  virtual QString actionVoidHandler (QString /*action*/, int /*session*/, void * /*par*/)
      { return QString(); };

  virtual void eventNothingHandler (QString /*event*/, int /*session*/);
  virtual void eventIntHandler (QString /*event*/, int /*session*/, int /*par1*/, int /*par2*/);
  virtual void eventStringHandler (QString /*event*/, int /*session*/,
      QString &/*par1*/, const QString &/*par2*/);
  virtual void eventChunkHandler (QString /*event*/, int /*session*/, cTextChunk * /*par*/);
  virtual void eventVoidHandler (QString /*event*/, int /*session*/, void * /*par*/);

  QString _name;
  cActionBasePrivate *d;

  // cActionManager will want to access event handlers ...
  friend class cActionManager;
};

#endif
