From b7536a307cc51aadacc375a2376dde199f26a7d6 Mon Sep 17 00:00:00 2001
From: Todd Stinson <stinson@lindenlab.com>
Date: Tue, 31 Jul 2012 13:48:59 -0700
Subject: CHUI-258: Ensuring that the teleport lure requests are logged to IM
 and not to nearby chat.

---
 indra/newview/skins/default/xui/en/notifications.xml | 6 ++++++
 1 file changed, 6 insertions(+)

(limited to 'indra')

diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f3d2762d3f..e85637826d 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6413,6 +6413,7 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
    icon="notify.tga"
    name="TeleportOffered"
    log_to_im="true"
+   log_to_chat="false"
    type="offer">
 [NAME_SLURL] has offered to teleport you to their location:
 
@@ -6434,6 +6435,8 @@ Your object named &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; has given you th
   <notification
    icon="notify.tga"
    name="TeleportOffered_MaturityExceeded"
+   log_to_im="true"
+   log_to_chat="false"
    type="offer">
 [NAME_SLURL] has offered to teleport you to their location:
 
@@ -6457,6 +6460,8 @@ This region contains [REGION_CONTENT_MATURITY] content, but your current prefere
   <notification
    icon="notify.tga"
    name="TeleportOffered_MaturityBlocked"
+   log_to_im="true"
+   log_to_chat="false"
    type="notifytip">
 [NAME_SLURL] has offered to teleport you to their location:
 
@@ -6471,6 +6476,7 @@ However, this region contains content accessible to adults only.
    icon="notify.tga"
    name="TeleportOfferSent"
    log_to_im="true"
+   log_to_chat="false"
    show_toast="false"
    type="offer">
 	Teleport offer sent to [TO_NAME]
-- 
cgit v1.2.3


From bc54fc2750c02ea11e8485efc541739a90d9cb3f Mon Sep 17 00:00:00 2001
From: Todd Stinson <stinson@lindenlab.com>
Date: Tue, 31 Jul 2012 16:33:36 -0700
Subject: CHUI-259: Resovling an issue introduced during the recent merge that
 incorrectly altered the conditional scope of when nametag text segments were
 created.

---
 indra/newview/llvoavatar.cpp | 316 +++++++++++++++++++++----------------------
 1 file changed, 158 insertions(+), 158 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index e5362261cf..2871b7b018 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3124,191 +3124,191 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 		{
 			debugAvatarRezTime("AvatarRezLeftAppearanceNotification","left appearance mode");
 		}
+	}
 
-		// Rebuild name tag if state change detected
-		if (mNameString.empty()
-			|| new_name
-			|| (!title && !mTitle.empty())
-			|| (title && mTitle != title->getString())
-			|| is_away != mNameAway 
-			|| is_busy != mNameBusy 
-			|| is_muted != mNameMute
-			|| is_appearance != mNameAppearance 
-			|| is_friend != mNameFriend
-			|| is_cloud != mNameCloud)
-		{
-			LLColor4 name_tag_color = getNameTagColor(is_friend);
+	// Rebuild name tag if state change detected
+	if (mNameString.empty()
+		|| new_name
+		|| (!title && !mTitle.empty())
+		|| (title && mTitle != title->getString())
+		|| is_away != mNameAway 
+		|| is_busy != mNameBusy 
+		|| is_muted != mNameMute
+		|| is_appearance != mNameAppearance 
+		|| is_friend != mNameFriend
+		|| is_cloud != mNameCloud)
+	{
+		LLColor4 name_tag_color = getNameTagColor(is_friend);
 
-			clearNameTag();
+		clearNameTag();
 
-			if (is_away || is_muted || is_busy || is_appearance)
+		if (is_away || is_muted || is_busy || is_appearance)
+		{
+			std::string line;
+			if (is_away)
 			{
-				std::string line;
-				if (is_away)
-				{
-					line += LLTrans::getString("AvatarAway");
-					line += ", ";
-				}
-				if (is_busy)
-				{
-					line += LLTrans::getString("AvatarBusy");
-					line += ", ";
-				}
-				if (is_muted)
-				{
-					line += LLTrans::getString("AvatarMuted");
-					line += ", ";
-				}
-				if (is_appearance)
-				{
-					line += LLTrans::getString("AvatarEditingAppearance");
-					line += ", ";
-				}
-				if (is_cloud)
-				{
-					line += LLTrans::getString("LoadingData");
-					line += ", ";
-				}
-				// trim last ", "
-				line.resize( line.length() - 2 );
-				addNameTagLine(line, name_tag_color, LLFontGL::NORMAL,
-					LLFontGL::getFontSansSerifSmall());
+				line += LLTrans::getString("AvatarAway");
+				line += ", ";
 			}
-
-			if (sRenderGroupTitles
-				&& title && title->getString() && title->getString()[0] != '\0')
+			if (is_busy)
 			{
-				std::string title_str = title->getString();
-				LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR);
-				addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL,
-					LLFontGL::getFontSansSerifSmall());
+				line += LLTrans::getString("AvatarBusy");
+				line += ", ";
 			}
-
-			static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames");
-			static LLUICachedControl<bool> show_usernames("NameTagShowUsernames");
-
-			if (LLAvatarNameCache::useDisplayNames())
+			if (is_muted)
 			{
-				LLAvatarName av_name;
-				if (!LLAvatarNameCache::get(getID(), &av_name))
-				{
-					// ...call this function back when the name arrives
-					// and force a rebuild
-					LLAvatarNameCache::get(getID(),
-						boost::bind(&LLVOAvatar::clearNameTag, this));
-				}
-
-				// Might be blank if name not available yet, that's OK
-				if (show_display_names)
-				{
-					addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL,
-						LLFontGL::getFontSansSerif());
-				}
-				// Suppress SLID display if display name matches exactly (ugh)
-				if (show_usernames && !av_name.mIsDisplayNameDefault)
-				{
-					// *HACK: Desaturate the color
-					LLColor4 username_color = name_tag_color * 0.83f;
-					addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL,
-						LLFontGL::getFontSansSerifSmall());
-				}
+				line += LLTrans::getString("AvatarMuted");
+				line += ", ";
 			}
-			else
+			if (is_appearance)
 			{
-				const LLFontGL* font = LLFontGL::getFontSansSerif();
-				std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
-				addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font);
+				line += LLTrans::getString("AvatarEditingAppearance");
+				line += ", ";
 			}
-
-			mNameAway = is_away;
-			mNameBusy = is_busy;
-			mNameMute = is_muted;
-			mNameAppearance = is_appearance;
-			mNameFriend = is_friend;
-			mNameCloud = is_cloud;
-			mTitle = title ? title->getString() : "";
-			LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
-			new_name = TRUE;
+			if (is_cloud)
+			{
+				line += LLTrans::getString("LoadingData");
+				line += ", ";
+			}
+			// trim last ", "
+			line.resize( line.length() - 2 );
+			addNameTagLine(line, name_tag_color, LLFontGL::NORMAL,
+				LLFontGL::getFontSansSerifSmall());
 		}
 
-		if (mVisibleChat)
+		if (sRenderGroupTitles
+			&& title && title->getString() && title->getString()[0] != '\0')
 		{
-			mNameText->setFont(LLFontGL::getFontSansSerif());
-			mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT);
-			mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f);
+			std::string title_str = title->getString();
+			LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR);
+			addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL,
+				LLFontGL::getFontSansSerifSmall());
+		}
 
-			char line[MAX_STRING];		/* Flawfinder: ignore */
-			line[0] = '\0';
-			std::deque<LLChat>::iterator chat_iter = mChats.begin();
-			mNameText->clearString();
+		static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames");
+		static LLUICachedControl<bool> show_usernames("NameTagShowUsernames");
 
-			LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" );
-			LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
-			LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
-			if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) 
+		if (LLAvatarNameCache::useDisplayNames())
+		{
+			LLAvatarName av_name;
+			if (!LLAvatarNameCache::get(getID(), &av_name))
 			{
-				++chat_iter;
+				// ...call this function back when the name arrives
+				// and force a rebuild
+				LLAvatarNameCache::get(getID(),
+					boost::bind(&LLVOAvatar::clearNameTag, this));
 			}
 
-			for(; chat_iter != mChats.end(); ++chat_iter)
+			// Might be blank if name not available yet, that's OK
+			if (show_display_names)
 			{
-				F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f);
-				LLFontGL::StyleFlags style;
-				switch(chat_iter->mChatType)
-				{
-				case CHAT_TYPE_WHISPER:
-					style = LLFontGL::ITALIC;
-					break;
-				case CHAT_TYPE_SHOUT:
-					style = LLFontGL::BOLD;
-					break;
-				default:
-					style = LLFontGL::NORMAL;
-					break;
-				}
-				if (chat_fade_amt < 1.f)
-				{
-					F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f);
-					mNameText->addLine(chat_iter->mText, lerp(new_chat, normal_chat, u), style);
-				}
-				else if (chat_fade_amt < 2.f)
-				{
-					F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f);
-					mNameText->addLine(chat_iter->mText, lerp(normal_chat, old_chat, u), style);
-				}
-				else if (chat_fade_amt < 3.f)
-				{
-					// *NOTE: only remove lines down to minimum number
-					mNameText->addLine(chat_iter->mText, old_chat, style);
-				}
+				addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL,
+					LLFontGL::getFontSansSerif());
 			}
-			mNameText->setVisibleOffScreen(TRUE);
-
-			if (mTyping)
+			// Suppress SLID display if display name matches exactly (ugh)
+			if (show_usernames && !av_name.mIsDisplayNameDefault)
 			{
-				S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
-				switch(dot_count)
-				{
-				case 1:
-					mNameText->addLine(".", new_chat);
-					break;
-				case 2:
-					mNameText->addLine("..", new_chat);
-					break;
-				case 3:
-					mNameText->addLine("...", new_chat);
-					break;
-				}
-
+				// *HACK: Desaturate the color
+				LLColor4 username_color = name_tag_color * 0.83f;
+				addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL,
+					LLFontGL::getFontSansSerifSmall());
 			}
 		}
 		else
 		{
-			// ...not using chat bubbles, just names
-			mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_CENTER);
-			mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
-			mNameText->setVisibleOffScreen(FALSE);
+			const LLFontGL* font = LLFontGL::getFontSansSerif();
+			std::string full_name = LLCacheName::buildFullName( firstname->getString(), lastname->getString() );
+			addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font);
+		}
+
+		mNameAway = is_away;
+		mNameBusy = is_busy;
+		mNameMute = is_muted;
+		mNameAppearance = is_appearance;
+		mNameFriend = is_friend;
+		mNameCloud = is_cloud;
+		mTitle = title ? title->getString() : "";
+		LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
+		new_name = TRUE;
+	}
+
+	if (mVisibleChat)
+	{
+		mNameText->setFont(LLFontGL::getFontSansSerif());
+		mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT);
+		mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f);
+
+		char line[MAX_STRING];		/* Flawfinder: ignore */
+		line[0] = '\0';
+		std::deque<LLChat>::iterator chat_iter = mChats.begin();
+		mNameText->clearString();
+
+		LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" );
+		LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
+		LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
+		if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) 
+		{
+			++chat_iter;
 		}
+
+		for(; chat_iter != mChats.end(); ++chat_iter)
+		{
+			F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f);
+			LLFontGL::StyleFlags style;
+			switch(chat_iter->mChatType)
+			{
+			case CHAT_TYPE_WHISPER:
+				style = LLFontGL::ITALIC;
+				break;
+			case CHAT_TYPE_SHOUT:
+				style = LLFontGL::BOLD;
+				break;
+			default:
+				style = LLFontGL::NORMAL;
+				break;
+			}
+			if (chat_fade_amt < 1.f)
+			{
+				F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f);
+				mNameText->addLine(chat_iter->mText, lerp(new_chat, normal_chat, u), style);
+			}
+			else if (chat_fade_amt < 2.f)
+			{
+				F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f);
+				mNameText->addLine(chat_iter->mText, lerp(normal_chat, old_chat, u), style);
+			}
+			else if (chat_fade_amt < 3.f)
+			{
+				// *NOTE: only remove lines down to minimum number
+				mNameText->addLine(chat_iter->mText, old_chat, style);
+			}
+		}
+		mNameText->setVisibleOffScreen(TRUE);
+
+		if (mTyping)
+		{
+			S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
+			switch(dot_count)
+			{
+			case 1:
+				mNameText->addLine(".", new_chat);
+				break;
+			case 2:
+				mNameText->addLine("..", new_chat);
+				break;
+			case 3:
+				mNameText->addLine("...", new_chat);
+				break;
+			}
+
+		}
+	}
+	else
+	{
+		// ...not using chat bubbles, just names
+		mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_CENTER);
+		mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
+		mNameText->setVisibleOffScreen(FALSE);
 	}
 }
 
-- 
cgit v1.2.3


From e9a484f98d0376a5651d4f6eb5a692db4f77c800 Mon Sep 17 00:00:00 2001
From: Merov Linden <merov@lindenlab.com>
Date: Tue, 31 Jul 2012 23:46:13 -0700
Subject: CHUI-254 : Fix Inventory filter and item draw() to highlight matching
 substrings in inventory

---
 indra/llui/llfolderviewitem.cpp              | 47 +++++++++++++---------------
 indra/llui/llfolderviewitem.h                |  2 --
 indra/llui/llfolderviewmodel.h               | 15 ++++++++-
 indra/newview/llfolderviewmodelinventory.cpp |  8 ++---
 indra/newview/llfolderviewmodelinventory.h   |  2 +-
 indra/newview/llimfloatercontainer.h         |  4 ++-
 indra/newview/llinventoryfilter.cpp          | 18 +++++++----
 indra/newview/llinventoryfilter.h            |  6 ++--
 8 files changed, 58 insertions(+), 44 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 0f486d06c9..368e3caea8 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -106,8 +106,6 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
 	mHasVisibleChildren(FALSE),
 	mIndentation(0),
 	mItemHeight(p.item_height),
-	//TODO RN: create interface for string highlighting
-	//mStringMatchOffset(std::string::npos),
 	mControlLabelRotation(0.f),
 	mDragAndDropTarget(FALSE),
 	mLabel(p.name),
@@ -778,29 +776,28 @@ void LLFolderViewItem::draw()
 	//--------------------------------------------------------------------------------//
 	// Highlight string match
 	//
-	//TODO RN: expose interface for highlighting
-	//if (mStringMatchOffset != std::string::npos)
-	//{
-	//	// don't draw backgrounds for zero-length strings
-	//	S32 filter_string_length = getRoot()->getFilterSubString().size();
-	//	if (filter_string_length > 0)
-	//	{
-	//		std::string combined_string = mLabel + mLabelSuffix;
-	//		S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
-	//		S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
-	//		S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
-	//		S32 top = getRect().getHeight() - TOP_PAD;
-	//	
-	//		LLUIImage* box_image = default_params.selection_image;
-	//		LLRect box_rect(left, top, right, bottom);
-	//		box_image->draw(box_rect, sFilterBGColor);
-	//		F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
-	//		F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
-	//		font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
-	//						  sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-	//						  filter_string_length, S32_MAX, &right_x, FALSE );
-	//	}
-	//}
+	if (mViewModelItem->hasFilterStringMatch())
+	{
+		// don't draw backgrounds for zero-length strings
+		std::string::size_type filter_string_length = mViewModelItem->getFilterStringSize();
+		if (filter_string_length > 0)
+		{
+			std::string combined_string = mLabel + mLabelSuffix;
+			S32 left = llround(text_left) + font->getWidth(combined_string, 0, mViewModelItem->getFilterStringOffset()) - 1;
+			S32 right = left + font->getWidth(combined_string, mViewModelItem->getFilterStringOffset(), filter_string_length) + 2;
+			S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
+			S32 top = getRect().getHeight() - TOP_PAD;
+
+			LLUIImage* box_image = default_params.selection_image;
+			LLRect box_rect(left, top, right, bottom);
+			box_image->draw(box_rect, sFilterBGColor);
+			F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mViewModelItem->getFilterStringOffset());
+			F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+			font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy,
+							  sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+							  filter_string_length, S32_MAX, &right_x, FALSE );
+		}
+	}
 }
 
 const LLFolderViewModelInterface* LLFolderViewItem::getFolderViewModel( void ) const
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index df007dd15d..e323237b13 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -103,8 +103,6 @@ protected:
 	S32							mDragStartX,
 								mDragStartY;
 
-	//TODO RN: create interface for string highlighting
-	//std::string::size_type		mStringMatchOffset;
 	F32							mControlLabelRotation;
 	LLFolderView*				mRoot;
 	bool						mHasVisibleChildren;
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index acdec53602..f655e6e4d6 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -73,6 +73,8 @@ public:
 
 	virtual bool				showAllResults() const = 0;
 
+	virtual std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const = 0;
+	virtual std::string::size_type getFilterStringSize() const = 0;
 	// +-------------------------------------------------------------------+
 	// + Status
 	// +-------------------------------------------------------------------+
@@ -155,8 +157,11 @@ public:
 	virtual void filter( LLFolderViewFilter& filter) = 0;
 	virtual bool passedFilter(S32 filter_generation = -1) = 0;
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1) = 0;
-	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) = 0;
+	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) = 0;
 	virtual void dirtyFilter() = 0;
+	virtual bool hasFilterStringMatch() = 0;
+	virtual std::string::size_type getFilterStringOffset() = 0;
+	virtual std::string::size_type getFilterStringSize() = 0;
 
 	virtual S32	getLastFilterGeneration() const = 0;
 
@@ -193,6 +198,8 @@ public:
 		mPassedFilter(true),
 		mPassedFolderFilter(true),
 		mPrevPassedAllFilters(false),
+		mStringMatchOffsetFilter(std::string::npos),
+		mStringFilterSize(0),
 		mFolderViewItem(NULL),
 		mLastFilterGeneration(-1),
 		mMostFilteredDescendantGeneration(-1),
@@ -216,6 +223,10 @@ public:
 			mParent->dirtyFilter();
 		}	
 	}
+	bool hasFilterStringMatch() { return mStringMatchOffsetFilter != std::string::npos; }
+	std::string::size_type getFilterStringOffset() { return mStringMatchOffsetFilter; }
+	std::string::size_type getFilterStringSize() { return mStringFilterSize; }
+	
 	virtual void addChild(LLFolderViewModelItem* child) 
 	{ 
 		mChildren.push_back(child); 
@@ -234,6 +245,8 @@ protected:
 	bool					mPassedFilter;
 	bool					mPassedFolderFilter;
 	bool					mPrevPassedAllFilters;
+	std::string::size_type	mStringMatchOffsetFilter;
+	std::string::size_type	mStringFilterSize;
 
 	S32						mLastFilterGeneration;
 	S32						mMostFilteredDescendantGeneration;
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index 13ca73917b..0878d15d06 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -144,11 +144,13 @@ bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generati
 	return mMostFilteredDescendantGeneration >= filter_generation; 
 }
 
-void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_folder, S32 filter_generation)
+void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
 {
 	mPassedFilter = passed;
 	mPassedFolderFilter = passed_folder;
 	mLastFilterGeneration = filter_generation;
+	mStringMatchOffsetFilter = string_offset;
+	mStringFilterSize = string_size;
 
 	bool passed_filter_before = mPrevPassedAllFilters;
 	mPrevPassedAllFilters = passedFilter(filter_generation);
@@ -226,9 +228,7 @@ void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 								? filter.checkFolder(this)
 								: true;
 
-		setPassedFilter(passed_filter, passed_filter_folder, filter_generation);
-		//TODO RN: create interface for string highlighting
-		//mStringMatchOffset = filter.getStringMatchOffset(this);
+		setPassedFilter(passed_filter, passed_filter_folder, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
 	}
 }
 
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index ab67c93897..72c8047325 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -58,7 +58,7 @@ public:
 	virtual bool potentiallyVisible();
 	virtual bool passedFilter(S32 filter_generation = -1);
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1);
-	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
+	virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0);
 	virtual void filter( LLFolderViewFilter& filter);
 	virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
 
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 7005ab7b6a..9b487dd652 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -91,7 +91,7 @@ public:
 	virtual bool potentiallyVisible() { return true; }
 	virtual void filter( LLFolderViewFilter& filter) { }
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
-	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) { }
+	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) { }
 	virtual bool passedFilter(S32 filter_generation = -1) { return true; }
 
 	// The action callbacks
@@ -142,6 +142,8 @@ public:
 	void 				setEmptyLookupMessage(const std::string& message) { }
 	std::string			getEmptyLookupMessage() const { return mEmpty; }
 	bool				showAllResults() const { return true; }
+	std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const { return std::string::npos; }
+	std::string::size_type getFilterStringSize() const { return 0; }
 		
 	bool 				isActive() const { return false; }
 	bool 				isModified() const { return false; }
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index b4be927b09..4f4030550f 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -95,9 +95,9 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
 		return passed_clipboard;
 	}
 
-	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : 0;
+	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
 
-	BOOL passed = string_offset !=  std::string::npos;
+	BOOL passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);
 	passed = passed && checkAgainstFilterType(listener);
 	passed = passed && checkAgainstPermissions(listener);
 	passed = passed && checkAgainstFilterLinks(listener);
@@ -108,7 +108,7 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
 
 bool LLInventoryFilter::check(const LLInventoryItem* item)
 {
-	std::string::size_type string_offset = mFilterSubString.size() ?   item->getName().find(mFilterSubString) : std::string::npos;
+	std::string::size_type string_offset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
 
 	const bool passed_filtertype = checkAgainstFilterType(item);
 	const bool passed_permissions = checkAgainstPermissions(item);
@@ -116,7 +116,7 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)
 	const bool passed = (passed_filtertype 
 		&& passed_permissions
 		&& passed_clipboard 
-		&&	(mFilterSubString.size() == 0 || string_offset !=  std::string::npos));
+		&&	(mFilterSubString.size() == 0 || string_offset != std::string::npos));
 
 	return passed;
 }
@@ -383,9 +383,10 @@ const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
 	return mFilterSubString;
 }
 
-std::string::size_type   LLInventoryFilter::getStringMatchOffset(LLFolderViewItem* item) const
+std::string::size_type LLInventoryFilter::getStringMatchOffset(LLFolderViewModelItem* item) const
 {
-	return mFilterSubString.size() ? item->getName().find(mFilterSubString)   : std::string::npos;
+	const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item);
+	return mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
 }
 
 bool LLInventoryFilter::isDefault() const
@@ -1004,6 +1005,11 @@ bool LLInventoryFilter::hasFilterString() const
 	return mFilterSubString.size() > 0;
 }
 
+std::string::size_type LLInventoryFilter::getFilterStringSize() const
+{
+	return mFilterSubString.size();
+}
+
 PermissionMask LLInventoryFilter::getFilterPermissions() const
 {
 	return mFilterOps.mPermissions;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index af245a9c3b..a8d39735f3 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -193,10 +193,8 @@ public:
 
 	bool				showAllResults() const;
 
-
-	std::string::size_type getStringMatchOffset() const;
-
-	std::string::size_type getStringMatchOffset(LLFolderViewItem* item)   const;
+	std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const;
+	std::string::size_type getFilterStringSize() const;
 	// +-------------------------------------------------------------------+
 	// + Presentation
 	// +-------------------------------------------------------------------+
-- 
cgit v1.2.3