From 823ae2ea98c7fd24053d7bc97fbc178b654190b4 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 16 Jun 2010 13:35:57 -0400
Subject: [PATCH] EXT-7735 FIXED When receiving a folder, "Show" (or hotlink)
 doesn't do anything

Fixed highlight and open item code to work for both categories and items (was previously only working for items).
---
 indra/newview/llinventoryobserver.cpp |  11 +-
 indra/newview/llpanelplaces.cpp       |   2 +-
 indra/newview/llviewermessage.cpp     | 166 +++++++++++++++-----------
 indra/newview/llviewermessage.h       |   2 +-
 4 files changed, 105 insertions(+), 76 deletions(-)

diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index bd352596707..0ac8fbcb152 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -308,7 +308,16 @@ void LLInventoryFetchItemsObserver::startFetch()
 			// assume it's agent inventory.
 			owner_id = gAgent.getID();
 		}
-		
+
+		// Ignore categories since they're not items.  We
+		// could also just add this to mComplete but not sure what the
+		// side-effects would be, so ignoring to be safe.
+		LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+		if (cat)
+		{
+			continue;
+		}
+
 		// It's incomplete, so put it on the incomplete container, and
 		// pack this on the message.
 		mIncomplete.push_back(*it);
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 028440562d9..705b196ef11 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -1038,7 +1038,7 @@ void LLPanelPlaces::showAddedLandmarkInfo(const uuid_vec_t& items)
 		 ++item_iter)
 	{
 		const LLUUID& item_id = (*item_iter);
-		if(!highlight_offered_item(item_id))
+		if(!highlight_offered_object(item_id))
 		{
 			continue;
 		}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 3d107555bf7..d81fa5ee1cf 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -702,7 +702,7 @@ static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items,
 		++item_iter)
 	{
 		const LLUUID& item_id = (*item_iter);
-		if(!highlight_offered_item(item_id))
+		if(!highlight_offered_object(item_id))
 		{
 			continue;
 		}
@@ -753,6 +753,18 @@ class LLOpenAgentOffer : public LLInventoryFetchItemsObserver
 					 const std::string& from_name) : 
 		LLInventoryFetchItemsObserver(object_id),
 		mFromName(from_name) {}
+	/*virtual*/ void startFetch()
+	{
+		for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it)
+		{
+			LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+			if (cat)
+			{
+				mComplete.push_back((*it));
+			}
+		}
+		LLInventoryFetchItemsObserver::startFetch();
+	}
 	/*virtual*/ void done()
 	{
 		open_inventory_offer(mComplete, mFromName);
@@ -1065,111 +1077,119 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
 	}
 }
  
-void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name)
+void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name)
 {
-	for (uuid_vec_t::const_iterator item_iter = items.begin();
-		 item_iter != items.end();
-		 ++item_iter)
+	for (uuid_vec_t::const_iterator obj_iter = objects.begin();
+		 obj_iter != objects.end();
+		 ++obj_iter)
 	{
-		const LLUUID& item_id = (*item_iter);
-		if(!highlight_offered_item(item_id))
+		const LLUUID& obj_id = (*obj_iter);
+		if(!highlight_offered_object(obj_id))
 		{
 			continue;
 		}
 
-		LLInventoryItem* item = gInventory.getItem(item_id);
-		llassert(item);
-		if (!item) {
+		const LLInventoryObject *obj = gInventory.getObject(obj_id);
+		if (!obj)
+		{
+			llwarns << "Cannot find object [ itemID:" << obj_id << " ] to open." << llendl;
 			continue;
 		}
 
-		////////////////////////////////////////////////////////////////////////////////
-		// Special handling for various types.
-		const LLAssetType::EType asset_type = item->getActualType();
-		if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
-		{
-			LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID()  << LL_ENDL;
-			// If we opened this ourselves, focus it
-			const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
-			switch(asset_type)
+		const LLAssetType::EType asset_type = obj->getActualType();
+
+		// Either an inventory item or a category.
+		const LLInventoryItem* item = dynamic_cast<const LLInventoryItem*>(obj);
+		if (item)
+		{
+			////////////////////////////////////////////////////////////////////////////////
+			// Special handling for various types.
+			if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
 			{
-			  case LLAssetType::AT_NOTECARD:
-			  {
-				  LLFloaterReg::showInstance("preview_notecard", LLSD(item_id), take_focus);
-				  break;
-			  }
-			  case LLAssetType::AT_LANDMARK:
-			  	{
-					LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
-					if ("inventory_handler" == from_name)
+				LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID()  << LL_ENDL;
+				// If we opened this ourselves, focus it
+				const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
+				switch(asset_type)
+				{
+					case LLAssetType::AT_NOTECARD:
 					{
-						//we have to filter inventory_handler messages to avoid notification displaying
-						LLSideTray::getInstance()->showPanel("panel_places",
-								LLSD().with("type", "landmark").with("id", item->getUUID()));
+						LLFloaterReg::showInstance("preview_notecard", LLSD(obj_id), take_focus);
+						break;
 					}
-					else if("group_offer" == from_name)
+					case LLAssetType::AT_LANDMARK:
 					{
-						// "group_offer" is passed by LLOpenTaskGroupOffer
-						// Notification about added landmark will be generated under the "from_name.empty()" called from LLOpenTaskOffer::done().
-						LLSD args;
-						args["type"] = "landmark";
-						args["id"] = item_id;
-						LLSideTray::getInstance()->showPanel("panel_places", args);
-
-						continue;
+						LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
+						if ("inventory_handler" == from_name)
+						{
+							//we have to filter inventory_handler messages to avoid notification displaying
+							LLSideTray::getInstance()->showPanel("panel_places",
+																 LLSD().with("type", "landmark").with("id", item->getUUID()));
+						}
+						else if("group_offer" == from_name)
+						{
+							// "group_offer" is passed by LLOpenTaskGroupOffer
+							// Notification about added landmark will be generated under the "from_name.empty()" called from LLOpenTaskOffer::done().
+							LLSD args;
+							args["type"] = "landmark";
+							args["id"] = obj_id;
+							LLSideTray::getInstance()->showPanel("panel_places", args);
+
+							continue;
+						}
+						else if(from_name.empty())
+						{
+							// we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.
+							LLSD args;
+							args["LANDMARK_NAME"] = item->getName();
+							args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
+							LLNotificationsUtil::add("LandmarkCreated", args);
+						}
 					}
-					else if(from_name.empty())
+					break;
+					case LLAssetType::AT_TEXTURE:
 					{
-						// we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.
-						LLSD args;
-						args["LANDMARK_NAME"] = item->getName();
-						args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
-						LLNotificationsUtil::add("LandmarkCreated", args);
+						LLFloaterReg::showInstance("preview_texture", LLSD(obj_id), take_focus);
+						break;
 					}
+					case LLAssetType::AT_ANIMATION:
+						LLFloaterReg::showInstance("preview_anim", LLSD(obj_id), take_focus);
+						break;
+					case LLAssetType::AT_SCRIPT:
+						LLFloaterReg::showInstance("preview_script", LLSD(obj_id), take_focus);
+						break;
+					case LLAssetType::AT_SOUND:
+						LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);
+						break;
+					default:
+						break;
 				}
-				break;
-			  case LLAssetType::AT_TEXTURE:
-			  {
-				  LLFloaterReg::showInstance("preview_texture", LLSD(item_id), take_focus);
-				  break;
-			  }
-			  case LLAssetType::AT_ANIMATION:
-				  LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus);
-				  break;
-			  case LLAssetType::AT_SCRIPT:
-				  LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus);
-				  break;
-			  case LLAssetType::AT_SOUND:
-				  LLFloaterReg::showInstance("preview_sound", LLSD(item_id), take_focus);
-				  break;
-			  default:
-				break;
 			}
 		}
-		
+
 		////////////////////////////////////////////////////////////////////////////////
 		// Highlight item if it's not in the trash, lost+found, or COF
-		const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") &&
+		const BOOL auto_open = 
+			gSavedSettings.getBOOL("ShowInInventory") &&
 			(asset_type != LLAssetType::AT_CALLINGCARD) &&
-			(item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&
+			!(item && item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&
 			!from_name.empty();
 		LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
 		if(active_panel)
 		{
-			LL_DEBUGS("Messaging") << "Highlighting" << item_id  << LL_ENDL;
+			LL_DEBUGS("Messaging") << "Highlighting" << obj_id  << LL_ENDL;
 			LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
-			active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+			active_panel->setSelection(obj_id, TAKE_FOCUS_NO);
 			gFocusMgr.setKeyboardFocus(focus_ctrl);
 		}
 	}
 }
 
-bool highlight_offered_item(const LLUUID& item_id)
+bool highlight_offered_object(const LLUUID& obj_id)
 {
-	LLInventoryItem* item = gInventory.getItem(item_id);
-	if(!item)
+	const LLInventoryObject* obj = gInventory.getObject(obj_id);
+	if(!obj)
 	{
-		LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL;
+		LL_WARNS("Messaging") << "Unable to show inventory item: " << obj_id << LL_ENDL;
 		return false;
 	}
 
@@ -1178,7 +1198,7 @@ bool highlight_offered_item(const LLUUID& item_id)
 	// notification (e.g. trash, cof, lost-and-found).
 	if(!gAgent.getAFK())
 	{
-		const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id);
+		const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(obj_id);
 		if (parent)
 		{
 			const LLFolderType::EType parent_type = parent->getPreferredType();
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 72ad3c89260..eca253ee036 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -207,7 +207,7 @@ void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name)
 // Returns true if item is not in certain "quiet" folder which don't need UI
 // notification (e.g. trash, cof, lost-and-found) and agent is not AFK, false otherwise.
 // Returns false if item is not found.
-bool highlight_offered_item(const LLUUID& item_id);
+bool highlight_offered_object(const LLUUID& obj_id);
 
 void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
 
-- 
GitLab