#ifndef CONFIG_DIALOG_H
#define CONFIG_DIALOG_H

#include <qapplication.h>
#include <qdict.h>
#include <qhbox.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qsignal.h>
#include <qstringlist.h>
#include <qvaluelist.h>
#include <qvbox.h>
#include <qvariant.h>

#include "config_file.h"

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 QString &text, const QFont &def_val, QWidget *parent=0,  const char *name=0, const QString &tip="");
		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 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;
	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);
};

/**
	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(QString signal, const QObject *receiver, QString slot);
			ElementConnections();
			QString signal;
			const QObject* receiver;
			QString slot;
			bool operator== (const ElementConnections& r) const;
		};
		struct RegisteredControl
		{
			RegisteredControlType type;
			RegisteredControl(RegisteredControlType t=CONFIG_NULL,
				const QString &groupname=QString::null,
				const QString &parent=QString::null,
				const QString &caption=QString::null,
				const QString &name=QString::null);
			QString parent;
			QString name;
			QString caption;
			QString group;
			QString entry;
			QString defaultS;
			QString tip;
			
			//dodatkowe dane
			QValueList<QVariant> additionalParams;
			QValueListIterator<RegisteredControl> parentControl;
			QWidget* widget;
			int nrOfControls;
			
			ConfigFile* config;
			QValueList <ElementConnections> ConnectedSlots;
		};

		static QValueList <ElementConnections> SlotsOnCreate;
		static QValueList <ElementConnections> SlotsOnClose;
		static QValueList <ElementConnections> SlotsOnApply;
		static QApplication* appHandle;

		static QMap<QString, QValueList <RegisteredControl> > Tabs;
		static QStringList TabNames;
		static QMap<QString, int> TabSizes;
		static QDict<QSignal> tabChangesIn, tabChangesOut;//jakieś lepsze nazwy by się przydały ;)
		
		/**
		    Dodaje kontrolkę do listy
		**/
		static bool addControl(const QString& groupname, ConfigDialog::RegisteredControl& control);

	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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const bool defaultS=false, const QString &tip="",
				const QString& name="");
		static void addCheckBox(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const bool defaultS=false, const QString &tip="",
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QColor& color, const QString& tip="",
				const QString& name="");
		static void addColorButton(ConfigFile *config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QColor& color, const QString& tip="",
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& tip="", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");
		static void addComboBox(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const int nrColumns=3, const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");

			    
		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");
		static void addHotKeyEdit(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");
		static void addHRadioGroup(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");
			    
		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");
		static void addLineEdit(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");


		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& defaultS="", const QString& tip="", const QString& name="");
			    
		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");
		static void addTextEdit(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const QString& defaultS="", const QString& tip="",
				const QString& name="");


		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& tip= "", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& tip= "", const QString& name="");
			    
		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& iconFileName="", const QString& tip="", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				int strips, Orientation orientation,
				const QString &defaultS="", const QString& tip="", const QString& name="");
		static void addRadioGroup(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				int strips, Orientation orientation,
				const QString &defaultS="", const QString& tip="", const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& entry, const QString& defaultS="", const QString &tip="",
				const QString& name="");
		static void addSelectFont(ConfigFile *config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString& entry, const QString& defaultS="", const QString &tip="",
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const int minValue=0, const int maxValue=100,
			    const int pageStep=1, const int value=50, const QString& tip="",
				const QString& name="");
		static void addSlider(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const int minValue=0, const int maxValue=100,
			    const int pageStep=1, const int value=50, const QString& tip="",
				const QString& name="");
		

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const int minValue=0, const int maxValue=100,
				const int step=1, const int value=50, const QString& tip="",
				const QString& name="");
		static void addSpinBox(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
			    const QString& entry, const int minValue=0, const int maxValue=100,
				const int step=1, const int value=50, const QString& tip="",
				const QString& name="");

		/**
		    Dodaje zakładkę o nazwie "caption"
		    @param iconname nazwa ikony z zestawu lub ścieżka do pliku
		**/
		static void addTab(const QString& caption, const QString& iconFileName="");
		
		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString& name="");

		/**
		    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 QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");
		static void addVRadioGroup(ConfigFile* config,
				const QString& groupname, const QString& parent, const QString& caption,
				const QString &entry, const QStringList &options, const QStringList &values,
				const QString &defaultS="", const QString& tip="", const QString& name="");

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		/**
			zwraca informację czy kontrolka (groupname, caption, name) jest w konfiguracji
			przy okazji przekazując jej iterator jeżeli control != 0
		**/
		static bool controlExists(const QString& groupname, const QString& caption, const QString& name = "", 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 QString& groupname, const QString& caption, const QString& 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 QString &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 QString &name, QValueListIterator<RegisteredControl> &ret, bool *found = 0);

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

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

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

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

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

		/**
			Rejestruje slot "slot" obiektu "receiver",
			który jest wywoływany przy zapisywaniu konfiguracji
		**/
		static void registerSlotOnApply(const QObject* receiver, const char* slot);
		
		/**
			Wyrejestrowuje slot "slot" obiektu "receiver",
			który jest wywoływany przy zapisywaniu konfiguracji
		**/
		static void unregisterSlotOnApply(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 QString &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 QString &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 QString& groupname, const QString& caption, const QString& name = "");

		/**
		    Usuwa zakładkę o nazwie caption
		**/
		static bool removeTab(const QString& caption);
		
		/**
			Zwraca prawdę jeżeli zakładka znajduje się w konfiguracji
		**/
		static bool tabExists(const QString& caption);

		static bool dialogOpened();
		static void closeDialog();
		
		//używać tylko w wyjątkowych sytuacjach
		static ConfigDialog *configdialog;
		
	protected:
		QListBox* listBox;
		QScrollView* view;
		QPushButton* okButton;
		QPushButton* applyButton;
		QPushButton* cancelButton;
		static QString currentTab;
		virtual void keyPressEvent(QKeyEvent *e);

	signals:
		/**
		    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);
};
#endif
