From 9757cd64e19209484333ff8d07aa86fcccaf22f6 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Wed, 10 Mar 2010 14:04:36 +0200
Subject: fixed EXT-4872 'Loading...' message remains in ad-hoc IM floated
 opened by 'Start IM' button

added timing out of session initialization (after 30 seconds)

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp                     | 21 +++++++++++++++++++++
 indra/newview/llimview.h                       | 18 ++++++++++++++++++
 indra/newview/skins/default/xui/en/strings.xml |  3 +++
 3 files changed, 42 insertions(+)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 77e3012d26..1641e2a0e2 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -80,6 +80,9 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");
 const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
 const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
 
+/** Timeout of outgoing session initialization (in seconds) */
+const static U32 SESSION_INITIALIZATION_TIMEOUT = 30;
+
 std::string LLCallDialogManager::sPreviousSessionlName = "";
 LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
 std::string LLCallDialogManager::sCurrentSessionlName = "";
@@ -91,6 +94,19 @@ const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-141
 //
 LLIMMgr* gIMMgr = NULL;
 
+
+BOOL LLSessionTimeoutTimer::tick()
+{
+	if (mSessionId.isNull()) return TRUE;
+
+	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
+	if (session && !session->mSessionInitialized)
+	{
+		gIMMgr->showSessionStartError("session_initialization_timed_out_error", mSessionId);
+	}
+	return TRUE;
+}
+
 void toast_callback(const LLSD& msg){
 	// do not show toast in busy mode or it goes from agent
 	if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
@@ -214,6 +230,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 		//so we're already initialized
 		mSessionInitialized = true;
 	}
+	else
+	{
+		//tick returns TRUE - timer will be deleted after the tick
+		new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
+	}
 
 	if (IM_NOTHING_SPECIAL == type)
 	{
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index ad6cede727..8e53edaab0 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -34,6 +34,7 @@
 #define LL_LLIMVIEW_H
 
 #include "lldockablefloater.h"
+#include "lleventtimer.h"
 #include "llinstantmessage.h"
 
 #include "lllogchat.h"
@@ -45,7 +46,24 @@ class LLFriendObserver;
 class LLCallDialogManager;	
 class LLIMSpeakerMgr;
 
+/**
+ * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server
+ */
+class LLSessionTimeoutTimer : public LLEventTimer
+{
+public:
+	LLSessionTimeoutTimer(const LLUUID& session_id, F32 period) : LLEventTimer(period), mSessionId(session_id) {}
+	virtual ~LLSessionTimeoutTimer() {};
+	/* virtual */ BOOL tick();
+
+private:
+	LLUUID mSessionId;
+};
 
+
+/**
+ * Model (MVC) for IM Sessions
+ */
 class LLIMModel :  public LLSingleton<LLIMModel>
 {
 public:
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 39762d57fb..a7bca3955c 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3009,4 +3009,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="unread_chat_multiple">
     [SOURCES] have said something new
   </string>"
+	<string name="session_initialization_timed_out_error">
+		The session initialization is timed out
+	</string>
 </strings>
-- 
cgit v1.2.3


From 6efbbfa0805c337b3f7e476fd743a964bc68d09e Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Mon, 22 Mar 2010 15:35:34 +0200
Subject: fix for EXT-4288 Shrinking chat history window from top doesn't keep
 scroll thumb at bottom

--HG--
branch : product-engine
---
 indra/llui/lltextbase.cpp | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 851fb966ec..d7bbb8a56e 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -957,7 +957,18 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
 	if (width != getRect().getWidth() || height != getRect().getHeight())
 	{
+		//EXT-4288
+		//to keep consistance scrolling behaviour 
+		//when scrolling from top and from bottom...
+		bool is_scrolled_to_end = (mScroller!=NULL) && scrolledToEnd();
+		
 		LLUICtrl::reshape( width, height, called_from_parent );
+	
+		if (is_scrolled_to_end)
+		{
+			deselect();
+			endOfDoc();
+		}		
 
 		// do this first after reshape, because other things depend on
 		// up-to-date mVisibleTextRect
-- 
cgit v1.2.3


From 5e0de9609d7a18af31241565f3a56ac906612fcb Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Mon, 22 Mar 2010 15:37:22 +0200
Subject: fix for EXT-3868 Edit Window: Group name shown when no object is
 selected

--HG--
branch : product-engine
---
 indra/newview/llpanelpermissions.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 01b6e8ffad..71d16a08b4 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -195,8 +195,8 @@ void LLPanelPermissions::disableAll()
 	childSetEnabled("Owner Name",						FALSE);
 
 	childSetEnabled("Group:",							FALSE);
-	childSetText("Group Name",							LLStringUtil::null);
-	childSetEnabled("Group Name",						FALSE);
+	childSetText("Group Name Proxy",					LLStringUtil::null);
+	childSetEnabled("Group Name Proxy",					FALSE);
 	childSetEnabled("button set group",					FALSE);
 
 	childSetText("Object Name",							LLStringUtil::null);
-- 
cgit v1.2.3


From 858d1e9ad00db909be54112dbffc1c709dd7ba2e Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Mon, 22 Mar 2010 17:02:44 +0200
Subject: fixed EXT-6476 (waiting).txt chat log file with "(waiting)" instead
 of avatar name gets created when Offering Teleport from Search Floater

offer teleport action is put on hold until Name Cache gets updated with appropriate avatar name

--HG--
branch : product-engine
---
 indra/newview/llavataractions.cpp | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index e6666c7f83..cb518f0ad6 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -161,6 +161,14 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)
 	if (invitee.isNull())
 		return;
 
+	//waiting until Name Cache gets updated with corresponding avatar name
+	std::string just_to_request_name;
+	if (!gCacheName->getFullName(invitee, just_to_request_name))
+	{
+		gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee));
+		return;
+	}
+
 	LLDynamicArray<LLUUID> ids;
 	ids.push_back(invitee);
 	offerTeleport(ids);
-- 
cgit v1.2.3


From bcf959f97cbec3f394bd1ca8f07fb742d09b0614 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Mon, 22 Mar 2010 17:04:58 +0200
Subject: fixed EXT-6474  crash in Search Floater, people tab, on offering
 teleport (when viewer is disconnected, timed out)

added defensive check for non null region

--HG--
branch : product-engine
---
 indra/newview/llviewermessage.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 5f7b19a5cb..af0af9cd0e 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5511,6 +5511,10 @@ void handle_lure(const LLUUID& invitee)
 // Prompt for a message to the invited user.
 void handle_lure(const std::vector<LLUUID>& ids)
 {
+	if (ids.empty()) return;
+
+	if (!gAgent.getRegion()) return;
+
 	LLSD edit_args;
 	edit_args["REGION"] = gAgent.getRegion()->getName();
 
-- 
cgit v1.2.3


From 9ff6b6ecd123d3fcd71e189094cc9cb99eca9724 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Thu, 25 Mar 2010 15:48:08 +0200
Subject: Fixed low bug EXT-6444 - Long notecard titles continue under Locked
 and Help icons on title bar. Changed the way floater title is reshaped.
 Calculations takes title buttons into account instead of using hardcoded
 values.

--HG--
branch : product-engine
---
 indra/llui/lldraghandle.cpp         |  7 +++----
 indra/llui/lldraghandle.h           |  3 +++
 indra/llui/llfloater.cpp            | 40 ++++++++++++++++++++++++-------------
 indra/llui/llfloater.h              |  3 ++-
 indra/newview/llpreviewnotecard.cpp | 15 ++++++++++++++
 indra/newview/llpreviewnotecard.h   |  1 +
 6 files changed, 50 insertions(+), 19 deletions(-)

diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 832f148902..9d4e2fa495 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -248,15 +248,14 @@ void LLDragHandleTop::reshapeTitleBox()
 		return;
 	}
 	const LLFontGL* font = LLFontGL::getFontSansSerif();
-	S32 title_width = font->getWidth( mTitleBox->getText() ) + TITLE_HPAD;
-	if (getMaxTitleWidth() > 0)
-		title_width = llmin(title_width, getMaxTitleWidth());
+	S32 title_width = getRect().getWidth();
+	title_width -= 2 * LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth();
 	S32 title_height = llround(font->getLineHeight());
 	LLRect title_rect;
 	title_rect.setLeftTopAndSize( 
 		LEFT_PAD, 
 		getRect().getHeight() - title_vpad,
-		getRect().getWidth() - LEFT_PAD - RIGHT_PAD,
+		title_width,
 		title_height);
 
 	// calls reshape on mTitleBox
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index dc5410787b..825bc9303e 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -71,6 +71,8 @@ public:
 	BOOL			getForeground() const		{ return mForeground; }
 	void			setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }
 	S32				getMaxTitleWidth() const { return mMaxTitleWidth; }
+	void			setButtonsRect(const LLRect& rect){ mButtonsRect = rect; }
+	LLRect			getButtonsRect() { return mButtonsRect; }
 	void			setTitleVisible(BOOL visible);
 
 	virtual void	setTitle( const std::string& title ) = 0;
@@ -88,6 +90,7 @@ protected:
 	LLTextBox*		mTitleBox;
 	
 private:
+	LLRect			mButtonsRect;
 	S32				mDragLastScreenX;
 	S32				mDragLastScreenY;
 	S32				mLastMouseScreenX;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 104ae19eda..e672252a50 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -346,7 +346,7 @@ void LLFloater::layoutDragHandle()
 		rect = getLocalRect();
 	}
 	mDragHandle->setRect(rect);
-	updateButtons();
+	updateTitleButtons();
 	applyTitle();
 }
 
@@ -1061,11 +1061,10 @@ void LLFloater::setMinimized(BOOL minimize)
 		// Reshape *after* setting mMinimized
 		reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
 	}
-	
-	applyTitle ();
 
 	make_ui_sound("UISndWindowClose");
-	updateButtons();
+	updateTitleButtons();
+	applyTitle ();
 }
 
 void LLFloater::setFocus( BOOL b )
@@ -1191,7 +1190,7 @@ void LLFloater::setHost(LLMultiFloater* host)
 		mButtonScale = 1.f;
 		//mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE;
 	}
-	updateButtons();
+	updateTitleButtons();
 	if (host)
 	{
 		mHostHandle = host->getHandle();
@@ -1390,7 +1389,7 @@ void LLFloater::setCanDock(bool b)
 			mButtonsEnabled[BUTTON_DOCK] = FALSE;
 		}
 	}
-	updateButtons();
+	updateTitleButtons();
 }
 
 void LLFloater::setDocked(bool docked, bool pop_on_undock)
@@ -1399,7 +1398,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
 	{
 		mDocked = docked;
 		mButtonsEnabled[BUTTON_DOCK] = !mDocked;
-		updateButtons();
+		updateTitleButtons();
 
 		storeDockStateControl();
 	}
@@ -1452,7 +1451,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
 		}
 		self->setTornOff(false);
 	}
-	self->updateButtons();
+	self->updateTitleButtons();
 }
 
 // static
@@ -1692,7 +1691,7 @@ void	LLFloater::setCanMinimize(BOOL can_minimize)
 	mButtonsEnabled[BUTTON_MINIMIZE] = can_minimize && !isMinimized();
 	mButtonsEnabled[BUTTON_RESTORE]  = can_minimize &&  isMinimized();
 
-	updateButtons();
+	updateTitleButtons();
 }
 
 void	LLFloater::setCanClose(BOOL can_close)
@@ -1700,7 +1699,7 @@ void	LLFloater::setCanClose(BOOL can_close)
 	mCanClose = can_close;
 	mButtonsEnabled[BUTTON_CLOSE] = can_close;
 
-	updateButtons();
+	updateTitleButtons();
 }
 
 void	LLFloater::setCanTearOff(BOOL can_tear_off)
@@ -1708,7 +1707,7 @@ void	LLFloater::setCanTearOff(BOOL can_tear_off)
 	mCanTearOff = can_tear_off;
 	mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead();
 
-	updateButtons();
+	updateTitleButtons();
 }
 
 
@@ -1732,10 +1731,11 @@ void LLFloater::setCanDrag(BOOL can_drag)
 	}
 }
 
-void LLFloater::updateButtons()
+void LLFloater::updateTitleButtons()
 {
 	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
 	static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0);
+	LLRect buttons_rect;
 	S32 button_count = 0;
 	for (S32 i = 0; i < BUTTON_COUNT; i++)
 	{
@@ -1786,6 +1786,15 @@ void LLFloater::updateButtons()
 					llround((F32)floater_close_box_size * mButtonScale));
 			}
 
+			if(!buttons_rect.isValid())
+			{
+				buttons_rect = btn_rect;
+			}
+			else
+			{
+				mDragOnLeft ? buttons_rect.mRight + btn_rect.mRight : 
+					buttons_rect.mLeft = btn_rect.mLeft;
+			}
 			mButtons[i]->setRect(btn_rect);
 			mButtons[i]->setVisible(TRUE);
 			// the restore button should have a tab stop so that it takes action when you Ctrl-Tab to a minimized floater
@@ -1797,7 +1806,10 @@ void LLFloater::updateButtons()
 		}
 	}
 	if (mDragHandle)
-		mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));
+	{
+		localRectToOtherView(buttons_rect, &buttons_rect, mDragHandle);
+		mDragHandle->setButtonsRect(buttons_rect);
+	}
 }
 
 void LLFloater::buildButtons(const Params& floater_params)
@@ -1854,7 +1866,7 @@ void LLFloater::buildButtons(const Params& floater_params)
 		mButtons[i] = buttonp;
 	}
 
-	updateButtons();
+	updateTitleButtons();
 }
 
 // static
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index d8c77370f6..403723d9d8 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -311,11 +311,12 @@ protected:
 
 	virtual	void	onClickCloseBtn();
 
+	virtual void	updateTitleButtons();
+
 private:
 	void			setForeground(BOOL b);	// called only by floaterview
 	void			cleanupHandles(); // remove handles to dead floaters
 	void			createMinimizeButton();
-	void			updateButtons();
 	void			buildButtons(const Params& p);
 	
 	// Images and tooltips are named in the XML, but we want to look them
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ee8e3f1db6..bfd9a840f2 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -38,6 +38,7 @@
 
 #include "llagent.h"
 #include "llassetuploadresponders.h"
+#include "lldraghandle.h"
 #include "llviewerwindow.h"
 #include "llbutton.h"
 #include "llfloaterreg.h"
@@ -188,6 +189,20 @@ void LLPreviewNotecard::refreshFromInventory(const LLUUID& new_item_id)
 	loadAsset();
 }
 
+void LLPreviewNotecard::updateTitleButtons()
+{
+	LLPreview::updateTitleButtons();
+
+	LLUICtrl* lock_btn = getChild<LLUICtrl>("lock");
+	if(lock_btn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized.
+	{
+		LLRect lock_rc = lock_btn->getRect();
+		LLRect buttons_rect = getDragHandle()->getButtonsRect();
+		buttons_rect.mLeft = lock_rc.mLeft;
+		getDragHandle()->setButtonsRect(buttons_rect);
+	}
+}
+
 void LLPreviewNotecard::loadAsset()
 {
 	// request the asset.
diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h
index 5b8cf1c2f6..e0363eef54 100644
--- a/indra/newview/llpreviewnotecard.h
+++ b/indra/newview/llpreviewnotecard.h
@@ -79,6 +79,7 @@ public:
 
 protected:
 
+	void updateTitleButtons();
 	virtual void loadAsset();
 	bool saveIfNeeded(LLInventoryItem* copyitem = NULL);
 
-- 
cgit v1.2.3


From c5c72899f3f9e203474d8635aa05e154ee14add9 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Tue, 23 Mar 2010 10:10:15 +0200
Subject: Fixed normal subtask EXT-6441 - Do not show "friendship accepted"
 toast if respective IM window is open and in focus. Minor changes to supress
 toast for FriendshipAccepted notification.

--HG--
branch : product-engine
---
 indra/newview/llnotificationhandler.h        | 17 +++++++--
 indra/newview/llnotificationhandlerutil.cpp  | 54 ++++++++++++++++++++++------
 indra/newview/llnotificationofferhandler.cpp |  6 +---
 3 files changed, 60 insertions(+), 17 deletions(-)

diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 1dc0e414a2..99a1fedcf3 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -42,6 +42,8 @@
 #include "llinstantmessage.h"
 #include "llnotificationptr.h"
 
+class LLIMFloater;
+
 namespace LLNotificationsUI
 {
 // ENotificationType enumerates all possible types of notifications that could be met
@@ -304,8 +306,6 @@ public:
 
 	/**
 	 * Checks if passed notification can create toast.
-	 *
-	 * It returns false only for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
 	 */
 	static bool canSpawnToast(const LLNotificationPtr& notification);
 
@@ -314,6 +314,11 @@ public:
 	 */
 	static bool isIMFloaterOpened(const LLNotificationPtr& notification);
 
+	/**
+	* Determines whether IM floater is focused.
+	*/
+	static bool isIMFloaterFocused(const LLNotificationPtr& notification);
+
 	/**
 	 * Writes notification message to IM session.
 	 */
@@ -375,6 +380,14 @@ public:
 	 * Decrements counter of IM messages.
 	 */
 	static void decIMMesageCounter(const LLNotificationPtr& notification);
+
+private:
+
+	/**
+	 * Find IM floater based on "from_id"
+	 */
+	static LLIMFloater* findIMFloater(const LLNotificationPtr& notification);
+
 };
 
 }
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index d3ad61128d..24cffd222b 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -193,10 +193,36 @@ bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notificat
 // static
 bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)
 {
-	bool cannot_spawn = isIMFloaterOpened(notification) && (INVENTORY_DECLINED == notification->getName()
-			|| INVENTORY_ACCEPTED == notification->getName());
-	
-	return !cannot_spawn;
+	if(INVENTORY_DECLINED == notification->getName() 
+		|| INVENTORY_ACCEPTED == notification->getName())
+	{
+		// return false for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
+		return ! isIMFloaterOpened(notification);
+	}
+
+	if(FRIENDSHIP_ACCEPTED == notification->getName())
+	{
+		// don't show FRIENDSHIP_ACCEPTED if IM window is opened and focused - EXT-6441
+		return ! isIMFloaterFocused(notification);
+	}
+
+	if(OFFER_FRIENDSHIP == notification->getName()
+		|| USER_GIVE_ITEM == notification->getName()
+		|| TELEPORT_OFFERED == notification->getName())
+	{
+		// When ANY offer arrives, show toast, unless IM window is already open - EXT-5904
+		return ! isIMFloaterOpened(notification);
+	}
+
+	return true;
+}
+
+// static
+LLIMFloater* LLHandlerUtil::findIMFloater(const LLNotificationPtr& notification)
+{
+	LLUUID from_id = notification->getPayload()["from_id"];
+	LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
+	return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
 }
 
 // static
@@ -204,12 +230,7 @@ bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
 {
 	bool res = false;
 
-	LLUUID from_id = notification->getPayload()["from_id"];
-	LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
-			from_id);
-
-	LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
-					"impanel", session_id);
+	LLIMFloater* im_floater = findIMFloater(notification);
 	if (im_floater != NULL)
 	{
 		res = im_floater->getVisible() == TRUE;
@@ -218,6 +239,19 @@ bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
 	return res;
 }
 
+bool LLHandlerUtil::isIMFloaterFocused(const LLNotificationPtr& notification)
+{
+	bool res = false;
+
+	LLIMFloater* im_floater = findIMFloater(notification);
+	if (im_floater != NULL)
+	{
+		res = im_floater->hasFocus() == TRUE;
+	}
+
+	return res;
+}
+
 // static
 void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
 		const std::string& session_name, const std::string& from_name,
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index e93aec9d01..c5960a9040 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -115,15 +115,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 				session_id = LLHandlerUtil::spawnIMSession(name, from_id);
 			}
 
-			bool show_toast = true;
+			bool show_toast = LLHandlerUtil::canSpawnToast(notification);
 			bool add_notid_to_im = LLHandlerUtil::canAddNotifPanelToIM(notification);
 			if (add_notid_to_im)
 			{
 				LLHandlerUtil::addNotifPanelToIM(notification);
-				if (LLHandlerUtil::isIMFloaterOpened(notification))
-				{
-					show_toast = false;
-				}
 			}
 
 			if (notification->getPayload().has("SUPPRESS_TOAST")
-- 
cgit v1.2.3


From dc3c0c601693b9f4e35739a48af2c4bf0bffaeb8 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Tue, 23 Mar 2010 12:09:57 +0200
Subject: Fixed normal bug EXT-6436 - Not showing all classifieds in Profile
 sidebar. Updated code to be able to receive classifieds list in two or more
 packets.

---
 indra/newview/llpanelpicks.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 0a7c39db46..4ac57bc7a4 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -288,7 +288,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
 		LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
 		if(c_info && getAvatarId() == c_info->target_id)
 		{
-			mClassifiedsList->clear();
+			// do not clear classified list in case we will receive two or more data packets.
+			// list has been cleared in updateData(). (fix for EXT-6436)
 
 			LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();
 			for(; c_info->classifieds_list.end() != it; ++it)
-- 
cgit v1.2.3


From eb119c2268798b4c64fb437806199ee7ae509217 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Tue, 23 Mar 2010 14:09:38 +0200
Subject: Fixed low bug EXT-4081 (Lag Meter: Ctrl+W does not close floater)

- Set 'Close' text of tooltip instead of 'Close (Ctrl+W)' for close button of chrome floaters

Reviewed by Mike Antipov

--HG--
branch : product-engine
---
 indra/llui/llfloater.cpp                       | 12 ++++++++++--
 indra/llui/llfloater.h                         |  8 +++++++-
 indra/newview/skins/default/xui/en/strings.xml |  1 +
 3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 33895ac22a..966bd2e85d 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1121,6 +1121,7 @@ void LLFloater::setIsChrome(BOOL is_chrome)
 		setFocus(FALSE);
 		// can't Ctrl-Tab to "chrome" floaters
 		setFocusRoot(FALSE);
+		mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
 	}
 	
 	// no titles displayed on "chrome" floaters
@@ -1845,7 +1846,7 @@ void LLFloater::buildButtons(const Params& floater_params)
 		p.click_callback.function(boost::bind(sButtonCallbacks[i], this));
 		p.tab_stop(false);
 		p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
-		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);
+		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i, getIsChrome());
 		p.scale_image(true);
 		p.chrome(true);
 
@@ -1900,8 +1901,15 @@ LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)
 }
 
 // static
-std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e)
+std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome)
 {
+	// EXT-4081 (Lag Meter: Ctrl+W does not close floater)
+	// If floater is chrome set 'Close' text for close button's tooltip
+	if(is_chrome && BUTTON_CLOSE == e)
+	{
+		static std::string close_tooltip_chrome = LLTrans::getString("BUTTON_CLOSE_CHROME");
+		return close_tooltip_chrome;
+	}
 	// TODO: per-floater localizable tooltips set in XML
 	return sButtonToolTips[e];
 }
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 97d2bda594..d8c77370f6 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -322,8 +322,14 @@ private:
 	// up by index.
 	static LLUIImage*	getButtonImage(const Params& p, EFloaterButton e);
 	static LLUIImage*	getButtonPressedImage(const Params& p, EFloaterButton e);
-	static std::string	getButtonTooltip(const Params& p, EFloaterButton e);
 	
+	/**
+	 * @params is_chrome - if floater is Chrome it means that floater will never get focus.
+	 * Therefore it can't be closed with 'Ctrl+W'. So the tooltip text of close button( X )
+	 * should be 'Close' not 'Close(Ctrl+W)' as for usual floaters.
+	 */
+	static std::string	getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome);
+
 	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
 	void			addResizeCtrls();
 	void			layoutResizeCtrls();
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index c0573c0215..1df3e21de3 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -98,6 +98,7 @@
 	<!-- ButtonToolTips, llfloater.cpp -->
 	<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
 	<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
+	<string name="BUTTON_CLOSE_CHROME">Close</string>>
 	<string name="BUTTON_RESTORE">Restore</string>
 	<string name="BUTTON_MINIMIZE">Minimize</string>
 	<string name="BUTTON_TEAR_OFF">Tear Off</string>
-- 
cgit v1.2.3


From 60d680f2eb92e5dbf2ba287f7e4e2e36e1d024e9 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Tue, 23 Mar 2010 16:13:59 +0200
Subject: fixed EXT-4753 Just arrived avatars aren't sorted by name in VCP

added requesting a list to resort when avatar list item gets updated with avatar name from the name cache

--HG--
branch : product-engine
---
 indra/llui/llflatlistview.h        |  5 ++++-
 indra/newview/llavatarlist.cpp     | 11 +++++++++++
 indra/newview/llavatarlist.h       |  2 ++
 indra/newview/llavatarlistitem.cpp |  6 +++++-
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 92cb40332e..5a1ddc2c59 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -379,11 +379,14 @@ private:
 
 	void setNoItemsCommentVisible(bool visible) const;
 
-private:
+protected:
 
 	/** Comparator to use when sorting the list. */
 	const ItemComparator* mItemComparator;
 
+
+private:
+
 	LLPanel* mItemsPanel;
 
 	S32 mItemsNoScrollWidth;
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 45c540b3a3..91ebe910ce 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -334,6 +334,17 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse
 	return mItemDoubleClickSignal.connect(cb);
 }
 
+//virtual
+S32 LLAvatarList::notifyParent(const LLSD& info)
+{
+	if (info.has("sort") && &NAME_COMPARATOR == mItemComparator)
+	{
+		sort();
+		return 1;
+	}
+	return LLFlatListView::notifyParent(info);
+}
+
 void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
 	LLAvatarListItem* item = new LLAvatarListItem();
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 00c72f1f9d..b9be1d0bdc 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -96,6 +96,8 @@ public:
 
 	boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
 
+	virtual S32 notifyParent(const LLSD& info);
+
 protected:
 	void refresh();
 
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 9645e75e60..44f88cce29 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -119,8 +119,9 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info)
 	if (info.has("visibility_changed"))
 	{
 		updateChildren();
+		return 1;
 	}
-	return 0;
+	return LLPanel::notifyParent(info);
 }
 
 void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
@@ -334,6 +335,9 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
 {
 	std::string name = first_name + " " + last_name;
 	setName(name);
+
+	//requesting the list to resort
+	notifyParent(LLSD().with("sort", LLSD()));
 }
 
 // Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
-- 
cgit v1.2.3


From c008004e1806464982ec2f0d4b31d2cf9c094115 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Tue, 23 Mar 2010 20:34:12 +0200
Subject: Fixed low bug (Menu bar background + Master Volume control display in
 Mouselook mode) - removed overlaping of master volume and nearby media icons
 in mouselook mode

--HG--
branch : product-engine
---
 indra/newview/llstatusbar.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 9206b4a43a..4198f047d4 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -371,6 +371,8 @@ void LLStatusBar::setVisibleForMouselook(bool visible)
 	mTextTime->setVisible(visible);
 	getChild<LLUICtrl>("buycurrency")->setVisible(visible);
 	getChild<LLUICtrl>("buyL")->setVisible(visible);
+	mBtnVolume->setVisible(visible);
+	mMediaToggle->setVisible(visible);
 	mSGBandwidth->setVisible(visible);
 	mSGPacketLoss->setVisible(visible);
 	setBackgroundVisible(visible);
-- 
cgit v1.2.3


From 2768663081b27c39202f292ca53d98c381419e12 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Tue, 23 Mar 2010 20:34:12 +0200
Subject: Related to normal bug EXT-5715(Conversations window auto-resizes when
 new conversation starts.) - disabled auto-resizing of well window if it was
 reshaped by user.

--HG--
branch : product-engine
---
 indra/newview/llsyswellwindow.cpp | 12 ++++++++++--
 indra/newview/llsyswellwindow.h   |  3 ++-
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 66373feb93..cbb030836e 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -58,7 +58,8 @@ LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(N
 													mSysWellChiclet(NULL),
 													mSeparator(NULL),
 													NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"),
-													IM_WELL_ANCHOR_NAME("im_well_panel")
+													IM_WELL_ANCHOR_NAME("im_well_panel"),
+													mIsReshapedByUser(false)
 
 {
 	mTypedItemsCount[IT_NOTIFICATION] = 0;
@@ -99,6 +100,13 @@ void LLSysWellWindow::setMinimized(BOOL minimize)
 	LLTransientDockableFloater::setMinimized(minimize);
 }
 
+//---------------------------------------------------------------------------------
+void LLSysWellWindow::handleReshape(const LLRect& rect, bool by_user)
+{
+	mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user
+	LLTransientDockableFloater::handleReshape(rect, by_user);
+}
+
 //---------------------------------------------------------------------------------
 void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)
 {
@@ -211,7 +219,7 @@ void LLSysWellWindow::reshapeWindow()
 	// it includes height from floater top to list top and from floater bottom and list bottom
 	static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
 
-	if (isDocked()) // Don't reshape undocked Well window. See EXT-5715.
+	if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715.
 	{
 		S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth();
 
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 3790aa3ea9..296bdf7482 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -70,6 +70,7 @@ public:
 	/*virtual*/ void	setDocked(bool docked, bool pop_on_undock = true);
 	// override LLFloater's minimization according to EXT-1216
 	/*virtual*/ void	setMinimized(BOOL minimize);
+	/*virtual*/ void	handleReshape(const LLRect& rect, bool by_user);
 
 	void onStartUpToastClick(S32 x, S32 y, MASK mask);
 
@@ -121,7 +122,7 @@ protected:
 
 	typedef std::map<EItemType, S32> typed_items_count_t;
 	typed_items_count_t mTypedItemsCount;
-
+	bool mIsReshapedByUser;
 };
 
 /**
-- 
cgit v1.2.3


From ae9e68f251033f8ed0b40163f778d8f4460634d3 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Tue, 23 Mar 2010 21:33:09 +0200
Subject: Fixed normal bug (EXT-6340) Crash when attempting to
 getChild<LLAccordionCtrlTab>("accordion_tab_name") and "accordion_tab_name"
 is not found. - Added NULL pointer checks.

--HG--
branch : product-engine
---
 indra/llui/llaccordionctrltab.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 1067c3f1d5..0247935a7c 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -465,10 +465,11 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value)
 	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
 };
 
-//vurtual
+//virtual
 BOOL LLAccordionCtrlTab::postBuild()
 {
-	mHeader->setVisible(mHeaderVisible);
+	if(mHeader)
+		mHeader->setVisible(mHeaderVisible);
 	
 	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
 
@@ -504,7 +505,8 @@ BOOL LLAccordionCtrlTab::postBuild()
 		mScrollbar->setVisible(false);
 	}
 
-	mContainerPanel->setVisible(mDisplayChildren);
+	if(mContainerPanel)
+		mContainerPanel->setVisible(mDisplayChildren);
 
 	return LLUICtrl::postBuild();
 }
-- 
cgit v1.2.3


From f99fae683736961ceda866c7778ad96ab559f496 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Tue, 23 Mar 2010 21:36:27 +0200
Subject: Fixed normal bug (EXT-5690) "delete" button is enabled for landmarks
 from trash - Added check for landmarks already in trash to disable "delete"
 button for them.

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarks.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 879fbba9cd..be460e8e5c 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -1072,7 +1072,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
 		}
 		else if ("delete" == command_name)
 		{
-			can_be_modified = listenerp ? listenerp->isItemRemovable() : false;
+			can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false;
 		}
 		else if("paste" == command_name)
 		{
-- 
cgit v1.2.3


From c4a1e10a8d29b95f925b64fccefdbeaf292c99dd Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Wed, 24 Mar 2010 15:06:40 +0200
Subject: fixed EXT-6458 Recent speakers not sorting properly with Group Voice

switched nearby people panel to use active speaker manager instead of local/nearby speaker manager only

reviewed by Mike at https://codereview.productengine.com/secondlife/r/88/

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 03e8ab644e..2025bd52dc 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -178,8 +178,8 @@ public:
 protected:
 	virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
 	{
-		LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
-		LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
+		LLPointer<LLSpeaker> lhs = LLActiveSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
+		LLPointer<LLSpeaker> rhs = LLActiveSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
 		if ( lhs.notNull() && rhs.notNull() )
 		{
 			// Compare by last speaking time
@@ -708,7 +708,7 @@ void LLPanelPeople::updateNearbyList()
 	mNearbyList->setDirty();
 
 	DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
-	LLLocalSpeakerMgr::instance().update(TRUE);
+	LLActiveSpeakerMgr::instance().update(TRUE);
 }
 
 void LLPanelPeople::updateRecentList()
-- 
cgit v1.2.3


From c0ea363c86a1a2182754b201622bc78bdbea787e Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Wed, 24 Mar 2010 15:43:02 +0200
Subject: Normal bug (EXT-6511) "Rename" item is enabled for multiple landmarks
 - Fixed check to enable/disable "Rename" menu item if multiple items are
 selected.

Reviewed by Leyla Farazha and Mike Antipov
https://codereview.productengine.com/secondlife/r/85/

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarks.cpp | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index be460e8e5c..220ea2813d 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -922,7 +922,6 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
 		return false;
 	}
 	else if (  "paste"		== command_name
-			|| "rename"		== command_name
 			|| "cut"		== command_name
 			|| "copy"		== command_name
 			|| "delete"		== command_name
@@ -934,16 +933,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
 	}
 	else if (  "teleport"		== command_name
 			|| "more_info"		== command_name
-			|| "rename"			== command_name
 			|| "show_on_map"	== command_name
 			|| "copy_slurl"		== command_name
 			)
 	{
 		// disable some commands for multi-selection. EXT-1757
-		if (root_folder_view->getSelectedCount() > 1)
-		{
-			return false;
-		}
+		return root_folder_view->getSelectedCount() == 1;
+	}
+	else if ("rename" == command_name)
+	{
+		return root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);
 	}
 	else if("category" == command_name)
 	{
-- 
cgit v1.2.3


From 5f46430a1aa16212838dd7a9493a42fcb5e92ec3 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Wed, 24 Mar 2010 15:47:37 +0200
Subject: Normal task (EXT-6251) [HARD CODED]? Side bar: Landmarks > + button >
 Create Landmark > Landmark location dropdown > Landmarks/Japanese - Fixed
 translating category name in Landmark location dropdown list for cases when
 localized name is a part of folder's full name.

Reviewed by Mike Antipov https://codereview.productengine.com/secondlife/r/32/

--HG--
branch : product-engine
---
 indra/newview/llpanellandmarkinfo.cpp | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 143a64d08b..a60c69f169 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -396,17 +396,20 @@ std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCatego
 				if (is_under_root_category || cat->getParentUUID() == gInventory.getRootFolderID())
 				{
 					std::string localized_name;
+
+					// Looking for translation only for protected type categories
+					// to avoid warnings about non existent string in strings.xml.
+					bool is_protected_type = LLFolderType::lookupIsProtectedType(cat->getPreferredType());
+
 					if (is_under_root_category)
 					{
 						// translate category name, if it's right below the root
-						// FIXME: it can throw notification about non existent string in strings.xml
-						bool is_found = LLTrans::findString(localized_name, "InvFolder " + name);
+						bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + name);
 						name = is_found ? localized_name : name;
 					}
 					else
 					{
-						// FIXME: it can throw notification about non existent string in strings.xml
-						bool is_found = LLTrans::findString(localized_name, "InvFolder " + cat->getName());
+						bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + cat->getName());
 
 						// add translated category name to folder's full name
 						name = (is_found ? localized_name : cat->getName()) + "/" + name;
-- 
cgit v1.2.3


From 7fa6e0ad6c7a916b45ca1ff7f6603ca2a5726a97 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Wed, 24 Mar 2010 21:03:50 +0200
Subject: Fixed normal bug EXT-5840 (Search floater auto-closes on telelport) -
 removed the closing of search floater at teleportation request. Reviewed by
 Leyla Farazha at https://codereview.productengine.com/secondlife/r/94/

--HG--
branch : product-engine
---
 indra/newview/llagent.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index c5d7f6f118..67126a999f 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -5969,9 +5969,9 @@ bool LLAgent::teleportCore(bool is_local)
 	// yet if the teleport will succeed.  Look in 
 	// process_teleport_location_reply
 
-	// close the map and find panels so we can see our destination
+	// close the map panel so we can see our destination.
+	// we don't close search floater, see EXT-5840.
 	LLFloaterReg::hideInstance("world_map");
-	LLFloaterReg::hideInstance("search");
 
 	// hide land floater too - it'll be out of date
 	LLFloaterReg::hideInstance("about_land");
-- 
cgit v1.2.3


From d5d9668a59895874951fb3e5927ea0159270a6e8 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Thu, 25 Mar 2010 09:04:01 +0200
Subject: Fixed low bug EXT-6488 (Teleport menuitem is enabled for offline
 residents in the context menu and inspectors)

- Added a check for a teleport offer ability. In XML created a paremeter and check it in source code.

Reviewed by Leyla Farazha at https://codereview.productengine.com/secondlife/r/86/

--HG--
branch : product-engine
---
 indra/newview/llavataractions.cpp                          | 14 ++++++++++++++
 indra/newview/llavataractions.h                            |  6 ++++++
 indra/newview/llinspectavatar.cpp                          |  7 +++++++
 indra/newview/llpanelpeoplemenus.cpp                       |  5 +++++
 .../skins/default/xui/en/menu_inspect_avatar_gear.xml      |  2 ++
 indra/newview/skins/default/xui/en/menu_people_nearby.xml  |  3 +++
 6 files changed, 37 insertions(+)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index cb518f0ad6..699916b0d6 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -442,6 +442,20 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
 		LLMuteList::getInstance()->add(mute);
 	}
 }
+// static
+bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
+{
+	// First use LLAvatarTracker::isBuddy()
+	// If LLAvatarTracker::instance().isBuddyOnline function only is used
+	// then for avatars that are online and not a friend it will return false.
+	// But we should give an ability to offer a teleport for such avatars.
+	if(LLAvatarTracker::instance().isBuddy(id))
+	{
+		return LLAvatarTracker::instance().isBuddyOnline(id);
+	}
+
+	return true;
+}
 
 void LLAvatarActions::inviteToGroup(const LLUUID& id)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index a7f3acad4f..9adf6efec7 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -171,6 +171,12 @@ public:
 	 */	
 	static void csr(const LLUUID& id, std::string name);
 
+	/**
+	 * Checks whether can offer teleport to the avatar
+	 * Can't offer only for offline friends
+	 */
+	static bool canOfferTeleport(const LLUUID& id);
+
 	
 private:
 	static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 35cb9b3468..94ea236757 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -137,6 +137,7 @@ private:
 	void onVolumeChange(const LLSD& data);
 	bool enableMute();
 	bool enableUnmute();
+	bool enableTeleportOffer();
 
 	// Is used to determine if "Add friend" option should be enabled in gear menu
 	bool isNotFriend();
@@ -235,6 +236,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
 		boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
 	mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
 	mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
+	mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
 	mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
 	mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
 
@@ -764,6 +766,11 @@ bool LLInspectAvatar::enableUnmute()
 		}
 }
 
+bool LLInspectAvatar::enableTeleportOffer()
+{
+	return LLAvatarActions::canOfferTeleport(mAvatarID);
+}
+
 //////////////////////////////////////////////////////////////////////////////
 // LLInspectAvatarUtil
 //////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 854651cd01..313ed4b70e 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -226,6 +226,11 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 		return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id))
 					|| gAgent.isGodlike();
 	}
+	else if(item == std::string("can_offer_teleport"))
+	{
+		const LLUUID& id = mUUIDs.front();
+		return LLAvatarActions::canOfferTeleport(id);
+	}
 	return false;
 }
 
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 1b002b1c32..a5ac5f76e1 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -40,6 +40,8 @@
    name="teleport">
     <menu_item_call.on_click
      function="InspectAvatar.Teleport"/>
+    <menu_item_call.on_enable
+     function="InspectAvatar.Gear.EnableTeleportOffer"/>
   </menu_item_call>
   <menu_item_call
    label="Invite to Group"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 014a52bb4f..d2e35e4cc0 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -88,5 +88,8 @@
     name="teleport">
       <menu_item_call.on_click
        function="Avatar.OfferTeleport"/>
+      <menu_item_call.on_enable
+      function="Avatar.EnableItem"
+      parameter="can_offer_teleport"/>
     </menu_item_call>
 </context_menu>
-- 
cgit v1.2.3


From 0f32c14cab77717dab75b8d91302104e8f168ceb Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Thu, 25 Mar 2010 12:06:39 +0200
Subject: Fixed normal bug EXT-6324 (View - View Object - should have "press
 ESC to return to World View" message) - added showing the "press ESC to
 return to World View" when viewer is in free camera mode (if mode was started
 by camera floater). Reviewed by Leyla Farazha at
 https://codereview.productengine.com/secondlife/r/97/

--HG--
branch : product-engine
---
 indra/newview/llviewerwindow.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d91833fd22..e66914fb60 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2088,7 +2088,7 @@ void LLViewerWindow::draw()
 		// Draw tool specific overlay on world
 		LLToolMgr::getInstance()->getCurrentTool()->draw();
 
-		if( gAgent.cameraMouselook() )
+		if( gAgent.cameraMouselook() || LLFloaterCamera::inFreeCameraMode() )
 		{
 			drawMouselookInstructions();
 			stop_glerror();
-- 
cgit v1.2.3


From 920d54297fc13a7a975ff4372f0c1559cf9cf199 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 25 Mar 2010 17:09:20 +0200
Subject: =?UTF-8?q?fixed=20major=20EXT-6500=20=E2=80=9CMessage=20Well=20co?=
 =?UTF-8?q?unter=20changes=20to=20'-1'=20after=20plain=20text=20chat=20was?=
 =?UTF-8?q?=20enabled=20while=20unresolved=20offer=20was=20in=20hided=20IM?=
 =?UTF-8?q?=20window=E2=80=9D,=20Added=20check=20to=20LLToastNotifyPanel?=
 =?UTF-8?q?=20destructor=20whether=20we=20should=20close=20notification=20?=
 =?UTF-8?q?since=20notification=20will=20be=20reused=20by=20IM=20floater?=
 =?UTF-8?q?=20when=20reload=20messages,=20the=20rule=20is:=20if=20LLToastN?=
 =?UTF-8?q?otifyPanel=20destroying=20but=20IM=20floater=20is=20exists=20?=
 =?UTF-8?q?=E2=80=93=20we=20shouldn't=20close=20notification.=20The=20prob?=
 =?UTF-8?q?lem=20is=20that=20notification=20was=20incorrectly=20deleted=20?=
 =?UTF-8?q?when=20IM=20floater=20reloads=20messages=20on=20chat=20log=20fr?=
 =?UTF-8?q?omat=20change=20event.=20reviewed=20by=20Vadim=20Savchuk=20at?=
 =?UTF-8?q?=20https://codereview.productengine.com/secondlife/r/80/?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp      |  2 +-
 indra/newview/lltoastnotifypanel.cpp | 19 +++++++++++++++++--
 indra/newview/lltoastnotifypanel.h   |  7 ++++++-
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index efdfbb8d20..858ea334d1 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -751,7 +751,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 		if (notification != NULL)
 		{
 			LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel(
-					notification);
+					notification, chat.mSessionID);
 			//we can't set follows in xml since it broke toasts behavior
 			notify_box->setFollowsLeft();
 			notify_box->setFollowsRight();
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 907740a88e..c9d2d404c0 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -45,6 +45,7 @@
 #include "lltrans.h"
 #include "llnotificationsutil.h"
 #include "llviewermessage.h"
+#include "llimfloater.h"
 
 const S32 BOTTOM_PAD = VPAD * 3;
 const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
@@ -531,12 +532,26 @@ void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification
 
 //////////////////////////////////////////////////////////////////////////
 
-LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect /* = LLRect::null */)
- : LLToastNotifyPanel(pNotification, rect)
+LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */)
+ : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect)
 {
 	mTextBox->setFollowsAll();
 }
 
+LLIMToastNotifyPanel::~LLIMToastNotifyPanel()
+{
+	// We shouldn't delete notification when IM floater exists
+	// since that notification will be reused by IM floater.
+	// This may happened when IM floater reloads messages, exactly when user
+	// changes layout of IM chat log(disable/enable plaintext mode).
+	// See EXT-6500
+	LLIMFloater* im_floater = LLIMFloater::findInstance(mSessionID);
+	if (im_floater != NULL && !im_floater->isDead())
+	{
+		mCloseNotificationOnDestroy = false;
+	}
+}
+
 void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
 {
 	S32 text_height = mTextBox->getTextBoundingRect().getHeight();
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index a8d2d03236..1c68e4c6b3 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -138,9 +138,14 @@ class LLIMToastNotifyPanel : public LLToastNotifyPanel
 {
 public:
 
-	LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null);
+	LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null);
+
+	~LLIMToastNotifyPanel();
 
 	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+protected:
+	LLUUID	mSessionID;
 };
 
 #endif /* LLTOASTNOTIFYPANEL_H_ */
-- 
cgit v1.2.3


From 54a3f1051e5ef411b39ac34ba37fc7444832a3eb Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 25 Mar 2010 17:53:25 +0200
Subject: =?UTF-8?q?fixed=20EXT-6489=20=E2=80=9C"User=20not=20online=20-=20?=
 =?UTF-8?q?inventory=20has=20been=20saved"=20should=20be=20logged=20to=20I?=
 =?UTF-8?q?M=20log=E2=80=9D,=20reviewed=20by=20Mike=20Antipov=20at=20https?=
 =?UTF-8?q?://codereview.productengine.com/secondlife/r/90/?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

--HG--
branch : product-engine
---
 indra/newview/llnotificationhandlerutil.cpp          |  9 ++++++---
 indra/newview/llviewermessage.cpp                    | 11 ++++-------
 indra/newview/skins/default/xui/en/notifications.xml |  7 +++++++
 3 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 24cffd222b..6aafa04a17 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -128,7 +128,8 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
 						FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
 						SERVER_OBJECT_MESSAGE("ServerObjectMessage"),
 						TELEPORT_OFFERED("TeleportOffered"),
-						TELEPORT_OFFER_SENT("TeleportOfferSent");
+						TELEPORT_OFFER_SENT("TeleportOfferSent"),
+						IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip");
 
 
 // static
@@ -147,7 +148,8 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
 			|| INVENTORY_DECLINED == notification->getName()
 			|| USER_GIVE_ITEM == notification->getName()
 			|| TELEPORT_OFFERED == notification->getName()
-			|| TELEPORT_OFFER_SENT == notification->getName();
+			|| TELEPORT_OFFER_SENT == notification->getName()
+			|| IM_SYSTEM_MESSAGE_TIP == notification->getName();
 }
 
 // static
@@ -157,7 +159,8 @@ bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
 			&&  FRIEND_ONLINE != notification->getName()
 			&& FRIEND_OFFLINE != notification->getName()
 			&& INVENTORY_ACCEPTED != notification->getName()
-			&& INVENTORY_DECLINED != notification->getName();
+			&& INVENTORY_DECLINED != notification->getName()
+			&& IM_SYSTEM_MESSAGE_TIP != notification->getName();
 }
 
 // static
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 7ba9c54e53..6043ec4954 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1752,17 +1752,15 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	std::string separator_string(": ");
 
 	LLSD args;
+	LLSD payload;
 	switch(dialog)
 	{
 	case IM_CONSOLE_AND_CHAT_HISTORY:
-		// These are used for system messages, hence don't need the name,
-		// as it is always "Second Life".
 	  	// *TODO: Translate
 		args["MESSAGE"] = message;
-
-		// Note: don't put the message in the IM history, even though was sent
-		// via the IM mechanism.
-		LLNotificationsUtil::add("SystemMessageTip",args);
+		payload["SESSION_NAME"] = name;
+		payload["from_id"] = from_id;
+		LLNotificationsUtil::add("IMSystemMessageTip",args, payload);
 		break;
 
 	case IM_NOTHING_SPECIAL: 
@@ -1985,7 +1983,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			// For requested notices, we don't want to send the popups.
 			if (dialog != IM_GROUP_NOTICE_REQUESTED)
 			{
-				LLSD payload;
 				payload["subject"] = subj;
 				payload["message"] = mes;
 				payload["sender_name"] = name;
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index c39a91281e..5403defc59 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4269,6 +4269,13 @@ The string [STRING_NAME] is missing from strings.xml
    type="notifytip">
 [MESSAGE]
   </notification>
+  
+  <notification
+   icon="notifytip.tga"
+   name="IMSystemMessageTip"
+   type="notifytip">
+[MESSAGE]
+  </notification>
 
   <notification
    icon="notifytip.tga"
-- 
cgit v1.2.3


From 3318c8f09e5edb907712d626ea12c2cbd6136c50 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 25 Mar 2010 18:06:48 +0200
Subject: =?UTF-8?q?fixed=20EXT-3818=20=E2=80=9C[BSI]=20plain=20text=20chat?=
 =?UTF-8?q?=20has=20too=20much=20space=20between=20lines=E2=80=9D,=20To=20?=
 =?UTF-8?q?fix=20EXT-6373=20I=20added=20vertical=20padding=20between=20pos?=
 =?UTF-8?q?ts=20in=20plain-text=20and=20unified=20padding=20in=20default?=
 =?UTF-8?q?=20mode=20of=20IM/chat=20history.=20Now=20I'm=20backing=20out?=
 =?UTF-8?q?=20the=20changes=20to=20plain-text=20mode=20that=20led=20to=20E?=
 =?UTF-8?q?XT-3818.=20reviewed=20by=20Leyla=20Farazha=20at=20https://coder?=
 =?UTF-8?q?eview.productengine.com/secondlife/r/95/?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

--HG--
branch : product-engine
---
 indra/newview/llchathistory.cpp                          | 16 ----------------
 indra/newview/llchathistory.h                            |  9 ---------
 .../skins/default/xui/en/widgets/chat_history.xml        |  1 -
 3 files changed, 26 deletions(-)

diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 858ea334d1..71e7ae7061 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -447,7 +447,6 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
 :	LLUICtrl(p),
 	mMessageHeaderFilename(p.message_header),
 	mMessageSeparatorFilename(p.message_separator),
-	mMessagePlaintextSeparatorFilename(p.message_plaintext_separator),
 	mLeftTextPad(p.left_text_pad),
 	mRightTextPad(p.right_text_pad),
 	mLeftWidgetPad(p.left_widget_pad),
@@ -535,12 +534,6 @@ LLView* LLChatHistory::getSeparator()
 	return separator;
 }
 
-LLView* LLChatHistory::getPlaintextSeparator()
-{
-	LLPanel* separator = LLUICtrlFactory::getInstance()->createFromFile<LLPanel>(mMessagePlaintextSeparatorFilename, NULL, LLPanel::child_registry_t::instance());
-	return separator;
-}
-
 LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
 {
 	LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
@@ -639,15 +632,6 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 
 	if (use_plain_text_chat_history)
 	{
-		// append plaintext separator
-		LLView* separator = getPlaintextSeparator();
-		LLInlineViewSegment::Params p;
-		p.force_newline = true;
-		p.left_pad = mLeftWidgetPad;
-		p.right_pad = mRightWidgetPad;
-		p.view = separator;
-		mEditor->appendWidget(p, "\n", false);
-
 		mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
 
 		if (utf8str_trim(chat.mFromName).size() != 0)
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index dfe5ea98e6..950b32861b 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -47,8 +47,6 @@ class LLChatHistory : public LLUICtrl
 			Optional<std::string>	message_header;
 			//Message separator filename
 			Optional<std::string>	message_separator;
-			//Message plaintext  separator filename
-			Optional<std::string>	message_plaintext_separator;
 			//Text left padding from the scroll rect
 			Optional<S32>			left_text_pad;
 			//Text right padding from the scroll rect
@@ -71,7 +69,6 @@ class LLChatHistory : public LLUICtrl
 			Params()
 			:	message_header("message_header"),
 				message_separator("message_separator"),
-				message_plaintext_separator("message_plaintext_separator"),
 				left_text_pad("left_text_pad"),
 				right_text_pad("right_text_pad"),
 				left_widget_pad("left_widget_pad"),
@@ -99,11 +96,6 @@ class LLChatHistory : public LLUICtrl
 		 * @return pointer to LLView separator object.
 		 */
 		LLView* getSeparator();
-		/**
-		 * Builds a message plaintext  separator.
-		 * @return pointer to LLView separator object.
-		 */
-		LLView* getPlaintextSeparator();
 		/**
 		 * Builds a message header.
 		 * @return pointer to LLView header object.
@@ -141,7 +133,6 @@ class LLChatHistory : public LLUICtrl
 
 		std::string mMessageHeaderFilename;
 		std::string mMessageSeparatorFilename;
-		std::string mMessagePlaintextSeparatorFilename;
 
 		S32 mLeftTextPad;
 		S32 mRightTextPad;
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
index aa3ea736b8..ef885e8045 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
@@ -2,7 +2,6 @@
 <chat_history
   message_header="panel_chat_header.xml"
   message_separator="panel_chat_separator.xml"
-  message_plaintext_separator="panel_chat_plaintext_separator.xml"
   left_text_pad="10"
   right_text_pad="15"
   left_widget_pad="0"
-- 
cgit v1.2.3


From 869fc803cb30c311fa5bd20aa036e1db683ce874 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Thu, 25 Mar 2010 18:12:00 +0200
Subject: Fixed normal bug (EXT-6484) Drop down dialogs have same/similar color
 to background & no border. - Removed unused attributes from drop down menus
 in side panel People. - Removed drop_shadow="false" to display shadow and
 distinguish drop down from background.

Reviewed by Vadim Savchuk https://codereview.productengine.com/secondlife/r/103/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/menu_group_plus.xml               | 2 +-
 indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml | 2 +-
 indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml  | 2 +-
 indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml  | 2 +-
 indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml  | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/menu_group_plus.xml b/indra/newview/skins/default/xui/en/menu_group_plus.xml
index e83d07baec..fce7414d80 100644
--- a/indra/newview/skins/default/xui/en/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/en/menu_group_plus.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
-     mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+     mouse_opaque="false">
   <menu_item_call name="item_join" label="Join Group...">
     <menu_item_call.on_click function="People.Group.Plus.Action" userdata="join_group" />
   </menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index f1117d1419..92752a0fee 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
-     mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+     mouse_opaque="false">
   <menu_item_check
    label="Sort by Name"
    name="sort_name">
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index df3cb26b04..2efb204ffb 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
-     mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+     mouse_opaque="false">
   <menu_item_check
    label="Display Group Icons"
    layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index 39f9e48609..69b3831738 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
-     mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+     mouse_opaque="false">
   <menu_item_check
      label="Sort by Recent Speakers"
      name="sort_by_recent_speakers">
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
index cfd6dc78b6..5c9555db92 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <menu name="menu_group_plus"
      left="0" bottom="0" visible="false"
-     mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+     mouse_opaque="false">
   <menu_item_check
    label="Sort by Most Recent"
    name="sort_most">
-- 
cgit v1.2.3


From 378b65ca4cad6d6bcd1d5b0d58cb7c0bb7834a22 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Thu, 25 Mar 2010 18:31:08 +0200
Subject: Fixed normal bug EXT-5604 - Context menu of URL is covered by profile
 description itself This issue was fixed when menu became non top-control.
 Enabled context menu in expandable textbox in profile panel.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_my_profile.xml | 3 +++
 indra/newview/skins/default/xui/en/panel_profile.xml    | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index 4112b65635..4386475cf1 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -117,6 +117,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.show_context_menu="true"
                name="sl_description_edit"
                top_pad="-3"
                translate="false"
@@ -171,6 +172,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.show_context_menu="true"
                name="fl_description_edit"
                top_pad="-3"
                translate="false"
@@ -311,6 +313,7 @@
             name="sl_groups"
           top_pad="0"
             translate="false"
+            textbox.show_context_menu="true"
             width="298"
             expanded_bg_visible="true"
             expanded_bg_color="DkGray">
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 30191aecb6..34ec64b8af 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -107,6 +107,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.show_context_menu="true"
                name="sl_description_edit"
                top_pad="-3"
                translate="false"
@@ -151,6 +152,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.show_context_menu="true"
                name="fl_description_edit"
                top_pad="-3"
                translate="false"
@@ -289,6 +291,7 @@
             left="7"
             name="sl_groups"
             textbox.max_length="512"
+            textbox.show_context_menu="true"
             top_pad="0"
             translate="false"
             width="290"
-- 
cgit v1.2.3


From 5fbcc249e3af8e8cd1edabf7a4b6e4c9ca0fc7e3 Mon Sep 17 00:00:00 2001
From: Andrew Dyukov <adyukov@productengine.com>
Date: Thu, 25 Mar 2010 22:52:28 +0200
Subject: Fixed normal bug EXT-6325 (ABOUT SECOND LIFE window, Copy to
 Clipboard button overlaps horizontal rule).

- Decreased height of text editor.

Reviewed by Vadim at https://codereview.productengine.com/secondlife/r/98/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/floater_about.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index bc67621dfd..d03231a3fa 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -76,7 +76,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
         allow_html="true" 
        follows="top|left"
        font="SansSerif"
-       height="350"
+       height="343"
        bg_readonly_color="Transparent"
        left="5"
        max_length="65536"
-- 
cgit v1.2.3


From 4d8338ff3eb91b7185b347b4c538ae20ff7940ce Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Fri, 26 Mar 2010 09:47:42 +0200
Subject: Fixen normal EXT-6434 (Mini Map does not go transparent when not in
 focus)

- Set background opaque of the floater depending on focus and made map's background color transparent

Reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/99/

--HG--
branch : product-engine
---
 indra/newview/llfloatermap.cpp                     | 14 ++++++++++++++
 indra/newview/llfloatermap.h                       |  2 ++
 indra/newview/skins/default/colors.xml             |  2 +-
 indra/newview/skins/default/xui/en/floater_map.xml |  1 +
 4 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 051ab585e2..ccf286c4cc 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -215,6 +215,20 @@ void LLFloaterMap::draw()
 	LLFloater::draw();
 }
 
+// virtual
+void LLFloaterMap::onFocusReceived()
+{
+	setBackgroundOpaque(true);
+	LLPanel::onFocusReceived();
+}
+
+// virtual
+void LLFloaterMap::onFocusLost()
+{
+	setBackgroundOpaque(false);
+	LLPanel::onFocusLost();
+}
+
 void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
 	LLFloater::reshape(width, height, called_from_parent);
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 6c9138c6a7..9ff2f03180 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -53,6 +53,8 @@ public:
 	/*virtual*/ BOOL	handleRightMouseDown( S32 x, S32 y, MASK mask );
 	/*virtual*/ void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
 	/*virtual*/ void	draw();
+	/*virtual*/ void	onFocusLost();
+	/*virtual*/ void	onFocusReceived();
 	
 private:
 	void handleZoom(const LLSD& userdata);
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index fcf5cfadb2..777d671e81 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -524,7 +524,7 @@
      reference="Unused?" />
     <color
      name="NetMapBackgroundColor"
-     value="0 0 0 0.3" />
+     value="0 0 0 0" />
     <color
      name="NetMapGroupOwnAboveWater"
      reference="Purple" />
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 5d35275e17..e21e44204d 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
+ bg_alpha_image_overlay="DkGray_66"
  legacy_header_height="18"
  can_minimize="true" 
  can_resize="true"
-- 
cgit v1.2.3


From 4b847b4388a38209ec8e12ed55d8137c94119c17 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Fri, 26 Mar 2010 10:28:57 +0200
Subject: =?UTF-8?q?fixed=20EXT-6373=20=E2=80=9CConsecutive=20offer=20messa?=
 =?UTF-8?q?ges=20are=20unreadable=20in=20the=20IM=20log=E2=80=9D,=20replac?=
 =?UTF-8?q?ed=20[NAME]=20with=20[NAME=5FSLURL]=20in=20teleport=20offer=20n?=
 =?UTF-8?q?otification,=20this=20will=20unify=20offers=20appearance=20and?=
 =?UTF-8?q?=20gap=20between=20offers=20in=20IM=20chat=20log=20with=20disab?=
 =?UTF-8?q?led=20plaintext=20mode;?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

--HG--
branch : product-engine
---
 indra/newview/llviewermessage.cpp                    | 2 +-
 indra/newview/skins/default/xui/en/notifications.xml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6043ec4954..c8cc813576 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2313,7 +2313,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			{
 				LLSD args;
 				// *TODO: Translate -> [FIRST] [LAST] (maybe)
-				args["NAME"] = name;
+				args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");
 				args["MESSAGE"] = message;
 				LLSD payload;
 				payload["from_id"] = from_id;
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 5403defc59..6d18111be0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5110,7 +5110,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
    icon="notify.tga"
    name="TeleportOffered"
    type="offer">
-[NAME] has offered to teleport you to their location:
+[NAME_SLURL] has offered to teleport you to their location:
 
 [MESSAGE]
     <form name="form">
-- 
cgit v1.2.3


From b846bc1fe48e8681f9f468d097228e3330d10ce8 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Fri, 26 Mar 2010 14:21:50 +0200
Subject: Fixed normal bug EXT-6331 (Gestures floater has an extra column
 titled \"1\")

- Corrected wrong indexes at the point of adding gestures to the gestures list.
Problem probably is a result of 'copy & paste'.

Reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/113/

--HG--
branch : product-engine
---
 indra/newview/llfloatergesture.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 9c1ac2631d..ac32319690 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -354,10 +354,10 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
 		element["columns"][0]["value"] = "";
 		element["columns"][0]["font"]["name"] = "SANSSERIF";
 		element["columns"][0]["font"]["style"] = font_style;
-		element["columns"][0]["column"] = "trigger";
-		element["columns"][0]["value"] = "---";
-		element["columns"][0]["font"]["name"] = "SANSSERIF";
-		element["columns"][0]["font"]["style"] = font_style;
+		element["columns"][1]["column"] = "shortcut";
+		element["columns"][1]["value"] = "---";
+		element["columns"][1]["font"]["name"] = "SANSSERIF";
+		element["columns"][1]["font"]["style"] = font_style;
 		element["columns"][2]["column"] = "key";
 		element["columns"][2]["value"] = "~~~";
 		element["columns"][2]["font"]["name"] = "SANSSERIF";
-- 
cgit v1.2.3


From 56fa20e168240fe6c971a8c8e672fc5a9e2b6690 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Fri, 26 Mar 2010 14:38:03 +0200
Subject: Fixed major bug EXT-6544 - remove Admin > God Tools > Grid > Kick All
 Residents button. Removed "Kick all" button and corresponding code.

Reviewed by Mike Antipov - https://codereview.productengine.com/secondlife/r/117/

--HG--
branch : product-engine
---
 indra/newview/llfloatergodtools.cpp                | 41 ----------------------
 indra/newview/llfloatergodtools.h                  |  3 --
 .../skins/default/xui/en/floater_god_tools.xml     | 13 -------
 3 files changed, 57 deletions(-)

diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index eb56f387cd..c08d891d2f 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -828,7 +828,6 @@ const F32 HOURS_TO_RADIANS = (2.f*F_PI)/24.f;
 LLPanelGridTools::LLPanelGridTools() :
 	LLPanel()
 {
-	mCommitCallbackRegistrar.add("GridTools.KickAll",		boost::bind(&LLPanelGridTools::onClickKickAll, this));	
 	mCommitCallbackRegistrar.add("GridTools.FlushMapVisibilityCaches",		boost::bind(&LLPanelGridTools::onClickFlushMapVisibilityCaches, this));	
 }
 
@@ -846,46 +845,6 @@ void LLPanelGridTools::refresh()
 {
 }
 
-void LLPanelGridTools::onClickKickAll()
-{
-	LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
-}
-
-
-bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)
-{
-	if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
-	{
-		LLSD payload;
-		payload["kick_message"] = response["message"].asString();
-		LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
-	}
-	return false;
-}
-
-
-// static
-bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
-
-	if (option == 0)
-	{
-		LLMessageSystem* msg = gMessageSystem;
-
-		msg->newMessageFast(_PREHASH_GodKickUser);
-		msg->nextBlockFast(_PREHASH_UserInfo);
-		msg->addUUIDFast(_PREHASH_GodID, gAgent.getID());
-		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
-		msg->addUUIDFast(_PREHASH_AgentID,   LL_UUID_ALL_AGENTS );
-		msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
-		msg->addStringFast(_PREHASH_Reason,    notification["payload"]["kick_message"].asString());
-		gAgent.sendReliableMessage();
-	}
-	return false;
-}
-
 void LLPanelGridTools::onClickFlushMapVisibilityCaches()
 {
 	LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h
index ef5ce02749..b95d1a30e4 100644
--- a/indra/newview/llfloatergodtools.h
+++ b/indra/newview/llfloatergodtools.h
@@ -198,9 +198,6 @@ public:
 
 	void refresh();
 
-	void onClickKickAll();
-	static bool confirmKick(const LLSD& notification, const LLSD& response);
-	static bool finishKick(const LLSD& notification, const LLSD& response);
 	static void onDragSunPhase(LLUICtrl *ctrl, void *userdata);
 	void onClickFlushMapVisibilityCaches();
 	static bool flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index 36ef6beb59..240871ec25 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -28,19 +28,6 @@
          name="grid"
          top="16"
          width="398">
-            <button
-             follows="left|top"
-             height="20"
-             label="Kick all Residents"
-             label_selected="Kick all Residents"
-             layout="topleft"
-             left="10"
-             name="Kick all users"
-             top="30"
-             width="120">
-				<button.commit_callback
-				function="GridTools.KickAll" />
-			</button>
             <button
              follows="left|top"
              height="20"
-- 
cgit v1.2.3


From 379517ce5e1535b20a94ef3a581e1b25223f8798 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Fri, 26 Mar 2010 14:39:46 +0200
Subject: Fixed normal bug EXT-6070 - Truncated strings in window to buy linden
 dollars Increased textbox width. French translation is the longest so other
 languages will be ok.

Reviewed by Mike Antipov - https://codereview.productengine.com/secondlife/r/114/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/floater_buy_currency.xml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index e02d32596a..637f9f55d4 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -24,13 +24,13 @@
    <text
      type="string"
      length="1"
-     follows="top|left"
+     follows="top|left|right"
      font="SansSerifHuge"
      layout="topleft"
      left="20"
      height="30"
      top="25"
-     width="300"
+     width="340"
      name="info_need_more">
         You need more L$
     </text>
@@ -55,7 +55,7 @@
      left="20"
      height="30"
      top="25"
-     width="200"
+     width="300"
      name="info_buying">
         Buy L$
     </text>
@@ -178,8 +178,8 @@
      follows="top|left"
      height="16"
      halign="right"
-     left="140"
-     width="180"
+     left="20"
+     width="300"
      layout="topleft"
      name="buy_action">
         [ACTION]
-- 
cgit v1.2.3


From e962b8418f8a37c1d18743c31199dd9c33d5c74b Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Fri, 26 Mar 2010 16:29:47 +0200
Subject: fix for EXT-6475 Scrollbar in the Notices panel is semitransparent
 and overlaps controls (also for EXT-6374  Side Panel> Create a Notice> dialog
 boxes overrun up/down slider)
 https://codereview.productengine.com/secondlife/r/100/ reviewed Leyla Farazha
 ,vsavchuk

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_group_notices.xml | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 731b3c119c..479629f6ea 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -131,6 +131,7 @@ Maximum 200 per group daily
             Subject:
         </text>
         <line_editor
+         follows="left|top|right"
          border_style="line"
          border_thickness="1"
          height="16"
@@ -153,6 +154,7 @@ Maximum 200 per group daily
             Message:
         </text>
         <text_editor
+         follows="left|top|right"
          height="90"
          layout="topleft"
          left_pad="3"
@@ -173,6 +175,7 @@ Maximum 200 per group daily
             Attach:
         </text>
         <line_editor
+         follows="left|top|right"
          enabled="false"
          height="19"
          layout="topleft"
@@ -222,7 +225,7 @@ Maximum 200 per group daily
          label="Send"
          label_selected="Send"
          layout="topleft"
-         right="-10"
+         right="-25"
          top_pad="10"
          name="send_notice"
          width="100" />
-- 
cgit v1.2.3


From be66b520571aa89feefc8e1dad6dbc622521f124 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 26 Mar 2010 16:44:43 +0200
Subject: Fixed normal bug EXT-6448 (People -> My Friends list has overlapping
 text at the top covering the first few contacts.)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Unfortunately I was unable to reproduce this bug. But I have some idea about the reason of it.
Decision to show or not the help text based on count of people in Inventory/Calling Cards/Friends/All list. So, if this list is empty even if Resident has some friend (and at least one of them is online) both help text & online list were shown at the same time.

The reason of why Friends/All can be empty in inventory can be clean cachу & slow connection to upload it from the server. But I could not reproduce it.

So, the fix is to check both all friends & online friends lists to prevent overlaping in the future.

Reviewed by Vadim at https://codereview.productengine.com/secondlife/r/118/

--HG--
branch : product-engine
---
 indra/newview/llpanelpeople.cpp | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 2025bd52dc..325157a064 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -672,11 +672,6 @@ void LLPanelPeople::updateFriendList()
 		lldebugs << "Friends Cards were not found" << llendl;
 	}
 
-	// show special help text for just created account to help found friends. EXT-4836
-	static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
-	no_friends_text->setVisible(all_friendsp.size() == 0);
-
-
 	LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
 	for (; buddy_it != all_buddies.end(); ++buddy_it)
 	{
@@ -685,6 +680,14 @@ void LLPanelPeople::updateFriendList()
 			online_friendsp.push_back(buddy_id);
 	}
 
+	// show special help text for just created account to help found friends. EXT-4836
+	static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
+
+	// Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...)
+	// So, lets check all lists to avoid overlapping the text with online list. See EXT-6448.
+	bool any_friend_exists = (all_friendsp.size() > 0) || (online_friendsp.size() > 0);
+	no_friends_text->setVisible(!any_friend_exists);
+
 	/*
 	 * Avatarlists  will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items.
 	 * But avatarlist can be updated only if it is visible @see LLAvatarList::draw();   
-- 
cgit v1.2.3


From 3f3c9c7e255e090c7f09dafd08ec20f2d8a09c6d Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Fri, 26 Mar 2010 17:08:32 +0200
Subject: Fixed normal bug EXT-5116 (Voice notification should display on top
 of IM window, not under.)

Replaced sending voice notifications to front (in floater view) with adding them to popup view.
In this case Voice Notifications are shown on top even IM window has focus. And Resident can continue enter the text when Voice notification is shown.

Reviewad by Vadim at https://codereview.productengine.com/secondlife/r/120/

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp | 7 ++++++-
 indra/newview/llimview.h   | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 288895be8c..389917a6f7 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1559,6 +1559,11 @@ LLCallDialog::LLCallDialog(const LLSD& payload)
 	setDocked(true);
 }
 
+LLCallDialog::~LLCallDialog()
+{
+	LLUI::removePopup(this);
+}
+
 void LLCallDialog::getAllowedRect(LLRect& rect)
 {
 	rect = gViewerWindow->getWorldViewRectScaled();
@@ -1612,7 +1617,7 @@ void LLCallDialog::onOpen(const LLSD& key)
 	LLDockableFloater::onOpen(key);
 
 	// it should be over the all floaters. EXT-5116
-	gFloaterView->bringToFront(this, FALSE);
+	LLUI::addPopup(this);
 }
 
 void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 475d407bea..fac8f4954c 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -495,7 +495,7 @@ class LLCallDialog : public LLDockableFloater
 {
 public:
 	LLCallDialog(const LLSD& payload);
-	~LLCallDialog() {}
+	~LLCallDialog();
 
 	virtual BOOL postBuild();
 
-- 
cgit v1.2.3


From 5a12802503b8e557b5cdd99202466bb293a4474f Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Fri, 26 Mar 2010 19:02:14 +0200
Subject: Fixed bug EXT-6268 (Group spawns Resident inspector when called from
 About Land > Objects for group deeded object)

Reason: groups were added to the list as avatars, which led to invoking
incorrect inspector on hover.
Also added a fix for potential crash on hovering name list items.

Reviewed by Leyla: https://codereview.productengine.com/secondlife/r/110/

--HG--
branch : product-engine
---
 indra/newview/llfloaterland.cpp  |  2 +-
 indra/newview/llnamelistctrl.cpp | 24 +++++++++++++++++++-----
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 65003d9b5c..5dc63b7ef2 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1612,7 +1612,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
 		item_params.columns.add().value(object_count_str).font(FONT).column("count");
 		item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
 
-		self->mOwnerList->addRow(item_params);
+		self->mOwnerList->addNameItemRow(item_params);
 
 		lldebugs << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
 				<< ") owns " << object_count << " objects." << llendl;
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 7a538e372b..9611c286eb 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -148,16 +148,30 @@ void	LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
 		if(0 <= cur_index && cur_index < (S32)getItemList().size())
 		{
 			LLScrollListItem* item = getItemList()[cur_index];
-			LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
-			if(cell)
-				cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+			if (item)
+			{
+				LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+				if (cell)
+					cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+			}
+			else
+			{
+				llwarns << "highlighted name list item is NULL" << llendl;
+			}
 		}
 		if(target_index != -1)
 		{
 			LLScrollListItem* item = getItemList()[target_index];
 			LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
-			if(cell)
-				cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+			if (item)
+			{
+				if (cell)
+					cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+			}
+			else
+			{
+				llwarns << "target name item is NULL" << llendl;
+			}
 		}
 	}
 
-- 
cgit v1.2.3


From b7d0bb9e1ed7aab7eb6d4bb0eb129778892f503a Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Fri, 26 Mar 2010 19:09:11 +0200
Subject: Fixed bug EXT-6399 (System locale is the same for all languages).

Problem:
* English locale was set for all languages.
* Specifying a correct locale didn't affect anything, including date/time formatting.

My investigation has shown that LLStringUtil was instantiated twice: in the
main binary and in libllcommon.so.
Because LLStringUtil::setLocale() was called from newview and getLocale()
was called from llcommon, they effectively used *different* instances of
LLStringUtil::sLocale. Hence getLocale() always returned empty string.

This seems to be caused by get/setLocale() methods not being dllexported.

The fix instantiates get/setLocale() and sLocale in llcommon and exposes
them to use from newview (i.e. prevents multiple instantiation).

Besides, I specified correct locale names for all languages and platforms.

Reviewed by Leyla: https://codereview.productengine.com/secondlife/r/104/

--HG--
branch : product-engine
---
 indra/llcommon/llstring.cpp                              | 14 ++++++++++++++
 indra/llcommon/llstring.h                                |  4 ++--
 indra/newview/skins/default/xui/da/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/de/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/es/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/fr/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/it/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/ja/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/nl/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/pl/language_settings.xml |  6 +++---
 indra/newview/skins/default/xui/pt/language_settings.xml |  6 +++---
 11 files changed, 43 insertions(+), 29 deletions(-)

diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 5f3d9d6582..b5a73ec1d1 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -911,6 +911,20 @@ bool LLStringUtil::simpleReplacement(std::string &replacement, std::string token
 	return false;
 }
 
+//static
+template<>
+void LLStringUtil::setLocale(std::string inLocale)
+{
+	sLocale = inLocale;
+};
+
+//static
+template<>
+std::string LLStringUtil::getLocale(void)
+{
+	return sLocale;
+};
+
 // static
 template<> 
 void LLStringUtil::formatNumber(std::string& numStr, std::string decimals)
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 62cedcde4e..96588b29b9 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -241,8 +241,8 @@ public:
 	LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
 	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
 	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
-	static void setLocale (std::string inLocale) {sLocale = inLocale;};
-	static std::string getLocale (void) {return sLocale;};
+	LL_COMMON_API static void setLocale (std::string inLocale);
+	LL_COMMON_API static std::string getLocale (void);
 	
 	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
 	{
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 71418d446a..fa8a788605 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">danish</string>
+	<string name="DarwinLocale">da_DK.UTF-8</string>
+	<string name="LinuxLocale">da_DK.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index 71418d446a..3e357007ff 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">german</string>
+	<string name="DarwinLocale">de_DE.UTF-8</string>
+	<string name="LinuxLocale">de_DE.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index 71418d446a..1ade4ba300 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">spanish</string>
+	<string name="DarwinLocale">es_ES.UTF-8</string>
+	<string name="LinuxLocale">es_ES.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index 71418d446a..117ae16ee8 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">french</string>
+	<string name="DarwinLocale">fr_FR.UTF-8</string>
+	<string name="LinuxLocale">fr_FR.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 71418d446a..82cf789a6b 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">italian</string>
+	<string name="DarwinLocale">it_IT.UTF-8</string>
+	<string name="LinuxLocale">it_IT.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index 71418d446a..72382417d9 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">japanese</string>
+	<string name="DarwinLocale">ja_JP.UTF-8</string>
+	<string name="LinuxLocale">ja_JP.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
index 71418d446a..dc4663705f 100644
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ b/indra/newview/skins/default/xui/nl/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">dutch</string>
+	<string name="DarwinLocale">nl_NL.UTF-8</string>
+	<string name="LinuxLocale">nl_NL.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 71418d446a..debc451a33 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">polish</string>
+	<string name="DarwinLocale">pl_PL.UTF-8</string>
+	<string name="LinuxLocale">pl_PL.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index 71418d446a..f25e77574d 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -3,9 +3,9 @@
 <strings>
 
 	<!-- Locale Information -->
-	<string name="MicrosoftLocale">english</string>
-	<string name="DarwinLocale">C</string>
-	<string name="LinuxLocale">C</string>
+	<string name="MicrosoftLocale">portuguese</string>
+	<string name="DarwinLocale">pt_PT.UTF-8</string>
+	<string name="LinuxLocale">pt_PT.UTF-8</string>
 	
 	<!-- 
 	datetimeToCodes["wkday"]	= "%a";		// Thu
-- 
cgit v1.2.3


From aebfa2f6f30cbfeb3f3297c5da7fbf67c571f8b8 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 26 Mar 2010 20:22:52 +0200
Subject: Fixed normal bug EXT-6353 (SLapp chat cannot chat spaces). Reviewed
 by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/119/

--HG--
branch : product-engine
---
 indra/newview/llnearbychatbar.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index af711b6943..9de1ffddc8 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -807,8 +807,11 @@ public:
 	{
 		if (tokens.size() < 2) return false;
 		S32 channel = tokens[0].asInteger();
-		std::string mesg = tokens[1].asString();
-		send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
+
+		// Send unescaped message, see EXT-6353.
+		std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
+
+		send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
 		return true;
 	}
 };
-- 
cgit v1.2.3


From ac141e1862e265c00d1adf6466cfad8602fc1f18 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Fri, 26 Mar 2010 20:45:04 +0200
Subject: Related to normal bug EXT-6345 (SLapp group profile does not display
 group name.) - fixed group info panel title to show "Loading..." while
 waiting for group info. Reviewed by Vadim Savchuk at
 https://codereview.productengine.com/secondlife/r/124/

--HG--
branch : product-engine
---
 indra/newview/llpanelgroup.cpp | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 706787e824..c00b6a4147 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -59,6 +59,8 @@
 #include "llaccordionctrltab.h"
 #include "llaccordionctrl.h"
 
+#include "lltrans.h"
+
 static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray");
 
 
@@ -333,8 +335,9 @@ void LLPanelGroup::update(LLGroupChange gc)
 	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
 	if(gdatap)
 	{
-		childSetValue("group_name", gdatap->mName);
-		childSetToolTip("group_name",gdatap->mName);
+		std::string group_name =  gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+		childSetValue("group_name", group_name);
+		childSetToolTip("group_name",group_name);
 		
 		LLGroupData agent_gdatap;
 		bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
@@ -379,8 +382,9 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
 	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
 	if(gdatap)
 	{
-		childSetValue("group_name", gdatap->mName);
-		childSetToolTip("group_name",gdatap->mName);
+		std::string group_name =  gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+		childSetValue("group_name", group_name);
+		childSetToolTip("group_name",group_name);
 	}
 
 	LLButton* button_apply = findChild<LLButton>("btn_apply");
-- 
cgit v1.2.3


From f55af5fcdfdd0b4520e382d315afefd41c534820 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Mon, 29 Mar 2010 14:07:40 +0300
Subject: done EXT-6547 Rename stuff related with Panel Look Info to Panel
 Outfit Edit

renamed panel_look_info.xml to panel_outfit_edit.xml
renamed llpanellookinfo.cpp/llpanellookinfo.h to llpaneloutfitedit.cpp/llpaneloutfitedit.h
renamed LLPanelLookInfo to LLPanelOutfitEdit

Reviewed at https://codereview.productengine.com/secondlife/r/130/

--HG--
branch : product-engine
---
 indra/newview/CMakeLists.txt                       |   4 +-
 indra/newview/llpaneloutfitedit.cpp                | 511 +++++++++++++++++++++
 indra/newview/llpaneloutfitedit.h                  | 127 +++++
 indra/newview/llsidepanelappearance.cpp            |  32 +-
 indra/newview/llsidepanelappearance.h              |   6 +-
 .../skins/default/xui/en/panel_outfit_edit.xml     | 233 ++++++++++
 .../skins/default/xui/en/sidepanel_appearance.xml  |   6 +-
 7 files changed, 895 insertions(+), 24 deletions(-)
 create mode 100644 indra/newview/llpaneloutfitedit.cpp
 create mode 100644 indra/newview/llpaneloutfitedit.h
 create mode 100644 indra/newview/skins/default/xui/en/panel_outfit_edit.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f45237a73c..9bdf9d8893 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -317,7 +317,6 @@ set(viewer_SOURCE_FILES
     llpanellandmedia.cpp
     llpanellogin.cpp
     llpanelloginlistener.cpp
-    llpanellookinfo.cpp
     llpanelmaininventory.cpp
     llpanelmediasettingsgeneral.cpp
     llpanelmediasettingspermissions.cpp
@@ -326,6 +325,7 @@ set(viewer_SOURCE_FILES
     llpanelnearbymedia.cpp
     llpanelobject.cpp
     llpanelobjectinventory.cpp
+    llpaneloutfitedit.cpp
     llpaneloutfitsinventory.cpp
     llpanelpeople.cpp
     llpanelpeoplemenus.cpp
@@ -814,7 +814,6 @@ set(viewer_HEADER_FILES
     llpanellandmedia.h
     llpanellogin.h
     llpanelloginlistener.h
-    llpanellookinfo.h
     llpanelmaininventory.h
     llpanelmediasettingsgeneral.h
     llpanelmediasettingspermissions.h
@@ -823,6 +822,7 @@ set(viewer_HEADER_FILES
     llpanelnearbymedia.h
     llpanelobject.h
     llpanelobjectinventory.h
+    llpaneloutfitedit.h
     llpaneloutfitsinventory.h
     llpanelpeople.h
     llpanelpeoplemenus.h
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
new file mode 100644
index 0000000000..6139174da3
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -0,0 +1,511 @@
+/**
+ * @file llpaneloutfitedit.cpp
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneloutfitedit.h"
+
+// *TODO: reorder includes to match the coding standard
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventory.h"
+#include "llviewercontrol.h"
+#include "llui.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llviewerwindow.h"
+#include "llviewerinventory.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfiltereditor.h"
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "lluiconstants.h"
+#include "llscrolllistctrl.h"
+#include "lltextbox.h"
+#include "lluictrlfactory.h"
+#include "llsdutil.h"
+#include "llsidepanelappearance.h"
+#include "llwearablelist.h"
+
+static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_look("panel_outfit_edit");
+
+const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);
+const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);
+const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
+
+class LLInventoryLookObserver : public LLInventoryObserver
+{
+public:
+	LLInventoryLookObserver(LLPanelOutfitEdit *panel) : mPanel(panel) {}
+	virtual ~LLInventoryLookObserver() 
+	{
+		if (gInventory.containsObserver(this))
+		{
+			gInventory.removeObserver(this);
+		}
+	}
+	
+	virtual void changed(U32 mask)
+	{
+		if (mask & (LLInventoryObserver::ADD | LLInventoryObserver::REMOVE))
+		{
+			mPanel->updateLookInfo();
+		}
+	}
+protected:
+	LLPanelOutfitEdit *mPanel;
+};
+
+class LLLookFetchObserver : public LLInventoryFetchDescendentsObserver
+{
+public:
+	LLLookFetchObserver(LLPanelOutfitEdit *panel) :
+	mPanel(panel)
+	{}
+	LLLookFetchObserver() {}
+	virtual void done()
+	{
+		mPanel->lookFetched();
+		if(gInventory.containsObserver(this))
+		{
+			gInventory.removeObserver(this);
+		}
+	}
+private:
+	LLPanelOutfitEdit *mPanel;
+};
+
+
+
+LLPanelOutfitEdit::LLPanelOutfitEdit()
+:	LLPanel(), mLookID(), mFetchLook(NULL), mSearchFilter(NULL),
+mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToLookBtn(NULL),
+mRemoveFromLookBtn(NULL), mLookObserver(NULL), mNumItemsInLook(0)
+{
+	mSavedFolderState = new LLSaveFolderState();
+	mSavedFolderState->setApply(FALSE);
+	
+	mFetchLook = new LLLookFetchObserver(this);
+	mLookObserver = new LLInventoryLookObserver(this);
+	gInventory.addObserver(mLookObserver);
+	
+	mLookItemTypes.reserve(NUM_LOOK_ITEM_TYPES);
+	for (U32 i = 0; i < NUM_LOOK_ITEM_TYPES; i++)
+	{
+		mLookItemTypes.push_back(LLLookItemType());
+	}
+	
+	// TODO: make these strings translatable
+	mLookItemTypes[LIT_ALL] = LLLookItemType("All Items", ALL_ITEMS_MASK);
+	mLookItemTypes[LIT_WEARABLE] = LLLookItemType("Shape & Clothing", WEARABLE_MASK);
+	mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType("Attachments", ATTACHMENT_MASK);
+
+}
+
+LLPanelOutfitEdit::~LLPanelOutfitEdit()
+{
+	delete mSavedFolderState;
+	if (gInventory.containsObserver(mFetchLook))
+	{
+		gInventory.removeObserver(mFetchLook);
+	}
+	delete mFetchLook;
+	
+	if (gInventory.containsObserver(mLookObserver))
+	{
+		gInventory.removeObserver(mLookObserver);
+	}
+	delete mLookObserver;
+}
+
+BOOL LLPanelOutfitEdit::postBuild()
+{
+	// gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
+		
+	mLookName = getChild<LLTextBox>("curr_look_name"); 
+	
+	/*
+	mLookContents->setDoubleClickCallback(onDoubleClickSpeaker, this);
+	mLookContents->setCommitOnSelectionChange(TRUE);
+	mLookContents->setCommitCallback(boost::bind(&LLPanelActiveSpeakers::handleSpeakerSelect, this, _2));
+	mLookContents->setSortChangedCallback(boost::bind(&LLPanelActiveSpeakers::onSortChanged, this));
+	mLookContents->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+	*/
+	
+	mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");
+	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
+	mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+	// mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+	// mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+	
+	LLComboBox* type_filter = getChild<LLComboBox>("inventory_filter");
+	type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
+	type_filter->removeall();
+	for (U32 i = 0; i < mLookItemTypes.size(); ++i)
+	{
+		type_filter->add(mLookItemTypes[i].displayName);
+	}
+	type_filter->setCurrentByIndex(LIT_ALL);
+	
+	mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
+	mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
+	
+	/* Removing add to look inline button (not part of mvp for viewer 2)
+	LLButton::Params add_params;
+	add_params.name("add_to_look");
+	add_params.click_callback.function(boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this));
+	add_params.label("+");
+	
+	mAddToLookBtn = LLUICtrlFactory::create<LLButton>(add_params);
+	mAddToLookBtn->setEnabled(FALSE);
+	mAddToLookBtn->setVisible(FALSE); */
+	
+	childSetAction("add_item_btn", boost::bind(&LLPanelOutfitEdit::onAddToLookClicked, this), this);
+
+	mUpBtn = getChild<LLButton>("up_btn");
+	mUpBtn->setEnabled(TRUE);
+	mUpBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onUpClicked, this));
+	
+	mLookContents = getChild<LLScrollListCtrl>("look_items_list");
+	mLookContents->sortByColumn("look_item_sort", TRUE);
+	mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onLookItemSelectionChange, this));
+	
+	/*
+	LLButton::Params remove_params;
+	remove_params.name("remove_from_look");
+	remove_params.click_callback.function(boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this));
+	remove_params.label("-"); */
+	
+	//mRemoveFromLookBtn = LLUICtrlFactory::create<LLButton>(remove_params);
+	mRemoveFromLookBtn = getChild<LLButton>("remove_from_look_btn");
+	mRemoveFromLookBtn->setEnabled(FALSE);
+	mRemoveFromLookBtn->setVisible(FALSE);
+	//childSetAction("remove_from_look_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this);
+	mRemoveFromLookBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this));
+	//getChild<LLPanel>("look_info_group_bar")->addChild(mRemoveFromLookBtn); remove_item_btn
+
+	mEditWearableBtn = getChild<LLButton>("edit_wearable_btn");
+	mEditWearableBtn->setEnabled(FALSE);
+	mEditWearableBtn->setVisible(FALSE);
+	mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this));
+	
+	childSetAction("remove_item_btn", boost::bind(&LLPanelOutfitEdit::onRemoveFromLookClicked, this), this);
+	
+	return TRUE;
+}
+
+void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
+{
+	LLComboBox* type_filter = dynamic_cast<LLComboBox*>(ctrl);
+	llassert(type_filter);
+	if (type_filter)
+	{
+		U32 curr_filter_type = type_filter->getCurrentIndex();
+		mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask);
+	}
+	
+	mSavedFolderState->setApply(TRUE);
+	mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+	
+	LLOpenFoldersWithSelection opener;
+	mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+	mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+	
+	gInventory.startBackgroundFetch();
+}
+
+void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
+{
+	if (mSearchString != string)
+	{
+		mSearchString = string;
+		
+		// Searches are case-insensitive
+		LLStringUtil::toUpper(mSearchString);
+		LLStringUtil::trimHead(mSearchString);
+	}
+	
+	if (mSearchString == "")
+	{
+		mInventoryItemsPanel->setFilterSubString(LLStringUtil::null);
+		
+		// re-open folders that were initially open
+		mSavedFolderState->setApply(TRUE);
+		mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		LLOpenFoldersWithSelection opener;
+		mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+		mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+	}
+	
+	gInventory.startBackgroundFetch();
+	
+	if (mInventoryItemsPanel->getFilterSubString().empty() && mSearchString.empty())
+	{
+		// current filter and new filter empty, do nothing
+		return;
+	}
+	
+	// save current folder open state if no filter currently applied
+	if (mInventoryItemsPanel->getRootFolder()->getFilterSubString().empty())
+	{
+		mSavedFolderState->setApply(FALSE);
+		mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+	}
+	
+	// set new filter string
+	mInventoryItemsPanel->setFilterSubString(mSearchString);
+}
+
+void LLPanelOutfitEdit::onAddToLookClicked(void)
+{
+	LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+	LLFolderViewEventListener* listenerp  = curr_item->getListener();
+	link_inventory_item(gAgent.getID(), listenerp->getUUID(), mLookID, listenerp->getName(),
+						LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
+	updateLookInfo();
+}
+
+
+void LLPanelOutfitEdit::onRemoveFromLookClicked(void)
+{
+	LLUUID id_to_remove = mLookContents->getSelectionInterface()->getCurrentID();
+	
+	LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove);
+	
+	if (item_to_remove)
+	{
+		// returns null if not a wearable (attachment, etc).
+		const LLWearable* wearable_to_remove = gAgentWearables.getWearableFromAssetID(item_to_remove->getAssetUUID());
+		if (!wearable_to_remove || gAgentWearables.canWearableBeRemoved( wearable_to_remove ))
+		{											 
+			gInventory.purgeObject( id_to_remove );
+			updateLookInfo();
+			mRemoveFromLookBtn->setEnabled(FALSE);
+			if (mRemoveFromLookBtn->getVisible())
+			{
+				mRemoveFromLookBtn->setVisible(FALSE);
+			}
+		}
+	}
+}
+
+
+void LLPanelOutfitEdit::onUpClicked(void)
+{
+	LLUUID inv_id = mLookContents->getSelectionInterface()->getCurrentID();
+	if (inv_id.isNull())
+	{
+		//nothing selected, do nothing
+		return;
+	}
+
+	LLViewerInventoryItem *link_item = gInventory.getItem(inv_id);
+	if (!link_item)
+	{
+		llwarns << "could not find inventory item based on currently worn link." << llendl;
+		return;
+	}
+
+
+	LLUUID asset_id = link_item->getAssetUUID();
+	if (asset_id.isNull())
+	{
+		llwarns << "inventory link has null Asset ID. could not get object reference" << llendl;
+	}
+
+	static const std::string empty = "";
+	LLWearableList::instance().getAsset(asset_id,
+										empty,	// don't care about wearable name
+										link_item->getActualType(),
+										LLSidepanelAppearance::editWearable,
+										(void*)getParentUICtrl());
+}
+
+
+void LLPanelOutfitEdit::onEditWearableClicked(void)
+{
+	LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID();
+
+	LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit);
+
+	if (item_to_edit)
+	{
+		// returns null if not a wearable (attachment, etc).
+		LLWearable* wearable_to_edit = gAgentWearables.getWearableFromAssetID(item_to_edit->getAssetUUID());
+		if (!wearable_to_edit || !wearable_to_edit->getPermissions().allowModifyBy(gAgent.getID()) )
+		{											 
+			LLSidepanelAppearance::editWearable(wearable_to_edit, getParent());
+			if (mEditWearableBtn->getVisible())
+			{
+				mEditWearableBtn->setVisible(FALSE);
+			}
+		}
+	}
+}
+
+void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+	LLFolderViewItem* current_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return;
+	}
+	
+	/* Removing add to look inline button (not part of mvp for viewer 2)
+	LLRect btn_rect(current_item->getLocalRect().mRight - 50,
+					current_item->getLocalRect().mTop,
+					current_item->getLocalRect().mRight - 30,
+					current_item->getLocalRect().mBottom);
+	
+	mAddToLookBtn->setRect(btn_rect);
+	mAddToLookBtn->setEnabled(TRUE);
+	if (!mAddToLookBtn->getVisible())
+	{
+		mAddToLookBtn->setVisible(TRUE);
+	}
+	
+	current_item->addChild(mAddToLookBtn); */
+}
+
+void LLPanelOutfitEdit::onLookItemSelectionChange(void)
+{	
+	S32 left_offset = -4;
+	S32 top_offset = -10;
+	LLRect rect = mLookContents->getLastSelectedItem()->getRect();
+	LLRect btn_rect(
+					left_offset + rect.mRight - 50,
+					top_offset  + rect.mTop,
+					left_offset + rect.mRight - 30,
+					top_offset  + rect.mBottom);
+	
+	mEditWearableBtn->setRect(btn_rect);
+	
+	mEditWearableBtn->setEnabled(TRUE);
+	if (!mEditWearableBtn->getVisible())
+	{
+		mEditWearableBtn->setVisible(TRUE);
+	}
+	//mLookContents->addChild(mRemoveFromLookBtn);
+}
+
+void LLPanelOutfitEdit::changed(U32 mask)
+{
+}
+
+void LLPanelOutfitEdit::lookFetched(void)
+{
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+
+	// collectDescendentsIf takes non-const reference:
+	LLFindCOFValidItems is_cof_valid;
+	gInventory.collectDescendentsIf(mLookID,
+									cat_array,
+									item_array,
+									LLInventoryModel::EXCLUDE_TRASH,
+									is_cof_valid);
+	for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+		 iter != item_array.end();
+		 iter++)
+	{
+		const LLViewerInventoryItem *item = (*iter);
+		
+		LLSD row;
+		row["id"] = item->getUUID();
+		LLSD& columns = row["columns"];
+		columns[0]["column"] = "look_item";
+		columns[0]["type"] = "text";
+		columns[0]["value"] = item->getName();
+		columns[1]["column"] = "look_item_sort";
+		columns[1]["type"] = "text"; // TODO: multi-wearable sort "type" should go here.
+		columns[1]["value"] = "BAR"; // TODO: Multi-wearable sort index should go here
+		
+		mLookContents->addElement(row);
+	}
+	
+	if (mLookContents->getItemCount() != mNumItemsInLook)
+	{
+		mNumItemsInLook = mLookContents->getItemCount();
+		LLAppearanceManager::instance().updateCOF(mLookID);
+	}
+}
+
+void LLPanelOutfitEdit::updateLookInfo()
+{	
+	if (getVisible())
+	{
+		mLookContents->clearRows();
+		
+		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+		folders.push_back(mLookID);
+		mFetchLook->fetchDescendents(folders);
+		if (mFetchLook->isEverythingComplete())
+		{
+			mFetchLook->done();
+		}
+		else
+		{
+			gInventory.addObserver(mFetchLook);
+		}
+	}
+}
+
+void LLPanelOutfitEdit::displayLookInfo(const LLInventoryCategory* pLook)
+{
+	if (!pLook)
+	{
+		return;
+	}
+	
+	if (!getVisible())
+	{
+		setVisible(TRUE);
+	}
+
+	if (mLookID != pLook->getUUID())
+	{
+		mLookID = pLook->getUUID();
+		mLookName->setText("Look: " + pLook->getName());
+		updateLookInfo();
+	}
+}
+
+void LLPanelOutfitEdit::reset()
+{
+	mLookID.setNull();
+}
+
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
new file mode 100644
index 0000000000..09ec51c056
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.h
@@ -0,0 +1,127 @@
+/** 
+ * @file llpaneloutfitedit.h
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOUTFITEDIT_H
+#define LL_LLPANELOUTFITEDIT_H
+
+#include "llpanel.h"
+
+#include "v3dmath.h"
+#include "lluuid.h"
+
+#include "lliconctrl.h"
+
+#include "llremoteparcelrequest.h"
+#include "llinventory.h"
+#include "llinventorymodel.h"
+
+class LLButton;
+class LLTextBox;
+class LLInventoryCategory;
+class LLInventoryLookObserver;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFolderViewItem;
+class LLScrollListCtrl;
+class LLLookFetchObserver;
+class LLFilterEditor;
+
+class LLPanelOutfitEdit : public LLPanel
+{
+public:
+	
+	// NOTE: initialize mLookItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor
+	typedef enum e_look_item_type
+	{
+		LIT_ALL = 0,
+		LIT_WEARABLE, // clothing or shape
+		LIT_ATTACHMENT,
+		NUM_LOOK_ITEM_TYPES
+	} ELookItemType; 
+	
+	struct LLLookItemType {
+		std::string displayName;
+		U64 inventoryMask;
+		LLLookItemType() : displayName("NONE"), inventoryMask(0) {}
+		LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}
+	};
+	
+	LLPanelOutfitEdit();
+	/*virtual*/ ~LLPanelOutfitEdit();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void changed(U32 mask);
+
+	void reset();
+		// Ignore all old information, useful if you are 
+		// recycling an existing dialog and need to clear it.
+
+	/*virtual*/ void setParcelID(const LLUUID& parcel_id);
+		// Sends a request for data about the given parcel, which will
+		// only update the location if there is none already available.
+	
+	void onTypeFilterChanged(LLUICtrl* ctrl);
+	void onSearchEdit(const std::string& string);
+	void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	void onAddToLookClicked(void);
+	void onLookItemSelectionChange(void);
+	void onRemoveFromLookClicked(void);
+	void onEditWearableClicked(void);
+	void onUpClicked(void);
+
+	void displayLookInfo(const LLInventoryCategory* pLook);
+	
+	void lookFetched(void);
+	
+	void updateLookInfo(void);
+
+private:
+
+	LLUUID				mLookID;
+	LLTextBox*			mLookName;
+	LLScrollListCtrl*	mLookContents;
+	LLInventoryPanel*	mInventoryItemsPanel;
+	LLFilterEditor*		mSearchFilter;
+	LLSaveFolderState*	mSavedFolderState;
+	std::string			mSearchString;
+	LLButton*			mAddToLookBtn;
+	LLButton*			mRemoveFromLookBtn;
+	LLButton*			mUpBtn;
+	LLButton*			mEditWearableBtn;
+	S32					mNumItemsInLook;
+	
+	LLLookFetchObserver*		mFetchLook;
+	LLInventoryLookObserver*	mLookObserver;
+	std::vector<LLLookItemType> mLookItemTypes;
+};
+
+#endif // LL_LLPANELOUTFITEDIT_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 9a37af4916..90c0cd5467 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -93,7 +93,7 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 	LLPanel(),
 	mFilterSubString(LLStringUtil::null),
 	mFilterEditor(NULL),
-	mLookInfo(NULL),
+	mOutfitEdit(NULL),
 	mCurrOutfitPanel(NULL)
 {
 }
@@ -129,10 +129,10 @@ BOOL LLSidepanelAppearance::postBuild()
 	mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
 	mPanelOutfitsInventory->setParent(this);
 
-	mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
-	if (mLookInfo)
+	mOutfitEdit = dynamic_cast<LLPanelOutfitEdit*>(getChild<LLPanel>("panel_outfit_edit"));
+	if (mOutfitEdit)
 	{
-		LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn");
+		LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn");
 		if (back_btn)
 		{
 			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
@@ -177,7 +177,7 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 	if(key.size() == 0)
 		return;
 
-	toggleLookInfoPanel(TRUE);
+	toggleOutfitEditPanel(TRUE);
 	updateVerbs();
 	
 	mLookInfoType = key["type"].asString();
@@ -186,7 +186,7 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 	{
 		LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
 		if (pLook)
-			mLookInfo->displayLookInfo(pLook);
+			mOutfitEdit->displayLookInfo(pLook);
 	}
 }
 
@@ -241,9 +241,9 @@ void LLSidepanelAppearance::onEditAppearanceButtonClicked()
 
 void LLSidepanelAppearance::onEditButtonClicked()
 {
-	toggleLookInfoPanel(FALSE);
+	toggleOutfitEditPanel(FALSE);
 	toggleWearableEditPanel(TRUE, NULL);
-	/*if (mLookInfo->getVisible())
+	/*if (mOutfitEdit->getVisible())
 	  {
 	  }
 	  else
@@ -254,7 +254,7 @@ void LLSidepanelAppearance::onEditButtonClicked()
 
 void LLSidepanelAppearance::onNewOutfitButtonClicked()
 {
-	if (!mLookInfo->getVisible())
+	if (!mOutfitEdit->getVisible())
 	{
 		mPanelOutfitsInventory->onSave();
 	}
@@ -263,22 +263,22 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()
 
 void LLSidepanelAppearance::onBackButtonClicked()
 {
-	toggleLookInfoPanel(FALSE);
+	toggleOutfitEditPanel(FALSE);
 }
 
 void LLSidepanelAppearance::onEditWearBackClicked()
 {
 	mEditWearable->saveChanges();
 	toggleWearableEditPanel(FALSE, NULL);
-	toggleLookInfoPanel(TRUE);
+	toggleOutfitEditPanel(TRUE);
 }
 
-void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
+void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)
 {
-	if (!mLookInfo)
+	if (!mOutfitEdit)
 		return;
 
-	mLookInfo->setVisible(visible);
+	mOutfitEdit->setVisible(visible);
 	if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
 	mFilterEditor->setVisible(!visible);
 	mEditBtn->setVisible(!visible);
@@ -305,7 +305,7 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 
 void LLSidepanelAppearance::updateVerbs()
 {
-	bool is_look_info_visible = mLookInfo->getVisible();
+	bool is_look_info_visible = mOutfitEdit->getVisible();
 
 	if (mPanelOutfitsInventory && !is_look_info_visible)
 	{
@@ -344,7 +344,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
 {
 	LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data;
-	panel->toggleLookInfoPanel(FALSE);
+	panel->toggleOutfitEditPanel(FALSE);
 	panel->toggleWearableEditPanel(TRUE, wearable);
 }
 
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index aa2e67fd16..1d78e92a84 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -36,7 +36,7 @@
 #include "llinventoryobserver.h"
 
 #include "llinventory.h"
-#include "llpanellookinfo.h"
+#include "llpaneloutfitedit.h"
 
 class LLFilterEditor;
 class LLCurrentlyWornFetchObserver;
@@ -71,12 +71,12 @@ private:
 	void onEditButtonClicked();
 	void onBackButtonClicked();
 	void onEditWearBackClicked();
-	void toggleLookInfoPanel(BOOL visible);
+	void toggleOutfitEditPanel(BOOL visible);
 	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
 
 	LLFilterEditor*			mFilterEditor;
 	LLPanelOutfitsInventory* mPanelOutfitsInventory;
-	LLPanelLookInfo*		mLookInfo;
+	LLPanelOutfitEdit*		mOutfitEdit;
 	LLPanelEditWearable*	mEditWearable;
 
 	LLButton*					mOpenOutfitBtn;
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
new file mode 100644
index 0000000000..d4924562fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+  background_visible="true"
+  border="false"
+	height="570"
+	follows="all"
+	label="Look Info"
+	layout="topleft"
+	name="look_info"
+	width="320">
+	<panel.string
+		name="not_available">
+		(N\A)
+	</panel.string>
+	<panel.string
+		name="unknown">
+		(unknown)
+	</panel.string>
+	<panel
+		background_visible="true"
+		bevel_style="none"
+		follows="left|top|right|bottom"
+		height="530"
+		label="Outfit"
+		layout="topleft"
+		name="look_management_panel"
+		width="320">
+        <panel
+          follows="left|right|top"
+            header_visible="false"
+            layout="topleft"
+            min_height="300"
+            name="look_group"
+            title="Outfit Group"
+          top="0">
+            <panel
+                follows="left|right|top"
+                height="210"
+                layout="topleft"
+                top_pad="0"
+                name="look_info_group_bar"
+                width="295">
+                <text
+                    type="string"
+                    length="1"
+                    follows="left|top"
+                    height="20"
+                    layout="topleft"
+                    mouse_opaque="false"
+                    name="curr_look_name"
+                    width="175">
+                    Look: [LOOK]
+                </text>
+                <button
+                    follows="left|top"
+                    height="20"
+                    label="Wear"
+                    layout="topleft"
+                    name="wear_look_btn"
+                    left_pad="5"
+                    top_pad="-24"
+                    width="65" />
+                <button
+                    follows="left|top"
+                    height="20"
+                    layout="topleft"
+                    left_pad="5"
+                    name="back_btn"
+                    width="20" />
+            </panel>
+        </panel>
+
+        <panel
+            follows="left|right|top"
+          height="200"
+          layout="topleft"
+          name="outfit_display"
+          top_pad="10"
+          width="320">
+          
+              <scroll_list
+                  width="285"
+                  column_padding="0"
+                  draw_heading="false"
+                  draw_stripes="false"
+                  follows="left|top|bottom|right"
+                  layout="topleft"
+                  name="look_items_list"
+                  search_column="1"
+                  sort_column="2"
+                  left="0"
+                  height="200"
+                  top_pad="0">
+                  <scroll_list.columns
+                      label="Look Item"
+                      name="look_item"
+                      width="285" />
+                  <scroll_list.columns
+                      label="Outfit Item Sort"
+                      width="0"
+                      sort_column="look_item_sort"
+                      name="look_item_sort" />
+              </scroll_list>
+              <button
+                  follows="left|top|right"
+                  height="20"
+                  label="-"
+                  left_pad="0"
+                  layout="topleft"
+                  name="edit_wearable_btn"
+                  width="20" />
+        </panel>
+        <panel
+          follows="all"
+            header_visible="false"
+            min_height="100"
+          left="0"
+            name="inventory_group"
+            title="My Inventory"
+          top_pad="10"
+          width="230">
+            <panel
+                follows="left|right|top"
+                height="270"
+                name="lower_look_accordion"
+                width="295">
+                <panel
+                    follows="left|right|top"
+                    height="20"
+                    layout="topleft"
+                    name="inventory_bar"
+                    width="295">
+                    <text
+                        type="string"
+                        length="1"
+                        follows="left|top"
+                        height="20"
+                        layout="topleft"
+                        mouse_opaque="false"
+                        name="inventory_info_text"
+                        width="100">
+                        My Inventory
+                    </text>
+                    <combo_box
+                        follows="left"
+                        height="20"
+                        layout="topleft"
+                        left_pad="0"
+                        top_pad="-24"
+                        name="inventory_filter"
+                        tool_tip="Only show the selected inventory types"
+                        width="185" />
+                </panel>
+                <panel
+                    follows="left|right|top"
+                    height="20"
+                    layout="topleft"
+                    name="look_item_filter_bar"
+                    width="295">
+                    <filter_editor
+                        background_image="TextField_Search_Off"
+                        follows="left|top|right"
+                        font="SansSerif"
+                        label="Outfit Item Filter"
+                        layout="topleft"
+                        left="0"
+                        top_pad="0"
+                        width="270"
+                        height="20"
+                        name="look_item_filter"
+                        text_color="black"
+                        text_pad_left="25" />
+                </panel>
+                <panel
+                    follows="all"
+                    height="230"
+                    layout="topleft"
+                    name="inventory_panel"
+                    width="285">
+                    <inventory_panel
+                        allow_multi_select="true"
+                        border="true"
+                        follows="left|top|right|bottom"
+                        height="230"
+                        mouse_opaque="false"
+                        name="inventory_items"
+                        width="285"/>
+                </panel>
+            </panel>
+        </panel>
+	</panel>
+	<panel
+		follows="left|right|bottom"
+		height="30"
+		layout="topleft"
+		left="5"
+		top_pad="0"
+		name="button_bar"
+		width="295">
+		<button
+			follows="top|left|right"
+			height="25"
+			label="Add"
+			left="0"
+			layout="topleft"
+			name="add_item_btn"
+			width="90" />
+		<button
+			follows="left|right"
+			height="25"
+			left_pad="0"
+			label="Remove"
+			layout="topleft"
+			name="remove_item_btn"
+			width="90" />
+		<button
+			follows="top|left|right"
+			height="25"
+			label="UP"
+			left_pad="0"
+			layout="topleft"
+			name="up_btn"
+			width="55" />
+		<button
+			follows="left|top|right"
+			height="25"
+			label="DOWN"
+			left_pad="0"
+			layout="topleft"
+			name="down_btn"
+			width="60" />
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index b3d55fec65..735635f1a0 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -102,12 +102,12 @@ width="333">
 		name="newlook_btn"
 		 width="100" />-->
    <panel
-   class="panel_look_info"
-   filename="panel_look_info.xml"
+   class="panel_outfit_edit"
+   filename="panel_outfit_edit.xml"
    follows="all"
    layout="topleft"
    left="0"
-   name="panel_look_info"
+   name="panel_outfit_edit"
    top="35"
    visible="false" />
    <panel
-- 
cgit v1.2.3


From cb98c887da13cf5dc9ebae16028d7217e893c61e Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Mon, 29 Mar 2010 18:14:39 +0300
Subject: Fixed normal bug EXT-6048 (Shortcut for Groups Ctrl-Shift-G)

-Added tag for shortcut to the XML

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/131/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/menu_viewer.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index a08bc16066..ac31636ed2 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -159,7 +159,8 @@
         <menu_item_call
          label="My Groups"
          layout="topleft"
-         name="My Groups">
+         name="My Groups"
+         shortcut="control|shift|G">
             <menu_item_call.on_click
              function="SideTray.PanelPeopleTab"
              parameter="groups_panel" />
-- 
cgit v1.2.3


From 998c7fb94bea15b228053524228ae7eadd8e6de2 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Mon, 29 Mar 2010 12:45:29 -0700
Subject: VWR-17644 undo old 'es' overrides

---
 indra/newview/skins/default/xui/es/floater_tools.xml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index ac3a949821..d912f233f5 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -399,7 +399,7 @@ máximo" name="checkbox fullbright"/>
 			<text name="tex gen">
 				Detallado
 			</text>
-			<combo_box name="combobox texgen" width="86">
+			<combo_box name="combobox texgen">
 				<combo_box.item label="Por defecto" name="Default"/>
 				<combo_box.item label="Plano" name="Planar"/>
 			</combo_box>
@@ -442,9 +442,9 @@ máximo" name="checkbox fullbright"/>
 			<check_box label="Voltear" name="checkbox flip s"/>
 			<spinner label="Vertical (V)" name="TexScaleV"/>
 			<check_box label="Voltear" name="checkbox flip t"/>
-			<spinner label="Rotación" left="118" name="TexRot" width="62"/>
-			<spinner label="Repeticiones / Metro" left="118" name="rptctrl" width="62"/>
-			<button label="Aplicar" label_selected="Aplicar" left_delta="72" name="button apply"/>
+			<spinner label="Rotación" name="TexRot"/>
+			<spinner label="Repeticiones / Metro" name="rptctrl"/>
+			<button label="Aplicar" label_selected="Aplicar" name="button apply"/>
 			<text name="tex offset">
 				Desplazar
 			</text>
-- 
cgit v1.2.3


From 78436b3237e3ca23d0266f410e475a65ddf287aa Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Mon, 29 Mar 2010 12:51:01 -0700
Subject: EXT-6572 (major bug) DE workaround to remove the word "Kaufen" and
 leave just the L$ link to avoid obvious linguistic error due to poor source
 design, at Simone's request

---
 indra/newview/skins/default/xui/de/panel_status_bar.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 0e182fa417..803bd1b5ab 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -22,7 +22,7 @@
 		[AMT] L$
 	</panel.string>
 	<button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/>
-	<button label="Kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+	<button label=" " name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
 	<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
 		24:00 H PST
 	</text>
-- 
cgit v1.2.3


From ab6a2456c0b8c2bf5bc13cfe811aa58e81fa3327 Mon Sep 17 00:00:00 2001
From: Eli Linden <eli@lindenlab.com>
Date: Mon, 29 Mar 2010 13:16:12 -0700
Subject: VWR-17649 en_xui_change

---
 indra/newview/skins/default/xui/en/floater_tools.xml | 14 +++++++-------
 indra/newview/skins/default/xui/es/floater_tools.xml |  4 ++--
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index fd046c3695..957ab240ee 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2842,7 +2842,7 @@ even though the user gets a free copy.
          left_delta="0"
          name="button about land"
          top_pad="4"
-         width="112" />
+         width="125" />
         <check_box
          control_name="ShowParcelOwners"
          height="19"
@@ -2863,7 +2863,7 @@ even though the user gets a free copy.
          left="20"
          name="label_parcel_modify"
          top="152"
-         width="150">
+         width="240">
             Modify Parcel
         </text>
         <button
@@ -2875,7 +2875,7 @@ even though the user gets a free copy.
          left="30"
          name="button subdivide land"
          top="172"
-         width="112" />
+         width="125" />
         <button
          follows="left|top"
          height="23"
@@ -2885,7 +2885,7 @@ even though the user gets a free copy.
          left_delta="0"
          name="button join land"
          top_pad="4"
-         width="112" />
+         width="125" />
         <text
          type="string"
          length="1"
@@ -2896,7 +2896,7 @@ even though the user gets a free copy.
          left="20"
          name="label_parcel_trans"
          top="256"
-         width="150">
+         width="240">
             Land Transactions
         </text>
         <button
@@ -2908,7 +2908,7 @@ even though the user gets a free copy.
          left="30"
          name="button buy land"
          top="276"
-         width="112" />
+         width="125" />
         <button
          follows="left|top"
          height="23"
@@ -2918,6 +2918,6 @@ even though the user gets a free copy.
          left_delta="0"
          name="button abandon land"
          top_pad="4"
-         width="112" />
+         width="125" />
  </panel>
 </floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index d912f233f5..9c5fea9267 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -487,8 +487,8 @@ Gris = Público"/>
 		<text name="label_parcel_modify">
 			Modificar la parcela
 		</text>
-		<button label="Dividir" label_selected="Dividir" name="button subdivide land" width="140"/>
-		<button label="Inscribirse" label_selected="Inscribirse" name="button join land" width="140"/>
+		<button label="Dividir" label_selected="Dividir" name="button subdivide land"/>
+		<button label="Inscribirse" label_selected="Inscribirse" name="button join land"/>
 		<text name="label_parcel_trans">
 			Transacciones de terreno
 		</text>
-- 
cgit v1.2.3


From 9e211a3e209e6ef2ac55df04c07f4f3d36987580 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Mon, 29 Mar 2010 17:00:44 -0700
Subject: Default MediaShowOnOthers setting to false.

--HG--
branch : EXT-4880
---
 indra/newview/app_settings/settings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 73fb24e4eb..92226f4148 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4609,7 +4609,7 @@
     <key>Type</key>
     <string>Boolean</string>
     <key>Value</key>
-    <integer>1</integer>
+    <integer>0</integer>
   </map>
   <key>MediaShowOutsideParcel</key>
   <map>
-- 
cgit v1.2.3


From 72cf44849205f9f469befbe3f26a69f261e80a83 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Tue, 30 Mar 2010 10:00:40 +0300
Subject: Fixed normal bug EXT-6390 (inventory loses focus after renaming a
 inventory item)

- Discard NULL'ing item after renaming it, to avoid focus losing of this item

Reviewed by Samuel Kolb at https://codereview.productengine.com/secondlife/r/128/

--HG--
branch : product-engine
---
 indra/newview/llfolderview.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index f74d912842..1472f490bb 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -979,7 +979,6 @@ void LLFolderView::finishRenamingItem( void )
 	if( mRenameItem )
 	{
 		setSelectionFromRoot( mRenameItem, TRUE );
-		mRenameItem = NULL;
 	}
 
 	// List is re-sorted alphabeticly, so scroll to make sure the selected item is visible.
-- 
cgit v1.2.3


From 50802e68fc272e4dd78220210781ac036806d107 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 30 Mar 2010 12:14:37 +0300
Subject: Fixed normal bug EXT-5696 (chiclets bar minimal width doesn't match
 design specification) * Increased the minimal width of Chiclet panel up to 95
 px. * Also set default width between chiclet panel & im well the same as
 minimal (4 px).

For now minimal viewer width when all buttons are still visible (and have non-truncated labels in the 'EN' locale)
 with opened sidetray is 1042 px; with short Speak button (without text label) is 991 px.

Reviewed by Vadim at https://codereview.productengine.com/secondlife/r/126/
See also EXT-3397

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_bottomtray.xml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 58c5c11e51..b6d7bf8dd0 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -263,7 +263,7 @@
          top="0"
          name="chiclet_list_panel"
          width="189"
-         min_width="60"
+         min_width="95"
          user_resize="false"
          auto_resize="true">
 <!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
@@ -274,7 +274,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
              height="24"
              layout="topleft"
              left="1"
-             min_width="60"
+             min_width="95"
              name="chiclet_list"
              top="7"
              chiclet_padding="4"
@@ -330,7 +330,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_width="4"
          name="DUMMY"
          top="0"
-         width="5"/>
+         width="4"/>
         <layout_panel
          auto_resize="false"
          follows="right"
-- 
cgit v1.2.3


From 337ddc1593a1d8200952bb12b1ed77e94a98a1d8 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Tue, 30 Mar 2010 12:49:05 +0300
Subject: fixed EXT-6509 URL-name of object is shown as hyperlink in widget
 style Nearby chat

set allow_html to false for Message Header and Name field of Object Inspector

Reviewed by Vadim at https://codereview.productengine.com/secondlife/r/127/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/inspect_object.xml    | 1 +
 indra/newview/skins/default/xui/en/panel_chat_header.xml | 1 +
 2 files changed, 2 insertions(+)

diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 00e00b9694..b8a7222e8e 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -26,6 +26,7 @@ owner [OWNER]
   <string name="Touch">Touch</string>
   <string name="Sit">Sit</string>
   <text
+     allow_html="false"
      follows="all"
      font="SansSerifLarge"
      height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 250dadd390..9124ad528d 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -21,6 +21,7 @@
          top="3"
          width="18" />
     <text
+      allow_html="false"
       allow_scroll="false"
       v_pad = "7"
       read_only = "true"
-- 
cgit v1.2.3


From 8ba495722ce243c161cac9e880c2e5c88e23da3d Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Tue, 30 Mar 2010 15:19:42 +0300
Subject: fix for normal EXT-5882 Max. Contribution field on groups -> land and
 assets tab miscalculates after first group fetch. reviewed vsavchuk
 https://codereview.productengine.com/secondlife/r/133/

--HG--
branch : product-engine
---
 indra/newview/llpanelgrouplandmoney.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 9023afc602..f276df8573 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -1600,6 +1600,8 @@ void LLPanelGroupLandMoney::setGroupID(const LLUUID& id)
 		mImplementationp->mMoneySalesTabEHp->setGroupID(mGroupID);
 	}
 
+	mImplementationp->mBeenActivated = true;
+
 	activate();
 }
 
-- 
cgit v1.2.3


From c73dcb079991bad12458386274cec409013ad76b Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Tue, 30 Mar 2010 15:51:32 +0300
Subject: Fixed bug EXT-6270 (No confirm teleport dialog appears, while
 teleporting from teleport history tab).

Added teleport confirmation dialog to the teleport history panel.

Reviewed by Mike: https://codereview.productengine.com/secondlife/r/135/

--HG--
branch : product-engine
---
 indra/newview/llpanelteleporthistory.cpp           | 28 ++++++++++++++++++++--
 indra/newview/llpanelteleporthistory.h             |  3 +++
 .../newview/skins/default/xui/en/notifications.xml | 12 ++++++++++
 3 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 90c8f2551f..0a34531eee 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -348,7 +348,7 @@ LLContextMenu* LLTeleportHistoryPanel::ContextMenu::createMenu()
 
 void LLTeleportHistoryPanel::ContextMenu::onTeleport()
 {
-	LLTeleportHistoryStorage::getInstance()->goToItem(mIndex);
+	confirmTeleport(mIndex);
 }
 
 void LLTeleportHistoryPanel::ContextMenu::onInfo()
@@ -507,7 +507,7 @@ void LLTeleportHistoryPanel::onTeleport()
 		return;
 
 	// teleport to existing item in history, so we don't add it again
-	mTeleportHistory->goToItem(itemp->getIndex());
+	confirmTeleport(itemp->getIndex());
 }
 
 /*
@@ -1058,3 +1058,27 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param
 		mLastSelectedFlatlList->resetSelection();
 	}
 }
+
+// static
+void LLTeleportHistoryPanel::confirmTeleport(S32 hist_idx)
+{
+	LLSD args;
+	args["HISTORY_ENTRY"] = LLTeleportHistoryStorage::getInstance()->getItems()[hist_idx].mTitle;
+	LLNotificationsUtil::add("TeleportToHistoryEntry", args, LLSD(),
+		boost::bind(&LLTeleportHistoryPanel::onTeleportConfirmation, _1, _2, hist_idx));
+}
+
+// Called when user reacts upon teleport confirmation dialog.
+// static
+bool LLTeleportHistoryPanel::onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+	if (0 == option)
+	{
+		// Teleport to given history item.
+		LLTeleportHistoryStorage::getInstance()->goToItem(hist_idx);
+	}
+
+	return false;
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 4eeaec7705..5e2ccc0c93 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -103,6 +103,9 @@ private:
 	bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
 	void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
 
+	static void confirmTeleport(S32 hist_idx);
+	static bool onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx);
+
 	LLTeleportHistoryStorage*	mTeleportHistory;
 	LLAccordionCtrl*		mHistoryAccordion;
 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 6d18111be0..8501143fe6 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3110,6 +3110,18 @@ Teleport to [PICK]?
      yestext="Teleport"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="TeleportToHistoryEntry"
+   type="alertmodal">
+Teleport to [HISTORY_ENTRY]?
+    <usetemplate
+     ignoretext="Confirm that I want to teleport to a history location"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="Teleport"/>
+  </notification>
+
   <notification
    icon="alert.tga"
    label="Message everyone in your Estate"
-- 
cgit v1.2.3


From 67a7112a7cfae8633cfd903e24cec8b003a3cee9 Mon Sep 17 00:00:00 2001
From: Mike Antipov <mantipov@productengine.com>
Date: Tue, 30 Mar 2010 17:42:05 +0300
Subject: Completed normal task EXT-3397 (Hide well buttons if there are no
 active IM sessions and unresolved notifications) * Implemented hiding of
 bottom tray's wells if there are no active IMs or unresolved notifications
 (via LLBottomTray::notifyParent)

* Also refactored initializing code to init a pointer to a chiclet panel and map with bottomtray parts in postBuild BEFORE initializing start wells' visibility.

For now minimal viewer width when all buttons are still visible (and have non-truncated labels in the 'EN' locale) with opened sidetray is 1041 px; with short Speak button (without text label) is 990 px. (with implemented patch in https://codereview.productengine.com/secondlife/r/126/)

Each well button takes 37 px (with a padding). So, they can free up to 74 px when invisible.

reviewed by Vadim at https://codereview.productengine.com/secondlife/r/136/

--HG--
branch : product-engine
---
 indra/newview/llbottomtray.cpp                     | 62 +++++++++++++++++++---
 indra/newview/llbottomtray.h                       | 13 +++++
 indra/newview/llchiclet.cpp                        |  5 ++
 .../skins/default/xui/en/panel_bottomtray.xml      | 31 ++---------
 4 files changed, 78 insertions(+), 33 deletions(-)

diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 34cb6fd2eb..41bee540fc 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -160,10 +160,6 @@ LLBottomTray::LLBottomTray(const LLSD&)
 
 	LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml");
 
-	mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
-
-	mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
-
 	LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
 
 	//this is to fix a crash that occurs because LLBottomTray is a singleton
@@ -171,8 +167,6 @@ LLBottomTray::LLBottomTray(const LLSD&)
 	//destroyed LLBottomTray requires some subsystems that are long gone
 	//LLUI::getRootView()->addChild(this);
 
-	initStateProcessedObjectMap();
-
 	// Necessary for focus movement among child controls
 	setFocusRoot(TRUE);
 
@@ -371,6 +365,23 @@ void LLBottomTray::setVisible(BOOL visible)
 		gFloaterView->setSnapOffsetBottom(0);
 }
 
+S32 LLBottomTray::notifyParent(const LLSD& info)
+{
+	if(info.has("well_empty")) // implementation of EXT-3397
+	{
+		const std::string chiclet_name = info["well_name"];
+
+		// only "im_well" or "notification_well" names are expected.
+		// They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification>
+		llassert("im_well" == chiclet_name || "notification_well" == chiclet_name);
+
+		BOOL should_be_visible = !info["well_empty"];
+		showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible);
+		return 1;
+	}
+	return LLPanel::notifyParent(info);
+}
+
 void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
 {
 	// We should show BottomTrayContextMenu in last  turn
@@ -487,6 +498,15 @@ BOOL LLBottomTray::postBuild()
 
 	mNearbyChatBar->getChatBox()->setContextMenu(NULL);
 
+	mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
+	mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
+
+	initStateProcessedObjectMap();
+
+	// update wells visibility:
+	showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
+	showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+
 	return TRUE;
 }
 
@@ -855,6 +875,7 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width)
 {
 	lldebugs << "Trying to show object type: " << shown_object_type << llendl;
+	llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
 
 	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
 	if (NULL == panel)
@@ -886,6 +907,7 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
 {
 	lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
+	llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
 
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
@@ -963,6 +985,7 @@ void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_
 
 void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width)
 {
+	llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
 	{
@@ -1046,6 +1069,7 @@ void LLBottomTray::processExtendButtons(S32* available_width)
 
 void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
 {
+	llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
 	{
@@ -1126,6 +1150,7 @@ void LLBottomTray::initStateProcessedObjectMap()
 
 void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
 {
+	llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
 	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
 	if (NULL == panel)
 	{
@@ -1264,4 +1289,29 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
 	return is_set;
 }
 
+void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
+{
+	llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
+
+	const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel";
+
+	LLView * panel = getChild<LLView>(panel_name);
+
+	// if necessary visibility is set nothing to do here
+	if (panel->getVisible() == (BOOL)visible) return;
+
+	S32 panel_width = panel->getRect().getWidth();
+	panel->setVisible(visible);
+
+	if (visible)
+	{
+		// method assumes that input param is a negative value
+		processWidthDecreased(-panel_width);
+	}
+	else
+	{
+		processWidthIncreased(panel_width);
+	}
+}
+
 //EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 18c14e5e19..3c45777645 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -83,6 +83,8 @@ public:
 
 	virtual void setVisible(BOOL visible);
 
+	/*virtual*/ S32 notifyParent(const LLSD& info);
+
 	// Implements LLVoiceClientStatusObserver::onChange() to enable the speak
 	// button when voice is available
 	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
@@ -116,6 +118,8 @@ private:
 		, RS_BUTTON_MOVEMENT	= 0x0010
 		, RS_BUTTON_GESTURES	= 0x0020
 		, RS_BUTTON_SPEAK		= 0x0040
+		, RS_IM_WELL			= 0x0080
+		, RS_NOTIFICATION_WELL	= 0x0100
 
 		/**
 		 * Specifies buttons which can be hidden when bottom tray is shrunk.
@@ -184,6 +188,15 @@ private:
 	 */
 	bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
 
+	/**
+	 * Shows/hides panel with specified well button (IM or Notification)
+	 *
+	 * @param[in] object_type - type of well button to be processed.
+	 *		Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL.
+	 * @param[in] visible - flag specified whether button should be shown or hidden.
+	 */
+	void showWellButton(EResizeState object_type, bool visible);
+
 	MASK mResizeState;
 
 	typedef std::map<EResizeState, LLPanel*> state_object_map_t;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 1f92686a43..e39384b7b2 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -229,6 +229,11 @@ void LLSysWellChiclet::setNewMessagesState(bool new_messages)
 void LLSysWellChiclet::updateWidget(bool is_window_empty)
 {
 	mButton->setEnabled(!is_window_empty);
+
+	LLSD params;
+	params["well_empty"] = is_window_empty;
+	params["well_name"] = getName();
+	notifyParent(params);
 }
 // virtual
 BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index b6d7bf8dd0..c34a367c32 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -339,8 +339,8 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
          min_height="28"
          top="0"
          name="im_well_panel"
-         width="35"
-         min_width="35"
+         width="37"
+         min_width="37"
          user_resize="false">
             <chiclet_im_well
              max_displayed_count="99"
@@ -388,22 +388,10 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
          layout="topleft"
          min_height="28"
          top="0"
-         left_pad="3"
          name="notification_well_panel"
-         width="40"
-         min_width="40"
+         width="37"
+         min_width="37"
          user_resize="false">
-         <icon
-         auto_resize="false"
-         color="0 0 0 0"
-         follows="left|right"
-         height="10"
-         image_name="spacer24.tga"
-         layout="topleft"
-         left="0"
-         min_width="4"
-         top="0"
-         width="5" />
             <chiclet_notification
              flash_period="0.25"
              follows="right"
@@ -434,17 +422,6 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
                    function="Button.SetDockableFloaterToggle"
                    parameter="notification_well_window" />
               </button>
-         <icon
-         auto_resize="false"
-         color="0 0 0 0"
-         follows="left|right"
-         height="10"
-         image_name="spacer24.tga"
-         layout="topleft"
-         left="0"
-         min_width="4"
-         top="0"
-         width="5" />
 	    </chiclet_notification>
         </layout_panel>
     </layout_stack>
-- 
cgit v1.2.3


From 1751e6add7e9957106f628816f0808c92a67cc6c Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Tue, 30 Mar 2010 19:21:30 +0300
Subject: Fixed gcc-4.1 build.

--HG--
branch : product-engine
---
 indra/newview/llvoiceclient.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index d8319f3cc3..2238acd643 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1151,8 +1151,8 @@ private:
 	void load();
 	void save();
 
-	static F32 LLSpeakerVolumeStorage::transformFromLegacyVolume(F32 volume_in);
-	static F32 LLSpeakerVolumeStorage::transformToLegacyVolume(F32 volume_in);
+	static F32 transformFromLegacyVolume(F32 volume_in);
+	static F32 transformToLegacyVolume(F32 volume_in);
 
 	typedef std::map<LLUUID, F32> speaker_data_map_t;
 	speaker_data_map_t mSpeakersData;
-- 
cgit v1.2.3


From 58de782e08bb704aca5187c4983ee9c5698659a4 Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Wed, 31 Mar 2010 16:01:50 +0300
Subject: Fixed bug EXT-4436 Clicking labels/text plays 'click' sound.

Disabled playing sound when a textbox is clicked.

Reviewed by Sam: https://codereview.productengine.com/secondlife/r/140/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/widgets/text.xml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 855584a0db..998ec5b170 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -15,6 +15,7 @@
       bg_visible="false" 
       border_visible="false" 
       hover="false" 
+      sound_flags="0"
       text_color="LabelTextColor"
       v_pad="0"
       max_length="4096"/>
-- 
cgit v1.2.3


From 8ef5fd0e144af53e6044c0dfc15fda9b36bdd85a Mon Sep 17 00:00:00 2001
From: Vadim Savchuk <vsavchuk@productengine.com>
Date: Wed, 31 Mar 2010 16:04:03 +0300
Subject: Fixed bug EXT-6628 IM floater: unable to open 'Pay' floater by click
 on 'Pay' button if floater height was reduced.

Reason: Height of the layout stack containing buttons was too small, hence
when you decrease the window height the bottommost buttons might move beyond
its container, becoming unclickable.

Fix: Increased height of the layout stack for it to reach the bottom of the
floater (occupying all visible area).

Reviewed by Sam: https://codereview.productengine.com/secondlife/r/141/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_im_control_panel.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 88566ea037..7d7e21d4b0 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -16,7 +16,7 @@
      border_size="0"
      clip="false"
      follows="all"
-     height="168"
+     height="183"
      layout="topleft"
      left="5"
      name="button_stack"
-- 
cgit v1.2.3


From 0a0f6dec5f6128990f4116c1f90e19691e30c3d2 Mon Sep 17 00:00:00 2001
From: Yuri Chebotarev <ychebotarev@productengine.com>
Date: Wed, 31 Mar 2010 16:46:16 +0300
Subject: fix for normal EXT-6346 SLapp group inspector link opens group
 profile instead https://codereview.productengine.com/secondlife/r/138/
 reviwed vsavchuk

--HG--
branch : product-engine
---
 indra/newview/llgroupactions.cpp | 8 +++++++-
 indra/newview/llgroupactions.h   | 5 +++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 00e2365ffd..d4eecc8c48 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -105,7 +105,7 @@ public:
 		{
 			if (group_id.isNull())
 				return true;
-			LLGroupActions::show(group_id);
+			LLGroupActions::inspect(group_id);
 			return true;
 		}
 		return false;
@@ -246,6 +246,12 @@ static bool isGroupUIVisible()
 	return panel->isInVisibleChain();
 }
 
+// static 
+void LLGroupActions::inspect(const LLUUID& group_id)
+{
+	LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", group_id));
+}
+
 // static
 void LLGroupActions::show(const LLUUID& group_id)
 {
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index e99df86cd9..7e00f2dbe3 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -65,6 +65,11 @@ public:
 	 */
 	static void show(const LLUUID& group_id);
 
+	/**
+	 * Show group inspector floater.
+	 */
+	static void LLGroupActions::inspect(const LLUUID& group_id);
+
 	/**
 	 * Refresh group information panel.
 	 */
-- 
cgit v1.2.3


From 1e74f573bbb7e9d3a6cf3134d3373a202912c721 Mon Sep 17 00:00:00 2001
From: Paul Guslisty <pguslisty@productengine.com>
Date: Wed, 31 Mar 2010 16:50:06 +0300
Subject: Fixed normal bug EXT-6505 (Certain gear icon buttons should not have
 chevrons)

- Created an icon that is just the gear icon, no dropdown chevron in places where there is no context menu, notably in: Nearby media popover, Master volume popover and Edit Floater

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/137/

--HG--
branch : product-engine
---
 .../default/textures/windows/Icon_Gear_Background.png   | Bin 373 -> 370 bytes
 .../default/textures/windows/Icon_Gear_Foreground.png   | Bin 373 -> 371 bytes
 .../skins/default/textures/windows/Icon_Gear_Over.png   | Bin 279 -> 293 bytes
 .../skins/default/textures/windows/Icon_Gear_Press.png  | Bin 396 -> 365 bytes
 indra/newview/skins/default/xui/en/floater_tools.xml    |  12 ++++++------
 .../skins/default/xui/en/panel_volume_pulldown.xml      |   4 ++--
 6 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png
index db74b93afd..93d62a8d4f 100644
Binary files a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png and b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png
index 1032e45f7e..b2b2a77a88 100644
Binary files a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png and b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
index 01dbde102b..67bd399358 100644
Binary files a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png and b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png
index 6614bdd165..6fc3744d6b 100644
Binary files a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png and b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png differ
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index fd046c3695..8e7587f4cd 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2701,15 +2701,15 @@ even though the user gets a free copy.
 			<button
 			 follows="top|left"
 			 tool_tip="Edit this Media"
-			 height="18"
-			 image_disabled="OptionsMenu_Disabled"
-			 image_selected="OptionsMenu_Press"
-			 image_unselected="OptionsMenu_Off"
+			 height="12"
+			 image_disabled="Icon_Gear_Foreground"
+			 image_selected="Icon_Gear_Background"
+			 image_unselected="Icon_Gear_Press"
 			 layout="topleft"
 			 left_pad="10"
 			 name="edit_media"
-			 top_delta="0"
-			 width="18">
+			 top_delta="3"
+			 width="12">
 				<button.commit_callback
 				function="BuildTool.EditMedia"/>
 			</button>
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
index cd66c56ca1..7b22b2cce1 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -32,9 +32,9 @@
    parameter="MuteAudio" />
   </slider>
   <button
-    left="7"
+    left="10"
     top_pad="9"
-    width="18"
+    width="12"
     height="12"
     follows="top|left"
     name="prefs_btn"
-- 
cgit v1.2.3


From 3e11f81b693cf17e767d8890a5d02ae2c152d20f Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 31 Mar 2010 15:24:10 +0100
Subject: EXT-2418 - improved cursors for sit/open/buy - the neglected Linux
 part.

---
 indra/llwindow/llwindowsdl.cpp     |   3 +++
 indra/newview/res-sdl/toolbuy.BMP  | Bin 0 -> 3126 bytes
 indra/newview/res-sdl/toolopen.BMP | Bin 0 -> 3126 bytes
 indra/newview/res-sdl/toolsit.BMP  | Bin 0 -> 3126 bytes
 4 files changed, 3 insertions(+)
 create mode 100644 indra/newview/res-sdl/toolbuy.BMP
 create mode 100644 indra/newview/res-sdl/toolopen.BMP
 create mode 100644 indra/newview/res-sdl/toolsit.BMP

diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 4d25b4134e..399d284402 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -2074,6 +2074,9 @@ void LLWindowSDL::initCursors()
 	mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0);
 	mSDLCursors[UI_CURSOR_TOOLMEDIAOPEN] = makeSDLCursorFromBMP("toolmediaopen.BMP",0,0);
 	mSDLCursors[UI_CURSOR_PIPETTE] = makeSDLCursorFromBMP("lltoolpipette.BMP",2,28);
+	mSDLCursors[UI_CURSOR_TOOLSIT] = makeSDLCursorFromBMP("toolsit.BMP",20,15);
+	mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",20,15);
+	mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",20,15);
 
 	if (getenv("LL_ATI_MOUSE_CURSOR_BUG") != NULL) {
 		llinfos << "Disabling cursor updating due to LL_ATI_MOUSE_CURSOR_BUG" << llendl;
diff --git a/indra/newview/res-sdl/toolbuy.BMP b/indra/newview/res-sdl/toolbuy.BMP
new file mode 100644
index 0000000000..07e9273721
Binary files /dev/null and b/indra/newview/res-sdl/toolbuy.BMP differ
diff --git a/indra/newview/res-sdl/toolopen.BMP b/indra/newview/res-sdl/toolopen.BMP
new file mode 100644
index 0000000000..5b87979304
Binary files /dev/null and b/indra/newview/res-sdl/toolopen.BMP differ
diff --git a/indra/newview/res-sdl/toolsit.BMP b/indra/newview/res-sdl/toolsit.BMP
new file mode 100644
index 0000000000..8ce59ae97a
Binary files /dev/null and b/indra/newview/res-sdl/toolsit.BMP differ
-- 
cgit v1.2.3


From b3bbc9d9ac2f35d38e6fa9a7df00cec1f2e7ee3e Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 31 Mar 2010 11:05:23 -0400
Subject: Fix for crash in process_avatar_movement.

gAgentAvatarp pointer was being checked for null instead of the local avatarp.
---
 indra/newview/llviewermessage.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6dc0983f10..5f8c03b545 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4031,7 +4031,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 	//clear animation flags
 	avatarp = (LLVOAvatar *)gObjectList.findObject(uuid);
 
-	if (!isAgentAvatarValid())
+	if (!avatarp)
 	{
 		// no agent by this ID...error?
 		LL_WARNS("Messaging") << "Received animation state for unknown avatar" << uuid << LL_ENDL;
-- 
cgit v1.2.3


From eff5d1fbff9ed00762264f364c860a9f1c75902e Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Wed, 31 Mar 2010 18:16:24 +0300
Subject: No ticket, fixed Linux build.

--HG--
branch : product-engine
---
 indra/newview/llgroupactions.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index 7e00f2dbe3..55cae4db0b 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -68,7 +68,7 @@ public:
 	/**
 	 * Show group inspector floater.
 	 */
-	static void LLGroupActions::inspect(const LLUUID& group_id);
+	static void inspect(const LLUUID& group_id);
 
 	/**
 	 * Refresh group information panel.
-- 
cgit v1.2.3


From 7263906f495407cdb49c80b2ad17f845fa2f1c81 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Wed, 31 Mar 2010 18:19:16 +0300
Subject: Fixed normal bug EXT-6541(snapshot preview opens before login curtain
 lifts) - changed the order of main view panels so the progress_view overlaps
 the snapshot_floater_view. Reviewed by Vadim Savchuk at
 https://codereview.productengine.com/secondlife/r/144/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/main_view.xml | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index e8f9d65be5..b2e4a7ad95 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -163,15 +163,6 @@
                    name="notify_container"
                    tab_group="-2"
                    width="1024"/>
-  <panel top="0"
-         follows="all"
-         height="768"
-         mouse_opaque="true"
-         name="progress_view"
-         filename="panel_progress.xml" 
-         class="progress_view"
-         width="1024"
-         visible="false"/>
   <panel top="0"
         follows="all"
         mouse_opaque="false"
@@ -190,6 +181,15 @@
                            visible="false"
                            width="1024"/>
   </panel>
+  <panel top="0"
+         follows="all"
+         height="768"
+         mouse_opaque="true"
+         name="progress_view"
+         filename="panel_progress.xml"
+         class="progress_view"
+         width="1024"
+         visible="false"/>
   <panel top="0"
          follows="all"
          height="768"
-- 
cgit v1.2.3


From 8f5e094757b6ac0ee7f2eeb1a1f386938b390981 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Wed, 31 Mar 2010 16:46:57 +0100
Subject: recent crash regression fix from Seraph.

---
 indra/newview/llviewermessage.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 6dc0983f10..5f8c03b545 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4031,7 +4031,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 	//clear animation flags
 	avatarp = (LLVOAvatar *)gObjectList.findObject(uuid);
 
-	if (!isAgentAvatarValid())
+	if (!avatarp)
 	{
 		// no agent by this ID...error?
 		LL_WARNS("Messaging") << "Received animation state for unknown avatar" << uuid << LL_ENDL;
-- 
cgit v1.2.3


From d4fef262bc346331cdc8010ada1b5f5d9c8dd647 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 31 Mar 2010 12:05:51 -0400
Subject: EXT-5581 : Centralize is_asset_fetch/knowlable into asset dictionary

Took out some ugly case statements and stuck those functions into the asset dictionary instead.  This makes the code a lot more centralized/extensible since if we ever add assets, it'll be clear that their fetch/knowable fields need to be added (versus that logic being in some obscure case statement).
---
 indra/llcommon/llassettype.cpp            | 98 ++++++++++++++++++++-----------
 indra/llcommon/llassettype.h              |  7 ++-
 indra/llmessage/lltransfersourceasset.cpp | 49 +---------------
 indra/llmessage/lltransfersourceasset.h   | 20 -------
 indra/newview/llinventorybridge.cpp       |  2 +-
 5 files changed, 71 insertions(+), 105 deletions(-)

diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 6d5b12d840..e5068f1bc5 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -45,19 +45,25 @@ struct AssetEntry : public LLDictionaryEntry
 	AssetEntry(const char *desc_name,
 			   const char *type_name, 	// 8 character limit!
 			   const char *human_name, 	// for decoding to human readable form; put any and as many printable characters you want in each one
-			   bool can_link) 			// can you create a link to this type?
+			   BOOL can_link, 			// can you create a link to this type?
+			   BOOL can_fetch, 			// can you fetch this asset by ID?
+			   BOOL can_know) 			// can you see this asset's ID?
 		:
 		LLDictionaryEntry(desc_name),
 		mTypeName(type_name),
 		mHumanName(human_name),
-		mCanLink(can_link)
+		mCanLink(can_link),
+		mCanFetch(can_fetch),
+		mCanKnow(can_know)
 	{
 		llassert(strlen(mTypeName) <= 8);
 	}
 
 	const char *mTypeName;
 	const char *mHumanName;
-	bool mCanLink;
+	BOOL mCanLink;
+	BOOL mCanFetch;
+	BOOL mCanKnow;
 };
 
 class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -69,32 +75,32 @@ public:
 
 LLAssetDictionary::LLAssetDictionary()
 {
-	//       												   DESCRIPTION			TYPE NAME	HUMAN NAME			CAN LINK?	
-	//      												  |--------------------|-----------|-------------------|-----------|
-	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			FALSE));
-	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			FALSE));
-	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		FALSE));
-	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			FALSE));
-	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	FALSE));
-	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			TRUE));
-	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			TRUE));
-	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		FALSE));
-	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			TRUE));
-	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		FALSE));
-	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		FALSE));
-	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		FALSE));
-	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		TRUE));
-	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			FALSE));
-	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		FALSE));
-	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		FALSE));
-	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		FALSE));
-	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			TRUE));
-	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			FALSE));
-
-	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"symbolic link",	FALSE));
-	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"symbolic folder link", FALSE));
-
-	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		FALSE));
+	//       												   DESCRIPTION			TYPE NAME	HUMAN NAME			CAN LINK?   CAN FETCH?  CAN KNOW?	
+	//      												  |--------------------|-----------|-------------------|-----------|-----------|---------|
+	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			FALSE,		FALSE,		TRUE));
+	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			FALSE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			FALSE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			TRUE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			TRUE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		FALSE,		FALSE,		TRUE));
+	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			TRUE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		TRUE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		FALSE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			TRUE,		TRUE,		TRUE));
+	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			FALSE,		FALSE,		FALSE));
+
+	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"sym link",			FALSE,		FALSE,		TRUE));
+	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"sym folder link",	FALSE,		FALSE,		TRUE));
+
+	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		FALSE,		FALSE,		FALSE));
 };
 
 // static
@@ -196,7 +202,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_
 }
 
 // static
-bool LLAssetType::lookupCanLink(EType asset_type)
+BOOL LLAssetType::lookupCanLink(EType asset_type)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
 	const AssetEntry *entry = dict->lookup(asset_type);
@@ -204,18 +210,18 @@ bool LLAssetType::lookupCanLink(EType asset_type)
 	{
 		return entry->mCanLink;
 	}
-	return false;
+	return FALSE;
 }
 
 // static
 // Not adding this to dictionary since we probably will only have these two types
-bool LLAssetType::lookupIsLinkType(EType asset_type)
+BOOL LLAssetType::lookupIsLinkType(EType asset_type)
 {
 	if (asset_type == AT_LINK || asset_type == AT_LINK_FOLDER)
 	{
-		return true;
+		return TRUE;
 	}
-	return false;
+	return FALSE;
 }
 
 // static
@@ -225,3 +231,27 @@ const std::string &LLAssetType::badLookup()
 	return sBadLookup;
 
 }
+
+// static
+BOOL LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type)
+{
+	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+	const AssetEntry *entry = dict->lookup(asset_type);
+	if (entry)
+	{
+		return entry->mCanFetch;
+	}
+	return FALSE;
+}
+
+// static
+BOOL LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
+{
+	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+	const AssetEntry *entry = dict->lookup(asset_type);
+	if (entry)
+	{
+		return entry->mCanKnow;
+	}
+	return FALSE;
+}
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index c7bbc2e74a..4440e1bac3 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -143,9 +143,12 @@ public:
 	static EType 				getType(const std::string& desc_name);
 	static const std::string&	getDesc(EType asset_type);
 
-	static bool 				lookupCanLink(EType asset_type);
-	static bool 				lookupIsLinkType(EType asset_type);
+	static BOOL 				lookupCanLink(EType asset_type);
+	static BOOL 				lookupIsLinkType(EType asset_type);
 
+	static BOOL 				lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
+	static BOOL 				lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
+	
 	static const std::string&	badLookup(); // error string when a lookup fails
 
 protected:
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index abfb432020..43f7c07e94 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -60,7 +60,7 @@ void LLTransferSourceAsset::initTransfer()
 		// to the simulator. This is subset of assets we allow to be
 		// simply pulled straight from the asset system.
 		LLUUID* tidp;
-		if(is_asset_fetch_by_id_allowed(mParams.getAssetType()))
+		if(LLAssetType::lookupIsAssetFetchByIDAllowed(mParams.getAssetType()))
 		{
 			tidp = new LLUUID(getID());
 			gAssetStorage->getAssetData(
@@ -257,50 +257,3 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
 
 	return TRUE;
 }
-
-/**
- * Helper functions
- */
-bool is_asset_fetch_by_id_allowed(LLAssetType::EType type)
-{
-	// *FIX: Make this list smaller.
-	bool rv = false;
-	switch(type)
-	{
-		case LLAssetType::AT_SOUND:
-		case LLAssetType::AT_LANDMARK:
-		case LLAssetType::AT_CLOTHING:
-		case LLAssetType::AT_BODYPART:
-		case LLAssetType::AT_ANIMATION:
-		case LLAssetType::AT_GESTURE:
-			rv = true;
-			break;
-		default:
-			break;
-	}
-	return rv;
-}
-
-bool is_asset_id_knowable(LLAssetType::EType type)
-{
-	// *FIX: Make this list smaller.
-	bool rv = false;
-	switch(type)
-	{
-		case LLAssetType::AT_TEXTURE:
-		case LLAssetType::AT_SOUND:
-		case LLAssetType::AT_LANDMARK:
-		case LLAssetType::AT_CLOTHING:
-		case LLAssetType::AT_NOTECARD:
-		case LLAssetType::AT_BODYPART:
-		case LLAssetType::AT_ANIMATION:
-		case LLAssetType::AT_GESTURE:
-		case LLAssetType::AT_LINK:
-		case LLAssetType::AT_LINK_FOLDER:
-			rv = true;
-			break;
-		default:
-			break;
-	}
-	return rv;
-}
diff --git a/indra/llmessage/lltransfersourceasset.h b/indra/llmessage/lltransfersourceasset.h
index 70b09b6aaf..8616595654 100644
--- a/indra/llmessage/lltransfersourceasset.h
+++ b/indra/llmessage/lltransfersourceasset.h
@@ -84,24 +84,4 @@ protected:
 	S32 mCurPos;
 };
 
-/**
- * @brief Quick check to see if the asset allows direct download.
- *
- * This might not be the right place for this function call, but it
- * originally started life inside the LLTransferSourceAsset code.
- * @param type The type of asset.
- * @return Returns true if the asset can be fetched by id.
- */
-bool is_asset_fetch_by_id_allowed(LLAssetType::EType type);
-
-/**
- * @brief Quick check to see if all asset data can be known by the viewer.
- *
- * This might not be the right place for this function call, but it
- * originally started life inside the LLTransferSourceAsset code.
- * @param type The type of asset.
- * @return Returns true if the asset id can be transmitted to the viewer.
- */
-bool is_asset_id_knowable(LLAssetType::EType type);
-
 #endif // LL_LLTRANSFERSOURCEASSET_H
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1b6fa6dd9a..0fbf3148ac 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -596,7 +596,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 				LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID);
 				if (inv_item)
 				{
-					is_asset_knowable = is_asset_id_knowable(inv_item->getType());
+					is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(inv_item->getType());
 				}
 				if ( !is_asset_knowable // disable menu item for Inventory items with unknown asset. EXT-5308
 					 || (! ( isItemPermissive() || gAgent.isGodlike() ) )
-- 
cgit v1.2.3


From 1ee1004e126293bbfc2fd901f0e6f73e1952cc73 Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 31 Mar 2010 15:16:44 -0400
Subject: EXT-6666 : Enable debug avatar textures in God, versus non-Release,
 mode

---
 indra/newview/llfloateravatartextures.cpp | 92 +++++++++++++++----------------
 indra/newview/llviewermenu.cpp            |  7 ++-
 2 files changed, 47 insertions(+), 52 deletions(-)

diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 8c7899af3e..18db60705b 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -31,15 +31,14 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-
 #include "llfloateravatartextures.h"
 
+#include "llagent.h"
+#include "llagentwearables.h"
 #include "lltexturectrl.h"
-
 #include "lluictrlfactory.h"
 #include "llviewerobjectlist.h"
 #include "llvoavatar.h"
-#include "llagentwearables.h"
 
 using namespace LLVOAvatarDefines;
 
@@ -75,7 +74,6 @@ void LLFloaterAvatarTextures::draw()
 	LLFloater::draw();
 }
 
-#if !LL_RELEASE_FOR_DOWNLOAD
 static void update_texture_ctrl(LLVOAvatar* avatarp,
 								 LLTextureCtrl* ctrl,
 								 ETextureIndex te)
@@ -132,72 +130,68 @@ static LLVOAvatar* find_avatar(const LLUUID& id)
 
 void LLFloaterAvatarTextures::refresh()
 {
-	LLVOAvatar *avatarp = find_avatar(mID);
-	if (avatarp)
+	if (gAgent.isGodlike())
 	{
-		std::string fullname;
-		if (gCacheName->getFullName(avatarp->getID(), fullname))
+		LLVOAvatar *avatarp = find_avatar(mID);
+		if (avatarp)
 		{
-			setTitle(mTitle + ": " + fullname);
+			std::string fullname;
+			if (gCacheName->getFullName(avatarp->getID(), fullname))
+			{
+				setTitle(mTitle + ": " + fullname);
+			}
+			for (U32 i=0; i < TEX_NUM_INDICES; i++)
+			{
+				update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i));
+			}
 		}
-		for (U32 i=0; i < TEX_NUM_INDICES; i++)
+		else
 		{
-			update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i));
+			setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")");
 		}
 	}
-	else
-	{
-		setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")");
-	}
 }
 
-#else
-
-void LLFloaterAvatarTextures::refresh()
-{
-}
-
-#endif
-
 // static
 void LLFloaterAvatarTextures::onClickDump(void* data)
 {
-#if !LL_RELEASE_FOR_DOWNLOAD
-	LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data;
-	LLVOAvatar* avatarp = find_avatar(self->mID);
-	if (!avatarp) return;
-
-	for (S32 i = 0; i < avatarp->getNumTEs(); i++)
+	if (gAgent.isGodlike())
 	{
-		const LLTextureEntry* te = avatarp->getTE(i);
-		if (!te) continue;
+		LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data;
+		LLVOAvatar* avatarp = find_avatar(self->mID);
+		if (!avatarp) return;
 
-		if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))
+		for (S32 i = 0; i < avatarp->getNumTEs(); i++)
 		{
-			LLUUID id = IMG_DEFAULT_AVATAR;
-			EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i);
-			LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
-			if (wearable)
+			const LLTextureEntry* te = avatarp->getTE(i);
+			if (!te) continue;
+
+			if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))
 			{
-				LLLocalTextureObject *lto = wearable->getLocalTextureObject(i);
-				if (lto)
+				LLUUID id = IMG_DEFAULT_AVATAR;
+				EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i);
+				LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+				if (wearable)
 				{
-					id = lto->getID();
+					LLLocalTextureObject *lto = wearable->getLocalTextureObject(i);
+					if (lto)
+					{
+						id = lto->getID();
+					}
+				}
+				if (id != IMG_DEFAULT_AVATAR)
+				{
+					llinfos << "Avatar TE " << i << " id " << id << llendl;
+				}
+				else
+				{
+					llinfos << "Avatar TE " << i << " id " << "<DEFAULT>" << llendl;
 				}
-			}
-			if (id != IMG_DEFAULT_AVATAR)
-			{
-				llinfos << "Avatar TE " << i << " id " << id << llendl;
 			}
 			else
 			{
-				llinfos << "Avatar TE " << i << " id " << "<DEFAULT>" << llendl;
+				llinfos << "Avatar TE " << i << " id " << te->getID() << llendl;
 			}
 		}
-		else
-		{
-			llinfos << "Avatar TE " << i << " id " << te->getID() << llendl;
-		}
 	}
-#endif
 }
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 3a6aed01ce..b54305f021 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1802,9 +1802,10 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-#ifndef LL_RELEASE_FOR_DOWNLOAD
-		handle_debug_avatar_textures(NULL);
-#endif
+		if (gAgent.isGodlike())
+		{
+			handle_debug_avatar_textures(NULL);
+		}
 		return true;
 	}
 };
-- 
cgit v1.2.3


From 2208e6da2ca9b9e94f5aa903d98a0167baf15577 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 31 Mar 2010 16:09:34 -0400
Subject: asset request logging for DEV-47362 investigation.

---
 indra/llmessage/llassetstorage.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 0ab1081200..02523467e8 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -408,6 +408,8 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
 {
 	lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
 
+	llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+
 	if (mShutDown)
 	{
 		return; // don't get the asset or do any callbacks, we are shutting down
@@ -471,6 +473,8 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
 		// we've already got the file
 		// theoretically, partial files w/o a pending request shouldn't happen
 		// unless there's a weird error
+		llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
+
 		if (callback)
 		{
 			callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
@@ -528,6 +532,8 @@ void LLAssetStorage::downloadCompleteCallback(
 	LLAssetType::EType file_type,
 	void* user_data, LLExtStat ext_status)
 {
+	llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
+
 	lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id
 		 << "," << LLAssetType::lookup(file_type) << llendl;
 	LLAssetRequest* req = (LLAssetRequest*)user_data;
-- 
cgit v1.2.3


From 5c190996222ce2cf14997e16e16beb110173c0a2 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Wed, 31 Mar 2010 13:53:40 -0700
Subject: Enable OpenID auth in the embedded webkit browser.

Extract openid_url and openid_token tokens from the login response in process_login_success_response() and send them to LLViewerMedia if they're present.

Added LLViewerMedia::openIDSetup() to receive openid_url and openid_token, and added code to LLViewerMedia to do a POST with LLHTTPClient, retrieve the resulting cookie, and push it into the central cookie store.  Also made sure the OpenID cookie gets re-added when the cookie store is cleared.

Added LLPluginCookieStore::setCookiesFromHost() to properly add a cookie that may not have a domain set.  Made LLPluginCookieStore::Cookie::parse() add missing domain and path fields to cookies as necessary.

Fixed an issue where carriage returns in the string passed to LLPluginCookieStore::setCookies() or LLPluginCookieStore::setCookiesFromHost() would cause a parse failure.

Reviewed by gino and callum at http://codereview.lindenlab.com/1254001
---
 indra/llplugin/llplugincookiestore.cpp | 73 ++++++++++++++++++++++---
 indra/llplugin/llplugincookiestore.h   |  9 ++--
 indra/newview/llstartup.cpp            |  7 +++
 indra/newview/llviewermedia.cpp        | 99 +++++++++++++++++++++++++++++++++-
 indra/newview/llviewermedia.h          |  8 +++
 5 files changed, 184 insertions(+), 12 deletions(-)

diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp
index 1964b8d789..92ee24e1d5 100644
--- a/indra/llplugin/llplugincookiestore.cpp
+++ b/indra/llplugin/llplugincookiestore.cpp
@@ -62,11 +62,11 @@ LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type
 {
 }
 
-LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end)
+LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, const std::string &host)
 {
 	Cookie *result = new Cookie(s, cookie_start, cookie_end);
 
-	if(!result->parse())
+	if(!result->parse(host))
 	{
 		delete result;
 		result = NULL;
@@ -92,7 +92,7 @@ std::string LLPluginCookieStore::Cookie::getKey() const
 	return result;
 }
 
-bool LLPluginCookieStore::Cookie::parse()
+bool LLPluginCookieStore::Cookie::parse(const std::string &host)
 {
 	bool first_field = true;
 
@@ -248,7 +248,50 @@ bool LLPluginCookieStore::Cookie::parse()
 	// The cookie MUST have a name
 	if(mNameEnd <= mNameStart)
 		return false;
+	
+	// If the cookie doesn't have a domain, add the current host as the domain.
+	if(mDomainEnd <= mDomainStart)
+	{
+		if(host.empty())
+		{
+			// no domain and no current host -- this is a parse failure.
+			return false;
+		}
+		
+		// Figure out whether this cookie ended with a ";" or not...
+		std::string::size_type last_char = mCookie.find_last_not_of(" ");
+		if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
+		{
+			mCookie += ";";
+		}
+		
+		mCookie += " domain=";
+		mDomainStart = mCookie.size();
+		mCookie += host;
+		mDomainEnd = mCookie.size();
+		
+		lldebugs << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << llendl;
+	}
+
+	// If the cookie doesn't have a path, add "/".
+	if(mPathEnd <= mPathStart)
+	{
+		// Figure out whether this cookie ended with a ";" or not...
+		std::string::size_type last_char = mCookie.find_last_not_of(" ");
+		if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
+		{
+			mCookie += ";";
+		}
+		
+		mCookie += " path=";
+		mPathStart = mCookie.size();
+		mCookie += "/";
+		mPathEnd = mCookie.size();
 		
+		lldebugs << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << llendl;
+	}
+	
+	
 	return true;
 }
 
@@ -409,13 +452,29 @@ void LLPluginCookieStore::setCookies(const std::string &cookies, bool mark_chang
 
 	while(start != std::string::npos)
 	{
-		std::string::size_type end = cookies.find('\n', start);
+		std::string::size_type end = cookies.find_first_of("\r\n", start);
 		if(end > start)
 		{
 			// The line is non-empty.  Try to create a cookie from it.
 			setOneCookie(cookies, start, end, mark_changed);
 		}
-		start = cookies.find_first_not_of("\n ", end);
+		start = cookies.find_first_not_of("\r\n ", end);
+	}
+}
+
+void LLPluginCookieStore::setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed)
+{
+	std::string::size_type start = 0;
+
+	while(start != std::string::npos)
+	{
+		std::string::size_type end = cookies.find_first_of("\r\n", start);
+		if(end > start)
+		{
+			// The line is non-empty.  Try to create a cookie from it.
+			setOneCookie(cookies, start, end, mark_changed, host);
+		}
+		start = cookies.find_first_not_of("\r\n ", end);
 	}
 }
 			
@@ -502,9 +561,9 @@ std::string LLPluginCookieStore::unquoteString(const std::string &s)
 // When deleting with mark_changed set to true, this replaces the existing cookie in the list with an entry that's marked both dead and changed.
 // Some time later when writeChangedCookies() is called with clear_changed set to true, the dead cookie is deleted from the list after being returned, so that the
 // delete operation (in the form of the expired cookie) is passed along.
-void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed)
+void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host)
 {
-	Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end);
+	Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host);
 	if(cookie)
 	{
 		lldebugs << "setting cookie: " << cookie->getCookie() << llendl;
diff --git a/indra/llplugin/llplugincookiestore.h b/indra/llplugin/llplugincookiestore.h
index 5250f008b6..a93f0c14f0 100644
--- a/indra/llplugin/llplugincookiestore.h
+++ b/indra/llplugin/llplugincookiestore.h
@@ -66,18 +66,21 @@ public:
 	void setCookies(const std::string &cookies, bool mark_changed = true);
 	void readCookies(std::istream& s, bool mark_changed = true);
 
+	// sets one or more cookies (without reinitializing anything), supplying a hostname the cookies came from -- use when setting a cookie manually
+	void setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed = true);
+
 	// quote or unquote a string as per the definition of 'quoted-string' in rfc2616
 	static std::string quoteString(const std::string &s);
 	static std::string unquoteString(const std::string &s);
 	
 private:
 
-	void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed);
+	void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host = LLStringUtil::null);
 
 	class Cookie
 	{
 	public:
-		static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos);
+		static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos, const std::string &host = LLStringUtil::null);
 		
 		// Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map.
 		std::string getKey() const;
@@ -95,7 +98,7 @@ private:
 		
 	private:
 		Cookie(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos);
-		bool parse();
+		bool parse(const std::string &host);
 		std::string::size_type findFieldEnd(std::string::size_type start = 0, std::string::size_type end = std::string::npos);
 		bool matchName(std::string::size_type start, std::string::size_type end, const char *name);
 		
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 1a1dffe85c..b5a73a3143 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -3087,6 +3087,13 @@ bool process_login_success_response()
 		}
 	}
 
+	// Start the process of fetching the OpenID session cookie for this user login
+	std::string openid_url = response["openid_url"];
+	if(!openid_url.empty())
+	{
+		std::string openid_token = response["openid_token"];
+		LLViewerMedia::openIDSetup(openid_url, openid_token);
+	}
 
 	bool success = false;
 	// JC: gesture loading done below, when we have an asset system
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 6f0d9cdd95..d9fabc7d64 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -257,7 +257,43 @@ public:
 		LLViewerMediaImpl *mMediaImpl;
 		bool mInitialized;
 };
+
+class LLViewerMediaOpenIDResponder : public LLHTTPClient::Responder
+{
+LOG_CLASS(LLViewerMediaOpenIDResponder);
+public:
+	LLViewerMediaOpenIDResponder( )
+	{
+	}
+
+	~LLViewerMediaOpenIDResponder()
+	{
+	}
+
+	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+	{
+		LL_DEBUGS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
+		LL_DEBUGS("MediaAuth") << content << LL_ENDL;
+		std::string cookie = content["set-cookie"].asString();
+		
+		LLViewerMedia::openIDCookieResponse(cookie);
+	}
+
+	/* virtual */ void completedRaw(
+		U32 status,
+		const std::string& reason,
+		const LLChannelDescriptors& channels,
+		const LLIOPipe::buffer_ptr_t& buffer)
+	{
+		// This is just here to disable the default behavior (attempting to parse the response as llsd).
+		// We don't care about the content of the response, only the set-cookie header.
+	}
+
+};
+
 LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
+LLURL LLViewerMedia::sOpenIDURL;
+std::string LLViewerMedia::sOpenIDCookie;
 static LLViewerMedia::impl_list sViewerMediaImplList;
 static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;
 static LLTimer sMediaCreateTimer;
@@ -1067,7 +1103,8 @@ void LLViewerMedia::clearAllCookies()
 		}
 	}
 	
-	
+	// If we have an OpenID cookie, re-add it to the cookie store.
+	setOpenIDCookie();
 }
 	
 /////////////////////////////////////////////////////////////////////////////////////////
@@ -1168,7 +1205,9 @@ void LLViewerMedia::loadCookieFile()
 			pimpl->mMediaSource->clear_cookies();
 		}
 	}
-
+	
+	// If we have an OpenID cookie, re-add it to the cookie store.
+	setOpenIDCookie();
 }
 
 
@@ -1241,6 +1280,62 @@ void LLViewerMedia::removeCookie(const std::string &name, const std::string &dom
 }
 
 
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setOpenIDCookie()
+{
+	if(!sOpenIDCookie.empty())
+	{
+		getCookieStore()->setCookiesFromHost(sOpenIDCookie, sOpenIDURL.mAuthority);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string &openid_token)
+{
+	LL_DEBUGS("MediaAuth") << "url = \"" << openid_url << "\", token = \"" << openid_token << "\"" << LL_ENDL;
+
+	// post the token to the url 
+	// the responder will need to extract the cookie(s).
+
+	// Save the OpenID URL for later -- we may need the host when adding the cookie.
+	sOpenIDURL.init(openid_url.c_str());
+	
+	// We shouldn't ever do this twice, but just in case this code gets repurposed later, clear existing cookies.
+	sOpenIDCookie.clear();
+
+	LLSD headers = LLSD::emptyMap();
+	// Keep LLHTTPClient from adding an "Accept: application/llsd+xml" header
+	headers["Accept"] = "*/*";
+	// and use the expected content-type for a post, instead of the LLHTTPClient::postRaw() default of "application/octet-stream"
+	headers["Content-Type"] = "application/x-www-form-urlencoded";
+
+	// postRaw() takes ownership of the buffer and releases it later, so we need to allocate a new buffer here.
+	size_t size = openid_token.size();
+	U8 *data = new U8[size];
+	memcpy(data, openid_token.data(), size);
+
+	LLHTTPClient::postRaw( 
+		openid_url, 
+		data, 
+		size, 
+		new LLViewerMediaOpenIDResponder(),
+		headers);
+			
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::openIDCookieResponse(const std::string &cookie)
+{
+	LL_DEBUGS("MediaAuth") << "Cookie received: \"" << cookie << "\"" << LL_ENDL;
+	
+	sOpenIDCookie += cookie;
+
+	setOpenIDCookie();
+}
+
 bool LLViewerMedia::hasInWorldMedia()
 {
 	if (sInWorldMediaDisabled) return false;
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 10dacf9532..e829d7a5b4 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -44,6 +44,8 @@
 #include "llpluginclassmedia.h"
 #include "v4color.h"
 
+#include "llurl.h"
+
 class LLViewerMediaImpl;
 class LLUUID;
 class LLViewerMediaTexture;
@@ -152,11 +154,17 @@ public:
 	static void addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path = std::string("/"), bool secure = false );
 	static void addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path = std::string("/"), bool secure = false );
 	static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") );
+
+	static void openIDSetup(const std::string &openid_url, const std::string &openid_token);
+	static void openIDCookieResponse(const std::string &cookie);
 	
 private:
+	static void setOpenIDCookie();
 	static void onTeleportFinished();
 	
 	static LLPluginCookieStore *sCookieStore;
+	static LLURL sOpenIDURL;
+	static std::string sOpenIDCookie;
 };
 
 // Implementation functions not exported into header file
-- 
cgit v1.2.3


From 1e8375571526c0275ef0d5dcc4860df9cdd8b68b Mon Sep 17 00:00:00 2001
From: Loren Shih <seraph@lindenlab.com>
Date: Wed, 31 Mar 2010 17:55:08 -0400
Subject: EXT-3604 : Accordion folders should show "Loading..." when fetching
 contents

Superficial cleanup of LLFolderViewItem::draw.  No functionality change.
---
 indra/newview/llfolderviewitem.cpp | 292 +++++++++++++++++++------------------
 1 file changed, 151 insertions(+), 141 deletions(-)

diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index ecbaac5743..c916e4b98c 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -437,11 +437,8 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 
 S32 LLFolderViewItem::getItemHeight()
 {
-	if (mHidden) return 0;
+	if (getHidden()) return 0;
 
-	//S32 icon_height = mIcon->getHeight();
-	//S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
-	//return llmax( icon_height, label_height ) + ICON_PAD;
 	return mItemHeight;
 }
 
@@ -824,32 +821,34 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 	return handled;
 }
 
-
 void LLFolderViewItem::draw()
 {
-	if (mHidden) return;
+	if (getHidden())
+	{
+		return;
+	}
 
 	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
-	static LLUIColor sFocusOutlineColor =
-		LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
+	static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
 	static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
 	static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
 	static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemSuffixColor", DEFAULT_WHITE);
 	static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
-
 	const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
 	const S32 TOP_PAD = default_params.item_top_pad;
+	const S32 FOCUS_LEFT = 1;
+	const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
 
-	bool possibly_has_children = false;
-	bool up_to_date = mListener && mListener->isUpToDate();
-	if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter...
-		(!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter)
-	{
-		possibly_has_children = true;
-	}
-	if(/*mControlLabel[0] != '\0' && */possibly_has_children)
+
+	//--------------------------------------------------------------------------------//
+	// Draw open folder arrow
+	//
+	const bool up_to_date = mListener && mListener->isUpToDate();
+	const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) || // we fetched our children and some of them have passed the filter...
+										(!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
+	if (possibly_has_children)
 	{
 		LLUIImage* arrow_image = default_params.folder_arrow_image;
 		gl_draw_scaled_rotated_image(
@@ -857,22 +856,16 @@ void LLFolderViewItem::draw()
 			ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
 	}
 
-	// See also LLFolderView::updateRenamerPosition()
-	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
-
-	LLFontGL* font = getLabelFontForStyle(mLabelStyle);
-
-	// If we have keyboard focus, draw selection filled
-	BOOL show_context = getRoot()->getShowSelectionContext();
-	BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus());
-	const S32 FOCUS_LEFT = 1;
-	S32 focus_top = getRect().getHeight();
-	S32 focus_bottom = getRect().getHeight() - mItemHeight;
-	bool folder_open = (getRect().getHeight() > mItemHeight + 4);
 
-	// always render "current" item, only render other selected items if
-	// mShowSingleSelection is FALSE
-	if( mIsSelected )
+	//--------------------------------------------------------------------------------//
+	// Draw highlight for selected items
+	//
+	const BOOL show_context = getRoot()->getShowSelectionContext();
+	const BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus()); // If we have keyboard focus, draw selection filled
+	const S32 focus_top = getRect().getHeight();
+	const S32 focus_bottom = getRect().getHeight() - mItemHeight;
+	const bool folder_open = (getRect().getHeight() > mItemHeight + 4);
+	if (mIsSelected) // always render "current" item.  Only render other selected items if mShowSingleSelection is FALSE
 	{
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLColor4 bg_color = sHighlightBgColor;
@@ -891,152 +884,169 @@ void LLFolderViewItem::draw()
 				bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]);
 			}
 		}
-
-		gl_rect_2d(
-			FOCUS_LEFT,
-			focus_top, 
-			getRect().getWidth() - 2,
-			focus_bottom,
-			bg_color, filled);
+		gl_rect_2d(FOCUS_LEFT,
+				   focus_top, 
+				   getRect().getWidth() - 2,
+				   focus_bottom,
+				   bg_color, filled);
 		if (mIsCurSelection)
 		{
-			gl_rect_2d(
-				FOCUS_LEFT, 
-				focus_top, 
-				getRect().getWidth() - 2,
-				focus_bottom,
-				sFocusOutlineColor, FALSE);
+			gl_rect_2d(FOCUS_LEFT, 
+					   focus_top, 
+					   getRect().getWidth() - 2,
+					   focus_bottom,
+					   sFocusOutlineColor, FALSE);
 		}
 		if (folder_open)
 		{
-			gl_rect_2d(
-				FOCUS_LEFT,
-				focus_bottom + 1, // overlap with bottom edge of above rect
-				getRect().getWidth() - 2,
-				0,
-				sFocusOutlineColor, FALSE);
+			gl_rect_2d(FOCUS_LEFT,
+					   focus_bottom + 1, // overlap with bottom edge of above rect
+					   getRect().getWidth() - 2,
+					   0,
+					   sFocusOutlineColor, FALSE);
 			if (show_context)
 			{
-				gl_rect_2d(
-					FOCUS_LEFT,
-					focus_bottom + 1,
-					getRect().getWidth() - 2,
-					0,
-					sHighlightBgColor, TRUE);
+				gl_rect_2d(FOCUS_LEFT,
+						   focus_bottom + 1,
+						   getRect().getWidth() - 2,
+						   0,
+						   sHighlightBgColor, TRUE);
 			}
 		}
 	}
+
+	//--------------------------------------------------------------------------------//
+	// Draw DragNDrop highlight
+	//
 	if (mDragAndDropTarget)
 	{
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-		gl_rect_2d(
-			FOCUS_LEFT, 
-			focus_top, 
-			getRect().getWidth() - 2,
-			focus_bottom,
-			sHighlightBgColor, FALSE);
+		gl_rect_2d(FOCUS_LEFT, 
+				   focus_top, 
+				   getRect().getWidth() - 2,
+				   focus_bottom,
+				   sHighlightBgColor, FALSE);
 		if (folder_open)
 		{
-			gl_rect_2d(
-				FOCUS_LEFT,
-				focus_bottom + 1, // overlap with bottom edge of above rect
-				getRect().getWidth() - 2,
-				0,
-				sHighlightBgColor, FALSE);
+			gl_rect_2d(FOCUS_LEFT,
+					   focus_bottom + 1, // overlap with bottom edge of above rect
+					   getRect().getWidth() - 2,
+					   0,
+					   sHighlightBgColor, FALSE);
 		}
 		mDragAndDropTarget = FALSE;
 	}
 
-	S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
-	// First case is used for open folders
-	if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80))
+	
+	//--------------------------------------------------------------------------------//
+	// Draw open icon
+	//
+	const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
+	if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders
  	{
 		mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
 	}
-	else if(mIcon)
+	else if (mIcon)
 	{
  		mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
  	}
 
-	if (!mLabel.empty())
+
+	//--------------------------------------------------------------------------------//
+	// Exit if no label to draw
+	//
+	if (mLabel.empty())
 	{
-		// highlight filtered text
-		BOOL debug_filters = getRoot()->getDebugFilters();
-		LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
-		F32 right_x;
-		F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+		return;
+	}
 
-		if (debug_filters)
-		{
-			if (!getFiltered() && !possibly_has_children)
-			{
-				color.mV[VALPHA] *= 0.5f;
-			}
+	LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
+	F32 right_x  = 0;
+	F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
 
-			LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
-			LLFontGL::getFontMonospace()->renderUTF8(
-				mStatusText, 0, text_left, y, filter_color,
-				LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-				S32_MAX, S32_MAX, &right_x, FALSE );
-			text_left = right_x;
+	//--------------------------------------------------------------------------------//
+	// Highlight filtered text
+	//
+	if (getRoot()->getDebugFilters())
+	{
+		if (!getFiltered() && !possibly_has_children)
+		{
+			color.mV[VALPHA] *= 0.5f;
 		}
+		LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? 
+			LLColor4(0.5f, 0.8f, 0.5f, 1.f) : 
+			LLColor4(0.8f, 0.5f, 0.5f, 1.f);
+		LLFontGL::getFontMonospace()->renderUTF8(mStatusText, 0, text_left, y, filter_color,
+												 LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+												 S32_MAX, S32_MAX, &right_x, FALSE );
+		text_left = right_x;
+	}
 
 
-		font->renderUTF8( mLabel, 0, text_left, y, color,
-						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-						  S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+	//--------------------------------------------------------------------------------//
+	// Draw the actual label text
+	//
+	font->renderUTF8(mLabel, 0, text_left, y, color,
+					 LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+					 S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
 
-//		LLViewerInventoryCategory *item = 0;
-//		if (getListener())
-//			item = gInventory.getCategory(getListener()->getUUID());
-		bool root_is_loading = false;
-		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID()))
-		{
-			// Descendent of my inventory.
-			root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress();
-		}
-		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID()))
-		{
-			// Descendent of library
-			root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
-		}
-			
-		if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
-			|| (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && mShowLoadStatus) )
-		{
-			std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
-			font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
-					  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE);
-		}
+	//--------------------------------------------------------------------------------//
+	// Draw "Loading..." text
+	//
+	bool root_is_loading = false;
+	if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), 
+														 gInventory.getRootFolderID())) // Descendent of my inventory
+	{
+		root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress(); 
+	}
+	if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), 
+														 gInventory.getLibraryRootFolderID())) // Descendent of library
+	{
+		root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
+	}
+	if ((mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) ||
+		(LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && (mShowLoadStatus || mHidden)))
+	{
+		std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
+		font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
+						 LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 
+						 S32_MAX, S32_MAX, &right_x, FALSE);
+	}
 
-		if (!mLabelSuffix.empty())
-		{
-			font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
-					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-				S32_MAX, S32_MAX, &right_x, FALSE );
-		}
+	//--------------------------------------------------------------------------------//
+	// Draw label suffix
+	//
+	if (!mLabelSuffix.empty())
+	{
+		font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
+						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+						  S32_MAX, S32_MAX, &right_x, FALSE );
+	}
 
-		if (mStringMatchOffset != std::string::npos)
+	//--------------------------------------------------------------------------------//
+	// Highlight string match
+	//
+	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)
 		{
-			// 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;
+			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 );
-			}
+			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 );
 		}
 	}
 }
-- 
cgit v1.2.3


From ac271e1d50bd601d9fbf18655596fa695b80dec0 Mon Sep 17 00:00:00 2001
From: CG Linden <cg@lindenlab.com>
Date: Wed, 31 Mar 2010 15:24:42 -0700
Subject: Include channel names in update_version_files.py invocation to fix
 bad viewer channel name.

---
 indra/llcommon/llversionserver.h              | 2 +-
 indra/llcommon/llversionviewer.h              | 2 +-
 indra/newview/English.lproj/InfoPlist.strings | 4 ++--
 indra/newview/Info-SecondLife.plist           | 2 +-
 indra/newview/res/viewerRes.rc                | 8 ++++----
 5 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 0f1e59a18c..e3663544db 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -36,7 +36,7 @@
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 31;
 const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_BUILD = 203110;
 
 const char * const LL_CHANNEL = "Second Life Server";
 
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 540aea4252..3ab4257fab 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -36,7 +36,7 @@
 const S32 LL_VERSION_MAJOR = 2;
 const S32 LL_VERSION_MINOR = 0;
 const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_BUILD = 203110;
 
 const char * const LL_CHANNEL = "Second Life Developer";
 
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 879408d6e4..02c3dfc6e0 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
 
 CFBundleName = "Second Life";
 
-CFBundleShortVersionString = "Second Life version 2.0.0.200030";
-CFBundleGetInfoString = "Second Life version 2.0.0.200030, Copyright 2004-2009 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.0.0.203110";
+CFBundleGetInfoString = "Second Life version 2.0.0.203110, Copyright 2004-2009 Linden Research, Inc.";
 
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 38ebb22b84..4cb01a0f33 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>2.0.0.200030</string>
+	<string>2.0.0.203110</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 7a965cf57e..ecdcacec46 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -129,8 +129,8 @@ TOOLBUY                 CURSOR                  "toolbuy.cur"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,3422
- PRODUCTVERSION 2,0,0,3422
+ FILEVERSION 2,0,0,203110
+ PRODUCTVERSION 2,0,0,203110
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -147,12 +147,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "Linden Lab"
             VALUE "FileDescription", "Second Life"
-            VALUE "FileVersion", "2.0.0.200030"
+            VALUE "FileVersion", "2.0.0.203110"
             VALUE "InternalName", "Second Life"
             VALUE "LegalCopyright", "Copyright � 2001-2008, Linden Research, Inc."
             VALUE "OriginalFilename", "SecondLife.exe"
             VALUE "ProductName", "Second Life"
-            VALUE "ProductVersion", "2.0.0.200030"
+            VALUE "ProductVersion", "2.0.0.203110"
         END
     END
     BLOCK "VarFileInfo"
-- 
cgit v1.2.3


From 11b588c29c5c49af70f4a55258bb934cb7ccdb55 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Wed, 31 Mar 2010 18:50:20 -0700
Subject: Fixed a problem with LLPluginCookieStore that would have caused
 problems when adding multiple cookies with setCookies(), setAllCookies(), and
 setCookiesFromHost().

---
 indra/llplugin/llplugincookiestore.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp
index 92ee24e1d5..85b1e70d78 100644
--- a/indra/llplugin/llplugincookiestore.cpp
+++ b/indra/llplugin/llplugincookiestore.cpp
@@ -53,7 +53,7 @@ LLPluginCookieStore::~LLPluginCookieStore()
 
 
 LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end):
-	mCookie(s, cookie_start, cookie_end),
+	mCookie(s, cookie_start, cookie_end - cookie_start),
 	mNameStart(0), mNameEnd(0),
 	mValueStart(0), mValueEnd(0),
 	mDomainStart(0), mDomainEnd(0),
-- 
cgit v1.2.3


From e868159922b97c5f7de4bdd83de65e135d16ff01 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Wed, 31 Mar 2010 18:51:09 -0700
Subject: Added unit test for LLPluginCookieStore.

---
 indra/llplugin/CMakeLists.txt                     |  17 +++
 indra/llplugin/tests/llplugincookiestore_test.cpp | 178 ++++++++++++++++++++++
 2 files changed, 195 insertions(+)
 create mode 100644 indra/llplugin/tests/llplugincookiestore_test.cpp

diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index def9fcbeae..441becbae0 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -3,6 +3,7 @@
 project(llplugin)
 
 include(00-Common)
+include(CURL)
 include(LLCommon)
 include(LLImage)
 include(LLMath)
@@ -55,3 +56,19 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
 add_library (llplugin ${llplugin_SOURCE_FILES})
 
 add_subdirectory(slplugin)
+
+# Add tests
+include(LLAddBuildTest)
+# UNIT TESTS
+SET(llplugin_TEST_SOURCE_FILES
+  llplugincookiestore.cpp
+  )
+
+# llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
+set_source_files_properties(
+  llplugincookiestore.cpp
+  PROPERTIES
+    LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
+  )
+
+LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp
new file mode 100644
index 0000000000..e3e8ac9804
--- /dev/null
+++ b/indra/llplugin/tests/llplugincookiestore_test.cpp
@@ -0,0 +1,178 @@
+#include "linden_common.h"
+#include "../test/lltut.h"
+
+#include "../llplugincookiestore.h"
+
+
+namespace tut
+{
+	// Main Setup
+	struct LLPluginCookieStoreFixture
+	{
+		LLPluginCookieStoreFixture()
+		{
+			// We need dates definitively in the past and the future to properly test cookie expiration.
+			LLDate now = LLDate::now(); 
+			LLDate past(now.secondsSinceEpoch() - (60.0 * 60.0 * 24.0));	// 1 day in the past
+			LLDate future(now.secondsSinceEpoch() + (60.0 * 60.0 * 24.0));	// 1 day in the future
+			
+			mPastString = past.asRFC1123();
+			mFutureString = future.asRFC1123();
+		}
+		
+		std::string mPastString;
+		std::string mFutureString;
+		LLPluginCookieStore mCookieStore;
+		
+		// List of cookies used for validation
+		std::list<std::string> mCookies;
+		
+		// This sets up mCookies from a string returned by one of the functions in LLPluginCookieStore
+		void setCookies(const std::string &cookies)
+		{
+			mCookies.clear();
+			std::string::size_type start = 0;
+
+			while(start != std::string::npos)
+			{
+				std::string::size_type end = cookies.find_first_of("\r\n", start);
+				if(end > start)
+				{
+					std::string line(cookies, start, end - start);
+					if(line.find_first_not_of("\r\n\t ") != std::string::npos)
+					{
+						// The line has some non-whitespace characters.  Save it to the list.
+						mCookies.push_back(std::string(cookies, start, end - start));
+					}
+				}
+				start = cookies.find_first_not_of("\r\n ", end);
+			}
+		}
+		
+		// This ensures that a cookie matching the one passed is in the list.
+		void ensureCookie(const std::string &cookie)
+		{
+			std::list<std::string>::iterator iter;
+			for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
+			{
+				if(*iter == cookie)
+				{
+					// Found the cookie
+					// TODO: this should do a smarter equality comparison on the two cookies, instead of just a string compare.
+					return;
+				}
+			}
+			
+			// Didn't find this cookie
+			std::string message = "cookie not found: ";
+			message += cookie;
+			ensure(message, false);
+		}
+		
+		// This ensures that the number of cookies in the list matches what's expected.
+		void ensureSize(const std::string &message, size_t size)
+		{
+			if(mCookies.size() != size)
+			{
+				std::stringstream full_message;
+				
+				full_message << message << " (expected " << size << ", actual " << mCookies.size() << ")";
+				ensure(full_message.str(), false);
+			}
+		}
+	};
+	
+	typedef test_group<LLPluginCookieStoreFixture> factory;
+	typedef factory::object object;
+	factory tf("LLPluginCookieStore test");
+
+	// Tests
+	template<> template<>
+	void object::test<1>()
+	{
+		// Test 1: cookie uniqueness and update lists.
+		// Valid, distinct cookies:
+		
+		std::string cookie01 = "cookieA=value; domain=example.com; path=/";
+		std::string cookie02 = "cookieB=value; domain=example.com; path=/"; // different name
+		std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain
+		std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path
+		std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value
+		std::string cookie06 = "cookieD=value; domain=example.com; path=/; expires="; // different name, persistent cookie
+		cookie06 += mFutureString;
+		
+		mCookieStore.setCookies(cookie01);
+		mCookieStore.setCookies(cookie02);
+		mCookieStore.setCookies(cookie03);
+		mCookieStore.setCookies(cookie04);
+		mCookieStore.setCookies(cookie05);
+		mCookieStore.setCookies(cookie06);
+		
+		// Invalid cookies (these will get parse errors and not be added to the store)
+
+		std::string badcookie01 = "cookieD=value; domain=example.com; path=/; foo=bar"; // invalid field name
+		std::string badcookie02 = "cookieE=value; path=/"; // no domain
+
+		mCookieStore.setCookies(badcookie01);
+		mCookieStore.setCookies(badcookie02);
+		
+		// All cookies added so far should have been marked as "changed"
+		setCookies(mCookieStore.getChangedCookies());
+		ensureSize("count of changed cookies", 6);
+		ensureCookie(cookie01);
+		ensureCookie(cookie02);
+		ensureCookie(cookie03);
+		ensureCookie(cookie04);
+		ensureCookie(cookie05);
+		ensureCookie(cookie06);
+		
+		// Save off the current state of the cookie store (we'll restore it later)
+		std::string savedCookies = mCookieStore.getAllCookies();
+		
+		// Test replacing cookies
+		std::string cookie01a = "cookieA=newvalue; domain=example.com; path=/";	// updated value
+		std::string cookie02a = "cookieB=newvalue; domain=example.com; path=/; expires="; // remove cookie (by setting an expire date in the past)
+		cookie02a += mPastString;
+		
+		mCookieStore.setCookies(cookie01a);
+		mCookieStore.setCookies(cookie02a);
+
+		// test for getting changed cookies
+		setCookies(mCookieStore.getChangedCookies());
+		ensureSize("count of updated cookies", 2);
+		ensureCookie(cookie01a);
+		ensureCookie(cookie02a);
+		
+		// and for the state of the store after getting changed cookies
+		setCookies(mCookieStore.getAllCookies());
+		ensureSize("count of valid cookies", 5);
+		ensureCookie(cookie01a);
+		ensureCookie(cookie03);
+		ensureCookie(cookie04);
+		ensureCookie(cookie05);
+		ensureCookie(cookie06);
+
+		// Check that only the persistent cookie is returned here
+		setCookies(mCookieStore.getPersistentCookies());
+		ensureSize("count of persistent cookies", 1);
+		ensureCookie(cookie06);
+
+		// Restore the cookie store to a previous state and verify
+		mCookieStore.setAllCookies(savedCookies);
+		
+		// Since setAllCookies defaults to not marking cookies as changed, this list should be empty.
+		setCookies(mCookieStore.getChangedCookies());
+		ensureSize("count of changed cookies after restore", 0);
+
+		// Verify that the restore worked as it should have.
+		setCookies(mCookieStore.getAllCookies());
+		ensureSize("count of restored cookies", 6);
+		ensureCookie(cookie01);
+		ensureCookie(cookie02);
+		ensureCookie(cookie03);
+		ensureCookie(cookie04);
+		ensureCookie(cookie05);
+		ensureCookie(cookie06);
+	}
+
+}
-- 
cgit v1.2.3


From 68870a1f59c11a173353698b994f4540b214d57f Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Wed, 31 Mar 2010 18:53:50 -0700
Subject: Added copyright header to new unit test.

---
 indra/llplugin/tests/llplugincookiestore_test.cpp | 33 +++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp
index e3e8ac9804..020d9c1977 100644
--- a/indra/llplugin/tests/llplugincookiestore_test.cpp
+++ b/indra/llplugin/tests/llplugincookiestore_test.cpp
@@ -1,3 +1,36 @@
+/** 
+ * @file llplugincookiestore_test.cpp
+ * @brief Unit tests for LLPluginCookieStore.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
 #include "linden_common.h"
 #include "../test/lltut.h"
 
-- 
cgit v1.2.3


From 7f38ea147466b6d045c90d710402b2ac321dbfd9 Mon Sep 17 00:00:00 2001
From: Eugene Mutavchi <emutavchi@productengine.com>
Date: Thu, 1 Apr 2010 11:32:51 +0300
Subject: Fixed normal bug EXT-6659("Ctrl+A" combination allows selecting of
 several picks) - added check that multiple selection is allowed Reviewed by
 Mike Antipov at https://codereview.productengine.com/secondlife/r/146/

--HG--
branch : product-engine
---
 indra/llui/llflatlistview.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index bc34012267..d8084fd9aa 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -562,8 +562,7 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
 		{
 			if(MASK_CONTROL & mask)
 			{
-				selectAll();
-				handled = TRUE;
+				handled = (BOOL)selectAll();
 			}
 			break;
 		}
@@ -793,7 +792,7 @@ bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selecti
 
 bool LLFlatListView::selectAll()
 {
-	if (!mAllowSelection)
+	if (!mAllowSelection || !mMultipleSelection)
 		return false;
 
 	mSelectedItemPairs.clear();
-- 
cgit v1.2.3


From 69833aff50b1d1d360ff5568314d347dd3df40f5 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Thu, 1 Apr 2010 13:35:25 +0300
Subject: drafted out edit outfit panel XUI layout as major part of EXT-6548
 Edit Outfit: Clean up XUI to allow all elements to fit properly in the panel

Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/143/

--HG--
branch : product-engine
---
 indra/newview/llpaneloutfitedit.cpp                |  13 +-
 indra/newview/llpaneloutfitedit.h                  |   4 +-
 .../skins/default/xui/en/panel_outfit_edit.xml     | 540 +++++++++++++--------
 .../default/xui/en/panel_outfits_inventory.xml     |   4 +-
 .../skins/default/xui/en/sidepanel_appearance.xml  |   9 +-
 5 files changed, 347 insertions(+), 223 deletions(-)

diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 421181dda1..ba22adc01c 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -62,7 +62,7 @@
 #include "llsidepanelappearance.h"
 #include "llwearablelist.h"
 
-static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_look("panel_outfit_edit");
+static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit");
 
 const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);
 const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);
@@ -158,7 +158,9 @@ BOOL LLPanelOutfitEdit::postBuild()
 	// gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
 		
 	mLookName = getChild<LLTextBox>("curr_look_name"); 
-	
+
+	childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL);
+
 	/*
 	mLookContents->setDoubleClickCallback(onDoubleClickSpeaker, this);
 	mLookContents->setCommitOnSelectionChange(TRUE);
@@ -229,6 +231,11 @@ BOOL LLPanelOutfitEdit::postBuild()
 	return TRUE;
 }
 
+void LLPanelOutfitEdit::showAddWearablesPanel()
+{
+	childSetVisible("add_wearables_panel", childGetValue("add_btn"));
+}
+
 void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
 {
 	LLComboBox* type_filter = dynamic_cast<LLComboBox*>(ctrl);
@@ -500,7 +507,7 @@ void LLPanelOutfitEdit::displayLookInfo(const LLInventoryCategory* pLook)
 	if (mLookID != pLook->getUUID())
 	{
 		mLookID = pLook->getUUID();
-		mLookName->setText("Look: " + pLook->getName());
+		mLookName->setText(pLook->getName());
 		updateLookInfo();
 	}
 }
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 09ec51c056..5c00f84e0e 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -88,7 +88,9 @@ public:
 	/*virtual*/ void setParcelID(const LLUUID& parcel_id);
 		// Sends a request for data about the given parcel, which will
 		// only update the location if there is none already available.
-	
+
+	void showAddWearablesPanel();
+
 	void onTypeFilterChanged(LLUICtrl* ctrl);
 	void onSearchEdit(const std::string& string);
 	void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index d4924562fb..535e24f3d9 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -1,13 +1,18 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray Outfit Edit panel -->
 <panel
-  background_visible="true"
-  border="false"
-	height="570"
-	follows="all"
-	label="Look Info"
-	layout="topleft"
-	name="look_info"
-	width="320">
+ background_visible="true"
+ border="false"
+ height="600"
+ follows="all"
+ label="Outfit Edit"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="outfit_edit"
+ top="0"
+ width="320">
+	
 	<panel.string
 		name="not_available">
 		(N\A)
@@ -16,218 +21,325 @@
 		name="unknown">
 		(unknown)
 	</panel.string>
-	<panel
-		background_visible="true"
-		bevel_style="none"
-		follows="left|top|right|bottom"
-		height="530"
-		label="Outfit"
-		layout="topleft"
-		name="look_management_panel"
-		width="320">
-        <panel
-          follows="left|right|top"
-            header_visible="false"
-            layout="topleft"
-            min_height="300"
-            name="look_group"
-            title="Outfit Group"
-          top="0">
+
+
+    <button
+     follows="top|left"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     name="back_btn"
+     left="5"
+     tab_stop="false"
+     top="2"
+     width="23" />
+    <text
+     follows="top|right"
+     font="SansSerifHugeBold"
+     height="26"
+     layout="topleft"
+     left_pad="20"
+     name="title"
+     text_color="LtGray"
+     top="0"
+     value="Edit Outfit"
+     use_ellipses="true"
+     width="275" /> 
+
+<!-- "HEADER WITH ICON, STATUS TEXT AND OUTFIT NAME" -->
+    <panel
+     bevel_style="none"
+     follows="top|left|right"
+     height="45"
+     label="bottom_panel"
+     layout="topleft"
+     left="5"
+     name="header_panel"
+     top_pad="5" 
+     width="300">
+        <icon
+         follows="left|top"
+         height="40"
+         image_name="t-shirt-image"
+         left="2"
+         mouse_opaque="false"
+         name="outfit_icon"
+         top="1"
+         scale_image="true"
+         visible="true"
+         width="35" />
             <panel
-                follows="left|right|top"
-                height="210"
-                layout="topleft"
-                top_pad="0"
-                name="look_info_group_bar"
-                width="295">
+             bevel_style="none"
+             follows="top|right"
+             height="40"
+             label="bottom_panel"
+             layout="topleft"
+             left_pad="10"
+             name="outfit_name_and_status"
+             top="2"
+             width="200">
                 <text
-                    type="string"
-                    length="1"
-                    follows="left|top"
-                    height="20"
-                    layout="topleft"
-                    mouse_opaque="false"
-                    name="curr_look_name"
-                    width="175">
-                    Look: [LOOK]
-                </text>
+                 follows="top|left|right"
+                 font="SansSerif"
+                 height="13"
+                 layout="topleft"
+                 name="status"
+                 text_color="Green"
+                 top="0"
+                 value="Editing..."
+                 use_ellipses="true"
+                 width="275" /> 
+                <text
+                 follows="bottom|left|right"
+                 font="SansSerifHugeBold"
+                 height="26"
+                 layout="topleft"
+                 name="curr_look_name"
+                 text_color="LtGray"
+                 top_pad="0"
+                 value="[Current Outfit]"
+                 use_ellipses="true"
+                 width="275" /> 
+            </panel>
+    </panel>
+
+
+<!-- LIST OF WEARABLES (CURRENT OUTFIT/ WEARABLES TO ADD) -->
+    <layout_stack
+     animate="false"
+     default_tab_group="2"
+     follows="all"
+     height="470"
+     width="300"
+     layout="topleft"
+     orientation="vertical"
+     name="im_panels"
+     tab_group="1"
+     top_pad="10"
+     left="5">
+        <layout_panel
+         layout="topleft"
+         follows="left|top|right"
+         height="220"
+         label="IM Control Panel"
+         min_height="100"
+         name="outfit_wearables_panel"
+         width="300"
+         auto_resize="true"
+         user_resize="true">
+
+            <scroll_list
+             width="300"
+             column_padding="0"
+             draw_heading="false"
+             draw_stripes="false"
+             follows="left|top|right|bottom"
+             layout="topleft"
+             name="look_items_list"
+             search_column="1"
+             sort_column="2"
+             left="0"
+             height="193"
+             top="0">
+                <scroll_list.columns
+                 label="Look Item"
+                 name="look_item"
+                 width="285" />
+                <scroll_list.columns
+                 label="Outfit Item Sort"
+                 width="0"
+                 sort_column="look_item_sort"
+                 name="look_item_sort" />
+            </scroll_list>
+
+            <panel
+             background_visible="true"
+             bevel_style="none"
+             follows="bottom|left|right"
+             height="27"
+             label="bottom_panel"
+             layout="topleft"
+             left="0"
+             name="edit_panel"
+             top_pad="0"
+             width="300">
+                <button
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Left_Over"
+                 image_overlay="OptionsMenu_Off"
+                 image_selected="Toolbar_Left_Selected"
+                 image_unselected="Toolbar_Left_Off"
+                 layout="topleft"
+                 left="0"
+                 name="gear_menu_btn"
+                 top="1"
+                 width="31" />
                 <button
-                    follows="left|top"
-                    height="20"
-                    label="Wear"
-                    layout="topleft"
-                    name="wear_look_btn"
-                    left_pad="5"
-                    top_pad="-24"
-                    width="65" />
+                 is_toggle="true"
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay="AddItem_Off"
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 layout="topleft"
+                 left_pad="1"
+                 name="add_btn"
+                 top="1"
+                 width="31" />
                 <button
-                    follows="left|top"
-                    height="20"
-                    layout="topleft"
-                    left_pad="5"
-                    name="back_btn"
-                    width="20" />
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay=""
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 layout="topleft"
+                 left_pad="1"
+                 name="new_btn"
+                 top="1"
+                 width="31" />
+                <button
+                 follows="bottom|right"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay="TrashItem_Off"
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 layout="topleft"
+                 name="trash_btn"
+                 right="-1"
+                 top="1"
+                 width="31" />
             </panel>
-        </panel>
+        </layout_panel>
+
+
+        <layout_panel
+         auto_resize="true"
+         default_tab_group="3"
+         height="250" 
+         min_height="120"
+         name="add_wearables_panel"
+         width="300"
+         tab_group="2"
+         user_resize="true">
+
+            <text
+             follows="top|left|right"
+             font="SansSerifBold"
+             height="13"
+             layout="topleft"
+             left="5"
+             name="status"
+             text_color="LtGray"
+             top="5"
+             value="Add Wearables"
+             use_ellipses="true"
+             width="275" />
+
+            <filter_editor
+             background_image="TextField_Search_Off"
+             follows="left|top|right"
+             font="SansSerif"
+             label="Filter"
+             layout="topleft"
+             left="5"
+             width="290"
+             height="20"
+             name="look_item_filter"
+             text_color="black"
+             text_pad_left="25" />
+
+            <inventory_panel
+             allow_multi_select="true"
+             border="false"
+             follows="left|top|right|bottom"
+             height="176"
+             layout="topleft"
+             left="0"
+             mouse_opaque="false"
+             name="inventory_items"
+             top_pad="5"
+             width="300"/>
 
-        <panel
-            follows="left|right|top"
-          height="200"
-          layout="topleft"
-          name="outfit_display"
-          top_pad="10"
-          width="320">
-          
-              <scroll_list
-                  width="285"
-                  column_padding="0"
-                  draw_heading="false"
-                  draw_stripes="false"
-                  follows="left|top|bottom|right"
-                  layout="topleft"
-                  name="look_items_list"
-                  search_column="1"
-                  sort_column="2"
-                  left="0"
-                  height="200"
-                  top_pad="0">
-                  <scroll_list.columns
-                      label="Look Item"
-                      name="look_item"
-                      width="285" />
-                  <scroll_list.columns
-                      label="Outfit Item Sort"
-                      width="0"
-                      sort_column="look_item_sort"
-                      name="look_item_sort" />
-              </scroll_list>
-              <button
-                  follows="left|top|right"
-                  height="20"
-                  label="-"
-                  left_pad="0"
-                  layout="topleft"
-                  name="edit_wearable_btn"
-                  width="20" />
-        </panel>
-        <panel
-          follows="all"
-            header_visible="false"
-            min_height="100"
-          left="0"
-            name="inventory_group"
-            title="My Inventory"
-          top_pad="10"
-          width="230">
             <panel
-                follows="left|right|top"
-                height="270"
-                name="lower_look_accordion"
-                width="295">
-                <panel
-                    follows="left|right|top"
-                    height="20"
-                    layout="topleft"
-                    name="inventory_bar"
-                    width="295">
-                    <text
-                        type="string"
-                        length="1"
-                        follows="left|top"
-                        height="20"
-                        layout="topleft"
-                        mouse_opaque="false"
-                        name="inventory_info_text"
-                        width="100">
-                        My Inventory
-                    </text>
-                    <combo_box
-                        follows="left"
-                        height="20"
-                        layout="topleft"
-                        left_pad="0"
-                        top_pad="-24"
-                        name="inventory_filter"
-                        tool_tip="Only show the selected inventory types"
-                        width="185" />
-                </panel>
-                <panel
-                    follows="left|right|top"
-                    height="20"
-                    layout="topleft"
-                    name="look_item_filter_bar"
-                    width="295">
-                    <filter_editor
-                        background_image="TextField_Search_Off"
-                        follows="left|top|right"
-                        font="SansSerif"
-                        label="Outfit Item Filter"
-                        layout="topleft"
-                        left="0"
-                        top_pad="0"
-                        width="270"
-                        height="20"
-                        name="look_item_filter"
-                        text_color="black"
-                        text_pad_left="25" />
-                </panel>
-                <panel
-                    follows="all"
-                    height="230"
-                    layout="topleft"
-                    name="inventory_panel"
-                    width="285">
-                    <inventory_panel
-                        allow_multi_select="true"
-                        border="true"
-                        follows="left|top|right|bottom"
-                        height="230"
-                        mouse_opaque="false"
-                        name="inventory_items"
-                        width="285"/>
-                </panel>
+             background_visible="true"
+             bevel_style="none"
+             follows="left|right|bottom"
+             height="27"
+             label="add_wearables_button_bar"
+             layout="topleft"
+             left="0"
+             name="add_wearables_button_bar"
+             top_pad="0"
+             width="300">
+                <button
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Left_Over"
+                 image_overlay="OptionsMenu_Off"
+                 image_selected="Toolbar_Left_Selected"
+                 image_unselected="Toolbar_Left_Off"
+                 layout="topleft"
+                 left="0"
+                 name="wearables_gear_menu_btn"
+                 top="1"
+                 width="31" />
+                <button
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay=""
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 label="F"
+                 layout="topleft"
+                 left_pad="1"
+                 name="folder_view_btn"
+                 top="1"
+                 width="31" />
+                <button
+                 follows="bottom|left"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay=""
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 label="L"
+                 layout="topleft"
+                 left_pad="1"
+                 name="list_view_btn"
+                 top="1"
+                 width="31" />
             </panel>
-        </panel>
-	</panel>
-	<panel
-		follows="left|right|bottom"
-		height="30"
-		layout="topleft"
-		left="5"
-		top_pad="0"
-		name="button_bar"
-		width="295">
-		<button
-			follows="top|left|right"
-			height="25"
-			label="Add"
-			left="0"
-			layout="topleft"
-			name="add_item_btn"
-			width="90" />
-		<button
-			follows="left|right"
-			height="25"
-			left_pad="0"
-			label="Remove"
-			layout="topleft"
-			name="remove_item_btn"
-			width="90" />
-		<button
-			follows="top|left|right"
-			height="25"
-			label="UP"
-			left_pad="0"
-			layout="topleft"
-			name="up_btn"
-			width="55" />
-		<button
-			follows="left|top|right"
-			height="25"
-			label="DOWN"
-			left_pad="0"
-			layout="topleft"
-			name="down_btn"
-			width="60" />
-	</panel>
+        </layout_panel>
+    </layout_stack>
+
+    <panel
+     follows="left|right|bottom"
+     height="30"
+     layout="topleft"
+     left="5"
+     top_pad="10"
+     name="save_revert_button_bar"
+     width="300">
+        <button
+         follows="bottom|left|right"
+         height="23"
+         label="Save"
+         left="0"
+         layout="topleft"
+         name="save_btn"
+         width="145" />
+        <button
+         follows="bottom|left|right"
+         height="23"
+         left_pad="15"
+         label="Revert"
+         layout="topleft"
+         name="revert_btn"
+         width="145" />
+    </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 66ef373168..b297ec1988 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -119,13 +119,13 @@
 	 <button
 	  follows="bottom|left"
 		height="23" 
-		label="M" 
+		label="Edit Outfit" 
 		layout="topleft"
         right="-140"
 		name="look_edit_btn"
         top="26"
         visible="false" 
-		width="20" />
+		width="50" />
 	 </panel>
        
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 735635f1a0..20a1de59fc 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -104,12 +104,15 @@ width="333">
    <panel
    class="panel_outfit_edit"
    filename="panel_outfit_edit.xml"
+   height="550"
    follows="all"
    layout="topleft"
-   left="0"
+   left="5"
+   min_height="410"
    name="panel_outfit_edit"
-   top="35"
-   visible="false" />
+   top="5"
+   visible="false" 
+   width="320"/>
    <panel
    class="panel_edit_wearable"
    filename="panel_edit_wearable.xml"
-- 
cgit v1.2.3


From 9c0087c0a68b37718dbedae0e5a99b8a5920c318 Mon Sep 17 00:00:00 2001
From: Dmitry Zaporozhan <dzaporozhan@productengine.com>
Date: Thu, 1 Apr 2010 14:07:45 +0300
Subject: Fixed normal bug EXT-6023 - [HARD CODED]? Side Bar : "More" link
 inside "Profile" and "Pick" According to ticket, files in "widgets" folder
 are not localized and "more_label" is not a translatable attribute. Replaced
 "more_label" with "label". expandable_text "More" text is accessible through
 "textbox.label" attribute. Added "textbox.label" to every expandable_text to
 make "More" text localizable.

--HG--
branch : product-engine
---
 indra/newview/llexpandabletextbox.cpp                              | 3 +--
 indra/newview/llexpandabletextbox.h                                | 1 -
 indra/newview/skins/default/xui/en/floater_event.xml               | 1 +
 indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml | 1 +
 indra/newview/skins/default/xui/en/panel_landmark_info.xml         | 1 +
 indra/newview/skins/default/xui/en/panel_my_profile.xml            | 3 +++
 indra/newview/skins/default/xui/en/panel_pick_list_item.xml        | 1 +
 indra/newview/skins/default/xui/en/panel_place_profile.xml         | 1 +
 indra/newview/skins/default/xui/en/panel_profile.xml               | 3 +++
 indra/newview/skins/default/xui/en/widgets/expandable_text.xml     | 2 +-
 10 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 362010d65a..149ba2478d 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -112,13 +112,12 @@ private:
 };
 
 LLExpandableTextBox::LLTextBoxEx::Params::Params()
-:	more_label("more_label")
 {
 }
 
 LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
 :	LLTextEditor(p),
-	mExpanderLabel(p.more_label),
+	mExpanderLabel(p.label),
 	mExpanderVisible(false)
 {
 	setIsChrome(TRUE);
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 9d4a8aef76..5872592fae 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -54,7 +54,6 @@ protected:
 	public:
 		struct Params :	public LLInitParam::Block<Params, LLTextEditor::Params>
 		{
-			Mandatory<std::string> more_label;
 			Params();
 		};
 
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
index 0255e202fb..d9c9d63c72 100644
--- a/indra/newview/skins/default/xui/en/floater_event.xml
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -244,6 +244,7 @@
        layout="topleft"
        left="6"
        name="event_desc"
+       textbox.label="More"
        width="322">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</expandable_text>
     </layout_panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index 996e28c575..af3315ebfe 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -65,6 +65,7 @@
      left="103"
      name="description"
      textbox.max_length="1024"
+     textbox.label="More"
      textbox.show_context_menu="false" 
      top_pad="0"
      width="178"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index befeb182f9..31ba539c44 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -133,6 +133,7 @@
              layout="topleft"
              left="10"
              name="description"
+             textbox.label="More"
              top_pad="10"
              value="Du waltz die spritz"
              width="280" />
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index 4386475cf1..5e41d65720 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -117,6 +117,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.label="More"
                textbox.show_context_menu="true"
                name="sl_description_edit"
                top_pad="-3"
@@ -172,6 +173,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.label="More"
                textbox.show_context_menu="true"
                name="fl_description_edit"
                top_pad="-3"
@@ -313,6 +315,7 @@
             name="sl_groups"
           top_pad="0"
             translate="false"
+            textbox.label="More"
             textbox.show_context_menu="true"
             width="298"
             expanded_bg_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 715dc5f23c..41651edaa0 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -65,6 +65,7 @@
      left="103"
      name="picture_descr"
      textbox.max_length="1024"
+     textbox.label="More"
      textbox.show_context_menu="false" 
      top_pad="0"
      width="178"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index 9e5ef10d42..c1c1e54b47 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -275,6 +275,7 @@
              layout="topleft"
              left="5"
              name="description"
+             textbox.label="More"
              top_pad="10"
              value="Du waltz die spritz"
              width="300" />
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 34ec64b8af..a666608103 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -107,6 +107,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.label="More"
                textbox.show_context_menu="true"
                name="sl_description_edit"
                top_pad="-3"
@@ -152,6 +153,7 @@
                layout="topleft"
                left="107"
                textbox.max_length="512"
+               textbox.label="More"
                textbox.show_context_menu="true"
                name="fl_description_edit"
                top_pad="-3"
@@ -291,6 +293,7 @@
             left="7"
             name="sl_groups"
             textbox.max_length="512"
+            textbox.label="More"
             textbox.show_context_menu="true"
             top_pad="0"
             translate="false"
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index d9b6387f0d..6190ea7872 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -5,7 +5,7 @@
   allow_html="true"
   allow_scroll="true"
   bg_visible="false"
-  more_label="More" 
+  label="More" 
   follows="left|top|right"
   name="text"
   read_only="true"
-- 
cgit v1.2.3


From 985d422210defe6f975bd9b0c301f877c75a86d6 Mon Sep 17 00:00:00 2001
From: Igor Borovkov <iborovkov@productengine.com>
Date: Thu, 1 Apr 2010 14:30:09 +0300
Subject: forgot to commit visible=false of Add Wearables panel as part of
 EXT-6548 Edit Outfit: Clean up XUI to allow all elements to fit properly in
 the panel

Reviewed by Nyx at https://codereview.productengine.com/secondlife/r/143/

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_outfit_edit.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 535e24f3d9..4d3ee07195 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -224,7 +224,8 @@
          name="add_wearables_panel"
          width="300"
          tab_group="2"
-         user_resize="true">
+         user_resize="true"
+         visible="false">
 
             <text
              follows="top|left|right"
-- 
cgit v1.2.3


From c6cdd40c4eab2bb413ce778e6659f27c1d04c008 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 1 Apr 2010 14:58:24 +0300
Subject: fixed EXT-6373 Consecutive offer messages are unreadable in the IM
 log replaced [NAME] with [NAME_SLURL] in friendship offer notification;

--HG--
branch : product-engine
---
 indra/newview/llviewermessage.cpp                    | 2 +-
 indra/newview/skins/default/xui/en/notifications.xml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 53beced1d3..3a5d701bc1 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2381,7 +2381,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 			else
 			{
-				args["[NAME]"] = name;
+				args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");
 				if(message.empty())
 				{
 					//support for frienship offers from clients before July 2008
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 8501143fe6..3d41989e54 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5167,7 +5167,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
    icon="notify.tga"
    name="OfferFriendship"
    type="offer">
-[NAME] is offering friendship.
+[NAME_SLURL] is offering friendship.
 
 [MESSAGE]
 
-- 
cgit v1.2.3


From 4992eaf27dd113df805f347811882e72df6d7a86 Mon Sep 17 00:00:00 2001
From: Alexei Arabadji <aarabadji@productengine.com>
Date: Thu, 1 Apr 2010 15:24:36 +0300
Subject: fixed EXT-2801 Record "object return" notification into IM history,
 not chat history, * added class for LLPostponedNotification to rpovide
 possibility postpone adding notification to notifications system till sender
 avatar name will be received from cache name; * rolled back changes related
 to fix of EXT-4779; * avoided passing avatar id when logging 'Object Return'
 notification to nearby chat;

eviewed by Vadim Savchuk at https://jira.secondlife.com/browse/EXT-6373

--HG--
branch : product-engine
---
 indra/llui/llnotifications.cpp              |  8 ++++
 indra/llui/llnotifications.h                | 57 +++++++++++++++++++++++++++++
 indra/newview/llnotificationhandlerutil.cpp |  9 +----
 indra/newview/llviewermessage.cpp           | 23 ++++++++++--
 4 files changed, 86 insertions(+), 11 deletions(-)

diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index d7424cf05a..65ef53443b 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1552,3 +1552,11 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification)
 	return s;
 }
 
+void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first,
+		const std::string& last, bool is_group)
+{
+	gCacheName->getFullName(id, mName);
+	modifyNotificationParams();
+	LLNotifications::instance().add(mParams);
+	cleanup();
+}
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 400491a154..707a84bdfe 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -104,6 +104,7 @@
 #include "llinitparam.h"
 #include "llnotificationslistener.h"
 #include "llnotificationptr.h"
+#include "llcachename.h"
 
 	
 typedef enum e_notification_priority
@@ -949,6 +950,62 @@ private:
     boost::scoped_ptr<LLNotificationsListener> mListener;
 };
 
+/**
+ * Abstract class for postponed notifications.
+ * Provides possibility to add notification after specified by id avatar or group will be
+ * received from cache name. The object of this type automatically well be deleted
+ * by cleanup method after respond will be received from cache name.
+ *
+ * To add custom postponed notification to the notification system client should:
+ *  1 create class derived from LLPostponedNotification;
+ *  2 call LLPostponedNotification::add method;
+ */
+class LLPostponedNotification
+{
+public:
+	/**
+	 * Performs hooking cache name callback which will add notification to notifications system.
+	 * Type of added notification should be specified by template parameter T
+	 * and non-private derived from LLPostponedNotification class,
+	 * otherwise compilation error will occur.
+	 */
+	template<class T>
+	static void add(const LLNotification::Params& params,
+			const LLUUID& id, bool is_group)
+	{
+		// upcast T to the base type to restrict T derivation from LLPostponedNotification
+		LLPostponedNotification* thiz = new T();
+
+		thiz->mParams = params;
+
+		gCacheName->get(id, is_group, boost::bind(
+				&LLPostponedNotification::onCachedNameReceived, thiz, _1, _2,
+				_3, _4));
+	}
+
+private:
+	void onCachedNameReceived(const LLUUID& id, const std::string& first,
+			const std::string& last, bool is_group);
+
+	void cleanup()
+	{
+		delete this;
+	}
+
+protected:
+	LLPostponedNotification() {}
+	~LLPostponedNotification() {}
+
+	/**
+	 * Abstract method provides possibility to modify notification parameters and
+	 * will be called after cache name retrieve information about avatar or group
+	 * and before notification will be added to the notification system.
+	 */
+	virtual void modifyNotificationParams() = 0;
+
+	LLNotification::Params mParams;
+	std::string mName;
+};
 
 #endif//LL_LLNOTIFICATIONS_H
 
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 6aafa04a17..3f551f6b32 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -323,7 +323,7 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi
 {
 	const std::string name = LLHandlerUtil::getSubstitutionName(notification);
 
-	std::string session_name = notification->getPayload().has(
+	const std::string& session_name = notification->getPayload().has(
 			"SESSION_NAME") ? notification->getPayload()["SESSION_NAME"].asString() : name;
 
 	// don't create IM p2p session with objects, it's necessary condition to log
@@ -332,12 +332,6 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi
 	{
 		LLUUID from_id = notification->getPayload()["from_id"];
 
-		//*HACK for ServerObjectMessage the sesson name is really weird, see EXT-4779
-		if (SERVER_OBJECT_MESSAGE == notification->getName())
-		{
-			session_name = "chat";
-		}
-
 		//there still appears a log history file with weird name " .txt"
 		if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name)
 		{
@@ -392,6 +386,7 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat
 		LLChat chat_msg(notification->getMessage());
 		chat_msg.mSourceType = type;
 		chat_msg.mFromName = SYSTEM_FROM;
+		chat_msg.mFromID = LLUUID::null;
 		nearby_chat->addMessage(chat_msg);
 	}
 }
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 3a5d701bc1..1426c0b9e2 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1685,6 +1685,18 @@ bool inspect_remote_object_callback(const LLSD& notification, const LLSD& respon
 }
 static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback);
 
+class LLPostponedServerObjectNotification: public LLPostponedNotification
+{
+protected:
+	/* virtual */
+	void modifyNotificationParams()
+	{
+		LLSD payload = mParams.payload;
+		payload["SESSION_NAME"] = mName;
+		mParams.payload = payload;
+	}
+};
+
 void process_improved_im(LLMessageSystem *msg, void **user_data)
 {
 	if (gNoRender)
@@ -2220,7 +2232,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			if(SYSTEM_FROM == name)
 			{
 				// System's UUID is NULL (fixes EXT-4766)
-				chat.mFromID = from_id = LLUUID::null;
+				chat.mFromID = LLUUID::null;
 			}
 
 			LLSD query_string;
@@ -2266,13 +2278,16 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			payload["slurl"] = location;
 			payload["name"] = name;
 			std::string session_name;
-			gCacheName->getFullName(from_id, session_name);
-			payload["SESSION_NAME"] = session_name;
 			if (from_group)
 			{
 				payload["group_owned"] = "true";
 			}
-			LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);
+
+			LLNotification::Params params("ServerObjectMessage");
+			params.substitutions = substitutions;
+			params.payload = payload;
+
+			LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, false);
 		}
 		break;
 	case IM_FROM_TASK_AS_ALERT:
-- 
cgit v1.2.3


From 97f9dbee2ccd32b666c14bd79111bc2dbe2523e2 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 1 Apr 2010 14:40:44 +0100
Subject: BOOL->bool on llassettype.*

---
 indra/llcommon/llassettype.cpp | 74 +++++++++++++++++++++---------------------
 indra/llcommon/llassettype.h   |  8 ++---
 2 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index e5068f1bc5..1c664e093b 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -45,9 +45,9 @@ struct AssetEntry : public LLDictionaryEntry
 	AssetEntry(const char *desc_name,
 			   const char *type_name, 	// 8 character limit!
 			   const char *human_name, 	// for decoding to human readable form; put any and as many printable characters you want in each one
-			   BOOL can_link, 			// can you create a link to this type?
-			   BOOL can_fetch, 			// can you fetch this asset by ID?
-			   BOOL can_know) 			// can you see this asset's ID?
+			   bool can_link, 			// can you create a link to this type?
+			   bool can_fetch, 			// can you fetch this asset by ID?
+			   bool can_know) 			// can you see this asset's ID?
 		:
 		LLDictionaryEntry(desc_name),
 		mTypeName(type_name),
@@ -61,9 +61,9 @@ struct AssetEntry : public LLDictionaryEntry
 
 	const char *mTypeName;
 	const char *mHumanName;
-	BOOL mCanLink;
-	BOOL mCanFetch;
-	BOOL mCanKnow;
+	bool mCanLink;
+	bool mCanFetch;
+	bool mCanKnow;
 };
 
 class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -77,30 +77,30 @@ LLAssetDictionary::LLAssetDictionary()
 {
 	//       												   DESCRIPTION			TYPE NAME	HUMAN NAME			CAN LINK?   CAN FETCH?  CAN KNOW?	
 	//      												  |--------------------|-----------|-------------------|-----------|-----------|---------|
-	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			FALSE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			FALSE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			FALSE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			TRUE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			TRUE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		FALSE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			TRUE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		TRUE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		FALSE,		FALSE,		FALSE));
-	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		FALSE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			TRUE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			false,		false,		true));
+	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			false,		true,		true));
+	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		false,		false,		false));
+	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			false,		true,		true));
+	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	false,		false,		false));
+	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			true,		true,		true));
+	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			true,		false,		false));
+	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		false,		false,		true));
+	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			true,		false,		false));
+	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		false,		false,		false));
+	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		false,		false,		false));
+	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		false,		false,		false));
+	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		true,		true,		true));
+	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			false,		false,		false));
+	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		false,		false,		false));
+	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		false,		false,		false));
+	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		false,		true,		true));
+	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			true,		true,		true));
+	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			false,		false,		false));
 
-	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"sym link",			FALSE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"sym folder link",	FALSE,		FALSE,		TRUE));
+	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"sym link",			false,		false,		true));
+	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"sym folder link",	false,		false,		true));
 
-	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		FALSE,		FALSE,		FALSE));
+	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		false,		false,		false));
 };
 
 // static
@@ -202,7 +202,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_
 }
 
 // static
-BOOL LLAssetType::lookupCanLink(EType asset_type)
+bool LLAssetType::lookupCanLink(EType asset_type)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
 	const AssetEntry *entry = dict->lookup(asset_type);
@@ -210,18 +210,18 @@ BOOL LLAssetType::lookupCanLink(EType asset_type)
 	{
 		return entry->mCanLink;
 	}
-	return FALSE;
+	return false;
 }
 
 // static
 // Not adding this to dictionary since we probably will only have these two types
-BOOL LLAssetType::lookupIsLinkType(EType asset_type)
+bool LLAssetType::lookupIsLinkType(EType asset_type)
 {
 	if (asset_type == AT_LINK || asset_type == AT_LINK_FOLDER)
 	{
-		return TRUE;
+		return true;
 	}
-	return FALSE;
+	return false;
 }
 
 // static
@@ -233,7 +233,7 @@ const std::string &LLAssetType::badLookup()
 }
 
 // static
-BOOL LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type)
+bool LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
 	const AssetEntry *entry = dict->lookup(asset_type);
@@ -241,11 +241,11 @@ BOOL LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type)
 	{
 		return entry->mCanFetch;
 	}
-	return FALSE;
+	return false;
 }
 
 // static
-BOOL LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
+bool LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
 	const AssetEntry *entry = dict->lookup(asset_type);
@@ -253,5 +253,5 @@ BOOL LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
 	{
 		return entry->mCanKnow;
 	}
-	return FALSE;
+	return false;
 }
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 4440e1bac3..2c2dc27aaa 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -143,11 +143,11 @@ public:
 	static EType 				getType(const std::string& desc_name);
 	static const std::string&	getDesc(EType asset_type);
 
-	static BOOL 				lookupCanLink(EType asset_type);
-	static BOOL 				lookupIsLinkType(EType asset_type);
+	static bool 				lookupCanLink(EType asset_type);
+	static bool 				lookupIsLinkType(EType asset_type);
 
-	static BOOL 				lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
-	static BOOL 				lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
+	static bool 				lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
+	static bool 				lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
 	
 	static const std::string&	badLookup(); // error string when a lookup fails
 
-- 
cgit v1.2.3


From b98ebdecda66a1f08e74321cb255e39edfbc47dd Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Thu, 1 Apr 2010 17:24:50 +0300
Subject: Fixed reopened major bug (EXT-5106) Side panel list view toolbars are
 missing background art. - Made toolbars look connected to the respective
 lists. - Fixed tab container background in Inventory side panel.

Tab container reserves 1 pixel for the border width so we have to use top_pad="-1" to move the toolbar 1 pixel up to physically connect them.

--HG--
branch : product-engine
---
 indra/newview/skins/default/xui/en/panel_landmarks.xml     |  2 +-
 .../newview/skins/default/xui/en/panel_main_inventory.xml  | 12 ++++++------
 .../skins/default/xui/en/panel_outfits_inventory.xml       |  4 ++--
 indra/newview/skins/default/xui/en/panel_people.xml        | 14 +++++++++-----
 .../skins/default/xui/en/panel_teleport_history.xml        |  2 +-
 5 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 639e5d30ef..a7e87f2a1e 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -16,7 +16,7 @@
      bg_alpha_color="DkGray2"
      bg_opaque_color="DkGray2"
      follows="all"
-     height="369"
+     height="373"
      layout="topleft"
      left="3"
      name="landmarks_accordion"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index bef62f48e0..6c81107dde 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -411,13 +411,13 @@
      top="+31"
      width="303" />
     <tab_container
-       bg_opaque_color="DkGray2"
-       bg_alpha_color="DkGray2"
+       bg_alpha_color="DkGray"
+       bg_opaque_color="DkGray"
        background_visible="true"
        background_opaque="true"
        follows="all"
        halign="center"
-       height="306"
+       height="311"
        layout="topleft"
        left="7"
        name="inventory filter tabs"
@@ -434,7 +434,7 @@
 	       border="false"
 	       bevel_style="none"
          follows="all"
-         height="295"
+         height="310"
          label="MY INVENTORY"
          help_topic="my_inventory_tab"
          layout="topleft"
@@ -451,7 +451,7 @@
 	       border="false"
 	       bevel_style="none"
          follows="all"
-         height="293"
+         height="310"
          label="RECENT"
          help_topic="recent_inventory_tab"
          layout="topleft"
@@ -466,7 +466,7 @@
      follows="left|right|bottom"
      height="27"
      layout="topleft"
-     top_pad="4"
+     top_pad="-1"
      left="10"
      name="bottom_panel"
      width="310">
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index b297ec1988..f9ad525642 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -14,7 +14,7 @@
  border="false">
    <tab_container
      follows="all"
-     height="497"
+     height="501"
      layout="topleft"
      left="7"
      name="appearance_tabs"
@@ -58,7 +58,7 @@
 	  height="73"
 	  layout="topleft"
 	  left="9"
-	  top_pad="3"
+	  top_pad="-1"
 	  visible="true"
 	  name="bottom_panel"
 	  width="310">
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 85841da48f..6152dd1587 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -81,7 +81,7 @@
        		 bg_alpha_color="DkGray2"
              bg_opaque_color="DkGray2"
              follows="all"
-             height="352"
+             height="356"
              ignore_online_status="true"
              layout="topleft"
              left="3"
@@ -97,6 +97,7 @@
              layout="topleft"
              left="3"
              name="bottom_panel"
+             top_pad="0"
              width="313">
              <button
              follows="bottom|left"
@@ -156,7 +157,7 @@
        		 bg_alpha_color="DkGray2"
        		 bg_opaque_color="DkGray2"
              follows="all"
-             height="352"
+             height="356"
              layout="topleft"
              left="3"
              name="friends_accordion"
@@ -204,6 +205,7 @@
              layout="topleft"
              left="3"
              name="bottom_panel"
+             top_pad="0"
              width="313">
                <button
                follows="bottom|left"
@@ -237,7 +239,7 @@
              	 layout="topleft"
              	 left_pad="1"
              	 name="dummy_icon"
-             	 width="210"
+             	 width="209"
              />
                 <button
                  follows="bottom|left"
@@ -287,7 +289,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
              bg_alpha_color="DkGray2"
              bg_opaque_color="DkGray2"
              follows="all"
-             height="352"
+             height="356"
              layout="topleft"
              left="3"
              name="group_list"
@@ -303,6 +305,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
              layout="topleft"
              left="0"
              name="bottom_panel"
+             top_pad="0"
              width="313">
                <button
                follows="bottom|left"
@@ -372,7 +375,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
        		 bg_alpha_color="DkGray2"
              bg_opaque_color="DkGray2"
              follows="all"
-             height="352"
+             height="356"
              layout="topleft"
              left="3"
              multi_select="true"
@@ -388,6 +391,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
              layout="topleft"
              left="0"
              name="bottom_panel"
+             top_pad="0"
              width="313">
                <button
                follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index cbcaf1a58c..21addb8e6f 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -6,7 +6,7 @@
      bg_alpha_color="DkGray">     
     <accordion
      follows="left|top|right|bottom"
-     height="369"
+     height="373"
      layout="topleft"
      left="3"
      top="0"
-- 
cgit v1.2.3


From 6eeb4247bbdbb8c7682fabf871dd0345a340593c Mon Sep 17 00:00:00 2001
From: "Nyx (Neal Orman)" <nyx@lindenlab.com>
Date: Thu, 1 Apr 2010 11:24:04 -0400
Subject: updating some back-end functionality that will come in handy as we
 bring the UI up to date with multiwearables.

code reviewed by Seraph and Vir.
---
 indra/newview/llagentwearables.cpp | 19 +++++++++++++------
 indra/newview/llagentwearables.h   |  4 ++--
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index dad7c7e705..6e983747b2 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1595,7 +1595,6 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
 }
 
 // Assumes existing wearables are not dirty.
-// MULTI_WEARABLE: assumes one wearable per type.
 void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& items,
 										 const LLDynamicArray< LLWearable* >& wearables,
 										 BOOL remove)
@@ -1853,16 +1852,24 @@ void LLAgentWearables::queryWearableCache()
 	gAgentQueryManager.mWearablesCacheQueryID++;
 }
 
-// MULTI_WEARABLE: need a way to specify by wearable rather than by type.
 // User has picked "remove from avatar" from a menu.
 // static
-void LLAgentWearables::userRemoveWearable(EWearableType& type)
+void LLAgentWearables::userRemoveWearable(const EWearableType &type, const U32 &index)
 {
-	if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR)) //&&
+	if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES)) //&&
 		//!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT)))
 	{
-		// MULTI_WEARABLE: fixed to 0th for now.
-		gAgentWearables.removeWearable(type,false,0);
+		gAgentWearables.removeWearable(type,false,index);
+	}
+}
+
+//static 
+void LLAgentWearables::userRemoveWearablesOfType(const EWearableType &type)
+{
+	if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES)) //&&
+		//!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT)))
+	{
+		gAgentWearables.removeWearable(type,true,0);
 	}
 }
 
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 652ffd4587..9f8aadeae7 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -193,8 +193,8 @@ public:
 	// Static UI hooks
 	//--------------------------------------------------------------------
 public:
-	// MULTI-WEARABLE: assuming one wearable per type.  Need upstream changes.
-	static void		userRemoveWearable(EWearableType& type);
+	static void		userRemoveWearable(const EWearableType &type, const U32 &index);
+	static void		userRemoveWearablesOfType(const EWearableType &type);
 	static void		userRemoveAllClothes();	
 	
 	typedef std::vector<LLViewerObject*> llvo_vec_t;
-- 
cgit v1.2.3


From 56dbd313a156a6913d791c920d0023f5451c657f Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 1 Apr 2010 17:23:49 +0100
Subject: Checker: CHECKED_RETURN Function: LLAgentCamera::updateCamera() File:
 /indra/newview/llagentcamera.cpp

not a bug, but I cleaned up BOOL->bool
---
 indra/newview/llagentcamera.cpp | 11 ++++++-----
 indra/newview/llagentcamera.h   |  2 +-
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index bb06255fd1..e8ffe9708b 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -142,7 +142,7 @@ LLAgentCamera::LLAgentCamera() :
 	mSitCameraEnabled(FALSE),
 	mCameraSmoothingLastPositionGlobal(),
 	mCameraSmoothingLastPositionAgent(),
-	mCameraSmoothingStop(FALSE),
+	mCameraSmoothingStop(false),
 
 	mCameraUpVector(LLVector3::z_axis), // default is straight up
 
@@ -1042,7 +1042,7 @@ void LLAgentCamera::cameraPanLeft(F32 meters)
 	mFocusGlobal = mFocusTargetGlobal;
 
 	// disable smoothing for camera pan, which causes some residents unhappiness
-	mCameraSmoothingStop = TRUE;
+	mCameraSmoothingStop = true;
 	
 	cameraZoomIn(1.f);
 	updateFocusOffset();
@@ -1062,7 +1062,7 @@ void LLAgentCamera::cameraPanUp(F32 meters)
 	mFocusGlobal = mFocusTargetGlobal;
 
 	// disable smoothing for camera pan, which causes some residents unhappiness
-	mCameraSmoothingStop = TRUE;
+	mCameraSmoothingStop = true;
 
 	cameraZoomIn(1.f);
 	updateFocusOffset();
@@ -1364,7 +1364,8 @@ void LLAgentCamera::updateCamera()
 		LLVector3d camera_pos_agent = camera_pos_global - agent_pos;
 		// Sitting on what you're manipulating can cause camera jitter with smoothing. 
 		// This turns off smoothing while editing. -MG
-		mCameraSmoothingStop |= (BOOL)LLToolMgr::getInstance()->inBuildMode();
+		bool in_build_mode = LLToolMgr::getInstance()->inBuildMode();
+		mCameraSmoothingStop = mCameraSmoothingStop || in_build_mode;
 		
 		if (cameraThirdPerson() && !mCameraSmoothingStop)
 		{
@@ -1396,7 +1397,7 @@ void LLAgentCamera::updateCamera()
 								 
 		mCameraSmoothingLastPositionGlobal = camera_pos_global;
 		mCameraSmoothingLastPositionAgent = camera_pos_agent;
-		mCameraSmoothingStop = FALSE;
+		mCameraSmoothingStop = false;
 	}
 
 	
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 3ba24ef32b..1e55e18d2a 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -151,7 +151,7 @@ private:
 	LLVector3		mCameraVirtualPositionAgent;	// Camera virtual position (target) before performing FOV zoom
 	LLVector3d      mCameraSmoothingLastPositionGlobal;    
 	LLVector3d      mCameraSmoothingLastPositionAgent;
-	BOOL            mCameraSmoothingStop;
+	bool            mCameraSmoothingStop;
 	LLVector3		mCameraLag;						// Third person camera lag
 	LLVector3		mCameraUpVector;				// Camera's up direction in world coordinates (determines the 'roll' of the view)
 
-- 
cgit v1.2.3


From fb08c17cdda47051fcfffc9cc8ff590e34c6ef94 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 1 Apr 2010 17:25:42 +0100
Subject: Checker: UNINIT_CTOR Function: LLAgentCamera::LLAgentCamera() File:
 /indra/newview/llagentcamera.cpp

---
 indra/newview/llagentcamera.cpp | 4 +++-
 indra/newview/llagentcamera.h   | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index e8ffe9708b..908bcfab6a 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -107,6 +107,8 @@ LLAgentCamera gAgentCamera;
 // LLAgentCamera()
 //-----------------------------------------------------------------------------
 LLAgentCamera::LLAgentCamera() :
+	mInitialized(false),
+
 	mDrawDistance( DEFAULT_FAR_PLANE ),
 
 	mLookAt(NULL),
@@ -219,7 +221,7 @@ void LLAgentCamera::init()
 	mCameraZoomFraction = 1.f;
 	mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject");
 
-	mInitialized = TRUE;
+	mInitialized = true;
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 1e55e18d2a..5cbb1de6f4 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -82,7 +82,7 @@ public:
 	void			cleanup();
 	void		    setAvatarObject(LLVOAvatarSelf* avatar);
 private:
-	BOOL			mInitialized;
+	bool			mInitialized;
 
 
 	//--------------------------------------------------------------------
-- 
cgit v1.2.3


From 03322a8e87db8e42435e0641d40e48dc25aa9a97 Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 1 Apr 2010 17:29:08 +0100
Subject: Checker: UNINIT_CTOR Function: LLVOAvatarSelf::LLVOAvatarSelf(const
 LLUUID &, unsigned char, LLViewerRegion *) File:
 /indra/newview/llvoavatarself.cpp

---
 indra/newview/llvoavatarself.cpp | 4 ++--
 indra/newview/llvoavatarself.h   | 2 --
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index fe6990eae9..c15dbeb8c6 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -87,14 +87,14 @@ using namespace LLVOAvatarDefines;
 struct LocalTextureData
 {
 	LocalTextureData() : 
-		mIsBakedReady(FALSE), 
+		mIsBakedReady(false), 
 		mDiscard(MAX_DISCARD_LEVEL+1), 
 		mImage(NULL), 
 		mWearableID(IMG_DEFAULT_AVATAR),
 		mTexEntry(NULL)
 	{}
 	LLPointer<LLViewerFetchedTexture> mImage;
-	BOOL mIsBakedReady;
+	bool mIsBakedReady;
 	S32 mDiscard;
 	LLUUID mWearableID;	// UUID of the wearable that this texture belongs to, not of the image itself
 	LLTextureEntry *mTexEntry;
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index 4960d4d103..4856e82275 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -124,12 +124,10 @@ public:
 public:
 	/*virtual*/ BOOL    updateIsFullyLoaded();
 private:
-	BOOL                mIsBaked; // are the stored baked textures up to date?
 
 	//--------------------------------------------------------------------
 	// Region state
 	//--------------------------------------------------------------------
-private:
 	U64				mLastRegionHandle;
 	LLFrameTimer	mRegionCrossingTimer;
 	S32				mRegionCrossingCount;
-- 
cgit v1.2.3


From ab79bf7aaeaa0cbd7b2571601971cce97f9b4acd Mon Sep 17 00:00:00 2001
From: Tofu Linden <tofu.linden@lindenlab.com>
Date: Thu, 1 Apr 2010 17:34:26 +0100
Subject: Checker: CHECKED_RETURN Function:
 LLViewerMediaImpl::createMediaSource() File: /indra/newview/llviewermedia.cpp

---
 indra/newview/llviewermedia.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index d9fabc7d64..d3eed40f25 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -1537,7 +1537,10 @@ void LLViewerMediaImpl::createMediaSource()
 	}
 	else if(! mMimeType.empty())
 	{
-		initializeMedia(mMimeType);
+		if (!initializeMedia(mMimeType))
+		{
+			LL_WARNS("Media") << "Failed to initialize media for mime type " << mMimeType << LL_ENDL;
+		}
 	}
 }
 
-- 
cgit v1.2.3


From 406b595e8c6811c2550340ba316328289d8b856f Mon Sep 17 00:00:00 2001
From: Richard Linden <none@none>
Date: Thu, 1 Apr 2010 11:51:06 -0700
Subject: fixed build

---
 indra/llui/llnotifications.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 707a84bdfe..1799ca65b7 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -994,7 +994,7 @@ private:
 
 protected:
 	LLPostponedNotification() {}
-	~LLPostponedNotification() {}
+	virtual ~LLPostponedNotification() {}
 
 	/**
 	 * Abstract method provides possibility to modify notification parameters and
-- 
cgit v1.2.3