diff options
| author | maxim@mnikolenko <maxim@mnikolenko> | 2014-01-23 12:01:16 +0200 | 
|---|---|---|
| committer | maxim@mnikolenko <maxim@mnikolenko> | 2014-01-23 12:01:16 +0200 | 
| commit | ec8bac9c2616e3612d2dffe4d90fef308934347e (patch) | |
| tree | 06325516f7da57496227c6b88e0fe35745fb784b | |
| parent | 74c7460846f08d0a2c45589c670e55988a951965 (diff) | |
MAINT-3119 FIXED Return common chars for triggers that matches the prefix.
| -rwxr-xr-x | indra/newview/llgesturemgr.cpp | 62 | 
1 files changed, 59 insertions, 3 deletions
| diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index b56c34573d..2ae13b1b2f 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1339,6 +1339,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  {  	S32 in_len = in_str.length(); +	//return whole trigger, if received text equals to it  	item_map_t::iterator it;  	for (it = mActive.begin(); it != mActive.end(); ++it)  	{ @@ -1346,7 +1347,24 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  		if (gesture)  		{  			const std::string& trigger = gesture->getTrigger(); -			 +			if (!LLStringUtil::compareInsensitive(in_str, trigger)) +			{ +				*out_str = trigger; +				return TRUE; +			} +		} +	} + +	//return common chars, if more than one trigger matches the prefix +	std::string rest_of_match = ""; +	std::string buf = ""; +	for (it = mActive.begin(); it != mActive.end(); ++it) +	{ +		LLMultiGesture* gesture = (*it).second; +		if (gesture) +		{ +			const std::string& trigger = gesture->getTrigger(); +  			if (in_len > (S32)trigger.length())  			{  				// too short, bail out @@ -1357,11 +1375,49 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)  			LLStringUtil::truncate(trigger_trunc, in_len);  			if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))  			{ -				*out_str = trigger; -				return TRUE; +				if (rest_of_match.compare("") == 0) +				{ +					rest_of_match = trigger.substr(in_str.size()); +				} +				std::string cur_rest_of_match = trigger.substr(in_str.size()); +				buf = ""; +				S32 i=0; + +				while (i<rest_of_match.length() && i<cur_rest_of_match.length()) +				{ +					if (rest_of_match[i]==cur_rest_of_match[i]) +				    { +						buf.push_back(rest_of_match[i]); +				    } +				    else +				    { +				    	if(i==0) +				    	{ +				    		rest_of_match = ""; +				    	} +				    	break; +				    } +					i++; +				} +				if (rest_of_match.compare("") == 0) +				{ +					return FALSE; +				} +				if (buf.compare("") != 0) +				{ +					rest_of_match = buf; +				} +  			}  		}  	} + +	if (rest_of_match.compare("") != 0) +	{ +		*out_str = in_str+rest_of_match; +		return TRUE; +	} +  	return FALSE;  } | 
