00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00028 #ifndef FBTK_THEME_HH
00029 #define FBTK_THEME_HH
00030
00031 #include <string>
00032 #include <list>
00033 #include <string>
00034
00035 #include "XrmDatabaseHelper.hh"
00036 #include "Subject.hh"
00037
00038 namespace FbTk {
00039
00040 class Theme;
00041
00043
00046 class ThemeItem_base {
00047 public:
00048 ThemeItem_base(const std::string &name, const std::string &altname):
00049 m_name(name), m_altname(altname) { }
00050 virtual ~ThemeItem_base() { }
00051 virtual void setFromString(const char *str) = 0;
00052 virtual void setDefaultValue() = 0;
00053 virtual void load() = 0;
00054 const std::string &name() const { return m_name; }
00055 const std::string &altName() const { return m_altname; }
00056 private:
00057 std::string m_name, m_altname;
00058 };
00059
00060
00063 template <typename T>
00064 class ThemeItem:public ThemeItem_base {
00065 public:
00066 ThemeItem(FbTk::Theme &tm, const std::string &name, const std::string &altname);
00067 virtual ~ThemeItem();
00069 void setDefaultValue();
00071 void setFromString(const char *strval);
00073 void load();
00078 inline T& operator*() { return m_value; }
00079 inline const T& operator*() const { return m_value; }
00080 inline T *operator->() { return &m_value; }
00081 inline const T *operator->() const { return &m_value; }
00084 FbTk::Theme &theme() { return m_tm; }
00085 private:
00086
00087 T m_value;
00088 FbTk::Theme &m_tm;
00089 };
00090
00091
00093 class Theme {
00094 public:
00095 explicit Theme(int screen_num);
00096 virtual ~Theme();
00097 virtual void reconfigTheme() = 0;
00098 int screenNum() const { return m_screen_num; }
00099 std::list<ThemeItem_base *> &itemList() { return m_themeitems; }
00100 const std::list<ThemeItem_base *> &itemList() const { return m_themeitems; }
00102 template <typename T>
00103 void add(ThemeItem<T> &item);
00105 template <typename T>
00106 void remove(ThemeItem<T> &item);
00107 virtual bool fallback(ThemeItem_base &) { return false; }
00108 FbTk::Subject &reconfigSig() { return m_reconfig_sig; }
00109 const FbTk::Subject &reconfigSig() const { return m_reconfig_sig; }
00110
00111
00112 private:
00113 const int m_screen_num;
00114 typedef std::list<ThemeItem_base *> ItemList;
00115 ItemList m_themeitems;
00116 FbTk::Subject m_reconfig_sig;
00117 };
00118
00119
00121
00124 class ThemeManager {
00125 public:
00126 static ThemeManager &instance();
00128 bool load(const std::string &filename, int screen_num = -1);
00129 std::string resourceValue(const std::string &name, const std::string &altname);
00130 void loadTheme(Theme &tm);
00131 bool loadItem(ThemeItem_base &resource);
00132 bool loadItem(ThemeItem_base &resource, const std::string &name, const std::string &altname);
00133
00134 bool verbose() const { return m_verbose; }
00135 void setVerbose(bool value) { m_verbose = value; }
00136
00137 private:
00138 ThemeManager();
00139 ~ThemeManager() { }
00140
00141 friend class FbTk::Theme;
00144 bool registerTheme(FbTk::Theme &tm);
00146 bool unregisterTheme(FbTk::Theme &tm);
00148 typedef std::list<FbTk::Theme *> ThemeList;
00149 ThemeList m_themelist;
00150 int m_max_screens;
00151 XrmDatabaseHelper m_database;
00152 bool m_verbose;
00153
00154 std::string m_themelocation;
00155 };
00156
00157
00158
00159 template <typename T>
00160 ThemeItem<T>::ThemeItem(FbTk::Theme &tm,
00161 const std::string &name, const std::string &altname):
00162 ThemeItem_base(name, altname),
00163 m_tm(tm) {
00164 tm.add(*this);
00165 setDefaultValue();
00166 }
00167
00168 template <typename T>
00169 ThemeItem<T>::~ThemeItem() {
00170 m_tm.remove(*this);
00171 }
00172
00173 template <typename T>
00174 void Theme::add(ThemeItem<T> &item) {
00175 m_themeitems.push_back(&item);
00176 m_themeitems.unique();
00177 }
00178
00179 template <typename T>
00180 void Theme::remove(ThemeItem<T> &item) {
00181 m_themeitems.remove(&item);
00182 }
00183
00184 }
00185
00186 #endif // FBTK_THEME_HH
00187