#ifndef KADU_SEARCH_H
#define KADU_SEARCH_H

#include <qdialog.h>
#include <qvaluelist.h>

#include "gadu.h"

class QCheckBox;
class QComboBox;
class QLabel;
class QLineEdit;
class QListView;
class QListViewItem;
class QPushButton;
class QRadioButton;

/**
	Klasa ta reprezentuje okno dialogowe wyszukiwania w katalogu publicznym.
	\brief Wyszukiwanie w katalogu publicznym.
	\class SearchDialog
**/
class SearchDialog : public QDialog {
	Q_OBJECT
	public:
		/**
			\fn SearchDialog(QWidget *parent=0, const char *name=0, UinType whoisSearchUin = 0)
			Standardowy konstruktor.
			\param parent rodzic kontrolki. Domyślnie 0.
			\param name nazwa kontrolki. Domyślnie 0.
			\param whoisSearchUin wartość logiczna informująca o tym, czy wstępnie ma być wybrane
				wyszukiwanie po numerze UIN (1) czy po danych osobowych (0). Domyślnie 0.
		**/
		SearchDialog(QWidget *parent=0, const char *name=0, UinType whoisSearchUin = 0);
		~SearchDialog(void);

	private:
		QCheckBox *only_active;
		QLineEdit *e_uin;
		QLineEdit *e_name;
		QLineEdit *e_nick;
		QLineEdit *e_byrFrom;
		QLineEdit *e_byrTo;
		QLineEdit *e_surname;
		QComboBox *c_gender;
		QLineEdit *e_city;
		QListView *results;
		QLabel *progress;
		QRadioButton *r_uin;
		QRadioButton *r_pers;
		QPushButton *b_chat;
		QPushButton *b_sendbtn;
		QPushButton *b_nextbtn;
		QPushButton *b_addbtn;
		UinType _whoisSearchUin;
		uint32_t seq;

		SearchRecord *searchRecord;

		bool searchhidden;

	public slots:
		/**
			\fn void firstSearch(void)
			Czyści listę wyników, a następnie wyszukuje w katalogu publicznym wg.
			podanych w oknie danych. Wyświetla tylko ograniczoną ich liczbę, ze względu
			na działanie protokołu Gadu-Gadu. Metoda ta wywoływana jest przy wciśnięciu
			przycisku "Szukaj". Aby uzyskać kolejne wyniki i dodać je do
			bierzących, należy dokonać wtórnego zapytania metodą SearchDialog::nextSearch.
		**/
		void firstSearch(void);

		/**
			\fn void nextSearch(void)
			Kontynuuje wyszukowanie kolejnych kontaktów, a wyniki dodaje do bierzących.
			Metoda ta wywoływana jest przy wciśnięciu przycisku "Następne wyniki".
		**/
		void nextSearch(void);

		/**
			\fn void newSearchResults(SearchResults& searchResults, int seq, int fromUin)
			Interpretuje uzyskane wyniki wyszukiwania i dodaje je do listy wyników.
			Metoda ta jest wywoływana, gdy serwer Gadu-Gadu odpowie na zapytanie do katalogu publicznego.
			\param searchResults lista struktur opisujących wyniki wyszukiwania.
			\param seq unikalny identyfikator zapytania do katalogu publicznego.
			\param fromUin numer UIN, od którego rozpoczęto wyszukiwanie (jest różny dla kolejnych
			wywołań - najpierw SearchDialog::firstSearch, a potem kolejne SearchDialog::nextSearch).
		**/
		void newSearchResults(SearchResults& searchResults, int seq, int fromUin);

		/**
			\fn void selectionChanged(QListViewItem *)
			Aktualizuje kod wykonywany po wciśnięciu przycisku "Dodaj" lub "Rozmowa" na taki,
			aby dzialał względem bierzącego kontaktu, a nie ostatnio wybranego.
			\param item wskaźnik do obiektu reprezentującego element listy, który wybrano.
		**/
		void selectionChanged(QListViewItem *item);

	private slots:
		void clearResults(void);
		void uinTyped(void);
		void personalDataTyped(void);
		void AddButtonClicked();
		void updateInfoClicked();
		void openChat();

	protected:
		/**
			\fn void closeEvent(QCloseEvent * e)
			Obsługuje zdarzenie zamknięcia okna wyszukiwania w katalogu publicznym.
			\param e wskaźnik do obiektu opisującego zdarzenie zamknięcie okna.
		**/
		virtual void closeEvent(QCloseEvent *e);
		virtual void resizeEvent(QResizeEvent *e);
};

#endif

