#ifndef KADU_USERINFO_H
#define KADU_USERINFO_H

#include <qhbox.h>

#include "userlist.h"
#include "misc.h"

class QCheckBox;
class QDns;
class QLineEdit;
class QPushButton;
class QTabWidget;
class QVBox;
class QVGroupBox;

/**
	Klasa ta reprezentuje okno, z którym mamy do czynienia podczas dodawania nowego kontaktu,
	lub podczas edycji danych istniejącego już kontaktu.
	\class UserInfo
	\brief Okno dialogowe pokazujące informacje o wybranym kontakcie
**/
class UserInfo : public QHBox
{
	Q_OBJECT
	public:
		/**
			\var static CreateNotifier createNotifier
			Statyczny obiekt wysyłający sygnał CreateNotifier::objectCreated
			jeśli powstanie nowa instancja okienka.
		**/
		static CreateNotifier createNotifier;

		/**
			\fn UserInfo(const QString &altnick, bool addUser = false, QDialog* parent=0, const char *name=0)
			Konstruktor tworzący okno dialogowe z informacjami o danym kontakcie.
			\param altnick pseudonim kontaktu wyświetlany na liście.
			\param addUser TRUE gdy dodajemy kontakt, FALSE gdy edytujemy dane istniejącego. Domyślnie FALSE.
			\param parent wskaźnik do obiektu stanowiącego rodzica. Domyślnie 0.
			\param name nazwa kontrolki. Domyślnie 0.
		**/
		UserInfo(const QString &altnick, bool addUser = false, QDialog* parent=0, const char *name=0);
		~UserInfo();

	private:
		UserListElement *puser;
		QLineEdit *e_firstname;
		QLineEdit *e_lastname;
		QLineEdit *e_nickname;
		QLineEdit *e_altnick;
		QLineEdit *e_mobile;
		QLineEdit *e_uin;
		QLineEdit *e_addr;
		QLineEdit *e_ver;
		QLineEdit *e_email;
		QLineEdit *e_dnsname;
		QCheckBox *c_blocking;
		QCheckBox *c_offtouser;
		QCheckBox *c_notify;
		QPushButton *pb_addapply;
		QTabWidget *tw_main;
		QVGroupBox *vgb_general;
		QDns *dns;
		
		QValueList<QCheckBox *> groups;
		QValueList<QCheckBox *> hiddenCheckBoxes;
		QLineEdit *newGroup;
		QVBox *groupsBox;
		
		bool addUser;
		void addNewUser(UserListElement& e);
		void changeUserData(UserListElement& e);
		void keyPressEvent(QKeyEvent *);

	protected:
		/**
			\fn void setupTab1()
			Tworzy pierwszą zakładkę.
		**/
		void setupTab1();

		/**
			\fn void setupTab2()
			Tworzy drugą zakładkę.
		**/
		void setupTab2();

		/**
			\fn void setupTab3()
			Tworzy trzecią zakładkę.
		**/
		void setupTab3();

	public slots:
		/**
			\fn void resultsReady()
			Ustawia wartość pola DNS na znalezioną nazwę domeny.
		**/
		void resultsReady();

		/**
			\fn void setUserInfo(UserListElement &ule)
			Ustawia wartości pól informacyjnych dla podanego kontaktu.
			\param ule obiekt reprezentujący kontakt.
		**/
		void setUserInfo(UserListElement &ule);

	private slots:
		void updateUserlist();
		void newGroupClicked();
};

#endif
