diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llautoreplace.cpp | 77 |
1 files changed, 40 insertions, 37 deletions
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index 32cd7d2ae3..a4a08daf27 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -48,53 +48,56 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos) static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace"); if(perform_autoreplace) { - S32 wordStart = 0; S32 wordEnd = cursorPos-1; - - if(wordEnd < 1) - { - return; - } - LLWString text = inputText.getWString(); - if(text.size()<1) - { - return; - } - if(LLWStringUtil::isPartOfWord(text[wordEnd])) - { - return;//we only check on word breaks - } + bool atSpace = (text[wordEnd] == ' '); + bool haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd])); - wordEnd--; - if ( LLWStringUtil::isPartOfWord(text[wordEnd]) ) + if (atSpace || haveWord) { - while ((wordEnd > 0) && (' ' != text[wordEnd-1])) + if (atSpace) { + // find out if this space immediately follows a word wordEnd--; + haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd])); } - - wordStart=wordEnd; - - while ((wordEnd < (S32)text.length()) && (' ' != text[wordEnd])) - { - wordEnd++; - } - - std::string strLastWord = std::string(text.begin(), text.end()); - std::string lastTypedWord = strLastWord.substr(wordStart, wordEnd-wordStart); - std::string replacedWord( mSettings.replaceWord(lastTypedWord) ); - - if(replacedWord != lastTypedWord) + if (haveWord) { - LLWString strNew = utf8str_to_wstring(replacedWord); - LLWString strOld = utf8str_to_wstring(lastTypedWord); - int nDiff = strNew.size() - strOld.size(); + std::string word; + S32 wordStart = wordEnd; + for ( S32 backOne = wordStart - 1; + backOne >= 0 && LLWStringUtil::isPartOfWord(text[backOne]); + backOne-- + ) + { + wordStart--; // walk wordStart back to the beginning of the word + } + LL_DEBUGS("AutoReplace")<<"wordStart: "<<wordStart<<" wordEnd: "<<wordEnd<<LL_ENDL; + std::string strText = std::string(text.begin(), text.end()); + std::string lastWord = strText.substr(wordStart, wordEnd-wordStart+1); + std::string replacementWord( mSettings.replaceWord( lastWord ) ); - text.replace(wordStart,lastTypedWord.length(),strNew); - inputText = wstring_to_utf8str(text); - cursorPos+=nDiff; + if ( replacementWord != lastWord ) + { + // The last word is one for which we have a replacement + if (atSpace) + { + // replace the last word in the input + LLWString strNew = utf8str_to_wstring(replWord); + LLWString strOld = utf8str_to_wstring(lastWord); + int size_change = strNew.size() - strOld.size(); + + text.replace(wordStart,lastWord.length(),strNew); + inputText = wstring_to_utf8str(text); + cursorPos+=size_change; + } + else + { + // @TODO display replacement as tooltip? + LL_DEBUGS("AutoReplace")<<"tooltip: '"<<lastWord<<"' -> '"<<replWord<<"'"<<LL_ENDL; + } + } } } } |