summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCho <cho@lindenlab.com>2013-01-23 20:22:28 +0000
committerCho <cho@lindenlab.com>2013-01-23 20:22:28 +0000
commit977d318ac8ccb756bb90a8572f01bc6825b5d0a3 (patch)
tree1002b1b87373951d40d6ec276ce26015f8b2bbd8
parent9e6677ffc29b779f7b47228cf96c5bcdc867669c (diff)
CHUI-291 FIX New auto-replace feature does not work with chui text input boxes in conversation floater
Moved autoreplace hooks from LLLineEditor to LLTextEditor, and modified LLAutoReplace accordingly
-rw-r--r--indra/llui/lllineeditor.cpp9
-rw-r--r--indra/llui/lllineeditor.h3
-rw-r--r--indra/llui/lltexteditor.cpp10
-rw-r--r--indra/llui/lltexteditor.h5
-rw-r--r--indra/newview/llautoreplace.cpp50
-rw-r--r--indra/newview/llautoreplace.h51
-rw-r--r--indra/newview/llfloaterimnearbychat.cpp2
-rw-r--r--indra/newview/llfloaterimsession.cpp6
8 files changed, 58 insertions, 78 deletions
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 48d49af588..2e64be89fa 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -157,8 +157,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mHighlightColor(p.highlight_color()),
mPreeditBgColor(p.preedit_bg_color()),
mGLFont(p.font),
- mContextMenuHandle(),
- mAutoreplaceCallback()
+ mContextMenuHandle()
{
llassert( mMaxLengthBytes > 0 );
@@ -971,12 +970,6 @@ void LLLineEditor::addChar(const llwchar uni_char)
LLUI::reportBadKeystroke();
}
- if (!mReadOnly && mAutoreplaceCallback != NULL)
- {
- // call callback
- mAutoreplaceCallback(mText, mCursorPos);
- }
-
getWindow()->hideCursorUntilMouseMove();
}
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 71dd53f608..40f931ecc1 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -189,9 +189,6 @@ public:
virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
- typedef boost::function<void(LLUIString&, S32&)> autoreplace_callback_t;
- autoreplace_callback_t mAutoreplaceCallback;
- void setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
const std::string& getLabel() { return mLabel.getString(); }
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index d42d6473ed..d297e54f2f 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -246,7 +246,8 @@ LLTextEditor::Params::Params()
}
LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
- LLTextBase(p),
+ LLTextBase(p),
+ mAutoreplaceCallback(),
mBaseDocIsPristine(TRUE),
mPristineCmd( NULL ),
mLastCmd( NULL ),
@@ -1097,7 +1098,14 @@ void LLTextEditor::addChar(llwchar wc)
}
setCursorPos(mCursorPos + addChar( mCursorPos, wc ));
+
+ if (!mReadOnly && mAutoreplaceCallback != NULL)
+ {
+ // call callback
+ mAutoreplaceCallback(getViewModel()->getEditableDisplay(), mCursorPos);
+ }
}
+
void LLTextEditor::addLineBreakChar()
{
if( !getEnabled() )
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index f8f636b876..ae5a983b60 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -157,6 +157,11 @@ public:
BOOL isPristine() const;
BOOL allowsEmbeddedItems() const { return mAllowEmbeddedItems; }
+ // Autoreplace (formerly part of LLLineEditor)
+ typedef boost::function<void(LLWString&, S32&)> autoreplace_callback_t;
+ autoreplace_callback_t mAutoreplaceCallback;
+ void setAutoreplaceCallback(autoreplace_callback_t cb) { mAutoreplaceCallback = cb; }
+
//
// Text manipulation
//
diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
index d71cf290d6..94773e312c 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -30,29 +30,17 @@
#include "llviewercontrol.h"
#include "llnotificationsutil.h"
-LLAutoReplace* LLAutoReplace::sInstance;
-
const char* LLAutoReplace::SETTINGS_FILE_NAME = "autoreplace.xml";
-LLAutoReplace::LLAutoReplace()
-{
-}
-
-LLAutoReplace::~LLAutoReplace()
-{
- sInstance = NULL;
-}
-
-void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
+void LLAutoReplace::autoreplaceCallback(LLWString& inputText, S32& cursorPos)
{
static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace");
if(perform_autoreplace)
{
S32 wordEnd = cursorPos-1;
- LLWString text = inputText.getWString();
- bool atSpace = (text[wordEnd] == ' ');
- bool haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+ bool atSpace = (inputText[wordEnd] == ' ');
+ bool haveWord = (LLWStringUtil::isPartOfWord(inputText[wordEnd]));
if (atSpace || haveWord)
{
@@ -60,7 +48,7 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
{
// find out if this space immediately follows a word
wordEnd--;
- haveWord = (LLWStringUtil::isPartOfWord(text[wordEnd]));
+ haveWord = (LLWStringUtil::isPartOfWord(inputText[wordEnd]));
}
if (haveWord)
{
@@ -68,14 +56,14 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
std::string word;
S32 wordStart = wordEnd;
for ( S32 backOne = wordStart - 1;
- backOne >= 0 && LLWStringUtil::isPartOfWord(text[backOne]);
+ backOne >= 0 && LLWStringUtil::isPartOfWord(inputText[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 strText = std::string(inputText.begin(), inputText.end());
std::string lastWord = strText.substr(wordStart, wordEnd-wordStart+1);
std::string replacementWord( mSettings.replaceWord( lastWord ) );
@@ -89,8 +77,7 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
LLWString strOld = utf8str_to_wstring(lastWord);
int size_change = strNew.size() - strOld.size();
- text.replace(wordStart,lastWord.length(),strNew);
- inputText = wstring_to_utf8str(text);
+ inputText.replace(wordStart,lastWord.length(),strNew);
cursorPos+=size_change;
}
}
@@ -99,16 +86,6 @@ void LLAutoReplace::autoreplaceCallback(LLUIString& inputText, S32& cursorPos)
}
}
-LLAutoReplace* LLAutoReplace::getInstance()
-{
- if(!sInstance)
- {
- sInstance = new LLAutoReplace();
- sInstance->loadFromSettings();
- }
- return sInstance;
-}
-
std::string LLAutoReplace::getUserSettingsFileName()
{
std::string path=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "");
@@ -147,6 +124,15 @@ void LLAutoReplace::setSettings(const LLAutoReplaceSettings& newSettings)
saveToUserSettings();
}
+LLAutoReplace::LLAutoReplace()
+{
+}
+
+void LLAutoReplace::initSingleton()
+{
+ loadFromSettings();
+}
+
void LLAutoReplace::loadFromSettings()
{
std::string filename=getUserSettingsFileName();
@@ -220,7 +206,7 @@ void LLAutoReplace::saveToUserSettings()
std::string filename=getUserSettingsFileName();
llofstream file;
file.open(filename.c_str());
- LLSDSerialize::toPrettyXML(mSettings.getAsLLSD(), file);
+ LLSDSerialize::toPrettyXML(mSettings.asLLSD(), file);
file.close();
LL_INFOS("AutoReplace") << "settings saved to '" << filename << "'" << LL_ENDL;
}
@@ -801,7 +787,7 @@ LLSD LLAutoReplaceSettings::getExampleLLSD()
return example;
}
-const LLSD& LLAutoReplaceSettings::getAsLLSD()
+const LLSD& LLAutoReplaceSettings::asLLSD()
{
return mLists;
}
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
index f720cc4eda..bbb86294bc 100644
--- a/indra/newview/llautoreplace.h
+++ b/indra/newview/llautoreplace.h
@@ -132,7 +132,7 @@ class LLAutoReplaceSettings
LLSD getExampleLLSD();
/// Get the actual settings as LLSD
- const LLSD& getAsLLSD();
+ const LLSD& asLLSD();
///< @note for use only in AutoReplace::saveToUserSettings
private:
@@ -190,42 +190,37 @@ class LLAutoReplaceSettings
*/
class LLAutoReplace : public LLSingleton<LLAutoReplace>
{
- public:
- LLAutoReplace();
- ~LLAutoReplace();
-
- /// @return a pointer to the active instance
- static LLAutoReplace* getInstance();
+public:
+ /// Callback that provides the hook for use in text entry methods
+ void autoreplaceCallback(LLWString& inputText, S32& cursorPos);
- /// Callback that provides the hook for use in text entry methods
- void autoreplaceCallback(LLUIString& inputText, S32& cursorPos);
+ /// Get a copy of the current settings
+ LLAutoReplaceSettings getSettings();
- /// Get a copy of the current settings
- LLAutoReplaceSettings getSettings();
+ /// Commit new settings after making changes
+ void setSettings(const LLAutoReplaceSettings& settings);
- /// Commit new settings after making changes
- void setSettings(const LLAutoReplaceSettings& settings);
-
- private:
- friend class LLSingleton<LLAutoReplace>;
- static LLAutoReplace* sInstance; ///< the active settings instance
+private:
+ friend class LLSingleton<LLAutoReplace>;
+ LLAutoReplace();
+ /*virtual*/ void initSingleton();
- LLAutoReplaceSettings mSettings; ///< configuration information
+ LLAutoReplaceSettings mSettings; ///< configuration information
- /// Read settings from persistent storage
- void loadFromSettings();
+ /// Read settings from persistent storage
+ void loadFromSettings();
- /// Make the newSettings active and write them to user storage
- void saveToUserSettings();
+ /// Make the newSettings active and write them to user storage
+ void saveToUserSettings();
- /// Compute the user settings file name
- std::string getUserSettingsFileName();
+ /// Compute the user settings file name
+ std::string getUserSettingsFileName();
- /// Compute the (read-ony) application settings file name
- std::string getAppSettingsFileName();
+ /// Compute the (read-ony) application settings file name
+ std::string getAppSettingsFileName();
- /// basename for the settings files
- static const char* SETTINGS_FILE_NAME;
+ /// basename for the settings files
+ static const char* SETTINGS_FILE_NAME;
};
#endif /* LLAUTOREPLACE_H */
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index 797d590e1f..73eb822036 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -66,6 +66,7 @@
#include "llrootview.h"
#include "llviewerchat.h"
#include "lltranslate.h"
+#include "llautoreplace.h"
S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0;
@@ -112,6 +113,7 @@ BOOL LLFloaterIMNearbyChat::postBuild()
setIsSingleInstance(TRUE);
BOOL result = LLFloaterIMSessionTab::postBuild();
+ mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
mInputEditor->setCommitCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxCommit, this));
mInputEditor->setKeystrokeCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxKeystroke, this));
mInputEditor->setFocusLostCallback(boost::bind(&LLFloaterIMNearbyChat::onChatBoxFocusLost, this));
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index a09dc1914f..a2c7bacb5d 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -332,13 +332,7 @@ BOOL LLFloaterIMSession::postBuild()
BOOL result = LLFloaterIMSessionTab::postBuild();
mInputEditor->setMaxTextLength(1023);
- // enable line history support for instant message bar
- // XXX stinson TODO : resolve merge by adding autoreplace to text editors
-#if 0
- // *TODO Establish LineEditor with autoreplace callback
mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2));
-#endif
-
mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
mInputEditor->setFocusLostCallback( boost::bind(onInputEditorFocusLost, _1, this) );
mInputEditor->setKeystrokeCallback( boost::bind(onInputEditorKeystroke, _1, this) );