#ifndef CONFIG_DIALOG_H
#define CONFIG_DIALOG_H

#include <qasciidict.h>
#include <qdict.h>
#include <qhbox.h>
#include <qkeysequence.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qstringlist.h>
#include <qvbox.h>

#include "config_file.h"

class QApplication;
class QCheckBox;
class QComboBox;
class QGrid;
class QHButtonGroup;
class QHGroupBox;
class QLabel;
class QListBox;
class QListView;
class QScrollView;
class QSlider;
class QSpinBox;
class QTextEdit;
class QVGroupBox;
class QVButtonGroup;

/**
    Kontrolka umożliwiajaca wybranie skrótu klawiszowego
**/
class HotKey : public QLineEdit
{
	public:
		HotKey(QWidget *parent =0, const char* name =0);
		/**
		  Pobiera skrót klawiszowy
		**/
		QString getShortCutString() const;

		/**
		  Pobiera skrót klawiszowy
		**/
		QKeySequence getShortCut() const;

		/**
		  Ustawia skrót klawiszowy
		**/
		void setShortCut(const QString& shortcut);

		/**
		  Ustawia skrót klawiszowy
		**/
		void setShortCut(const QKeySequence& shortcut);

		/**
		 Zwraca skrót klawiszowy jaki został naciśnięty przy zdarzeniu QKeyEvent
		**/
		static QString keyEventToString(QKeyEvent *e);

		/**
		 Pobiera skrót klawiszowy, z pliku konfiguracyjnego
		 z grupy "groupname", o polu "name"
		**/
		static QKeySequence shortCutFromFile(const QString& groupname, const QString &name);

		/**
		 Sprawdza czy skrót naciśnięty przy zdarzeniu QKeyEvent zgadza się
		 ze skrótem klawiszowym, z pliku konfiguracyjnego, o polu "name"
		**/
		static bool shortCut(QKeyEvent *e, const QString& groupname, const QString &name);
	protected:
		virtual void keyPressEvent(QKeyEvent *e);
		virtual void keyReleaseEvent(QKeyEvent *e);
};
/**
    Kontrolka do wyboru koloru
**/
class ColorButton : public QPushButton
{
	Q_OBJECT
	private:
		QColor actualcolor;
	public:
		/**
			Konstruktor obiektu w którym ustawia sie kolor "color",
			który ma rodzica "parent" oraz nazywa sie "name"
		**/
		ColorButton(const QColor &color, QWidget *parent =0, const char* name =0);

		/**
			Pobiera kolor z przycisku
		**/
		const QColor &color() const;

	private slots:
		void onClick();
	public slots:
		/**
			Ustawia kolor na przycisku
		**/
		void setColor(const QColor &color);
	signals:
		/**
			Sygnał jest emitowany przy zmianie koloru, przesyła on nazwę komponentu oraz nowy kolor
		**/
		void changed(const char *name, const QColor& color);
};

class SelectFont : public QHBox
{
	Q_OBJECT
	public:
		SelectFont(const char *text, const QFont &def_val, QWidget *parent = 0,  const char *name = 0, const char *tip = 0);
		const QFont &font() const;
	public slots:
		void setFont(const QFont &font);
	private slots:
		void onClick();
	signals:
		/**
			Sygnał jest emitowany przy zmianie czcionki, przesyła on nazwę komponentu oraz nową czcionkę
		**/
		void changed(const char *name, const QFont& font);
	private:
		QFont currentFont;
		QLineEdit *fontEdit;
};

class LayoutHelper;
class QResizeEvent;

class SelectPaths : public QHBox
{
	Q_OBJECT
	protected:
		QStringList releaseList;
		QListBox *pathListBox;
		QPushButton *pb_ok, *pb_cancel;
		QPushButton *pb_add, *pb_change, *pb_remove;
		QLineEdit *pathEdit;
		QPushButton *pb_choose;
		LayoutHelper *layoutHelper;

		virtual void resizeEvent(QResizeEvent *);

	protected slots:
		void okButton();
		void cancelButton();
		void addPath();
		void replacePath();
		void deletePath();
		void choosePath();
		void closeEvent(QCloseEvent *e);
		void keyPressEvent(QKeyEvent *e);

	public:
		SelectPaths(QWidget *parent =0, const char* name =0);
		~SelectPaths();
		/**
			Pobiera listę ścieżek katalogów
		**/
		const QStringList &getPathList() const;

	public slots:
		/**
			Ustawia ścieżki z katalogami
		**/
		void setPathList(const QStringList& list);

	signals:

		/**
			Sygnał jest emitowany przy zamknięciu okna przez "ok",
			przesyła on zmienioną listę ścieżek katalogów
	    **/
		void changed(const QStringList& paths);
};

enum UserLevel {
	Beginner,
	Advanced,
	Expert
};

/**
	Okno z konfiguracją Kadu
**/
class ConfigDialog : public QVBox
{
	Q_OBJECT

	private:

		enum RegisteredControlType
		{
			CONFIG_CHECKBOX,
			CONFIG_COLORBUTTON,
			CONFIG_COMBOBOX,
			CONFIG_GRID,
			CONFIG_HBOX,
			CONFIG_HGROUPBOX,
			CONFIG_HRADIOGROUP,
			CONFIG_HOTKEYEDIT,
			CONFIG_LABEL,
			CONFIG_LINEEDIT,
			CONFIG_LINEEDIT2,
			CONFIG_TEXTEDIT,
			CONFIG_LISTBOX,
			CONFIG_LISTVIEW,
			CONFIG_PUSHBUTTON,
			CONFIG_RADIOGROUP,
			CONFIG_SELECTPATHS,
			CONFIG_SLIDER,
			CONFIG_SPINBOX,
			CONFIG_TAB,
			CONFIG_VBOX,
			CONFIG_VGROUPBOX,
			CONFIG_VRADIOGROUP,
			CONFIG_SELECTFONT,
			CONFIG_NULL
		};

		struct ElementConnections
		{
			ElementConnections(const char *signal, const QObject *receiver, const char *slot);
			ElementConnections();
			const char *signal;
			const QObject* receiver;
			const char *slot;
			bool operator== (const ElementConnections& r) const;
		};
		struct RegisteredControl
		{
			RegisteredControlType type;
			RegisteredControl(RegisteredControlType t = CONFIG_NULL,
				const char *groupname = 0,
				const char *parent = 0,
				const char *caption = 0,
				const char *name = 0,
				const UserLevel userLevelRequired = Beginner);
			const char *parent;
			const char *name;
			const char *caption;
			const char *group;
			const char *entry;
			QString defaultS;
			const char *tip;

			//dodatkowe dane
			QValueList<QVariant> additionalParams;
			QValueListIterator<RegisteredControl> parentControl;
			QWidget *widget;

			//w przypadku kontrolek składających się z kilku mniejszych,
			// wskaźnik na rodzica, w przypadku pojedynczej kontrolki == widget
			QWidget *entireWidget;

			int nrOfControls;
			UserLevel userLevelRequired;

			ConfigFile* config;
			QValueList <ElementConnections> ConnectedSlots;
		};

		static QAsciiDict<QValueList <ElementConnections> > SlotsOnCreateTab;
		static QAsciiDict<QValueList <ElementConnections> > SlotsOnCloseTab;
		static QAsciiDict<QValueList <ElementConnections> > SlotsOnApplyTab;
		static QApplication* appHandle;

		static QAsciiDict<QValueList <RegisteredControl> > Tabs;
		static QValueList<const char *> TabNames;
		static QAsciiDict<int> TabSizes;
		static QDict<QSignal> tabChangesIn, tabChangesOut;//jakieś lepsze nazwy by się przydały ;)


		QVGroupBox* box;
		/**
		    Dodaje kontrolkę do listy
		**/
		static bool addControl(const char *groupname, ConfigDialog::RegisteredControl& control);

		void createWidget(QValueListIterator <RegisteredControl> control);
		void createTabAndWidgets(const char *tab);

	public:
		/**
		    Konstruktor
		**/

		ConfigDialog(QApplication *application, QWidget *parent = 0, const char *name = 0);
		~ConfigDialog();
		/**
		    Pokazuje okno konfiguracji
		**/
		static void showConfigDialog(QApplication* application);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------

			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
 		static void addCheckBox(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const bool defaultS = false, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addCheckBox(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const bool defaultS = false, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Kolor przycisku jest ustawiony na "color"
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addColorButton(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QColor& color, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addColorButton(ConfigFile *config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QColor& color, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addComboBox(
				const char *groupname, const char *parent, const char *caption,
			    const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".

			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Lista opcji do wyboru to "options", którym w pliku konfiguracyjnym odpowiadają "values".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addComboBox(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addComboBox(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Ilość kolumn w kontrolce ustwiona jest na nrColumns
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addGrid(
				const char *groupname, const char *parent, const char *caption,
				const int nrColumns = 3, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addHBox(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addHGroupBox(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);


		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------

			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addHotKeyEdit(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addHotKeyEdit(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".

			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Lista opcji do wyboru to "options", którym w pliku konfiguracyjnym odpowiadają "values".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addHRadioGroup(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addHRadioGroup(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addLabel(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------

			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addLineEdit(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addLineEdit(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);


		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Domyślną wartością kontrolki ustawion jest na "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addLineEdit2(
				const char *groupname, const char *parent, const char *caption,
			    const QString& defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------

			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addTextEdit(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addTextEdit(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);


		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addListBox(
				const char *groupname, const char *parent, const char *caption,
				const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addListView(
				const char *groupname, const char *parent, const char *caption,
				const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
			@param iconname nazwa ikony z zestawu lub ścieżka do pliku
		**/

		static void addPushButton(
				const char *groupname, const char *parent, const char *caption,
			    const QString& iconFilename = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".

			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Lista opcji do wyboru to "options", którym w pliku konfiguracyjnym odpowiadają "values".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addRadioGroup(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				int strips, Orientation orientation,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addRadioGroup(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				int strips, Orientation orientation,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia tekst kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------

			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "defaultS".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addSelectFont(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addSelectFont(ConfigFile *config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QString& defaultS = QString::null, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addSelectPaths(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Minimalna wartość kontrolki ustawiona jest na "minValue", maksymalna
			na "maxValue", krok jest ustawiony na "pageStep"
			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "value"
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addSlider(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const int minValue = 0, const int maxValue = 100,
			    const int pageStep = 1, const int value = 50, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addSlider(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const int minValue = 0, const int maxValue = 100,
			    const int pageStep = 1, const int value = 50, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);


		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Minimalna wartość kontrolki ustawiona jest na "minValue", maksymalna
			na "maxValue", krok jest ustawiony na "step"
			Domyślną wartością kontrolki przy pierwszym uruchomieniu programu
			jest "value"
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addSpinBox(
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const int minValue = 0, const int maxValue = 100,
				const int step = 1, const int value = 50, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addSpinBox(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
			    const char *entry, const int minValue = 0, const int maxValue = 100,
				const int step = 1, const int value = 50, const char *tip = 0,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje zakładkę o nazwie "caption"
		    @param iconname nazwa ikony z zestawu lub ścieżka do pliku
		**/
		static void addTab(const char *caption, const QString& iconFilename = QString::null,
			UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addVBox(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".
			Nazwa kontrolki ustawiona jest na "name".
		**/

		static void addVGroupBox(
				const char *groupname, const char *parent, const char *caption,
				const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Dodaje kontrolkę do zakładki "groupname",
			Rodzicem kontrolki jest kontrolka "parent".
			Ustawia text kontrolki na "caption".

			Wartość kontrolki jest zapisana do pliku konfiguracyjnego "config" w postaci
			-------------
			[groupname]
			entry= value {defaultS}
			-------------
			Lista opcji do wyboru to "options", którym w pliku konfiguracyjnym odpowiadają "values".
			Podpowiedź kontrolki ustawiona jest na "tip".
			Nazwa kontrolki ustawiona jest na "name".
		**/
		static void addVRadioGroup(
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);
		static void addVRadioGroup(ConfigFile* config,
				const char *groupname, const char *parent, const char *caption,
				const char *entry, const QStringList &options, const QStringList &values,
				const QString &defaultS = QString::null, const char *tip = 0, const char *name = 0,
				UserLevel userLevelRequired = Beginner);

		/**
		    Pobiera wskaźnik do kontrolki ButtonGroup(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QButtonGroup* getButtonGroup(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki CheckBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QCheckBox*   getCheckBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki ColorButton(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static ColorButton* getColorButton(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki ComboBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QComboBox*   getComboBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki Grid(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QGrid*       getGrid(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki HBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QHBox* 	    getHBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki HGroupBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QHGroupBox*  getHGroupBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki HButtonGroup(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QHButtonGroup* getHButtonGroup(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki HotKeyEdit(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static HotKey* 	    getHotKeyEdit(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki LineEdit(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QLineEdit*   getLineEdit(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki TextEdit(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QTextEdit*   getTextEdit(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki Label(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QLabel*      getLabel(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki ListBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QListBox*    getListBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki ListView(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QListView*   getListView(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki PushButton(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QPushButton* getPushButton(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki SelectFont(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static SelectFont* getSelectFont(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki SelectPaths(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static SelectPaths* getSelectPaths(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki Slider(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QSlider*     getSlider(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki SpinBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QSpinBox*    getSpinBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki VBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QVBox*  	    getVBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki VGroupBox(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QVGroupBox*  getVGroupBox(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki VButtonGroup(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QVButtonGroup* getVButtonGroup(const char *groupname, const char *caption, const char *name = 0);

		/**
		    W przypadku kontrolki zawierającej kilka mniejszych (z czego jedną z nich zwraca jedna z funkcji getXXX)
			zwraca wskaźnik do niej, w przeciwnym wypadku zwraca tą (pojedynczą) kontrolkę
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
			UWAGA: nie wolno rzutować zwracanego wskaźnika na żadną klasę dziedziczącą pod QWidget!
			(np. addSpinBox dodaje QHBox zawierającą QLabel i QSpinBox, getSpinBox() zwróci SpinBoksa, getEntireWidget QHBoksa())
		**/
		static QWidget* getEntireWidget(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Pobiera wskaźnik do kontrolki Widget(groupname, caption, name)
			jeżeli okno konfiguracji jest zamknięte zwraca NULL
		**/
		static QWidget* widget(const char *groupname, const char *caption, const char *name = 0);

		/**
			zwraca informację czy kontrolka (groupname, caption, name) jest w konfiguracji
			przy okazji przekazując jej iterator jeżeli control != 0
		**/
		static bool controlExists(const char *groupname, const char *caption, const char *name = 0, QValueListConstIterator<RegisteredControl> *control = 0);

		/**
			zwraca informację czy kontrolka (groupname, caption, name) jest w konfiguracji
			przy okazji przekazując jej iterator jeżeli control != 0
		**/
		static bool controlExists(const char *groupname, const char *caption, const char *name, QValueListIterator<RegisteredControl> *control);

		/**
		    Wyszukuje pozycję zakładki "name",
			zwraca przez parametry jej iterator oraz informację o znalezieniu jeżeli found != 0
		**/
		static void tab(const char *name, QValueListConstIterator<RegisteredControl> &ret, bool *found = 0);

		/**
		    Wyszukuje pozycję zakładki "name",
			zwraca przez parametry jej iterator oraz informację o znalezieniu jeżeli found != 0
		**/
		static void tab(const char *name, QValueListIterator<RegisteredControl> &ret, bool *found = 0);

		/**
			Podłącza slot "slot" obiektu "receiver"
			pod sygnał "signal" kontrolki (groupname, caption, name)
		**/
		static void connectSlot(const char *groupname, const char *caption, const char* signal,
			    const QObject* receiver, const char* slot,const char *name = 0);

		/**
			Odłącza slot "slot" obiektu "receiver"
			od sygnału "signal" kontrolki (groupname, caption, name)
		**/
		static void disconnectSlot(const char *groupname, const char *caption, const char* signal,
			    const QObject* receiver, const char* slot,const char *name = 0);

		/**
			Rejestruje slot "slot" obiektu "receiver",
			który jest wywoływany przytworzeniu zakladki
		**/
		static void registerSlotOnCreateTab(const char *tab, const QObject* receiver, const char* slot);


		/**
			Wyrejestrowuje slot "slot" obiektu "receiver",
			który jest wywoływany przytworzeniu zakladki
		**/

		static void unregisterSlotOnCreateTab(const char *tab, const QObject* receiver, const char* slot);


		/**
			Rejestruje slot "slot" obiektu "receiver",
			który jest wywoływany przy zamykaniu okna konfiguracji
		**/
		static void registerSlotOnCloseTab(const char *tab, const QObject* receiver, const char* slot);

		/**
			Wyrejestrowuje slot "slot" obiektu "receiver",
			który jest wywoływany przy zamykaniu okna konfiguracji
		**/
		static void unregisterSlotOnCloseTab(const char *tab, const QObject* receiver, const char* slot);

		/**
			Rejestruje slot "slot" obiektu "receiver",
			który jest wywoływany przy zapisywaniu konfiguracji
		**/
		static void registerSlotOnApplyTab(const char *tab, const QObject* receiver, const char* slot);

		/**
			Wyrejestrowuje slot "slot" obiektu "receiver",
			który jest wywoływany przy zapisywaniu konfiguracji
		**/
		static void unregisterSlotOnApplyTab(const char *tab, const QObject* receiver, const char* slot);

		/**
			Rejestruje 2 sloty obiektu "receiver", które są
			wywoływane przy zmianie zakładki "name"
			slotIn - przy zmianie aktywnej zakładki na "name" (może być == 0)
			slotOut - przy zmianie aktywnej zakładki z "name" na inną (może być == 0)
		**/
		static void registerSlotsOnTabChange(const char *name, const QObject *receiver, const char *slotIn, const char *slotOut);

		/**
			Wyrejestrowuje 2 sloty obiektu "receiver", które są
			wywoływane przy zmianie zakładki "name"
			slotIn - przy zmianie aktywnej zakładki na "name" (może być == 0)
			slotOut - przy zmianie aktywnej zakładki z "name" na inną (może być == 0)
		**/
		static void unregisterSlotsOnTabChange(const char *name, const QObject *receiver, const char *slotIn, const char *slotOut);

		/**
		    Usuwa kontrolkę z zakładki "groupname", o etykiecie "caption" i nazwie "name".
		**/
		static void removeControl(const char *groupname, const char *caption, const char *name = 0);

		/**
		    Usuwa zakładkę o nazwie caption
		**/
		static bool removeTab(const char *caption);

		/**
			Zwraca prawdę jeżeli zakładka znajduje się w konfiguracji
		**/
		static bool tabExists(const char *caption);

		static bool dialogOpened();
		static void closeDialog();

		//używać tylko w wyjątkowych sytuacjach
		static ConfigDialog *configdialog;

	protected:
		UserLevel userLevel;
		QListBox* listBox;
		QScrollView* view;
		QPushButton* okButton;
		QPushButton* applyButton;
		QPushButton* cancelButton;
		static QCString currentTab;
		virtual void keyPressEvent(QKeyEvent *e);
		void updateUserLevel(const QValueList<ConfigDialog::RegisteredControl> &tab);



	signals:

		void createTab();
		/**
		    Sygnał jest emitowany przy otwieraniu okna
		**/
		void create();

		/**
		    Sygnał jest emitowany przy zamykaniu okna
		**/
		void destroy();

		/**
		   Sygnał jest emitowany przy zapisywaniu konfiguracji
		**/
		void apply();

	protected slots:
		/**
		    Zapisuje wartości kontrolek do pliku
		**/

		void updateConfig();

		/**
		    Zapisuje wartości kontrolek do pliku i zamyka okno
		**/

		void updateAndCloseConfig();

		/**
		    Zmienia zakładkę na "name"
		**/
		void changeTab(const QString& name);

		/**
		    Ukrywa kontrolki o poziomie mniejszym od newUserLevel
		**/
		void changeUserLevel(int newUserLevel);
};
#endif
