#ifndef MESSAGE_BOX_H
#define MESSAGE_BOX_H

#include <qdialog.h>
#include <qmap.h>

class QHBox;
class QLabel;

/**
	Odpowiednik klasy QMessageBox z QT. W zamierzeniu ma
	mieć większe możliwości i wygodniejszy interface niż
	oryginał.
**/
class MessageBox : public QDialog
{
	Q_OBJECT

	private:
		static QMap<QString,MessageBox*> Boxes;
		QLabel *icon;
		QString message;

		void addButton(QWidget *parent, const QString &caption, const char *slot);

	private slots:
		void okClicked();
		void cancelClicked();
		void yesClicked();
		void noClicked();

	protected:
		void closeEvent(QCloseEvent* e);

	public:
		// komponenty dialogu
		static const int OK;
		static const int CANCEL;
		static const int YES;
		static const int NO;
		//
		MessageBox(const QString& message, int components = 0, bool modal = false, const QString &iconName = QString::null, QWidget *parent = 0);
		~MessageBox();

		//

		/**
			Informuje użytkownika o wykonywanej przez
			program czynności. Tworzy dialog zawierający
			tylko podany tekst. Nie blokuje wykonywania
			programu. Zamknięcie dialogu następuje po
			wywołaniu funkcji close z tą samą wiadomością
			przekazaną jako argument.
			Wywołuje QApplication::processEvents().
		**/
		static void status(const QString& message);

		/**
			Zadaje użytkownikowi pytanie. Tworzy dialog
			z dwoma przyciskami: "Tak" i "Nie". Blokuje
			wykonywanie programu i czeka na reakcję
			użytkownika. Zwraca true jeśli wybrał "Tak"
			lub false jeśli wybrał "Nie".
		**/
		static bool ask(const QString& message, const QString& iconName = QString::null, QWidget *parent = 0);

		/**
			Przekazuje użytkownikowi informację. Tworzy
			dialog z przyciskiem: "OK" zamykający okno.
			Nie blokuje wykonywania programu.
		**/
		static void msg(const QString& message, bool modal=false, const QString& iconName = QString::null, QWidget *parent = 0);

		/**
			Zamyka dialog, który został stworzony za
			pomocą funkcji status z tą samą wiadomością
			przekazaną jako argument.
		**/
		static void close(const QString& message);

	signals:
		void okPressed();
		void cancelPressed();
		void yesPressed();
		void noPressed();
};

#endif
