#ifndef MESSAGE_BOX_H
#define MESSAGE_BOX_H

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

class QGridLayout;
class QLabel;
class QProgressBar;

/**
	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;
		QProgressBar* Progress;
		QLabel * _pixmap;
		QGridLayout * _grid;
		QString message;
				
	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;
		static const int PROGRESS;
		//
		MessageBox(const QString& message,int components = 0, bool modal=false);
		~MessageBox();

		void setTotalSteps(int s);
		void setProgress(int p);
		void setIcon(const QPixmap & pixmap);
		//
		/**
			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);
		/**
			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);
		/**
			Jak wyżej, ale w formie ostrzeżenia
		**/
		static void wrn(const QString& message,bool modal=false);
		/**
			Informuje użytkownika o postępie wykonywanej
			przez program czynności. Tworzy dialog zawierający
			podany tekst, pasek postępu o podanej
			maksymalnej wartości i opcjonalnie przycisk Anuluj
			podłączony do podanego slot'u w podanym obiekcie.
			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 progress(const QString& message,
			const QObject* receiver=0,const char* slot=0,
			int total_steps=100);
		/**
			Ustawia podaną wartość paska postępu w dialogu
			stworzonym za pomocą poprzedniej funkcji z tą
			samą wiadomością przekazaną jako argument.
			Wywołuje QApplication::processEvents().
		**/
		static void progress(const QString& message,int progress);
		/**
			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
