#ifndef HINT_MANAGER_H
#define HINT_MANAGER_H

#include <qframe.h>
#include <qtimer.h>
#include <qlayout.h>
#include <qstring.h>
#include <qfont.h>
#include <qcolor.h>
#include <qpixmap.h>
#include <qptrlist.h>
#include <qpoint.h>

#include "gadu.h"
#include "hint.h"
#include "hint_manager_slots.h"
#include "../notify/notify.h"

class HintManager : public Notifier
{
	Q_OBJECT

	private:
		QFrame *frame;
		HintManagerSlots *hint_manager_slots;
		QTimer *hint_timer;
		QGridLayout *grid;
		QPtrList<Hint> hints;
		QFrame *tipFrame;

		/**
			ustala róg, od którego będzie liczona pozycja grupy dymków
		**/
		void setGridOrigin();

	private slots:
		/**
			minęła sekunda: aktualizuje czasy wszystkich dymków
			usuwa te, którym minął czas
		**/
		void oneSecond();

		/**
			przesuwa całą grupę hintów zgodnie z preferowanym rozmiarem grupy
			i wykrytą/określoną w konfiguracji pozycją traya
		**/
		void setHint();

		/**
			na dymku o numerze id kliknięto lewym przyciskiem myszy
			w zależności od konfiguracji otwierana jest nowa rozmowa, dymek jest kasowany lub kasowane są wszystkie
		**/
		void leftButtonSlot(unsigned int id);

		/**
			na dymku o numerze id kliknięto prawym przyciskiem myszy
			w zależności od konfiguracji otwierana jest nowa rozmowa, dymek jest kasowany lub kasowane są wszystkie
		**/
		void rightButtonSlot(unsigned int id);

		/**
			na dymku o numerze id kliknięto środkowym przyciskiem myszy
			w zależności od konfiguracji otwierana jest nowa rozmowa, dymek jest kasowany lub kasowane są wszystkie
		**/
		void midButtonSlot(unsigned int id);

	public slots:
/*********** sloty dla notify ************/
		/* nowa rozmowa */
		void newChat(Protocol *protocol, UserListElements senders, const QString &msg, time_t t);

		/* nowa wiadomość w oknie chat */
		void newMessage(Protocol *protocol, UserListElements senders, const QString &msg, time_t t, bool &grab);

		/* błąd połączenia */
		void connectionError(Protocol *protocol, const QString &message);

		/* użytkownik zmienił status */
		void userStatusChanged(UserListElement ule, QString protocolName, const UserStatus &oldStatus);

		/* użytkownik zmienił status na "Dostępny" */
		void userChangedStatusToAvailable(const QString &protocolName, UserListElement);

		/* użytkownik zmienił status na "Zaraz wracam" */
		void userChangedStatusToBusy(const QString &protocolName, UserListElement);

		/* użytkownik zmienił status na "Niewidoczny" */
		void userChangedStatusToInvisible(const QString &protocolName, UserListElement);

		/* użytkownik zmienił status na "Niewidoczny" lub "Niedostępny" */
		void userChangedStatusToNotAvailable(const QString &protocolName, UserListElement);

		void userBoxChangeToolTip(const QPoint &point, UserListElement user, bool show);

		/* inna informacja do powiadomienia */
		/* jeżeli parameters == NULL, to brane są domyślne ustawienia dymków typu message
		 * w przeciwnym razie z mapy brane są następujące wartości:
		 *		"Pixmap"           - QPixmap
		 *		"Font"             - QFont
		 *		"Foreground color" - QColor
		 *		"Background color" - QColor
		 *		"Timeout"          - unsigned int
		 *		"ShowSource"       - bool
		 * jeżeli któraś z wartości jest nieokreślona, to dla niej brana jest wartość domyślna
		 * gdy UserListElement != NULL, to jego uin brany jest do tworzenia dymka (LMB np otwiera okno rozmowy z danym uinem)
		 */
		void message(const QString &from, const QString &message, const QMap<QString, QVariant> *parameters, const UserListElement *ule);
		virtual void externalEvent(const QString &notifyType, const QString &msg, const UserListElements &ules);
/*********** koniec slotów dla notify *************/

		/**
			pokazuje nowy dymek o treści "text", obrazku "pixmap",
			czcionką "font" o kolorze "fgcolor", tle "bgcolor",
			czasie zaniku "timeout" (sekund), dotyczący "senders"

			pozostałe funkcje pokazujące dymki są tylko opakowaniami na tą funkcję
		**/
		void addHint(const QString &text, const QPixmap &pixmap, const QFont &font, const QColor &fgcolor, const QColor &bgcolor, unsigned int timeout, const UserListElements &senders = UserListElements());

		/**
			usuwa dymek o numerze id
		**/
		void deleteHint(unsigned int id);

		/**
			jeżeli dymek dotyczył konkrentej osoby lub grupy osób, to otwierane jest okno chatu
			dymek jest kasowany
		**/
		void openChat(unsigned int id);

		/**
			usuwa wszystkie dymki
		**/
		void deleteAllHints();


	signals:
		/**
			HintManager szuka pozycji traya, aby wyświetlić w jego okolicy dymki
		**/
		void searchingForTrayPosition(QPoint& pos);

	public:
		HintManager(QWidget *parent=0, const char *name=0);
		~HintManager();
};

extern HintManager *hint_manager;

#endif
