#ifndef KADU_THEMES_H
#define KADU_THEMES_H

#include <qmap.h>
#include <qobject.h>
#include <qregexp.h>
#include <qstring.h>
#include <qstringlist.h>

/**
	Klasa obsługująca różne zestawy (jak ikony i emotikony)
	\class Themes
	\brief Klasa zarządzająca zestawami
**/

class Themes : public QObject
{
	Q_OBJECT

	friend class EmoticonsManager;

	QStringList ThemesList; //!< lista z nazwami dostępnych zestawów
	QStringList ThemesPaths; //!< lista ścieżek w których szukamy zestawów
	QStringList additional;
	QString ConfigName; //!< nazwa pliku z konfiguracją zestawu
	QString Name; //!< typ zestawu (np. "icons", "emoticons")
	QString ActualTheme; //!< nazwa aktualnie wybranego zestawu
	QMap<QString, QString> entries;

	/**
		\fn QStringList getSubDirs(const QString& path, bool validate = true) const
		Wyszukuje podkatalogi w podanej ścieżce i zwraca listę tych zawierających
		pliki konfiguracyjne zestawu. Jeśli parametr validate ma wartość false,
		zwrócona zostanie lista wszystkich znalezionych podkatalogów.
		\param path ścieżka do katalogu
		\param validate sprawdzenie zawartości
		\return lista podkatalogów
	**/
	QStringList getSubDirs(const QString& path, bool validate = true) const;

	/**
		\fn bool validateDir(const QString& path) const
		Sprawdza czy w podanym katalogu, bądź jego podkatalogach znajdują
		się pliki z konfiguracją zestawu.
		\param path ścieżka do katalogu
	**/
	bool validateDir(const QString& path) const;

	QString fixFileName(const QString& path, const QString& fn) const;

	public:
		/**
			\fn Themes(const QString& name, const QString& configname, const char *cname = 0)
			Konstruktor tworzący nowy zestaw
			\param name typ zestawu
			\param configname plik z konfiguracją zestawu
			\param cname nazwa obiektu
		**/
		Themes(const QString& name, const QString& configname, const char *cname = 0);

		/**
			\fn QStringList defaultKaduPathsWithThemes() const
			Tworzy listę ścieżek do zestawów znajdujących się w lokalizacjach
			domyślnych dla typu zestawu.
			\return lista ścieżek do zestawów
		**/
		QStringList defaultKaduPathsWithThemes() const;

		/**
			\fn const QStringList &themes() const
			Funkcja zwraca listę z nazwami dostępnych zestawów
		**/
		const QStringList &themes() const;

		/**
			\fn const QString &theme() const
			Funkcja zwraca nazwę aktualnie wybranego zestawu
		**/
		const QString &theme() const;

		/**
			\fn const QStringList &paths() const
			Funkcja zwraca listę ścieżek, w których wyszukiwane są zestawy
		**/
		const QStringList &paths() const;

		const QStringList &additionalPaths() const;

		/**
			\fn const QStringList &paths() const
			Funkcja zwraca ścieżkę do wskazanego zestawu
		**/
		QString themePath(const QString& theme = QString::null) const;

		QString getThemeEntry(const QString& name) const;
		const QMap<QString, QString> & getEntries() { return entries; }

	public slots:
		/**
			\fn void setTheme(const QString& theme)
			Zmienia aktualny zestaw na wskazany o ile ten istnieje
			\param theme nazwa zestawu
		**/
		void setTheme(const QString& theme);

		/**
			\fn void setPaths(const QStringList& paths)
			Ustawia listę ścieżek, w których wyszukiwane są zestawy
			\param paths lista ścieżek
		**/
		void setPaths(const QStringList& paths);

	signals:
		/**
			\fn void themeChanged(const QString& theme)
		 	Sygnał jest emitowany, gdy zmieniono aktualny zestaw
			\param theme nazwa nowego zestawu
		**/
		void themeChanged(const QString& theme);

		/**
			\fn void pathsChanged(const QStringList& list)
		 	Sygnał jest emitowany, gdy zmieniono ścieżkę wyszukiwania
			\param list lista nowych ścieżek
		**/
		void pathsChanged(const QStringList& list);
};

#endif
