/********* * * This file is part of BibleTime's source code, http://www.bibletime.info/. * * Copyright 1999-2006 by the BibleTime developers. * The BibleTime source code is licensed under the GNU General Public License version 2.0. * **********/ //BibleTime includes #include "cbtconfig.h" #include "backend/cswordmoduleinfo.h" #include "backend/cdisplaytemplatemgr.h" #include "util/cpointers.h" //TQt includes #include #include #include #include #include //KDE includes #include #include #if KDE_VERSION >= 0x030200 #include #else #include #endif #include #include #include #include #include #include #include //Sword includes #include //init statics TQFont* CBTConfig::m_defaultFont = 0; CBTConfig::FontCache* CBTConfig::fontConfigMap = 0; /* No constructor and destructor, because this class only contains static methods. It won't be instantiated. */ const TQString CBTConfig::getKey( const CBTConfig::strings ID) { switch ( ID ) { case bibletimeVersion: return "bibletimeVersion"; case language: return "language"; case displayStyle: return "displayStyle"; case bookshelfCurrentItem: return "bookshelfCurrentItem"; } return TQString(); } const TQString CBTConfig::getDefault( const CBTConfig::strings ID) { switch ( ID ) { case bibletimeVersion: return "NOT YET INSTALLED"; // main() will realize this and set the value to VERSION case language: return (KGlobal::locale()->language()).local8Bit(); case displayStyle: return CDisplayTemplateMgr::defaultTemplate(); case bookshelfCurrentItem: return TQString(); } return TQString(); } const TQString CBTConfig::getKey( const CBTConfig::modules ID) { switch ( ID ) { case standardBible: return "standardBible"; case standardCommentary: return "standardCommentary"; case standardLexicon: return "standardLexicon"; case standardDailyDevotional: return "standardDailyDevotional"; case standardHebrewStrongsLexicon: return "standardHebrewLexicon"; case standardGreekStrongsLexicon: return "standardGreekLexicon"; case standardHebrewMorphLexicon: return "standardHebrewMorphLexicon"; case standardGreekMorphLexicon: return "standardGreekMorphLexicon"; } return TQString(); } const TQString CBTConfig::getDefault( const CBTConfig::modules ID) { // CSwordBackend* b = CPointers::backend(); switch ( ID ) { case standardBible: return "KJV"; case standardCommentary: return "MHC"; case standardLexicon: return "ISBE"; case standardDailyDevotional: return ""; //no default case standardHebrewStrongsLexicon: return "StrongsHebrew"; case standardGreekStrongsLexicon: return "StrongsGreek"; case standardHebrewMorphLexicon: return "StrongsHebrew"; case standardGreekMorphLexicon: return "StrongsGreek"; } return TQString(); } const TQString CBTConfig::getKey( const CBTConfig::bools ID) { switch ( ID ) { case firstSearchDialog: return "firstSearchDialog"; case readOldBookmarks: return "readOldBookmarks"; case toolbar: return "toolbar"; case mainIndex: return "mainIndex"; case infoDisplay: return "infoDisplay"; case autoTileVertical: return "autoTileVertical"; case autoTileHorizontal: return "autoTileHorizontal"; case autoCascade: return "autoCascade"; case lineBreaks: return "lineBreaks"; case verseNumbers: return "verseNumbers"; case tips: return "RunOnStart"; case logo: return "logo"; case autoDeleteOrphanedIndices: return "autoDeleteOrphanedIndices"; case crashedLastTime: return "crashedLastTime"; case crashedTwoTimes: return "crashedTwoTimes"; } return TQString(); } const TQString CBTConfig::getKey( const CBTConfig::ints ID) { switch ( ID ) { case footnotes: return "footnotes"; case strongNumbers: return "strongNumbers"; case headings: return "headings"; case morphTags: return "morphTags"; case lemmas: return "lemmas"; case hebrewPoints: return "hebrewPoints"; case hebrewCantillation: return "hebrewCantillation"; case greekAccents: return "greekAccents"; case textualVariants: return "textualVariants"; case scriptureReferences: return "scriptureReferences"; case morphSegmentation: return "morphSegmentation"; case bookshelfContentsX: return "bookshelfContentsX"; case bookshelfContentsY: return "bookshelfContentsY"; case magDelay: return "magDelay"; } return TQString(); } const bool CBTConfig::getDefault( const CBTConfig::bools ID) { switch ( ID ) { case firstSearchDialog: return true; case readOldBookmarks: return false; case toolbar: return true; case mainIndex: return true; case infoDisplay: return true; case autoTileVertical: return true; case autoTileHorizontal: return false; case autoCascade: return false; case lineBreaks: return false; case verseNumbers: return true; case tips: return true; case logo: return true; case autoDeleteOrphanedIndices: return true; case crashedLastTime: return false; case crashedTwoTimes: return false; } return false; } const int CBTConfig::getDefault( const CBTConfig::ints ID) { switch ( ID ) { case footnotes: return int(true); case strongNumbers: return int(true); case headings: return int(true); case morphTags: return int(true); case lemmas: return int(true); case hebrewPoints: return int(true); case hebrewCantillation: return int(true); case greekAccents: return int(true); case textualVariants: return int(false); case scriptureReferences: return int(true); case morphSegmentation: return int(true); case bookshelfContentsX: return 0; case bookshelfContentsY: return 0; case magDelay: return 400; } return 0; } const TQString CBTConfig::getKey( const CBTConfig::intLists ID) { switch ( ID ) { case leftPaneSplitterSizes: return "leftPaneSplitterSizes"; case mainSplitterSizes: return "mainSplitterSizes"; } return TQString(); } const TQValueList CBTConfig::getDefault( const CBTConfig::intLists ID) { switch ( ID ) { case leftPaneSplitterSizes: //fall through case mainSplitterSizes: { return TQValueList(); } } return TQValueList(); } const TQString CBTConfig::getKey( const CBTConfig::stringLists ID) { switch ( ID ) { case searchCompletionTexts: return TQString("searchCompletionTexts"); case searchTexts: return TQString("searchTexts"); case bookshelfOpenGroups: return TQString("bookshelfOpenGroups"); } return TQString(); } const TQStringList CBTConfig::getDefault( const CBTConfig::stringLists ID) { switch ( ID ) { case searchTexts: { TQStringList list; list.append(TQString()); return list; } case searchCompletionTexts: return TQStringList(); case bookshelfOpenGroups: return TQStringList(); } return TQStringList(); } const TQString CBTConfig::getKey( const CBTConfig::stringMaps ID) { switch (ID) { case searchScopes: return TQString("SearchScopes"); }; return TQString(); } const CBTConfig::StringMap CBTConfig::getDefault( const CBTConfig::stringMaps ID) { switch ( ID ) { case searchScopes: { CBTConfig::StringMap map; map.insert(i18n("Old testament"), TQString("Gen - Mal")); map.insert(i18n("Moses/Pentateuch/Torah"),TQString("Gen - Deut")); map.insert(i18n("History"), TQString("Jos - Est")); map.insert(i18n("Prophets"), TQString("Isa - Mal")); map.insert(i18n("New testament"), TQString("Mat - Rev")); map.insert(i18n("Gospels"), TQString("Mat - Joh")); map.insert(i18n("Letters/Epistles"), TQString("Rom - Jude")); map.insert(i18n("Paul's Epistles"), TQString("Rom - Phile")); //make the list to the current bookname language! CBTConfig::StringMap::Iterator it; sword::VerseKey vk; vk.setLocale("en_US"); for (it = map.begin(); it != map.end(); ++it) { sword::ListKey list = vk.ParseVerseList(it.data().local8Bit(), "Genesis 1:1", true); TQString data; for (int i = 0; i < list.Count(); ++i) { data += TQString::fromUtf8(list.GetElement(i)->getRangeText()) + "; "; } map[it.key()] = data; //set the new data }; return map; }; default: return CBTConfig::StringMap(); } return CBTConfig::StringMap(); } const TQString CBTConfig::getKey( const CLanguageMgr::Language* const language ) { return language->name(); } const TQFont& CBTConfig::getDefault( const CLanguageMgr::Language* const) { //language specific lookup of the font name //return KApplication::font(); if (m_defaultFont) { return *m_defaultFont; } static KStaticDeleter sd; //TODO: We need a better way to get the KDE konqueror KHTML settings KConfig conf("konquerorrc"); KHTMLSettings settings; settings.init(&conf); const TQString fontName = settings.stdFontName(); const int fontSize = settings.mediumFontSize(); sd.setObject(m_defaultFont, new TQFont(fontName, fontSize)); return *m_defaultFont; } const TQString CBTConfig::get ( const CBTConfig::strings ID) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "strings"); return config->readEntry(getKey(ID),getDefault(ID)); } CSwordModuleInfo* const CBTConfig::get ( const CBTConfig::modules ID) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "modules"); TQString name = config->readEntry(getKey(ID),getDefault(ID)); return CPointers::backend()->findModuleByName(name); } const bool CBTConfig::get ( const CBTConfig::bools ID) { //special behaviour for the KTipDialog class KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, (ID == CBTConfig::tips) ? "TipOfDay" : "bools"); return config->readBoolEntry(getKey(ID),getDefault(ID)); } const int CBTConfig::get ( const CBTConfig::ints ID) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "ints"); return config->readNumEntry(getKey(ID), getDefault(ID)); } const TQValueList CBTConfig::get ( const CBTConfig::intLists ID ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "intlists"); return config->readIntListEntry(getKey(ID)); } const TQStringList CBTConfig::get ( const CBTConfig::stringLists ID ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "stringlists"); return config->readListEntry(getKey(ID)); } const CBTConfig::StringMap CBTConfig::get ( const CBTConfig::stringMaps ID ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, getKey(ID)); if (config->hasGroup(getKey(ID))) { CBTConfig::StringMap map = config->entryMap(getKey(ID)); switch (ID) { case searchScopes: { //make sure we return the scopes in the chosen language. saved keys are in english CBTConfig::StringMap::Iterator it; sword::VerseKey vk; for (it = map.begin(); it != map.end(); ++it) { sword::ListKey list = vk.ParseVerseList(it.data().utf8(), "Genesis 1:1", true); TQString data; for (int i = 0; i < list.Count(); ++i) { data += TQString::fromUtf8(list.GetElement(i)->getRangeText()) + "; "; } map[it.key()] = data; //set the new data }; return map; } default: return getDefault(ID); } } return getDefault(ID); } const CBTConfig::FontSettingsPair CBTConfig::get ( const CLanguageMgr::Language* const language ) { if (fontConfigMap && fontConfigMap->tqcontains(language)) { return fontConfigMap->tqfind(language).data(); } if (!fontConfigMap) { static KStaticDeleter sd; sd.setObject(fontConfigMap, new FontCache()); } KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "font standard settings"); FontSettingsPair settings; settings.first = config->readBoolEntry(getKey(language)); config->setGroup("fonts"); settings.second = settings.first ? config->readFontEntry(getKey(language)) : getDefault(language); fontConfigMap->insert(language, settings); //cache the value return settings; } void CBTConfig::set ( const CBTConfig::strings ID, const TQString value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "strings"); config->writeEntry(getKey(ID), value); } void CBTConfig::set ( const CBTConfig::modules ID, CSwordModuleInfo* const value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "modules"); config->writeEntry(getKey(ID), value ? value->name() : TQString()); } void CBTConfig::set ( const CBTConfig::modules ID, const TQString& value ) { CSwordModuleInfo* module = CPointers::backend()->findModuleByName(value); if (module) { CBTConfig::set (ID, module); } } void CBTConfig::set (const CBTConfig::bools ID,const bool value ) { KConfig* config = CBTConfig::getConfig(); //special behaviour to work with KTipDialog class of KDE KConfigGroupSaver groupSaver(config, (ID == CBTConfig::tips) ? "TipOfDay" : "bools"); config->writeEntry(getKey(ID), value); } void CBTConfig::set (const CBTConfig::ints ID, const int value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "ints"); config->writeEntry(getKey(ID), value); } void CBTConfig::set ( const CBTConfig::intLists ID, const TQValueList value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "intlists"); config->writeEntry(getKey(ID), value); } void CBTConfig::set ( const CBTConfig::stringLists ID, const TQStringList value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "stringlists"); config->writeEntry(getKey(ID), value); } void CBTConfig::set ( const CBTConfig::stringMaps ID, const CBTConfig::StringMap value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, getKey(ID)); config->deleteGroup(getKey(ID)); //make sure we only save the new entries and don't use old ones config->sync(); config->setGroup(getKey(ID)); switch (ID) { case searchScopes: { /** * We want to make sure that the search scopes are saved with english key names so loading them * will always work with each locale set. */ CBTConfig::StringMap::ConstIterator it; TQString data;// = TQString(); sword::VerseKey vk; for (it = value.begin(); it != value.end(); ++it) { sword::ListKey list = vk.ParseVerseList(it.data().utf8(), "Genesis 1:1", true); data = TQString(); for (int i = 0; i < list.Count(); ++i) { if ( sword::VerseKey* range = dynamic_cast(list.GetElement(i)) ) { range->setLocale("en"); data += TQString::fromUtf8( range->getRangeText() ) + ";"; } } config->writeEntry(it.key(), data); } break; } default: { for (CBTConfig::StringMap::ConstIterator it = value.begin(); it != value.end(); ++it) { config->writeEntry(it.key(), it.data()); } break; } }; } void CBTConfig::set ( const CLanguageMgr::Language* const language, const FontSettingsPair& value ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "fonts"); config->writeEntry(getKey(language), value.second); config->setGroup("font standard settings"); config->writeEntry(getKey(language), value.first); if (fontConfigMap && fontConfigMap->tqcontains(language)) { fontConfigMap->remove (language); //remove it from the cache } } const CSwordBackend::DisplayOptions CBTConfig::getDisplayOptionDefaults() { CSwordBackend::DisplayOptions options; options.lineBreaks = get (CBTConfig::lineBreaks); options.verseNumbers = get (CBTConfig::verseNumbers); return options; } const CSwordBackend::FilterOptions CBTConfig::getFilterOptionDefaults() { CSwordBackend::FilterOptions options; options.footnotes = true; //required for the info display options.strongNumbers = true; //get(CBTConfig::strongNumbers); options.headings = get(CBTConfig::headings); options.morphTags = true;//required for the info display options.lemmas = true;//required for the info display options.hebrewPoints = get(CBTConfig::hebrewPoints); options.hebrewCantillation = get(CBTConfig::hebrewCantillation); options.greekAccents = get(CBTConfig::greekAccents); options.textualVariants = get(CBTConfig::textualVariants); options.scriptureReferences = get(CBTConfig::scriptureReferences); options.morphSegmentation = get(CBTConfig::morphSegmentation); return options; } void CBTConfig::setupAccelSettings(const CBTConfig::keys type, KActionCollection* const actionCollection) { TQString groupName; switch (type) { case allWindows : { groupName = "Displaywindow shortcuts"; break; }; case writeWindow : { groupName = "Writewindow shortcuts"; break; }; case readWindow : { groupName = "Readwindow shortcuts"; break; }; case bookWindow : { groupName = "Book shortcuts"; break; }; case bibleWindow : { groupName = "Bible shortcuts"; break; }; case commentaryWindow : { groupName = "Commentary shortcuts"; break; }; case lexiconWindow : { groupName = "Lexicon shortcuts"; break; }; case application : { groupName = "Application shortcuts"; break; }; }; actionCollection->readShortcutSettings(groupName, CBTConfig::getConfig()); } void CBTConfig::saveAccelSettings(const CBTConfig::keys type, KActionCollection* const actionCollection) { TQString groupName; switch (type) { case allWindows : { groupName = "Displaywindow shortcuts"; break; }; case writeWindow : { groupName = "Writewindow shortcuts"; break; }; case readWindow : { groupName = "Readwindow shortcuts"; break; }; case bookWindow : { groupName = "Book shortcuts"; break; }; case bibleWindow : { groupName = "Bible shortcuts"; break; }; case commentaryWindow : { groupName = "Commentary shortcuts"; break; }; case lexiconWindow : { groupName = "Lexicon shortcuts"; break; }; case application : { groupName = "Application shortcuts"; break; }; }; actionCollection->writeShortcutSettings(groupName, CBTConfig::getConfig()); } const TQString CBTConfig::getModuleEncryptionKey( const TQString& module ) { KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "Module keys"); return config->readEntry(module, TQString()); } void CBTConfig::setModuleEncryptionKey( const TQString& module, const TQString& key ) { // if (CSwordModuleInfo* const mod = CPointers::backend()->findModuleByName(module) ) { // // if an empty key is set for an unencrypted module do nothing // if (key.isEmpty() && !mod->isEncrypted()) { // return; // } // } // else if (key.isEmpty()) { // return; // }; KConfig* config = CBTConfig::getConfig(); KConfigGroupSaver groupSaver(config, "Module keys"); config->writeEntry(module, key); }; KConfig* const CBTConfig::getConfig() { KConfig* config = KGlobal::config(); if (KApplication::kApplication()->sessionSaving()) { qWarning("Using session config"); // config = KApplication::kApplication()->sessionConfig(); } else if (KApplication::kApplication()->isRestored()) { qWarning("isRestored(): Using session config"); } return config; }