diff options
-rw-r--r-- | indra/newview/app_settings/autoreplace.xml (renamed from indra/newview/app_settings/settings_autoreplace.xml) | 0 | ||||
-rw-r--r-- | indra/newview/llautoreplace.cpp | 142 | ||||
-rw-r--r-- | indra/newview/llautoreplace.h | 15 | ||||
-rw-r--r-- | indra/newview/llfloaterautoreplacesettings.cpp | 5 |
4 files changed, 105 insertions, 57 deletions
diff --git a/indra/newview/app_settings/settings_autoreplace.xml b/indra/newview/app_settings/autoreplace.xml index 09d19f7b04..09d19f7b04 100644 --- a/indra/newview/app_settings/settings_autoreplace.xml +++ b/indra/newview/app_settings/autoreplace.xml diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index 0432bf735a..32cd7d2ae3 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -32,7 +32,7 @@ LLAutoReplace* LLAutoReplace::sInstance; -const char* LLAutoReplace::SETTINGS_FILE_NAME = "settings_autoreplace.xml"; +const char* LLAutoReplace::SETTINGS_FILE_NAME = "autoreplace.xml"; LLAutoReplace::LLAutoReplace() { @@ -144,6 +144,8 @@ LLAutoReplaceSettings LLAutoReplace::getSettings() void LLAutoReplace::setSettings(const LLAutoReplaceSettings& newSettings) { mSettings.set(newSettings); + /// Make the newSettings active and write them to user storage + saveToUserSettings(); } void LLAutoReplace::loadFromSettings() @@ -175,10 +177,9 @@ void LLAutoReplace::loadFromSettings() else // no user settings found, try application settings { std::string defaultName = getAppSettingsFileName(); - LL_INFOS("AutoReplace") << " user settings file '" << filename << "' not found;\n" - << " trying '" << defaultName.c_str() << "'" - << LL_ENDL; + LL_INFOS("AutoReplace") << " user settings file '" << filename << "' not found"<< LL_ENDL; + bool gotSettings = false; if(gDirUtilp->fileExists(defaultName)) { LLSD appDefault; @@ -192,15 +193,16 @@ void LLAutoReplace::loadFromSettings() if ( mSettings.setFromLLSD(appDefault) ) { - LL_INFOS("AutoReplace") << "settings loaded from '" << filename << "'" << LL_ENDL; - saveToUserSettings(appDefault); + LL_INFOS("AutoReplace") << "settings loaded from '" << defaultName.c_str() << "'" << LL_ENDL; + gotSettings = true; } else { - LL_WARNS("AutoReplace") << "invalid settings found in '" << filename << "'" << LL_ENDL; + LL_WARNS("AutoReplace") << "invalid settings found in '" << defaultName.c_str() << "'" << LL_ENDL; } } - else + + if ( ! gotSettings ) { if (mSettings.setFromLLSD(mSettings.getExampleLLSD())) { @@ -214,12 +216,12 @@ void LLAutoReplace::loadFromSettings() } } -void LLAutoReplace::saveToUserSettings(const LLSD& newSettings) +void LLAutoReplace::saveToUserSettings() { std::string filename=getUserSettingsFileName(); llofstream file; file.open(filename.c_str()); - LLSDSerialize::toPrettyXML(newSettings, file); + LLSDSerialize::toPrettyXML(mSettings.getAsLLSD(), file); file.close(); LL_INFOS("AutoReplace") << "settings saved to '" << filename << "'" << LL_ENDL; } @@ -245,24 +247,27 @@ LLAutoReplaceSettings::LLAutoReplaceSettings(const LLAutoReplaceSettings& settin list++ ) { - LLSD listMap = LLSD::emptyMap(); - std::string listName = (*list)[AUTOREPLACE_LIST_NAME]; - listMap[AUTOREPLACE_LIST_NAME] = listName; - listMap[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap(); - - for ( LLSD::map_const_iterator - entry = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(), - entriesEnd = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].endMap(); - entry != entriesEnd; - entry++ - ) + if ( (*list).isMap() ) // can fail due to LLSD-30: ignore it { - std::string keyword = entry->first; - std::string replacement = entry->second.asString(); - listMap[AUTOREPLACE_LIST_REPLACEMENTS].insert(keyword, LLSD(replacement)); - } + LLSD listMap = LLSD::emptyMap(); + std::string listName = (*list)[AUTOREPLACE_LIST_NAME]; + listMap[AUTOREPLACE_LIST_NAME] = listName; + listMap[AUTOREPLACE_LIST_REPLACEMENTS] = LLSD::emptyMap(); + + for ( LLSD::map_const_iterator + entry = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].beginMap(), + entriesEnd = (*list)[AUTOREPLACE_LIST_REPLACEMENTS].endMap(); + entry != entriesEnd; + entry++ + ) + { + std::string keyword = entry->first; + std::string replacement = entry->second.asString(); + listMap[AUTOREPLACE_LIST_REPLACEMENTS].insert(keyword, LLSD(replacement)); + } - mLists.append(listMap); + mLists.append(listMap); + } } } @@ -284,7 +289,10 @@ bool LLAutoReplaceSettings::setFromLLSD(const LLSD& settingsFromLLSD) list++ ) { - settingsValid = listIsValid(*list); + if ( (*list).isDefined() ) // can be undef due to LLSD-30: ignore it + { + settingsValid = listIsValid(*list); + } } } else @@ -365,9 +373,11 @@ std::string LLAutoReplaceSettings::replacementFor(std::string keyword, std::stri LLSD LLAutoReplaceSettings::getListNames() { + LL_DEBUGS("AutoReplace")<<"====="<<LL_ENDL; LLSD toReturn = LLSD::emptyArray(); + S32 counter=0; for( LLSD::array_const_iterator list = mLists.beginArray(), endList = mLists.endArray(); - list != endList && (*list).isDefined(); // deleting entries leaves undefined items in the iterator + list != endList; list++ ) { @@ -377,18 +387,21 @@ LLSD LLAutoReplaceSettings::getListNames() if ( thisList.has(AUTOREPLACE_LIST_NAME) ) { std::string name = thisList[AUTOREPLACE_LIST_NAME].asString(); + LL_DEBUGS("AutoReplace")<<counter<<" '"<<name<<"'"<<LL_ENDL; toReturn.append(LLSD(name)); } else { - LL_ERRS("AutoReplace") << " ! MISSING "<<AUTOREPLACE_LIST_NAME<< LL_ENDL; + LL_ERRS("AutoReplace") <<counter<<" ! MISSING "<<AUTOREPLACE_LIST_NAME<< LL_ENDL; } } else { - LL_ERRS("AutoReplace") << " ! not a map: "<<LLSD::typeString(thisList.type())<< LL_ENDL; + LL_WARNS("AutoReplace")<<counter<<" ! not a map: "<<LLSD::typeString(thisList.type())<< LL_ENDL; } + counter++; } + LL_DEBUGS("AutoReplace")<<"^^^^^^"<<LL_ENDL; return toReturn; } @@ -544,29 +557,42 @@ bool LLAutoReplaceSettings::increaseListPriority(std::string listName) { LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL; bool found = false; - S32 search_index; + S32 search_index, previous_index; LLSD targetList; + // The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30 + previous_index = -1; for ( search_index = 0, targetList = mLists[0]; - !found && targetList.isDefined(); + !found && search_index < mLists.size(); search_index += 1, targetList = mLists[search_index] ) { - if ( listNameMatches( targetList, listName) ) + if ( targetList.isMap() ) { - LL_DEBUGS("AutoReplace")<<"found at index "<<search_index<<LL_ENDL; - found = true; - if (search_index > 0) + if ( listNameMatches( targetList, listName) ) { - // copy the target to before the element preceding it - mLists.insert(search_index-1,targetList); - // delete the original, now duplicate, copy - mLists.erase(search_index+1); + LL_DEBUGS("AutoReplace")<<"found at "<<search_index<<", previous is "<<previous_index<<LL_ENDL; + found = true; + if (previous_index >= 0) + { + LL_DEBUGS("AutoReplace") << "erase "<<search_index<<LL_ENDL; + mLists.erase(search_index); + LL_DEBUGS("AutoReplace") << "insert at "<<previous_index<<LL_ENDL; + mLists.insert(previous_index, targetList); + } + else + { + LL_WARNS("AutoReplace") << "attempted to move top list up" << LL_ENDL; + } } else { - LL_WARNS("AutoReplace") << "attempted to move top list up" << LL_ENDL; + previous_index = search_index; } } + else + { + LL_DEBUGS("AutoReplace") << search_index<<" is "<<LLSD::typeString(targetList.type())<<LL_ENDL; + } } return found; } @@ -575,10 +601,10 @@ bool LLAutoReplaceSettings::increaseListPriority(std::string listName) bool LLAutoReplaceSettings::decreaseListPriority(std::string listName) { LL_DEBUGS("AutoReplace")<<listName<<LL_ENDL; - S32 found_index = -1; + S32 found_index = -1; S32 search_index; for ( search_index = 0; - found_index == -1 && mLists[search_index].isDefined(); + found_index == -1 && search_index < mLists.size(); search_index++ ) { @@ -590,19 +616,32 @@ bool LLAutoReplaceSettings::decreaseListPriority(std::string listName) } if (found_index != -1) { - // move this list after the found_index from after it to before it - if (mLists[found_index+1].isDefined()) + S32 next_index; + for ( next_index = found_index+1; + next_index < mLists.size() && ! mLists[next_index].isMap(); + next_index++ + ) + { + // skipping over any undefined slots (see LLSD-30) + LL_WARNS("AutoReplace")<<next_index<<" ! not a map: "<<LLSD::typeString(mLists[next_index].type())<< LL_ENDL; + } + if ( next_index < mLists.size() ) { - // copy item to after the element that follows it - mLists.insert(found_index+2, mLists[found_index]); - // erase the original, now duplicate, copy - mLists.erase(found_index); + LLSD next_list = mLists[next_index]; + LL_DEBUGS("AutoReplace") << "erase "<<next_index<<LL_ENDL; + mLists.erase(next_index); + LL_DEBUGS("AutoReplace") << "insert at "<<found_index<<LL_ENDL; + mLists.insert(found_index, next_list); } else { LL_WARNS("AutoReplace") << "attempted to move bottom list down" << LL_ENDL; } } + else + { + LL_WARNS("AutoReplace") << "not found" << LL_ENDL; + } return (found_index != -1); } @@ -722,6 +761,11 @@ LLSD LLAutoReplaceSettings::getExampleLLSD() return example; } +const LLSD& LLAutoReplaceSettings::getAsLLSD() +{ + return mLists; +} + LLAutoReplaceSettings::~LLAutoReplaceSettings() { } diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h index 944676fedd..c097e96b9e 100644 --- a/indra/newview/llautoreplace.h +++ b/indra/newview/llautoreplace.h @@ -42,7 +42,7 @@ class LLAutoReplaceSettings /// Constructor for creating a tempory copy of the current settings LLAutoReplaceSettings(const LLAutoReplaceSettings& settings); - /// Replace the current settings with new ones + /// Replace the current settings with new ones and save them to the user settings file void set(const LLAutoReplaceSettings& newSettings); /// Load the current settings read from an LLSD file @@ -127,6 +127,10 @@ class LLAutoReplaceSettings /// Provides a hard-coded example of settings LLSD getExampleLLSD(); + + /// Get the actual settings as LLSD + const LLSD& getAsLLSD(); + ///< @note for use only in AutoReplace::saveToUserSettings private: /// Efficiently and safely compare list names @@ -193,9 +197,8 @@ class LLAutoReplace : public LLSingleton<LLAutoReplace> /// Callback that provides the hook for use in text entry methods void autoreplaceCallback(LLUIString& inputText, S32& cursorPos); - /// Get a copy of the current settings to be manipulated in the preferences dialog + /// Get a copy of the current settings LLAutoReplaceSettings getSettings(); - ///< @note: the caller is respon /// Commit new settings after making changes void setSettings(const LLAutoReplaceSettings& settings); @@ -206,12 +209,12 @@ class LLAutoReplace : public LLSingleton<LLAutoReplace> LLAutoReplaceSettings mSettings; ///< configuration information - /// Write the current lists out to the settings storage - void saveToUserSettings(const LLSD& newSettings); - /// Read settings from persistent storage void loadFromSettings(); + /// Make the newSettings active and write them to user storage + void saveToUserSettings(); + /// Compute the user settings file name std::string getUserSettingsFileName(); diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp index 7d6be10549..64b3b09276 100644 --- a/indra/newview/llfloaterautoreplacesettings.cpp +++ b/indra/newview/llfloaterautoreplacesettings.cpp @@ -302,7 +302,7 @@ void LLFloaterAutoReplaceSettings::onListUp() if ( mSettings.increaseListPriority(selectedName) ) { - mListNames->swapWithPrevious(selectedRow); + updateListNames(); updateListNamesControls(); } else @@ -321,7 +321,7 @@ void LLFloaterAutoReplaceSettings::onListDown() if ( mSettings.decreaseListPriority(selectedName) ) { - mListNames->swapWithNext(selectedRow); + updateListNames(); updateListNamesControls(); } else @@ -529,6 +529,7 @@ void LLFloaterAutoReplaceSettings::onExportList() void LLFloaterAutoReplaceSettings::onAddEntry() { mPreviousKeyword.clear(); + mReplacementsList->deselectAllItems(false /* don't call commit */); mKeyword->clear(); mReplacement->clear(); enableReplacementEntry(); |