From 2b8beeeff1485682e2b47f330dc8b3c24e966961 Mon Sep 17 00:00:00 2001
From: mberezhnoy <mberezhnoy@productengine.com>
Date: Thu, 20 Jun 2013 12:45:22 +0300
Subject: [PATCH] CHUI-809 (Right-click menu on user name in compat chat mode
 doesn't have "IM") Fixed "Add friend" option always being greyed out, add
 ability to block object via context menu in compact chat mode.

---
 indra/llui/lltextbase.cpp                     |  3 +-
 indra/llui/llurlaction.cpp                    | 34 +++++++++++++++++++
 indra/llui/llurlaction.h                      |  3 ++
 indra/newview/llpanelprofile.cpp              | 14 ++++++++
 .../default/xui/en/menu_url_objectim.xml      |  7 ++++
 5 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e2a39d89e4b..0276ade3e18 100755
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1941,6 +1941,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	registrar.add("Url.OpenInternal", boost::bind(&LLUrlAction::openURLInternal, url));
 	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
 	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
+	registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
 	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
 	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
 	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
@@ -1956,7 +1957,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 																		 LLMenuHolderGL::child_registry_t::instance());	
 	if (mIsFriendSignal)
 	{
-		bool isFriend = (*mIsFriendSignal)(LLUUID(LLUrlAction::getUserID(url)));
+		bool isFriend = *(*mIsFriendSignal)(LLUUID(LLUrlAction::getUserID(url)));
 		LLView* addFriendButton = mPopupMenu->getChild<LLView>("add_friend");
 		LLView* removeFriendButton = mPopupMenu->getChild<LLView>("remove_friend");
 
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index cf707d87dc3..d0062092843 100755
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -170,6 +170,30 @@ std::string LLUrlAction::getUserID(std::string url)
 	return id_str;
 }
 
+std::string LLUrlAction::getObjectId(std::string url)
+{
+	LLURI uri(url);
+	LLSD path_array = uri.pathArray();
+	std::string id_str;
+	if (path_array.size() >= 3)
+	{
+		id_str = path_array.get(2).asString();
+	}
+	return id_str;
+}
+
+std::string LLUrlAction::getObjectName(std::string url)
+{
+	LLURI uri(url);
+	LLSD query_map = uri.queryMap();
+	std::string name;
+	if (query_map.has("name"))
+	{
+		name = query_map["name"];
+	}
+	return name;
+}
+
 void LLUrlAction::sendIM(std::string url)
 {
 	std::string id_str = getUserID(url);
@@ -196,3 +220,13 @@ void LLUrlAction::removeFriend(std::string url)
 		executeSLURL("secondlife:///app/agent/" + id_str + "/removefriend");
 	}
 }
+
+void LLUrlAction::blockObject(std::string url)
+{
+	std::string object_id = getObjectId(url);
+	std::string object_name = getObjectName(url);
+	if (LLUUID::validate(object_id))
+	{
+		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + object_name);
+	}
+}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 1984ec63e96..e731376b95e 100755
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -77,9 +77,12 @@ class LLUrlAction
 	/// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
 	static void showProfile(std::string url);
 	static std::string getUserID(std::string url);
+	static std::string getObjectName(std::string url);
+	static std::string getObjectId(std::string url);
 	static void sendIM(std::string url);
 	static void addFriend(std::string url);
 	static void removeFriend(std::string url);
+	static void blockObject(std::string url);
 
 	/// specify the callbacks to enable this class's functionality
 	typedef boost::function<void (const std::string&)> url_callback_t;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 3b95b464767..5acc98904ba 100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -36,6 +36,8 @@
 #include "lltabcontainer.h"
 #include "llviewercontrol.h"
 #include "llviewernetwork.h"
+#include "llmutelist.h"
+#include "llpanelblockedlist.h"
 
 static const std::string PANEL_PICKS = "panel_picks";
 
@@ -161,6 +163,18 @@ class LLAgentHandler : public LLCommandHandler
 			return true;
 		}
 
+		if (verb == "block")
+		{
+			if (params.size() > 2)
+			{
+				const std::string object_name = params[2].asString();
+				LLMute mute(avatar_id, object_name, LLMute::OBJECT);
+				LLMuteList::getInstance()->add(mute);
+				LLPanelBlockedList::showPanelAndSelect(mute.mID);
+			}
+			return true;
+		}
+
 		return false;
 	}
 };
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index 87ab58e622e..b9d003b8419 100755
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -9,6 +9,13 @@
         <menu_item_call.on_click
          function="Url.Execute" />
     </menu_item_call>
+    <menu_item_call
+     label="Block..."
+     layout="topleft"
+     name="block_object">
+        <menu_item_call.on_click
+         function="Url.Block" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
-- 
GitLab