diff options
Diffstat (limited to 'indra')
92 files changed, 1495 insertions, 301 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/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index e12776f83a..0959722aa6 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();  } 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/llflatlistview.h b/indra/llui/llflatlistview.h index 837fbb36b7..dc6400c926 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/llui/llfloater.cpp b/indra/llui/llfloater.cpp index a9accc0ba6..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 ) @@ -1121,6 +1120,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 @@ -1190,7 +1190,7 @@ void LLFloater::setHost(LLMultiFloater* host)  		mButtonScale = 1.f;  		//mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE;  	} -	updateButtons(); +	updateTitleButtons();  	if (host)  	{  		mHostHandle = host->getHandle(); @@ -1389,7 +1389,7 @@ void LLFloater::setCanDock(bool b)  			mButtonsEnabled[BUTTON_DOCK] = FALSE;  		}  	} -	updateButtons(); +	updateTitleButtons();  }  void LLFloater::setDocked(bool docked, bool pop_on_undock) @@ -1398,7 +1398,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)  	{  		mDocked = docked;  		mButtonsEnabled[BUTTON_DOCK] = !mDocked; -		updateButtons(); +		updateTitleButtons();  		storeDockStateControl();  	} @@ -1451,7 +1451,7 @@ void LLFloater::onClickTearOff(LLFloater* self)  		}  		self->setTornOff(false);  	} -	self->updateButtons(); +	self->updateTitleButtons();  }  // static @@ -1691,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) @@ -1699,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) @@ -1707,7 +1707,7 @@ void	LLFloater::setCanTearOff(BOOL can_tear_off)  	mCanTearOff = can_tear_off;  	mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead(); -	updateButtons(); +	updateTitleButtons();  } @@ -1731,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++)  	{ @@ -1785,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 @@ -1796,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) @@ -1844,7 +1857,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); @@ -1853,7 +1866,7 @@ void LLFloater::buildButtons(const Params& floater_params)  		mButtons[i] = buttonp;  	} -	updateButtons(); +	updateTitleButtons();  }  // static @@ -1899,8 +1912,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..403723d9d8 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -311,19 +311,26 @@ 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  	// 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/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 5f4b16ec9e..56d7a63832 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -962,7 +962,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 diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index bc838e20e4..47fde08a9d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -319,7 +319,6 @@ set(viewer_SOURCE_FILES      llpanellandmedia.cpp      llpanellogin.cpp      llpanelloginlistener.cpp -    llpanellookinfo.cpp      llpanelmaininventory.cpp      llpanelmediasettingsgeneral.cpp      llpanelmediasettingspermissions.cpp @@ -328,6 +327,7 @@ set(viewer_SOURCE_FILES      llpanelnearbymedia.cpp      llpanelobject.cpp      llpanelobjectinventory.cpp +    llpaneloutfitedit.cpp      llpaneloutfitsinventory.cpp      llpanelpeople.cpp      llpanelpeoplemenus.cpp @@ -818,7 +818,6 @@ set(viewer_HEADER_FILES      llpanellandmedia.h      llpanellogin.h      llpanelloginlistener.h -    llpanellookinfo.h      llpanelmaininventory.h      llpanelmediasettingsgeneral.h      llpanelmediasettingspermissions.h @@ -827,6 +826,7 @@ set(viewer_HEADER_FILES      llpanelnearbymedia.h      llpanelobject.h      llpanelobjectinventory.h +    llpaneloutfitedit.h      llpaneloutfitsinventory.h      llpanelpeople.h      llpanelpeoplemenus.h diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 69d4bba16d..f434782977 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3203,9 +3203,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"); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 4075ad8ee2..c85c72837c 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); @@ -434,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 c573144a33..9d8b4b4e23 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/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index e8abdd32ec..6ec62a61a0 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 c3f79dcb3a..5a55975413 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", 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/llchathistory.cpp b/indra/newview/llchathistory.cpp index f5faeca126..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,16 +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);  // TODO: this is absolute minimal fix for EXT-3818 because it's late for 2.0 -		mEditor->appendWidget(p, "", false);      // This should be properly fixed in 2.1 -  		mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);  		if (utf8str_trim(chat.mFromName).size() != 0) @@ -752,7 +735,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/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"), @@ -100,11 +97,6 @@ class LLChatHistory : public LLUICtrl  		 */  		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/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/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 5a332726b2..0aca12bc5e 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -355,10 +355,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"; diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index fbd516ba7a..e7b2da043f 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 4e97a1058e..aee9db78a3 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/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 6467ee13b0..02c83dcd09 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/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 8894628788..5677899dd9 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/llfolderview.cpp b/indra/newview/llfolderview.cpp index 4fbd1efbef..43743ec37a 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -980,7 +980,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. diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 0099cd114f..e0f155a6a9 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -81,6 +81,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 = ""; @@ -92,6 +95,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"]) @@ -215,6 +231,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)  	{ @@ -1539,6 +1560,11 @@ LLCallDialog::LLCallDialog(const LLSD& payload)  	setDocked(true);  } +LLCallDialog::~LLCallDialog() +{ +	LLUI::removePopup(this); +} +  void LLCallDialog::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRectScaled(); @@ -1592,7 +1618,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 0a23fda9d8..ffa8a16797 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: @@ -477,7 +495,7 @@ class LLCallDialog : public LLDockableFloater  {  public:  	LLCallDialog(const LLSD& payload); -	~LLCallDialog() {} +	~LLCallDialog();  	virtual BOOL postBuild(); 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/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; +			}  		}  	} diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 424b8c9a66..1507b7d324 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;  	}  }; 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); @@ -315,6 +315,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.  	 */  	static void logToIM(const EInstantMessage& session_type, @@ -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..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 @@ -193,10 +196,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 +233,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 +242,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") 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"); 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();  } diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 3dbe9a7f59..4ffd43cb0f 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -397,17 +397,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; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 4cde02c1ce..c7793bbc43 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -924,12 +924,7 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  			return false;  		}  	} -	else if (!root_folder_view && "category" != command_name) -	{ -		return false; -	}  	else if (  "paste"		== command_name -			|| "rename"		== command_name  			|| "cut"		== command_name  			|| "copy"		== command_name  			|| "delete"		== command_name @@ -941,17 +936,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 && -		    root_folder_view->getSelectedCount() > 1) -		{ -			return false; -		} +		return root_folder_view && root_folder_view->getSelectedCount() == 1; +	} +	else if ("rename" == command_name) +	{ +		return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);  	}  	else if("category" == command_name)  	{ @@ -1080,7 +1074,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)  		{ diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp new file mode 100644 index 0000000000..421181dda1 --- /dev/null +++ b/indra/newview/llpaneloutfitedit.cpp @@ -0,0 +1,512 @@ +/** + * @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 "llinventorymodelbackgroundfetch.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(); +	 +	LLInventoryModelBackgroundFetch::instance().start(); +} + +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(); +	} +	 +	LLInventoryModelBackgroundFetch::instance().start(); +	 +	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(); +		LLAppearanceMgr::instance().updateCOF(mLookID); +	} +} + +void LLPanelOutfitEdit::updateLookInfo() +{	 +	if (getVisible()) +	{ +		mLookContents->clearRows(); +		 +		uuid_vec_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/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 8a1be2706c..288edeb031 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 @@ -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();    @@ -708,7 +711,7 @@ void LLPanelPeople::updateNearbyList()  	mNearbyList->setDirty();  	DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs()); -	LLLocalSpeakerMgr::instance().update(TRUE); +	LLActiveSpeakerMgr::instance().update(TRUE);  }  void LLPanelPeople::updateRecentList() diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 8b365c6433..862e32cca8 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/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); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 6f920cf4b9..bde8d02885 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) 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/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); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index c9e9b2815c..b951434010 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/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 58f64ff1f3..b660a2b8ea 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -372,6 +372,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); 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; @@ -100,6 +101,13 @@ void LLSysWellWindow::setMinimized(BOOL 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)  {  	// just set floater visible. Screen channels will be cleared. @@ -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;  };  /** 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_ */ diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 6dc0983f10..305831aee3 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1754,17 +1754,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:  @@ -1987,7 +1985,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; @@ -2318,7 +2315,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; @@ -5590,6 +5587,10 @@ void handle_lure(const LLUUID& invitee)  // Prompt for a message to the invited user.  void handle_lure(const uuid_vec_t& ids)  { +	if (ids.empty()) return; + +	if (!gAgent.getRegion()) return; +  	LLSD edit_args;  	edit_args["REGION"] = gAgent.getRegion()->getName(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 85c961f34a..d7d5cbbd10 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2090,7 +2090,7 @@ void LLViewerWindow::draw()  		// Draw tool specific overlay on world  		LLToolMgr::getInstance()->getCurrentTool()->draw(); -		if( gAgentCamera.cameraMouselook() ) +		if( gAgentCamera.cameraMouselook() || LLFloaterCamera::inFreeCameraMode() )  		{  			drawMouselookInstructions();  			stop_glerror(); 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/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/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" 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] 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 @@ -31,19 +31,6 @@              <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"               label="Flush This Region's Map Visibility Caches"               label_selected="Flush This Region's Map Visibility Caches"               layout="topleft" 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" 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/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_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_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.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> 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"> 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" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c39a91281e..8501143fe6 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3111,6 +3111,18 @@ Teleport to [PICK]?    </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"     name="MessageEstate" @@ -4269,6 +4281,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" @@ -5103,7 +5122,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"> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 58c5c11e51..c34a367c32 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" @@ -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> 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" 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" /> 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_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/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" 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 diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 00bbbd65d0..0c73b8d769 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -114,6 +114,7 @@  	<!-- ButtonToolTips, llfloater.cpp -->  	<string name="BUTTON_CLOSE_DARWIN">Close (⌘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> @@ -3048,6 +3049,9 @@ 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>    <!-- Financial operations strings -->    <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string> 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" 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 | 
