#ifndef __SD_CONF_H__ #define __SD_CONF_H__ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "config_file.hpp" const int MIN_MAX_FLOATWIN_WIDTH=80; // if user 's MAX_FLOATWIN_WIDTH setting is less then this,it will be set to DEFAULT_MAX_FLOATWIN_WIDTH. const int MIN_MAX_FLOATWIN_HEIGHT=60; #ifdef CONFIG_GPE const int DEFAULT_MAX_FLOATWIN_WIDTH=160; const int DEFAULT_MAX_FLOATWIN_HEIGHT=120; #else const int DEFAULT_MAX_FLOATWIN_WIDTH=320; // This is the lable's width in fact. const int DEFAULT_MAX_FLOATWIN_HEIGHT=240; #endif template struct Type2Type { typedef T OriginType; }; /* * AppConf class encapsulate * all preference of stardict. */ class AppConf { public: AppConf(); ~AppConf(); void Load(); typedef std::map cache_t; bool get_bool(const char *name) const { return get(name, Type2Type()); } bool get_bool_at(const char *name) const { return get_at(name, Type2Type()); } int get_int(const char *name) const { return get(name, Type2Type()); } int get_int_at(const char *name) const { return get_at(name, Type2Type()); } const std::string& get_string(const char *name) const { return get(name, Type2Type()); } const std::string& get_string_at(const char *name) const { return get_at(name, Type2Type()); } const std::list& get_strlist(const char *name) const { return get(name, Type2Type< std::list >()); } const std::list& get_strlist_at(const char *name) const { return get_at(name, Type2Type< std::list >()); } void set_bool(const char *name, const bool& v) { set_value(name, v); } void set_bool_at(const char *name, const bool& v) { set_value(name, v, false); } void set_int(const char *name, const int& v) { set_value(name, v); } void set_int_at(const char *name, const int& v) { set_value(name, v, false); } void set_string(const char *name, const std::string& v) { set_value(name, v); } void set_string_at(const char *name, const std::string& v) { set_value(name, v, false); } void set_strlist(const char *name, const std::list& v) { set_value(name, v); } void set_strlist_at(const char *name, const std::list& v) { set_value(name, v, false); } template void add_entry(const char *name, const T& def_val) { confval *v = new confval(def_val); g_assert(v->type_ != baseconfval::UNKNOWN_TYPE); cache[name] = v; } void notify_add(const char * name, const sigc::slot&); private: std::auto_ptr cf; cache_t cache; #if defined(_WIN32) || !defined(HAVE_MEMRCHR) static void *memrchr(const void *mem, int c, size_t len) { char *res; char *cmem = (char *)mem; if (!len) return NULL; res = cmem + len - 1; while (res != cmem - 1 && *res != c) --res; return res == cmem - 1 ? NULL : res; } #endif template void set_value(const char *name, const T& val, bool abs = true) { cache_t::iterator p; p = abs ? cache.find(name) : cache.find(std::string("/apps/stardict/preferences/") + name); if (p == cache.end() || static_cast *>(p->second)->val_ == val) return; confval *cfgval = static_cast *> (p->second); cfgval->val_ = val; size_t len = strlen(name); //TODO: do not user memrchr const char *key = (char *)memrchr(name, '/', len); if (!key) key = name + len; std::string sect(name, 0, key - name); if (!*key) key = ""; else ++key; if (!abs) sect = "/apps/stardict/preferences/" + sect; cfgval->save(*cf, sect.c_str(), key); } static std::string get_default_history_filename(); static std::string get_default_export_filename(); static std::list get_default_search_website_list(); #ifdef _WIN32 static bool get_win32_use_custom_font(); static std::string get_win32_custom_font(); #endif #ifdef CONFIG_DARWIN static bool get_darwin_use_custom_font(); static std::string get_darwin_custom_font(); #endif template const T& get(const char *name, Type2Type) const { static T empty; cache_t::const_iterator p = cache.find(name); if (p != cache.end()) return static_cast *>(p->second)->val_; return empty; } template const T& get_at(const char *name, Type2Type) const { return get((std::string("/apps/stardict/preferences/") + name).c_str(), Type2Type()); } }; extern std::auto_ptr conf;//global exemplar of AppConf class extern std::string gStarDictDataDir; #endif