/*
    kopeteaway.h  -  Kopete Away

    Copyright (c) 2002 by Hendrik vom Lehn <hvl@linux-4-ever.de>
    Copyright (c) 2003 Olivier Goffart     <ogoffart @ kde.org>

    Kopete (c) 2002-2003 by the Kopete developers  <kopete-devel@kde.org>

    *************************************************************************
    *                                                                       *
    * This library is free software; you can redistribute it and/or         *
    * modify it under the terms of the GNU Lesser General Public            *
    * License as published by the Free Software Foundation; either          *
    * version 2 of the License, or (at your option) any later version.      *
    *                                                                       *
    *************************************************************************
*/

#ifndef KOPETEAWAY_HI
#define KOPETEAWAY_HI

#include <qstring.h>
#include <qobject.h>
#include <qvaluelist.h>

#include "kopeteawaydialog.h"
#include "kopete_export.h"

class QStringList;

struct KopeteAwayPrivate;

class KopeteGlobalAwayDialog;
class KopeteAwayDialog;

namespace Kopete
{

/**
 * @class Kopete::Away kopeteaway.h
 *
 * Kopete::Away is a singleton class that manages away messages
 * for Kopete. It stores a global away message, as well as
 * a list of user defined away messages.
 * This class is used by KopeteAwayDialog, which gets it's
 * list of user-defined away messages from this.  Protocol
 * plugins' individual away dialogs should also get away
 * messages from this object.
 *
 * It also handle global Idle Time, and all auto away stuff
 *
 * @author Hendrik vom Lehn <hvl@linux-4-ever.de>
 * @author Chris TenHarmsel <tenharmsel@users.sourceforge.net>
 * @author Olivier Goffart <ogoffart @ kde.org>

 */
class KOPETE_EXPORT Away : public QObject
{
Q_OBJECT

friend class ::KopeteAwayDialog;

public:

	/**
	 * @brief Method to get the single instance of Kopete::Away
	 * @return Kopete::Away instance pointer
	 */
	static Away *getInstance();

	/**
	 * @brief Gets the current global away message
	 * @return The global away message
	 */
	static QString message();

	/**
	 * This method sets the global away message,
	 * it does not set you away, just sets the message.
	 * @brief Sets the global away message
	 * @param message The message you want to set
	 */
	void setGlobalAwayMessage(const QString &message);

	/**
	 * @brief Sets global away for all protocols
	 */
	static void setGlobalAway(bool status);

	/**
	 * @brief Indicates global away status
	 * @return Bool indicating global away status
	 */
	static bool globalAway();

	/**
	 * @brief Function to get the titles of user defined away messages
	 * @return List of away message titles
	 *
	 * This function can be used to retrieve a QStringList of the away message titles,
	 * these titles can be passed to getMessage(QString title) to retrieve the
	 * corresponding message.
	 */
	QStringList getMessages();

	/**
	 * @brief Function to get an away message
	 * @return The away message corresponding to the title
	 * @param messageNumber Number of the away message to retrieve
	 *
	 * This function retrieves the away message that corresponds to the ringbuffer index
	 * passed in.
	 */
	 QString getMessage( uint messageNumber );

	 /**
	  * @brief Adds an away message to the ringbuffer
	  * @param message The away message
	  *
	  * This function will add an away message to the ringbuffer of user defined
	  * away messages.
	  */
	 void addMessage(const QString &message);

	/**
	 * time in seconds the user has been idle
	 */
	long int idleTime();

private:
	Away();
	~Away();

	/**
	 * @brief Saves the away messages to disk
	 *
	 * This function will save the current list of away messages to the disk
	 * using KConfig. It is called automatically.
	 */
	void save();

	/**
	 * @brief Check for activity using X11 methods
	 * @return true if activity was detected, otherwise false
	 *
	 * Attempt to detect activity using a variety of X11 methods.
	 */
	bool isActivity();

	//Away( const Away &rhs );
	//Away &operator=( const Away &rhs );
	static Away *instance;
	KopeteAwayPrivate *d;

private slots:
	void slotTimerTimeout();
	void load();

public slots:
	/**
	 * @brief Mark the user active
	 *
	 * Plugins can mark the user active if they discover activity by another way than the mouse or the keyboard
	 * (example, the motion auto away plugin)
	 * this will reset the @ref idleTime to 0, and set all protocols to available (online) if the state was
	 * set automatically to away because of idleness, and if they was previously online
	 */
	void setActive();

	/**
	 * Use this method if you want to go in the autoaway mode.
	 * This will go autoaway even if the idle time is not yet reached. (and even if the user
	 * did not selected to go autoaway automaticaly)
	 * But that will go unaway again when activity will be detected
	 */
	void setAutoAway();

signals:
	/**
	 * @brief Activity was detected
	 *
	 * this signal is emit when activity has been discover after being autoAway.
	 */
	void activity();

	/**
	 * @brief Default messages were changed
	 */
	void messagesChanged();
};

}

#endif
/*
 * Local variables:
 * c-indentation-style: k&r
 * c-basic-offset: 8
 * indent-tabs-mode: t
 * End:
 */
// vim: set noet ts=4 sts=4 sw=4:

